1 //===- ASTReader.cpp - AST File Reader ------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines the ASTReader class, which reads AST files. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "clang/Basic/OpenMPKinds.h" 14 #include "clang/Serialization/ASTRecordReader.h" 15 #include "ASTCommon.h" 16 #include "ASTReaderInternals.h" 17 #include "clang/AST/AbstractTypeReader.h" 18 #include "clang/AST/ASTConsumer.h" 19 #include "clang/AST/ASTContext.h" 20 #include "clang/AST/ASTMutationListener.h" 21 #include "clang/AST/ASTUnresolvedSet.h" 22 #include "clang/AST/Decl.h" 23 #include "clang/AST/DeclBase.h" 24 #include "clang/AST/DeclCXX.h" 25 #include "clang/AST/DeclFriend.h" 26 #include "clang/AST/DeclGroup.h" 27 #include "clang/AST/DeclObjC.h" 28 #include "clang/AST/DeclTemplate.h" 29 #include "clang/AST/DeclarationName.h" 30 #include "clang/AST/Expr.h" 31 #include "clang/AST/ExprCXX.h" 32 #include "clang/AST/ExternalASTSource.h" 33 #include "clang/AST/NestedNameSpecifier.h" 34 #include "clang/AST/OpenMPClause.h" 35 #include "clang/AST/ODRHash.h" 36 #include "clang/AST/RawCommentList.h" 37 #include "clang/AST/TemplateBase.h" 38 #include "clang/AST/TemplateName.h" 39 #include "clang/AST/Type.h" 40 #include "clang/AST/TypeLoc.h" 41 #include "clang/AST/TypeLocVisitor.h" 42 #include "clang/AST/UnresolvedSet.h" 43 #include "clang/Basic/CommentOptions.h" 44 #include "clang/Basic/Diagnostic.h" 45 #include "clang/Basic/DiagnosticOptions.h" 46 #include "clang/Basic/ExceptionSpecificationType.h" 47 #include "clang/Basic/FileManager.h" 48 #include "clang/Basic/FileSystemOptions.h" 49 #include "clang/Basic/IdentifierTable.h" 50 #include "clang/Basic/LLVM.h" 51 #include "clang/Basic/LangOptions.h" 52 #include "clang/Basic/Module.h" 53 #include "clang/Basic/ObjCRuntime.h" 54 #include "clang/Basic/OperatorKinds.h" 55 #include "clang/Basic/PragmaKinds.h" 56 #include "clang/Basic/Sanitizers.h" 57 #include "clang/Basic/SourceLocation.h" 58 #include "clang/Basic/SourceManager.h" 59 #include "clang/Basic/SourceManagerInternals.h" 60 #include "clang/Basic/Specifiers.h" 61 #include "clang/Basic/TargetInfo.h" 62 #include "clang/Basic/TargetOptions.h" 63 #include "clang/Basic/TokenKinds.h" 64 #include "clang/Basic/Version.h" 65 #include "clang/Lex/HeaderSearch.h" 66 #include "clang/Lex/HeaderSearchOptions.h" 67 #include "clang/Lex/MacroInfo.h" 68 #include "clang/Lex/ModuleMap.h" 69 #include "clang/Lex/PreprocessingRecord.h" 70 #include "clang/Lex/Preprocessor.h" 71 #include "clang/Lex/PreprocessorOptions.h" 72 #include "clang/Lex/Token.h" 73 #include "clang/Sema/ObjCMethodList.h" 74 #include "clang/Sema/Scope.h" 75 #include "clang/Sema/Sema.h" 76 #include "clang/Sema/Weak.h" 77 #include "clang/Serialization/ASTBitCodes.h" 78 #include "clang/Serialization/ASTDeserializationListener.h" 79 #include "clang/Serialization/ContinuousRangeMap.h" 80 #include "clang/Serialization/GlobalModuleIndex.h" 81 #include "clang/Serialization/InMemoryModuleCache.h" 82 #include "clang/Serialization/ModuleFile.h" 83 #include "clang/Serialization/ModuleFileExtension.h" 84 #include "clang/Serialization/ModuleManager.h" 85 #include "clang/Serialization/PCHContainerOperations.h" 86 #include "clang/Serialization/SerializationDiagnostic.h" 87 #include "llvm/ADT/APFloat.h" 88 #include "llvm/ADT/APInt.h" 89 #include "llvm/ADT/APSInt.h" 90 #include "llvm/ADT/ArrayRef.h" 91 #include "llvm/ADT/DenseMap.h" 92 #include "llvm/ADT/FloatingPointMode.h" 93 #include "llvm/ADT/FoldingSet.h" 94 #include "llvm/ADT/Hashing.h" 95 #include "llvm/ADT/IntrusiveRefCntPtr.h" 96 #include "llvm/ADT/None.h" 97 #include "llvm/ADT/Optional.h" 98 #include "llvm/ADT/STLExtras.h" 99 #include "llvm/ADT/ScopeExit.h" 100 #include "llvm/ADT/SmallPtrSet.h" 101 #include "llvm/ADT/SmallString.h" 102 #include "llvm/ADT/SmallVector.h" 103 #include "llvm/ADT/StringExtras.h" 104 #include "llvm/ADT/StringMap.h" 105 #include "llvm/ADT/StringRef.h" 106 #include "llvm/ADT/Triple.h" 107 #include "llvm/ADT/iterator_range.h" 108 #include "llvm/Bitstream/BitstreamReader.h" 109 #include "llvm/Support/Casting.h" 110 #include "llvm/Support/Compiler.h" 111 #include "llvm/Support/Compression.h" 112 #include "llvm/Support/DJB.h" 113 #include "llvm/Support/Endian.h" 114 #include "llvm/Support/Error.h" 115 #include "llvm/Support/ErrorHandling.h" 116 #include "llvm/Support/FileSystem.h" 117 #include "llvm/Support/LEB128.h" 118 #include "llvm/Support/MemoryBuffer.h" 119 #include "llvm/Support/Path.h" 120 #include "llvm/Support/SaveAndRestore.h" 121 #include "llvm/Support/Timer.h" 122 #include "llvm/Support/VersionTuple.h" 123 #include "llvm/Support/raw_ostream.h" 124 #include <algorithm> 125 #include <cassert> 126 #include <cstddef> 127 #include <cstdint> 128 #include <cstdio> 129 #include <ctime> 130 #include <iterator> 131 #include <limits> 132 #include <map> 133 #include <memory> 134 #include <string> 135 #include <system_error> 136 #include <tuple> 137 #include <utility> 138 #include <vector> 139 140 using namespace clang; 141 using namespace clang::serialization; 142 using namespace clang::serialization::reader; 143 using llvm::BitstreamCursor; 144 using llvm::RoundingMode; 145 146 //===----------------------------------------------------------------------===// 147 // ChainedASTReaderListener implementation 148 //===----------------------------------------------------------------------===// 149 150 bool 151 ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) { 152 return First->ReadFullVersionInformation(FullVersion) || 153 Second->ReadFullVersionInformation(FullVersion); 154 } 155 156 void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) { 157 First->ReadModuleName(ModuleName); 158 Second->ReadModuleName(ModuleName); 159 } 160 161 void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) { 162 First->ReadModuleMapFile(ModuleMapPath); 163 Second->ReadModuleMapFile(ModuleMapPath); 164 } 165 166 bool 167 ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts, 168 bool Complain, 169 bool AllowCompatibleDifferences) { 170 return First->ReadLanguageOptions(LangOpts, Complain, 171 AllowCompatibleDifferences) || 172 Second->ReadLanguageOptions(LangOpts, Complain, 173 AllowCompatibleDifferences); 174 } 175 176 bool ChainedASTReaderListener::ReadTargetOptions( 177 const TargetOptions &TargetOpts, bool Complain, 178 bool AllowCompatibleDifferences) { 179 return First->ReadTargetOptions(TargetOpts, Complain, 180 AllowCompatibleDifferences) || 181 Second->ReadTargetOptions(TargetOpts, Complain, 182 AllowCompatibleDifferences); 183 } 184 185 bool ChainedASTReaderListener::ReadDiagnosticOptions( 186 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 187 return First->ReadDiagnosticOptions(DiagOpts, Complain) || 188 Second->ReadDiagnosticOptions(DiagOpts, Complain); 189 } 190 191 bool 192 ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts, 193 bool Complain) { 194 return First->ReadFileSystemOptions(FSOpts, Complain) || 195 Second->ReadFileSystemOptions(FSOpts, Complain); 196 } 197 198 bool ChainedASTReaderListener::ReadHeaderSearchOptions( 199 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath, 200 bool Complain) { 201 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 202 Complain) || 203 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 204 Complain); 205 } 206 207 bool ChainedASTReaderListener::ReadPreprocessorOptions( 208 const PreprocessorOptions &PPOpts, bool Complain, 209 std::string &SuggestedPredefines) { 210 return First->ReadPreprocessorOptions(PPOpts, Complain, 211 SuggestedPredefines) || 212 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines); 213 } 214 215 void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M, 216 unsigned Value) { 217 First->ReadCounter(M, Value); 218 Second->ReadCounter(M, Value); 219 } 220 221 bool ChainedASTReaderListener::needsInputFileVisitation() { 222 return First->needsInputFileVisitation() || 223 Second->needsInputFileVisitation(); 224 } 225 226 bool ChainedASTReaderListener::needsSystemInputFileVisitation() { 227 return First->needsSystemInputFileVisitation() || 228 Second->needsSystemInputFileVisitation(); 229 } 230 231 void ChainedASTReaderListener::visitModuleFile(StringRef Filename, 232 ModuleKind Kind) { 233 First->visitModuleFile(Filename, Kind); 234 Second->visitModuleFile(Filename, Kind); 235 } 236 237 bool ChainedASTReaderListener::visitInputFile(StringRef Filename, 238 bool isSystem, 239 bool isOverridden, 240 bool isExplicitModule) { 241 bool Continue = false; 242 if (First->needsInputFileVisitation() && 243 (!isSystem || First->needsSystemInputFileVisitation())) 244 Continue |= First->visitInputFile(Filename, isSystem, isOverridden, 245 isExplicitModule); 246 if (Second->needsInputFileVisitation() && 247 (!isSystem || Second->needsSystemInputFileVisitation())) 248 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden, 249 isExplicitModule); 250 return Continue; 251 } 252 253 void ChainedASTReaderListener::readModuleFileExtension( 254 const ModuleFileExtensionMetadata &Metadata) { 255 First->readModuleFileExtension(Metadata); 256 Second->readModuleFileExtension(Metadata); 257 } 258 259 //===----------------------------------------------------------------------===// 260 // PCH validator implementation 261 //===----------------------------------------------------------------------===// 262 263 ASTReaderListener::~ASTReaderListener() = default; 264 265 /// Compare the given set of language options against an existing set of 266 /// language options. 267 /// 268 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 269 /// \param AllowCompatibleDifferences If true, differences between compatible 270 /// language options will be permitted. 271 /// 272 /// \returns true if the languagae options mis-match, false otherwise. 273 static bool checkLanguageOptions(const LangOptions &LangOpts, 274 const LangOptions &ExistingLangOpts, 275 DiagnosticsEngine *Diags, 276 bool AllowCompatibleDifferences = true) { 277 #define LANGOPT(Name, Bits, Default, Description) \ 278 if (ExistingLangOpts.Name != LangOpts.Name) { \ 279 if (Diags) \ 280 Diags->Report(diag::err_pch_langopt_mismatch) \ 281 << Description << LangOpts.Name << ExistingLangOpts.Name; \ 282 return true; \ 283 } 284 285 #define VALUE_LANGOPT(Name, Bits, Default, Description) \ 286 if (ExistingLangOpts.Name != LangOpts.Name) { \ 287 if (Diags) \ 288 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 289 << Description; \ 290 return true; \ 291 } 292 293 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 294 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ 295 if (Diags) \ 296 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 297 << Description; \ 298 return true; \ 299 } 300 301 #define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \ 302 if (!AllowCompatibleDifferences) \ 303 LANGOPT(Name, Bits, Default, Description) 304 305 #define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \ 306 if (!AllowCompatibleDifferences) \ 307 ENUM_LANGOPT(Name, Bits, Default, Description) 308 309 #define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \ 310 if (!AllowCompatibleDifferences) \ 311 VALUE_LANGOPT(Name, Bits, Default, Description) 312 313 #define BENIGN_LANGOPT(Name, Bits, Default, Description) 314 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) 315 #define BENIGN_VALUE_LANGOPT(Name, Type, Bits, Default, Description) 316 #include "clang/Basic/LangOptions.def" 317 318 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) { 319 if (Diags) 320 Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features"; 321 return true; 322 } 323 324 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) { 325 if (Diags) 326 Diags->Report(diag::err_pch_langopt_value_mismatch) 327 << "target Objective-C runtime"; 328 return true; 329 } 330 331 if (ExistingLangOpts.CommentOpts.BlockCommandNames != 332 LangOpts.CommentOpts.BlockCommandNames) { 333 if (Diags) 334 Diags->Report(diag::err_pch_langopt_value_mismatch) 335 << "block command names"; 336 return true; 337 } 338 339 // Sanitizer feature mismatches are treated as compatible differences. If 340 // compatible differences aren't allowed, we still only want to check for 341 // mismatches of non-modular sanitizers (the only ones which can affect AST 342 // generation). 343 if (!AllowCompatibleDifferences) { 344 SanitizerMask ModularSanitizers = getPPTransparentSanitizers(); 345 SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize; 346 SanitizerSet ImportedSanitizers = LangOpts.Sanitize; 347 ExistingSanitizers.clear(ModularSanitizers); 348 ImportedSanitizers.clear(ModularSanitizers); 349 if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) { 350 const std::string Flag = "-fsanitize="; 351 if (Diags) { 352 #define SANITIZER(NAME, ID) \ 353 { \ 354 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \ 355 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \ 356 if (InExistingModule != InImportedModule) \ 357 Diags->Report(diag::err_pch_targetopt_feature_mismatch) \ 358 << InExistingModule << (Flag + NAME); \ 359 } 360 #include "clang/Basic/Sanitizers.def" 361 } 362 return true; 363 } 364 } 365 366 return false; 367 } 368 369 /// Compare the given set of target options against an existing set of 370 /// target options. 371 /// 372 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 373 /// 374 /// \returns true if the target options mis-match, false otherwise. 375 static bool checkTargetOptions(const TargetOptions &TargetOpts, 376 const TargetOptions &ExistingTargetOpts, 377 DiagnosticsEngine *Diags, 378 bool AllowCompatibleDifferences = true) { 379 #define CHECK_TARGET_OPT(Field, Name) \ 380 if (TargetOpts.Field != ExistingTargetOpts.Field) { \ 381 if (Diags) \ 382 Diags->Report(diag::err_pch_targetopt_mismatch) \ 383 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \ 384 return true; \ 385 } 386 387 // The triple and ABI must match exactly. 388 CHECK_TARGET_OPT(Triple, "target"); 389 CHECK_TARGET_OPT(ABI, "target ABI"); 390 391 // We can tolerate different CPUs in many cases, notably when one CPU 392 // supports a strict superset of another. When allowing compatible 393 // differences skip this check. 394 if (!AllowCompatibleDifferences) { 395 CHECK_TARGET_OPT(CPU, "target CPU"); 396 CHECK_TARGET_OPT(TuneCPU, "tune CPU"); 397 } 398 399 #undef CHECK_TARGET_OPT 400 401 // Compare feature sets. 402 SmallVector<StringRef, 4> ExistingFeatures( 403 ExistingTargetOpts.FeaturesAsWritten.begin(), 404 ExistingTargetOpts.FeaturesAsWritten.end()); 405 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(), 406 TargetOpts.FeaturesAsWritten.end()); 407 llvm::sort(ExistingFeatures); 408 llvm::sort(ReadFeatures); 409 410 // We compute the set difference in both directions explicitly so that we can 411 // diagnose the differences differently. 412 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures; 413 std::set_difference( 414 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(), 415 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures)); 416 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(), 417 ExistingFeatures.begin(), ExistingFeatures.end(), 418 std::back_inserter(UnmatchedReadFeatures)); 419 420 // If we are allowing compatible differences and the read feature set is 421 // a strict subset of the existing feature set, there is nothing to diagnose. 422 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty()) 423 return false; 424 425 if (Diags) { 426 for (StringRef Feature : UnmatchedReadFeatures) 427 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 428 << /* is-existing-feature */ false << Feature; 429 for (StringRef Feature : UnmatchedExistingFeatures) 430 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 431 << /* is-existing-feature */ true << Feature; 432 } 433 434 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty(); 435 } 436 437 bool 438 PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts, 439 bool Complain, 440 bool AllowCompatibleDifferences) { 441 const LangOptions &ExistingLangOpts = PP.getLangOpts(); 442 return checkLanguageOptions(LangOpts, ExistingLangOpts, 443 Complain ? &Reader.Diags : nullptr, 444 AllowCompatibleDifferences); 445 } 446 447 bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts, 448 bool Complain, 449 bool AllowCompatibleDifferences) { 450 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts(); 451 return checkTargetOptions(TargetOpts, ExistingTargetOpts, 452 Complain ? &Reader.Diags : nullptr, 453 AllowCompatibleDifferences); 454 } 455 456 namespace { 457 458 using MacroDefinitionsMap = 459 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>; 460 using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>; 461 462 } // namespace 463 464 static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, 465 DiagnosticsEngine &Diags, 466 bool Complain) { 467 using Level = DiagnosticsEngine::Level; 468 469 // Check current mappings for new -Werror mappings, and the stored mappings 470 // for cases that were explicitly mapped to *not* be errors that are now 471 // errors because of options like -Werror. 472 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags }; 473 474 for (DiagnosticsEngine *MappingSource : MappingSources) { 475 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) { 476 diag::kind DiagID = DiagIDMappingPair.first; 477 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation()); 478 if (CurLevel < DiagnosticsEngine::Error) 479 continue; // not significant 480 Level StoredLevel = 481 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation()); 482 if (StoredLevel < DiagnosticsEngine::Error) { 483 if (Complain) 484 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" + 485 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str(); 486 return true; 487 } 488 } 489 } 490 491 return false; 492 } 493 494 static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) { 495 diag::Severity Ext = Diags.getExtensionHandlingBehavior(); 496 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors()) 497 return true; 498 return Ext >= diag::Severity::Error; 499 } 500 501 static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, 502 DiagnosticsEngine &Diags, 503 bool IsSystem, bool Complain) { 504 // Top-level options 505 if (IsSystem) { 506 if (Diags.getSuppressSystemWarnings()) 507 return false; 508 // If -Wsystem-headers was not enabled before, be conservative 509 if (StoredDiags.getSuppressSystemWarnings()) { 510 if (Complain) 511 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers"; 512 return true; 513 } 514 } 515 516 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) { 517 if (Complain) 518 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror"; 519 return true; 520 } 521 522 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() && 523 !StoredDiags.getEnableAllWarnings()) { 524 if (Complain) 525 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror"; 526 return true; 527 } 528 529 if (isExtHandlingFromDiagsError(Diags) && 530 !isExtHandlingFromDiagsError(StoredDiags)) { 531 if (Complain) 532 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors"; 533 return true; 534 } 535 536 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain); 537 } 538 539 /// Return the top import module if it is implicit, nullptr otherwise. 540 static Module *getTopImportImplicitModule(ModuleManager &ModuleMgr, 541 Preprocessor &PP) { 542 // If the original import came from a file explicitly generated by the user, 543 // don't check the diagnostic mappings. 544 // FIXME: currently this is approximated by checking whether this is not a 545 // module import of an implicitly-loaded module file. 546 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in 547 // the transitive closure of its imports, since unrelated modules cannot be 548 // imported until after this module finishes validation. 549 ModuleFile *TopImport = &*ModuleMgr.rbegin(); 550 while (!TopImport->ImportedBy.empty()) 551 TopImport = TopImport->ImportedBy[0]; 552 if (TopImport->Kind != MK_ImplicitModule) 553 return nullptr; 554 555 StringRef ModuleName = TopImport->ModuleName; 556 assert(!ModuleName.empty() && "diagnostic options read before module name"); 557 558 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName); 559 assert(M && "missing module"); 560 return M; 561 } 562 563 bool PCHValidator::ReadDiagnosticOptions( 564 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 565 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics(); 566 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs()); 567 IntrusiveRefCntPtr<DiagnosticsEngine> Diags( 568 new DiagnosticsEngine(DiagIDs, DiagOpts.get())); 569 // This should never fail, because we would have processed these options 570 // before writing them to an ASTFile. 571 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false); 572 573 ModuleManager &ModuleMgr = Reader.getModuleManager(); 574 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then"); 575 576 Module *TopM = getTopImportImplicitModule(ModuleMgr, PP); 577 if (!TopM) 578 return false; 579 580 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that 581 // contains the union of their flags. 582 return checkDiagnosticMappings(*Diags, ExistingDiags, TopM->IsSystem, 583 Complain); 584 } 585 586 /// Collect the macro definitions provided by the given preprocessor 587 /// options. 588 static void 589 collectMacroDefinitions(const PreprocessorOptions &PPOpts, 590 MacroDefinitionsMap &Macros, 591 SmallVectorImpl<StringRef> *MacroNames = nullptr) { 592 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) { 593 StringRef Macro = PPOpts.Macros[I].first; 594 bool IsUndef = PPOpts.Macros[I].second; 595 596 std::pair<StringRef, StringRef> MacroPair = Macro.split('='); 597 StringRef MacroName = MacroPair.first; 598 StringRef MacroBody = MacroPair.second; 599 600 // For an #undef'd macro, we only care about the name. 601 if (IsUndef) { 602 if (MacroNames && !Macros.count(MacroName)) 603 MacroNames->push_back(MacroName); 604 605 Macros[MacroName] = std::make_pair("", true); 606 continue; 607 } 608 609 // For a #define'd macro, figure out the actual definition. 610 if (MacroName.size() == Macro.size()) 611 MacroBody = "1"; 612 else { 613 // Note: GCC drops anything following an end-of-line character. 614 StringRef::size_type End = MacroBody.find_first_of("\n\r"); 615 MacroBody = MacroBody.substr(0, End); 616 } 617 618 if (MacroNames && !Macros.count(MacroName)) 619 MacroNames->push_back(MacroName); 620 Macros[MacroName] = std::make_pair(MacroBody, false); 621 } 622 } 623 624 /// Check the preprocessor options deserialized from the control block 625 /// against the preprocessor options in an existing preprocessor. 626 /// 627 /// \param Diags If non-null, produce diagnostics for any mismatches incurred. 628 /// \param Validate If true, validate preprocessor options. If false, allow 629 /// macros defined by \p ExistingPPOpts to override those defined by 630 /// \p PPOpts in SuggestedPredefines. 631 static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, 632 const PreprocessorOptions &ExistingPPOpts, 633 DiagnosticsEngine *Diags, 634 FileManager &FileMgr, 635 std::string &SuggestedPredefines, 636 const LangOptions &LangOpts, 637 bool Validate = true) { 638 // Check macro definitions. 639 MacroDefinitionsMap ASTFileMacros; 640 collectMacroDefinitions(PPOpts, ASTFileMacros); 641 MacroDefinitionsMap ExistingMacros; 642 SmallVector<StringRef, 4> ExistingMacroNames; 643 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames); 644 645 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) { 646 // Dig out the macro definition in the existing preprocessor options. 647 StringRef MacroName = ExistingMacroNames[I]; 648 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName]; 649 650 // Check whether we know anything about this macro name or not. 651 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known = 652 ASTFileMacros.find(MacroName); 653 if (!Validate || Known == ASTFileMacros.end()) { 654 // FIXME: Check whether this identifier was referenced anywhere in the 655 // AST file. If so, we should reject the AST file. Unfortunately, this 656 // information isn't in the control block. What shall we do about it? 657 658 if (Existing.second) { 659 SuggestedPredefines += "#undef "; 660 SuggestedPredefines += MacroName.str(); 661 SuggestedPredefines += '\n'; 662 } else { 663 SuggestedPredefines += "#define "; 664 SuggestedPredefines += MacroName.str(); 665 SuggestedPredefines += ' '; 666 SuggestedPredefines += Existing.first.str(); 667 SuggestedPredefines += '\n'; 668 } 669 continue; 670 } 671 672 // If the macro was defined in one but undef'd in the other, we have a 673 // conflict. 674 if (Existing.second != Known->second.second) { 675 if (Diags) { 676 Diags->Report(diag::err_pch_macro_def_undef) 677 << MacroName << Known->second.second; 678 } 679 return true; 680 } 681 682 // If the macro was #undef'd in both, or if the macro bodies are identical, 683 // it's fine. 684 if (Existing.second || Existing.first == Known->second.first) 685 continue; 686 687 // The macro bodies differ; complain. 688 if (Diags) { 689 Diags->Report(diag::err_pch_macro_def_conflict) 690 << MacroName << Known->second.first << Existing.first; 691 } 692 return true; 693 } 694 695 // Check whether we're using predefines. 696 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines && Validate) { 697 if (Diags) { 698 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines; 699 } 700 return true; 701 } 702 703 // Detailed record is important since it is used for the module cache hash. 704 if (LangOpts.Modules && 705 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord && Validate) { 706 if (Diags) { 707 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord; 708 } 709 return true; 710 } 711 712 // Compute the #include and #include_macros lines we need. 713 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) { 714 StringRef File = ExistingPPOpts.Includes[I]; 715 716 if (!ExistingPPOpts.ImplicitPCHInclude.empty() && 717 !ExistingPPOpts.PCHThroughHeader.empty()) { 718 // In case the through header is an include, we must add all the includes 719 // to the predefines so the start point can be determined. 720 SuggestedPredefines += "#include \""; 721 SuggestedPredefines += File; 722 SuggestedPredefines += "\"\n"; 723 continue; 724 } 725 726 if (File == ExistingPPOpts.ImplicitPCHInclude) 727 continue; 728 729 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File) 730 != PPOpts.Includes.end()) 731 continue; 732 733 SuggestedPredefines += "#include \""; 734 SuggestedPredefines += File; 735 SuggestedPredefines += "\"\n"; 736 } 737 738 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) { 739 StringRef File = ExistingPPOpts.MacroIncludes[I]; 740 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(), 741 File) 742 != PPOpts.MacroIncludes.end()) 743 continue; 744 745 SuggestedPredefines += "#__include_macros \""; 746 SuggestedPredefines += File; 747 SuggestedPredefines += "\"\n##\n"; 748 } 749 750 return false; 751 } 752 753 bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 754 bool Complain, 755 std::string &SuggestedPredefines) { 756 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts(); 757 758 return checkPreprocessorOptions(PPOpts, ExistingPPOpts, 759 Complain? &Reader.Diags : nullptr, 760 PP.getFileManager(), 761 SuggestedPredefines, 762 PP.getLangOpts()); 763 } 764 765 bool SimpleASTReaderListener::ReadPreprocessorOptions( 766 const PreprocessorOptions &PPOpts, 767 bool Complain, 768 std::string &SuggestedPredefines) { 769 return checkPreprocessorOptions(PPOpts, 770 PP.getPreprocessorOpts(), 771 nullptr, 772 PP.getFileManager(), 773 SuggestedPredefines, 774 PP.getLangOpts(), 775 false); 776 } 777 778 /// Check the header search options deserialized from the control block 779 /// against the header search options in an existing preprocessor. 780 /// 781 /// \param Diags If non-null, produce diagnostics for any mismatches incurred. 782 static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 783 StringRef SpecificModuleCachePath, 784 StringRef ExistingModuleCachePath, 785 DiagnosticsEngine *Diags, 786 const LangOptions &LangOpts, 787 const PreprocessorOptions &PPOpts) { 788 if (LangOpts.Modules) { 789 if (SpecificModuleCachePath != ExistingModuleCachePath && 790 !PPOpts.AllowPCHWithDifferentModulesCachePath) { 791 if (Diags) 792 Diags->Report(diag::err_pch_modulecache_mismatch) 793 << SpecificModuleCachePath << ExistingModuleCachePath; 794 return true; 795 } 796 } 797 798 return false; 799 } 800 801 bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 802 StringRef SpecificModuleCachePath, 803 bool Complain) { 804 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 805 PP.getHeaderSearchInfo().getModuleCachePath(), 806 Complain ? &Reader.Diags : nullptr, 807 PP.getLangOpts(), PP.getPreprocessorOpts()); 808 } 809 810 void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) { 811 PP.setCounterValue(Value); 812 } 813 814 //===----------------------------------------------------------------------===// 815 // AST reader implementation 816 //===----------------------------------------------------------------------===// 817 818 static uint64_t readULEB(const unsigned char *&P) { 819 unsigned Length = 0; 820 const char *Error = nullptr; 821 822 uint64_t Val = llvm::decodeULEB128(P, &Length, nullptr, &Error); 823 if (Error) 824 llvm::report_fatal_error(Error); 825 P += Length; 826 return Val; 827 } 828 829 /// Read ULEB-encoded key length and data length. 830 static std::pair<unsigned, unsigned> 831 readULEBKeyDataLength(const unsigned char *&P) { 832 unsigned KeyLen = readULEB(P); 833 if ((unsigned)KeyLen != KeyLen) 834 llvm::report_fatal_error("key too large"); 835 836 unsigned DataLen = readULEB(P); 837 if ((unsigned)DataLen != DataLen) 838 llvm::report_fatal_error("data too large"); 839 840 return std::make_pair(KeyLen, DataLen); 841 } 842 843 void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener, 844 bool TakeOwnership) { 845 DeserializationListener = Listener; 846 OwnsDeserializationListener = TakeOwnership; 847 } 848 849 unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) { 850 return serialization::ComputeHash(Sel); 851 } 852 853 std::pair<unsigned, unsigned> 854 ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) { 855 return readULEBKeyDataLength(d); 856 } 857 858 ASTSelectorLookupTrait::internal_key_type 859 ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) { 860 using namespace llvm::support; 861 862 SelectorTable &SelTable = Reader.getContext().Selectors; 863 unsigned N = endian::readNext<uint16_t, little, unaligned>(d); 864 IdentifierInfo *FirstII = Reader.getLocalIdentifier( 865 F, endian::readNext<uint32_t, little, unaligned>(d)); 866 if (N == 0) 867 return SelTable.getNullarySelector(FirstII); 868 else if (N == 1) 869 return SelTable.getUnarySelector(FirstII); 870 871 SmallVector<IdentifierInfo *, 16> Args; 872 Args.push_back(FirstII); 873 for (unsigned I = 1; I != N; ++I) 874 Args.push_back(Reader.getLocalIdentifier( 875 F, endian::readNext<uint32_t, little, unaligned>(d))); 876 877 return SelTable.getSelector(N, Args.data()); 878 } 879 880 ASTSelectorLookupTrait::data_type 881 ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d, 882 unsigned DataLen) { 883 using namespace llvm::support; 884 885 data_type Result; 886 887 Result.ID = Reader.getGlobalSelectorID( 888 F, endian::readNext<uint32_t, little, unaligned>(d)); 889 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d); 890 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d); 891 Result.InstanceBits = FullInstanceBits & 0x3; 892 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1; 893 Result.FactoryBits = FullFactoryBits & 0x3; 894 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1; 895 unsigned NumInstanceMethods = FullInstanceBits >> 3; 896 unsigned NumFactoryMethods = FullFactoryBits >> 3; 897 898 // Load instance methods 899 for (unsigned I = 0; I != NumInstanceMethods; ++I) { 900 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 901 F, endian::readNext<uint32_t, little, unaligned>(d))) 902 Result.Instance.push_back(Method); 903 } 904 905 // Load factory methods 906 for (unsigned I = 0; I != NumFactoryMethods; ++I) { 907 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 908 F, endian::readNext<uint32_t, little, unaligned>(d))) 909 Result.Factory.push_back(Method); 910 } 911 912 return Result; 913 } 914 915 unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) { 916 return llvm::djbHash(a); 917 } 918 919 std::pair<unsigned, unsigned> 920 ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) { 921 return readULEBKeyDataLength(d); 922 } 923 924 ASTIdentifierLookupTraitBase::internal_key_type 925 ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) { 926 assert(n >= 2 && d[n-1] == '\0'); 927 return StringRef((const char*) d, n-1); 928 } 929 930 /// Whether the given identifier is "interesting". 931 static bool isInterestingIdentifier(ASTReader &Reader, IdentifierInfo &II, 932 bool IsModule) { 933 return II.hadMacroDefinition() || II.isPoisoned() || 934 (!IsModule && II.getObjCOrBuiltinID()) || 935 II.hasRevertedTokenIDToIdentifier() || 936 (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) && 937 II.getFETokenInfo()); 938 } 939 940 static bool readBit(unsigned &Bits) { 941 bool Value = Bits & 0x1; 942 Bits >>= 1; 943 return Value; 944 } 945 946 IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) { 947 using namespace llvm::support; 948 949 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 950 return Reader.getGlobalIdentifierID(F, RawID >> 1); 951 } 952 953 static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II) { 954 if (!II.isFromAST()) { 955 II.setIsFromAST(); 956 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr; 957 if (isInterestingIdentifier(Reader, II, IsModule)) 958 II.setChangedSinceDeserialization(); 959 } 960 } 961 962 IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, 963 const unsigned char* d, 964 unsigned DataLen) { 965 using namespace llvm::support; 966 967 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 968 bool IsInteresting = RawID & 0x01; 969 970 // Wipe out the "is interesting" bit. 971 RawID = RawID >> 1; 972 973 // Build the IdentifierInfo and link the identifier ID with it. 974 IdentifierInfo *II = KnownII; 975 if (!II) { 976 II = &Reader.getIdentifierTable().getOwn(k); 977 KnownII = II; 978 } 979 markIdentifierFromAST(Reader, *II); 980 Reader.markIdentifierUpToDate(II); 981 982 IdentID ID = Reader.getGlobalIdentifierID(F, RawID); 983 if (!IsInteresting) { 984 // For uninteresting identifiers, there's nothing else to do. Just notify 985 // the reader that we've finished loading this identifier. 986 Reader.SetIdentifierInfo(ID, II); 987 return II; 988 } 989 990 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d); 991 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d); 992 bool CPlusPlusOperatorKeyword = readBit(Bits); 993 bool HasRevertedTokenIDToIdentifier = readBit(Bits); 994 bool Poisoned = readBit(Bits); 995 bool ExtensionToken = readBit(Bits); 996 bool HadMacroDefinition = readBit(Bits); 997 998 assert(Bits == 0 && "Extra bits in the identifier?"); 999 DataLen -= 8; 1000 1001 // Set or check the various bits in the IdentifierInfo structure. 1002 // Token IDs are read-only. 1003 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier) 1004 II->revertTokenIDToIdentifier(); 1005 if (!F.isModule()) 1006 II->setObjCOrBuiltinID(ObjCOrBuiltinID); 1007 assert(II->isExtensionToken() == ExtensionToken && 1008 "Incorrect extension token flag"); 1009 (void)ExtensionToken; 1010 if (Poisoned) 1011 II->setIsPoisoned(true); 1012 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword && 1013 "Incorrect C++ operator keyword flag"); 1014 (void)CPlusPlusOperatorKeyword; 1015 1016 // If this identifier is a macro, deserialize the macro 1017 // definition. 1018 if (HadMacroDefinition) { 1019 uint32_t MacroDirectivesOffset = 1020 endian::readNext<uint32_t, little, unaligned>(d); 1021 DataLen -= 4; 1022 1023 Reader.addPendingMacro(II, &F, MacroDirectivesOffset); 1024 } 1025 1026 Reader.SetIdentifierInfo(ID, II); 1027 1028 // Read all of the declarations visible at global scope with this 1029 // name. 1030 if (DataLen > 0) { 1031 SmallVector<uint32_t, 4> DeclIDs; 1032 for (; DataLen > 0; DataLen -= 4) 1033 DeclIDs.push_back(Reader.getGlobalDeclID( 1034 F, endian::readNext<uint32_t, little, unaligned>(d))); 1035 Reader.SetGloballyVisibleDecls(II, DeclIDs); 1036 } 1037 1038 return II; 1039 } 1040 1041 DeclarationNameKey::DeclarationNameKey(DeclarationName Name) 1042 : Kind(Name.getNameKind()) { 1043 switch (Kind) { 1044 case DeclarationName::Identifier: 1045 Data = (uint64_t)Name.getAsIdentifierInfo(); 1046 break; 1047 case DeclarationName::ObjCZeroArgSelector: 1048 case DeclarationName::ObjCOneArgSelector: 1049 case DeclarationName::ObjCMultiArgSelector: 1050 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr(); 1051 break; 1052 case DeclarationName::CXXOperatorName: 1053 Data = Name.getCXXOverloadedOperator(); 1054 break; 1055 case DeclarationName::CXXLiteralOperatorName: 1056 Data = (uint64_t)Name.getCXXLiteralIdentifier(); 1057 break; 1058 case DeclarationName::CXXDeductionGuideName: 1059 Data = (uint64_t)Name.getCXXDeductionGuideTemplate() 1060 ->getDeclName().getAsIdentifierInfo(); 1061 break; 1062 case DeclarationName::CXXConstructorName: 1063 case DeclarationName::CXXDestructorName: 1064 case DeclarationName::CXXConversionFunctionName: 1065 case DeclarationName::CXXUsingDirective: 1066 Data = 0; 1067 break; 1068 } 1069 } 1070 1071 unsigned DeclarationNameKey::getHash() const { 1072 llvm::FoldingSetNodeID ID; 1073 ID.AddInteger(Kind); 1074 1075 switch (Kind) { 1076 case DeclarationName::Identifier: 1077 case DeclarationName::CXXLiteralOperatorName: 1078 case DeclarationName::CXXDeductionGuideName: 1079 ID.AddString(((IdentifierInfo*)Data)->getName()); 1080 break; 1081 case DeclarationName::ObjCZeroArgSelector: 1082 case DeclarationName::ObjCOneArgSelector: 1083 case DeclarationName::ObjCMultiArgSelector: 1084 ID.AddInteger(serialization::ComputeHash(Selector(Data))); 1085 break; 1086 case DeclarationName::CXXOperatorName: 1087 ID.AddInteger((OverloadedOperatorKind)Data); 1088 break; 1089 case DeclarationName::CXXConstructorName: 1090 case DeclarationName::CXXDestructorName: 1091 case DeclarationName::CXXConversionFunctionName: 1092 case DeclarationName::CXXUsingDirective: 1093 break; 1094 } 1095 1096 return ID.ComputeHash(); 1097 } 1098 1099 ModuleFile * 1100 ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) { 1101 using namespace llvm::support; 1102 1103 uint32_t ModuleFileID = endian::readNext<uint32_t, little, unaligned>(d); 1104 return Reader.getLocalModuleFile(F, ModuleFileID); 1105 } 1106 1107 std::pair<unsigned, unsigned> 1108 ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) { 1109 return readULEBKeyDataLength(d); 1110 } 1111 1112 ASTDeclContextNameLookupTrait::internal_key_type 1113 ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) { 1114 using namespace llvm::support; 1115 1116 auto Kind = (DeclarationName::NameKind)*d++; 1117 uint64_t Data; 1118 switch (Kind) { 1119 case DeclarationName::Identifier: 1120 case DeclarationName::CXXLiteralOperatorName: 1121 case DeclarationName::CXXDeductionGuideName: 1122 Data = (uint64_t)Reader.getLocalIdentifier( 1123 F, endian::readNext<uint32_t, little, unaligned>(d)); 1124 break; 1125 case DeclarationName::ObjCZeroArgSelector: 1126 case DeclarationName::ObjCOneArgSelector: 1127 case DeclarationName::ObjCMultiArgSelector: 1128 Data = 1129 (uint64_t)Reader.getLocalSelector( 1130 F, endian::readNext<uint32_t, little, unaligned>( 1131 d)).getAsOpaquePtr(); 1132 break; 1133 case DeclarationName::CXXOperatorName: 1134 Data = *d++; // OverloadedOperatorKind 1135 break; 1136 case DeclarationName::CXXConstructorName: 1137 case DeclarationName::CXXDestructorName: 1138 case DeclarationName::CXXConversionFunctionName: 1139 case DeclarationName::CXXUsingDirective: 1140 Data = 0; 1141 break; 1142 } 1143 1144 return DeclarationNameKey(Kind, Data); 1145 } 1146 1147 void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type, 1148 const unsigned char *d, 1149 unsigned DataLen, 1150 data_type_builder &Val) { 1151 using namespace llvm::support; 1152 1153 for (unsigned NumDecls = DataLen / 4; NumDecls; --NumDecls) { 1154 uint32_t LocalID = endian::readNext<uint32_t, little, unaligned>(d); 1155 Val.insert(Reader.getGlobalDeclID(F, LocalID)); 1156 } 1157 } 1158 1159 bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M, 1160 BitstreamCursor &Cursor, 1161 uint64_t Offset, 1162 DeclContext *DC) { 1163 assert(Offset != 0); 1164 1165 SavedStreamPosition SavedPosition(Cursor); 1166 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1167 Error(std::move(Err)); 1168 return true; 1169 } 1170 1171 RecordData Record; 1172 StringRef Blob; 1173 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1174 if (!MaybeCode) { 1175 Error(MaybeCode.takeError()); 1176 return true; 1177 } 1178 unsigned Code = MaybeCode.get(); 1179 1180 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob); 1181 if (!MaybeRecCode) { 1182 Error(MaybeRecCode.takeError()); 1183 return true; 1184 } 1185 unsigned RecCode = MaybeRecCode.get(); 1186 if (RecCode != DECL_CONTEXT_LEXICAL) { 1187 Error("Expected lexical block"); 1188 return true; 1189 } 1190 1191 assert(!isa<TranslationUnitDecl>(DC) && 1192 "expected a TU_UPDATE_LEXICAL record for TU"); 1193 // If we are handling a C++ class template instantiation, we can see multiple 1194 // lexical updates for the same record. It's important that we select only one 1195 // of them, so that field numbering works properly. Just pick the first one we 1196 // see. 1197 auto &Lex = LexicalDecls[DC]; 1198 if (!Lex.first) { 1199 Lex = std::make_pair( 1200 &M, llvm::makeArrayRef( 1201 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 1202 Blob.data()), 1203 Blob.size() / 4)); 1204 } 1205 DC->setHasExternalLexicalStorage(true); 1206 return false; 1207 } 1208 1209 bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M, 1210 BitstreamCursor &Cursor, 1211 uint64_t Offset, 1212 DeclID ID) { 1213 assert(Offset != 0); 1214 1215 SavedStreamPosition SavedPosition(Cursor); 1216 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1217 Error(std::move(Err)); 1218 return true; 1219 } 1220 1221 RecordData Record; 1222 StringRef Blob; 1223 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1224 if (!MaybeCode) { 1225 Error(MaybeCode.takeError()); 1226 return true; 1227 } 1228 unsigned Code = MaybeCode.get(); 1229 1230 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob); 1231 if (!MaybeRecCode) { 1232 Error(MaybeRecCode.takeError()); 1233 return true; 1234 } 1235 unsigned RecCode = MaybeRecCode.get(); 1236 if (RecCode != DECL_CONTEXT_VISIBLE) { 1237 Error("Expected visible lookup table block"); 1238 return true; 1239 } 1240 1241 // We can't safely determine the primary context yet, so delay attaching the 1242 // lookup table until we're done with recursive deserialization. 1243 auto *Data = (const unsigned char*)Blob.data(); 1244 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data}); 1245 return false; 1246 } 1247 1248 void ASTReader::Error(StringRef Msg) const { 1249 Error(diag::err_fe_pch_malformed, Msg); 1250 if (PP.getLangOpts().Modules && !Diags.isDiagnosticInFlight() && 1251 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) { 1252 Diag(diag::note_module_cache_path) 1253 << PP.getHeaderSearchInfo().getModuleCachePath(); 1254 } 1255 } 1256 1257 void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2, 1258 StringRef Arg3) const { 1259 if (Diags.isDiagnosticInFlight()) 1260 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2, Arg3); 1261 else 1262 Diag(DiagID) << Arg1 << Arg2 << Arg3; 1263 } 1264 1265 void ASTReader::Error(llvm::Error &&Err) const { 1266 Error(toString(std::move(Err))); 1267 } 1268 1269 //===----------------------------------------------------------------------===// 1270 // Source Manager Deserialization 1271 //===----------------------------------------------------------------------===// 1272 1273 /// Read the line table in the source manager block. 1274 /// \returns true if there was an error. 1275 bool ASTReader::ParseLineTable(ModuleFile &F, 1276 const RecordData &Record) { 1277 unsigned Idx = 0; 1278 LineTableInfo &LineTable = SourceMgr.getLineTable(); 1279 1280 // Parse the file names 1281 std::map<int, int> FileIDs; 1282 FileIDs[-1] = -1; // For unspecified filenames. 1283 for (unsigned I = 0; Record[Idx]; ++I) { 1284 // Extract the file name 1285 auto Filename = ReadPath(F, Record, Idx); 1286 FileIDs[I] = LineTable.getLineTableFilenameID(Filename); 1287 } 1288 ++Idx; 1289 1290 // Parse the line entries 1291 std::vector<LineEntry> Entries; 1292 while (Idx < Record.size()) { 1293 int FID = Record[Idx++]; 1294 assert(FID >= 0 && "Serialized line entries for non-local file."); 1295 // Remap FileID from 1-based old view. 1296 FID += F.SLocEntryBaseID - 1; 1297 1298 // Extract the line entries 1299 unsigned NumEntries = Record[Idx++]; 1300 assert(NumEntries && "no line entries for file ID"); 1301 Entries.clear(); 1302 Entries.reserve(NumEntries); 1303 for (unsigned I = 0; I != NumEntries; ++I) { 1304 unsigned FileOffset = Record[Idx++]; 1305 unsigned LineNo = Record[Idx++]; 1306 int FilenameID = FileIDs[Record[Idx++]]; 1307 SrcMgr::CharacteristicKind FileKind 1308 = (SrcMgr::CharacteristicKind)Record[Idx++]; 1309 unsigned IncludeOffset = Record[Idx++]; 1310 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID, 1311 FileKind, IncludeOffset)); 1312 } 1313 LineTable.AddEntry(FileID::get(FID), Entries); 1314 } 1315 1316 return false; 1317 } 1318 1319 /// Read a source manager block 1320 bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) { 1321 using namespace SrcMgr; 1322 1323 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor; 1324 1325 // Set the source-location entry cursor to the current position in 1326 // the stream. This cursor will be used to read the contents of the 1327 // source manager block initially, and then lazily read 1328 // source-location entries as needed. 1329 SLocEntryCursor = F.Stream; 1330 1331 // The stream itself is going to skip over the source manager block. 1332 if (llvm::Error Err = F.Stream.SkipBlock()) { 1333 Error(std::move(Err)); 1334 return true; 1335 } 1336 1337 // Enter the source manager block. 1338 if (llvm::Error Err = 1339 SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) { 1340 Error(std::move(Err)); 1341 return true; 1342 } 1343 F.SourceManagerBlockStartOffset = SLocEntryCursor.GetCurrentBitNo(); 1344 1345 RecordData Record; 1346 while (true) { 1347 Expected<llvm::BitstreamEntry> MaybeE = 1348 SLocEntryCursor.advanceSkippingSubblocks(); 1349 if (!MaybeE) { 1350 Error(MaybeE.takeError()); 1351 return true; 1352 } 1353 llvm::BitstreamEntry E = MaybeE.get(); 1354 1355 switch (E.Kind) { 1356 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1357 case llvm::BitstreamEntry::Error: 1358 Error("malformed block record in AST file"); 1359 return true; 1360 case llvm::BitstreamEntry::EndBlock: 1361 return false; 1362 case llvm::BitstreamEntry::Record: 1363 // The interesting case. 1364 break; 1365 } 1366 1367 // Read a record. 1368 Record.clear(); 1369 StringRef Blob; 1370 Expected<unsigned> MaybeRecord = 1371 SLocEntryCursor.readRecord(E.ID, Record, &Blob); 1372 if (!MaybeRecord) { 1373 Error(MaybeRecord.takeError()); 1374 return true; 1375 } 1376 switch (MaybeRecord.get()) { 1377 default: // Default behavior: ignore. 1378 break; 1379 1380 case SM_SLOC_FILE_ENTRY: 1381 case SM_SLOC_BUFFER_ENTRY: 1382 case SM_SLOC_EXPANSION_ENTRY: 1383 // Once we hit one of the source location entries, we're done. 1384 return false; 1385 } 1386 } 1387 } 1388 1389 /// If a header file is not found at the path that we expect it to be 1390 /// and the PCH file was moved from its original location, try to resolve the 1391 /// file by assuming that header+PCH were moved together and the header is in 1392 /// the same place relative to the PCH. 1393 static std::string 1394 resolveFileRelativeToOriginalDir(const std::string &Filename, 1395 const std::string &OriginalDir, 1396 const std::string &CurrDir) { 1397 assert(OriginalDir != CurrDir && 1398 "No point trying to resolve the file if the PCH dir didn't change"); 1399 1400 using namespace llvm::sys; 1401 1402 SmallString<128> filePath(Filename); 1403 fs::make_absolute(filePath); 1404 assert(path::is_absolute(OriginalDir)); 1405 SmallString<128> currPCHPath(CurrDir); 1406 1407 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)), 1408 fileDirE = path::end(path::parent_path(filePath)); 1409 path::const_iterator origDirI = path::begin(OriginalDir), 1410 origDirE = path::end(OriginalDir); 1411 // Skip the common path components from filePath and OriginalDir. 1412 while (fileDirI != fileDirE && origDirI != origDirE && 1413 *fileDirI == *origDirI) { 1414 ++fileDirI; 1415 ++origDirI; 1416 } 1417 for (; origDirI != origDirE; ++origDirI) 1418 path::append(currPCHPath, ".."); 1419 path::append(currPCHPath, fileDirI, fileDirE); 1420 path::append(currPCHPath, path::filename(Filename)); 1421 return std::string(currPCHPath.str()); 1422 } 1423 1424 bool ASTReader::ReadSLocEntry(int ID) { 1425 if (ID == 0) 1426 return false; 1427 1428 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1429 Error("source location entry ID out-of-range for AST file"); 1430 return true; 1431 } 1432 1433 // Local helper to read the (possibly-compressed) buffer data following the 1434 // entry record. 1435 auto ReadBuffer = [this]( 1436 BitstreamCursor &SLocEntryCursor, 1437 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> { 1438 RecordData Record; 1439 StringRef Blob; 1440 Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode(); 1441 if (!MaybeCode) { 1442 Error(MaybeCode.takeError()); 1443 return nullptr; 1444 } 1445 unsigned Code = MaybeCode.get(); 1446 1447 Expected<unsigned> MaybeRecCode = 1448 SLocEntryCursor.readRecord(Code, Record, &Blob); 1449 if (!MaybeRecCode) { 1450 Error(MaybeRecCode.takeError()); 1451 return nullptr; 1452 } 1453 unsigned RecCode = MaybeRecCode.get(); 1454 1455 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) { 1456 if (!llvm::zlib::isAvailable()) { 1457 Error("zlib is not available"); 1458 return nullptr; 1459 } 1460 SmallString<0> Uncompressed; 1461 if (llvm::Error E = 1462 llvm::zlib::uncompress(Blob, Uncompressed, Record[0])) { 1463 Error("could not decompress embedded file contents: " + 1464 llvm::toString(std::move(E))); 1465 return nullptr; 1466 } 1467 return llvm::MemoryBuffer::getMemBufferCopy(Uncompressed, Name); 1468 } else if (RecCode == SM_SLOC_BUFFER_BLOB) { 1469 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true); 1470 } else { 1471 Error("AST record has invalid code"); 1472 return nullptr; 1473 } 1474 }; 1475 1476 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second; 1477 if (llvm::Error Err = F->SLocEntryCursor.JumpToBit( 1478 F->SLocEntryOffsetsBase + 1479 F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) { 1480 Error(std::move(Err)); 1481 return true; 1482 } 1483 1484 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor; 1485 SourceLocation::UIntTy BaseOffset = F->SLocEntryBaseOffset; 1486 1487 ++NumSLocEntriesRead; 1488 Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance(); 1489 if (!MaybeEntry) { 1490 Error(MaybeEntry.takeError()); 1491 return true; 1492 } 1493 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1494 1495 if (Entry.Kind != llvm::BitstreamEntry::Record) { 1496 Error("incorrectly-formatted source location entry in AST file"); 1497 return true; 1498 } 1499 1500 RecordData Record; 1501 StringRef Blob; 1502 Expected<unsigned> MaybeSLOC = 1503 SLocEntryCursor.readRecord(Entry.ID, Record, &Blob); 1504 if (!MaybeSLOC) { 1505 Error(MaybeSLOC.takeError()); 1506 return true; 1507 } 1508 switch (MaybeSLOC.get()) { 1509 default: 1510 Error("incorrectly-formatted source location entry in AST file"); 1511 return true; 1512 1513 case SM_SLOC_FILE_ENTRY: { 1514 // We will detect whether a file changed and return 'Failure' for it, but 1515 // we will also try to fail gracefully by setting up the SLocEntry. 1516 unsigned InputID = Record[4]; 1517 InputFile IF = getInputFile(*F, InputID); 1518 Optional<FileEntryRef> File = IF.getFile(); 1519 bool OverriddenBuffer = IF.isOverridden(); 1520 1521 // Note that we only check if a File was returned. If it was out-of-date 1522 // we have complained but we will continue creating a FileID to recover 1523 // gracefully. 1524 if (!File) 1525 return true; 1526 1527 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1528 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) { 1529 // This is the module's main file. 1530 IncludeLoc = getImportLocation(F); 1531 } 1532 SrcMgr::CharacteristicKind 1533 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1534 FileID FID = SourceMgr.createFileID(*File, IncludeLoc, FileCharacter, ID, 1535 BaseOffset + Record[0]); 1536 SrcMgr::FileInfo &FileInfo = 1537 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile()); 1538 FileInfo.NumCreatedFIDs = Record[5]; 1539 if (Record[3]) 1540 FileInfo.setHasLineDirectives(); 1541 1542 unsigned NumFileDecls = Record[7]; 1543 if (NumFileDecls && ContextObj) { 1544 const DeclID *FirstDecl = F->FileSortedDecls + Record[6]; 1545 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?"); 1546 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl, 1547 NumFileDecls)); 1548 } 1549 1550 const SrcMgr::ContentCache &ContentCache = 1551 SourceMgr.getOrCreateContentCache(*File, isSystem(FileCharacter)); 1552 if (OverriddenBuffer && !ContentCache.BufferOverridden && 1553 ContentCache.ContentsEntry == ContentCache.OrigEntry && 1554 !ContentCache.getBufferIfLoaded()) { 1555 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName()); 1556 if (!Buffer) 1557 return true; 1558 SourceMgr.overrideFileContents(*File, std::move(Buffer)); 1559 } 1560 1561 break; 1562 } 1563 1564 case SM_SLOC_BUFFER_ENTRY: { 1565 const char *Name = Blob.data(); 1566 unsigned Offset = Record[0]; 1567 SrcMgr::CharacteristicKind 1568 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1569 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1570 if (IncludeLoc.isInvalid() && F->isModule()) { 1571 IncludeLoc = getImportLocation(F); 1572 } 1573 1574 auto Buffer = ReadBuffer(SLocEntryCursor, Name); 1575 if (!Buffer) 1576 return true; 1577 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID, 1578 BaseOffset + Offset, IncludeLoc); 1579 break; 1580 } 1581 1582 case SM_SLOC_EXPANSION_ENTRY: { 1583 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]); 1584 SourceMgr.createExpansionLoc(SpellingLoc, 1585 ReadSourceLocation(*F, Record[2]), 1586 ReadSourceLocation(*F, Record[3]), 1587 Record[5], 1588 Record[4], 1589 ID, 1590 BaseOffset + Record[0]); 1591 break; 1592 } 1593 } 1594 1595 return false; 1596 } 1597 1598 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) { 1599 if (ID == 0) 1600 return std::make_pair(SourceLocation(), ""); 1601 1602 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1603 Error("source location entry ID out-of-range for AST file"); 1604 return std::make_pair(SourceLocation(), ""); 1605 } 1606 1607 // Find which module file this entry lands in. 1608 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second; 1609 if (!M->isModule()) 1610 return std::make_pair(SourceLocation(), ""); 1611 1612 // FIXME: Can we map this down to a particular submodule? That would be 1613 // ideal. 1614 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName)); 1615 } 1616 1617 /// Find the location where the module F is imported. 1618 SourceLocation ASTReader::getImportLocation(ModuleFile *F) { 1619 if (F->ImportLoc.isValid()) 1620 return F->ImportLoc; 1621 1622 // Otherwise we have a PCH. It's considered to be "imported" at the first 1623 // location of its includer. 1624 if (F->ImportedBy.empty() || !F->ImportedBy[0]) { 1625 // Main file is the importer. 1626 assert(SourceMgr.getMainFileID().isValid() && "missing main file"); 1627 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID()); 1628 } 1629 return F->ImportedBy[0]->FirstLoc; 1630 } 1631 1632 /// Enter a subblock of the specified BlockID with the specified cursor. Read 1633 /// the abbreviations that are at the top of the block and then leave the cursor 1634 /// pointing into the block. 1635 bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID, 1636 uint64_t *StartOfBlockOffset) { 1637 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) { 1638 // FIXME this drops errors on the floor. 1639 consumeError(std::move(Err)); 1640 return true; 1641 } 1642 1643 if (StartOfBlockOffset) 1644 *StartOfBlockOffset = Cursor.GetCurrentBitNo(); 1645 1646 while (true) { 1647 uint64_t Offset = Cursor.GetCurrentBitNo(); 1648 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1649 if (!MaybeCode) { 1650 // FIXME this drops errors on the floor. 1651 consumeError(MaybeCode.takeError()); 1652 return true; 1653 } 1654 unsigned Code = MaybeCode.get(); 1655 1656 // We expect all abbrevs to be at the start of the block. 1657 if (Code != llvm::bitc::DEFINE_ABBREV) { 1658 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1659 // FIXME this drops errors on the floor. 1660 consumeError(std::move(Err)); 1661 return true; 1662 } 1663 return false; 1664 } 1665 if (llvm::Error Err = Cursor.ReadAbbrevRecord()) { 1666 // FIXME this drops errors on the floor. 1667 consumeError(std::move(Err)); 1668 return true; 1669 } 1670 } 1671 } 1672 1673 Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record, 1674 unsigned &Idx) { 1675 Token Tok; 1676 Tok.startToken(); 1677 Tok.setLocation(ReadSourceLocation(F, Record, Idx)); 1678 Tok.setLength(Record[Idx++]); 1679 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++])) 1680 Tok.setIdentifierInfo(II); 1681 Tok.setKind((tok::TokenKind)Record[Idx++]); 1682 Tok.setFlag((Token::TokenFlags)Record[Idx++]); 1683 return Tok; 1684 } 1685 1686 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { 1687 BitstreamCursor &Stream = F.MacroCursor; 1688 1689 // Keep track of where we are in the stream, then jump back there 1690 // after reading this macro. 1691 SavedStreamPosition SavedPosition(Stream); 1692 1693 if (llvm::Error Err = Stream.JumpToBit(Offset)) { 1694 // FIXME this drops errors on the floor. 1695 consumeError(std::move(Err)); 1696 return nullptr; 1697 } 1698 RecordData Record; 1699 SmallVector<IdentifierInfo*, 16> MacroParams; 1700 MacroInfo *Macro = nullptr; 1701 1702 while (true) { 1703 // Advance to the next record, but if we get to the end of the block, don't 1704 // pop it (removing all the abbreviations from the cursor) since we want to 1705 // be able to reseek within the block and read entries. 1706 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd; 1707 Expected<llvm::BitstreamEntry> MaybeEntry = 1708 Stream.advanceSkippingSubblocks(Flags); 1709 if (!MaybeEntry) { 1710 Error(MaybeEntry.takeError()); 1711 return Macro; 1712 } 1713 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1714 1715 switch (Entry.Kind) { 1716 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1717 case llvm::BitstreamEntry::Error: 1718 Error("malformed block record in AST file"); 1719 return Macro; 1720 case llvm::BitstreamEntry::EndBlock: 1721 return Macro; 1722 case llvm::BitstreamEntry::Record: 1723 // The interesting case. 1724 break; 1725 } 1726 1727 // Read a record. 1728 Record.clear(); 1729 PreprocessorRecordTypes RecType; 1730 if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record)) 1731 RecType = (PreprocessorRecordTypes)MaybeRecType.get(); 1732 else { 1733 Error(MaybeRecType.takeError()); 1734 return Macro; 1735 } 1736 switch (RecType) { 1737 case PP_MODULE_MACRO: 1738 case PP_MACRO_DIRECTIVE_HISTORY: 1739 return Macro; 1740 1741 case PP_MACRO_OBJECT_LIKE: 1742 case PP_MACRO_FUNCTION_LIKE: { 1743 // If we already have a macro, that means that we've hit the end 1744 // of the definition of the macro we were looking for. We're 1745 // done. 1746 if (Macro) 1747 return Macro; 1748 1749 unsigned NextIndex = 1; // Skip identifier ID. 1750 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex); 1751 MacroInfo *MI = PP.AllocateMacroInfo(Loc); 1752 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex)); 1753 MI->setIsUsed(Record[NextIndex++]); 1754 MI->setUsedForHeaderGuard(Record[NextIndex++]); 1755 1756 if (RecType == PP_MACRO_FUNCTION_LIKE) { 1757 // Decode function-like macro info. 1758 bool isC99VarArgs = Record[NextIndex++]; 1759 bool isGNUVarArgs = Record[NextIndex++]; 1760 bool hasCommaPasting = Record[NextIndex++]; 1761 MacroParams.clear(); 1762 unsigned NumArgs = Record[NextIndex++]; 1763 for (unsigned i = 0; i != NumArgs; ++i) 1764 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++])); 1765 1766 // Install function-like macro info. 1767 MI->setIsFunctionLike(); 1768 if (isC99VarArgs) MI->setIsC99Varargs(); 1769 if (isGNUVarArgs) MI->setIsGNUVarargs(); 1770 if (hasCommaPasting) MI->setHasCommaPasting(); 1771 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator()); 1772 } 1773 1774 // Remember that we saw this macro last so that we add the tokens that 1775 // form its body to it. 1776 Macro = MI; 1777 1778 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() && 1779 Record[NextIndex]) { 1780 // We have a macro definition. Register the association 1781 PreprocessedEntityID 1782 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]); 1783 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 1784 PreprocessingRecord::PPEntityID PPID = 1785 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true); 1786 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>( 1787 PPRec.getPreprocessedEntity(PPID)); 1788 if (PPDef) 1789 PPRec.RegisterMacroDefinition(Macro, PPDef); 1790 } 1791 1792 ++NumMacrosRead; 1793 break; 1794 } 1795 1796 case PP_TOKEN: { 1797 // If we see a TOKEN before a PP_MACRO_*, then the file is 1798 // erroneous, just pretend we didn't see this. 1799 if (!Macro) break; 1800 1801 unsigned Idx = 0; 1802 Token Tok = ReadToken(F, Record, Idx); 1803 Macro->AddTokenToBody(Tok); 1804 break; 1805 } 1806 } 1807 } 1808 } 1809 1810 PreprocessedEntityID 1811 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, 1812 unsigned LocalID) const { 1813 if (!M.ModuleOffsetMap.empty()) 1814 ReadModuleOffsetMap(M); 1815 1816 ContinuousRangeMap<uint32_t, int, 2>::const_iterator 1817 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS); 1818 assert(I != M.PreprocessedEntityRemap.end() 1819 && "Invalid index into preprocessed entity index remap"); 1820 1821 return LocalID + I->second; 1822 } 1823 1824 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) { 1825 return llvm::hash_combine(ikey.Size, ikey.ModTime); 1826 } 1827 1828 HeaderFileInfoTrait::internal_key_type 1829 HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) { 1830 internal_key_type ikey = {FE->getSize(), 1831 M.HasTimestamps ? FE->getModificationTime() : 0, 1832 FE->getName(), /*Imported*/ false}; 1833 return ikey; 1834 } 1835 1836 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) { 1837 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime)) 1838 return false; 1839 1840 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename) 1841 return true; 1842 1843 // Determine whether the actual files are equivalent. 1844 FileManager &FileMgr = Reader.getFileManager(); 1845 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* { 1846 if (!Key.Imported) { 1847 if (auto File = FileMgr.getFile(Key.Filename)) 1848 return *File; 1849 return nullptr; 1850 } 1851 1852 std::string Resolved = std::string(Key.Filename); 1853 Reader.ResolveImportedPath(M, Resolved); 1854 if (auto File = FileMgr.getFile(Resolved)) 1855 return *File; 1856 return nullptr; 1857 }; 1858 1859 const FileEntry *FEA = GetFile(a); 1860 const FileEntry *FEB = GetFile(b); 1861 return FEA && FEA == FEB; 1862 } 1863 1864 std::pair<unsigned, unsigned> 1865 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) { 1866 return readULEBKeyDataLength(d); 1867 } 1868 1869 HeaderFileInfoTrait::internal_key_type 1870 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) { 1871 using namespace llvm::support; 1872 1873 internal_key_type ikey; 1874 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d)); 1875 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d)); 1876 ikey.Filename = (const char *)d; 1877 ikey.Imported = true; 1878 return ikey; 1879 } 1880 1881 HeaderFileInfoTrait::data_type 1882 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d, 1883 unsigned DataLen) { 1884 using namespace llvm::support; 1885 1886 const unsigned char *End = d + DataLen; 1887 HeaderFileInfo HFI; 1888 unsigned Flags = *d++; 1889 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp. 1890 HFI.isImport |= (Flags >> 5) & 0x01; 1891 HFI.isPragmaOnce |= (Flags >> 4) & 0x01; 1892 HFI.DirInfo = (Flags >> 1) & 0x07; 1893 HFI.IndexHeaderMapHeader = Flags & 0x01; 1894 // FIXME: Find a better way to handle this. Maybe just store a 1895 // "has been included" flag? 1896 HFI.NumIncludes = std::max(endian::readNext<uint16_t, little, unaligned>(d), 1897 HFI.NumIncludes); 1898 HFI.ControllingMacroID = Reader.getGlobalIdentifierID( 1899 M, endian::readNext<uint32_t, little, unaligned>(d)); 1900 if (unsigned FrameworkOffset = 1901 endian::readNext<uint32_t, little, unaligned>(d)) { 1902 // The framework offset is 1 greater than the actual offset, 1903 // since 0 is used as an indicator for "no framework name". 1904 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1); 1905 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName); 1906 } 1907 1908 assert((End - d) % 4 == 0 && 1909 "Wrong data length in HeaderFileInfo deserialization"); 1910 while (d != End) { 1911 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d); 1912 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3); 1913 LocalSMID >>= 2; 1914 1915 // This header is part of a module. Associate it with the module to enable 1916 // implicit module import. 1917 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID); 1918 Module *Mod = Reader.getSubmodule(GlobalSMID); 1919 FileManager &FileMgr = Reader.getFileManager(); 1920 ModuleMap &ModMap = 1921 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap(); 1922 1923 std::string Filename = std::string(key.Filename); 1924 if (key.Imported) 1925 Reader.ResolveImportedPath(M, Filename); 1926 // FIXME: NameAsWritten 1927 Module::Header H = {std::string(key.Filename), "", 1928 *FileMgr.getFile(Filename)}; 1929 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true); 1930 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader); 1931 } 1932 1933 // This HeaderFileInfo was externally loaded. 1934 HFI.External = true; 1935 HFI.IsValid = true; 1936 return HFI; 1937 } 1938 1939 void ASTReader::addPendingMacro(IdentifierInfo *II, ModuleFile *M, 1940 uint32_t MacroDirectivesOffset) { 1941 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"); 1942 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset)); 1943 } 1944 1945 void ASTReader::ReadDefinedMacros() { 1946 // Note that we are loading defined macros. 1947 Deserializing Macros(this); 1948 1949 for (ModuleFile &I : llvm::reverse(ModuleMgr)) { 1950 BitstreamCursor &MacroCursor = I.MacroCursor; 1951 1952 // If there was no preprocessor block, skip this file. 1953 if (MacroCursor.getBitcodeBytes().empty()) 1954 continue; 1955 1956 BitstreamCursor Cursor = MacroCursor; 1957 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) { 1958 Error(std::move(Err)); 1959 return; 1960 } 1961 1962 RecordData Record; 1963 while (true) { 1964 Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks(); 1965 if (!MaybeE) { 1966 Error(MaybeE.takeError()); 1967 return; 1968 } 1969 llvm::BitstreamEntry E = MaybeE.get(); 1970 1971 switch (E.Kind) { 1972 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1973 case llvm::BitstreamEntry::Error: 1974 Error("malformed block record in AST file"); 1975 return; 1976 case llvm::BitstreamEntry::EndBlock: 1977 goto NextCursor; 1978 1979 case llvm::BitstreamEntry::Record: { 1980 Record.clear(); 1981 Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record); 1982 if (!MaybeRecord) { 1983 Error(MaybeRecord.takeError()); 1984 return; 1985 } 1986 switch (MaybeRecord.get()) { 1987 default: // Default behavior: ignore. 1988 break; 1989 1990 case PP_MACRO_OBJECT_LIKE: 1991 case PP_MACRO_FUNCTION_LIKE: { 1992 IdentifierInfo *II = getLocalIdentifier(I, Record[0]); 1993 if (II->isOutOfDate()) 1994 updateOutOfDateIdentifier(*II); 1995 break; 1996 } 1997 1998 case PP_TOKEN: 1999 // Ignore tokens. 2000 break; 2001 } 2002 break; 2003 } 2004 } 2005 } 2006 NextCursor: ; 2007 } 2008 } 2009 2010 namespace { 2011 2012 /// Visitor class used to look up identifirs in an AST file. 2013 class IdentifierLookupVisitor { 2014 StringRef Name; 2015 unsigned NameHash; 2016 unsigned PriorGeneration; 2017 unsigned &NumIdentifierLookups; 2018 unsigned &NumIdentifierLookupHits; 2019 IdentifierInfo *Found = nullptr; 2020 2021 public: 2022 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration, 2023 unsigned &NumIdentifierLookups, 2024 unsigned &NumIdentifierLookupHits) 2025 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)), 2026 PriorGeneration(PriorGeneration), 2027 NumIdentifierLookups(NumIdentifierLookups), 2028 NumIdentifierLookupHits(NumIdentifierLookupHits) {} 2029 2030 bool operator()(ModuleFile &M) { 2031 // If we've already searched this module file, skip it now. 2032 if (M.Generation <= PriorGeneration) 2033 return true; 2034 2035 ASTIdentifierLookupTable *IdTable 2036 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable; 2037 if (!IdTable) 2038 return false; 2039 2040 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M, 2041 Found); 2042 ++NumIdentifierLookups; 2043 ASTIdentifierLookupTable::iterator Pos = 2044 IdTable->find_hashed(Name, NameHash, &Trait); 2045 if (Pos == IdTable->end()) 2046 return false; 2047 2048 // Dereferencing the iterator has the effect of building the 2049 // IdentifierInfo node and populating it with the various 2050 // declarations it needs. 2051 ++NumIdentifierLookupHits; 2052 Found = *Pos; 2053 return true; 2054 } 2055 2056 // Retrieve the identifier info found within the module 2057 // files. 2058 IdentifierInfo *getIdentifierInfo() const { return Found; } 2059 }; 2060 2061 } // namespace 2062 2063 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) { 2064 // Note that we are loading an identifier. 2065 Deserializing AnIdentifier(this); 2066 2067 unsigned PriorGeneration = 0; 2068 if (getContext().getLangOpts().Modules) 2069 PriorGeneration = IdentifierGeneration[&II]; 2070 2071 // If there is a global index, look there first to determine which modules 2072 // provably do not have any results for this identifier. 2073 GlobalModuleIndex::HitSet Hits; 2074 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 2075 if (!loadGlobalIndex()) { 2076 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) { 2077 HitsPtr = &Hits; 2078 } 2079 } 2080 2081 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration, 2082 NumIdentifierLookups, 2083 NumIdentifierLookupHits); 2084 ModuleMgr.visit(Visitor, HitsPtr); 2085 markIdentifierUpToDate(&II); 2086 } 2087 2088 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) { 2089 if (!II) 2090 return; 2091 2092 II->setOutOfDate(false); 2093 2094 // Update the generation for this identifier. 2095 if (getContext().getLangOpts().Modules) 2096 IdentifierGeneration[II] = getGeneration(); 2097 } 2098 2099 void ASTReader::resolvePendingMacro(IdentifierInfo *II, 2100 const PendingMacroInfo &PMInfo) { 2101 ModuleFile &M = *PMInfo.M; 2102 2103 BitstreamCursor &Cursor = M.MacroCursor; 2104 SavedStreamPosition SavedPosition(Cursor); 2105 if (llvm::Error Err = 2106 Cursor.JumpToBit(M.MacroOffsetsBase + PMInfo.MacroDirectivesOffset)) { 2107 Error(std::move(Err)); 2108 return; 2109 } 2110 2111 struct ModuleMacroRecord { 2112 SubmoduleID SubModID; 2113 MacroInfo *MI; 2114 SmallVector<SubmoduleID, 8> Overrides; 2115 }; 2116 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros; 2117 2118 // We expect to see a sequence of PP_MODULE_MACRO records listing exported 2119 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete 2120 // macro histroy. 2121 RecordData Record; 2122 while (true) { 2123 Expected<llvm::BitstreamEntry> MaybeEntry = 2124 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 2125 if (!MaybeEntry) { 2126 Error(MaybeEntry.takeError()); 2127 return; 2128 } 2129 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2130 2131 if (Entry.Kind != llvm::BitstreamEntry::Record) { 2132 Error("malformed block record in AST file"); 2133 return; 2134 } 2135 2136 Record.clear(); 2137 Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record); 2138 if (!MaybePP) { 2139 Error(MaybePP.takeError()); 2140 return; 2141 } 2142 switch ((PreprocessorRecordTypes)MaybePP.get()) { 2143 case PP_MACRO_DIRECTIVE_HISTORY: 2144 break; 2145 2146 case PP_MODULE_MACRO: { 2147 ModuleMacros.push_back(ModuleMacroRecord()); 2148 auto &Info = ModuleMacros.back(); 2149 Info.SubModID = getGlobalSubmoduleID(M, Record[0]); 2150 Info.MI = getMacro(getGlobalMacroID(M, Record[1])); 2151 for (int I = 2, N = Record.size(); I != N; ++I) 2152 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I])); 2153 continue; 2154 } 2155 2156 default: 2157 Error("malformed block record in AST file"); 2158 return; 2159 } 2160 2161 // We found the macro directive history; that's the last record 2162 // for this macro. 2163 break; 2164 } 2165 2166 // Module macros are listed in reverse dependency order. 2167 { 2168 std::reverse(ModuleMacros.begin(), ModuleMacros.end()); 2169 llvm::SmallVector<ModuleMacro*, 8> Overrides; 2170 for (auto &MMR : ModuleMacros) { 2171 Overrides.clear(); 2172 for (unsigned ModID : MMR.Overrides) { 2173 Module *Mod = getSubmodule(ModID); 2174 auto *Macro = PP.getModuleMacro(Mod, II); 2175 assert(Macro && "missing definition for overridden macro"); 2176 Overrides.push_back(Macro); 2177 } 2178 2179 bool Inserted = false; 2180 Module *Owner = getSubmodule(MMR.SubModID); 2181 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted); 2182 } 2183 } 2184 2185 // Don't read the directive history for a module; we don't have anywhere 2186 // to put it. 2187 if (M.isModule()) 2188 return; 2189 2190 // Deserialize the macro directives history in reverse source-order. 2191 MacroDirective *Latest = nullptr, *Earliest = nullptr; 2192 unsigned Idx = 0, N = Record.size(); 2193 while (Idx < N) { 2194 MacroDirective *MD = nullptr; 2195 SourceLocation Loc = ReadSourceLocation(M, Record, Idx); 2196 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++]; 2197 switch (K) { 2198 case MacroDirective::MD_Define: { 2199 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++])); 2200 MD = PP.AllocateDefMacroDirective(MI, Loc); 2201 break; 2202 } 2203 case MacroDirective::MD_Undefine: 2204 MD = PP.AllocateUndefMacroDirective(Loc); 2205 break; 2206 case MacroDirective::MD_Visibility: 2207 bool isPublic = Record[Idx++]; 2208 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic); 2209 break; 2210 } 2211 2212 if (!Latest) 2213 Latest = MD; 2214 if (Earliest) 2215 Earliest->setPrevious(MD); 2216 Earliest = MD; 2217 } 2218 2219 if (Latest) 2220 PP.setLoadedMacroDirective(II, Earliest, Latest); 2221 } 2222 2223 bool ASTReader::shouldDisableValidationForFile( 2224 const serialization::ModuleFile &M) const { 2225 if (DisableValidationKind == DisableValidationForModuleKind::None) 2226 return false; 2227 2228 // If a PCH is loaded and validation is disabled for PCH then disable 2229 // validation for the PCH and the modules it loads. 2230 ModuleKind K = CurrentDeserializingModuleKind.getValueOr(M.Kind); 2231 2232 switch (K) { 2233 case MK_MainFile: 2234 case MK_Preamble: 2235 case MK_PCH: 2236 return bool(DisableValidationKind & DisableValidationForModuleKind::PCH); 2237 case MK_ImplicitModule: 2238 case MK_ExplicitModule: 2239 case MK_PrebuiltModule: 2240 return bool(DisableValidationKind & DisableValidationForModuleKind::Module); 2241 } 2242 2243 return false; 2244 } 2245 2246 ASTReader::InputFileInfo 2247 ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) { 2248 // Go find this input file. 2249 BitstreamCursor &Cursor = F.InputFilesCursor; 2250 SavedStreamPosition SavedPosition(Cursor); 2251 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2252 // FIXME this drops errors on the floor. 2253 consumeError(std::move(Err)); 2254 } 2255 2256 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 2257 if (!MaybeCode) { 2258 // FIXME this drops errors on the floor. 2259 consumeError(MaybeCode.takeError()); 2260 } 2261 unsigned Code = MaybeCode.get(); 2262 RecordData Record; 2263 StringRef Blob; 2264 2265 if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob)) 2266 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE && 2267 "invalid record type for input file"); 2268 else { 2269 // FIXME this drops errors on the floor. 2270 consumeError(Maybe.takeError()); 2271 } 2272 2273 assert(Record[0] == ID && "Bogus stored ID or offset"); 2274 InputFileInfo R; 2275 R.StoredSize = static_cast<off_t>(Record[1]); 2276 R.StoredTime = static_cast<time_t>(Record[2]); 2277 R.Overridden = static_cast<bool>(Record[3]); 2278 R.Transient = static_cast<bool>(Record[4]); 2279 R.TopLevelModuleMap = static_cast<bool>(Record[5]); 2280 R.Filename = std::string(Blob); 2281 ResolveImportedPath(F, R.Filename); 2282 2283 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 2284 if (!MaybeEntry) // FIXME this drops errors on the floor. 2285 consumeError(MaybeEntry.takeError()); 2286 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2287 assert(Entry.Kind == llvm::BitstreamEntry::Record && 2288 "expected record type for input file hash"); 2289 2290 Record.clear(); 2291 if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record)) 2292 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH && 2293 "invalid record type for input file hash"); 2294 else { 2295 // FIXME this drops errors on the floor. 2296 consumeError(Maybe.takeError()); 2297 } 2298 R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) | 2299 static_cast<uint64_t>(Record[0]); 2300 return R; 2301 } 2302 2303 static unsigned moduleKindForDiagnostic(ModuleKind Kind); 2304 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { 2305 // If this ID is bogus, just return an empty input file. 2306 if (ID == 0 || ID > F.InputFilesLoaded.size()) 2307 return InputFile(); 2308 2309 // If we've already loaded this input file, return it. 2310 if (F.InputFilesLoaded[ID-1].getFile()) 2311 return F.InputFilesLoaded[ID-1]; 2312 2313 if (F.InputFilesLoaded[ID-1].isNotFound()) 2314 return InputFile(); 2315 2316 // Go find this input file. 2317 BitstreamCursor &Cursor = F.InputFilesCursor; 2318 SavedStreamPosition SavedPosition(Cursor); 2319 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2320 // FIXME this drops errors on the floor. 2321 consumeError(std::move(Err)); 2322 } 2323 2324 InputFileInfo FI = readInputFileInfo(F, ID); 2325 off_t StoredSize = FI.StoredSize; 2326 time_t StoredTime = FI.StoredTime; 2327 bool Overridden = FI.Overridden; 2328 bool Transient = FI.Transient; 2329 StringRef Filename = FI.Filename; 2330 uint64_t StoredContentHash = FI.ContentHash; 2331 2332 OptionalFileEntryRefDegradesToFileEntryPtr File = 2333 expectedToOptional(FileMgr.getFileRef(Filename, /*OpenFile=*/false)); 2334 2335 // If we didn't find the file, resolve it relative to the 2336 // original directory from which this AST file was created. 2337 if (!File && !F.OriginalDir.empty() && !F.BaseDirectory.empty() && 2338 F.OriginalDir != F.BaseDirectory) { 2339 std::string Resolved = resolveFileRelativeToOriginalDir( 2340 std::string(Filename), F.OriginalDir, F.BaseDirectory); 2341 if (!Resolved.empty()) 2342 File = expectedToOptional(FileMgr.getFileRef(Resolved)); 2343 } 2344 2345 // For an overridden file, create a virtual file with the stored 2346 // size/timestamp. 2347 if ((Overridden || Transient) && !File) 2348 File = FileMgr.getVirtualFileRef(Filename, StoredSize, StoredTime); 2349 2350 if (!File) { 2351 if (Complain) { 2352 std::string ErrorStr = "could not find file '"; 2353 ErrorStr += Filename; 2354 ErrorStr += "' referenced by AST file '"; 2355 ErrorStr += F.FileName; 2356 ErrorStr += "'"; 2357 Error(ErrorStr); 2358 } 2359 // Record that we didn't find the file. 2360 F.InputFilesLoaded[ID-1] = InputFile::getNotFound(); 2361 return InputFile(); 2362 } 2363 2364 // Check if there was a request to override the contents of the file 2365 // that was part of the precompiled header. Overriding such a file 2366 // can lead to problems when lexing using the source locations from the 2367 // PCH. 2368 SourceManager &SM = getSourceManager(); 2369 // FIXME: Reject if the overrides are different. 2370 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) { 2371 if (Complain) 2372 Error(diag::err_fe_pch_file_overridden, Filename); 2373 2374 // After emitting the diagnostic, bypass the overriding file to recover 2375 // (this creates a separate FileEntry). 2376 File = SM.bypassFileContentsOverride(*File); 2377 if (!File) { 2378 F.InputFilesLoaded[ID - 1] = InputFile::getNotFound(); 2379 return InputFile(); 2380 } 2381 } 2382 2383 enum ModificationType { 2384 Size, 2385 ModTime, 2386 Content, 2387 None, 2388 }; 2389 auto HasInputFileChanged = [&]() { 2390 if (StoredSize != File->getSize()) 2391 return ModificationType::Size; 2392 if (!shouldDisableValidationForFile(F) && StoredTime && 2393 StoredTime != File->getModificationTime()) { 2394 // In case the modification time changes but not the content, 2395 // accept the cached file as legit. 2396 if (ValidateASTInputFilesContent && 2397 StoredContentHash != static_cast<uint64_t>(llvm::hash_code(-1))) { 2398 auto MemBuffOrError = FileMgr.getBufferForFile(File); 2399 if (!MemBuffOrError) { 2400 if (!Complain) 2401 return ModificationType::ModTime; 2402 std::string ErrorStr = "could not get buffer for file '"; 2403 ErrorStr += File->getName(); 2404 ErrorStr += "'"; 2405 Error(ErrorStr); 2406 return ModificationType::ModTime; 2407 } 2408 2409 auto ContentHash = hash_value(MemBuffOrError.get()->getBuffer()); 2410 if (StoredContentHash == static_cast<uint64_t>(ContentHash)) 2411 return ModificationType::None; 2412 return ModificationType::Content; 2413 } 2414 return ModificationType::ModTime; 2415 } 2416 return ModificationType::None; 2417 }; 2418 2419 bool IsOutOfDate = false; 2420 auto FileChange = HasInputFileChanged(); 2421 // For an overridden file, there is nothing to validate. 2422 if (!Overridden && FileChange != ModificationType::None) { 2423 if (Complain && !Diags.isDiagnosticInFlight()) { 2424 // Build a list of the PCH imports that got us here (in reverse). 2425 SmallVector<ModuleFile *, 4> ImportStack(1, &F); 2426 while (!ImportStack.back()->ImportedBy.empty()) 2427 ImportStack.push_back(ImportStack.back()->ImportedBy[0]); 2428 2429 // The top-level PCH is stale. 2430 StringRef TopLevelPCHName(ImportStack.back()->FileName); 2431 Diag(diag::err_fe_ast_file_modified) 2432 << Filename << moduleKindForDiagnostic(ImportStack.back()->Kind) 2433 << TopLevelPCHName << FileChange; 2434 2435 // Print the import stack. 2436 if (ImportStack.size() > 1) { 2437 Diag(diag::note_pch_required_by) 2438 << Filename << ImportStack[0]->FileName; 2439 for (unsigned I = 1; I < ImportStack.size(); ++I) 2440 Diag(diag::note_pch_required_by) 2441 << ImportStack[I-1]->FileName << ImportStack[I]->FileName; 2442 } 2443 2444 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName; 2445 } 2446 2447 IsOutOfDate = true; 2448 } 2449 // FIXME: If the file is overridden and we've already opened it, 2450 // issue an error (or split it into a separate FileEntry). 2451 2452 InputFile IF = InputFile(*File, Overridden || Transient, IsOutOfDate); 2453 2454 // Note that we've loaded this input file. 2455 F.InputFilesLoaded[ID-1] = IF; 2456 return IF; 2457 } 2458 2459 /// If we are loading a relocatable PCH or module file, and the filename 2460 /// is not an absolute path, add the system or module root to the beginning of 2461 /// the file name. 2462 void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) { 2463 // Resolve relative to the base directory, if we have one. 2464 if (!M.BaseDirectory.empty()) 2465 return ResolveImportedPath(Filename, M.BaseDirectory); 2466 } 2467 2468 void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) { 2469 if (Filename.empty() || llvm::sys::path::is_absolute(Filename)) 2470 return; 2471 2472 SmallString<128> Buffer; 2473 llvm::sys::path::append(Buffer, Prefix, Filename); 2474 Filename.assign(Buffer.begin(), Buffer.end()); 2475 } 2476 2477 static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) { 2478 switch (ARR) { 2479 case ASTReader::Failure: return true; 2480 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing); 2481 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate); 2482 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch); 2483 case ASTReader::ConfigurationMismatch: 2484 return !(Caps & ASTReader::ARR_ConfigurationMismatch); 2485 case ASTReader::HadErrors: return true; 2486 case ASTReader::Success: return false; 2487 } 2488 2489 llvm_unreachable("unknown ASTReadResult"); 2490 } 2491 2492 ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( 2493 BitstreamCursor &Stream, unsigned ClientLoadCapabilities, 2494 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener, 2495 std::string &SuggestedPredefines) { 2496 if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) { 2497 // FIXME this drops errors on the floor. 2498 consumeError(std::move(Err)); 2499 return Failure; 2500 } 2501 2502 // Read all of the records in the options block. 2503 RecordData Record; 2504 ASTReadResult Result = Success; 2505 while (true) { 2506 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2507 if (!MaybeEntry) { 2508 // FIXME this drops errors on the floor. 2509 consumeError(MaybeEntry.takeError()); 2510 return Failure; 2511 } 2512 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2513 2514 switch (Entry.Kind) { 2515 case llvm::BitstreamEntry::Error: 2516 case llvm::BitstreamEntry::SubBlock: 2517 return Failure; 2518 2519 case llvm::BitstreamEntry::EndBlock: 2520 return Result; 2521 2522 case llvm::BitstreamEntry::Record: 2523 // The interesting case. 2524 break; 2525 } 2526 2527 // Read and process a record. 2528 Record.clear(); 2529 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 2530 if (!MaybeRecordType) { 2531 // FIXME this drops errors on the floor. 2532 consumeError(MaybeRecordType.takeError()); 2533 return Failure; 2534 } 2535 switch ((OptionsRecordTypes)MaybeRecordType.get()) { 2536 case LANGUAGE_OPTIONS: { 2537 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2538 if (ParseLanguageOptions(Record, Complain, Listener, 2539 AllowCompatibleConfigurationMismatch)) 2540 Result = ConfigurationMismatch; 2541 break; 2542 } 2543 2544 case TARGET_OPTIONS: { 2545 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2546 if (ParseTargetOptions(Record, Complain, Listener, 2547 AllowCompatibleConfigurationMismatch)) 2548 Result = ConfigurationMismatch; 2549 break; 2550 } 2551 2552 case FILE_SYSTEM_OPTIONS: { 2553 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2554 if (!AllowCompatibleConfigurationMismatch && 2555 ParseFileSystemOptions(Record, Complain, Listener)) 2556 Result = ConfigurationMismatch; 2557 break; 2558 } 2559 2560 case HEADER_SEARCH_OPTIONS: { 2561 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2562 if (!AllowCompatibleConfigurationMismatch && 2563 ParseHeaderSearchOptions(Record, Complain, Listener)) 2564 Result = ConfigurationMismatch; 2565 break; 2566 } 2567 2568 case PREPROCESSOR_OPTIONS: 2569 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2570 if (!AllowCompatibleConfigurationMismatch && 2571 ParsePreprocessorOptions(Record, Complain, Listener, 2572 SuggestedPredefines)) 2573 Result = ConfigurationMismatch; 2574 break; 2575 } 2576 } 2577 } 2578 2579 ASTReader::ASTReadResult 2580 ASTReader::ReadControlBlock(ModuleFile &F, 2581 SmallVectorImpl<ImportedModule> &Loaded, 2582 const ModuleFile *ImportedBy, 2583 unsigned ClientLoadCapabilities) { 2584 BitstreamCursor &Stream = F.Stream; 2585 2586 if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) { 2587 Error(std::move(Err)); 2588 return Failure; 2589 } 2590 2591 // Lambda to read the unhashed control block the first time it's called. 2592 // 2593 // For PCM files, the unhashed control block cannot be read until after the 2594 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still 2595 // need to look ahead before reading the IMPORTS record. For consistency, 2596 // this block is always read somehow (see BitstreamEntry::EndBlock). 2597 bool HasReadUnhashedControlBlock = false; 2598 auto readUnhashedControlBlockOnce = [&]() { 2599 if (!HasReadUnhashedControlBlock) { 2600 HasReadUnhashedControlBlock = true; 2601 if (ASTReadResult Result = 2602 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities)) 2603 return Result; 2604 } 2605 return Success; 2606 }; 2607 2608 bool DisableValidation = shouldDisableValidationForFile(F); 2609 2610 // Read all of the records and blocks in the control block. 2611 RecordData Record; 2612 unsigned NumInputs = 0; 2613 unsigned NumUserInputs = 0; 2614 StringRef BaseDirectoryAsWritten; 2615 while (true) { 2616 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2617 if (!MaybeEntry) { 2618 Error(MaybeEntry.takeError()); 2619 return Failure; 2620 } 2621 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2622 2623 switch (Entry.Kind) { 2624 case llvm::BitstreamEntry::Error: 2625 Error("malformed block record in AST file"); 2626 return Failure; 2627 case llvm::BitstreamEntry::EndBlock: { 2628 // Validate the module before returning. This call catches an AST with 2629 // no module name and no imports. 2630 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2631 return Result; 2632 2633 // Validate input files. 2634 const HeaderSearchOptions &HSOpts = 2635 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 2636 2637 // All user input files reside at the index range [0, NumUserInputs), and 2638 // system input files reside at [NumUserInputs, NumInputs). For explicitly 2639 // loaded module files, ignore missing inputs. 2640 if (!DisableValidation && F.Kind != MK_ExplicitModule && 2641 F.Kind != MK_PrebuiltModule) { 2642 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 2643 2644 // If we are reading a module, we will create a verification timestamp, 2645 // so we verify all input files. Otherwise, verify only user input 2646 // files. 2647 2648 unsigned N = NumUserInputs; 2649 if (ValidateSystemInputs || 2650 (HSOpts.ModulesValidateOncePerBuildSession && 2651 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp && 2652 F.Kind == MK_ImplicitModule)) 2653 N = NumInputs; 2654 2655 for (unsigned I = 0; I < N; ++I) { 2656 InputFile IF = getInputFile(F, I+1, Complain); 2657 if (!IF.getFile() || IF.isOutOfDate()) 2658 return OutOfDate; 2659 } 2660 } 2661 2662 if (Listener) 2663 Listener->visitModuleFile(F.FileName, F.Kind); 2664 2665 if (Listener && Listener->needsInputFileVisitation()) { 2666 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs 2667 : NumUserInputs; 2668 for (unsigned I = 0; I < N; ++I) { 2669 bool IsSystem = I >= NumUserInputs; 2670 InputFileInfo FI = readInputFileInfo(F, I+1); 2671 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden, 2672 F.Kind == MK_ExplicitModule || 2673 F.Kind == MK_PrebuiltModule); 2674 } 2675 } 2676 2677 return Success; 2678 } 2679 2680 case llvm::BitstreamEntry::SubBlock: 2681 switch (Entry.ID) { 2682 case INPUT_FILES_BLOCK_ID: 2683 F.InputFilesCursor = Stream; 2684 if (llvm::Error Err = Stream.SkipBlock()) { 2685 Error(std::move(Err)); 2686 return Failure; 2687 } 2688 if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) { 2689 Error("malformed block record in AST file"); 2690 return Failure; 2691 } 2692 continue; 2693 2694 case OPTIONS_BLOCK_ID: 2695 // If we're reading the first module for this group, check its options 2696 // are compatible with ours. For modules it imports, no further checking 2697 // is required, because we checked them when we built it. 2698 if (Listener && !ImportedBy) { 2699 // Should we allow the configuration of the module file to differ from 2700 // the configuration of the current translation unit in a compatible 2701 // way? 2702 // 2703 // FIXME: Allow this for files explicitly specified with -include-pch. 2704 bool AllowCompatibleConfigurationMismatch = 2705 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 2706 2707 ASTReadResult Result = 2708 ReadOptionsBlock(Stream, ClientLoadCapabilities, 2709 AllowCompatibleConfigurationMismatch, *Listener, 2710 SuggestedPredefines); 2711 if (Result == Failure) { 2712 Error("malformed block record in AST file"); 2713 return Result; 2714 } 2715 2716 if (DisableValidation || 2717 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 2718 Result = Success; 2719 2720 // If we can't load the module, exit early since we likely 2721 // will rebuild the module anyway. The stream may be in the 2722 // middle of a block. 2723 if (Result != Success) 2724 return Result; 2725 } else if (llvm::Error Err = Stream.SkipBlock()) { 2726 Error(std::move(Err)); 2727 return Failure; 2728 } 2729 continue; 2730 2731 default: 2732 if (llvm::Error Err = Stream.SkipBlock()) { 2733 Error(std::move(Err)); 2734 return Failure; 2735 } 2736 continue; 2737 } 2738 2739 case llvm::BitstreamEntry::Record: 2740 // The interesting case. 2741 break; 2742 } 2743 2744 // Read and process a record. 2745 Record.clear(); 2746 StringRef Blob; 2747 Expected<unsigned> MaybeRecordType = 2748 Stream.readRecord(Entry.ID, Record, &Blob); 2749 if (!MaybeRecordType) { 2750 Error(MaybeRecordType.takeError()); 2751 return Failure; 2752 } 2753 switch ((ControlRecordTypes)MaybeRecordType.get()) { 2754 case METADATA: { 2755 if (Record[0] != VERSION_MAJOR && !DisableValidation) { 2756 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2757 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old 2758 : diag::err_pch_version_too_new); 2759 return VersionMismatch; 2760 } 2761 2762 bool hasErrors = Record[6]; 2763 if (hasErrors && !DisableValidation) { 2764 // If requested by the caller and the module hasn't already been read 2765 // or compiled, mark modules on error as out-of-date. 2766 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) && 2767 canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 2768 return OutOfDate; 2769 2770 if (!AllowASTWithCompilerErrors) { 2771 Diag(diag::err_pch_with_compiler_errors); 2772 return HadErrors; 2773 } 2774 } 2775 if (hasErrors) { 2776 Diags.ErrorOccurred = true; 2777 Diags.UncompilableErrorOccurred = true; 2778 Diags.UnrecoverableErrorOccurred = true; 2779 } 2780 2781 F.RelocatablePCH = Record[4]; 2782 // Relative paths in a relocatable PCH are relative to our sysroot. 2783 if (F.RelocatablePCH) 2784 F.BaseDirectory = isysroot.empty() ? "/" : isysroot; 2785 2786 F.HasTimestamps = Record[5]; 2787 2788 const std::string &CurBranch = getClangFullRepositoryVersion(); 2789 StringRef ASTBranch = Blob; 2790 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) { 2791 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2792 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch; 2793 return VersionMismatch; 2794 } 2795 break; 2796 } 2797 2798 case IMPORTS: { 2799 // Validate the AST before processing any imports (otherwise, untangling 2800 // them can be error-prone and expensive). A module will have a name and 2801 // will already have been validated, but this catches the PCH case. 2802 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2803 return Result; 2804 2805 // Load each of the imported PCH files. 2806 unsigned Idx = 0, N = Record.size(); 2807 while (Idx < N) { 2808 // Read information about the AST file. 2809 ModuleKind ImportedKind = (ModuleKind)Record[Idx++]; 2810 // The import location will be the local one for now; we will adjust 2811 // all import locations of module imports after the global source 2812 // location info are setup, in ReadAST. 2813 SourceLocation ImportLoc = 2814 ReadUntranslatedSourceLocation(Record[Idx++]); 2815 off_t StoredSize = (off_t)Record[Idx++]; 2816 time_t StoredModTime = (time_t)Record[Idx++]; 2817 auto FirstSignatureByte = Record.begin() + Idx; 2818 ASTFileSignature StoredSignature = ASTFileSignature::create( 2819 FirstSignatureByte, FirstSignatureByte + ASTFileSignature::size); 2820 Idx += ASTFileSignature::size; 2821 2822 std::string ImportedName = ReadString(Record, Idx); 2823 std::string ImportedFile; 2824 2825 // For prebuilt and explicit modules first consult the file map for 2826 // an override. Note that here we don't search prebuilt module 2827 // directories, only the explicit name to file mappings. Also, we will 2828 // still verify the size/signature making sure it is essentially the 2829 // same file but perhaps in a different location. 2830 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule) 2831 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName( 2832 ImportedName, /*FileMapOnly*/ true); 2833 2834 if (ImportedFile.empty()) 2835 // Use BaseDirectoryAsWritten to ensure we use the same path in the 2836 // ModuleCache as when writing. 2837 ImportedFile = ReadPath(BaseDirectoryAsWritten, Record, Idx); 2838 else 2839 SkipPath(Record, Idx); 2840 2841 // If our client can't cope with us being out of date, we can't cope with 2842 // our dependency being missing. 2843 unsigned Capabilities = ClientLoadCapabilities; 2844 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2845 Capabilities &= ~ARR_Missing; 2846 2847 // Load the AST file. 2848 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, 2849 Loaded, StoredSize, StoredModTime, 2850 StoredSignature, Capabilities); 2851 2852 // If we diagnosed a problem, produce a backtrace. 2853 bool recompilingFinalized = 2854 Result == OutOfDate && (Capabilities & ARR_OutOfDate) && 2855 getModuleManager().getModuleCache().isPCMFinal(F.FileName); 2856 if (isDiagnosedResult(Result, Capabilities) || recompilingFinalized) 2857 Diag(diag::note_module_file_imported_by) 2858 << F.FileName << !F.ModuleName.empty() << F.ModuleName; 2859 if (recompilingFinalized) 2860 Diag(diag::note_module_file_conflict); 2861 2862 switch (Result) { 2863 case Failure: return Failure; 2864 // If we have to ignore the dependency, we'll have to ignore this too. 2865 case Missing: 2866 case OutOfDate: return OutOfDate; 2867 case VersionMismatch: return VersionMismatch; 2868 case ConfigurationMismatch: return ConfigurationMismatch; 2869 case HadErrors: return HadErrors; 2870 case Success: break; 2871 } 2872 } 2873 break; 2874 } 2875 2876 case ORIGINAL_FILE: 2877 F.OriginalSourceFileID = FileID::get(Record[0]); 2878 F.ActualOriginalSourceFileName = std::string(Blob); 2879 F.OriginalSourceFileName = F.ActualOriginalSourceFileName; 2880 ResolveImportedPath(F, F.OriginalSourceFileName); 2881 break; 2882 2883 case ORIGINAL_FILE_ID: 2884 F.OriginalSourceFileID = FileID::get(Record[0]); 2885 break; 2886 2887 case ORIGINAL_PCH_DIR: 2888 F.OriginalDir = std::string(Blob); 2889 break; 2890 2891 case MODULE_NAME: 2892 F.ModuleName = std::string(Blob); 2893 Diag(diag::remark_module_import) 2894 << F.ModuleName << F.FileName << (ImportedBy ? true : false) 2895 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 2896 if (Listener) 2897 Listener->ReadModuleName(F.ModuleName); 2898 2899 // Validate the AST as soon as we have a name so we can exit early on 2900 // failure. 2901 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2902 return Result; 2903 2904 break; 2905 2906 case MODULE_DIRECTORY: { 2907 // Save the BaseDirectory as written in the PCM for computing the module 2908 // filename for the ModuleCache. 2909 BaseDirectoryAsWritten = Blob; 2910 assert(!F.ModuleName.empty() && 2911 "MODULE_DIRECTORY found before MODULE_NAME"); 2912 // If we've already loaded a module map file covering this module, we may 2913 // have a better path for it (relative to the current build). 2914 Module *M = PP.getHeaderSearchInfo().lookupModule( 2915 F.ModuleName, /*AllowSearch*/ true, 2916 /*AllowExtraModuleMapSearch*/ true); 2917 if (M && M->Directory) { 2918 // If we're implicitly loading a module, the base directory can't 2919 // change between the build and use. 2920 // Don't emit module relocation error if we have -fno-validate-pch 2921 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 2922 DisableValidationForModuleKind::Module) && 2923 F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) { 2924 auto BuildDir = PP.getFileManager().getDirectory(Blob); 2925 if (!BuildDir || *BuildDir != M->Directory) { 2926 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 2927 Diag(diag::err_imported_module_relocated) 2928 << F.ModuleName << Blob << M->Directory->getName(); 2929 return OutOfDate; 2930 } 2931 } 2932 F.BaseDirectory = std::string(M->Directory->getName()); 2933 } else { 2934 F.BaseDirectory = std::string(Blob); 2935 } 2936 break; 2937 } 2938 2939 case MODULE_MAP_FILE: 2940 if (ASTReadResult Result = 2941 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities)) 2942 return Result; 2943 break; 2944 2945 case INPUT_FILE_OFFSETS: 2946 NumInputs = Record[0]; 2947 NumUserInputs = Record[1]; 2948 F.InputFileOffsets = 2949 (const llvm::support::unaligned_uint64_t *)Blob.data(); 2950 F.InputFilesLoaded.resize(NumInputs); 2951 F.NumUserInputFiles = NumUserInputs; 2952 break; 2953 } 2954 } 2955 } 2956 2957 ASTReader::ASTReadResult 2958 ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 2959 BitstreamCursor &Stream = F.Stream; 2960 2961 if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID)) { 2962 Error(std::move(Err)); 2963 return Failure; 2964 } 2965 F.ASTBlockStartOffset = Stream.GetCurrentBitNo(); 2966 2967 // Read all of the records and blocks for the AST file. 2968 RecordData Record; 2969 while (true) { 2970 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2971 if (!MaybeEntry) { 2972 Error(MaybeEntry.takeError()); 2973 return Failure; 2974 } 2975 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2976 2977 switch (Entry.Kind) { 2978 case llvm::BitstreamEntry::Error: 2979 Error("error at end of module block in AST file"); 2980 return Failure; 2981 case llvm::BitstreamEntry::EndBlock: 2982 // Outside of C++, we do not store a lookup map for the translation unit. 2983 // Instead, mark it as needing a lookup map to be built if this module 2984 // contains any declarations lexically within it (which it always does!). 2985 // This usually has no cost, since we very rarely need the lookup map for 2986 // the translation unit outside C++. 2987 if (ASTContext *Ctx = ContextObj) { 2988 DeclContext *DC = Ctx->getTranslationUnitDecl(); 2989 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus) 2990 DC->setMustBuildLookupTable(); 2991 } 2992 2993 return Success; 2994 case llvm::BitstreamEntry::SubBlock: 2995 switch (Entry.ID) { 2996 case DECLTYPES_BLOCK_ID: 2997 // We lazily load the decls block, but we want to set up the 2998 // DeclsCursor cursor to point into it. Clone our current bitcode 2999 // cursor to it, enter the block and read the abbrevs in that block. 3000 // With the main cursor, we just skip over it. 3001 F.DeclsCursor = Stream; 3002 if (llvm::Error Err = Stream.SkipBlock()) { 3003 Error(std::move(Err)); 3004 return Failure; 3005 } 3006 if (ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID, 3007 &F.DeclsBlockStartOffset)) { 3008 Error("malformed block record in AST file"); 3009 return Failure; 3010 } 3011 break; 3012 3013 case PREPROCESSOR_BLOCK_ID: 3014 F.MacroCursor = Stream; 3015 if (!PP.getExternalSource()) 3016 PP.setExternalSource(this); 3017 3018 if (llvm::Error Err = Stream.SkipBlock()) { 3019 Error(std::move(Err)); 3020 return Failure; 3021 } 3022 if (ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) { 3023 Error("malformed block record in AST file"); 3024 return Failure; 3025 } 3026 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo(); 3027 break; 3028 3029 case PREPROCESSOR_DETAIL_BLOCK_ID: 3030 F.PreprocessorDetailCursor = Stream; 3031 3032 if (llvm::Error Err = Stream.SkipBlock()) { 3033 Error(std::move(Err)); 3034 return Failure; 3035 } 3036 if (ReadBlockAbbrevs(F.PreprocessorDetailCursor, 3037 PREPROCESSOR_DETAIL_BLOCK_ID)) { 3038 Error("malformed preprocessor detail record in AST file"); 3039 return Failure; 3040 } 3041 F.PreprocessorDetailStartOffset 3042 = F.PreprocessorDetailCursor.GetCurrentBitNo(); 3043 3044 if (!PP.getPreprocessingRecord()) 3045 PP.createPreprocessingRecord(); 3046 if (!PP.getPreprocessingRecord()->getExternalSource()) 3047 PP.getPreprocessingRecord()->SetExternalSource(*this); 3048 break; 3049 3050 case SOURCE_MANAGER_BLOCK_ID: 3051 if (ReadSourceManagerBlock(F)) 3052 return Failure; 3053 break; 3054 3055 case SUBMODULE_BLOCK_ID: 3056 if (ASTReadResult Result = 3057 ReadSubmoduleBlock(F, ClientLoadCapabilities)) 3058 return Result; 3059 break; 3060 3061 case COMMENTS_BLOCK_ID: { 3062 BitstreamCursor C = Stream; 3063 3064 if (llvm::Error Err = Stream.SkipBlock()) { 3065 Error(std::move(Err)); 3066 return Failure; 3067 } 3068 if (ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) { 3069 Error("malformed comments block in AST file"); 3070 return Failure; 3071 } 3072 CommentsCursors.push_back(std::make_pair(C, &F)); 3073 break; 3074 } 3075 3076 default: 3077 if (llvm::Error Err = Stream.SkipBlock()) { 3078 Error(std::move(Err)); 3079 return Failure; 3080 } 3081 break; 3082 } 3083 continue; 3084 3085 case llvm::BitstreamEntry::Record: 3086 // The interesting case. 3087 break; 3088 } 3089 3090 // Read and process a record. 3091 Record.clear(); 3092 StringRef Blob; 3093 Expected<unsigned> MaybeRecordType = 3094 Stream.readRecord(Entry.ID, Record, &Blob); 3095 if (!MaybeRecordType) { 3096 Error(MaybeRecordType.takeError()); 3097 return Failure; 3098 } 3099 ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get(); 3100 3101 // If we're not loading an AST context, we don't care about most records. 3102 if (!ContextObj) { 3103 switch (RecordType) { 3104 case IDENTIFIER_TABLE: 3105 case IDENTIFIER_OFFSET: 3106 case INTERESTING_IDENTIFIERS: 3107 case STATISTICS: 3108 case PP_CONDITIONAL_STACK: 3109 case PP_COUNTER_VALUE: 3110 case SOURCE_LOCATION_OFFSETS: 3111 case MODULE_OFFSET_MAP: 3112 case SOURCE_MANAGER_LINE_TABLE: 3113 case SOURCE_LOCATION_PRELOADS: 3114 case PPD_ENTITIES_OFFSETS: 3115 case HEADER_SEARCH_TABLE: 3116 case IMPORTED_MODULES: 3117 case MACRO_OFFSET: 3118 break; 3119 default: 3120 continue; 3121 } 3122 } 3123 3124 switch (RecordType) { 3125 default: // Default behavior: ignore. 3126 break; 3127 3128 case TYPE_OFFSET: { 3129 if (F.LocalNumTypes != 0) { 3130 Error("duplicate TYPE_OFFSET record in AST file"); 3131 return Failure; 3132 } 3133 F.TypeOffsets = reinterpret_cast<const UnderalignedInt64 *>(Blob.data()); 3134 F.LocalNumTypes = Record[0]; 3135 unsigned LocalBaseTypeIndex = Record[1]; 3136 F.BaseTypeIndex = getTotalNumTypes(); 3137 3138 if (F.LocalNumTypes > 0) { 3139 // Introduce the global -> local mapping for types within this module. 3140 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F)); 3141 3142 // Introduce the local -> global mapping for types within this module. 3143 F.TypeRemap.insertOrReplace( 3144 std::make_pair(LocalBaseTypeIndex, 3145 F.BaseTypeIndex - LocalBaseTypeIndex)); 3146 3147 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes); 3148 } 3149 break; 3150 } 3151 3152 case DECL_OFFSET: { 3153 if (F.LocalNumDecls != 0) { 3154 Error("duplicate DECL_OFFSET record in AST file"); 3155 return Failure; 3156 } 3157 F.DeclOffsets = (const DeclOffset *)Blob.data(); 3158 F.LocalNumDecls = Record[0]; 3159 unsigned LocalBaseDeclID = Record[1]; 3160 F.BaseDeclID = getTotalNumDecls(); 3161 3162 if (F.LocalNumDecls > 0) { 3163 // Introduce the global -> local mapping for declarations within this 3164 // module. 3165 GlobalDeclMap.insert( 3166 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F)); 3167 3168 // Introduce the local -> global mapping for declarations within this 3169 // module. 3170 F.DeclRemap.insertOrReplace( 3171 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID)); 3172 3173 // Introduce the global -> local mapping for declarations within this 3174 // module. 3175 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID; 3176 3177 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls); 3178 } 3179 break; 3180 } 3181 3182 case TU_UPDATE_LEXICAL: { 3183 DeclContext *TU = ContextObj->getTranslationUnitDecl(); 3184 LexicalContents Contents( 3185 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 3186 Blob.data()), 3187 static_cast<unsigned int>(Blob.size() / 4)); 3188 TULexicalDecls.push_back(std::make_pair(&F, Contents)); 3189 TU->setHasExternalLexicalStorage(true); 3190 break; 3191 } 3192 3193 case UPDATE_VISIBLE: { 3194 unsigned Idx = 0; 3195 serialization::DeclID ID = ReadDeclID(F, Record, Idx); 3196 auto *Data = (const unsigned char*)Blob.data(); 3197 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data}); 3198 // If we've already loaded the decl, perform the updates when we finish 3199 // loading this block. 3200 if (Decl *D = GetExistingDecl(ID)) 3201 PendingUpdateRecords.push_back( 3202 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3203 break; 3204 } 3205 3206 case IDENTIFIER_TABLE: 3207 F.IdentifierTableData = 3208 reinterpret_cast<const unsigned char *>(Blob.data()); 3209 if (Record[0]) { 3210 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create( 3211 F.IdentifierTableData + Record[0], 3212 F.IdentifierTableData + sizeof(uint32_t), 3213 F.IdentifierTableData, 3214 ASTIdentifierLookupTrait(*this, F)); 3215 3216 PP.getIdentifierTable().setExternalIdentifierLookup(this); 3217 } 3218 break; 3219 3220 case IDENTIFIER_OFFSET: { 3221 if (F.LocalNumIdentifiers != 0) { 3222 Error("duplicate IDENTIFIER_OFFSET record in AST file"); 3223 return Failure; 3224 } 3225 F.IdentifierOffsets = (const uint32_t *)Blob.data(); 3226 F.LocalNumIdentifiers = Record[0]; 3227 unsigned LocalBaseIdentifierID = Record[1]; 3228 F.BaseIdentifierID = getTotalNumIdentifiers(); 3229 3230 if (F.LocalNumIdentifiers > 0) { 3231 // Introduce the global -> local mapping for identifiers within this 3232 // module. 3233 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1, 3234 &F)); 3235 3236 // Introduce the local -> global mapping for identifiers within this 3237 // module. 3238 F.IdentifierRemap.insertOrReplace( 3239 std::make_pair(LocalBaseIdentifierID, 3240 F.BaseIdentifierID - LocalBaseIdentifierID)); 3241 3242 IdentifiersLoaded.resize(IdentifiersLoaded.size() 3243 + F.LocalNumIdentifiers); 3244 } 3245 break; 3246 } 3247 3248 case INTERESTING_IDENTIFIERS: 3249 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end()); 3250 break; 3251 3252 case EAGERLY_DESERIALIZED_DECLS: 3253 // FIXME: Skip reading this record if our ASTConsumer doesn't care 3254 // about "interesting" decls (for instance, if we're building a module). 3255 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3256 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3257 break; 3258 3259 case MODULAR_CODEGEN_DECLS: 3260 // FIXME: Skip reading this record if our ASTConsumer doesn't care about 3261 // them (ie: if we're not codegenerating this module). 3262 if (F.Kind == MK_MainFile || 3263 getContext().getLangOpts().BuildingPCHWithObjectFile) 3264 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3265 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3266 break; 3267 3268 case SPECIAL_TYPES: 3269 if (SpecialTypes.empty()) { 3270 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3271 SpecialTypes.push_back(getGlobalTypeID(F, Record[I])); 3272 break; 3273 } 3274 3275 if (SpecialTypes.size() != Record.size()) { 3276 Error("invalid special-types record"); 3277 return Failure; 3278 } 3279 3280 for (unsigned I = 0, N = Record.size(); I != N; ++I) { 3281 serialization::TypeID ID = getGlobalTypeID(F, Record[I]); 3282 if (!SpecialTypes[I]) 3283 SpecialTypes[I] = ID; 3284 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate 3285 // merge step? 3286 } 3287 break; 3288 3289 case STATISTICS: 3290 TotalNumStatements += Record[0]; 3291 TotalNumMacros += Record[1]; 3292 TotalLexicalDeclContexts += Record[2]; 3293 TotalVisibleDeclContexts += Record[3]; 3294 break; 3295 3296 case UNUSED_FILESCOPED_DECLS: 3297 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3298 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I])); 3299 break; 3300 3301 case DELEGATING_CTORS: 3302 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3303 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I])); 3304 break; 3305 3306 case WEAK_UNDECLARED_IDENTIFIERS: 3307 if (Record.size() % 4 != 0) { 3308 Error("invalid weak identifiers record"); 3309 return Failure; 3310 } 3311 3312 // FIXME: Ignore weak undeclared identifiers from non-original PCH 3313 // files. This isn't the way to do it :) 3314 WeakUndeclaredIdentifiers.clear(); 3315 3316 // Translate the weak, undeclared identifiers into global IDs. 3317 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) { 3318 WeakUndeclaredIdentifiers.push_back( 3319 getGlobalIdentifierID(F, Record[I++])); 3320 WeakUndeclaredIdentifiers.push_back( 3321 getGlobalIdentifierID(F, Record[I++])); 3322 WeakUndeclaredIdentifiers.push_back( 3323 ReadSourceLocation(F, Record, I).getRawEncoding()); 3324 WeakUndeclaredIdentifiers.push_back(Record[I++]); 3325 } 3326 break; 3327 3328 case SELECTOR_OFFSETS: { 3329 F.SelectorOffsets = (const uint32_t *)Blob.data(); 3330 F.LocalNumSelectors = Record[0]; 3331 unsigned LocalBaseSelectorID = Record[1]; 3332 F.BaseSelectorID = getTotalNumSelectors(); 3333 3334 if (F.LocalNumSelectors > 0) { 3335 // Introduce the global -> local mapping for selectors within this 3336 // module. 3337 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F)); 3338 3339 // Introduce the local -> global mapping for selectors within this 3340 // module. 3341 F.SelectorRemap.insertOrReplace( 3342 std::make_pair(LocalBaseSelectorID, 3343 F.BaseSelectorID - LocalBaseSelectorID)); 3344 3345 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors); 3346 } 3347 break; 3348 } 3349 3350 case METHOD_POOL: 3351 F.SelectorLookupTableData = (const unsigned char *)Blob.data(); 3352 if (Record[0]) 3353 F.SelectorLookupTable 3354 = ASTSelectorLookupTable::Create( 3355 F.SelectorLookupTableData + Record[0], 3356 F.SelectorLookupTableData, 3357 ASTSelectorLookupTrait(*this, F)); 3358 TotalNumMethodPoolEntries += Record[1]; 3359 break; 3360 3361 case REFERENCED_SELECTOR_POOL: 3362 if (!Record.empty()) { 3363 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) { 3364 ReferencedSelectorsData.push_back(getGlobalSelectorID(F, 3365 Record[Idx++])); 3366 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx). 3367 getRawEncoding()); 3368 } 3369 } 3370 break; 3371 3372 case PP_CONDITIONAL_STACK: 3373 if (!Record.empty()) { 3374 unsigned Idx = 0, End = Record.size() - 1; 3375 bool ReachedEOFWhileSkipping = Record[Idx++]; 3376 llvm::Optional<Preprocessor::PreambleSkipInfo> SkipInfo; 3377 if (ReachedEOFWhileSkipping) { 3378 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx); 3379 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx); 3380 bool FoundNonSkipPortion = Record[Idx++]; 3381 bool FoundElse = Record[Idx++]; 3382 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx); 3383 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion, 3384 FoundElse, ElseLoc); 3385 } 3386 SmallVector<PPConditionalInfo, 4> ConditionalStack; 3387 while (Idx < End) { 3388 auto Loc = ReadSourceLocation(F, Record, Idx); 3389 bool WasSkipping = Record[Idx++]; 3390 bool FoundNonSkip = Record[Idx++]; 3391 bool FoundElse = Record[Idx++]; 3392 ConditionalStack.push_back( 3393 {Loc, WasSkipping, FoundNonSkip, FoundElse}); 3394 } 3395 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo); 3396 } 3397 break; 3398 3399 case PP_COUNTER_VALUE: 3400 if (!Record.empty() && Listener) 3401 Listener->ReadCounter(F, Record[0]); 3402 break; 3403 3404 case FILE_SORTED_DECLS: 3405 F.FileSortedDecls = (const DeclID *)Blob.data(); 3406 F.NumFileSortedDecls = Record[0]; 3407 break; 3408 3409 case SOURCE_LOCATION_OFFSETS: { 3410 F.SLocEntryOffsets = (const uint32_t *)Blob.data(); 3411 F.LocalNumSLocEntries = Record[0]; 3412 SourceLocation::UIntTy SLocSpaceSize = Record[1]; 3413 F.SLocEntryOffsetsBase = Record[2] + F.SourceManagerBlockStartOffset; 3414 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) = 3415 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries, 3416 SLocSpaceSize); 3417 if (!F.SLocEntryBaseID) { 3418 Error("ran out of source locations"); 3419 break; 3420 } 3421 // Make our entry in the range map. BaseID is negative and growing, so 3422 // we invert it. Because we invert it, though, we need the other end of 3423 // the range. 3424 unsigned RangeStart = 3425 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1; 3426 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F)); 3427 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset); 3428 3429 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing. 3430 assert((F.SLocEntryBaseOffset & SourceLocation::MacroIDBit) == 0); 3431 GlobalSLocOffsetMap.insert( 3432 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset 3433 - SLocSpaceSize,&F)); 3434 3435 // Initialize the remapping table. 3436 // Invalid stays invalid. 3437 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0)); 3438 // This module. Base was 2 when being compiled. 3439 F.SLocRemap.insertOrReplace(std::make_pair( 3440 2U, static_cast<SourceLocation::IntTy>(F.SLocEntryBaseOffset - 2))); 3441 3442 TotalNumSLocEntries += F.LocalNumSLocEntries; 3443 break; 3444 } 3445 3446 case MODULE_OFFSET_MAP: 3447 F.ModuleOffsetMap = Blob; 3448 break; 3449 3450 case SOURCE_MANAGER_LINE_TABLE: 3451 if (ParseLineTable(F, Record)) { 3452 Error("malformed SOURCE_MANAGER_LINE_TABLE in AST file"); 3453 return Failure; 3454 } 3455 break; 3456 3457 case SOURCE_LOCATION_PRELOADS: { 3458 // Need to transform from the local view (1-based IDs) to the global view, 3459 // which is based off F.SLocEntryBaseID. 3460 if (!F.PreloadSLocEntries.empty()) { 3461 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file"); 3462 return Failure; 3463 } 3464 3465 F.PreloadSLocEntries.swap(Record); 3466 break; 3467 } 3468 3469 case EXT_VECTOR_DECLS: 3470 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3471 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I])); 3472 break; 3473 3474 case VTABLE_USES: 3475 if (Record.size() % 3 != 0) { 3476 Error("Invalid VTABLE_USES record"); 3477 return Failure; 3478 } 3479 3480 // Later tables overwrite earlier ones. 3481 // FIXME: Modules will have some trouble with this. This is clearly not 3482 // the right way to do this. 3483 VTableUses.clear(); 3484 3485 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) { 3486 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++])); 3487 VTableUses.push_back( 3488 ReadSourceLocation(F, Record, Idx).getRawEncoding()); 3489 VTableUses.push_back(Record[Idx++]); 3490 } 3491 break; 3492 3493 case PENDING_IMPLICIT_INSTANTIATIONS: 3494 if (PendingInstantiations.size() % 2 != 0) { 3495 Error("Invalid existing PendingInstantiations"); 3496 return Failure; 3497 } 3498 3499 if (Record.size() % 2 != 0) { 3500 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block"); 3501 return Failure; 3502 } 3503 3504 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3505 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++])); 3506 PendingInstantiations.push_back( 3507 ReadSourceLocation(F, Record, I).getRawEncoding()); 3508 } 3509 break; 3510 3511 case SEMA_DECL_REFS: 3512 if (Record.size() != 3) { 3513 Error("Invalid SEMA_DECL_REFS block"); 3514 return Failure; 3515 } 3516 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3517 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3518 break; 3519 3520 case PPD_ENTITIES_OFFSETS: { 3521 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data(); 3522 assert(Blob.size() % sizeof(PPEntityOffset) == 0); 3523 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset); 3524 3525 unsigned LocalBasePreprocessedEntityID = Record[0]; 3526 3527 unsigned StartingID; 3528 if (!PP.getPreprocessingRecord()) 3529 PP.createPreprocessingRecord(); 3530 if (!PP.getPreprocessingRecord()->getExternalSource()) 3531 PP.getPreprocessingRecord()->SetExternalSource(*this); 3532 StartingID 3533 = PP.getPreprocessingRecord() 3534 ->allocateLoadedEntities(F.NumPreprocessedEntities); 3535 F.BasePreprocessedEntityID = StartingID; 3536 3537 if (F.NumPreprocessedEntities > 0) { 3538 // Introduce the global -> local mapping for preprocessed entities in 3539 // this module. 3540 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F)); 3541 3542 // Introduce the local -> global mapping for preprocessed entities in 3543 // this module. 3544 F.PreprocessedEntityRemap.insertOrReplace( 3545 std::make_pair(LocalBasePreprocessedEntityID, 3546 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID)); 3547 } 3548 3549 break; 3550 } 3551 3552 case PPD_SKIPPED_RANGES: { 3553 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data(); 3554 assert(Blob.size() % sizeof(PPSkippedRange) == 0); 3555 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange); 3556 3557 if (!PP.getPreprocessingRecord()) 3558 PP.createPreprocessingRecord(); 3559 if (!PP.getPreprocessingRecord()->getExternalSource()) 3560 PP.getPreprocessingRecord()->SetExternalSource(*this); 3561 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord() 3562 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges); 3563 3564 if (F.NumPreprocessedSkippedRanges > 0) 3565 GlobalSkippedRangeMap.insert( 3566 std::make_pair(F.BasePreprocessedSkippedRangeID, &F)); 3567 break; 3568 } 3569 3570 case DECL_UPDATE_OFFSETS: 3571 if (Record.size() % 2 != 0) { 3572 Error("invalid DECL_UPDATE_OFFSETS block in AST file"); 3573 return Failure; 3574 } 3575 for (unsigned I = 0, N = Record.size(); I != N; I += 2) { 3576 GlobalDeclID ID = getGlobalDeclID(F, Record[I]); 3577 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1])); 3578 3579 // If we've already loaded the decl, perform the updates when we finish 3580 // loading this block. 3581 if (Decl *D = GetExistingDecl(ID)) 3582 PendingUpdateRecords.push_back( 3583 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3584 } 3585 break; 3586 3587 case OBJC_CATEGORIES_MAP: 3588 if (F.LocalNumObjCCategoriesInMap != 0) { 3589 Error("duplicate OBJC_CATEGORIES_MAP record in AST file"); 3590 return Failure; 3591 } 3592 3593 F.LocalNumObjCCategoriesInMap = Record[0]; 3594 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data(); 3595 break; 3596 3597 case OBJC_CATEGORIES: 3598 F.ObjCCategories.swap(Record); 3599 break; 3600 3601 case CUDA_SPECIAL_DECL_REFS: 3602 // Later tables overwrite earlier ones. 3603 // FIXME: Modules will have trouble with this. 3604 CUDASpecialDeclRefs.clear(); 3605 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3606 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3607 break; 3608 3609 case HEADER_SEARCH_TABLE: 3610 F.HeaderFileInfoTableData = Blob.data(); 3611 F.LocalNumHeaderFileInfos = Record[1]; 3612 if (Record[0]) { 3613 F.HeaderFileInfoTable 3614 = HeaderFileInfoLookupTable::Create( 3615 (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 3616 (const unsigned char *)F.HeaderFileInfoTableData, 3617 HeaderFileInfoTrait(*this, F, 3618 &PP.getHeaderSearchInfo(), 3619 Blob.data() + Record[2])); 3620 3621 PP.getHeaderSearchInfo().SetExternalSource(this); 3622 if (!PP.getHeaderSearchInfo().getExternalLookup()) 3623 PP.getHeaderSearchInfo().SetExternalLookup(this); 3624 } 3625 break; 3626 3627 case FP_PRAGMA_OPTIONS: 3628 // Later tables overwrite earlier ones. 3629 FPPragmaOptions.swap(Record); 3630 break; 3631 3632 case OPENCL_EXTENSIONS: 3633 for (unsigned I = 0, E = Record.size(); I != E; ) { 3634 auto Name = ReadString(Record, I); 3635 auto &OptInfo = OpenCLExtensions.OptMap[Name]; 3636 OptInfo.Supported = Record[I++] != 0; 3637 OptInfo.Enabled = Record[I++] != 0; 3638 OptInfo.WithPragma = Record[I++] != 0; 3639 OptInfo.Avail = Record[I++]; 3640 OptInfo.Core = Record[I++]; 3641 OptInfo.Opt = Record[I++]; 3642 } 3643 break; 3644 3645 case TENTATIVE_DEFINITIONS: 3646 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3647 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 3648 break; 3649 3650 case KNOWN_NAMESPACES: 3651 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3652 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 3653 break; 3654 3655 case UNDEFINED_BUT_USED: 3656 if (UndefinedButUsed.size() % 2 != 0) { 3657 Error("Invalid existing UndefinedButUsed"); 3658 return Failure; 3659 } 3660 3661 if (Record.size() % 2 != 0) { 3662 Error("invalid undefined-but-used record"); 3663 return Failure; 3664 } 3665 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3666 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 3667 UndefinedButUsed.push_back( 3668 ReadSourceLocation(F, Record, I).getRawEncoding()); 3669 } 3670 break; 3671 3672 case DELETE_EXPRS_TO_ANALYZE: 3673 for (unsigned I = 0, N = Record.size(); I != N;) { 3674 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++])); 3675 const uint64_t Count = Record[I++]; 3676 DelayedDeleteExprs.push_back(Count); 3677 for (uint64_t C = 0; C < Count; ++C) { 3678 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding()); 3679 bool IsArrayForm = Record[I++] == 1; 3680 DelayedDeleteExprs.push_back(IsArrayForm); 3681 } 3682 } 3683 break; 3684 3685 case IMPORTED_MODULES: 3686 if (!F.isModule()) { 3687 // If we aren't loading a module (which has its own exports), make 3688 // all of the imported modules visible. 3689 // FIXME: Deal with macros-only imports. 3690 for (unsigned I = 0, N = Record.size(); I != N; /**/) { 3691 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]); 3692 SourceLocation Loc = ReadSourceLocation(F, Record, I); 3693 if (GlobalID) { 3694 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc)); 3695 if (DeserializationListener) 3696 DeserializationListener->ModuleImportRead(GlobalID, Loc); 3697 } 3698 } 3699 } 3700 break; 3701 3702 case MACRO_OFFSET: { 3703 if (F.LocalNumMacros != 0) { 3704 Error("duplicate MACRO_OFFSET record in AST file"); 3705 return Failure; 3706 } 3707 F.MacroOffsets = (const uint32_t *)Blob.data(); 3708 F.LocalNumMacros = Record[0]; 3709 unsigned LocalBaseMacroID = Record[1]; 3710 F.MacroOffsetsBase = Record[2] + F.ASTBlockStartOffset; 3711 F.BaseMacroID = getTotalNumMacros(); 3712 3713 if (F.LocalNumMacros > 0) { 3714 // Introduce the global -> local mapping for macros within this module. 3715 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 3716 3717 // Introduce the local -> global mapping for macros within this module. 3718 F.MacroRemap.insertOrReplace( 3719 std::make_pair(LocalBaseMacroID, 3720 F.BaseMacroID - LocalBaseMacroID)); 3721 3722 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 3723 } 3724 break; 3725 } 3726 3727 case LATE_PARSED_TEMPLATE: 3728 LateParsedTemplates.emplace_back( 3729 std::piecewise_construct, std::forward_as_tuple(&F), 3730 std::forward_as_tuple(Record.begin(), Record.end())); 3731 break; 3732 3733 case OPTIMIZE_PRAGMA_OPTIONS: 3734 if (Record.size() != 1) { 3735 Error("invalid pragma optimize record"); 3736 return Failure; 3737 } 3738 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]); 3739 break; 3740 3741 case MSSTRUCT_PRAGMA_OPTIONS: 3742 if (Record.size() != 1) { 3743 Error("invalid pragma ms_struct record"); 3744 return Failure; 3745 } 3746 PragmaMSStructState = Record[0]; 3747 break; 3748 3749 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS: 3750 if (Record.size() != 2) { 3751 Error("invalid pragma ms_struct record"); 3752 return Failure; 3753 } 3754 PragmaMSPointersToMembersState = Record[0]; 3755 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]); 3756 break; 3757 3758 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES: 3759 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3760 UnusedLocalTypedefNameCandidates.push_back( 3761 getGlobalDeclID(F, Record[I])); 3762 break; 3763 3764 case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH: 3765 if (Record.size() != 1) { 3766 Error("invalid cuda pragma options record"); 3767 return Failure; 3768 } 3769 ForceCUDAHostDeviceDepth = Record[0]; 3770 break; 3771 3772 case ALIGN_PACK_PRAGMA_OPTIONS: { 3773 if (Record.size() < 3) { 3774 Error("invalid pragma pack record"); 3775 return Failure; 3776 } 3777 PragmaAlignPackCurrentValue = ReadAlignPackInfo(Record[0]); 3778 PragmaAlignPackCurrentLocation = ReadSourceLocation(F, Record[1]); 3779 unsigned NumStackEntries = Record[2]; 3780 unsigned Idx = 3; 3781 // Reset the stack when importing a new module. 3782 PragmaAlignPackStack.clear(); 3783 for (unsigned I = 0; I < NumStackEntries; ++I) { 3784 PragmaAlignPackStackEntry Entry; 3785 Entry.Value = ReadAlignPackInfo(Record[Idx++]); 3786 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3787 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3788 PragmaAlignPackStrings.push_back(ReadString(Record, Idx)); 3789 Entry.SlotLabel = PragmaAlignPackStrings.back(); 3790 PragmaAlignPackStack.push_back(Entry); 3791 } 3792 break; 3793 } 3794 3795 case FLOAT_CONTROL_PRAGMA_OPTIONS: { 3796 if (Record.size() < 3) { 3797 Error("invalid pragma pack record"); 3798 return Failure; 3799 } 3800 FpPragmaCurrentValue = FPOptionsOverride::getFromOpaqueInt(Record[0]); 3801 FpPragmaCurrentLocation = ReadSourceLocation(F, Record[1]); 3802 unsigned NumStackEntries = Record[2]; 3803 unsigned Idx = 3; 3804 // Reset the stack when importing a new module. 3805 FpPragmaStack.clear(); 3806 for (unsigned I = 0; I < NumStackEntries; ++I) { 3807 FpPragmaStackEntry Entry; 3808 Entry.Value = FPOptionsOverride::getFromOpaqueInt(Record[Idx++]); 3809 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3810 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3811 FpPragmaStrings.push_back(ReadString(Record, Idx)); 3812 Entry.SlotLabel = FpPragmaStrings.back(); 3813 FpPragmaStack.push_back(Entry); 3814 } 3815 break; 3816 } 3817 3818 case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS: 3819 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3820 DeclsToCheckForDeferredDiags.insert(getGlobalDeclID(F, Record[I])); 3821 break; 3822 } 3823 } 3824 } 3825 3826 void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const { 3827 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read"); 3828 3829 // Additional remapping information. 3830 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data(); 3831 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size(); 3832 F.ModuleOffsetMap = StringRef(); 3833 3834 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders. 3835 if (F.SLocRemap.find(0) == F.SLocRemap.end()) { 3836 F.SLocRemap.insert(std::make_pair(0U, 0)); 3837 F.SLocRemap.insert(std::make_pair(2U, 1)); 3838 } 3839 3840 // Continuous range maps we may be updating in our module. 3841 using SLocRemapBuilder = 3842 ContinuousRangeMap<SourceLocation::UIntTy, SourceLocation::IntTy, 3843 2>::Builder; 3844 using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder; 3845 SLocRemapBuilder SLocRemap(F.SLocRemap); 3846 RemapBuilder IdentifierRemap(F.IdentifierRemap); 3847 RemapBuilder MacroRemap(F.MacroRemap); 3848 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap); 3849 RemapBuilder SubmoduleRemap(F.SubmoduleRemap); 3850 RemapBuilder SelectorRemap(F.SelectorRemap); 3851 RemapBuilder DeclRemap(F.DeclRemap); 3852 RemapBuilder TypeRemap(F.TypeRemap); 3853 3854 while (Data < DataEnd) { 3855 // FIXME: Looking up dependency modules by filename is horrible. Let's 3856 // start fixing this with prebuilt, explicit and implicit modules and see 3857 // how it goes... 3858 using namespace llvm::support; 3859 ModuleKind Kind = static_cast<ModuleKind>( 3860 endian::readNext<uint8_t, little, unaligned>(Data)); 3861 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data); 3862 StringRef Name = StringRef((const char*)Data, Len); 3863 Data += Len; 3864 ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule || 3865 Kind == MK_ImplicitModule 3866 ? ModuleMgr.lookupByModuleName(Name) 3867 : ModuleMgr.lookupByFileName(Name)); 3868 if (!OM) { 3869 std::string Msg = 3870 "SourceLocation remap refers to unknown module, cannot find "; 3871 Msg.append(std::string(Name)); 3872 Error(Msg); 3873 return; 3874 } 3875 3876 SourceLocation::UIntTy SLocOffset = 3877 endian::readNext<uint32_t, little, unaligned>(Data); 3878 uint32_t IdentifierIDOffset = 3879 endian::readNext<uint32_t, little, unaligned>(Data); 3880 uint32_t MacroIDOffset = 3881 endian::readNext<uint32_t, little, unaligned>(Data); 3882 uint32_t PreprocessedEntityIDOffset = 3883 endian::readNext<uint32_t, little, unaligned>(Data); 3884 uint32_t SubmoduleIDOffset = 3885 endian::readNext<uint32_t, little, unaligned>(Data); 3886 uint32_t SelectorIDOffset = 3887 endian::readNext<uint32_t, little, unaligned>(Data); 3888 uint32_t DeclIDOffset = 3889 endian::readNext<uint32_t, little, unaligned>(Data); 3890 uint32_t TypeIndexOffset = 3891 endian::readNext<uint32_t, little, unaligned>(Data); 3892 3893 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset, 3894 RemapBuilder &Remap) { 3895 constexpr uint32_t None = std::numeric_limits<uint32_t>::max(); 3896 if (Offset != None) 3897 Remap.insert(std::make_pair(Offset, 3898 static_cast<int>(BaseOffset - Offset))); 3899 }; 3900 3901 constexpr SourceLocation::UIntTy SLocNone = 3902 std::numeric_limits<SourceLocation::UIntTy>::max(); 3903 if (SLocOffset != SLocNone) 3904 SLocRemap.insert(std::make_pair( 3905 SLocOffset, static_cast<SourceLocation::IntTy>( 3906 OM->SLocEntryBaseOffset - SLocOffset))); 3907 3908 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap); 3909 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap); 3910 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID, 3911 PreprocessedEntityRemap); 3912 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap); 3913 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap); 3914 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap); 3915 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap); 3916 3917 // Global -> local mappings. 3918 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset; 3919 } 3920 } 3921 3922 ASTReader::ASTReadResult 3923 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F, 3924 const ModuleFile *ImportedBy, 3925 unsigned ClientLoadCapabilities) { 3926 unsigned Idx = 0; 3927 F.ModuleMapPath = ReadPath(F, Record, Idx); 3928 3929 // Try to resolve ModuleName in the current header search context and 3930 // verify that it is found in the same module map file as we saved. If the 3931 // top-level AST file is a main file, skip this check because there is no 3932 // usable header search context. 3933 assert(!F.ModuleName.empty() && 3934 "MODULE_NAME should come before MODULE_MAP_FILE"); 3935 if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) { 3936 // An implicitly-loaded module file should have its module listed in some 3937 // module map file that we've already loaded. 3938 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName); 3939 auto &Map = PP.getHeaderSearchInfo().getModuleMap(); 3940 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr; 3941 // Don't emit module relocation error if we have -fno-validate-pch 3942 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 3943 DisableValidationForModuleKind::Module) && 3944 !ModMap) { 3945 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) { 3946 if (auto ASTFE = M ? M->getASTFile() : None) { 3947 // This module was defined by an imported (explicit) module. 3948 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName 3949 << ASTFE->getName(); 3950 } else { 3951 // This module was built with a different module map. 3952 Diag(diag::err_imported_module_not_found) 3953 << F.ModuleName << F.FileName 3954 << (ImportedBy ? ImportedBy->FileName : "") << F.ModuleMapPath 3955 << !ImportedBy; 3956 // In case it was imported by a PCH, there's a chance the user is 3957 // just missing to include the search path to the directory containing 3958 // the modulemap. 3959 if (ImportedBy && ImportedBy->Kind == MK_PCH) 3960 Diag(diag::note_imported_by_pch_module_not_found) 3961 << llvm::sys::path::parent_path(F.ModuleMapPath); 3962 } 3963 } 3964 return OutOfDate; 3965 } 3966 3967 assert(M && M->Name == F.ModuleName && "found module with different name"); 3968 3969 // Check the primary module map file. 3970 auto StoredModMap = FileMgr.getFile(F.ModuleMapPath); 3971 if (!StoredModMap || *StoredModMap != ModMap) { 3972 assert(ModMap && "found module is missing module map file"); 3973 assert((ImportedBy || F.Kind == MK_ImplicitModule) && 3974 "top-level import should be verified"); 3975 bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy; 3976 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 3977 Diag(diag::err_imported_module_modmap_changed) 3978 << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName) 3979 << ModMap->getName() << F.ModuleMapPath << NotImported; 3980 return OutOfDate; 3981 } 3982 3983 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps; 3984 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) { 3985 // FIXME: we should use input files rather than storing names. 3986 std::string Filename = ReadPath(F, Record, Idx); 3987 auto SF = FileMgr.getFile(Filename, false, false); 3988 if (!SF) { 3989 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 3990 Error("could not find file '" + Filename +"' referenced by AST file"); 3991 return OutOfDate; 3992 } 3993 AdditionalStoredMaps.insert(*SF); 3994 } 3995 3996 // Check any additional module map files (e.g. module.private.modulemap) 3997 // that are not in the pcm. 3998 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) { 3999 for (const FileEntry *ModMap : *AdditionalModuleMaps) { 4000 // Remove files that match 4001 // Note: SmallPtrSet::erase is really remove 4002 if (!AdditionalStoredMaps.erase(ModMap)) { 4003 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 4004 Diag(diag::err_module_different_modmap) 4005 << F.ModuleName << /*new*/0 << ModMap->getName(); 4006 return OutOfDate; 4007 } 4008 } 4009 } 4010 4011 // Check any additional module map files that are in the pcm, but not 4012 // found in header search. Cases that match are already removed. 4013 for (const FileEntry *ModMap : AdditionalStoredMaps) { 4014 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 4015 Diag(diag::err_module_different_modmap) 4016 << F.ModuleName << /*not new*/1 << ModMap->getName(); 4017 return OutOfDate; 4018 } 4019 } 4020 4021 if (Listener) 4022 Listener->ReadModuleMapFile(F.ModuleMapPath); 4023 return Success; 4024 } 4025 4026 /// Move the given method to the back of the global list of methods. 4027 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 4028 // Find the entry for this selector in the method pool. 4029 Sema::GlobalMethodPool::iterator Known 4030 = S.MethodPool.find(Method->getSelector()); 4031 if (Known == S.MethodPool.end()) 4032 return; 4033 4034 // Retrieve the appropriate method list. 4035 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 4036 : Known->second.second; 4037 bool Found = false; 4038 for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 4039 if (!Found) { 4040 if (List->getMethod() == Method) { 4041 Found = true; 4042 } else { 4043 // Keep searching. 4044 continue; 4045 } 4046 } 4047 4048 if (List->getNext()) 4049 List->setMethod(List->getNext()->getMethod()); 4050 else 4051 List->setMethod(Method); 4052 } 4053 } 4054 4055 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) { 4056 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?"); 4057 for (Decl *D : Names) { 4058 bool wasHidden = !D->isUnconditionallyVisible(); 4059 D->setVisibleDespiteOwningModule(); 4060 4061 if (wasHidden && SemaObj) { 4062 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 4063 moveMethodToBackOfGlobalList(*SemaObj, Method); 4064 } 4065 } 4066 } 4067 } 4068 4069 void ASTReader::makeModuleVisible(Module *Mod, 4070 Module::NameVisibilityKind NameVisibility, 4071 SourceLocation ImportLoc) { 4072 llvm::SmallPtrSet<Module *, 4> Visited; 4073 SmallVector<Module *, 4> Stack; 4074 Stack.push_back(Mod); 4075 while (!Stack.empty()) { 4076 Mod = Stack.pop_back_val(); 4077 4078 if (NameVisibility <= Mod->NameVisibility) { 4079 // This module already has this level of visibility (or greater), so 4080 // there is nothing more to do. 4081 continue; 4082 } 4083 4084 if (Mod->isUnimportable()) { 4085 // Modules that aren't importable cannot be made visible. 4086 continue; 4087 } 4088 4089 // Update the module's name visibility. 4090 Mod->NameVisibility = NameVisibility; 4091 4092 // If we've already deserialized any names from this module, 4093 // mark them as visible. 4094 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 4095 if (Hidden != HiddenNamesMap.end()) { 4096 auto HiddenNames = std::move(*Hidden); 4097 HiddenNamesMap.erase(Hidden); 4098 makeNamesVisible(HiddenNames.second, HiddenNames.first); 4099 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && 4100 "making names visible added hidden names"); 4101 } 4102 4103 // Push any exported modules onto the stack to be marked as visible. 4104 SmallVector<Module *, 16> Exports; 4105 Mod->getExportedModules(Exports); 4106 for (SmallVectorImpl<Module *>::iterator 4107 I = Exports.begin(), E = Exports.end(); I != E; ++I) { 4108 Module *Exported = *I; 4109 if (Visited.insert(Exported).second) 4110 Stack.push_back(Exported); 4111 } 4112 } 4113 } 4114 4115 /// We've merged the definition \p MergedDef into the existing definition 4116 /// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made 4117 /// visible. 4118 void ASTReader::mergeDefinitionVisibility(NamedDecl *Def, 4119 NamedDecl *MergedDef) { 4120 if (!Def->isUnconditionallyVisible()) { 4121 // If MergedDef is visible or becomes visible, make the definition visible. 4122 if (MergedDef->isUnconditionallyVisible()) 4123 Def->setVisibleDespiteOwningModule(); 4124 else { 4125 getContext().mergeDefinitionIntoModule( 4126 Def, MergedDef->getImportedOwningModule(), 4127 /*NotifyListeners*/ false); 4128 PendingMergedDefinitionsToDeduplicate.insert(Def); 4129 } 4130 } 4131 } 4132 4133 bool ASTReader::loadGlobalIndex() { 4134 if (GlobalIndex) 4135 return false; 4136 4137 if (TriedLoadingGlobalIndex || !UseGlobalIndex || 4138 !PP.getLangOpts().Modules) 4139 return true; 4140 4141 // Try to load the global index. 4142 TriedLoadingGlobalIndex = true; 4143 StringRef ModuleCachePath 4144 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 4145 std::pair<GlobalModuleIndex *, llvm::Error> Result = 4146 GlobalModuleIndex::readIndex(ModuleCachePath); 4147 if (llvm::Error Err = std::move(Result.second)) { 4148 assert(!Result.first); 4149 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 4150 return true; 4151 } 4152 4153 GlobalIndex.reset(Result.first); 4154 ModuleMgr.setGlobalIndex(GlobalIndex.get()); 4155 return false; 4156 } 4157 4158 bool ASTReader::isGlobalIndexUnavailable() const { 4159 return PP.getLangOpts().Modules && UseGlobalIndex && 4160 !hasGlobalIndex() && TriedLoadingGlobalIndex; 4161 } 4162 4163 static void updateModuleTimestamp(ModuleFile &MF) { 4164 // Overwrite the timestamp file contents so that file's mtime changes. 4165 std::string TimestampFilename = MF.getTimestampFilename(); 4166 std::error_code EC; 4167 llvm::raw_fd_ostream OS(TimestampFilename, EC, 4168 llvm::sys::fs::OF_TextWithCRLF); 4169 if (EC) 4170 return; 4171 OS << "Timestamp file\n"; 4172 OS.close(); 4173 OS.clear_error(); // Avoid triggering a fatal error. 4174 } 4175 4176 /// Given a cursor at the start of an AST file, scan ahead and drop the 4177 /// cursor into the start of the given block ID, returning false on success and 4178 /// true on failure. 4179 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 4180 while (true) { 4181 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 4182 if (!MaybeEntry) { 4183 // FIXME this drops errors on the floor. 4184 consumeError(MaybeEntry.takeError()); 4185 return true; 4186 } 4187 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4188 4189 switch (Entry.Kind) { 4190 case llvm::BitstreamEntry::Error: 4191 case llvm::BitstreamEntry::EndBlock: 4192 return true; 4193 4194 case llvm::BitstreamEntry::Record: 4195 // Ignore top-level records. 4196 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID)) 4197 break; 4198 else { 4199 // FIXME this drops errors on the floor. 4200 consumeError(Skipped.takeError()); 4201 return true; 4202 } 4203 4204 case llvm::BitstreamEntry::SubBlock: 4205 if (Entry.ID == BlockID) { 4206 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) { 4207 // FIXME this drops the error on the floor. 4208 consumeError(std::move(Err)); 4209 return true; 4210 } 4211 // Found it! 4212 return false; 4213 } 4214 4215 if (llvm::Error Err = Cursor.SkipBlock()) { 4216 // FIXME this drops the error on the floor. 4217 consumeError(std::move(Err)); 4218 return true; 4219 } 4220 } 4221 } 4222 } 4223 4224 ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, 4225 ModuleKind Type, 4226 SourceLocation ImportLoc, 4227 unsigned ClientLoadCapabilities, 4228 SmallVectorImpl<ImportedSubmodule> *Imported) { 4229 llvm::SaveAndRestore<SourceLocation> 4230 SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 4231 llvm::SaveAndRestore<Optional<ModuleKind>> SetCurModuleKindRAII( 4232 CurrentDeserializingModuleKind, Type); 4233 4234 // Defer any pending actions until we get to the end of reading the AST file. 4235 Deserializing AnASTFile(this); 4236 4237 // Bump the generation number. 4238 unsigned PreviousGeneration = 0; 4239 if (ContextObj) 4240 PreviousGeneration = incrementGeneration(*ContextObj); 4241 4242 unsigned NumModules = ModuleMgr.size(); 4243 SmallVector<ImportedModule, 4> Loaded; 4244 if (ASTReadResult ReadResult = 4245 ReadASTCore(FileName, Type, ImportLoc, 4246 /*ImportedBy=*/nullptr, Loaded, 0, 0, ASTFileSignature(), 4247 ClientLoadCapabilities)) { 4248 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, 4249 PP.getLangOpts().Modules 4250 ? &PP.getHeaderSearchInfo().getModuleMap() 4251 : nullptr); 4252 4253 // If we find that any modules are unusable, the global index is going 4254 // to be out-of-date. Just remove it. 4255 GlobalIndex.reset(); 4256 ModuleMgr.setGlobalIndex(nullptr); 4257 return ReadResult; 4258 } 4259 4260 // Here comes stuff that we only do once the entire chain is loaded. 4261 4262 // Load the AST blocks of all of the modules that we loaded. We can still 4263 // hit errors parsing the ASTs at this point. 4264 for (ImportedModule &M : Loaded) { 4265 ModuleFile &F = *M.Mod; 4266 4267 // Read the AST block. 4268 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities)) 4269 return Failure; 4270 4271 // The AST block should always have a definition for the main module. 4272 if (F.isModule() && !F.DidReadTopLevelSubmodule) { 4273 Error(diag::err_module_file_missing_top_level_submodule, F.FileName); 4274 return Failure; 4275 } 4276 4277 // Read the extension blocks. 4278 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) { 4279 if (ASTReadResult Result = ReadExtensionBlock(F)) 4280 return Failure; 4281 } 4282 4283 // Once read, set the ModuleFile bit base offset and update the size in 4284 // bits of all files we've seen. 4285 F.GlobalBitOffset = TotalModulesSizeInBits; 4286 TotalModulesSizeInBits += F.SizeInBits; 4287 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 4288 } 4289 4290 // Preload source locations and interesting indentifiers. 4291 for (ImportedModule &M : Loaded) { 4292 ModuleFile &F = *M.Mod; 4293 4294 // Preload SLocEntries. 4295 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 4296 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 4297 // Load it through the SourceManager and don't call ReadSLocEntry() 4298 // directly because the entry may have already been loaded in which case 4299 // calling ReadSLocEntry() directly would trigger an assertion in 4300 // SourceManager. 4301 SourceMgr.getLoadedSLocEntryByID(Index); 4302 } 4303 4304 // Map the original source file ID into the ID space of the current 4305 // compilation. 4306 if (F.OriginalSourceFileID.isValid()) { 4307 F.OriginalSourceFileID = FileID::get( 4308 F.SLocEntryBaseID + F.OriginalSourceFileID.getOpaqueValue() - 1); 4309 } 4310 4311 // Preload all the pending interesting identifiers by marking them out of 4312 // date. 4313 for (auto Offset : F.PreloadIdentifierOffsets) { 4314 const unsigned char *Data = F.IdentifierTableData + Offset; 4315 4316 ASTIdentifierLookupTrait Trait(*this, F); 4317 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 4318 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 4319 auto &II = PP.getIdentifierTable().getOwn(Key); 4320 II.setOutOfDate(true); 4321 4322 // Mark this identifier as being from an AST file so that we can track 4323 // whether we need to serialize it. 4324 markIdentifierFromAST(*this, II); 4325 4326 // Associate the ID with the identifier so that the writer can reuse it. 4327 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first); 4328 SetIdentifierInfo(ID, &II); 4329 } 4330 } 4331 4332 // Setup the import locations and notify the module manager that we've 4333 // committed to these module files. 4334 for (ImportedModule &M : Loaded) { 4335 ModuleFile &F = *M.Mod; 4336 4337 ModuleMgr.moduleFileAccepted(&F); 4338 4339 // Set the import location. 4340 F.DirectImportLoc = ImportLoc; 4341 // FIXME: We assume that locations from PCH / preamble do not need 4342 // any translation. 4343 if (!M.ImportedBy) 4344 F.ImportLoc = M.ImportLoc; 4345 else 4346 F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc); 4347 } 4348 4349 if (!PP.getLangOpts().CPlusPlus || 4350 (Type != MK_ImplicitModule && Type != MK_ExplicitModule && 4351 Type != MK_PrebuiltModule)) { 4352 // Mark all of the identifiers in the identifier table as being out of date, 4353 // so that various accessors know to check the loaded modules when the 4354 // identifier is used. 4355 // 4356 // For C++ modules, we don't need information on many identifiers (just 4357 // those that provide macros or are poisoned), so we mark all of 4358 // the interesting ones via PreloadIdentifierOffsets. 4359 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 4360 IdEnd = PP.getIdentifierTable().end(); 4361 Id != IdEnd; ++Id) 4362 Id->second->setOutOfDate(true); 4363 } 4364 // Mark selectors as out of date. 4365 for (auto Sel : SelectorGeneration) 4366 SelectorOutOfDate[Sel.first] = true; 4367 4368 // Resolve any unresolved module exports. 4369 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) { 4370 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I]; 4371 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 4372 Module *ResolvedMod = getSubmodule(GlobalID); 4373 4374 switch (Unresolved.Kind) { 4375 case UnresolvedModuleRef::Conflict: 4376 if (ResolvedMod) { 4377 Module::Conflict Conflict; 4378 Conflict.Other = ResolvedMod; 4379 Conflict.Message = Unresolved.String.str(); 4380 Unresolved.Mod->Conflicts.push_back(Conflict); 4381 } 4382 continue; 4383 4384 case UnresolvedModuleRef::Import: 4385 if (ResolvedMod) 4386 Unresolved.Mod->Imports.insert(ResolvedMod); 4387 continue; 4388 4389 case UnresolvedModuleRef::Export: 4390 if (ResolvedMod || Unresolved.IsWildcard) 4391 Unresolved.Mod->Exports.push_back( 4392 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 4393 continue; 4394 } 4395 } 4396 UnresolvedModuleRefs.clear(); 4397 4398 if (Imported) 4399 Imported->append(ImportedModules.begin(), 4400 ImportedModules.end()); 4401 4402 // FIXME: How do we load the 'use'd modules? They may not be submodules. 4403 // Might be unnecessary as use declarations are only used to build the 4404 // module itself. 4405 4406 if (ContextObj) 4407 InitializeContext(); 4408 4409 if (SemaObj) 4410 UpdateSema(); 4411 4412 if (DeserializationListener) 4413 DeserializationListener->ReaderInitialized(this); 4414 4415 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 4416 if (PrimaryModule.OriginalSourceFileID.isValid()) { 4417 // If this AST file is a precompiled preamble, then set the 4418 // preamble file ID of the source manager to the file source file 4419 // from which the preamble was built. 4420 if (Type == MK_Preamble) { 4421 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 4422 } else if (Type == MK_MainFile) { 4423 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 4424 } 4425 } 4426 4427 // For any Objective-C class definitions we have already loaded, make sure 4428 // that we load any additional categories. 4429 if (ContextObj) { 4430 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 4431 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 4432 ObjCClassesLoaded[I], 4433 PreviousGeneration); 4434 } 4435 } 4436 4437 if (PP.getHeaderSearchInfo() 4438 .getHeaderSearchOpts() 4439 .ModulesValidateOncePerBuildSession) { 4440 // Now we are certain that the module and all modules it depends on are 4441 // up to date. Create or update timestamp files for modules that are 4442 // located in the module cache (not for PCH files that could be anywhere 4443 // in the filesystem). 4444 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) { 4445 ImportedModule &M = Loaded[I]; 4446 if (M.Mod->Kind == MK_ImplicitModule) { 4447 updateModuleTimestamp(*M.Mod); 4448 } 4449 } 4450 } 4451 4452 return Success; 4453 } 4454 4455 static ASTFileSignature readASTFileSignature(StringRef PCH); 4456 4457 /// Whether \p Stream doesn't start with the AST/PCH file magic number 'CPCH'. 4458 static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) { 4459 // FIXME checking magic headers is done in other places such as 4460 // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't 4461 // always done the same. Unify it all with a helper. 4462 if (!Stream.canSkipToPos(4)) 4463 return llvm::createStringError(std::errc::illegal_byte_sequence, 4464 "file too small to contain AST file magic"); 4465 for (unsigned C : {'C', 'P', 'C', 'H'}) 4466 if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) { 4467 if (Res.get() != C) 4468 return llvm::createStringError( 4469 std::errc::illegal_byte_sequence, 4470 "file doesn't start with AST file magic"); 4471 } else 4472 return Res.takeError(); 4473 return llvm::Error::success(); 4474 } 4475 4476 static unsigned moduleKindForDiagnostic(ModuleKind Kind) { 4477 switch (Kind) { 4478 case MK_PCH: 4479 return 0; // PCH 4480 case MK_ImplicitModule: 4481 case MK_ExplicitModule: 4482 case MK_PrebuiltModule: 4483 return 1; // module 4484 case MK_MainFile: 4485 case MK_Preamble: 4486 return 2; // main source file 4487 } 4488 llvm_unreachable("unknown module kind"); 4489 } 4490 4491 ASTReader::ASTReadResult 4492 ASTReader::ReadASTCore(StringRef FileName, 4493 ModuleKind Type, 4494 SourceLocation ImportLoc, 4495 ModuleFile *ImportedBy, 4496 SmallVectorImpl<ImportedModule> &Loaded, 4497 off_t ExpectedSize, time_t ExpectedModTime, 4498 ASTFileSignature ExpectedSignature, 4499 unsigned ClientLoadCapabilities) { 4500 ModuleFile *M; 4501 std::string ErrorStr; 4502 ModuleManager::AddModuleResult AddResult 4503 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy, 4504 getGeneration(), ExpectedSize, ExpectedModTime, 4505 ExpectedSignature, readASTFileSignature, 4506 M, ErrorStr); 4507 4508 switch (AddResult) { 4509 case ModuleManager::AlreadyLoaded: 4510 Diag(diag::remark_module_import) 4511 << M->ModuleName << M->FileName << (ImportedBy ? true : false) 4512 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 4513 return Success; 4514 4515 case ModuleManager::NewlyLoaded: 4516 // Load module file below. 4517 break; 4518 4519 case ModuleManager::Missing: 4520 // The module file was missing; if the client can handle that, return 4521 // it. 4522 if (ClientLoadCapabilities & ARR_Missing) 4523 return Missing; 4524 4525 // Otherwise, return an error. 4526 Diag(diag::err_ast_file_not_found) 4527 << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty() 4528 << ErrorStr; 4529 return Failure; 4530 4531 case ModuleManager::OutOfDate: 4532 // We couldn't load the module file because it is out-of-date. If the 4533 // client can handle out-of-date, return it. 4534 if (ClientLoadCapabilities & ARR_OutOfDate) 4535 return OutOfDate; 4536 4537 // Otherwise, return an error. 4538 Diag(diag::err_ast_file_out_of_date) 4539 << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty() 4540 << ErrorStr; 4541 return Failure; 4542 } 4543 4544 assert(M && "Missing module file"); 4545 4546 bool ShouldFinalizePCM = false; 4547 auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() { 4548 auto &MC = getModuleManager().getModuleCache(); 4549 if (ShouldFinalizePCM) 4550 MC.finalizePCM(FileName); 4551 else 4552 MC.tryToDropPCM(FileName); 4553 }); 4554 ModuleFile &F = *M; 4555 BitstreamCursor &Stream = F.Stream; 4556 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer)); 4557 F.SizeInBits = F.Buffer->getBufferSize() * 8; 4558 4559 // Sniff for the signature. 4560 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4561 Diag(diag::err_ast_file_invalid) 4562 << moduleKindForDiagnostic(Type) << FileName << std::move(Err); 4563 return Failure; 4564 } 4565 4566 // This is used for compatibility with older PCH formats. 4567 bool HaveReadControlBlock = false; 4568 while (true) { 4569 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4570 if (!MaybeEntry) { 4571 Error(MaybeEntry.takeError()); 4572 return Failure; 4573 } 4574 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4575 4576 switch (Entry.Kind) { 4577 case llvm::BitstreamEntry::Error: 4578 case llvm::BitstreamEntry::Record: 4579 case llvm::BitstreamEntry::EndBlock: 4580 Error("invalid record at top-level of AST file"); 4581 return Failure; 4582 4583 case llvm::BitstreamEntry::SubBlock: 4584 break; 4585 } 4586 4587 switch (Entry.ID) { 4588 case CONTROL_BLOCK_ID: 4589 HaveReadControlBlock = true; 4590 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) { 4591 case Success: 4592 // Check that we didn't try to load a non-module AST file as a module. 4593 // 4594 // FIXME: Should we also perform the converse check? Loading a module as 4595 // a PCH file sort of works, but it's a bit wonky. 4596 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule || 4597 Type == MK_PrebuiltModule) && 4598 F.ModuleName.empty()) { 4599 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure; 4600 if (Result != OutOfDate || 4601 (ClientLoadCapabilities & ARR_OutOfDate) == 0) 4602 Diag(diag::err_module_file_not_module) << FileName; 4603 return Result; 4604 } 4605 break; 4606 4607 case Failure: return Failure; 4608 case Missing: return Missing; 4609 case OutOfDate: return OutOfDate; 4610 case VersionMismatch: return VersionMismatch; 4611 case ConfigurationMismatch: return ConfigurationMismatch; 4612 case HadErrors: return HadErrors; 4613 } 4614 break; 4615 4616 case AST_BLOCK_ID: 4617 if (!HaveReadControlBlock) { 4618 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 4619 Diag(diag::err_pch_version_too_old); 4620 return VersionMismatch; 4621 } 4622 4623 // Record that we've loaded this module. 4624 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 4625 ShouldFinalizePCM = true; 4626 return Success; 4627 4628 case UNHASHED_CONTROL_BLOCK_ID: 4629 // This block is handled using look-ahead during ReadControlBlock. We 4630 // shouldn't get here! 4631 Error("malformed block record in AST file"); 4632 return Failure; 4633 4634 default: 4635 if (llvm::Error Err = Stream.SkipBlock()) { 4636 Error(std::move(Err)); 4637 return Failure; 4638 } 4639 break; 4640 } 4641 } 4642 4643 llvm_unreachable("unexpected break; expected return"); 4644 } 4645 4646 ASTReader::ASTReadResult 4647 ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy, 4648 unsigned ClientLoadCapabilities) { 4649 const HeaderSearchOptions &HSOpts = 4650 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 4651 bool AllowCompatibleConfigurationMismatch = 4652 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 4653 bool DisableValidation = shouldDisableValidationForFile(F); 4654 4655 ASTReadResult Result = readUnhashedControlBlockImpl( 4656 &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch, 4657 Listener.get(), 4658 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions); 4659 4660 // If F was directly imported by another module, it's implicitly validated by 4661 // the importing module. 4662 if (DisableValidation || WasImportedBy || 4663 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 4664 return Success; 4665 4666 if (Result == Failure) { 4667 Error("malformed block record in AST file"); 4668 return Failure; 4669 } 4670 4671 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) { 4672 // If this module has already been finalized in the ModuleCache, we're stuck 4673 // with it; we can only load a single version of each module. 4674 // 4675 // This can happen when a module is imported in two contexts: in one, as a 4676 // user module; in another, as a system module (due to an import from 4677 // another module marked with the [system] flag). It usually indicates a 4678 // bug in the module map: this module should also be marked with [system]. 4679 // 4680 // If -Wno-system-headers (the default), and the first import is as a 4681 // system module, then validation will fail during the as-user import, 4682 // since -Werror flags won't have been validated. However, it's reasonable 4683 // to treat this consistently as a system module. 4684 // 4685 // If -Wsystem-headers, the PCM on disk was built with 4686 // -Wno-system-headers, and the first import is as a user module, then 4687 // validation will fail during the as-system import since the PCM on disk 4688 // doesn't guarantee that -Werror was respected. However, the -Werror 4689 // flags were checked during the initial as-user import. 4690 if (getModuleManager().getModuleCache().isPCMFinal(F.FileName)) { 4691 Diag(diag::warn_module_system_bit_conflict) << F.FileName; 4692 return Success; 4693 } 4694 } 4695 4696 return Result; 4697 } 4698 4699 ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl( 4700 ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities, 4701 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener, 4702 bool ValidateDiagnosticOptions) { 4703 // Initialize a stream. 4704 BitstreamCursor Stream(StreamData); 4705 4706 // Sniff for the signature. 4707 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4708 // FIXME this drops the error on the floor. 4709 consumeError(std::move(Err)); 4710 return Failure; 4711 } 4712 4713 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 4714 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 4715 return Failure; 4716 4717 // Read all of the records in the options block. 4718 RecordData Record; 4719 ASTReadResult Result = Success; 4720 while (true) { 4721 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4722 if (!MaybeEntry) { 4723 // FIXME this drops the error on the floor. 4724 consumeError(MaybeEntry.takeError()); 4725 return Failure; 4726 } 4727 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4728 4729 switch (Entry.Kind) { 4730 case llvm::BitstreamEntry::Error: 4731 case llvm::BitstreamEntry::SubBlock: 4732 return Failure; 4733 4734 case llvm::BitstreamEntry::EndBlock: 4735 return Result; 4736 4737 case llvm::BitstreamEntry::Record: 4738 // The interesting case. 4739 break; 4740 } 4741 4742 // Read and process a record. 4743 Record.clear(); 4744 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 4745 if (!MaybeRecordType) { 4746 // FIXME this drops the error. 4747 return Failure; 4748 } 4749 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) { 4750 case SIGNATURE: 4751 if (F) 4752 F->Signature = ASTFileSignature::create(Record.begin(), Record.end()); 4753 break; 4754 case AST_BLOCK_HASH: 4755 if (F) 4756 F->ASTBlockHash = 4757 ASTFileSignature::create(Record.begin(), Record.end()); 4758 break; 4759 case DIAGNOSTIC_OPTIONS: { 4760 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 4761 if (Listener && ValidateDiagnosticOptions && 4762 !AllowCompatibleConfigurationMismatch && 4763 ParseDiagnosticOptions(Record, Complain, *Listener)) 4764 Result = OutOfDate; // Don't return early. Read the signature. 4765 break; 4766 } 4767 case DIAG_PRAGMA_MAPPINGS: 4768 if (!F) 4769 break; 4770 if (F->PragmaDiagMappings.empty()) 4771 F->PragmaDiagMappings.swap(Record); 4772 else 4773 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(), 4774 Record.begin(), Record.end()); 4775 break; 4776 } 4777 } 4778 } 4779 4780 /// Parse a record and blob containing module file extension metadata. 4781 static bool parseModuleFileExtensionMetadata( 4782 const SmallVectorImpl<uint64_t> &Record, 4783 StringRef Blob, 4784 ModuleFileExtensionMetadata &Metadata) { 4785 if (Record.size() < 4) return true; 4786 4787 Metadata.MajorVersion = Record[0]; 4788 Metadata.MinorVersion = Record[1]; 4789 4790 unsigned BlockNameLen = Record[2]; 4791 unsigned UserInfoLen = Record[3]; 4792 4793 if (BlockNameLen + UserInfoLen > Blob.size()) return true; 4794 4795 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen); 4796 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen, 4797 Blob.data() + BlockNameLen + UserInfoLen); 4798 return false; 4799 } 4800 4801 ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) { 4802 BitstreamCursor &Stream = F.Stream; 4803 4804 RecordData Record; 4805 while (true) { 4806 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4807 if (!MaybeEntry) { 4808 Error(MaybeEntry.takeError()); 4809 return Failure; 4810 } 4811 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4812 4813 switch (Entry.Kind) { 4814 case llvm::BitstreamEntry::SubBlock: 4815 if (llvm::Error Err = Stream.SkipBlock()) { 4816 Error(std::move(Err)); 4817 return Failure; 4818 } 4819 continue; 4820 4821 case llvm::BitstreamEntry::EndBlock: 4822 return Success; 4823 4824 case llvm::BitstreamEntry::Error: 4825 return HadErrors; 4826 4827 case llvm::BitstreamEntry::Record: 4828 break; 4829 } 4830 4831 Record.clear(); 4832 StringRef Blob; 4833 Expected<unsigned> MaybeRecCode = 4834 Stream.readRecord(Entry.ID, Record, &Blob); 4835 if (!MaybeRecCode) { 4836 Error(MaybeRecCode.takeError()); 4837 return Failure; 4838 } 4839 switch (MaybeRecCode.get()) { 4840 case EXTENSION_METADATA: { 4841 ModuleFileExtensionMetadata Metadata; 4842 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) { 4843 Error("malformed EXTENSION_METADATA in AST file"); 4844 return Failure; 4845 } 4846 4847 // Find a module file extension with this block name. 4848 auto Known = ModuleFileExtensions.find(Metadata.BlockName); 4849 if (Known == ModuleFileExtensions.end()) break; 4850 4851 // Form a reader. 4852 if (auto Reader = Known->second->createExtensionReader(Metadata, *this, 4853 F, Stream)) { 4854 F.ExtensionReaders.push_back(std::move(Reader)); 4855 } 4856 4857 break; 4858 } 4859 } 4860 } 4861 4862 return Success; 4863 } 4864 4865 void ASTReader::InitializeContext() { 4866 assert(ContextObj && "no context to initialize"); 4867 ASTContext &Context = *ContextObj; 4868 4869 // If there's a listener, notify them that we "read" the translation unit. 4870 if (DeserializationListener) 4871 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 4872 Context.getTranslationUnitDecl()); 4873 4874 // FIXME: Find a better way to deal with collisions between these 4875 // built-in types. Right now, we just ignore the problem. 4876 4877 // Load the special types. 4878 if (SpecialTypes.size() >= NumSpecialTypeIDs) { 4879 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 4880 if (!Context.CFConstantStringTypeDecl) 4881 Context.setCFConstantStringType(GetType(String)); 4882 } 4883 4884 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 4885 QualType FileType = GetType(File); 4886 if (FileType.isNull()) { 4887 Error("FILE type is NULL"); 4888 return; 4889 } 4890 4891 if (!Context.FILEDecl) { 4892 if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 4893 Context.setFILEDecl(Typedef->getDecl()); 4894 else { 4895 const TagType *Tag = FileType->getAs<TagType>(); 4896 if (!Tag) { 4897 Error("Invalid FILE type in AST file"); 4898 return; 4899 } 4900 Context.setFILEDecl(Tag->getDecl()); 4901 } 4902 } 4903 } 4904 4905 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 4906 QualType Jmp_bufType = GetType(Jmp_buf); 4907 if (Jmp_bufType.isNull()) { 4908 Error("jmp_buf type is NULL"); 4909 return; 4910 } 4911 4912 if (!Context.jmp_bufDecl) { 4913 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 4914 Context.setjmp_bufDecl(Typedef->getDecl()); 4915 else { 4916 const TagType *Tag = Jmp_bufType->getAs<TagType>(); 4917 if (!Tag) { 4918 Error("Invalid jmp_buf type in AST file"); 4919 return; 4920 } 4921 Context.setjmp_bufDecl(Tag->getDecl()); 4922 } 4923 } 4924 } 4925 4926 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 4927 QualType Sigjmp_bufType = GetType(Sigjmp_buf); 4928 if (Sigjmp_bufType.isNull()) { 4929 Error("sigjmp_buf type is NULL"); 4930 return; 4931 } 4932 4933 if (!Context.sigjmp_bufDecl) { 4934 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 4935 Context.setsigjmp_bufDecl(Typedef->getDecl()); 4936 else { 4937 const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 4938 assert(Tag && "Invalid sigjmp_buf type in AST file"); 4939 Context.setsigjmp_bufDecl(Tag->getDecl()); 4940 } 4941 } 4942 } 4943 4944 if (unsigned ObjCIdRedef 4945 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 4946 if (Context.ObjCIdRedefinitionType.isNull()) 4947 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 4948 } 4949 4950 if (unsigned ObjCClassRedef 4951 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 4952 if (Context.ObjCClassRedefinitionType.isNull()) 4953 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 4954 } 4955 4956 if (unsigned ObjCSelRedef 4957 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 4958 if (Context.ObjCSelRedefinitionType.isNull()) 4959 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 4960 } 4961 4962 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 4963 QualType Ucontext_tType = GetType(Ucontext_t); 4964 if (Ucontext_tType.isNull()) { 4965 Error("ucontext_t type is NULL"); 4966 return; 4967 } 4968 4969 if (!Context.ucontext_tDecl) { 4970 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 4971 Context.setucontext_tDecl(Typedef->getDecl()); 4972 else { 4973 const TagType *Tag = Ucontext_tType->getAs<TagType>(); 4974 assert(Tag && "Invalid ucontext_t type in AST file"); 4975 Context.setucontext_tDecl(Tag->getDecl()); 4976 } 4977 } 4978 } 4979 } 4980 4981 ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 4982 4983 // If there were any CUDA special declarations, deserialize them. 4984 if (!CUDASpecialDeclRefs.empty()) { 4985 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 4986 Context.setcudaConfigureCallDecl( 4987 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 4988 } 4989 4990 // Re-export any modules that were imported by a non-module AST file. 4991 // FIXME: This does not make macro-only imports visible again. 4992 for (auto &Import : ImportedModules) { 4993 if (Module *Imported = getSubmodule(Import.ID)) { 4994 makeModuleVisible(Imported, Module::AllVisible, 4995 /*ImportLoc=*/Import.ImportLoc); 4996 if (Import.ImportLoc.isValid()) 4997 PP.makeModuleVisible(Imported, Import.ImportLoc); 4998 // This updates visibility for Preprocessor only. For Sema, which can be 4999 // nullptr here, we do the same later, in UpdateSema(). 5000 } 5001 } 5002 } 5003 5004 void ASTReader::finalizeForWriting() { 5005 // Nothing to do for now. 5006 } 5007 5008 /// Reads and return the signature record from \p PCH's control block, or 5009 /// else returns 0. 5010 static ASTFileSignature readASTFileSignature(StringRef PCH) { 5011 BitstreamCursor Stream(PCH); 5012 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5013 // FIXME this drops the error on the floor. 5014 consumeError(std::move(Err)); 5015 return ASTFileSignature(); 5016 } 5017 5018 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 5019 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 5020 return ASTFileSignature(); 5021 5022 // Scan for SIGNATURE inside the diagnostic options block. 5023 ASTReader::RecordData Record; 5024 while (true) { 5025 Expected<llvm::BitstreamEntry> MaybeEntry = 5026 Stream.advanceSkippingSubblocks(); 5027 if (!MaybeEntry) { 5028 // FIXME this drops the error on the floor. 5029 consumeError(MaybeEntry.takeError()); 5030 return ASTFileSignature(); 5031 } 5032 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5033 5034 if (Entry.Kind != llvm::BitstreamEntry::Record) 5035 return ASTFileSignature(); 5036 5037 Record.clear(); 5038 StringRef Blob; 5039 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5040 if (!MaybeRecord) { 5041 // FIXME this drops the error on the floor. 5042 consumeError(MaybeRecord.takeError()); 5043 return ASTFileSignature(); 5044 } 5045 if (SIGNATURE == MaybeRecord.get()) 5046 return ASTFileSignature::create(Record.begin(), 5047 Record.begin() + ASTFileSignature::size); 5048 } 5049 } 5050 5051 /// Retrieve the name of the original source file name 5052 /// directly from the AST file, without actually loading the AST 5053 /// file. 5054 std::string ASTReader::getOriginalSourceFile( 5055 const std::string &ASTFileName, FileManager &FileMgr, 5056 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) { 5057 // Open the AST file. 5058 auto Buffer = FileMgr.getBufferForFile(ASTFileName); 5059 if (!Buffer) { 5060 Diags.Report(diag::err_fe_unable_to_read_pch_file) 5061 << ASTFileName << Buffer.getError().message(); 5062 return std::string(); 5063 } 5064 5065 // Initialize the stream 5066 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer)); 5067 5068 // Sniff for the signature. 5069 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5070 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err); 5071 return std::string(); 5072 } 5073 5074 // Scan for the CONTROL_BLOCK_ID block. 5075 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 5076 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5077 return std::string(); 5078 } 5079 5080 // Scan for ORIGINAL_FILE inside the control block. 5081 RecordData Record; 5082 while (true) { 5083 Expected<llvm::BitstreamEntry> MaybeEntry = 5084 Stream.advanceSkippingSubblocks(); 5085 if (!MaybeEntry) { 5086 // FIXME this drops errors on the floor. 5087 consumeError(MaybeEntry.takeError()); 5088 return std::string(); 5089 } 5090 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5091 5092 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 5093 return std::string(); 5094 5095 if (Entry.Kind != llvm::BitstreamEntry::Record) { 5096 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5097 return std::string(); 5098 } 5099 5100 Record.clear(); 5101 StringRef Blob; 5102 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5103 if (!MaybeRecord) { 5104 // FIXME this drops the errors on the floor. 5105 consumeError(MaybeRecord.takeError()); 5106 return std::string(); 5107 } 5108 if (ORIGINAL_FILE == MaybeRecord.get()) 5109 return Blob.str(); 5110 } 5111 } 5112 5113 namespace { 5114 5115 class SimplePCHValidator : public ASTReaderListener { 5116 const LangOptions &ExistingLangOpts; 5117 const TargetOptions &ExistingTargetOpts; 5118 const PreprocessorOptions &ExistingPPOpts; 5119 std::string ExistingModuleCachePath; 5120 FileManager &FileMgr; 5121 5122 public: 5123 SimplePCHValidator(const LangOptions &ExistingLangOpts, 5124 const TargetOptions &ExistingTargetOpts, 5125 const PreprocessorOptions &ExistingPPOpts, 5126 StringRef ExistingModuleCachePath, FileManager &FileMgr) 5127 : ExistingLangOpts(ExistingLangOpts), 5128 ExistingTargetOpts(ExistingTargetOpts), 5129 ExistingPPOpts(ExistingPPOpts), 5130 ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr) {} 5131 5132 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, 5133 bool AllowCompatibleDifferences) override { 5134 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr, 5135 AllowCompatibleDifferences); 5136 } 5137 5138 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, 5139 bool AllowCompatibleDifferences) override { 5140 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr, 5141 AllowCompatibleDifferences); 5142 } 5143 5144 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 5145 StringRef SpecificModuleCachePath, 5146 bool Complain) override { 5147 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5148 ExistingModuleCachePath, nullptr, 5149 ExistingLangOpts, ExistingPPOpts); 5150 } 5151 5152 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 5153 bool Complain, 5154 std::string &SuggestedPredefines) override { 5155 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr, 5156 SuggestedPredefines, ExistingLangOpts); 5157 } 5158 }; 5159 5160 } // namespace 5161 5162 bool ASTReader::readASTFileControlBlock( 5163 StringRef Filename, FileManager &FileMgr, 5164 const PCHContainerReader &PCHContainerRdr, 5165 bool FindModuleFileExtensions, 5166 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) { 5167 // Open the AST file. 5168 // FIXME: This allows use of the VFS; we do not allow use of the 5169 // VFS when actually loading a module. 5170 auto Buffer = FileMgr.getBufferForFile(Filename); 5171 if (!Buffer) { 5172 return true; 5173 } 5174 5175 // Initialize the stream 5176 StringRef Bytes = PCHContainerRdr.ExtractPCH(**Buffer); 5177 BitstreamCursor Stream(Bytes); 5178 5179 // Sniff for the signature. 5180 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5181 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 5182 return true; 5183 } 5184 5185 // Scan for the CONTROL_BLOCK_ID block. 5186 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 5187 return true; 5188 5189 bool NeedsInputFiles = Listener.needsInputFileVisitation(); 5190 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation(); 5191 bool NeedsImports = Listener.needsImportVisitation(); 5192 BitstreamCursor InputFilesCursor; 5193 5194 RecordData Record; 5195 std::string ModuleDir; 5196 bool DoneWithControlBlock = false; 5197 while (!DoneWithControlBlock) { 5198 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5199 if (!MaybeEntry) { 5200 // FIXME this drops the error on the floor. 5201 consumeError(MaybeEntry.takeError()); 5202 return true; 5203 } 5204 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5205 5206 switch (Entry.Kind) { 5207 case llvm::BitstreamEntry::SubBlock: { 5208 switch (Entry.ID) { 5209 case OPTIONS_BLOCK_ID: { 5210 std::string IgnoredSuggestedPredefines; 5211 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate, 5212 /*AllowCompatibleConfigurationMismatch*/ false, 5213 Listener, IgnoredSuggestedPredefines) != Success) 5214 return true; 5215 break; 5216 } 5217 5218 case INPUT_FILES_BLOCK_ID: 5219 InputFilesCursor = Stream; 5220 if (llvm::Error Err = Stream.SkipBlock()) { 5221 // FIXME this drops the error on the floor. 5222 consumeError(std::move(Err)); 5223 return true; 5224 } 5225 if (NeedsInputFiles && 5226 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID)) 5227 return true; 5228 break; 5229 5230 default: 5231 if (llvm::Error Err = Stream.SkipBlock()) { 5232 // FIXME this drops the error on the floor. 5233 consumeError(std::move(Err)); 5234 return true; 5235 } 5236 break; 5237 } 5238 5239 continue; 5240 } 5241 5242 case llvm::BitstreamEntry::EndBlock: 5243 DoneWithControlBlock = true; 5244 break; 5245 5246 case llvm::BitstreamEntry::Error: 5247 return true; 5248 5249 case llvm::BitstreamEntry::Record: 5250 break; 5251 } 5252 5253 if (DoneWithControlBlock) break; 5254 5255 Record.clear(); 5256 StringRef Blob; 5257 Expected<unsigned> MaybeRecCode = 5258 Stream.readRecord(Entry.ID, Record, &Blob); 5259 if (!MaybeRecCode) { 5260 // FIXME this drops the error. 5261 return Failure; 5262 } 5263 switch ((ControlRecordTypes)MaybeRecCode.get()) { 5264 case METADATA: 5265 if (Record[0] != VERSION_MAJOR) 5266 return true; 5267 if (Listener.ReadFullVersionInformation(Blob)) 5268 return true; 5269 break; 5270 case MODULE_NAME: 5271 Listener.ReadModuleName(Blob); 5272 break; 5273 case MODULE_DIRECTORY: 5274 ModuleDir = std::string(Blob); 5275 break; 5276 case MODULE_MAP_FILE: { 5277 unsigned Idx = 0; 5278 auto Path = ReadString(Record, Idx); 5279 ResolveImportedPath(Path, ModuleDir); 5280 Listener.ReadModuleMapFile(Path); 5281 break; 5282 } 5283 case INPUT_FILE_OFFSETS: { 5284 if (!NeedsInputFiles) 5285 break; 5286 5287 unsigned NumInputFiles = Record[0]; 5288 unsigned NumUserFiles = Record[1]; 5289 const llvm::support::unaligned_uint64_t *InputFileOffs = 5290 (const llvm::support::unaligned_uint64_t *)Blob.data(); 5291 for (unsigned I = 0; I != NumInputFiles; ++I) { 5292 // Go find this input file. 5293 bool isSystemFile = I >= NumUserFiles; 5294 5295 if (isSystemFile && !NeedsSystemInputFiles) 5296 break; // the rest are system input files 5297 5298 BitstreamCursor &Cursor = InputFilesCursor; 5299 SavedStreamPosition SavedPosition(Cursor); 5300 if (llvm::Error Err = Cursor.JumpToBit(InputFileOffs[I])) { 5301 // FIXME this drops errors on the floor. 5302 consumeError(std::move(Err)); 5303 } 5304 5305 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 5306 if (!MaybeCode) { 5307 // FIXME this drops errors on the floor. 5308 consumeError(MaybeCode.takeError()); 5309 } 5310 unsigned Code = MaybeCode.get(); 5311 5312 RecordData Record; 5313 StringRef Blob; 5314 bool shouldContinue = false; 5315 Expected<unsigned> MaybeRecordType = 5316 Cursor.readRecord(Code, Record, &Blob); 5317 if (!MaybeRecordType) { 5318 // FIXME this drops errors on the floor. 5319 consumeError(MaybeRecordType.takeError()); 5320 } 5321 switch ((InputFileRecordTypes)MaybeRecordType.get()) { 5322 case INPUT_FILE_HASH: 5323 break; 5324 case INPUT_FILE: 5325 bool Overridden = static_cast<bool>(Record[3]); 5326 std::string Filename = std::string(Blob); 5327 ResolveImportedPath(Filename, ModuleDir); 5328 shouldContinue = Listener.visitInputFile( 5329 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false); 5330 break; 5331 } 5332 if (!shouldContinue) 5333 break; 5334 } 5335 break; 5336 } 5337 5338 case IMPORTS: { 5339 if (!NeedsImports) 5340 break; 5341 5342 unsigned Idx = 0, N = Record.size(); 5343 while (Idx < N) { 5344 // Read information about the AST file. 5345 Idx += 5346 1 + 1 + 1 + 1 + 5347 ASTFileSignature::size; // Kind, ImportLoc, Size, ModTime, Signature 5348 std::string ModuleName = ReadString(Record, Idx); 5349 std::string Filename = ReadString(Record, Idx); 5350 ResolveImportedPath(Filename, ModuleDir); 5351 Listener.visitImport(ModuleName, Filename); 5352 } 5353 break; 5354 } 5355 5356 default: 5357 // No other validation to perform. 5358 break; 5359 } 5360 } 5361 5362 // Look for module file extension blocks, if requested. 5363 if (FindModuleFileExtensions) { 5364 BitstreamCursor SavedStream = Stream; 5365 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) { 5366 bool DoneWithExtensionBlock = false; 5367 while (!DoneWithExtensionBlock) { 5368 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5369 if (!MaybeEntry) { 5370 // FIXME this drops the error. 5371 return true; 5372 } 5373 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5374 5375 switch (Entry.Kind) { 5376 case llvm::BitstreamEntry::SubBlock: 5377 if (llvm::Error Err = Stream.SkipBlock()) { 5378 // FIXME this drops the error on the floor. 5379 consumeError(std::move(Err)); 5380 return true; 5381 } 5382 continue; 5383 5384 case llvm::BitstreamEntry::EndBlock: 5385 DoneWithExtensionBlock = true; 5386 continue; 5387 5388 case llvm::BitstreamEntry::Error: 5389 return true; 5390 5391 case llvm::BitstreamEntry::Record: 5392 break; 5393 } 5394 5395 Record.clear(); 5396 StringRef Blob; 5397 Expected<unsigned> MaybeRecCode = 5398 Stream.readRecord(Entry.ID, Record, &Blob); 5399 if (!MaybeRecCode) { 5400 // FIXME this drops the error. 5401 return true; 5402 } 5403 switch (MaybeRecCode.get()) { 5404 case EXTENSION_METADATA: { 5405 ModuleFileExtensionMetadata Metadata; 5406 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 5407 return true; 5408 5409 Listener.readModuleFileExtension(Metadata); 5410 break; 5411 } 5412 } 5413 } 5414 } 5415 Stream = SavedStream; 5416 } 5417 5418 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 5419 if (readUnhashedControlBlockImpl( 5420 nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate, 5421 /*AllowCompatibleConfigurationMismatch*/ false, &Listener, 5422 ValidateDiagnosticOptions) != Success) 5423 return true; 5424 5425 return false; 5426 } 5427 5428 bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, 5429 const PCHContainerReader &PCHContainerRdr, 5430 const LangOptions &LangOpts, 5431 const TargetOptions &TargetOpts, 5432 const PreprocessorOptions &PPOpts, 5433 StringRef ExistingModuleCachePath) { 5434 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, 5435 ExistingModuleCachePath, FileMgr); 5436 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr, 5437 /*FindModuleFileExtensions=*/false, 5438 validator, 5439 /*ValidateDiagnosticOptions=*/true); 5440 } 5441 5442 ASTReader::ASTReadResult 5443 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 5444 // Enter the submodule block. 5445 if (llvm::Error Err = F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) { 5446 Error(std::move(Err)); 5447 return Failure; 5448 } 5449 5450 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 5451 bool First = true; 5452 Module *CurrentModule = nullptr; 5453 RecordData Record; 5454 while (true) { 5455 Expected<llvm::BitstreamEntry> MaybeEntry = 5456 F.Stream.advanceSkippingSubblocks(); 5457 if (!MaybeEntry) { 5458 Error(MaybeEntry.takeError()); 5459 return Failure; 5460 } 5461 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5462 5463 switch (Entry.Kind) { 5464 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 5465 case llvm::BitstreamEntry::Error: 5466 Error("malformed block record in AST file"); 5467 return Failure; 5468 case llvm::BitstreamEntry::EndBlock: 5469 return Success; 5470 case llvm::BitstreamEntry::Record: 5471 // The interesting case. 5472 break; 5473 } 5474 5475 // Read a record. 5476 StringRef Blob; 5477 Record.clear(); 5478 Expected<unsigned> MaybeKind = F.Stream.readRecord(Entry.ID, Record, &Blob); 5479 if (!MaybeKind) { 5480 Error(MaybeKind.takeError()); 5481 return Failure; 5482 } 5483 unsigned Kind = MaybeKind.get(); 5484 5485 if ((Kind == SUBMODULE_METADATA) != First) { 5486 Error("submodule metadata record should be at beginning of block"); 5487 return Failure; 5488 } 5489 First = false; 5490 5491 // Submodule information is only valid if we have a current module. 5492 // FIXME: Should we error on these cases? 5493 if (!CurrentModule && Kind != SUBMODULE_METADATA && 5494 Kind != SUBMODULE_DEFINITION) 5495 continue; 5496 5497 switch (Kind) { 5498 default: // Default behavior: ignore. 5499 break; 5500 5501 case SUBMODULE_DEFINITION: { 5502 if (Record.size() < 12) { 5503 Error("malformed module definition"); 5504 return Failure; 5505 } 5506 5507 StringRef Name = Blob; 5508 unsigned Idx = 0; 5509 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]); 5510 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]); 5511 Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++]; 5512 bool IsFramework = Record[Idx++]; 5513 bool IsExplicit = Record[Idx++]; 5514 bool IsSystem = Record[Idx++]; 5515 bool IsExternC = Record[Idx++]; 5516 bool InferSubmodules = Record[Idx++]; 5517 bool InferExplicitSubmodules = Record[Idx++]; 5518 bool InferExportWildcard = Record[Idx++]; 5519 bool ConfigMacrosExhaustive = Record[Idx++]; 5520 bool ModuleMapIsPrivate = Record[Idx++]; 5521 5522 Module *ParentModule = nullptr; 5523 if (Parent) 5524 ParentModule = getSubmodule(Parent); 5525 5526 // Retrieve this (sub)module from the module map, creating it if 5527 // necessary. 5528 CurrentModule = 5529 ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit) 5530 .first; 5531 5532 // FIXME: set the definition loc for CurrentModule, or call 5533 // ModMap.setInferredModuleAllowedBy() 5534 5535 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 5536 if (GlobalIndex >= SubmodulesLoaded.size() || 5537 SubmodulesLoaded[GlobalIndex]) { 5538 Error("too many submodules"); 5539 return Failure; 5540 } 5541 5542 if (!ParentModule) { 5543 if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 5544 // Don't emit module relocation error if we have -fno-validate-pch 5545 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 5546 DisableValidationForModuleKind::Module) && 5547 CurFile != F.File) { 5548 Error(diag::err_module_file_conflict, 5549 CurrentModule->getTopLevelModuleName(), CurFile->getName(), 5550 F.File->getName()); 5551 return Failure; 5552 } 5553 } 5554 5555 F.DidReadTopLevelSubmodule = true; 5556 CurrentModule->setASTFile(F.File); 5557 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath; 5558 } 5559 5560 CurrentModule->Kind = Kind; 5561 CurrentModule->Signature = F.Signature; 5562 CurrentModule->IsFromModuleFile = true; 5563 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 5564 CurrentModule->IsExternC = IsExternC; 5565 CurrentModule->InferSubmodules = InferSubmodules; 5566 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 5567 CurrentModule->InferExportWildcard = InferExportWildcard; 5568 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive; 5569 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate; 5570 if (DeserializationListener) 5571 DeserializationListener->ModuleRead(GlobalID, CurrentModule); 5572 5573 SubmodulesLoaded[GlobalIndex] = CurrentModule; 5574 5575 // Clear out data that will be replaced by what is in the module file. 5576 CurrentModule->LinkLibraries.clear(); 5577 CurrentModule->ConfigMacros.clear(); 5578 CurrentModule->UnresolvedConflicts.clear(); 5579 CurrentModule->Conflicts.clear(); 5580 5581 // The module is available unless it's missing a requirement; relevant 5582 // requirements will be (re-)added by SUBMODULE_REQUIRES records. 5583 // Missing headers that were present when the module was built do not 5584 // make it unavailable -- if we got this far, this must be an explicitly 5585 // imported module file. 5586 CurrentModule->Requirements.clear(); 5587 CurrentModule->MissingHeaders.clear(); 5588 CurrentModule->IsUnimportable = 5589 ParentModule && ParentModule->IsUnimportable; 5590 CurrentModule->IsAvailable = !CurrentModule->IsUnimportable; 5591 break; 5592 } 5593 5594 case SUBMODULE_UMBRELLA_HEADER: { 5595 // FIXME: This doesn't work for framework modules as `Filename` is the 5596 // name as written in the module file and does not include 5597 // `Headers/`, so this path will never exist. 5598 std::string Filename = std::string(Blob); 5599 ResolveImportedPath(F, Filename); 5600 if (auto Umbrella = PP.getFileManager().getFile(Filename)) { 5601 if (!CurrentModule->getUmbrellaHeader()) { 5602 // FIXME: NameAsWritten 5603 ModMap.setUmbrellaHeader(CurrentModule, *Umbrella, Blob, ""); 5604 } 5605 // Note that it's too late at this point to return out of date if the 5606 // name from the PCM doesn't match up with the one in the module map, 5607 // but also quite unlikely since we will have already checked the 5608 // modification time and size of the module map file itself. 5609 } 5610 break; 5611 } 5612 5613 case SUBMODULE_HEADER: 5614 case SUBMODULE_EXCLUDED_HEADER: 5615 case SUBMODULE_PRIVATE_HEADER: 5616 // We lazily associate headers with their modules via the HeaderInfo table. 5617 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 5618 // of complete filenames or remove it entirely. 5619 break; 5620 5621 case SUBMODULE_TEXTUAL_HEADER: 5622 case SUBMODULE_PRIVATE_TEXTUAL_HEADER: 5623 // FIXME: Textual headers are not marked in the HeaderInfo table. Load 5624 // them here. 5625 break; 5626 5627 case SUBMODULE_TOPHEADER: 5628 CurrentModule->addTopHeaderFilename(Blob); 5629 break; 5630 5631 case SUBMODULE_UMBRELLA_DIR: { 5632 // See comments in SUBMODULE_UMBRELLA_HEADER 5633 std::string Dirname = std::string(Blob); 5634 ResolveImportedPath(F, Dirname); 5635 if (auto Umbrella = PP.getFileManager().getDirectory(Dirname)) { 5636 if (!CurrentModule->getUmbrellaDir()) { 5637 // FIXME: NameAsWritten 5638 ModMap.setUmbrellaDir(CurrentModule, *Umbrella, Blob, ""); 5639 } 5640 } 5641 break; 5642 } 5643 5644 case SUBMODULE_METADATA: { 5645 F.BaseSubmoduleID = getTotalNumSubmodules(); 5646 F.LocalNumSubmodules = Record[0]; 5647 unsigned LocalBaseSubmoduleID = Record[1]; 5648 if (F.LocalNumSubmodules > 0) { 5649 // Introduce the global -> local mapping for submodules within this 5650 // module. 5651 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 5652 5653 // Introduce the local -> global mapping for submodules within this 5654 // module. 5655 F.SubmoduleRemap.insertOrReplace( 5656 std::make_pair(LocalBaseSubmoduleID, 5657 F.BaseSubmoduleID - LocalBaseSubmoduleID)); 5658 5659 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 5660 } 5661 break; 5662 } 5663 5664 case SUBMODULE_IMPORTS: 5665 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 5666 UnresolvedModuleRef Unresolved; 5667 Unresolved.File = &F; 5668 Unresolved.Mod = CurrentModule; 5669 Unresolved.ID = Record[Idx]; 5670 Unresolved.Kind = UnresolvedModuleRef::Import; 5671 Unresolved.IsWildcard = false; 5672 UnresolvedModuleRefs.push_back(Unresolved); 5673 } 5674 break; 5675 5676 case SUBMODULE_EXPORTS: 5677 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 5678 UnresolvedModuleRef Unresolved; 5679 Unresolved.File = &F; 5680 Unresolved.Mod = CurrentModule; 5681 Unresolved.ID = Record[Idx]; 5682 Unresolved.Kind = UnresolvedModuleRef::Export; 5683 Unresolved.IsWildcard = Record[Idx + 1]; 5684 UnresolvedModuleRefs.push_back(Unresolved); 5685 } 5686 5687 // Once we've loaded the set of exports, there's no reason to keep 5688 // the parsed, unresolved exports around. 5689 CurrentModule->UnresolvedExports.clear(); 5690 break; 5691 5692 case SUBMODULE_REQUIRES: 5693 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(), 5694 PP.getTargetInfo()); 5695 break; 5696 5697 case SUBMODULE_LINK_LIBRARY: 5698 ModMap.resolveLinkAsDependencies(CurrentModule); 5699 CurrentModule->LinkLibraries.push_back( 5700 Module::LinkLibrary(std::string(Blob), Record[0])); 5701 break; 5702 5703 case SUBMODULE_CONFIG_MACRO: 5704 CurrentModule->ConfigMacros.push_back(Blob.str()); 5705 break; 5706 5707 case SUBMODULE_CONFLICT: { 5708 UnresolvedModuleRef Unresolved; 5709 Unresolved.File = &F; 5710 Unresolved.Mod = CurrentModule; 5711 Unresolved.ID = Record[0]; 5712 Unresolved.Kind = UnresolvedModuleRef::Conflict; 5713 Unresolved.IsWildcard = false; 5714 Unresolved.String = Blob; 5715 UnresolvedModuleRefs.push_back(Unresolved); 5716 break; 5717 } 5718 5719 case SUBMODULE_INITIALIZERS: { 5720 if (!ContextObj) 5721 break; 5722 SmallVector<uint32_t, 16> Inits; 5723 for (auto &ID : Record) 5724 Inits.push_back(getGlobalDeclID(F, ID)); 5725 ContextObj->addLazyModuleInitializers(CurrentModule, Inits); 5726 break; 5727 } 5728 5729 case SUBMODULE_EXPORT_AS: 5730 CurrentModule->ExportAsModule = Blob.str(); 5731 ModMap.addLinkAsDependency(CurrentModule); 5732 break; 5733 } 5734 } 5735 } 5736 5737 /// Parse the record that corresponds to a LangOptions data 5738 /// structure. 5739 /// 5740 /// This routine parses the language options from the AST file and then gives 5741 /// them to the AST listener if one is set. 5742 /// 5743 /// \returns true if the listener deems the file unacceptable, false otherwise. 5744 bool ASTReader::ParseLanguageOptions(const RecordData &Record, 5745 bool Complain, 5746 ASTReaderListener &Listener, 5747 bool AllowCompatibleDifferences) { 5748 LangOptions LangOpts; 5749 unsigned Idx = 0; 5750 #define LANGOPT(Name, Bits, Default, Description) \ 5751 LangOpts.Name = Record[Idx++]; 5752 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 5753 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 5754 #include "clang/Basic/LangOptions.def" 5755 #define SANITIZER(NAME, ID) \ 5756 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]); 5757 #include "clang/Basic/Sanitizers.def" 5758 5759 for (unsigned N = Record[Idx++]; N; --N) 5760 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx)); 5761 5762 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 5763 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 5764 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 5765 5766 LangOpts.CurrentModule = ReadString(Record, Idx); 5767 5768 // Comment options. 5769 for (unsigned N = Record[Idx++]; N; --N) { 5770 LangOpts.CommentOpts.BlockCommandNames.push_back( 5771 ReadString(Record, Idx)); 5772 } 5773 LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 5774 5775 // OpenMP offloading options. 5776 for (unsigned N = Record[Idx++]; N; --N) { 5777 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx))); 5778 } 5779 5780 LangOpts.OMPHostIRFile = ReadString(Record, Idx); 5781 5782 return Listener.ReadLanguageOptions(LangOpts, Complain, 5783 AllowCompatibleDifferences); 5784 } 5785 5786 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain, 5787 ASTReaderListener &Listener, 5788 bool AllowCompatibleDifferences) { 5789 unsigned Idx = 0; 5790 TargetOptions TargetOpts; 5791 TargetOpts.Triple = ReadString(Record, Idx); 5792 TargetOpts.CPU = ReadString(Record, Idx); 5793 TargetOpts.TuneCPU = ReadString(Record, Idx); 5794 TargetOpts.ABI = ReadString(Record, Idx); 5795 for (unsigned N = Record[Idx++]; N; --N) { 5796 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 5797 } 5798 for (unsigned N = Record[Idx++]; N; --N) { 5799 TargetOpts.Features.push_back(ReadString(Record, Idx)); 5800 } 5801 5802 return Listener.ReadTargetOptions(TargetOpts, Complain, 5803 AllowCompatibleDifferences); 5804 } 5805 5806 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 5807 ASTReaderListener &Listener) { 5808 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); 5809 unsigned Idx = 0; 5810 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++]; 5811 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 5812 DiagOpts->set##Name(static_cast<Type>(Record[Idx++])); 5813 #include "clang/Basic/DiagnosticOptions.def" 5814 5815 for (unsigned N = Record[Idx++]; N; --N) 5816 DiagOpts->Warnings.push_back(ReadString(Record, Idx)); 5817 for (unsigned N = Record[Idx++]; N; --N) 5818 DiagOpts->Remarks.push_back(ReadString(Record, Idx)); 5819 5820 return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 5821 } 5822 5823 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 5824 ASTReaderListener &Listener) { 5825 FileSystemOptions FSOpts; 5826 unsigned Idx = 0; 5827 FSOpts.WorkingDir = ReadString(Record, Idx); 5828 return Listener.ReadFileSystemOptions(FSOpts, Complain); 5829 } 5830 5831 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 5832 bool Complain, 5833 ASTReaderListener &Listener) { 5834 HeaderSearchOptions HSOpts; 5835 unsigned Idx = 0; 5836 HSOpts.Sysroot = ReadString(Record, Idx); 5837 5838 // Include entries. 5839 for (unsigned N = Record[Idx++]; N; --N) { 5840 std::string Path = ReadString(Record, Idx); 5841 frontend::IncludeDirGroup Group 5842 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 5843 bool IsFramework = Record[Idx++]; 5844 bool IgnoreSysRoot = Record[Idx++]; 5845 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework, 5846 IgnoreSysRoot); 5847 } 5848 5849 // System header prefixes. 5850 for (unsigned N = Record[Idx++]; N; --N) { 5851 std::string Prefix = ReadString(Record, Idx); 5852 bool IsSystemHeader = Record[Idx++]; 5853 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader); 5854 } 5855 5856 HSOpts.ResourceDir = ReadString(Record, Idx); 5857 HSOpts.ModuleCachePath = ReadString(Record, Idx); 5858 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx); 5859 HSOpts.DisableModuleHash = Record[Idx++]; 5860 HSOpts.ImplicitModuleMaps = Record[Idx++]; 5861 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++]; 5862 HSOpts.EnablePrebuiltImplicitModules = Record[Idx++]; 5863 HSOpts.UseBuiltinIncludes = Record[Idx++]; 5864 HSOpts.UseStandardSystemIncludes = Record[Idx++]; 5865 HSOpts.UseStandardCXXIncludes = Record[Idx++]; 5866 HSOpts.UseLibcxx = Record[Idx++]; 5867 std::string SpecificModuleCachePath = ReadString(Record, Idx); 5868 5869 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5870 Complain); 5871 } 5872 5873 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 5874 bool Complain, 5875 ASTReaderListener &Listener, 5876 std::string &SuggestedPredefines) { 5877 PreprocessorOptions PPOpts; 5878 unsigned Idx = 0; 5879 5880 // Macro definitions/undefs 5881 for (unsigned N = Record[Idx++]; N; --N) { 5882 std::string Macro = ReadString(Record, Idx); 5883 bool IsUndef = Record[Idx++]; 5884 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 5885 } 5886 5887 // Includes 5888 for (unsigned N = Record[Idx++]; N; --N) { 5889 PPOpts.Includes.push_back(ReadString(Record, Idx)); 5890 } 5891 5892 // Macro Includes 5893 for (unsigned N = Record[Idx++]; N; --N) { 5894 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 5895 } 5896 5897 PPOpts.UsePredefines = Record[Idx++]; 5898 PPOpts.DetailedRecord = Record[Idx++]; 5899 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 5900 PPOpts.ObjCXXARCStandardLibrary = 5901 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 5902 SuggestedPredefines.clear(); 5903 return Listener.ReadPreprocessorOptions(PPOpts, Complain, 5904 SuggestedPredefines); 5905 } 5906 5907 std::pair<ModuleFile *, unsigned> 5908 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 5909 GlobalPreprocessedEntityMapType::iterator 5910 I = GlobalPreprocessedEntityMap.find(GlobalIndex); 5911 assert(I != GlobalPreprocessedEntityMap.end() && 5912 "Corrupted global preprocessed entity map"); 5913 ModuleFile *M = I->second; 5914 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 5915 return std::make_pair(M, LocalIndex); 5916 } 5917 5918 llvm::iterator_range<PreprocessingRecord::iterator> 5919 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 5920 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 5921 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 5922 Mod.NumPreprocessedEntities); 5923 5924 return llvm::make_range(PreprocessingRecord::iterator(), 5925 PreprocessingRecord::iterator()); 5926 } 5927 5928 bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName, 5929 unsigned int ClientLoadCapabilities) { 5930 return ClientLoadCapabilities & ARR_OutOfDate && 5931 !getModuleManager().getModuleCache().isPCMFinal(ModuleFileName); 5932 } 5933 5934 llvm::iterator_range<ASTReader::ModuleDeclIterator> 5935 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 5936 return llvm::make_range( 5937 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 5938 ModuleDeclIterator(this, &Mod, 5939 Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 5940 } 5941 5942 SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) { 5943 auto I = GlobalSkippedRangeMap.find(GlobalIndex); 5944 assert(I != GlobalSkippedRangeMap.end() && 5945 "Corrupted global skipped range map"); 5946 ModuleFile *M = I->second; 5947 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID; 5948 assert(LocalIndex < M->NumPreprocessedSkippedRanges); 5949 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex]; 5950 SourceRange Range(TranslateSourceLocation(*M, RawRange.getBegin()), 5951 TranslateSourceLocation(*M, RawRange.getEnd())); 5952 assert(Range.isValid()); 5953 return Range; 5954 } 5955 5956 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 5957 PreprocessedEntityID PPID = Index+1; 5958 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 5959 ModuleFile &M = *PPInfo.first; 5960 unsigned LocalIndex = PPInfo.second; 5961 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 5962 5963 if (!PP.getPreprocessingRecord()) { 5964 Error("no preprocessing record"); 5965 return nullptr; 5966 } 5967 5968 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 5969 if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit( 5970 M.MacroOffsetsBase + PPOffs.BitOffset)) { 5971 Error(std::move(Err)); 5972 return nullptr; 5973 } 5974 5975 Expected<llvm::BitstreamEntry> MaybeEntry = 5976 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 5977 if (!MaybeEntry) { 5978 Error(MaybeEntry.takeError()); 5979 return nullptr; 5980 } 5981 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5982 5983 if (Entry.Kind != llvm::BitstreamEntry::Record) 5984 return nullptr; 5985 5986 // Read the record. 5987 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()), 5988 TranslateSourceLocation(M, PPOffs.getEnd())); 5989 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 5990 StringRef Blob; 5991 RecordData Record; 5992 Expected<unsigned> MaybeRecType = 5993 M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob); 5994 if (!MaybeRecType) { 5995 Error(MaybeRecType.takeError()); 5996 return nullptr; 5997 } 5998 switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) { 5999 case PPD_MACRO_EXPANSION: { 6000 bool isBuiltin = Record[0]; 6001 IdentifierInfo *Name = nullptr; 6002 MacroDefinitionRecord *Def = nullptr; 6003 if (isBuiltin) 6004 Name = getLocalIdentifier(M, Record[1]); 6005 else { 6006 PreprocessedEntityID GlobalID = 6007 getGlobalPreprocessedEntityID(M, Record[1]); 6008 Def = cast<MacroDefinitionRecord>( 6009 PPRec.getLoadedPreprocessedEntity(GlobalID - 1)); 6010 } 6011 6012 MacroExpansion *ME; 6013 if (isBuiltin) 6014 ME = new (PPRec) MacroExpansion(Name, Range); 6015 else 6016 ME = new (PPRec) MacroExpansion(Def, Range); 6017 6018 return ME; 6019 } 6020 6021 case PPD_MACRO_DEFINITION: { 6022 // Decode the identifier info and then check again; if the macro is 6023 // still defined and associated with the identifier, 6024 IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 6025 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range); 6026 6027 if (DeserializationListener) 6028 DeserializationListener->MacroDefinitionRead(PPID, MD); 6029 6030 return MD; 6031 } 6032 6033 case PPD_INCLUSION_DIRECTIVE: { 6034 const char *FullFileNameStart = Blob.data() + Record[0]; 6035 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 6036 const FileEntry *File = nullptr; 6037 if (!FullFileName.empty()) 6038 if (auto FE = PP.getFileManager().getFile(FullFileName)) 6039 File = *FE; 6040 6041 // FIXME: Stable encoding 6042 InclusionDirective::InclusionKind Kind 6043 = static_cast<InclusionDirective::InclusionKind>(Record[2]); 6044 InclusionDirective *ID 6045 = new (PPRec) InclusionDirective(PPRec, Kind, 6046 StringRef(Blob.data(), Record[0]), 6047 Record[1], Record[3], 6048 File, 6049 Range); 6050 return ID; 6051 } 6052 } 6053 6054 llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 6055 } 6056 6057 /// Find the next module that contains entities and return the ID 6058 /// of the first entry. 6059 /// 6060 /// \param SLocMapI points at a chunk of a module that contains no 6061 /// preprocessed entities or the entities it contains are not the ones we are 6062 /// looking for. 6063 PreprocessedEntityID ASTReader::findNextPreprocessedEntity( 6064 GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 6065 ++SLocMapI; 6066 for (GlobalSLocOffsetMapType::const_iterator 6067 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 6068 ModuleFile &M = *SLocMapI->second; 6069 if (M.NumPreprocessedEntities) 6070 return M.BasePreprocessedEntityID; 6071 } 6072 6073 return getTotalNumPreprocessedEntities(); 6074 } 6075 6076 namespace { 6077 6078 struct PPEntityComp { 6079 const ASTReader &Reader; 6080 ModuleFile &M; 6081 6082 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {} 6083 6084 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 6085 SourceLocation LHS = getLoc(L); 6086 SourceLocation RHS = getLoc(R); 6087 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6088 } 6089 6090 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 6091 SourceLocation LHS = getLoc(L); 6092 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6093 } 6094 6095 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 6096 SourceLocation RHS = getLoc(R); 6097 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6098 } 6099 6100 SourceLocation getLoc(const PPEntityOffset &PPE) const { 6101 return Reader.TranslateSourceLocation(M, PPE.getBegin()); 6102 } 6103 }; 6104 6105 } // namespace 6106 6107 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc, 6108 bool EndsAfter) const { 6109 if (SourceMgr.isLocalSourceLocation(Loc)) 6110 return getTotalNumPreprocessedEntities(); 6111 6112 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find( 6113 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1); 6114 assert(SLocMapI != GlobalSLocOffsetMap.end() && 6115 "Corrupted global sloc offset map"); 6116 6117 if (SLocMapI->second->NumPreprocessedEntities == 0) 6118 return findNextPreprocessedEntity(SLocMapI); 6119 6120 ModuleFile &M = *SLocMapI->second; 6121 6122 using pp_iterator = const PPEntityOffset *; 6123 6124 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 6125 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 6126 6127 size_t Count = M.NumPreprocessedEntities; 6128 size_t Half; 6129 pp_iterator First = pp_begin; 6130 pp_iterator PPI; 6131 6132 if (EndsAfter) { 6133 PPI = std::upper_bound(pp_begin, pp_end, Loc, 6134 PPEntityComp(*this, M)); 6135 } else { 6136 // Do a binary search manually instead of using std::lower_bound because 6137 // The end locations of entities may be unordered (when a macro expansion 6138 // is inside another macro argument), but for this case it is not important 6139 // whether we get the first macro expansion or its containing macro. 6140 while (Count > 0) { 6141 Half = Count / 2; 6142 PPI = First; 6143 std::advance(PPI, Half); 6144 if (SourceMgr.isBeforeInTranslationUnit( 6145 TranslateSourceLocation(M, PPI->getEnd()), Loc)) { 6146 First = PPI; 6147 ++First; 6148 Count = Count - Half - 1; 6149 } else 6150 Count = Half; 6151 } 6152 } 6153 6154 if (PPI == pp_end) 6155 return findNextPreprocessedEntity(SLocMapI); 6156 6157 return M.BasePreprocessedEntityID + (PPI - pp_begin); 6158 } 6159 6160 /// Returns a pair of [Begin, End) indices of preallocated 6161 /// preprocessed entities that \arg Range encompasses. 6162 std::pair<unsigned, unsigned> 6163 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 6164 if (Range.isInvalid()) 6165 return std::make_pair(0,0); 6166 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 6167 6168 PreprocessedEntityID BeginID = 6169 findPreprocessedEntity(Range.getBegin(), false); 6170 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true); 6171 return std::make_pair(BeginID, EndID); 6172 } 6173 6174 /// Optionally returns true or false if the preallocated preprocessed 6175 /// entity with index \arg Index came from file \arg FID. 6176 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 6177 FileID FID) { 6178 if (FID.isInvalid()) 6179 return false; 6180 6181 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 6182 ModuleFile &M = *PPInfo.first; 6183 unsigned LocalIndex = PPInfo.second; 6184 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 6185 6186 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin()); 6187 if (Loc.isInvalid()) 6188 return false; 6189 6190 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 6191 return true; 6192 else 6193 return false; 6194 } 6195 6196 namespace { 6197 6198 /// Visitor used to search for information about a header file. 6199 class HeaderFileInfoVisitor { 6200 const FileEntry *FE; 6201 Optional<HeaderFileInfo> HFI; 6202 6203 public: 6204 explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {} 6205 6206 bool operator()(ModuleFile &M) { 6207 HeaderFileInfoLookupTable *Table 6208 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 6209 if (!Table) 6210 return false; 6211 6212 // Look in the on-disk hash table for an entry for this file name. 6213 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE); 6214 if (Pos == Table->end()) 6215 return false; 6216 6217 HFI = *Pos; 6218 return true; 6219 } 6220 6221 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 6222 }; 6223 6224 } // namespace 6225 6226 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 6227 HeaderFileInfoVisitor Visitor(FE); 6228 ModuleMgr.visit(Visitor); 6229 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 6230 return *HFI; 6231 6232 return HeaderFileInfo(); 6233 } 6234 6235 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 6236 using DiagState = DiagnosticsEngine::DiagState; 6237 SmallVector<DiagState *, 32> DiagStates; 6238 6239 for (ModuleFile &F : ModuleMgr) { 6240 unsigned Idx = 0; 6241 auto &Record = F.PragmaDiagMappings; 6242 if (Record.empty()) 6243 continue; 6244 6245 DiagStates.clear(); 6246 6247 auto ReadDiagState = 6248 [&](const DiagState &BasedOn, SourceLocation Loc, 6249 bool IncludeNonPragmaStates) -> DiagnosticsEngine::DiagState * { 6250 unsigned BackrefID = Record[Idx++]; 6251 if (BackrefID != 0) 6252 return DiagStates[BackrefID - 1]; 6253 6254 // A new DiagState was created here. 6255 Diag.DiagStates.push_back(BasedOn); 6256 DiagState *NewState = &Diag.DiagStates.back(); 6257 DiagStates.push_back(NewState); 6258 unsigned Size = Record[Idx++]; 6259 assert(Idx + Size * 2 <= Record.size() && 6260 "Invalid data, not enough diag/map pairs"); 6261 while (Size--) { 6262 unsigned DiagID = Record[Idx++]; 6263 DiagnosticMapping NewMapping = 6264 DiagnosticMapping::deserialize(Record[Idx++]); 6265 if (!NewMapping.isPragma() && !IncludeNonPragmaStates) 6266 continue; 6267 6268 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID); 6269 6270 // If this mapping was specified as a warning but the severity was 6271 // upgraded due to diagnostic settings, simulate the current diagnostic 6272 // settings (and use a warning). 6273 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) { 6274 NewMapping.setSeverity(diag::Severity::Warning); 6275 NewMapping.setUpgradedFromWarning(false); 6276 } 6277 6278 Mapping = NewMapping; 6279 } 6280 return NewState; 6281 }; 6282 6283 // Read the first state. 6284 DiagState *FirstState; 6285 if (F.Kind == MK_ImplicitModule) { 6286 // Implicitly-built modules are reused with different diagnostic 6287 // settings. Use the initial diagnostic state from Diag to simulate this 6288 // compilation's diagnostic settings. 6289 FirstState = Diag.DiagStatesByLoc.FirstDiagState; 6290 DiagStates.push_back(FirstState); 6291 6292 // Skip the initial diagnostic state from the serialized module. 6293 assert(Record[1] == 0 && 6294 "Invalid data, unexpected backref in initial state"); 6295 Idx = 3 + Record[2] * 2; 6296 assert(Idx < Record.size() && 6297 "Invalid data, not enough state change pairs in initial state"); 6298 } else if (F.isModule()) { 6299 // For an explicit module, preserve the flags from the module build 6300 // command line (-w, -Weverything, -Werror, ...) along with any explicit 6301 // -Wblah flags. 6302 unsigned Flags = Record[Idx++]; 6303 DiagState Initial; 6304 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1; 6305 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1; 6306 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1; 6307 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1; 6308 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1; 6309 Initial.ExtBehavior = (diag::Severity)Flags; 6310 FirstState = ReadDiagState(Initial, SourceLocation(), true); 6311 6312 assert(F.OriginalSourceFileID.isValid()); 6313 6314 // Set up the root buffer of the module to start with the initial 6315 // diagnostic state of the module itself, to cover files that contain no 6316 // explicit transitions (for which we did not serialize anything). 6317 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID] 6318 .StateTransitions.push_back({FirstState, 0}); 6319 } else { 6320 // For prefix ASTs, start with whatever the user configured on the 6321 // command line. 6322 Idx++; // Skip flags. 6323 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, 6324 SourceLocation(), false); 6325 } 6326 6327 // Read the state transitions. 6328 unsigned NumLocations = Record[Idx++]; 6329 while (NumLocations--) { 6330 assert(Idx < Record.size() && 6331 "Invalid data, missing pragma diagnostic states"); 6332 SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]); 6333 auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc); 6334 assert(IDAndOffset.first.isValid() && "invalid FileID for transition"); 6335 assert(IDAndOffset.second == 0 && "not a start location for a FileID"); 6336 unsigned Transitions = Record[Idx++]; 6337 6338 // Note that we don't need to set up Parent/ParentOffset here, because 6339 // we won't be changing the diagnostic state within imported FileIDs 6340 // (other than perhaps appending to the main source file, which has no 6341 // parent). 6342 auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first]; 6343 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions); 6344 for (unsigned I = 0; I != Transitions; ++I) { 6345 unsigned Offset = Record[Idx++]; 6346 auto *State = 6347 ReadDiagState(*FirstState, Loc.getLocWithOffset(Offset), false); 6348 F.StateTransitions.push_back({State, Offset}); 6349 } 6350 } 6351 6352 // Read the final state. 6353 assert(Idx < Record.size() && 6354 "Invalid data, missing final pragma diagnostic state"); 6355 SourceLocation CurStateLoc = 6356 ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 6357 auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false); 6358 6359 if (!F.isModule()) { 6360 Diag.DiagStatesByLoc.CurDiagState = CurState; 6361 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc; 6362 6363 // Preserve the property that the imaginary root file describes the 6364 // current state. 6365 FileID NullFile; 6366 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions; 6367 if (T.empty()) 6368 T.push_back({CurState, 0}); 6369 else 6370 T[0].State = CurState; 6371 } 6372 6373 // Don't try to read these mappings again. 6374 Record.clear(); 6375 } 6376 } 6377 6378 /// Get the correct cursor and offset for loading a type. 6379 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 6380 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 6381 assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 6382 ModuleFile *M = I->second; 6383 return RecordLocation( 6384 M, M->TypeOffsets[Index - M->BaseTypeIndex].getBitOffset() + 6385 M->DeclsBlockStartOffset); 6386 } 6387 6388 static llvm::Optional<Type::TypeClass> getTypeClassForCode(TypeCode code) { 6389 switch (code) { 6390 #define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \ 6391 case TYPE_##CODE_ID: return Type::CLASS_ID; 6392 #include "clang/Serialization/TypeBitCodes.def" 6393 default: return llvm::None; 6394 } 6395 } 6396 6397 /// Read and return the type with the given index.. 6398 /// 6399 /// The index is the type ID, shifted and minus the number of predefs. This 6400 /// routine actually reads the record corresponding to the type at the given 6401 /// location. It is a helper routine for GetType, which deals with reading type 6402 /// IDs. 6403 QualType ASTReader::readTypeRecord(unsigned Index) { 6404 assert(ContextObj && "reading type with no AST context"); 6405 ASTContext &Context = *ContextObj; 6406 RecordLocation Loc = TypeCursorForIndex(Index); 6407 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 6408 6409 // Keep track of where we are in the stream, then jump back there 6410 // after reading this type. 6411 SavedStreamPosition SavedPosition(DeclsCursor); 6412 6413 ReadingKindTracker ReadingKind(Read_Type, *this); 6414 6415 // Note that we are loading a type record. 6416 Deserializing AType(this); 6417 6418 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) { 6419 Error(std::move(Err)); 6420 return QualType(); 6421 } 6422 Expected<unsigned> RawCode = DeclsCursor.ReadCode(); 6423 if (!RawCode) { 6424 Error(RawCode.takeError()); 6425 return QualType(); 6426 } 6427 6428 ASTRecordReader Record(*this, *Loc.F); 6429 Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get()); 6430 if (!Code) { 6431 Error(Code.takeError()); 6432 return QualType(); 6433 } 6434 if (Code.get() == TYPE_EXT_QUAL) { 6435 QualType baseType = Record.readQualType(); 6436 Qualifiers quals = Record.readQualifiers(); 6437 return Context.getQualifiedType(baseType, quals); 6438 } 6439 6440 auto maybeClass = getTypeClassForCode((TypeCode) Code.get()); 6441 if (!maybeClass) { 6442 Error("Unexpected code for type"); 6443 return QualType(); 6444 } 6445 6446 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record); 6447 return TypeReader.read(*maybeClass); 6448 } 6449 6450 namespace clang { 6451 6452 class TypeLocReader : public TypeLocVisitor<TypeLocReader> { 6453 ASTRecordReader &Reader; 6454 6455 SourceLocation readSourceLocation() { 6456 return Reader.readSourceLocation(); 6457 } 6458 6459 TypeSourceInfo *GetTypeSourceInfo() { 6460 return Reader.readTypeSourceInfo(); 6461 } 6462 6463 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() { 6464 return Reader.readNestedNameSpecifierLoc(); 6465 } 6466 6467 Attr *ReadAttr() { 6468 return Reader.readAttr(); 6469 } 6470 6471 public: 6472 TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {} 6473 6474 // We want compile-time assurance that we've enumerated all of 6475 // these, so unfortunately we have to declare them first, then 6476 // define them out-of-line. 6477 #define ABSTRACT_TYPELOC(CLASS, PARENT) 6478 #define TYPELOC(CLASS, PARENT) \ 6479 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 6480 #include "clang/AST/TypeLocNodes.def" 6481 6482 void VisitFunctionTypeLoc(FunctionTypeLoc); 6483 void VisitArrayTypeLoc(ArrayTypeLoc); 6484 }; 6485 6486 } // namespace clang 6487 6488 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 6489 // nothing to do 6490 } 6491 6492 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 6493 TL.setBuiltinLoc(readSourceLocation()); 6494 if (TL.needsExtraLocalData()) { 6495 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt())); 6496 TL.setWrittenSignSpec(static_cast<TypeSpecifierSign>(Reader.readInt())); 6497 TL.setWrittenWidthSpec(static_cast<TypeSpecifierWidth>(Reader.readInt())); 6498 TL.setModeAttr(Reader.readInt()); 6499 } 6500 } 6501 6502 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 6503 TL.setNameLoc(readSourceLocation()); 6504 } 6505 6506 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 6507 TL.setStarLoc(readSourceLocation()); 6508 } 6509 6510 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 6511 // nothing to do 6512 } 6513 6514 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 6515 // nothing to do 6516 } 6517 6518 void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) { 6519 TL.setExpansionLoc(readSourceLocation()); 6520 } 6521 6522 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 6523 TL.setCaretLoc(readSourceLocation()); 6524 } 6525 6526 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 6527 TL.setAmpLoc(readSourceLocation()); 6528 } 6529 6530 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 6531 TL.setAmpAmpLoc(readSourceLocation()); 6532 } 6533 6534 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 6535 TL.setStarLoc(readSourceLocation()); 6536 TL.setClassTInfo(GetTypeSourceInfo()); 6537 } 6538 6539 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 6540 TL.setLBracketLoc(readSourceLocation()); 6541 TL.setRBracketLoc(readSourceLocation()); 6542 if (Reader.readBool()) 6543 TL.setSizeExpr(Reader.readExpr()); 6544 else 6545 TL.setSizeExpr(nullptr); 6546 } 6547 6548 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 6549 VisitArrayTypeLoc(TL); 6550 } 6551 6552 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 6553 VisitArrayTypeLoc(TL); 6554 } 6555 6556 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 6557 VisitArrayTypeLoc(TL); 6558 } 6559 6560 void TypeLocReader::VisitDependentSizedArrayTypeLoc( 6561 DependentSizedArrayTypeLoc TL) { 6562 VisitArrayTypeLoc(TL); 6563 } 6564 6565 void TypeLocReader::VisitDependentAddressSpaceTypeLoc( 6566 DependentAddressSpaceTypeLoc TL) { 6567 6568 TL.setAttrNameLoc(readSourceLocation()); 6569 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6570 TL.setAttrExprOperand(Reader.readExpr()); 6571 } 6572 6573 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 6574 DependentSizedExtVectorTypeLoc TL) { 6575 TL.setNameLoc(readSourceLocation()); 6576 } 6577 6578 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 6579 TL.setNameLoc(readSourceLocation()); 6580 } 6581 6582 void TypeLocReader::VisitDependentVectorTypeLoc( 6583 DependentVectorTypeLoc TL) { 6584 TL.setNameLoc(readSourceLocation()); 6585 } 6586 6587 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 6588 TL.setNameLoc(readSourceLocation()); 6589 } 6590 6591 void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) { 6592 TL.setAttrNameLoc(readSourceLocation()); 6593 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6594 TL.setAttrRowOperand(Reader.readExpr()); 6595 TL.setAttrColumnOperand(Reader.readExpr()); 6596 } 6597 6598 void TypeLocReader::VisitDependentSizedMatrixTypeLoc( 6599 DependentSizedMatrixTypeLoc TL) { 6600 TL.setAttrNameLoc(readSourceLocation()); 6601 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6602 TL.setAttrRowOperand(Reader.readExpr()); 6603 TL.setAttrColumnOperand(Reader.readExpr()); 6604 } 6605 6606 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 6607 TL.setLocalRangeBegin(readSourceLocation()); 6608 TL.setLParenLoc(readSourceLocation()); 6609 TL.setRParenLoc(readSourceLocation()); 6610 TL.setExceptionSpecRange(Reader.readSourceRange()); 6611 TL.setLocalRangeEnd(readSourceLocation()); 6612 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) { 6613 TL.setParam(i, Reader.readDeclAs<ParmVarDecl>()); 6614 } 6615 } 6616 6617 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 6618 VisitFunctionTypeLoc(TL); 6619 } 6620 6621 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 6622 VisitFunctionTypeLoc(TL); 6623 } 6624 6625 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 6626 TL.setNameLoc(readSourceLocation()); 6627 } 6628 6629 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 6630 TL.setNameLoc(readSourceLocation()); 6631 } 6632 6633 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 6634 TL.setTypeofLoc(readSourceLocation()); 6635 TL.setLParenLoc(readSourceLocation()); 6636 TL.setRParenLoc(readSourceLocation()); 6637 } 6638 6639 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 6640 TL.setTypeofLoc(readSourceLocation()); 6641 TL.setLParenLoc(readSourceLocation()); 6642 TL.setRParenLoc(readSourceLocation()); 6643 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6644 } 6645 6646 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 6647 TL.setNameLoc(readSourceLocation()); 6648 } 6649 6650 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 6651 TL.setKWLoc(readSourceLocation()); 6652 TL.setLParenLoc(readSourceLocation()); 6653 TL.setRParenLoc(readSourceLocation()); 6654 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6655 } 6656 6657 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 6658 TL.setNameLoc(readSourceLocation()); 6659 if (Reader.readBool()) { 6660 TL.setNestedNameSpecifierLoc(ReadNestedNameSpecifierLoc()); 6661 TL.setTemplateKWLoc(readSourceLocation()); 6662 TL.setConceptNameLoc(readSourceLocation()); 6663 TL.setFoundDecl(Reader.readDeclAs<NamedDecl>()); 6664 TL.setLAngleLoc(readSourceLocation()); 6665 TL.setRAngleLoc(readSourceLocation()); 6666 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6667 TL.setArgLocInfo(i, Reader.readTemplateArgumentLocInfo( 6668 TL.getTypePtr()->getArg(i).getKind())); 6669 } 6670 } 6671 6672 void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc( 6673 DeducedTemplateSpecializationTypeLoc TL) { 6674 TL.setTemplateNameLoc(readSourceLocation()); 6675 } 6676 6677 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 6678 TL.setNameLoc(readSourceLocation()); 6679 } 6680 6681 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 6682 TL.setNameLoc(readSourceLocation()); 6683 } 6684 6685 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 6686 TL.setAttr(ReadAttr()); 6687 } 6688 6689 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 6690 TL.setNameLoc(readSourceLocation()); 6691 } 6692 6693 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 6694 SubstTemplateTypeParmTypeLoc TL) { 6695 TL.setNameLoc(readSourceLocation()); 6696 } 6697 6698 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 6699 SubstTemplateTypeParmPackTypeLoc TL) { 6700 TL.setNameLoc(readSourceLocation()); 6701 } 6702 6703 void TypeLocReader::VisitTemplateSpecializationTypeLoc( 6704 TemplateSpecializationTypeLoc TL) { 6705 TL.setTemplateKeywordLoc(readSourceLocation()); 6706 TL.setTemplateNameLoc(readSourceLocation()); 6707 TL.setLAngleLoc(readSourceLocation()); 6708 TL.setRAngleLoc(readSourceLocation()); 6709 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6710 TL.setArgLocInfo( 6711 i, 6712 Reader.readTemplateArgumentLocInfo( 6713 TL.getTypePtr()->getArg(i).getKind())); 6714 } 6715 6716 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 6717 TL.setLParenLoc(readSourceLocation()); 6718 TL.setRParenLoc(readSourceLocation()); 6719 } 6720 6721 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 6722 TL.setElaboratedKeywordLoc(readSourceLocation()); 6723 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6724 } 6725 6726 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 6727 TL.setNameLoc(readSourceLocation()); 6728 } 6729 6730 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 6731 TL.setElaboratedKeywordLoc(readSourceLocation()); 6732 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6733 TL.setNameLoc(readSourceLocation()); 6734 } 6735 6736 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 6737 DependentTemplateSpecializationTypeLoc TL) { 6738 TL.setElaboratedKeywordLoc(readSourceLocation()); 6739 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6740 TL.setTemplateKeywordLoc(readSourceLocation()); 6741 TL.setTemplateNameLoc(readSourceLocation()); 6742 TL.setLAngleLoc(readSourceLocation()); 6743 TL.setRAngleLoc(readSourceLocation()); 6744 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 6745 TL.setArgLocInfo( 6746 I, 6747 Reader.readTemplateArgumentLocInfo( 6748 TL.getTypePtr()->getArg(I).getKind())); 6749 } 6750 6751 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 6752 TL.setEllipsisLoc(readSourceLocation()); 6753 } 6754 6755 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 6756 TL.setNameLoc(readSourceLocation()); 6757 } 6758 6759 void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) { 6760 if (TL.getNumProtocols()) { 6761 TL.setProtocolLAngleLoc(readSourceLocation()); 6762 TL.setProtocolRAngleLoc(readSourceLocation()); 6763 } 6764 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6765 TL.setProtocolLoc(i, readSourceLocation()); 6766 } 6767 6768 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 6769 TL.setHasBaseTypeAsWritten(Reader.readBool()); 6770 TL.setTypeArgsLAngleLoc(readSourceLocation()); 6771 TL.setTypeArgsRAngleLoc(readSourceLocation()); 6772 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i) 6773 TL.setTypeArgTInfo(i, GetTypeSourceInfo()); 6774 TL.setProtocolLAngleLoc(readSourceLocation()); 6775 TL.setProtocolRAngleLoc(readSourceLocation()); 6776 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6777 TL.setProtocolLoc(i, readSourceLocation()); 6778 } 6779 6780 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 6781 TL.setStarLoc(readSourceLocation()); 6782 } 6783 6784 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 6785 TL.setKWLoc(readSourceLocation()); 6786 TL.setLParenLoc(readSourceLocation()); 6787 TL.setRParenLoc(readSourceLocation()); 6788 } 6789 6790 void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) { 6791 TL.setKWLoc(readSourceLocation()); 6792 } 6793 6794 void TypeLocReader::VisitExtIntTypeLoc(clang::ExtIntTypeLoc TL) { 6795 TL.setNameLoc(readSourceLocation()); 6796 } 6797 void TypeLocReader::VisitDependentExtIntTypeLoc( 6798 clang::DependentExtIntTypeLoc TL) { 6799 TL.setNameLoc(readSourceLocation()); 6800 } 6801 6802 6803 void ASTRecordReader::readTypeLoc(TypeLoc TL) { 6804 TypeLocReader TLR(*this); 6805 for (; !TL.isNull(); TL = TL.getNextTypeLoc()) 6806 TLR.Visit(TL); 6807 } 6808 6809 TypeSourceInfo *ASTRecordReader::readTypeSourceInfo() { 6810 QualType InfoTy = readType(); 6811 if (InfoTy.isNull()) 6812 return nullptr; 6813 6814 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 6815 readTypeLoc(TInfo->getTypeLoc()); 6816 return TInfo; 6817 } 6818 6819 QualType ASTReader::GetType(TypeID ID) { 6820 assert(ContextObj && "reading type with no AST context"); 6821 ASTContext &Context = *ContextObj; 6822 6823 unsigned FastQuals = ID & Qualifiers::FastMask; 6824 unsigned Index = ID >> Qualifiers::FastWidth; 6825 6826 if (Index < NUM_PREDEF_TYPE_IDS) { 6827 QualType T; 6828 switch ((PredefinedTypeIDs)Index) { 6829 case PREDEF_TYPE_NULL_ID: 6830 return QualType(); 6831 case PREDEF_TYPE_VOID_ID: 6832 T = Context.VoidTy; 6833 break; 6834 case PREDEF_TYPE_BOOL_ID: 6835 T = Context.BoolTy; 6836 break; 6837 case PREDEF_TYPE_CHAR_U_ID: 6838 case PREDEF_TYPE_CHAR_S_ID: 6839 // FIXME: Check that the signedness of CharTy is correct! 6840 T = Context.CharTy; 6841 break; 6842 case PREDEF_TYPE_UCHAR_ID: 6843 T = Context.UnsignedCharTy; 6844 break; 6845 case PREDEF_TYPE_USHORT_ID: 6846 T = Context.UnsignedShortTy; 6847 break; 6848 case PREDEF_TYPE_UINT_ID: 6849 T = Context.UnsignedIntTy; 6850 break; 6851 case PREDEF_TYPE_ULONG_ID: 6852 T = Context.UnsignedLongTy; 6853 break; 6854 case PREDEF_TYPE_ULONGLONG_ID: 6855 T = Context.UnsignedLongLongTy; 6856 break; 6857 case PREDEF_TYPE_UINT128_ID: 6858 T = Context.UnsignedInt128Ty; 6859 break; 6860 case PREDEF_TYPE_SCHAR_ID: 6861 T = Context.SignedCharTy; 6862 break; 6863 case PREDEF_TYPE_WCHAR_ID: 6864 T = Context.WCharTy; 6865 break; 6866 case PREDEF_TYPE_SHORT_ID: 6867 T = Context.ShortTy; 6868 break; 6869 case PREDEF_TYPE_INT_ID: 6870 T = Context.IntTy; 6871 break; 6872 case PREDEF_TYPE_LONG_ID: 6873 T = Context.LongTy; 6874 break; 6875 case PREDEF_TYPE_LONGLONG_ID: 6876 T = Context.LongLongTy; 6877 break; 6878 case PREDEF_TYPE_INT128_ID: 6879 T = Context.Int128Ty; 6880 break; 6881 case PREDEF_TYPE_BFLOAT16_ID: 6882 T = Context.BFloat16Ty; 6883 break; 6884 case PREDEF_TYPE_HALF_ID: 6885 T = Context.HalfTy; 6886 break; 6887 case PREDEF_TYPE_FLOAT_ID: 6888 T = Context.FloatTy; 6889 break; 6890 case PREDEF_TYPE_DOUBLE_ID: 6891 T = Context.DoubleTy; 6892 break; 6893 case PREDEF_TYPE_LONGDOUBLE_ID: 6894 T = Context.LongDoubleTy; 6895 break; 6896 case PREDEF_TYPE_SHORT_ACCUM_ID: 6897 T = Context.ShortAccumTy; 6898 break; 6899 case PREDEF_TYPE_ACCUM_ID: 6900 T = Context.AccumTy; 6901 break; 6902 case PREDEF_TYPE_LONG_ACCUM_ID: 6903 T = Context.LongAccumTy; 6904 break; 6905 case PREDEF_TYPE_USHORT_ACCUM_ID: 6906 T = Context.UnsignedShortAccumTy; 6907 break; 6908 case PREDEF_TYPE_UACCUM_ID: 6909 T = Context.UnsignedAccumTy; 6910 break; 6911 case PREDEF_TYPE_ULONG_ACCUM_ID: 6912 T = Context.UnsignedLongAccumTy; 6913 break; 6914 case PREDEF_TYPE_SHORT_FRACT_ID: 6915 T = Context.ShortFractTy; 6916 break; 6917 case PREDEF_TYPE_FRACT_ID: 6918 T = Context.FractTy; 6919 break; 6920 case PREDEF_TYPE_LONG_FRACT_ID: 6921 T = Context.LongFractTy; 6922 break; 6923 case PREDEF_TYPE_USHORT_FRACT_ID: 6924 T = Context.UnsignedShortFractTy; 6925 break; 6926 case PREDEF_TYPE_UFRACT_ID: 6927 T = Context.UnsignedFractTy; 6928 break; 6929 case PREDEF_TYPE_ULONG_FRACT_ID: 6930 T = Context.UnsignedLongFractTy; 6931 break; 6932 case PREDEF_TYPE_SAT_SHORT_ACCUM_ID: 6933 T = Context.SatShortAccumTy; 6934 break; 6935 case PREDEF_TYPE_SAT_ACCUM_ID: 6936 T = Context.SatAccumTy; 6937 break; 6938 case PREDEF_TYPE_SAT_LONG_ACCUM_ID: 6939 T = Context.SatLongAccumTy; 6940 break; 6941 case PREDEF_TYPE_SAT_USHORT_ACCUM_ID: 6942 T = Context.SatUnsignedShortAccumTy; 6943 break; 6944 case PREDEF_TYPE_SAT_UACCUM_ID: 6945 T = Context.SatUnsignedAccumTy; 6946 break; 6947 case PREDEF_TYPE_SAT_ULONG_ACCUM_ID: 6948 T = Context.SatUnsignedLongAccumTy; 6949 break; 6950 case PREDEF_TYPE_SAT_SHORT_FRACT_ID: 6951 T = Context.SatShortFractTy; 6952 break; 6953 case PREDEF_TYPE_SAT_FRACT_ID: 6954 T = Context.SatFractTy; 6955 break; 6956 case PREDEF_TYPE_SAT_LONG_FRACT_ID: 6957 T = Context.SatLongFractTy; 6958 break; 6959 case PREDEF_TYPE_SAT_USHORT_FRACT_ID: 6960 T = Context.SatUnsignedShortFractTy; 6961 break; 6962 case PREDEF_TYPE_SAT_UFRACT_ID: 6963 T = Context.SatUnsignedFractTy; 6964 break; 6965 case PREDEF_TYPE_SAT_ULONG_FRACT_ID: 6966 T = Context.SatUnsignedLongFractTy; 6967 break; 6968 case PREDEF_TYPE_FLOAT16_ID: 6969 T = Context.Float16Ty; 6970 break; 6971 case PREDEF_TYPE_FLOAT128_ID: 6972 T = Context.Float128Ty; 6973 break; 6974 case PREDEF_TYPE_OVERLOAD_ID: 6975 T = Context.OverloadTy; 6976 break; 6977 case PREDEF_TYPE_BOUND_MEMBER: 6978 T = Context.BoundMemberTy; 6979 break; 6980 case PREDEF_TYPE_PSEUDO_OBJECT: 6981 T = Context.PseudoObjectTy; 6982 break; 6983 case PREDEF_TYPE_DEPENDENT_ID: 6984 T = Context.DependentTy; 6985 break; 6986 case PREDEF_TYPE_UNKNOWN_ANY: 6987 T = Context.UnknownAnyTy; 6988 break; 6989 case PREDEF_TYPE_NULLPTR_ID: 6990 T = Context.NullPtrTy; 6991 break; 6992 case PREDEF_TYPE_CHAR8_ID: 6993 T = Context.Char8Ty; 6994 break; 6995 case PREDEF_TYPE_CHAR16_ID: 6996 T = Context.Char16Ty; 6997 break; 6998 case PREDEF_TYPE_CHAR32_ID: 6999 T = Context.Char32Ty; 7000 break; 7001 case PREDEF_TYPE_OBJC_ID: 7002 T = Context.ObjCBuiltinIdTy; 7003 break; 7004 case PREDEF_TYPE_OBJC_CLASS: 7005 T = Context.ObjCBuiltinClassTy; 7006 break; 7007 case PREDEF_TYPE_OBJC_SEL: 7008 T = Context.ObjCBuiltinSelTy; 7009 break; 7010 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 7011 case PREDEF_TYPE_##Id##_ID: \ 7012 T = Context.SingletonId; \ 7013 break; 7014 #include "clang/Basic/OpenCLImageTypes.def" 7015 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 7016 case PREDEF_TYPE_##Id##_ID: \ 7017 T = Context.Id##Ty; \ 7018 break; 7019 #include "clang/Basic/OpenCLExtensionTypes.def" 7020 case PREDEF_TYPE_SAMPLER_ID: 7021 T = Context.OCLSamplerTy; 7022 break; 7023 case PREDEF_TYPE_EVENT_ID: 7024 T = Context.OCLEventTy; 7025 break; 7026 case PREDEF_TYPE_CLK_EVENT_ID: 7027 T = Context.OCLClkEventTy; 7028 break; 7029 case PREDEF_TYPE_QUEUE_ID: 7030 T = Context.OCLQueueTy; 7031 break; 7032 case PREDEF_TYPE_RESERVE_ID_ID: 7033 T = Context.OCLReserveIDTy; 7034 break; 7035 case PREDEF_TYPE_AUTO_DEDUCT: 7036 T = Context.getAutoDeductType(); 7037 break; 7038 case PREDEF_TYPE_AUTO_RREF_DEDUCT: 7039 T = Context.getAutoRRefDeductType(); 7040 break; 7041 case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 7042 T = Context.ARCUnbridgedCastTy; 7043 break; 7044 case PREDEF_TYPE_BUILTIN_FN: 7045 T = Context.BuiltinFnTy; 7046 break; 7047 case PREDEF_TYPE_INCOMPLETE_MATRIX_IDX: 7048 T = Context.IncompleteMatrixIdxTy; 7049 break; 7050 case PREDEF_TYPE_OMP_ARRAY_SECTION: 7051 T = Context.OMPArraySectionTy; 7052 break; 7053 case PREDEF_TYPE_OMP_ARRAY_SHAPING: 7054 T = Context.OMPArraySectionTy; 7055 break; 7056 case PREDEF_TYPE_OMP_ITERATOR: 7057 T = Context.OMPIteratorTy; 7058 break; 7059 #define SVE_TYPE(Name, Id, SingletonId) \ 7060 case PREDEF_TYPE_##Id##_ID: \ 7061 T = Context.SingletonId; \ 7062 break; 7063 #include "clang/Basic/AArch64SVEACLETypes.def" 7064 #define PPC_VECTOR_TYPE(Name, Id, Size) \ 7065 case PREDEF_TYPE_##Id##_ID: \ 7066 T = Context.Id##Ty; \ 7067 break; 7068 #include "clang/Basic/PPCTypes.def" 7069 #define RVV_TYPE(Name, Id, SingletonId) \ 7070 case PREDEF_TYPE_##Id##_ID: \ 7071 T = Context.SingletonId; \ 7072 break; 7073 #include "clang/Basic/RISCVVTypes.def" 7074 } 7075 7076 assert(!T.isNull() && "Unknown predefined type"); 7077 return T.withFastQualifiers(FastQuals); 7078 } 7079 7080 Index -= NUM_PREDEF_TYPE_IDS; 7081 assert(Index < TypesLoaded.size() && "Type index out-of-range"); 7082 if (TypesLoaded[Index].isNull()) { 7083 TypesLoaded[Index] = readTypeRecord(Index); 7084 if (TypesLoaded[Index].isNull()) 7085 return QualType(); 7086 7087 TypesLoaded[Index]->setFromAST(); 7088 if (DeserializationListener) 7089 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 7090 TypesLoaded[Index]); 7091 } 7092 7093 return TypesLoaded[Index].withFastQualifiers(FastQuals); 7094 } 7095 7096 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 7097 return GetType(getGlobalTypeID(F, LocalID)); 7098 } 7099 7100 serialization::TypeID 7101 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 7102 unsigned FastQuals = LocalID & Qualifiers::FastMask; 7103 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 7104 7105 if (LocalIndex < NUM_PREDEF_TYPE_IDS) 7106 return LocalID; 7107 7108 if (!F.ModuleOffsetMap.empty()) 7109 ReadModuleOffsetMap(F); 7110 7111 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7112 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 7113 assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 7114 7115 unsigned GlobalIndex = LocalIndex + I->second; 7116 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 7117 } 7118 7119 TemplateArgumentLocInfo 7120 ASTRecordReader::readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind) { 7121 switch (Kind) { 7122 case TemplateArgument::Expression: 7123 return readExpr(); 7124 case TemplateArgument::Type: 7125 return readTypeSourceInfo(); 7126 case TemplateArgument::Template: { 7127 NestedNameSpecifierLoc QualifierLoc = 7128 readNestedNameSpecifierLoc(); 7129 SourceLocation TemplateNameLoc = readSourceLocation(); 7130 return TemplateArgumentLocInfo(getASTContext(), QualifierLoc, 7131 TemplateNameLoc, SourceLocation()); 7132 } 7133 case TemplateArgument::TemplateExpansion: { 7134 NestedNameSpecifierLoc QualifierLoc = readNestedNameSpecifierLoc(); 7135 SourceLocation TemplateNameLoc = readSourceLocation(); 7136 SourceLocation EllipsisLoc = readSourceLocation(); 7137 return TemplateArgumentLocInfo(getASTContext(), QualifierLoc, 7138 TemplateNameLoc, EllipsisLoc); 7139 } 7140 case TemplateArgument::Null: 7141 case TemplateArgument::Integral: 7142 case TemplateArgument::Declaration: 7143 case TemplateArgument::NullPtr: 7144 case TemplateArgument::Pack: 7145 // FIXME: Is this right? 7146 return TemplateArgumentLocInfo(); 7147 } 7148 llvm_unreachable("unexpected template argument loc"); 7149 } 7150 7151 TemplateArgumentLoc ASTRecordReader::readTemplateArgumentLoc() { 7152 TemplateArgument Arg = readTemplateArgument(); 7153 7154 if (Arg.getKind() == TemplateArgument::Expression) { 7155 if (readBool()) // bool InfoHasSameExpr. 7156 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 7157 } 7158 return TemplateArgumentLoc(Arg, readTemplateArgumentLocInfo(Arg.getKind())); 7159 } 7160 7161 const ASTTemplateArgumentListInfo * 7162 ASTRecordReader::readASTTemplateArgumentListInfo() { 7163 SourceLocation LAngleLoc = readSourceLocation(); 7164 SourceLocation RAngleLoc = readSourceLocation(); 7165 unsigned NumArgsAsWritten = readInt(); 7166 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 7167 for (unsigned i = 0; i != NumArgsAsWritten; ++i) 7168 TemplArgsInfo.addArgument(readTemplateArgumentLoc()); 7169 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 7170 } 7171 7172 Decl *ASTReader::GetExternalDecl(uint32_t ID) { 7173 return GetDecl(ID); 7174 } 7175 7176 void ASTReader::CompleteRedeclChain(const Decl *D) { 7177 if (NumCurrentElementsDeserializing) { 7178 // We arrange to not care about the complete redeclaration chain while we're 7179 // deserializing. Just remember that the AST has marked this one as complete 7180 // but that it's not actually complete yet, so we know we still need to 7181 // complete it later. 7182 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D)); 7183 return; 7184 } 7185 7186 if (!D->getDeclContext()) { 7187 assert(isa<TranslationUnitDecl>(D) && "Not a TU?"); 7188 return; 7189 } 7190 7191 const DeclContext *DC = D->getDeclContext()->getRedeclContext(); 7192 7193 // If this is a named declaration, complete it by looking it up 7194 // within its context. 7195 // 7196 // FIXME: Merging a function definition should merge 7197 // all mergeable entities within it. 7198 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) || 7199 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) { 7200 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) { 7201 if (!getContext().getLangOpts().CPlusPlus && 7202 isa<TranslationUnitDecl>(DC)) { 7203 // Outside of C++, we don't have a lookup table for the TU, so update 7204 // the identifier instead. (For C++ modules, we don't store decls 7205 // in the serialized identifier table, so we do the lookup in the TU.) 7206 auto *II = Name.getAsIdentifierInfo(); 7207 assert(II && "non-identifier name in C?"); 7208 if (II->isOutOfDate()) 7209 updateOutOfDateIdentifier(*II); 7210 } else 7211 DC->lookup(Name); 7212 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) { 7213 // Find all declarations of this kind from the relevant context. 7214 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) { 7215 auto *DC = cast<DeclContext>(DCDecl); 7216 SmallVector<Decl*, 8> Decls; 7217 FindExternalLexicalDecls( 7218 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls); 7219 } 7220 } 7221 } 7222 7223 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) 7224 CTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7225 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) 7226 VTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7227 if (auto *FD = dyn_cast<FunctionDecl>(D)) { 7228 if (auto *Template = FD->getPrimaryTemplate()) 7229 Template->LoadLazySpecializations(); 7230 } 7231 } 7232 7233 CXXCtorInitializer ** 7234 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) { 7235 RecordLocation Loc = getLocalBitOffset(Offset); 7236 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7237 SavedStreamPosition SavedPosition(Cursor); 7238 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7239 Error(std::move(Err)); 7240 return nullptr; 7241 } 7242 ReadingKindTracker ReadingKind(Read_Decl, *this); 7243 7244 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7245 if (!MaybeCode) { 7246 Error(MaybeCode.takeError()); 7247 return nullptr; 7248 } 7249 unsigned Code = MaybeCode.get(); 7250 7251 ASTRecordReader Record(*this, *Loc.F); 7252 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7253 if (!MaybeRecCode) { 7254 Error(MaybeRecCode.takeError()); 7255 return nullptr; 7256 } 7257 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) { 7258 Error("malformed AST file: missing C++ ctor initializers"); 7259 return nullptr; 7260 } 7261 7262 return Record.readCXXCtorInitializers(); 7263 } 7264 7265 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 7266 assert(ContextObj && "reading base specifiers with no AST context"); 7267 ASTContext &Context = *ContextObj; 7268 7269 RecordLocation Loc = getLocalBitOffset(Offset); 7270 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7271 SavedStreamPosition SavedPosition(Cursor); 7272 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7273 Error(std::move(Err)); 7274 return nullptr; 7275 } 7276 ReadingKindTracker ReadingKind(Read_Decl, *this); 7277 7278 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7279 if (!MaybeCode) { 7280 Error(MaybeCode.takeError()); 7281 return nullptr; 7282 } 7283 unsigned Code = MaybeCode.get(); 7284 7285 ASTRecordReader Record(*this, *Loc.F); 7286 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7287 if (!MaybeRecCode) { 7288 Error(MaybeCode.takeError()); 7289 return nullptr; 7290 } 7291 unsigned RecCode = MaybeRecCode.get(); 7292 7293 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 7294 Error("malformed AST file: missing C++ base specifiers"); 7295 return nullptr; 7296 } 7297 7298 unsigned NumBases = Record.readInt(); 7299 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 7300 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 7301 for (unsigned I = 0; I != NumBases; ++I) 7302 Bases[I] = Record.readCXXBaseSpecifier(); 7303 return Bases; 7304 } 7305 7306 serialization::DeclID 7307 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 7308 if (LocalID < NUM_PREDEF_DECL_IDS) 7309 return LocalID; 7310 7311 if (!F.ModuleOffsetMap.empty()) 7312 ReadModuleOffsetMap(F); 7313 7314 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7315 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 7316 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 7317 7318 return LocalID + I->second; 7319 } 7320 7321 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 7322 ModuleFile &M) const { 7323 // Predefined decls aren't from any module. 7324 if (ID < NUM_PREDEF_DECL_IDS) 7325 return false; 7326 7327 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID && 7328 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls; 7329 } 7330 7331 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 7332 if (!D->isFromASTFile()) 7333 return nullptr; 7334 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 7335 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7336 return I->second; 7337 } 7338 7339 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 7340 if (ID < NUM_PREDEF_DECL_IDS) 7341 return SourceLocation(); 7342 7343 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7344 7345 if (Index > DeclsLoaded.size()) { 7346 Error("declaration ID out-of-range for AST file"); 7347 return SourceLocation(); 7348 } 7349 7350 if (Decl *D = DeclsLoaded[Index]) 7351 return D->getLocation(); 7352 7353 SourceLocation Loc; 7354 DeclCursorForID(ID, Loc); 7355 return Loc; 7356 } 7357 7358 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) { 7359 switch (ID) { 7360 case PREDEF_DECL_NULL_ID: 7361 return nullptr; 7362 7363 case PREDEF_DECL_TRANSLATION_UNIT_ID: 7364 return Context.getTranslationUnitDecl(); 7365 7366 case PREDEF_DECL_OBJC_ID_ID: 7367 return Context.getObjCIdDecl(); 7368 7369 case PREDEF_DECL_OBJC_SEL_ID: 7370 return Context.getObjCSelDecl(); 7371 7372 case PREDEF_DECL_OBJC_CLASS_ID: 7373 return Context.getObjCClassDecl(); 7374 7375 case PREDEF_DECL_OBJC_PROTOCOL_ID: 7376 return Context.getObjCProtocolDecl(); 7377 7378 case PREDEF_DECL_INT_128_ID: 7379 return Context.getInt128Decl(); 7380 7381 case PREDEF_DECL_UNSIGNED_INT_128_ID: 7382 return Context.getUInt128Decl(); 7383 7384 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 7385 return Context.getObjCInstanceTypeDecl(); 7386 7387 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 7388 return Context.getBuiltinVaListDecl(); 7389 7390 case PREDEF_DECL_VA_LIST_TAG: 7391 return Context.getVaListTagDecl(); 7392 7393 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID: 7394 return Context.getBuiltinMSVaListDecl(); 7395 7396 case PREDEF_DECL_BUILTIN_MS_GUID_ID: 7397 return Context.getMSGuidTagDecl(); 7398 7399 case PREDEF_DECL_EXTERN_C_CONTEXT_ID: 7400 return Context.getExternCContextDecl(); 7401 7402 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID: 7403 return Context.getMakeIntegerSeqDecl(); 7404 7405 case PREDEF_DECL_CF_CONSTANT_STRING_ID: 7406 return Context.getCFConstantStringDecl(); 7407 7408 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID: 7409 return Context.getCFConstantStringTagDecl(); 7410 7411 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID: 7412 return Context.getTypePackElementDecl(); 7413 } 7414 llvm_unreachable("PredefinedDeclIDs unknown enum value"); 7415 } 7416 7417 Decl *ASTReader::GetExistingDecl(DeclID ID) { 7418 assert(ContextObj && "reading decl with no AST context"); 7419 if (ID < NUM_PREDEF_DECL_IDS) { 7420 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID); 7421 if (D) { 7422 // Track that we have merged the declaration with ID \p ID into the 7423 // pre-existing predefined declaration \p D. 7424 auto &Merged = KeyDecls[D->getCanonicalDecl()]; 7425 if (Merged.empty()) 7426 Merged.push_back(ID); 7427 } 7428 return D; 7429 } 7430 7431 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7432 7433 if (Index >= DeclsLoaded.size()) { 7434 assert(0 && "declaration ID out-of-range for AST file"); 7435 Error("declaration ID out-of-range for AST file"); 7436 return nullptr; 7437 } 7438 7439 return DeclsLoaded[Index]; 7440 } 7441 7442 Decl *ASTReader::GetDecl(DeclID ID) { 7443 if (ID < NUM_PREDEF_DECL_IDS) 7444 return GetExistingDecl(ID); 7445 7446 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7447 7448 if (Index >= DeclsLoaded.size()) { 7449 assert(0 && "declaration ID out-of-range for AST file"); 7450 Error("declaration ID out-of-range for AST file"); 7451 return nullptr; 7452 } 7453 7454 if (!DeclsLoaded[Index]) { 7455 ReadDeclRecord(ID); 7456 if (DeserializationListener) 7457 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 7458 } 7459 7460 return DeclsLoaded[Index]; 7461 } 7462 7463 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 7464 DeclID GlobalID) { 7465 if (GlobalID < NUM_PREDEF_DECL_IDS) 7466 return GlobalID; 7467 7468 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 7469 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7470 ModuleFile *Owner = I->second; 7471 7472 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 7473 = M.GlobalToLocalDeclIDs.find(Owner); 7474 if (Pos == M.GlobalToLocalDeclIDs.end()) 7475 return 0; 7476 7477 return GlobalID - Owner->BaseDeclID + Pos->second; 7478 } 7479 7480 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 7481 const RecordData &Record, 7482 unsigned &Idx) { 7483 if (Idx >= Record.size()) { 7484 Error("Corrupted AST file"); 7485 return 0; 7486 } 7487 7488 return getGlobalDeclID(F, Record[Idx++]); 7489 } 7490 7491 /// Resolve the offset of a statement into a statement. 7492 /// 7493 /// This operation will read a new statement from the external 7494 /// source each time it is called, and is meant to be used via a 7495 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 7496 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 7497 // Switch case IDs are per Decl. 7498 ClearSwitchCaseIDs(); 7499 7500 // Offset here is a global offset across the entire chain. 7501 RecordLocation Loc = getLocalBitOffset(Offset); 7502 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) { 7503 Error(std::move(Err)); 7504 return nullptr; 7505 } 7506 assert(NumCurrentElementsDeserializing == 0 && 7507 "should not be called while already deserializing"); 7508 Deserializing D(this); 7509 return ReadStmtFromStream(*Loc.F); 7510 } 7511 7512 void ASTReader::FindExternalLexicalDecls( 7513 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 7514 SmallVectorImpl<Decl *> &Decls) { 7515 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {}; 7516 7517 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) { 7518 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries"); 7519 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) { 7520 auto K = (Decl::Kind)+LexicalDecls[I]; 7521 if (!IsKindWeWant(K)) 7522 continue; 7523 7524 auto ID = (serialization::DeclID)+LexicalDecls[I + 1]; 7525 7526 // Don't add predefined declarations to the lexical context more 7527 // than once. 7528 if (ID < NUM_PREDEF_DECL_IDS) { 7529 if (PredefsVisited[ID]) 7530 continue; 7531 7532 PredefsVisited[ID] = true; 7533 } 7534 7535 if (Decl *D = GetLocalDecl(*M, ID)) { 7536 assert(D->getKind() == K && "wrong kind for lexical decl"); 7537 if (!DC->isDeclInLexicalTraversal(D)) 7538 Decls.push_back(D); 7539 } 7540 } 7541 }; 7542 7543 if (isa<TranslationUnitDecl>(DC)) { 7544 for (auto Lexical : TULexicalDecls) 7545 Visit(Lexical.first, Lexical.second); 7546 } else { 7547 auto I = LexicalDecls.find(DC); 7548 if (I != LexicalDecls.end()) 7549 Visit(I->second.first, I->second.second); 7550 } 7551 7552 ++NumLexicalDeclContextsRead; 7553 } 7554 7555 namespace { 7556 7557 class DeclIDComp { 7558 ASTReader &Reader; 7559 ModuleFile &Mod; 7560 7561 public: 7562 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 7563 7564 bool operator()(LocalDeclID L, LocalDeclID R) const { 7565 SourceLocation LHS = getLocation(L); 7566 SourceLocation RHS = getLocation(R); 7567 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7568 } 7569 7570 bool operator()(SourceLocation LHS, LocalDeclID R) const { 7571 SourceLocation RHS = getLocation(R); 7572 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7573 } 7574 7575 bool operator()(LocalDeclID L, SourceLocation RHS) const { 7576 SourceLocation LHS = getLocation(L); 7577 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7578 } 7579 7580 SourceLocation getLocation(LocalDeclID ID) const { 7581 return Reader.getSourceManager().getFileLoc( 7582 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 7583 } 7584 }; 7585 7586 } // namespace 7587 7588 void ASTReader::FindFileRegionDecls(FileID File, 7589 unsigned Offset, unsigned Length, 7590 SmallVectorImpl<Decl *> &Decls) { 7591 SourceManager &SM = getSourceManager(); 7592 7593 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 7594 if (I == FileDeclIDs.end()) 7595 return; 7596 7597 FileDeclsInfo &DInfo = I->second; 7598 if (DInfo.Decls.empty()) 7599 return; 7600 7601 SourceLocation 7602 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 7603 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 7604 7605 DeclIDComp DIDComp(*this, *DInfo.Mod); 7606 ArrayRef<serialization::LocalDeclID>::iterator BeginIt = 7607 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp); 7608 if (BeginIt != DInfo.Decls.begin()) 7609 --BeginIt; 7610 7611 // If we are pointing at a top-level decl inside an objc container, we need 7612 // to backtrack until we find it otherwise we will fail to report that the 7613 // region overlaps with an objc container. 7614 while (BeginIt != DInfo.Decls.begin() && 7615 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 7616 ->isTopLevelDeclInObjCContainer()) 7617 --BeginIt; 7618 7619 ArrayRef<serialization::LocalDeclID>::iterator EndIt = 7620 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp); 7621 if (EndIt != DInfo.Decls.end()) 7622 ++EndIt; 7623 7624 for (ArrayRef<serialization::LocalDeclID>::iterator 7625 DIt = BeginIt; DIt != EndIt; ++DIt) 7626 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 7627 } 7628 7629 bool 7630 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 7631 DeclarationName Name) { 7632 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && 7633 "DeclContext has no visible decls in storage"); 7634 if (!Name) 7635 return false; 7636 7637 auto It = Lookups.find(DC); 7638 if (It == Lookups.end()) 7639 return false; 7640 7641 Deserializing LookupResults(this); 7642 7643 // Load the list of declarations. 7644 SmallVector<NamedDecl *, 64> Decls; 7645 llvm::SmallPtrSet<NamedDecl *, 8> Found; 7646 for (DeclID ID : It->second.Table.find(Name)) { 7647 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7648 if (ND->getDeclName() == Name && Found.insert(ND).second) 7649 Decls.push_back(ND); 7650 } 7651 7652 ++NumVisibleDeclContextsRead; 7653 SetExternalVisibleDeclsForName(DC, Name, Decls); 7654 return !Decls.empty(); 7655 } 7656 7657 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 7658 if (!DC->hasExternalVisibleStorage()) 7659 return; 7660 7661 auto It = Lookups.find(DC); 7662 assert(It != Lookups.end() && 7663 "have external visible storage but no lookup tables"); 7664 7665 DeclsMap Decls; 7666 7667 for (DeclID ID : It->second.Table.findAll()) { 7668 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7669 Decls[ND->getDeclName()].push_back(ND); 7670 } 7671 7672 ++NumVisibleDeclContextsRead; 7673 7674 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 7675 SetExternalVisibleDeclsForName(DC, I->first, I->second); 7676 } 7677 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 7678 } 7679 7680 const serialization::reader::DeclContextLookupTable * 7681 ASTReader::getLoadedLookupTables(DeclContext *Primary) const { 7682 auto I = Lookups.find(Primary); 7683 return I == Lookups.end() ? nullptr : &I->second; 7684 } 7685 7686 /// Under non-PCH compilation the consumer receives the objc methods 7687 /// before receiving the implementation, and codegen depends on this. 7688 /// We simulate this by deserializing and passing to consumer the methods of the 7689 /// implementation before passing the deserialized implementation decl. 7690 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 7691 ASTConsumer *Consumer) { 7692 assert(ImplD && Consumer); 7693 7694 for (auto *I : ImplD->methods()) 7695 Consumer->HandleInterestingDecl(DeclGroupRef(I)); 7696 7697 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 7698 } 7699 7700 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 7701 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 7702 PassObjCImplDeclToConsumer(ImplD, Consumer); 7703 else 7704 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 7705 } 7706 7707 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 7708 this->Consumer = Consumer; 7709 7710 if (Consumer) 7711 PassInterestingDeclsToConsumer(); 7712 7713 if (DeserializationListener) 7714 DeserializationListener->ReaderInitialized(this); 7715 } 7716 7717 void ASTReader::PrintStats() { 7718 std::fprintf(stderr, "*** AST File Statistics:\n"); 7719 7720 unsigned NumTypesLoaded 7721 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 7722 QualType()); 7723 unsigned NumDeclsLoaded 7724 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 7725 (Decl *)nullptr); 7726 unsigned NumIdentifiersLoaded 7727 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 7728 IdentifiersLoaded.end(), 7729 (IdentifierInfo *)nullptr); 7730 unsigned NumMacrosLoaded 7731 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 7732 MacrosLoaded.end(), 7733 (MacroInfo *)nullptr); 7734 unsigned NumSelectorsLoaded 7735 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 7736 SelectorsLoaded.end(), 7737 Selector()); 7738 7739 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 7740 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 7741 NumSLocEntriesRead, TotalNumSLocEntries, 7742 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 7743 if (!TypesLoaded.empty()) 7744 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 7745 NumTypesLoaded, (unsigned)TypesLoaded.size(), 7746 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 7747 if (!DeclsLoaded.empty()) 7748 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 7749 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 7750 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 7751 if (!IdentifiersLoaded.empty()) 7752 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 7753 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 7754 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 7755 if (!MacrosLoaded.empty()) 7756 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7757 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 7758 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 7759 if (!SelectorsLoaded.empty()) 7760 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 7761 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 7762 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 7763 if (TotalNumStatements) 7764 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 7765 NumStatementsRead, TotalNumStatements, 7766 ((float)NumStatementsRead/TotalNumStatements * 100)); 7767 if (TotalNumMacros) 7768 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7769 NumMacrosRead, TotalNumMacros, 7770 ((float)NumMacrosRead/TotalNumMacros * 100)); 7771 if (TotalLexicalDeclContexts) 7772 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 7773 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 7774 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 7775 * 100)); 7776 if (TotalVisibleDeclContexts) 7777 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 7778 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 7779 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 7780 * 100)); 7781 if (TotalNumMethodPoolEntries) 7782 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 7783 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 7784 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 7785 * 100)); 7786 if (NumMethodPoolLookups) 7787 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 7788 NumMethodPoolHits, NumMethodPoolLookups, 7789 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 7790 if (NumMethodPoolTableLookups) 7791 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 7792 NumMethodPoolTableHits, NumMethodPoolTableLookups, 7793 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 7794 * 100.0)); 7795 if (NumIdentifierLookupHits) 7796 std::fprintf(stderr, 7797 " %u / %u identifier table lookups succeeded (%f%%)\n", 7798 NumIdentifierLookupHits, NumIdentifierLookups, 7799 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 7800 7801 if (GlobalIndex) { 7802 std::fprintf(stderr, "\n"); 7803 GlobalIndex->printStats(); 7804 } 7805 7806 std::fprintf(stderr, "\n"); 7807 dump(); 7808 std::fprintf(stderr, "\n"); 7809 } 7810 7811 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 7812 LLVM_DUMP_METHOD static void 7813 dumpModuleIDMap(StringRef Name, 7814 const ContinuousRangeMap<Key, ModuleFile *, 7815 InitialCapacity> &Map) { 7816 if (Map.begin() == Map.end()) 7817 return; 7818 7819 using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>; 7820 7821 llvm::errs() << Name << ":\n"; 7822 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 7823 I != IEnd; ++I) { 7824 llvm::errs() << " " << I->first << " -> " << I->second->FileName 7825 << "\n"; 7826 } 7827 } 7828 7829 LLVM_DUMP_METHOD void ASTReader::dump() { 7830 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 7831 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 7832 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 7833 dumpModuleIDMap("Global type map", GlobalTypeMap); 7834 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 7835 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 7836 dumpModuleIDMap("Global macro map", GlobalMacroMap); 7837 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 7838 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 7839 dumpModuleIDMap("Global preprocessed entity map", 7840 GlobalPreprocessedEntityMap); 7841 7842 llvm::errs() << "\n*** PCH/Modules Loaded:"; 7843 for (ModuleFile &M : ModuleMgr) 7844 M.dump(); 7845 } 7846 7847 /// Return the amount of memory used by memory buffers, breaking down 7848 /// by heap-backed versus mmap'ed memory. 7849 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 7850 for (ModuleFile &I : ModuleMgr) { 7851 if (llvm::MemoryBuffer *buf = I.Buffer) { 7852 size_t bytes = buf->getBufferSize(); 7853 switch (buf->getBufferKind()) { 7854 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 7855 sizes.malloc_bytes += bytes; 7856 break; 7857 case llvm::MemoryBuffer::MemoryBuffer_MMap: 7858 sizes.mmap_bytes += bytes; 7859 break; 7860 } 7861 } 7862 } 7863 } 7864 7865 void ASTReader::InitializeSema(Sema &S) { 7866 SemaObj = &S; 7867 S.addExternalSource(this); 7868 7869 // Makes sure any declarations that were deserialized "too early" 7870 // still get added to the identifier's declaration chains. 7871 for (uint64_t ID : PreloadedDeclIDs) { 7872 NamedDecl *D = cast<NamedDecl>(GetDecl(ID)); 7873 pushExternalDeclIntoScope(D, D->getDeclName()); 7874 } 7875 PreloadedDeclIDs.clear(); 7876 7877 // FIXME: What happens if these are changed by a module import? 7878 if (!FPPragmaOptions.empty()) { 7879 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 7880 FPOptionsOverride NewOverrides = 7881 FPOptionsOverride::getFromOpaqueInt(FPPragmaOptions[0]); 7882 SemaObj->CurFPFeatures = 7883 NewOverrides.applyOverrides(SemaObj->getLangOpts()); 7884 } 7885 7886 SemaObj->OpenCLFeatures = OpenCLExtensions; 7887 7888 UpdateSema(); 7889 } 7890 7891 void ASTReader::UpdateSema() { 7892 assert(SemaObj && "no Sema to update"); 7893 7894 // Load the offsets of the declarations that Sema references. 7895 // They will be lazily deserialized when needed. 7896 if (!SemaDeclRefs.empty()) { 7897 assert(SemaDeclRefs.size() % 3 == 0); 7898 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) { 7899 if (!SemaObj->StdNamespace) 7900 SemaObj->StdNamespace = SemaDeclRefs[I]; 7901 if (!SemaObj->StdBadAlloc) 7902 SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 7903 if (!SemaObj->StdAlignValT) 7904 SemaObj->StdAlignValT = SemaDeclRefs[I+2]; 7905 } 7906 SemaDeclRefs.clear(); 7907 } 7908 7909 // Update the state of pragmas. Use the same API as if we had encountered the 7910 // pragma in the source. 7911 if(OptimizeOffPragmaLocation.isValid()) 7912 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation); 7913 if (PragmaMSStructState != -1) 7914 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState); 7915 if (PointersToMembersPragmaLocation.isValid()) { 7916 SemaObj->ActOnPragmaMSPointersToMembers( 7917 (LangOptions::PragmaMSPointersToMembersKind) 7918 PragmaMSPointersToMembersState, 7919 PointersToMembersPragmaLocation); 7920 } 7921 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth; 7922 7923 if (PragmaAlignPackCurrentValue) { 7924 // The bottom of the stack might have a default value. It must be adjusted 7925 // to the current value to ensure that the packing state is preserved after 7926 // popping entries that were included/imported from a PCH/module. 7927 bool DropFirst = false; 7928 if (!PragmaAlignPackStack.empty() && 7929 PragmaAlignPackStack.front().Location.isInvalid()) { 7930 assert(PragmaAlignPackStack.front().Value == 7931 SemaObj->AlignPackStack.DefaultValue && 7932 "Expected a default alignment value"); 7933 SemaObj->AlignPackStack.Stack.emplace_back( 7934 PragmaAlignPackStack.front().SlotLabel, 7935 SemaObj->AlignPackStack.CurrentValue, 7936 SemaObj->AlignPackStack.CurrentPragmaLocation, 7937 PragmaAlignPackStack.front().PushLocation); 7938 DropFirst = true; 7939 } 7940 for (const auto &Entry : llvm::makeArrayRef(PragmaAlignPackStack) 7941 .drop_front(DropFirst ? 1 : 0)) { 7942 SemaObj->AlignPackStack.Stack.emplace_back( 7943 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation); 7944 } 7945 if (PragmaAlignPackCurrentLocation.isInvalid()) { 7946 assert(*PragmaAlignPackCurrentValue == 7947 SemaObj->AlignPackStack.DefaultValue && 7948 "Expected a default align and pack value"); 7949 // Keep the current values. 7950 } else { 7951 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue; 7952 SemaObj->AlignPackStack.CurrentPragmaLocation = 7953 PragmaAlignPackCurrentLocation; 7954 } 7955 } 7956 if (FpPragmaCurrentValue) { 7957 // The bottom of the stack might have a default value. It must be adjusted 7958 // to the current value to ensure that fp-pragma state is preserved after 7959 // popping entries that were included/imported from a PCH/module. 7960 bool DropFirst = false; 7961 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) { 7962 assert(FpPragmaStack.front().Value == 7963 SemaObj->FpPragmaStack.DefaultValue && 7964 "Expected a default pragma float_control value"); 7965 SemaObj->FpPragmaStack.Stack.emplace_back( 7966 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue, 7967 SemaObj->FpPragmaStack.CurrentPragmaLocation, 7968 FpPragmaStack.front().PushLocation); 7969 DropFirst = true; 7970 } 7971 for (const auto &Entry : 7972 llvm::makeArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0)) 7973 SemaObj->FpPragmaStack.Stack.emplace_back( 7974 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation); 7975 if (FpPragmaCurrentLocation.isInvalid()) { 7976 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue && 7977 "Expected a default pragma float_control value"); 7978 // Keep the current values. 7979 } else { 7980 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue; 7981 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation; 7982 } 7983 } 7984 7985 // For non-modular AST files, restore visiblity of modules. 7986 for (auto &Import : ImportedModules) { 7987 if (Import.ImportLoc.isInvalid()) 7988 continue; 7989 if (Module *Imported = getSubmodule(Import.ID)) { 7990 SemaObj->makeModuleVisible(Imported, Import.ImportLoc); 7991 } 7992 } 7993 } 7994 7995 IdentifierInfo *ASTReader::get(StringRef Name) { 7996 // Note that we are loading an identifier. 7997 Deserializing AnIdentifier(this); 7998 7999 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 8000 NumIdentifierLookups, 8001 NumIdentifierLookupHits); 8002 8003 // We don't need to do identifier table lookups in C++ modules (we preload 8004 // all interesting declarations, and don't need to use the scope for name 8005 // lookups). Perform the lookup in PCH files, though, since we don't build 8006 // a complete initial identifier table if we're carrying on from a PCH. 8007 if (PP.getLangOpts().CPlusPlus) { 8008 for (auto F : ModuleMgr.pch_modules()) 8009 if (Visitor(*F)) 8010 break; 8011 } else { 8012 // If there is a global index, look there first to determine which modules 8013 // provably do not have any results for this identifier. 8014 GlobalModuleIndex::HitSet Hits; 8015 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 8016 if (!loadGlobalIndex()) { 8017 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 8018 HitsPtr = &Hits; 8019 } 8020 } 8021 8022 ModuleMgr.visit(Visitor, HitsPtr); 8023 } 8024 8025 IdentifierInfo *II = Visitor.getIdentifierInfo(); 8026 markIdentifierUpToDate(II); 8027 return II; 8028 } 8029 8030 namespace clang { 8031 8032 /// An identifier-lookup iterator that enumerates all of the 8033 /// identifiers stored within a set of AST files. 8034 class ASTIdentifierIterator : public IdentifierIterator { 8035 /// The AST reader whose identifiers are being enumerated. 8036 const ASTReader &Reader; 8037 8038 /// The current index into the chain of AST files stored in 8039 /// the AST reader. 8040 unsigned Index; 8041 8042 /// The current position within the identifier lookup table 8043 /// of the current AST file. 8044 ASTIdentifierLookupTable::key_iterator Current; 8045 8046 /// The end position within the identifier lookup table of 8047 /// the current AST file. 8048 ASTIdentifierLookupTable::key_iterator End; 8049 8050 /// Whether to skip any modules in the ASTReader. 8051 bool SkipModules; 8052 8053 public: 8054 explicit ASTIdentifierIterator(const ASTReader &Reader, 8055 bool SkipModules = false); 8056 8057 StringRef Next() override; 8058 }; 8059 8060 } // namespace clang 8061 8062 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader, 8063 bool SkipModules) 8064 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) { 8065 } 8066 8067 StringRef ASTIdentifierIterator::Next() { 8068 while (Current == End) { 8069 // If we have exhausted all of our AST files, we're done. 8070 if (Index == 0) 8071 return StringRef(); 8072 8073 --Index; 8074 ModuleFile &F = Reader.ModuleMgr[Index]; 8075 if (SkipModules && F.isModule()) 8076 continue; 8077 8078 ASTIdentifierLookupTable *IdTable = 8079 (ASTIdentifierLookupTable *)F.IdentifierLookupTable; 8080 Current = IdTable->key_begin(); 8081 End = IdTable->key_end(); 8082 } 8083 8084 // We have any identifiers remaining in the current AST file; return 8085 // the next one. 8086 StringRef Result = *Current; 8087 ++Current; 8088 return Result; 8089 } 8090 8091 namespace { 8092 8093 /// A utility for appending two IdentifierIterators. 8094 class ChainedIdentifierIterator : public IdentifierIterator { 8095 std::unique_ptr<IdentifierIterator> Current; 8096 std::unique_ptr<IdentifierIterator> Queued; 8097 8098 public: 8099 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First, 8100 std::unique_ptr<IdentifierIterator> Second) 8101 : Current(std::move(First)), Queued(std::move(Second)) {} 8102 8103 StringRef Next() override { 8104 if (!Current) 8105 return StringRef(); 8106 8107 StringRef result = Current->Next(); 8108 if (!result.empty()) 8109 return result; 8110 8111 // Try the queued iterator, which may itself be empty. 8112 Current.reset(); 8113 std::swap(Current, Queued); 8114 return Next(); 8115 } 8116 }; 8117 8118 } // namespace 8119 8120 IdentifierIterator *ASTReader::getIdentifiers() { 8121 if (!loadGlobalIndex()) { 8122 std::unique_ptr<IdentifierIterator> ReaderIter( 8123 new ASTIdentifierIterator(*this, /*SkipModules=*/true)); 8124 std::unique_ptr<IdentifierIterator> ModulesIter( 8125 GlobalIndex->createIdentifierIterator()); 8126 return new ChainedIdentifierIterator(std::move(ReaderIter), 8127 std::move(ModulesIter)); 8128 } 8129 8130 return new ASTIdentifierIterator(*this); 8131 } 8132 8133 namespace clang { 8134 namespace serialization { 8135 8136 class ReadMethodPoolVisitor { 8137 ASTReader &Reader; 8138 Selector Sel; 8139 unsigned PriorGeneration; 8140 unsigned InstanceBits = 0; 8141 unsigned FactoryBits = 0; 8142 bool InstanceHasMoreThanOneDecl = false; 8143 bool FactoryHasMoreThanOneDecl = false; 8144 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 8145 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 8146 8147 public: 8148 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 8149 unsigned PriorGeneration) 8150 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {} 8151 8152 bool operator()(ModuleFile &M) { 8153 if (!M.SelectorLookupTable) 8154 return false; 8155 8156 // If we've already searched this module file, skip it now. 8157 if (M.Generation <= PriorGeneration) 8158 return true; 8159 8160 ++Reader.NumMethodPoolTableLookups; 8161 ASTSelectorLookupTable *PoolTable 8162 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 8163 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel); 8164 if (Pos == PoolTable->end()) 8165 return false; 8166 8167 ++Reader.NumMethodPoolTableHits; 8168 ++Reader.NumSelectorsRead; 8169 // FIXME: Not quite happy with the statistics here. We probably should 8170 // disable this tracking when called via LoadSelector. 8171 // Also, should entries without methods count as misses? 8172 ++Reader.NumMethodPoolEntriesRead; 8173 ASTSelectorLookupTrait::data_type Data = *Pos; 8174 if (Reader.DeserializationListener) 8175 Reader.DeserializationListener->SelectorRead(Data.ID, Sel); 8176 8177 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 8178 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 8179 InstanceBits = Data.InstanceBits; 8180 FactoryBits = Data.FactoryBits; 8181 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl; 8182 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl; 8183 return true; 8184 } 8185 8186 /// Retrieve the instance methods found by this visitor. 8187 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 8188 return InstanceMethods; 8189 } 8190 8191 /// Retrieve the instance methods found by this visitor. 8192 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 8193 return FactoryMethods; 8194 } 8195 8196 unsigned getInstanceBits() const { return InstanceBits; } 8197 unsigned getFactoryBits() const { return FactoryBits; } 8198 8199 bool instanceHasMoreThanOneDecl() const { 8200 return InstanceHasMoreThanOneDecl; 8201 } 8202 8203 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; } 8204 }; 8205 8206 } // namespace serialization 8207 } // namespace clang 8208 8209 /// Add the given set of methods to the method list. 8210 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 8211 ObjCMethodList &List) { 8212 for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 8213 S.addMethodToGlobalList(&List, Methods[I]); 8214 } 8215 } 8216 8217 void ASTReader::ReadMethodPool(Selector Sel) { 8218 // Get the selector generation and update it to the current generation. 8219 unsigned &Generation = SelectorGeneration[Sel]; 8220 unsigned PriorGeneration = Generation; 8221 Generation = getGeneration(); 8222 SelectorOutOfDate[Sel] = false; 8223 8224 // Search for methods defined with this selector. 8225 ++NumMethodPoolLookups; 8226 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 8227 ModuleMgr.visit(Visitor); 8228 8229 if (Visitor.getInstanceMethods().empty() && 8230 Visitor.getFactoryMethods().empty()) 8231 return; 8232 8233 ++NumMethodPoolHits; 8234 8235 if (!getSema()) 8236 return; 8237 8238 Sema &S = *getSema(); 8239 Sema::GlobalMethodPool::iterator Pos 8240 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first; 8241 8242 Pos->second.first.setBits(Visitor.getInstanceBits()); 8243 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl()); 8244 Pos->second.second.setBits(Visitor.getFactoryBits()); 8245 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl()); 8246 8247 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since 8248 // when building a module we keep every method individually and may need to 8249 // update hasMoreThanOneDecl as we add the methods. 8250 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 8251 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 8252 } 8253 8254 void ASTReader::updateOutOfDateSelector(Selector Sel) { 8255 if (SelectorOutOfDate[Sel]) 8256 ReadMethodPool(Sel); 8257 } 8258 8259 void ASTReader::ReadKnownNamespaces( 8260 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 8261 Namespaces.clear(); 8262 8263 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 8264 if (NamespaceDecl *Namespace 8265 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 8266 Namespaces.push_back(Namespace); 8267 } 8268 } 8269 8270 void ASTReader::ReadUndefinedButUsed( 8271 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) { 8272 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 8273 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 8274 SourceLocation Loc = 8275 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 8276 Undefined.insert(std::make_pair(D, Loc)); 8277 } 8278 } 8279 8280 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector< 8281 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> & 8282 Exprs) { 8283 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) { 8284 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++])); 8285 uint64_t Count = DelayedDeleteExprs[Idx++]; 8286 for (uint64_t C = 0; C < Count; ++C) { 8287 SourceLocation DeleteLoc = 8288 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]); 8289 const bool IsArrayForm = DelayedDeleteExprs[Idx++]; 8290 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm)); 8291 } 8292 } 8293 } 8294 8295 void ASTReader::ReadTentativeDefinitions( 8296 SmallVectorImpl<VarDecl *> &TentativeDefs) { 8297 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 8298 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 8299 if (Var) 8300 TentativeDefs.push_back(Var); 8301 } 8302 TentativeDefinitions.clear(); 8303 } 8304 8305 void ASTReader::ReadUnusedFileScopedDecls( 8306 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 8307 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 8308 DeclaratorDecl *D 8309 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 8310 if (D) 8311 Decls.push_back(D); 8312 } 8313 UnusedFileScopedDecls.clear(); 8314 } 8315 8316 void ASTReader::ReadDelegatingConstructors( 8317 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 8318 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 8319 CXXConstructorDecl *D 8320 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 8321 if (D) 8322 Decls.push_back(D); 8323 } 8324 DelegatingCtorDecls.clear(); 8325 } 8326 8327 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 8328 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 8329 TypedefNameDecl *D 8330 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 8331 if (D) 8332 Decls.push_back(D); 8333 } 8334 ExtVectorDecls.clear(); 8335 } 8336 8337 void ASTReader::ReadUnusedLocalTypedefNameCandidates( 8338 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 8339 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N; 8340 ++I) { 8341 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>( 8342 GetDecl(UnusedLocalTypedefNameCandidates[I])); 8343 if (D) 8344 Decls.insert(D); 8345 } 8346 UnusedLocalTypedefNameCandidates.clear(); 8347 } 8348 8349 void ASTReader::ReadDeclsToCheckForDeferredDiags( 8350 llvm::SmallSetVector<Decl *, 4> &Decls) { 8351 for (auto I : DeclsToCheckForDeferredDiags) { 8352 auto *D = dyn_cast_or_null<Decl>(GetDecl(I)); 8353 if (D) 8354 Decls.insert(D); 8355 } 8356 DeclsToCheckForDeferredDiags.clear(); 8357 } 8358 8359 void ASTReader::ReadReferencedSelectors( 8360 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) { 8361 if (ReferencedSelectorsData.empty()) 8362 return; 8363 8364 // If there are @selector references added them to its pool. This is for 8365 // implementation of -Wselector. 8366 unsigned int DataSize = ReferencedSelectorsData.size()-1; 8367 unsigned I = 0; 8368 while (I < DataSize) { 8369 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 8370 SourceLocation SelLoc 8371 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 8372 Sels.push_back(std::make_pair(Sel, SelLoc)); 8373 } 8374 ReferencedSelectorsData.clear(); 8375 } 8376 8377 void ASTReader::ReadWeakUndeclaredIdentifiers( 8378 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) { 8379 if (WeakUndeclaredIdentifiers.empty()) 8380 return; 8381 8382 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 8383 IdentifierInfo *WeakId 8384 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8385 IdentifierInfo *AliasId 8386 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8387 SourceLocation Loc 8388 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 8389 bool Used = WeakUndeclaredIdentifiers[I++]; 8390 WeakInfo WI(AliasId, Loc); 8391 WI.setUsed(Used); 8392 WeakIDs.push_back(std::make_pair(WeakId, WI)); 8393 } 8394 WeakUndeclaredIdentifiers.clear(); 8395 } 8396 8397 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 8398 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 8399 ExternalVTableUse VT; 8400 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 8401 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 8402 VT.DefinitionRequired = VTableUses[Idx++]; 8403 VTables.push_back(VT); 8404 } 8405 8406 VTableUses.clear(); 8407 } 8408 8409 void ASTReader::ReadPendingInstantiations( 8410 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) { 8411 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 8412 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 8413 SourceLocation Loc 8414 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 8415 8416 Pending.push_back(std::make_pair(D, Loc)); 8417 } 8418 PendingInstantiations.clear(); 8419 } 8420 8421 void ASTReader::ReadLateParsedTemplates( 8422 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>> 8423 &LPTMap) { 8424 for (auto &LPT : LateParsedTemplates) { 8425 ModuleFile *FMod = LPT.first; 8426 RecordDataImpl &LateParsed = LPT.second; 8427 for (unsigned Idx = 0, N = LateParsed.size(); Idx < N; 8428 /* In loop */) { 8429 FunctionDecl *FD = 8430 cast<FunctionDecl>(GetLocalDecl(*FMod, LateParsed[Idx++])); 8431 8432 auto LT = std::make_unique<LateParsedTemplate>(); 8433 LT->D = GetLocalDecl(*FMod, LateParsed[Idx++]); 8434 8435 ModuleFile *F = getOwningModuleFile(LT->D); 8436 assert(F && "No module"); 8437 8438 unsigned TokN = LateParsed[Idx++]; 8439 LT->Toks.reserve(TokN); 8440 for (unsigned T = 0; T < TokN; ++T) 8441 LT->Toks.push_back(ReadToken(*F, LateParsed, Idx)); 8442 8443 LPTMap.insert(std::make_pair(FD, std::move(LT))); 8444 } 8445 } 8446 } 8447 8448 void ASTReader::LoadSelector(Selector Sel) { 8449 // It would be complicated to avoid reading the methods anyway. So don't. 8450 ReadMethodPool(Sel); 8451 } 8452 8453 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 8454 assert(ID && "Non-zero identifier ID required"); 8455 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 8456 IdentifiersLoaded[ID - 1] = II; 8457 if (DeserializationListener) 8458 DeserializationListener->IdentifierRead(ID, II); 8459 } 8460 8461 /// Set the globally-visible declarations associated with the given 8462 /// identifier. 8463 /// 8464 /// If the AST reader is currently in a state where the given declaration IDs 8465 /// cannot safely be resolved, they are queued until it is safe to resolve 8466 /// them. 8467 /// 8468 /// \param II an IdentifierInfo that refers to one or more globally-visible 8469 /// declarations. 8470 /// 8471 /// \param DeclIDs the set of declaration IDs with the name @p II that are 8472 /// visible at global scope. 8473 /// 8474 /// \param Decls if non-null, this vector will be populated with the set of 8475 /// deserialized declarations. These declarations will not be pushed into 8476 /// scope. 8477 void 8478 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 8479 const SmallVectorImpl<uint32_t> &DeclIDs, 8480 SmallVectorImpl<Decl *> *Decls) { 8481 if (NumCurrentElementsDeserializing && !Decls) { 8482 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 8483 return; 8484 } 8485 8486 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 8487 if (!SemaObj) { 8488 // Queue this declaration so that it will be added to the 8489 // translation unit scope and identifier's declaration chain 8490 // once a Sema object is known. 8491 PreloadedDeclIDs.push_back(DeclIDs[I]); 8492 continue; 8493 } 8494 8495 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 8496 8497 // If we're simply supposed to record the declarations, do so now. 8498 if (Decls) { 8499 Decls->push_back(D); 8500 continue; 8501 } 8502 8503 // Introduce this declaration into the translation-unit scope 8504 // and add it to the declaration chain for this identifier, so 8505 // that (unqualified) name lookup will find it. 8506 pushExternalDeclIntoScope(D, II); 8507 } 8508 } 8509 8510 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 8511 if (ID == 0) 8512 return nullptr; 8513 8514 if (IdentifiersLoaded.empty()) { 8515 Error("no identifier table in AST file"); 8516 return nullptr; 8517 } 8518 8519 ID -= 1; 8520 if (!IdentifiersLoaded[ID]) { 8521 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 8522 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 8523 ModuleFile *M = I->second; 8524 unsigned Index = ID - M->BaseIdentifierID; 8525 const unsigned char *Data = 8526 M->IdentifierTableData + M->IdentifierOffsets[Index]; 8527 8528 ASTIdentifierLookupTrait Trait(*this, *M); 8529 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 8530 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 8531 auto &II = PP.getIdentifierTable().get(Key); 8532 IdentifiersLoaded[ID] = &II; 8533 markIdentifierFromAST(*this, II); 8534 if (DeserializationListener) 8535 DeserializationListener->IdentifierRead(ID + 1, &II); 8536 } 8537 8538 return IdentifiersLoaded[ID]; 8539 } 8540 8541 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 8542 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 8543 } 8544 8545 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 8546 if (LocalID < NUM_PREDEF_IDENT_IDS) 8547 return LocalID; 8548 8549 if (!M.ModuleOffsetMap.empty()) 8550 ReadModuleOffsetMap(M); 8551 8552 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8553 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 8554 assert(I != M.IdentifierRemap.end() 8555 && "Invalid index into identifier index remap"); 8556 8557 return LocalID + I->second; 8558 } 8559 8560 MacroInfo *ASTReader::getMacro(MacroID ID) { 8561 if (ID == 0) 8562 return nullptr; 8563 8564 if (MacrosLoaded.empty()) { 8565 Error("no macro table in AST file"); 8566 return nullptr; 8567 } 8568 8569 ID -= NUM_PREDEF_MACRO_IDS; 8570 if (!MacrosLoaded[ID]) { 8571 GlobalMacroMapType::iterator I 8572 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 8573 assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 8574 ModuleFile *M = I->second; 8575 unsigned Index = ID - M->BaseMacroID; 8576 MacrosLoaded[ID] = 8577 ReadMacroRecord(*M, M->MacroOffsetsBase + M->MacroOffsets[Index]); 8578 8579 if (DeserializationListener) 8580 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 8581 MacrosLoaded[ID]); 8582 } 8583 8584 return MacrosLoaded[ID]; 8585 } 8586 8587 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 8588 if (LocalID < NUM_PREDEF_MACRO_IDS) 8589 return LocalID; 8590 8591 if (!M.ModuleOffsetMap.empty()) 8592 ReadModuleOffsetMap(M); 8593 8594 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8595 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 8596 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 8597 8598 return LocalID + I->second; 8599 } 8600 8601 serialization::SubmoduleID 8602 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 8603 if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 8604 return LocalID; 8605 8606 if (!M.ModuleOffsetMap.empty()) 8607 ReadModuleOffsetMap(M); 8608 8609 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8610 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 8611 assert(I != M.SubmoduleRemap.end() 8612 && "Invalid index into submodule index remap"); 8613 8614 return LocalID + I->second; 8615 } 8616 8617 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) { 8618 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 8619 assert(GlobalID == 0 && "Unhandled global submodule ID"); 8620 return nullptr; 8621 } 8622 8623 if (GlobalID > SubmodulesLoaded.size()) { 8624 Error("submodule ID out of range in AST file"); 8625 return nullptr; 8626 } 8627 8628 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 8629 } 8630 8631 Module *ASTReader::getModule(unsigned ID) { 8632 return getSubmodule(ID); 8633 } 8634 8635 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) { 8636 if (ID & 1) { 8637 // It's a module, look it up by submodule ID. 8638 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1)); 8639 return I == GlobalSubmoduleMap.end() ? nullptr : I->second; 8640 } else { 8641 // It's a prefix (preamble, PCH, ...). Look it up by index. 8642 unsigned IndexFromEnd = ID >> 1; 8643 assert(IndexFromEnd && "got reference to unknown module file"); 8644 return getModuleManager().pch_modules().end()[-IndexFromEnd]; 8645 } 8646 } 8647 8648 unsigned ASTReader::getModuleFileID(ModuleFile *F) { 8649 if (!F) 8650 return 1; 8651 8652 // For a file representing a module, use the submodule ID of the top-level 8653 // module as the file ID. For any other kind of file, the number of such 8654 // files loaded beforehand will be the same on reload. 8655 // FIXME: Is this true even if we have an explicit module file and a PCH? 8656 if (F->isModule()) 8657 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1; 8658 8659 auto PCHModules = getModuleManager().pch_modules(); 8660 auto I = llvm::find(PCHModules, F); 8661 assert(I != PCHModules.end() && "emitting reference to unknown file"); 8662 return (I - PCHModules.end()) << 1; 8663 } 8664 8665 llvm::Optional<ASTSourceDescriptor> 8666 ASTReader::getSourceDescriptor(unsigned ID) { 8667 if (Module *M = getSubmodule(ID)) 8668 return ASTSourceDescriptor(*M); 8669 8670 // If there is only a single PCH, return it instead. 8671 // Chained PCH are not supported. 8672 const auto &PCHChain = ModuleMgr.pch_modules(); 8673 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) { 8674 ModuleFile &MF = ModuleMgr.getPrimaryModule(); 8675 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName); 8676 StringRef FileName = llvm::sys::path::filename(MF.FileName); 8677 return ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName, 8678 MF.Signature); 8679 } 8680 return None; 8681 } 8682 8683 ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) { 8684 auto I = DefinitionSource.find(FD); 8685 if (I == DefinitionSource.end()) 8686 return EK_ReplyHazy; 8687 return I->second ? EK_Never : EK_Always; 8688 } 8689 8690 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 8691 return DecodeSelector(getGlobalSelectorID(M, LocalID)); 8692 } 8693 8694 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { 8695 if (ID == 0) 8696 return Selector(); 8697 8698 if (ID > SelectorsLoaded.size()) { 8699 Error("selector ID out of range in AST file"); 8700 return Selector(); 8701 } 8702 8703 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) { 8704 // Load this selector from the selector table. 8705 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 8706 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 8707 ModuleFile &M = *I->second; 8708 ASTSelectorLookupTrait Trait(*this, M); 8709 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 8710 SelectorsLoaded[ID - 1] = 8711 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 8712 if (DeserializationListener) 8713 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 8714 } 8715 8716 return SelectorsLoaded[ID - 1]; 8717 } 8718 8719 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 8720 return DecodeSelector(ID); 8721 } 8722 8723 uint32_t ASTReader::GetNumExternalSelectors() { 8724 // ID 0 (the null selector) is considered an external selector. 8725 return getTotalNumSelectors() + 1; 8726 } 8727 8728 serialization::SelectorID 8729 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 8730 if (LocalID < NUM_PREDEF_SELECTOR_IDS) 8731 return LocalID; 8732 8733 if (!M.ModuleOffsetMap.empty()) 8734 ReadModuleOffsetMap(M); 8735 8736 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8737 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 8738 assert(I != M.SelectorRemap.end() 8739 && "Invalid index into selector index remap"); 8740 8741 return LocalID + I->second; 8742 } 8743 8744 DeclarationNameLoc 8745 ASTRecordReader::readDeclarationNameLoc(DeclarationName Name) { 8746 switch (Name.getNameKind()) { 8747 case DeclarationName::CXXConstructorName: 8748 case DeclarationName::CXXDestructorName: 8749 case DeclarationName::CXXConversionFunctionName: 8750 return DeclarationNameLoc::makeNamedTypeLoc(readTypeSourceInfo()); 8751 8752 case DeclarationName::CXXOperatorName: 8753 return DeclarationNameLoc::makeCXXOperatorNameLoc(readSourceRange()); 8754 8755 case DeclarationName::CXXLiteralOperatorName: 8756 return DeclarationNameLoc::makeCXXLiteralOperatorNameLoc( 8757 readSourceLocation()); 8758 8759 case DeclarationName::Identifier: 8760 case DeclarationName::ObjCZeroArgSelector: 8761 case DeclarationName::ObjCOneArgSelector: 8762 case DeclarationName::ObjCMultiArgSelector: 8763 case DeclarationName::CXXUsingDirective: 8764 case DeclarationName::CXXDeductionGuideName: 8765 break; 8766 } 8767 return DeclarationNameLoc(); 8768 } 8769 8770 DeclarationNameInfo ASTRecordReader::readDeclarationNameInfo() { 8771 DeclarationNameInfo NameInfo; 8772 NameInfo.setName(readDeclarationName()); 8773 NameInfo.setLoc(readSourceLocation()); 8774 NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName())); 8775 return NameInfo; 8776 } 8777 8778 void ASTRecordReader::readQualifierInfo(QualifierInfo &Info) { 8779 Info.QualifierLoc = readNestedNameSpecifierLoc(); 8780 unsigned NumTPLists = readInt(); 8781 Info.NumTemplParamLists = NumTPLists; 8782 if (NumTPLists) { 8783 Info.TemplParamLists = 8784 new (getContext()) TemplateParameterList *[NumTPLists]; 8785 for (unsigned i = 0; i != NumTPLists; ++i) 8786 Info.TemplParamLists[i] = readTemplateParameterList(); 8787 } 8788 } 8789 8790 TemplateParameterList * 8791 ASTRecordReader::readTemplateParameterList() { 8792 SourceLocation TemplateLoc = readSourceLocation(); 8793 SourceLocation LAngleLoc = readSourceLocation(); 8794 SourceLocation RAngleLoc = readSourceLocation(); 8795 8796 unsigned NumParams = readInt(); 8797 SmallVector<NamedDecl *, 16> Params; 8798 Params.reserve(NumParams); 8799 while (NumParams--) 8800 Params.push_back(readDeclAs<NamedDecl>()); 8801 8802 bool HasRequiresClause = readBool(); 8803 Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr; 8804 8805 TemplateParameterList *TemplateParams = TemplateParameterList::Create( 8806 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause); 8807 return TemplateParams; 8808 } 8809 8810 void ASTRecordReader::readTemplateArgumentList( 8811 SmallVectorImpl<TemplateArgument> &TemplArgs, 8812 bool Canonicalize) { 8813 unsigned NumTemplateArgs = readInt(); 8814 TemplArgs.reserve(NumTemplateArgs); 8815 while (NumTemplateArgs--) 8816 TemplArgs.push_back(readTemplateArgument(Canonicalize)); 8817 } 8818 8819 /// Read a UnresolvedSet structure. 8820 void ASTRecordReader::readUnresolvedSet(LazyASTUnresolvedSet &Set) { 8821 unsigned NumDecls = readInt(); 8822 Set.reserve(getContext(), NumDecls); 8823 while (NumDecls--) { 8824 DeclID ID = readDeclID(); 8825 AccessSpecifier AS = (AccessSpecifier) readInt(); 8826 Set.addLazyDecl(getContext(), ID, AS); 8827 } 8828 } 8829 8830 CXXBaseSpecifier 8831 ASTRecordReader::readCXXBaseSpecifier() { 8832 bool isVirtual = readBool(); 8833 bool isBaseOfClass = readBool(); 8834 AccessSpecifier AS = static_cast<AccessSpecifier>(readInt()); 8835 bool inheritConstructors = readBool(); 8836 TypeSourceInfo *TInfo = readTypeSourceInfo(); 8837 SourceRange Range = readSourceRange(); 8838 SourceLocation EllipsisLoc = readSourceLocation(); 8839 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 8840 EllipsisLoc); 8841 Result.setInheritConstructors(inheritConstructors); 8842 return Result; 8843 } 8844 8845 CXXCtorInitializer ** 8846 ASTRecordReader::readCXXCtorInitializers() { 8847 ASTContext &Context = getContext(); 8848 unsigned NumInitializers = readInt(); 8849 assert(NumInitializers && "wrote ctor initializers but have no inits"); 8850 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers]; 8851 for (unsigned i = 0; i != NumInitializers; ++i) { 8852 TypeSourceInfo *TInfo = nullptr; 8853 bool IsBaseVirtual = false; 8854 FieldDecl *Member = nullptr; 8855 IndirectFieldDecl *IndirectMember = nullptr; 8856 8857 CtorInitializerType Type = (CtorInitializerType) readInt(); 8858 switch (Type) { 8859 case CTOR_INITIALIZER_BASE: 8860 TInfo = readTypeSourceInfo(); 8861 IsBaseVirtual = readBool(); 8862 break; 8863 8864 case CTOR_INITIALIZER_DELEGATING: 8865 TInfo = readTypeSourceInfo(); 8866 break; 8867 8868 case CTOR_INITIALIZER_MEMBER: 8869 Member = readDeclAs<FieldDecl>(); 8870 break; 8871 8872 case CTOR_INITIALIZER_INDIRECT_MEMBER: 8873 IndirectMember = readDeclAs<IndirectFieldDecl>(); 8874 break; 8875 } 8876 8877 SourceLocation MemberOrEllipsisLoc = readSourceLocation(); 8878 Expr *Init = readExpr(); 8879 SourceLocation LParenLoc = readSourceLocation(); 8880 SourceLocation RParenLoc = readSourceLocation(); 8881 8882 CXXCtorInitializer *BOMInit; 8883 if (Type == CTOR_INITIALIZER_BASE) 8884 BOMInit = new (Context) 8885 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init, 8886 RParenLoc, MemberOrEllipsisLoc); 8887 else if (Type == CTOR_INITIALIZER_DELEGATING) 8888 BOMInit = new (Context) 8889 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc); 8890 else if (Member) 8891 BOMInit = new (Context) 8892 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc, 8893 Init, RParenLoc); 8894 else 8895 BOMInit = new (Context) 8896 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc, 8897 LParenLoc, Init, RParenLoc); 8898 8899 if (/*IsWritten*/readBool()) { 8900 unsigned SourceOrder = readInt(); 8901 BOMInit->setSourceOrder(SourceOrder); 8902 } 8903 8904 CtorInitializers[i] = BOMInit; 8905 } 8906 8907 return CtorInitializers; 8908 } 8909 8910 NestedNameSpecifierLoc 8911 ASTRecordReader::readNestedNameSpecifierLoc() { 8912 ASTContext &Context = getContext(); 8913 unsigned N = readInt(); 8914 NestedNameSpecifierLocBuilder Builder; 8915 for (unsigned I = 0; I != N; ++I) { 8916 auto Kind = readNestedNameSpecifierKind(); 8917 switch (Kind) { 8918 case NestedNameSpecifier::Identifier: { 8919 IdentifierInfo *II = readIdentifier(); 8920 SourceRange Range = readSourceRange(); 8921 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 8922 break; 8923 } 8924 8925 case NestedNameSpecifier::Namespace: { 8926 NamespaceDecl *NS = readDeclAs<NamespaceDecl>(); 8927 SourceRange Range = readSourceRange(); 8928 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 8929 break; 8930 } 8931 8932 case NestedNameSpecifier::NamespaceAlias: { 8933 NamespaceAliasDecl *Alias = readDeclAs<NamespaceAliasDecl>(); 8934 SourceRange Range = readSourceRange(); 8935 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 8936 break; 8937 } 8938 8939 case NestedNameSpecifier::TypeSpec: 8940 case NestedNameSpecifier::TypeSpecWithTemplate: { 8941 bool Template = readBool(); 8942 TypeSourceInfo *T = readTypeSourceInfo(); 8943 if (!T) 8944 return NestedNameSpecifierLoc(); 8945 SourceLocation ColonColonLoc = readSourceLocation(); 8946 8947 // FIXME: 'template' keyword location not saved anywhere, so we fake it. 8948 Builder.Extend(Context, 8949 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 8950 T->getTypeLoc(), ColonColonLoc); 8951 break; 8952 } 8953 8954 case NestedNameSpecifier::Global: { 8955 SourceLocation ColonColonLoc = readSourceLocation(); 8956 Builder.MakeGlobal(Context, ColonColonLoc); 8957 break; 8958 } 8959 8960 case NestedNameSpecifier::Super: { 8961 CXXRecordDecl *RD = readDeclAs<CXXRecordDecl>(); 8962 SourceRange Range = readSourceRange(); 8963 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd()); 8964 break; 8965 } 8966 } 8967 } 8968 8969 return Builder.getWithLocInContext(Context); 8970 } 8971 8972 SourceRange 8973 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 8974 unsigned &Idx) { 8975 SourceLocation beg = ReadSourceLocation(F, Record, Idx); 8976 SourceLocation end = ReadSourceLocation(F, Record, Idx); 8977 return SourceRange(beg, end); 8978 } 8979 8980 /// Read a floating-point value 8981 llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) { 8982 return llvm::APFloat(Sem, readAPInt()); 8983 } 8984 8985 // Read a string 8986 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 8987 unsigned Len = Record[Idx++]; 8988 std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 8989 Idx += Len; 8990 return Result; 8991 } 8992 8993 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record, 8994 unsigned &Idx) { 8995 std::string Filename = ReadString(Record, Idx); 8996 ResolveImportedPath(F, Filename); 8997 return Filename; 8998 } 8999 9000 std::string ASTReader::ReadPath(StringRef BaseDirectory, 9001 const RecordData &Record, unsigned &Idx) { 9002 std::string Filename = ReadString(Record, Idx); 9003 if (!BaseDirectory.empty()) 9004 ResolveImportedPath(Filename, BaseDirectory); 9005 return Filename; 9006 } 9007 9008 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 9009 unsigned &Idx) { 9010 unsigned Major = Record[Idx++]; 9011 unsigned Minor = Record[Idx++]; 9012 unsigned Subminor = Record[Idx++]; 9013 if (Minor == 0) 9014 return VersionTuple(Major); 9015 if (Subminor == 0) 9016 return VersionTuple(Major, Minor - 1); 9017 return VersionTuple(Major, Minor - 1, Subminor - 1); 9018 } 9019 9020 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 9021 const RecordData &Record, 9022 unsigned &Idx) { 9023 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 9024 return CXXTemporary::Create(getContext(), Decl); 9025 } 9026 9027 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const { 9028 return Diag(CurrentImportLoc, DiagID); 9029 } 9030 9031 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const { 9032 return Diags.Report(Loc, DiagID); 9033 } 9034 9035 /// Retrieve the identifier table associated with the 9036 /// preprocessor. 9037 IdentifierTable &ASTReader::getIdentifierTable() { 9038 return PP.getIdentifierTable(); 9039 } 9040 9041 /// Record that the given ID maps to the given switch-case 9042 /// statement. 9043 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 9044 assert((*CurrSwitchCaseStmts)[ID] == nullptr && 9045 "Already have a SwitchCase with this ID"); 9046 (*CurrSwitchCaseStmts)[ID] = SC; 9047 } 9048 9049 /// Retrieve the switch-case statement with the given ID. 9050 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 9051 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID"); 9052 return (*CurrSwitchCaseStmts)[ID]; 9053 } 9054 9055 void ASTReader::ClearSwitchCaseIDs() { 9056 CurrSwitchCaseStmts->clear(); 9057 } 9058 9059 void ASTReader::ReadComments() { 9060 ASTContext &Context = getContext(); 9061 std::vector<RawComment *> Comments; 9062 for (SmallVectorImpl<std::pair<BitstreamCursor, 9063 serialization::ModuleFile *>>::iterator 9064 I = CommentsCursors.begin(), 9065 E = CommentsCursors.end(); 9066 I != E; ++I) { 9067 Comments.clear(); 9068 BitstreamCursor &Cursor = I->first; 9069 serialization::ModuleFile &F = *I->second; 9070 SavedStreamPosition SavedPosition(Cursor); 9071 9072 RecordData Record; 9073 while (true) { 9074 Expected<llvm::BitstreamEntry> MaybeEntry = 9075 Cursor.advanceSkippingSubblocks( 9076 BitstreamCursor::AF_DontPopBlockAtEnd); 9077 if (!MaybeEntry) { 9078 Error(MaybeEntry.takeError()); 9079 return; 9080 } 9081 llvm::BitstreamEntry Entry = MaybeEntry.get(); 9082 9083 switch (Entry.Kind) { 9084 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 9085 case llvm::BitstreamEntry::Error: 9086 Error("malformed block record in AST file"); 9087 return; 9088 case llvm::BitstreamEntry::EndBlock: 9089 goto NextCursor; 9090 case llvm::BitstreamEntry::Record: 9091 // The interesting case. 9092 break; 9093 } 9094 9095 // Read a record. 9096 Record.clear(); 9097 Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record); 9098 if (!MaybeComment) { 9099 Error(MaybeComment.takeError()); 9100 return; 9101 } 9102 switch ((CommentRecordTypes)MaybeComment.get()) { 9103 case COMMENTS_RAW_COMMENT: { 9104 unsigned Idx = 0; 9105 SourceRange SR = ReadSourceRange(F, Record, Idx); 9106 RawComment::CommentKind Kind = 9107 (RawComment::CommentKind) Record[Idx++]; 9108 bool IsTrailingComment = Record[Idx++]; 9109 bool IsAlmostTrailingComment = Record[Idx++]; 9110 Comments.push_back(new (Context) RawComment( 9111 SR, Kind, IsTrailingComment, IsAlmostTrailingComment)); 9112 break; 9113 } 9114 } 9115 } 9116 NextCursor: 9117 llvm::DenseMap<FileID, std::map<unsigned, RawComment *>> 9118 FileToOffsetToComment; 9119 for (RawComment *C : Comments) { 9120 SourceLocation CommentLoc = C->getBeginLoc(); 9121 if (CommentLoc.isValid()) { 9122 std::pair<FileID, unsigned> Loc = 9123 SourceMgr.getDecomposedLoc(CommentLoc); 9124 if (Loc.first.isValid()) 9125 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C); 9126 } 9127 } 9128 } 9129 } 9130 9131 void ASTReader::visitInputFiles(serialization::ModuleFile &MF, 9132 bool IncludeSystem, bool Complain, 9133 llvm::function_ref<void(const serialization::InputFile &IF, 9134 bool isSystem)> Visitor) { 9135 unsigned NumUserInputs = MF.NumUserInputFiles; 9136 unsigned NumInputs = MF.InputFilesLoaded.size(); 9137 assert(NumUserInputs <= NumInputs); 9138 unsigned N = IncludeSystem ? NumInputs : NumUserInputs; 9139 for (unsigned I = 0; I < N; ++I) { 9140 bool IsSystem = I >= NumUserInputs; 9141 InputFile IF = getInputFile(MF, I+1, Complain); 9142 Visitor(IF, IsSystem); 9143 } 9144 } 9145 9146 void ASTReader::visitTopLevelModuleMaps( 9147 serialization::ModuleFile &MF, 9148 llvm::function_ref<void(const FileEntry *FE)> Visitor) { 9149 unsigned NumInputs = MF.InputFilesLoaded.size(); 9150 for (unsigned I = 0; I < NumInputs; ++I) { 9151 InputFileInfo IFI = readInputFileInfo(MF, I + 1); 9152 if (IFI.TopLevelModuleMap) 9153 // FIXME: This unnecessarily re-reads the InputFileInfo. 9154 if (auto FE = getInputFile(MF, I + 1).getFile()) 9155 Visitor(FE); 9156 } 9157 } 9158 9159 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) { 9160 // If we know the owning module, use it. 9161 if (Module *M = D->getImportedOwningModule()) 9162 return M->getFullModuleName(); 9163 9164 // Otherwise, use the name of the top-level module the decl is within. 9165 if (ModuleFile *M = getOwningModuleFile(D)) 9166 return M->ModuleName; 9167 9168 // Not from a module. 9169 return {}; 9170 } 9171 9172 void ASTReader::finishPendingActions() { 9173 while (!PendingIdentifierInfos.empty() || !PendingFunctionTypes.empty() || 9174 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() || 9175 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || 9176 !PendingUpdateRecords.empty()) { 9177 // If any identifiers with corresponding top-level declarations have 9178 // been loaded, load those declarations now. 9179 using TopLevelDeclsMap = 9180 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>; 9181 TopLevelDeclsMap TopLevelDecls; 9182 9183 while (!PendingIdentifierInfos.empty()) { 9184 IdentifierInfo *II = PendingIdentifierInfos.back().first; 9185 SmallVector<uint32_t, 4> DeclIDs = 9186 std::move(PendingIdentifierInfos.back().second); 9187 PendingIdentifierInfos.pop_back(); 9188 9189 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 9190 } 9191 9192 // Load each function type that we deferred loading because it was a 9193 // deduced type that might refer to a local type declared within itself. 9194 for (unsigned I = 0; I != PendingFunctionTypes.size(); ++I) { 9195 auto *FD = PendingFunctionTypes[I].first; 9196 FD->setType(GetType(PendingFunctionTypes[I].second)); 9197 9198 // If we gave a function a deduced return type, remember that we need to 9199 // propagate that along the redeclaration chain. 9200 auto *DT = FD->getReturnType()->getContainedDeducedType(); 9201 if (DT && DT->isDeduced()) 9202 PendingDeducedTypeUpdates.insert( 9203 {FD->getCanonicalDecl(), FD->getReturnType()}); 9204 } 9205 PendingFunctionTypes.clear(); 9206 9207 // For each decl chain that we wanted to complete while deserializing, mark 9208 // it as "still needs to be completed". 9209 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) { 9210 markIncompleteDeclChain(PendingIncompleteDeclChains[I]); 9211 } 9212 PendingIncompleteDeclChains.clear(); 9213 9214 // Load pending declaration chains. 9215 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) 9216 loadPendingDeclChain(PendingDeclChains[I].first, 9217 PendingDeclChains[I].second); 9218 PendingDeclChains.clear(); 9219 9220 // Make the most recent of the top-level declarations visible. 9221 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 9222 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 9223 IdentifierInfo *II = TLD->first; 9224 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 9225 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 9226 } 9227 } 9228 9229 // Load any pending macro definitions. 9230 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 9231 IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 9232 SmallVector<PendingMacroInfo, 2> GlobalIDs; 9233 GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 9234 // Initialize the macro history from chained-PCHs ahead of module imports. 9235 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9236 ++IDIdx) { 9237 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9238 if (!Info.M->isModule()) 9239 resolvePendingMacro(II, Info); 9240 } 9241 // Handle module imports. 9242 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9243 ++IDIdx) { 9244 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9245 if (Info.M->isModule()) 9246 resolvePendingMacro(II, Info); 9247 } 9248 } 9249 PendingMacroIDs.clear(); 9250 9251 // Wire up the DeclContexts for Decls that we delayed setting until 9252 // recursive loading is completed. 9253 while (!PendingDeclContextInfos.empty()) { 9254 PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 9255 PendingDeclContextInfos.pop_front(); 9256 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 9257 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 9258 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 9259 } 9260 9261 // Perform any pending declaration updates. 9262 while (!PendingUpdateRecords.empty()) { 9263 auto Update = PendingUpdateRecords.pop_back_val(); 9264 ReadingKindTracker ReadingKind(Read_Decl, *this); 9265 loadDeclUpdateRecords(Update); 9266 } 9267 } 9268 9269 // At this point, all update records for loaded decls are in place, so any 9270 // fake class definitions should have become real. 9271 assert(PendingFakeDefinitionData.empty() && 9272 "faked up a class definition but never saw the real one"); 9273 9274 // If we deserialized any C++ or Objective-C class definitions, any 9275 // Objective-C protocol definitions, or any redeclarable templates, make sure 9276 // that all redeclarations point to the definitions. Note that this can only 9277 // happen now, after the redeclaration chains have been fully wired. 9278 for (Decl *D : PendingDefinitions) { 9279 if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 9280 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) { 9281 // Make sure that the TagType points at the definition. 9282 const_cast<TagType*>(TagT)->decl = TD; 9283 } 9284 9285 if (auto RD = dyn_cast<CXXRecordDecl>(D)) { 9286 for (auto *R = getMostRecentExistingDecl(RD); R; 9287 R = R->getPreviousDecl()) { 9288 assert((R == D) == 9289 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && 9290 "declaration thinks it's the definition but it isn't"); 9291 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData; 9292 } 9293 } 9294 9295 continue; 9296 } 9297 9298 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) { 9299 // Make sure that the ObjCInterfaceType points at the definition. 9300 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 9301 ->Decl = ID; 9302 9303 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl()) 9304 cast<ObjCInterfaceDecl>(R)->Data = ID->Data; 9305 9306 continue; 9307 } 9308 9309 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) { 9310 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl()) 9311 cast<ObjCProtocolDecl>(R)->Data = PD->Data; 9312 9313 continue; 9314 } 9315 9316 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl(); 9317 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl()) 9318 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common; 9319 } 9320 PendingDefinitions.clear(); 9321 9322 // Load the bodies of any functions or methods we've encountered. We do 9323 // this now (delayed) so that we can be sure that the declaration chains 9324 // have been fully wired up (hasBody relies on this). 9325 // FIXME: We shouldn't require complete redeclaration chains here. 9326 for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 9327 PBEnd = PendingBodies.end(); 9328 PB != PBEnd; ++PB) { 9329 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 9330 // For a function defined inline within a class template, force the 9331 // canonical definition to be the one inside the canonical definition of 9332 // the template. This ensures that we instantiate from a correct view 9333 // of the template. 9334 // 9335 // Sadly we can't do this more generally: we can't be sure that all 9336 // copies of an arbitrary class definition will have the same members 9337 // defined (eg, some member functions may not be instantiated, and some 9338 // special members may or may not have been implicitly defined). 9339 if (auto *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalParent())) 9340 if (RD->isDependentContext() && !RD->isThisDeclarationADefinition()) 9341 continue; 9342 9343 // FIXME: Check for =delete/=default? 9344 // FIXME: Complain about ODR violations here? 9345 const FunctionDecl *Defn = nullptr; 9346 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) { 9347 FD->setLazyBody(PB->second); 9348 } else { 9349 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn); 9350 mergeDefinitionVisibility(NonConstDefn, FD); 9351 9352 if (!FD->isLateTemplateParsed() && 9353 !NonConstDefn->isLateTemplateParsed() && 9354 FD->getODRHash() != NonConstDefn->getODRHash()) { 9355 if (!isa<CXXMethodDecl>(FD)) { 9356 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9357 } else if (FD->getLexicalParent()->isFileContext() && 9358 NonConstDefn->getLexicalParent()->isFileContext()) { 9359 // Only diagnose out-of-line method definitions. If they are 9360 // in class definitions, then an error will be generated when 9361 // processing the class bodies. 9362 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9363 } 9364 } 9365 } 9366 continue; 9367 } 9368 9369 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 9370 if (!getContext().getLangOpts().Modules || !MD->hasBody()) 9371 MD->setLazyBody(PB->second); 9372 } 9373 PendingBodies.clear(); 9374 9375 // Do some cleanup. 9376 for (auto *ND : PendingMergedDefinitionsToDeduplicate) 9377 getContext().deduplicateMergedDefinitonsFor(ND); 9378 PendingMergedDefinitionsToDeduplicate.clear(); 9379 } 9380 9381 void ASTReader::diagnoseOdrViolations() { 9382 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() && 9383 PendingFunctionOdrMergeFailures.empty() && 9384 PendingEnumOdrMergeFailures.empty()) 9385 return; 9386 9387 // Trigger the import of the full definition of each class that had any 9388 // odr-merging problems, so we can produce better diagnostics for them. 9389 // These updates may in turn find and diagnose some ODR failures, so take 9390 // ownership of the set first. 9391 auto OdrMergeFailures = std::move(PendingOdrMergeFailures); 9392 PendingOdrMergeFailures.clear(); 9393 for (auto &Merge : OdrMergeFailures) { 9394 Merge.first->buildLookup(); 9395 Merge.first->decls_begin(); 9396 Merge.first->bases_begin(); 9397 Merge.first->vbases_begin(); 9398 for (auto &RecordPair : Merge.second) { 9399 auto *RD = RecordPair.first; 9400 RD->decls_begin(); 9401 RD->bases_begin(); 9402 RD->vbases_begin(); 9403 } 9404 } 9405 9406 // Trigger the import of functions. 9407 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures); 9408 PendingFunctionOdrMergeFailures.clear(); 9409 for (auto &Merge : FunctionOdrMergeFailures) { 9410 Merge.first->buildLookup(); 9411 Merge.first->decls_begin(); 9412 Merge.first->getBody(); 9413 for (auto &FD : Merge.second) { 9414 FD->buildLookup(); 9415 FD->decls_begin(); 9416 FD->getBody(); 9417 } 9418 } 9419 9420 // Trigger the import of enums. 9421 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures); 9422 PendingEnumOdrMergeFailures.clear(); 9423 for (auto &Merge : EnumOdrMergeFailures) { 9424 Merge.first->decls_begin(); 9425 for (auto &Enum : Merge.second) { 9426 Enum->decls_begin(); 9427 } 9428 } 9429 9430 // For each declaration from a merged context, check that the canonical 9431 // definition of that context also contains a declaration of the same 9432 // entity. 9433 // 9434 // Caution: this loop does things that might invalidate iterators into 9435 // PendingOdrMergeChecks. Don't turn this into a range-based for loop! 9436 while (!PendingOdrMergeChecks.empty()) { 9437 NamedDecl *D = PendingOdrMergeChecks.pop_back_val(); 9438 9439 // FIXME: Skip over implicit declarations for now. This matters for things 9440 // like implicitly-declared special member functions. This isn't entirely 9441 // correct; we can end up with multiple unmerged declarations of the same 9442 // implicit entity. 9443 if (D->isImplicit()) 9444 continue; 9445 9446 DeclContext *CanonDef = D->getDeclContext(); 9447 9448 bool Found = false; 9449 const Decl *DCanon = D->getCanonicalDecl(); 9450 9451 for (auto RI : D->redecls()) { 9452 if (RI->getLexicalDeclContext() == CanonDef) { 9453 Found = true; 9454 break; 9455 } 9456 } 9457 if (Found) 9458 continue; 9459 9460 // Quick check failed, time to do the slow thing. Note, we can't just 9461 // look up the name of D in CanonDef here, because the member that is 9462 // in CanonDef might not be found by name lookup (it might have been 9463 // replaced by a more recent declaration in the lookup table), and we 9464 // can't necessarily find it in the redeclaration chain because it might 9465 // be merely mergeable, not redeclarable. 9466 llvm::SmallVector<const NamedDecl*, 4> Candidates; 9467 for (auto *CanonMember : CanonDef->decls()) { 9468 if (CanonMember->getCanonicalDecl() == DCanon) { 9469 // This can happen if the declaration is merely mergeable and not 9470 // actually redeclarable (we looked for redeclarations earlier). 9471 // 9472 // FIXME: We should be able to detect this more efficiently, without 9473 // pulling in all of the members of CanonDef. 9474 Found = true; 9475 break; 9476 } 9477 if (auto *ND = dyn_cast<NamedDecl>(CanonMember)) 9478 if (ND->getDeclName() == D->getDeclName()) 9479 Candidates.push_back(ND); 9480 } 9481 9482 if (!Found) { 9483 // The AST doesn't like TagDecls becoming invalid after they've been 9484 // completed. We only really need to mark FieldDecls as invalid here. 9485 if (!isa<TagDecl>(D)) 9486 D->setInvalidDecl(); 9487 9488 // Ensure we don't accidentally recursively enter deserialization while 9489 // we're producing our diagnostic. 9490 Deserializing RecursionGuard(this); 9491 9492 std::string CanonDefModule = 9493 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef)); 9494 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl) 9495 << D << getOwningModuleNameForDiagnostic(D) 9496 << CanonDef << CanonDefModule.empty() << CanonDefModule; 9497 9498 if (Candidates.empty()) 9499 Diag(cast<Decl>(CanonDef)->getLocation(), 9500 diag::note_module_odr_violation_no_possible_decls) << D; 9501 else { 9502 for (unsigned I = 0, N = Candidates.size(); I != N; ++I) 9503 Diag(Candidates[I]->getLocation(), 9504 diag::note_module_odr_violation_possible_decl) 9505 << Candidates[I]; 9506 } 9507 9508 DiagnosedOdrMergeFailures.insert(CanonDef); 9509 } 9510 } 9511 9512 if (OdrMergeFailures.empty() && FunctionOdrMergeFailures.empty() && 9513 EnumOdrMergeFailures.empty()) 9514 return; 9515 9516 // Ensure we don't accidentally recursively enter deserialization while 9517 // we're producing our diagnostics. 9518 Deserializing RecursionGuard(this); 9519 9520 // Common code for hashing helpers. 9521 ODRHash Hash; 9522 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) { 9523 Hash.clear(); 9524 Hash.AddQualType(Ty); 9525 return Hash.CalculateHash(); 9526 }; 9527 9528 auto ComputeODRHash = [&Hash](const Stmt *S) { 9529 assert(S); 9530 Hash.clear(); 9531 Hash.AddStmt(S); 9532 return Hash.CalculateHash(); 9533 }; 9534 9535 auto ComputeSubDeclODRHash = [&Hash](const Decl *D) { 9536 assert(D); 9537 Hash.clear(); 9538 Hash.AddSubDecl(D); 9539 return Hash.CalculateHash(); 9540 }; 9541 9542 auto ComputeTemplateArgumentODRHash = [&Hash](const TemplateArgument &TA) { 9543 Hash.clear(); 9544 Hash.AddTemplateArgument(TA); 9545 return Hash.CalculateHash(); 9546 }; 9547 9548 auto ComputeTemplateParameterListODRHash = 9549 [&Hash](const TemplateParameterList *TPL) { 9550 assert(TPL); 9551 Hash.clear(); 9552 Hash.AddTemplateParameterList(TPL); 9553 return Hash.CalculateHash(); 9554 }; 9555 9556 // Used with err_module_odr_violation_mismatch_decl and 9557 // note_module_odr_violation_mismatch_decl 9558 // This list should be the same Decl's as in ODRHash::isDeclToBeProcessed 9559 enum ODRMismatchDecl { 9560 EndOfClass, 9561 PublicSpecifer, 9562 PrivateSpecifer, 9563 ProtectedSpecifer, 9564 StaticAssert, 9565 Field, 9566 CXXMethod, 9567 TypeAlias, 9568 TypeDef, 9569 Var, 9570 Friend, 9571 FunctionTemplate, 9572 Other 9573 }; 9574 9575 // Used with err_module_odr_violation_mismatch_decl_diff and 9576 // note_module_odr_violation_mismatch_decl_diff 9577 enum ODRMismatchDeclDifference { 9578 StaticAssertCondition, 9579 StaticAssertMessage, 9580 StaticAssertOnlyMessage, 9581 FieldName, 9582 FieldTypeName, 9583 FieldSingleBitField, 9584 FieldDifferentWidthBitField, 9585 FieldSingleMutable, 9586 FieldSingleInitializer, 9587 FieldDifferentInitializers, 9588 MethodName, 9589 MethodDeleted, 9590 MethodDefaulted, 9591 MethodVirtual, 9592 MethodStatic, 9593 MethodVolatile, 9594 MethodConst, 9595 MethodInline, 9596 MethodNumberParameters, 9597 MethodParameterType, 9598 MethodParameterName, 9599 MethodParameterSingleDefaultArgument, 9600 MethodParameterDifferentDefaultArgument, 9601 MethodNoTemplateArguments, 9602 MethodDifferentNumberTemplateArguments, 9603 MethodDifferentTemplateArgument, 9604 MethodSingleBody, 9605 MethodDifferentBody, 9606 TypedefName, 9607 TypedefType, 9608 VarName, 9609 VarType, 9610 VarSingleInitializer, 9611 VarDifferentInitializer, 9612 VarConstexpr, 9613 FriendTypeFunction, 9614 FriendType, 9615 FriendFunction, 9616 FunctionTemplateDifferentNumberParameters, 9617 FunctionTemplateParameterDifferentKind, 9618 FunctionTemplateParameterName, 9619 FunctionTemplateParameterSingleDefaultArgument, 9620 FunctionTemplateParameterDifferentDefaultArgument, 9621 FunctionTemplateParameterDifferentType, 9622 FunctionTemplatePackParameter, 9623 }; 9624 9625 // These lambdas have the common portions of the ODR diagnostics. This 9626 // has the same return as Diag(), so addition parameters can be passed 9627 // in with operator<< 9628 auto ODRDiagDeclError = [this](NamedDecl *FirstRecord, StringRef FirstModule, 9629 SourceLocation Loc, SourceRange Range, 9630 ODRMismatchDeclDifference DiffType) { 9631 return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff) 9632 << FirstRecord << FirstModule.empty() << FirstModule << Range 9633 << DiffType; 9634 }; 9635 auto ODRDiagDeclNote = [this](StringRef SecondModule, SourceLocation Loc, 9636 SourceRange Range, ODRMismatchDeclDifference DiffType) { 9637 return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff) 9638 << SecondModule << Range << DiffType; 9639 }; 9640 9641 auto ODRDiagField = [this, &ODRDiagDeclError, &ODRDiagDeclNote, 9642 &ComputeQualTypeODRHash, &ComputeODRHash]( 9643 NamedDecl *FirstRecord, StringRef FirstModule, 9644 StringRef SecondModule, FieldDecl *FirstField, 9645 FieldDecl *SecondField) { 9646 IdentifierInfo *FirstII = FirstField->getIdentifier(); 9647 IdentifierInfo *SecondII = SecondField->getIdentifier(); 9648 if (FirstII->getName() != SecondII->getName()) { 9649 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9650 FirstField->getSourceRange(), FieldName) 9651 << FirstII; 9652 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9653 SecondField->getSourceRange(), FieldName) 9654 << SecondII; 9655 9656 return true; 9657 } 9658 9659 assert(getContext().hasSameType(FirstField->getType(), 9660 SecondField->getType())); 9661 9662 QualType FirstType = FirstField->getType(); 9663 QualType SecondType = SecondField->getType(); 9664 if (ComputeQualTypeODRHash(FirstType) != 9665 ComputeQualTypeODRHash(SecondType)) { 9666 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9667 FirstField->getSourceRange(), FieldTypeName) 9668 << FirstII << FirstType; 9669 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9670 SecondField->getSourceRange(), FieldTypeName) 9671 << SecondII << SecondType; 9672 9673 return true; 9674 } 9675 9676 const bool IsFirstBitField = FirstField->isBitField(); 9677 const bool IsSecondBitField = SecondField->isBitField(); 9678 if (IsFirstBitField != IsSecondBitField) { 9679 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9680 FirstField->getSourceRange(), FieldSingleBitField) 9681 << FirstII << IsFirstBitField; 9682 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9683 SecondField->getSourceRange(), FieldSingleBitField) 9684 << SecondII << IsSecondBitField; 9685 return true; 9686 } 9687 9688 if (IsFirstBitField && IsSecondBitField) { 9689 unsigned FirstBitWidthHash = 9690 ComputeODRHash(FirstField->getBitWidth()); 9691 unsigned SecondBitWidthHash = 9692 ComputeODRHash(SecondField->getBitWidth()); 9693 if (FirstBitWidthHash != SecondBitWidthHash) { 9694 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9695 FirstField->getSourceRange(), 9696 FieldDifferentWidthBitField) 9697 << FirstII << FirstField->getBitWidth()->getSourceRange(); 9698 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9699 SecondField->getSourceRange(), 9700 FieldDifferentWidthBitField) 9701 << SecondII << SecondField->getBitWidth()->getSourceRange(); 9702 return true; 9703 } 9704 } 9705 9706 if (!PP.getLangOpts().CPlusPlus) 9707 return false; 9708 9709 const bool IsFirstMutable = FirstField->isMutable(); 9710 const bool IsSecondMutable = SecondField->isMutable(); 9711 if (IsFirstMutable != IsSecondMutable) { 9712 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9713 FirstField->getSourceRange(), FieldSingleMutable) 9714 << FirstII << IsFirstMutable; 9715 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9716 SecondField->getSourceRange(), FieldSingleMutable) 9717 << SecondII << IsSecondMutable; 9718 return true; 9719 } 9720 9721 const Expr *FirstInitializer = FirstField->getInClassInitializer(); 9722 const Expr *SecondInitializer = SecondField->getInClassInitializer(); 9723 if ((!FirstInitializer && SecondInitializer) || 9724 (FirstInitializer && !SecondInitializer)) { 9725 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9726 FirstField->getSourceRange(), FieldSingleInitializer) 9727 << FirstII << (FirstInitializer != nullptr); 9728 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9729 SecondField->getSourceRange(), FieldSingleInitializer) 9730 << SecondII << (SecondInitializer != nullptr); 9731 return true; 9732 } 9733 9734 if (FirstInitializer && SecondInitializer) { 9735 unsigned FirstInitHash = ComputeODRHash(FirstInitializer); 9736 unsigned SecondInitHash = ComputeODRHash(SecondInitializer); 9737 if (FirstInitHash != SecondInitHash) { 9738 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9739 FirstField->getSourceRange(), 9740 FieldDifferentInitializers) 9741 << FirstII << FirstInitializer->getSourceRange(); 9742 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9743 SecondField->getSourceRange(), 9744 FieldDifferentInitializers) 9745 << SecondII << SecondInitializer->getSourceRange(); 9746 return true; 9747 } 9748 } 9749 9750 return false; 9751 }; 9752 9753 auto ODRDiagTypeDefOrAlias = 9754 [&ODRDiagDeclError, &ODRDiagDeclNote, &ComputeQualTypeODRHash]( 9755 NamedDecl *FirstRecord, StringRef FirstModule, StringRef SecondModule, 9756 TypedefNameDecl *FirstTD, TypedefNameDecl *SecondTD, 9757 bool IsTypeAlias) { 9758 auto FirstName = FirstTD->getDeclName(); 9759 auto SecondName = SecondTD->getDeclName(); 9760 if (FirstName != SecondName) { 9761 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), 9762 FirstTD->getSourceRange(), TypedefName) 9763 << IsTypeAlias << FirstName; 9764 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), 9765 SecondTD->getSourceRange(), TypedefName) 9766 << IsTypeAlias << SecondName; 9767 return true; 9768 } 9769 9770 QualType FirstType = FirstTD->getUnderlyingType(); 9771 QualType SecondType = SecondTD->getUnderlyingType(); 9772 if (ComputeQualTypeODRHash(FirstType) != 9773 ComputeQualTypeODRHash(SecondType)) { 9774 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), 9775 FirstTD->getSourceRange(), TypedefType) 9776 << IsTypeAlias << FirstName << FirstType; 9777 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), 9778 SecondTD->getSourceRange(), TypedefType) 9779 << IsTypeAlias << SecondName << SecondType; 9780 return true; 9781 } 9782 9783 return false; 9784 }; 9785 9786 auto ODRDiagVar = [&ODRDiagDeclError, &ODRDiagDeclNote, 9787 &ComputeQualTypeODRHash, &ComputeODRHash, 9788 this](NamedDecl *FirstRecord, StringRef FirstModule, 9789 StringRef SecondModule, VarDecl *FirstVD, 9790 VarDecl *SecondVD) { 9791 auto FirstName = FirstVD->getDeclName(); 9792 auto SecondName = SecondVD->getDeclName(); 9793 if (FirstName != SecondName) { 9794 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9795 FirstVD->getSourceRange(), VarName) 9796 << FirstName; 9797 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9798 SecondVD->getSourceRange(), VarName) 9799 << SecondName; 9800 return true; 9801 } 9802 9803 QualType FirstType = FirstVD->getType(); 9804 QualType SecondType = SecondVD->getType(); 9805 if (ComputeQualTypeODRHash(FirstType) != 9806 ComputeQualTypeODRHash(SecondType)) { 9807 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9808 FirstVD->getSourceRange(), VarType) 9809 << FirstName << FirstType; 9810 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9811 SecondVD->getSourceRange(), VarType) 9812 << SecondName << SecondType; 9813 return true; 9814 } 9815 9816 if (!PP.getLangOpts().CPlusPlus) 9817 return false; 9818 9819 const Expr *FirstInit = FirstVD->getInit(); 9820 const Expr *SecondInit = SecondVD->getInit(); 9821 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 9822 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9823 FirstVD->getSourceRange(), VarSingleInitializer) 9824 << FirstName << (FirstInit == nullptr) 9825 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 9826 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9827 SecondVD->getSourceRange(), VarSingleInitializer) 9828 << SecondName << (SecondInit == nullptr) 9829 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 9830 return true; 9831 } 9832 9833 if (FirstInit && SecondInit && 9834 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 9835 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9836 FirstVD->getSourceRange(), VarDifferentInitializer) 9837 << FirstName << FirstInit->getSourceRange(); 9838 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9839 SecondVD->getSourceRange(), VarDifferentInitializer) 9840 << SecondName << SecondInit->getSourceRange(); 9841 return true; 9842 } 9843 9844 const bool FirstIsConstexpr = FirstVD->isConstexpr(); 9845 const bool SecondIsConstexpr = SecondVD->isConstexpr(); 9846 if (FirstIsConstexpr != SecondIsConstexpr) { 9847 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9848 FirstVD->getSourceRange(), VarConstexpr) 9849 << FirstName << FirstIsConstexpr; 9850 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9851 SecondVD->getSourceRange(), VarConstexpr) 9852 << SecondName << SecondIsConstexpr; 9853 return true; 9854 } 9855 return false; 9856 }; 9857 9858 auto DifferenceSelector = [](Decl *D) { 9859 assert(D && "valid Decl required"); 9860 switch (D->getKind()) { 9861 default: 9862 return Other; 9863 case Decl::AccessSpec: 9864 switch (D->getAccess()) { 9865 case AS_public: 9866 return PublicSpecifer; 9867 case AS_private: 9868 return PrivateSpecifer; 9869 case AS_protected: 9870 return ProtectedSpecifer; 9871 case AS_none: 9872 break; 9873 } 9874 llvm_unreachable("Invalid access specifier"); 9875 case Decl::StaticAssert: 9876 return StaticAssert; 9877 case Decl::Field: 9878 return Field; 9879 case Decl::CXXMethod: 9880 case Decl::CXXConstructor: 9881 case Decl::CXXDestructor: 9882 return CXXMethod; 9883 case Decl::TypeAlias: 9884 return TypeAlias; 9885 case Decl::Typedef: 9886 return TypeDef; 9887 case Decl::Var: 9888 return Var; 9889 case Decl::Friend: 9890 return Friend; 9891 case Decl::FunctionTemplate: 9892 return FunctionTemplate; 9893 } 9894 }; 9895 9896 using DeclHashes = llvm::SmallVector<std::pair<Decl *, unsigned>, 4>; 9897 auto PopulateHashes = [&ComputeSubDeclODRHash](DeclHashes &Hashes, 9898 RecordDecl *Record, 9899 const DeclContext *DC) { 9900 for (auto *D : Record->decls()) { 9901 if (!ODRHash::isDeclToBeProcessed(D, DC)) 9902 continue; 9903 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 9904 } 9905 }; 9906 9907 struct DiffResult { 9908 Decl *FirstDecl = nullptr, *SecondDecl = nullptr; 9909 ODRMismatchDecl FirstDiffType = Other, SecondDiffType = Other; 9910 }; 9911 9912 // If there is a diagnoseable difference, FirstDiffType and 9913 // SecondDiffType will not be Other and FirstDecl and SecondDecl will be 9914 // filled in if not EndOfClass. 9915 auto FindTypeDiffs = [&DifferenceSelector](DeclHashes &FirstHashes, 9916 DeclHashes &SecondHashes) { 9917 DiffResult DR; 9918 auto FirstIt = FirstHashes.begin(); 9919 auto SecondIt = SecondHashes.begin(); 9920 while (FirstIt != FirstHashes.end() || SecondIt != SecondHashes.end()) { 9921 if (FirstIt != FirstHashes.end() && SecondIt != SecondHashes.end() && 9922 FirstIt->second == SecondIt->second) { 9923 ++FirstIt; 9924 ++SecondIt; 9925 continue; 9926 } 9927 9928 DR.FirstDecl = FirstIt == FirstHashes.end() ? nullptr : FirstIt->first; 9929 DR.SecondDecl = 9930 SecondIt == SecondHashes.end() ? nullptr : SecondIt->first; 9931 9932 DR.FirstDiffType = 9933 DR.FirstDecl ? DifferenceSelector(DR.FirstDecl) : EndOfClass; 9934 DR.SecondDiffType = 9935 DR.SecondDecl ? DifferenceSelector(DR.SecondDecl) : EndOfClass; 9936 return DR; 9937 } 9938 return DR; 9939 }; 9940 9941 // Use this to diagnose that an unexpected Decl was encountered 9942 // or no difference was detected. This causes a generic error 9943 // message to be emitted. 9944 auto DiagnoseODRUnexpected = [this](DiffResult &DR, NamedDecl *FirstRecord, 9945 StringRef FirstModule, 9946 NamedDecl *SecondRecord, 9947 StringRef SecondModule) { 9948 Diag(FirstRecord->getLocation(), 9949 diag::err_module_odr_violation_different_definitions) 9950 << FirstRecord << FirstModule.empty() << FirstModule; 9951 9952 if (DR.FirstDecl) { 9953 Diag(DR.FirstDecl->getLocation(), diag::note_first_module_difference) 9954 << FirstRecord << DR.FirstDecl->getSourceRange(); 9955 } 9956 9957 Diag(SecondRecord->getLocation(), 9958 diag::note_module_odr_violation_different_definitions) 9959 << SecondModule; 9960 9961 if (DR.SecondDecl) { 9962 Diag(DR.SecondDecl->getLocation(), diag::note_second_module_difference) 9963 << DR.SecondDecl->getSourceRange(); 9964 } 9965 }; 9966 9967 auto DiagnoseODRMismatch = 9968 [this](DiffResult &DR, NamedDecl *FirstRecord, StringRef FirstModule, 9969 NamedDecl *SecondRecord, StringRef SecondModule) { 9970 SourceLocation FirstLoc; 9971 SourceRange FirstRange; 9972 auto *FirstTag = dyn_cast<TagDecl>(FirstRecord); 9973 if (DR.FirstDiffType == EndOfClass && FirstTag) { 9974 FirstLoc = FirstTag->getBraceRange().getEnd(); 9975 } else { 9976 FirstLoc = DR.FirstDecl->getLocation(); 9977 FirstRange = DR.FirstDecl->getSourceRange(); 9978 } 9979 Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl) 9980 << FirstRecord << FirstModule.empty() << FirstModule << FirstRange 9981 << DR.FirstDiffType; 9982 9983 SourceLocation SecondLoc; 9984 SourceRange SecondRange; 9985 auto *SecondTag = dyn_cast<TagDecl>(SecondRecord); 9986 if (DR.SecondDiffType == EndOfClass && SecondTag) { 9987 SecondLoc = SecondTag->getBraceRange().getEnd(); 9988 } else { 9989 SecondLoc = DR.SecondDecl->getLocation(); 9990 SecondRange = DR.SecondDecl->getSourceRange(); 9991 } 9992 Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl) 9993 << SecondModule << SecondRange << DR.SecondDiffType; 9994 }; 9995 9996 // Issue any pending ODR-failure diagnostics. 9997 for (auto &Merge : OdrMergeFailures) { 9998 // If we've already pointed out a specific problem with this class, don't 9999 // bother issuing a general "something's different" diagnostic. 10000 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 10001 continue; 10002 10003 bool Diagnosed = false; 10004 CXXRecordDecl *FirstRecord = Merge.first; 10005 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstRecord); 10006 for (auto &RecordPair : Merge.second) { 10007 CXXRecordDecl *SecondRecord = RecordPair.first; 10008 // Multiple different declarations got merged together; tell the user 10009 // where they came from. 10010 if (FirstRecord == SecondRecord) 10011 continue; 10012 10013 std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord); 10014 10015 auto *FirstDD = FirstRecord->DefinitionData; 10016 auto *SecondDD = RecordPair.second; 10017 10018 assert(FirstDD && SecondDD && "Definitions without DefinitionData"); 10019 10020 // Diagnostics from DefinitionData are emitted here. 10021 if (FirstDD != SecondDD) { 10022 enum ODRDefinitionDataDifference { 10023 NumBases, 10024 NumVBases, 10025 BaseType, 10026 BaseVirtual, 10027 BaseAccess, 10028 }; 10029 auto ODRDiagBaseError = [FirstRecord, &FirstModule, 10030 this](SourceLocation Loc, SourceRange Range, 10031 ODRDefinitionDataDifference DiffType) { 10032 return Diag(Loc, diag::err_module_odr_violation_definition_data) 10033 << FirstRecord << FirstModule.empty() << FirstModule << Range 10034 << DiffType; 10035 }; 10036 auto ODRDiagBaseNote = [&SecondModule, 10037 this](SourceLocation Loc, SourceRange Range, 10038 ODRDefinitionDataDifference DiffType) { 10039 return Diag(Loc, diag::note_module_odr_violation_definition_data) 10040 << SecondModule << Range << DiffType; 10041 }; 10042 10043 unsigned FirstNumBases = FirstDD->NumBases; 10044 unsigned FirstNumVBases = FirstDD->NumVBases; 10045 unsigned SecondNumBases = SecondDD->NumBases; 10046 unsigned SecondNumVBases = SecondDD->NumVBases; 10047 10048 auto GetSourceRange = [](struct CXXRecordDecl::DefinitionData *DD) { 10049 unsigned NumBases = DD->NumBases; 10050 if (NumBases == 0) return SourceRange(); 10051 auto bases = DD->bases(); 10052 return SourceRange(bases[0].getBeginLoc(), 10053 bases[NumBases - 1].getEndLoc()); 10054 }; 10055 10056 if (FirstNumBases != SecondNumBases) { 10057 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 10058 NumBases) 10059 << FirstNumBases; 10060 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 10061 NumBases) 10062 << SecondNumBases; 10063 Diagnosed = true; 10064 break; 10065 } 10066 10067 if (FirstNumVBases != SecondNumVBases) { 10068 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 10069 NumVBases) 10070 << FirstNumVBases; 10071 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 10072 NumVBases) 10073 << SecondNumVBases; 10074 Diagnosed = true; 10075 break; 10076 } 10077 10078 auto FirstBases = FirstDD->bases(); 10079 auto SecondBases = SecondDD->bases(); 10080 unsigned i = 0; 10081 for (i = 0; i < FirstNumBases; ++i) { 10082 auto FirstBase = FirstBases[i]; 10083 auto SecondBase = SecondBases[i]; 10084 if (ComputeQualTypeODRHash(FirstBase.getType()) != 10085 ComputeQualTypeODRHash(SecondBase.getType())) { 10086 ODRDiagBaseError(FirstRecord->getLocation(), 10087 FirstBase.getSourceRange(), BaseType) 10088 << (i + 1) << FirstBase.getType(); 10089 ODRDiagBaseNote(SecondRecord->getLocation(), 10090 SecondBase.getSourceRange(), BaseType) 10091 << (i + 1) << SecondBase.getType(); 10092 break; 10093 } 10094 10095 if (FirstBase.isVirtual() != SecondBase.isVirtual()) { 10096 ODRDiagBaseError(FirstRecord->getLocation(), 10097 FirstBase.getSourceRange(), BaseVirtual) 10098 << (i + 1) << FirstBase.isVirtual() << FirstBase.getType(); 10099 ODRDiagBaseNote(SecondRecord->getLocation(), 10100 SecondBase.getSourceRange(), BaseVirtual) 10101 << (i + 1) << SecondBase.isVirtual() << SecondBase.getType(); 10102 break; 10103 } 10104 10105 if (FirstBase.getAccessSpecifierAsWritten() != 10106 SecondBase.getAccessSpecifierAsWritten()) { 10107 ODRDiagBaseError(FirstRecord->getLocation(), 10108 FirstBase.getSourceRange(), BaseAccess) 10109 << (i + 1) << FirstBase.getType() 10110 << (int)FirstBase.getAccessSpecifierAsWritten(); 10111 ODRDiagBaseNote(SecondRecord->getLocation(), 10112 SecondBase.getSourceRange(), BaseAccess) 10113 << (i + 1) << SecondBase.getType() 10114 << (int)SecondBase.getAccessSpecifierAsWritten(); 10115 break; 10116 } 10117 } 10118 10119 if (i != FirstNumBases) { 10120 Diagnosed = true; 10121 break; 10122 } 10123 } 10124 10125 const ClassTemplateDecl *FirstTemplate = 10126 FirstRecord->getDescribedClassTemplate(); 10127 const ClassTemplateDecl *SecondTemplate = 10128 SecondRecord->getDescribedClassTemplate(); 10129 10130 assert(!FirstTemplate == !SecondTemplate && 10131 "Both pointers should be null or non-null"); 10132 10133 enum ODRTemplateDifference { 10134 ParamEmptyName, 10135 ParamName, 10136 ParamSingleDefaultArgument, 10137 ParamDifferentDefaultArgument, 10138 }; 10139 10140 if (FirstTemplate && SecondTemplate) { 10141 DeclHashes FirstTemplateHashes; 10142 DeclHashes SecondTemplateHashes; 10143 10144 auto PopulateTemplateParameterHashs = 10145 [&ComputeSubDeclODRHash](DeclHashes &Hashes, 10146 const ClassTemplateDecl *TD) { 10147 for (auto *D : TD->getTemplateParameters()->asArray()) { 10148 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 10149 } 10150 }; 10151 10152 PopulateTemplateParameterHashs(FirstTemplateHashes, FirstTemplate); 10153 PopulateTemplateParameterHashs(SecondTemplateHashes, SecondTemplate); 10154 10155 assert(FirstTemplateHashes.size() == SecondTemplateHashes.size() && 10156 "Number of template parameters should be equal."); 10157 10158 auto FirstIt = FirstTemplateHashes.begin(); 10159 auto FirstEnd = FirstTemplateHashes.end(); 10160 auto SecondIt = SecondTemplateHashes.begin(); 10161 for (; FirstIt != FirstEnd; ++FirstIt, ++SecondIt) { 10162 if (FirstIt->second == SecondIt->second) 10163 continue; 10164 10165 auto ODRDiagTemplateError = [FirstRecord, &FirstModule, this]( 10166 SourceLocation Loc, SourceRange Range, 10167 ODRTemplateDifference DiffType) { 10168 return Diag(Loc, diag::err_module_odr_violation_template_parameter) 10169 << FirstRecord << FirstModule.empty() << FirstModule << Range 10170 << DiffType; 10171 }; 10172 auto ODRDiagTemplateNote = [&SecondModule, this]( 10173 SourceLocation Loc, SourceRange Range, 10174 ODRTemplateDifference DiffType) { 10175 return Diag(Loc, diag::note_module_odr_violation_template_parameter) 10176 << SecondModule << Range << DiffType; 10177 }; 10178 10179 const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first); 10180 const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first); 10181 10182 assert(FirstDecl->getKind() == SecondDecl->getKind() && 10183 "Parameter Decl's should be the same kind."); 10184 10185 DeclarationName FirstName = FirstDecl->getDeclName(); 10186 DeclarationName SecondName = SecondDecl->getDeclName(); 10187 10188 if (FirstName != SecondName) { 10189 const bool FirstNameEmpty = 10190 FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo(); 10191 const bool SecondNameEmpty = 10192 SecondName.isIdentifier() && !SecondName.getAsIdentifierInfo(); 10193 assert((!FirstNameEmpty || !SecondNameEmpty) && 10194 "Both template parameters cannot be unnamed."); 10195 ODRDiagTemplateError(FirstDecl->getLocation(), 10196 FirstDecl->getSourceRange(), 10197 FirstNameEmpty ? ParamEmptyName : ParamName) 10198 << FirstName; 10199 ODRDiagTemplateNote(SecondDecl->getLocation(), 10200 SecondDecl->getSourceRange(), 10201 SecondNameEmpty ? ParamEmptyName : ParamName) 10202 << SecondName; 10203 break; 10204 } 10205 10206 switch (FirstDecl->getKind()) { 10207 default: 10208 llvm_unreachable("Invalid template parameter type."); 10209 case Decl::TemplateTypeParm: { 10210 const auto *FirstParam = cast<TemplateTypeParmDecl>(FirstDecl); 10211 const auto *SecondParam = cast<TemplateTypeParmDecl>(SecondDecl); 10212 const bool HasFirstDefaultArgument = 10213 FirstParam->hasDefaultArgument() && 10214 !FirstParam->defaultArgumentWasInherited(); 10215 const bool HasSecondDefaultArgument = 10216 SecondParam->hasDefaultArgument() && 10217 !SecondParam->defaultArgumentWasInherited(); 10218 10219 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10220 ODRDiagTemplateError(FirstDecl->getLocation(), 10221 FirstDecl->getSourceRange(), 10222 ParamSingleDefaultArgument) 10223 << HasFirstDefaultArgument; 10224 ODRDiagTemplateNote(SecondDecl->getLocation(), 10225 SecondDecl->getSourceRange(), 10226 ParamSingleDefaultArgument) 10227 << HasSecondDefaultArgument; 10228 break; 10229 } 10230 10231 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10232 "Expecting default arguments."); 10233 10234 ODRDiagTemplateError(FirstDecl->getLocation(), 10235 FirstDecl->getSourceRange(), 10236 ParamDifferentDefaultArgument); 10237 ODRDiagTemplateNote(SecondDecl->getLocation(), 10238 SecondDecl->getSourceRange(), 10239 ParamDifferentDefaultArgument); 10240 10241 break; 10242 } 10243 case Decl::NonTypeTemplateParm: { 10244 const auto *FirstParam = cast<NonTypeTemplateParmDecl>(FirstDecl); 10245 const auto *SecondParam = cast<NonTypeTemplateParmDecl>(SecondDecl); 10246 const bool HasFirstDefaultArgument = 10247 FirstParam->hasDefaultArgument() && 10248 !FirstParam->defaultArgumentWasInherited(); 10249 const bool HasSecondDefaultArgument = 10250 SecondParam->hasDefaultArgument() && 10251 !SecondParam->defaultArgumentWasInherited(); 10252 10253 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10254 ODRDiagTemplateError(FirstDecl->getLocation(), 10255 FirstDecl->getSourceRange(), 10256 ParamSingleDefaultArgument) 10257 << HasFirstDefaultArgument; 10258 ODRDiagTemplateNote(SecondDecl->getLocation(), 10259 SecondDecl->getSourceRange(), 10260 ParamSingleDefaultArgument) 10261 << HasSecondDefaultArgument; 10262 break; 10263 } 10264 10265 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10266 "Expecting default arguments."); 10267 10268 ODRDiagTemplateError(FirstDecl->getLocation(), 10269 FirstDecl->getSourceRange(), 10270 ParamDifferentDefaultArgument); 10271 ODRDiagTemplateNote(SecondDecl->getLocation(), 10272 SecondDecl->getSourceRange(), 10273 ParamDifferentDefaultArgument); 10274 10275 break; 10276 } 10277 case Decl::TemplateTemplateParm: { 10278 const auto *FirstParam = cast<TemplateTemplateParmDecl>(FirstDecl); 10279 const auto *SecondParam = 10280 cast<TemplateTemplateParmDecl>(SecondDecl); 10281 const bool HasFirstDefaultArgument = 10282 FirstParam->hasDefaultArgument() && 10283 !FirstParam->defaultArgumentWasInherited(); 10284 const bool HasSecondDefaultArgument = 10285 SecondParam->hasDefaultArgument() && 10286 !SecondParam->defaultArgumentWasInherited(); 10287 10288 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10289 ODRDiagTemplateError(FirstDecl->getLocation(), 10290 FirstDecl->getSourceRange(), 10291 ParamSingleDefaultArgument) 10292 << HasFirstDefaultArgument; 10293 ODRDiagTemplateNote(SecondDecl->getLocation(), 10294 SecondDecl->getSourceRange(), 10295 ParamSingleDefaultArgument) 10296 << HasSecondDefaultArgument; 10297 break; 10298 } 10299 10300 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10301 "Expecting default arguments."); 10302 10303 ODRDiagTemplateError(FirstDecl->getLocation(), 10304 FirstDecl->getSourceRange(), 10305 ParamDifferentDefaultArgument); 10306 ODRDiagTemplateNote(SecondDecl->getLocation(), 10307 SecondDecl->getSourceRange(), 10308 ParamDifferentDefaultArgument); 10309 10310 break; 10311 } 10312 } 10313 10314 break; 10315 } 10316 10317 if (FirstIt != FirstEnd) { 10318 Diagnosed = true; 10319 break; 10320 } 10321 } 10322 10323 DeclHashes FirstHashes; 10324 DeclHashes SecondHashes; 10325 const DeclContext *DC = FirstRecord; 10326 PopulateHashes(FirstHashes, FirstRecord, DC); 10327 PopulateHashes(SecondHashes, SecondRecord, DC); 10328 10329 auto DR = FindTypeDiffs(FirstHashes, SecondHashes); 10330 ODRMismatchDecl FirstDiffType = DR.FirstDiffType; 10331 ODRMismatchDecl SecondDiffType = DR.SecondDiffType; 10332 Decl *FirstDecl = DR.FirstDecl; 10333 Decl *SecondDecl = DR.SecondDecl; 10334 10335 if (FirstDiffType == Other || SecondDiffType == Other) { 10336 DiagnoseODRUnexpected(DR, FirstRecord, FirstModule, SecondRecord, 10337 SecondModule); 10338 Diagnosed = true; 10339 break; 10340 } 10341 10342 if (FirstDiffType != SecondDiffType) { 10343 DiagnoseODRMismatch(DR, FirstRecord, FirstModule, SecondRecord, 10344 SecondModule); 10345 Diagnosed = true; 10346 break; 10347 } 10348 10349 assert(FirstDiffType == SecondDiffType); 10350 10351 switch (FirstDiffType) { 10352 case Other: 10353 case EndOfClass: 10354 case PublicSpecifer: 10355 case PrivateSpecifer: 10356 case ProtectedSpecifer: 10357 llvm_unreachable("Invalid diff type"); 10358 10359 case StaticAssert: { 10360 StaticAssertDecl *FirstSA = cast<StaticAssertDecl>(FirstDecl); 10361 StaticAssertDecl *SecondSA = cast<StaticAssertDecl>(SecondDecl); 10362 10363 Expr *FirstExpr = FirstSA->getAssertExpr(); 10364 Expr *SecondExpr = SecondSA->getAssertExpr(); 10365 unsigned FirstODRHash = ComputeODRHash(FirstExpr); 10366 unsigned SecondODRHash = ComputeODRHash(SecondExpr); 10367 if (FirstODRHash != SecondODRHash) { 10368 ODRDiagDeclError(FirstRecord, FirstModule, FirstExpr->getBeginLoc(), 10369 FirstExpr->getSourceRange(), StaticAssertCondition); 10370 ODRDiagDeclNote(SecondModule, SecondExpr->getBeginLoc(), 10371 SecondExpr->getSourceRange(), StaticAssertCondition); 10372 Diagnosed = true; 10373 break; 10374 } 10375 10376 StringLiteral *FirstStr = FirstSA->getMessage(); 10377 StringLiteral *SecondStr = SecondSA->getMessage(); 10378 assert((FirstStr || SecondStr) && "Both messages cannot be empty"); 10379 if ((FirstStr && !SecondStr) || (!FirstStr && SecondStr)) { 10380 SourceLocation FirstLoc, SecondLoc; 10381 SourceRange FirstRange, SecondRange; 10382 if (FirstStr) { 10383 FirstLoc = FirstStr->getBeginLoc(); 10384 FirstRange = FirstStr->getSourceRange(); 10385 } else { 10386 FirstLoc = FirstSA->getBeginLoc(); 10387 FirstRange = FirstSA->getSourceRange(); 10388 } 10389 if (SecondStr) { 10390 SecondLoc = SecondStr->getBeginLoc(); 10391 SecondRange = SecondStr->getSourceRange(); 10392 } else { 10393 SecondLoc = SecondSA->getBeginLoc(); 10394 SecondRange = SecondSA->getSourceRange(); 10395 } 10396 ODRDiagDeclError(FirstRecord, FirstModule, FirstLoc, FirstRange, 10397 StaticAssertOnlyMessage) 10398 << (FirstStr == nullptr); 10399 ODRDiagDeclNote(SecondModule, SecondLoc, SecondRange, 10400 StaticAssertOnlyMessage) 10401 << (SecondStr == nullptr); 10402 Diagnosed = true; 10403 break; 10404 } 10405 10406 if (FirstStr && SecondStr && 10407 FirstStr->getString() != SecondStr->getString()) { 10408 ODRDiagDeclError(FirstRecord, FirstModule, FirstStr->getBeginLoc(), 10409 FirstStr->getSourceRange(), StaticAssertMessage); 10410 ODRDiagDeclNote(SecondModule, SecondStr->getBeginLoc(), 10411 SecondStr->getSourceRange(), StaticAssertMessage); 10412 Diagnosed = true; 10413 break; 10414 } 10415 break; 10416 } 10417 case Field: { 10418 Diagnosed = ODRDiagField(FirstRecord, FirstModule, SecondModule, 10419 cast<FieldDecl>(FirstDecl), 10420 cast<FieldDecl>(SecondDecl)); 10421 break; 10422 } 10423 case CXXMethod: { 10424 enum { 10425 DiagMethod, 10426 DiagConstructor, 10427 DiagDestructor, 10428 } FirstMethodType, 10429 SecondMethodType; 10430 auto GetMethodTypeForDiagnostics = [](const CXXMethodDecl* D) { 10431 if (isa<CXXConstructorDecl>(D)) return DiagConstructor; 10432 if (isa<CXXDestructorDecl>(D)) return DiagDestructor; 10433 return DiagMethod; 10434 }; 10435 const CXXMethodDecl *FirstMethod = cast<CXXMethodDecl>(FirstDecl); 10436 const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl); 10437 FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod); 10438 SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod); 10439 auto FirstName = FirstMethod->getDeclName(); 10440 auto SecondName = SecondMethod->getDeclName(); 10441 if (FirstMethodType != SecondMethodType || FirstName != SecondName) { 10442 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10443 FirstMethod->getSourceRange(), MethodName) 10444 << FirstMethodType << FirstName; 10445 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10446 SecondMethod->getSourceRange(), MethodName) 10447 << SecondMethodType << SecondName; 10448 10449 Diagnosed = true; 10450 break; 10451 } 10452 10453 const bool FirstDeleted = FirstMethod->isDeletedAsWritten(); 10454 const bool SecondDeleted = SecondMethod->isDeletedAsWritten(); 10455 if (FirstDeleted != SecondDeleted) { 10456 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10457 FirstMethod->getSourceRange(), MethodDeleted) 10458 << FirstMethodType << FirstName << FirstDeleted; 10459 10460 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10461 SecondMethod->getSourceRange(), MethodDeleted) 10462 << SecondMethodType << SecondName << SecondDeleted; 10463 Diagnosed = true; 10464 break; 10465 } 10466 10467 const bool FirstDefaulted = FirstMethod->isExplicitlyDefaulted(); 10468 const bool SecondDefaulted = SecondMethod->isExplicitlyDefaulted(); 10469 if (FirstDefaulted != SecondDefaulted) { 10470 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10471 FirstMethod->getSourceRange(), MethodDefaulted) 10472 << FirstMethodType << FirstName << FirstDefaulted; 10473 10474 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10475 SecondMethod->getSourceRange(), MethodDefaulted) 10476 << SecondMethodType << SecondName << SecondDefaulted; 10477 Diagnosed = true; 10478 break; 10479 } 10480 10481 const bool FirstVirtual = FirstMethod->isVirtualAsWritten(); 10482 const bool SecondVirtual = SecondMethod->isVirtualAsWritten(); 10483 const bool FirstPure = FirstMethod->isPure(); 10484 const bool SecondPure = SecondMethod->isPure(); 10485 if ((FirstVirtual || SecondVirtual) && 10486 (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) { 10487 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10488 FirstMethod->getSourceRange(), MethodVirtual) 10489 << FirstMethodType << FirstName << FirstPure << FirstVirtual; 10490 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10491 SecondMethod->getSourceRange(), MethodVirtual) 10492 << SecondMethodType << SecondName << SecondPure << SecondVirtual; 10493 Diagnosed = true; 10494 break; 10495 } 10496 10497 // CXXMethodDecl::isStatic uses the canonical Decl. With Decl merging, 10498 // FirstDecl is the canonical Decl of SecondDecl, so the storage 10499 // class needs to be checked instead. 10500 const auto FirstStorage = FirstMethod->getStorageClass(); 10501 const auto SecondStorage = SecondMethod->getStorageClass(); 10502 const bool FirstStatic = FirstStorage == SC_Static; 10503 const bool SecondStatic = SecondStorage == SC_Static; 10504 if (FirstStatic != SecondStatic) { 10505 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10506 FirstMethod->getSourceRange(), MethodStatic) 10507 << FirstMethodType << FirstName << FirstStatic; 10508 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10509 SecondMethod->getSourceRange(), MethodStatic) 10510 << SecondMethodType << SecondName << SecondStatic; 10511 Diagnosed = true; 10512 break; 10513 } 10514 10515 const bool FirstVolatile = FirstMethod->isVolatile(); 10516 const bool SecondVolatile = SecondMethod->isVolatile(); 10517 if (FirstVolatile != SecondVolatile) { 10518 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10519 FirstMethod->getSourceRange(), MethodVolatile) 10520 << FirstMethodType << FirstName << FirstVolatile; 10521 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10522 SecondMethod->getSourceRange(), MethodVolatile) 10523 << SecondMethodType << SecondName << SecondVolatile; 10524 Diagnosed = true; 10525 break; 10526 } 10527 10528 const bool FirstConst = FirstMethod->isConst(); 10529 const bool SecondConst = SecondMethod->isConst(); 10530 if (FirstConst != SecondConst) { 10531 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10532 FirstMethod->getSourceRange(), MethodConst) 10533 << FirstMethodType << FirstName << FirstConst; 10534 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10535 SecondMethod->getSourceRange(), MethodConst) 10536 << SecondMethodType << SecondName << SecondConst; 10537 Diagnosed = true; 10538 break; 10539 } 10540 10541 const bool FirstInline = FirstMethod->isInlineSpecified(); 10542 const bool SecondInline = SecondMethod->isInlineSpecified(); 10543 if (FirstInline != SecondInline) { 10544 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10545 FirstMethod->getSourceRange(), MethodInline) 10546 << FirstMethodType << FirstName << FirstInline; 10547 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10548 SecondMethod->getSourceRange(), MethodInline) 10549 << SecondMethodType << SecondName << SecondInline; 10550 Diagnosed = true; 10551 break; 10552 } 10553 10554 const unsigned FirstNumParameters = FirstMethod->param_size(); 10555 const unsigned SecondNumParameters = SecondMethod->param_size(); 10556 if (FirstNumParameters != SecondNumParameters) { 10557 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10558 FirstMethod->getSourceRange(), 10559 MethodNumberParameters) 10560 << FirstMethodType << FirstName << FirstNumParameters; 10561 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10562 SecondMethod->getSourceRange(), 10563 MethodNumberParameters) 10564 << SecondMethodType << SecondName << SecondNumParameters; 10565 Diagnosed = true; 10566 break; 10567 } 10568 10569 // Need this status boolean to know when break out of the switch. 10570 bool ParameterMismatch = false; 10571 for (unsigned I = 0; I < FirstNumParameters; ++I) { 10572 const ParmVarDecl *FirstParam = FirstMethod->getParamDecl(I); 10573 const ParmVarDecl *SecondParam = SecondMethod->getParamDecl(I); 10574 10575 QualType FirstParamType = FirstParam->getType(); 10576 QualType SecondParamType = SecondParam->getType(); 10577 if (FirstParamType != SecondParamType && 10578 ComputeQualTypeODRHash(FirstParamType) != 10579 ComputeQualTypeODRHash(SecondParamType)) { 10580 if (const DecayedType *ParamDecayedType = 10581 FirstParamType->getAs<DecayedType>()) { 10582 ODRDiagDeclError( 10583 FirstRecord, FirstModule, FirstMethod->getLocation(), 10584 FirstMethod->getSourceRange(), MethodParameterType) 10585 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10586 << true << ParamDecayedType->getOriginalType(); 10587 } else { 10588 ODRDiagDeclError( 10589 FirstRecord, FirstModule, FirstMethod->getLocation(), 10590 FirstMethod->getSourceRange(), MethodParameterType) 10591 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10592 << false; 10593 } 10594 10595 if (const DecayedType *ParamDecayedType = 10596 SecondParamType->getAs<DecayedType>()) { 10597 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10598 SecondMethod->getSourceRange(), 10599 MethodParameterType) 10600 << SecondMethodType << SecondName << (I + 1) 10601 << SecondParamType << true 10602 << ParamDecayedType->getOriginalType(); 10603 } else { 10604 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10605 SecondMethod->getSourceRange(), 10606 MethodParameterType) 10607 << SecondMethodType << SecondName << (I + 1) 10608 << SecondParamType << false; 10609 } 10610 ParameterMismatch = true; 10611 break; 10612 } 10613 10614 DeclarationName FirstParamName = FirstParam->getDeclName(); 10615 DeclarationName SecondParamName = SecondParam->getDeclName(); 10616 if (FirstParamName != SecondParamName) { 10617 ODRDiagDeclError(FirstRecord, FirstModule, 10618 FirstMethod->getLocation(), 10619 FirstMethod->getSourceRange(), MethodParameterName) 10620 << FirstMethodType << FirstName << (I + 1) << FirstParamName; 10621 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10622 SecondMethod->getSourceRange(), MethodParameterName) 10623 << SecondMethodType << SecondName << (I + 1) << SecondParamName; 10624 ParameterMismatch = true; 10625 break; 10626 } 10627 10628 const Expr *FirstInit = FirstParam->getInit(); 10629 const Expr *SecondInit = SecondParam->getInit(); 10630 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 10631 ODRDiagDeclError(FirstRecord, FirstModule, 10632 FirstMethod->getLocation(), 10633 FirstMethod->getSourceRange(), 10634 MethodParameterSingleDefaultArgument) 10635 << FirstMethodType << FirstName << (I + 1) 10636 << (FirstInit == nullptr) 10637 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 10638 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10639 SecondMethod->getSourceRange(), 10640 MethodParameterSingleDefaultArgument) 10641 << SecondMethodType << SecondName << (I + 1) 10642 << (SecondInit == nullptr) 10643 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 10644 ParameterMismatch = true; 10645 break; 10646 } 10647 10648 if (FirstInit && SecondInit && 10649 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 10650 ODRDiagDeclError(FirstRecord, FirstModule, 10651 FirstMethod->getLocation(), 10652 FirstMethod->getSourceRange(), 10653 MethodParameterDifferentDefaultArgument) 10654 << FirstMethodType << FirstName << (I + 1) 10655 << FirstInit->getSourceRange(); 10656 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10657 SecondMethod->getSourceRange(), 10658 MethodParameterDifferentDefaultArgument) 10659 << SecondMethodType << SecondName << (I + 1) 10660 << SecondInit->getSourceRange(); 10661 ParameterMismatch = true; 10662 break; 10663 10664 } 10665 } 10666 10667 if (ParameterMismatch) { 10668 Diagnosed = true; 10669 break; 10670 } 10671 10672 const auto *FirstTemplateArgs = 10673 FirstMethod->getTemplateSpecializationArgs(); 10674 const auto *SecondTemplateArgs = 10675 SecondMethod->getTemplateSpecializationArgs(); 10676 10677 if ((FirstTemplateArgs && !SecondTemplateArgs) || 10678 (!FirstTemplateArgs && SecondTemplateArgs)) { 10679 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10680 FirstMethod->getSourceRange(), 10681 MethodNoTemplateArguments) 10682 << FirstMethodType << FirstName << (FirstTemplateArgs != nullptr); 10683 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10684 SecondMethod->getSourceRange(), 10685 MethodNoTemplateArguments) 10686 << SecondMethodType << SecondName 10687 << (SecondTemplateArgs != nullptr); 10688 10689 Diagnosed = true; 10690 break; 10691 } 10692 10693 if (FirstTemplateArgs && SecondTemplateArgs) { 10694 // Remove pack expansions from argument list. 10695 auto ExpandTemplateArgumentList = 10696 [](const TemplateArgumentList *TAL) { 10697 llvm::SmallVector<const TemplateArgument *, 8> ExpandedList; 10698 for (const TemplateArgument &TA : TAL->asArray()) { 10699 if (TA.getKind() != TemplateArgument::Pack) { 10700 ExpandedList.push_back(&TA); 10701 continue; 10702 } 10703 for (const TemplateArgument &PackTA : TA.getPackAsArray()) { 10704 ExpandedList.push_back(&PackTA); 10705 } 10706 } 10707 return ExpandedList; 10708 }; 10709 llvm::SmallVector<const TemplateArgument *, 8> FirstExpandedList = 10710 ExpandTemplateArgumentList(FirstTemplateArgs); 10711 llvm::SmallVector<const TemplateArgument *, 8> SecondExpandedList = 10712 ExpandTemplateArgumentList(SecondTemplateArgs); 10713 10714 if (FirstExpandedList.size() != SecondExpandedList.size()) { 10715 ODRDiagDeclError(FirstRecord, FirstModule, 10716 FirstMethod->getLocation(), 10717 FirstMethod->getSourceRange(), 10718 MethodDifferentNumberTemplateArguments) 10719 << FirstMethodType << FirstName 10720 << (unsigned)FirstExpandedList.size(); 10721 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10722 SecondMethod->getSourceRange(), 10723 MethodDifferentNumberTemplateArguments) 10724 << SecondMethodType << SecondName 10725 << (unsigned)SecondExpandedList.size(); 10726 10727 Diagnosed = true; 10728 break; 10729 } 10730 10731 bool TemplateArgumentMismatch = false; 10732 for (unsigned i = 0, e = FirstExpandedList.size(); i != e; ++i) { 10733 const TemplateArgument &FirstTA = *FirstExpandedList[i], 10734 &SecondTA = *SecondExpandedList[i]; 10735 if (ComputeTemplateArgumentODRHash(FirstTA) == 10736 ComputeTemplateArgumentODRHash(SecondTA)) { 10737 continue; 10738 } 10739 10740 ODRDiagDeclError( 10741 FirstRecord, FirstModule, FirstMethod->getLocation(), 10742 FirstMethod->getSourceRange(), MethodDifferentTemplateArgument) 10743 << FirstMethodType << FirstName << FirstTA << i + 1; 10744 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10745 SecondMethod->getSourceRange(), 10746 MethodDifferentTemplateArgument) 10747 << SecondMethodType << SecondName << SecondTA << i + 1; 10748 10749 TemplateArgumentMismatch = true; 10750 break; 10751 } 10752 10753 if (TemplateArgumentMismatch) { 10754 Diagnosed = true; 10755 break; 10756 } 10757 } 10758 10759 // Compute the hash of the method as if it has no body. 10760 auto ComputeCXXMethodODRHash = [&Hash](const CXXMethodDecl *D) { 10761 Hash.clear(); 10762 Hash.AddFunctionDecl(D, true /*SkipBody*/); 10763 return Hash.CalculateHash(); 10764 }; 10765 10766 // Compare the hash generated to the hash stored. A difference means 10767 // that a body was present in the original source. Due to merging, 10768 // the stardard way of detecting a body will not work. 10769 const bool HasFirstBody = 10770 ComputeCXXMethodODRHash(FirstMethod) != FirstMethod->getODRHash(); 10771 const bool HasSecondBody = 10772 ComputeCXXMethodODRHash(SecondMethod) != SecondMethod->getODRHash(); 10773 10774 if (HasFirstBody != HasSecondBody) { 10775 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10776 FirstMethod->getSourceRange(), MethodSingleBody) 10777 << FirstMethodType << FirstName << HasFirstBody; 10778 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10779 SecondMethod->getSourceRange(), MethodSingleBody) 10780 << SecondMethodType << SecondName << HasSecondBody; 10781 Diagnosed = true; 10782 break; 10783 } 10784 10785 if (HasFirstBody && HasSecondBody) { 10786 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10787 FirstMethod->getSourceRange(), MethodDifferentBody) 10788 << FirstMethodType << FirstName; 10789 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10790 SecondMethod->getSourceRange(), MethodDifferentBody) 10791 << SecondMethodType << SecondName; 10792 Diagnosed = true; 10793 break; 10794 } 10795 10796 break; 10797 } 10798 case TypeAlias: 10799 case TypeDef: { 10800 Diagnosed = ODRDiagTypeDefOrAlias( 10801 FirstRecord, FirstModule, SecondModule, 10802 cast<TypedefNameDecl>(FirstDecl), cast<TypedefNameDecl>(SecondDecl), 10803 FirstDiffType == TypeAlias); 10804 break; 10805 } 10806 case Var: { 10807 Diagnosed = 10808 ODRDiagVar(FirstRecord, FirstModule, SecondModule, 10809 cast<VarDecl>(FirstDecl), cast<VarDecl>(SecondDecl)); 10810 break; 10811 } 10812 case Friend: { 10813 FriendDecl *FirstFriend = cast<FriendDecl>(FirstDecl); 10814 FriendDecl *SecondFriend = cast<FriendDecl>(SecondDecl); 10815 10816 NamedDecl *FirstND = FirstFriend->getFriendDecl(); 10817 NamedDecl *SecondND = SecondFriend->getFriendDecl(); 10818 10819 TypeSourceInfo *FirstTSI = FirstFriend->getFriendType(); 10820 TypeSourceInfo *SecondTSI = SecondFriend->getFriendType(); 10821 10822 if (FirstND && SecondND) { 10823 ODRDiagDeclError(FirstRecord, FirstModule, 10824 FirstFriend->getFriendLoc(), 10825 FirstFriend->getSourceRange(), FriendFunction) 10826 << FirstND; 10827 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10828 SecondFriend->getSourceRange(), FriendFunction) 10829 << SecondND; 10830 10831 Diagnosed = true; 10832 break; 10833 } 10834 10835 if (FirstTSI && SecondTSI) { 10836 QualType FirstFriendType = FirstTSI->getType(); 10837 QualType SecondFriendType = SecondTSI->getType(); 10838 assert(ComputeQualTypeODRHash(FirstFriendType) != 10839 ComputeQualTypeODRHash(SecondFriendType)); 10840 ODRDiagDeclError(FirstRecord, FirstModule, 10841 FirstFriend->getFriendLoc(), 10842 FirstFriend->getSourceRange(), FriendType) 10843 << FirstFriendType; 10844 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10845 SecondFriend->getSourceRange(), FriendType) 10846 << SecondFriendType; 10847 Diagnosed = true; 10848 break; 10849 } 10850 10851 ODRDiagDeclError(FirstRecord, FirstModule, FirstFriend->getFriendLoc(), 10852 FirstFriend->getSourceRange(), FriendTypeFunction) 10853 << (FirstTSI == nullptr); 10854 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10855 SecondFriend->getSourceRange(), FriendTypeFunction) 10856 << (SecondTSI == nullptr); 10857 10858 Diagnosed = true; 10859 break; 10860 } 10861 case FunctionTemplate: { 10862 FunctionTemplateDecl *FirstTemplate = 10863 cast<FunctionTemplateDecl>(FirstDecl); 10864 FunctionTemplateDecl *SecondTemplate = 10865 cast<FunctionTemplateDecl>(SecondDecl); 10866 10867 TemplateParameterList *FirstTPL = 10868 FirstTemplate->getTemplateParameters(); 10869 TemplateParameterList *SecondTPL = 10870 SecondTemplate->getTemplateParameters(); 10871 10872 if (FirstTPL->size() != SecondTPL->size()) { 10873 ODRDiagDeclError(FirstRecord, FirstModule, 10874 FirstTemplate->getLocation(), 10875 FirstTemplate->getSourceRange(), 10876 FunctionTemplateDifferentNumberParameters) 10877 << FirstTemplate << FirstTPL->size(); 10878 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10879 SecondTemplate->getSourceRange(), 10880 FunctionTemplateDifferentNumberParameters) 10881 << SecondTemplate << SecondTPL->size(); 10882 10883 Diagnosed = true; 10884 break; 10885 } 10886 10887 bool ParameterMismatch = false; 10888 for (unsigned i = 0, e = FirstTPL->size(); i != e; ++i) { 10889 NamedDecl *FirstParam = FirstTPL->getParam(i); 10890 NamedDecl *SecondParam = SecondTPL->getParam(i); 10891 10892 if (FirstParam->getKind() != SecondParam->getKind()) { 10893 enum { 10894 TemplateTypeParameter, 10895 NonTypeTemplateParameter, 10896 TemplateTemplateParameter, 10897 }; 10898 auto GetParamType = [](NamedDecl *D) { 10899 switch (D->getKind()) { 10900 default: 10901 llvm_unreachable("Unexpected template parameter type"); 10902 case Decl::TemplateTypeParm: 10903 return TemplateTypeParameter; 10904 case Decl::NonTypeTemplateParm: 10905 return NonTypeTemplateParameter; 10906 case Decl::TemplateTemplateParm: 10907 return TemplateTemplateParameter; 10908 } 10909 }; 10910 10911 ODRDiagDeclError(FirstRecord, FirstModule, 10912 FirstTemplate->getLocation(), 10913 FirstTemplate->getSourceRange(), 10914 FunctionTemplateParameterDifferentKind) 10915 << FirstTemplate << (i + 1) << GetParamType(FirstParam); 10916 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10917 SecondTemplate->getSourceRange(), 10918 FunctionTemplateParameterDifferentKind) 10919 << SecondTemplate << (i + 1) << GetParamType(SecondParam); 10920 10921 ParameterMismatch = true; 10922 break; 10923 } 10924 10925 if (FirstParam->getName() != SecondParam->getName()) { 10926 ODRDiagDeclError( 10927 FirstRecord, FirstModule, FirstTemplate->getLocation(), 10928 FirstTemplate->getSourceRange(), FunctionTemplateParameterName) 10929 << FirstTemplate << (i + 1) << (bool)FirstParam->getIdentifier() 10930 << FirstParam; 10931 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10932 SecondTemplate->getSourceRange(), 10933 FunctionTemplateParameterName) 10934 << SecondTemplate << (i + 1) 10935 << (bool)SecondParam->getIdentifier() << SecondParam; 10936 ParameterMismatch = true; 10937 break; 10938 } 10939 10940 if (isa<TemplateTypeParmDecl>(FirstParam) && 10941 isa<TemplateTypeParmDecl>(SecondParam)) { 10942 TemplateTypeParmDecl *FirstTTPD = 10943 cast<TemplateTypeParmDecl>(FirstParam); 10944 TemplateTypeParmDecl *SecondTTPD = 10945 cast<TemplateTypeParmDecl>(SecondParam); 10946 bool HasFirstDefaultArgument = 10947 FirstTTPD->hasDefaultArgument() && 10948 !FirstTTPD->defaultArgumentWasInherited(); 10949 bool HasSecondDefaultArgument = 10950 SecondTTPD->hasDefaultArgument() && 10951 !SecondTTPD->defaultArgumentWasInherited(); 10952 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10953 ODRDiagDeclError(FirstRecord, FirstModule, 10954 FirstTemplate->getLocation(), 10955 FirstTemplate->getSourceRange(), 10956 FunctionTemplateParameterSingleDefaultArgument) 10957 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 10958 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10959 SecondTemplate->getSourceRange(), 10960 FunctionTemplateParameterSingleDefaultArgument) 10961 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 10962 ParameterMismatch = true; 10963 break; 10964 } 10965 10966 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 10967 QualType FirstType = FirstTTPD->getDefaultArgument(); 10968 QualType SecondType = SecondTTPD->getDefaultArgument(); 10969 if (ComputeQualTypeODRHash(FirstType) != 10970 ComputeQualTypeODRHash(SecondType)) { 10971 ODRDiagDeclError( 10972 FirstRecord, FirstModule, FirstTemplate->getLocation(), 10973 FirstTemplate->getSourceRange(), 10974 FunctionTemplateParameterDifferentDefaultArgument) 10975 << FirstTemplate << (i + 1) << FirstType; 10976 ODRDiagDeclNote( 10977 SecondModule, SecondTemplate->getLocation(), 10978 SecondTemplate->getSourceRange(), 10979 FunctionTemplateParameterDifferentDefaultArgument) 10980 << SecondTemplate << (i + 1) << SecondType; 10981 ParameterMismatch = true; 10982 break; 10983 } 10984 } 10985 10986 if (FirstTTPD->isParameterPack() != 10987 SecondTTPD->isParameterPack()) { 10988 ODRDiagDeclError(FirstRecord, FirstModule, 10989 FirstTemplate->getLocation(), 10990 FirstTemplate->getSourceRange(), 10991 FunctionTemplatePackParameter) 10992 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 10993 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10994 SecondTemplate->getSourceRange(), 10995 FunctionTemplatePackParameter) 10996 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 10997 ParameterMismatch = true; 10998 break; 10999 } 11000 } 11001 11002 if (isa<TemplateTemplateParmDecl>(FirstParam) && 11003 isa<TemplateTemplateParmDecl>(SecondParam)) { 11004 TemplateTemplateParmDecl *FirstTTPD = 11005 cast<TemplateTemplateParmDecl>(FirstParam); 11006 TemplateTemplateParmDecl *SecondTTPD = 11007 cast<TemplateTemplateParmDecl>(SecondParam); 11008 11009 TemplateParameterList *FirstTPL = 11010 FirstTTPD->getTemplateParameters(); 11011 TemplateParameterList *SecondTPL = 11012 SecondTTPD->getTemplateParameters(); 11013 11014 if (ComputeTemplateParameterListODRHash(FirstTPL) != 11015 ComputeTemplateParameterListODRHash(SecondTPL)) { 11016 ODRDiagDeclError(FirstRecord, FirstModule, 11017 FirstTemplate->getLocation(), 11018 FirstTemplate->getSourceRange(), 11019 FunctionTemplateParameterDifferentType) 11020 << FirstTemplate << (i + 1); 11021 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11022 SecondTemplate->getSourceRange(), 11023 FunctionTemplateParameterDifferentType) 11024 << SecondTemplate << (i + 1); 11025 ParameterMismatch = true; 11026 break; 11027 } 11028 11029 bool HasFirstDefaultArgument = 11030 FirstTTPD->hasDefaultArgument() && 11031 !FirstTTPD->defaultArgumentWasInherited(); 11032 bool HasSecondDefaultArgument = 11033 SecondTTPD->hasDefaultArgument() && 11034 !SecondTTPD->defaultArgumentWasInherited(); 11035 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 11036 ODRDiagDeclError(FirstRecord, FirstModule, 11037 FirstTemplate->getLocation(), 11038 FirstTemplate->getSourceRange(), 11039 FunctionTemplateParameterSingleDefaultArgument) 11040 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 11041 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11042 SecondTemplate->getSourceRange(), 11043 FunctionTemplateParameterSingleDefaultArgument) 11044 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 11045 ParameterMismatch = true; 11046 break; 11047 } 11048 11049 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 11050 TemplateArgument FirstTA = 11051 FirstTTPD->getDefaultArgument().getArgument(); 11052 TemplateArgument SecondTA = 11053 SecondTTPD->getDefaultArgument().getArgument(); 11054 if (ComputeTemplateArgumentODRHash(FirstTA) != 11055 ComputeTemplateArgumentODRHash(SecondTA)) { 11056 ODRDiagDeclError( 11057 FirstRecord, FirstModule, FirstTemplate->getLocation(), 11058 FirstTemplate->getSourceRange(), 11059 FunctionTemplateParameterDifferentDefaultArgument) 11060 << FirstTemplate << (i + 1) << FirstTA; 11061 ODRDiagDeclNote( 11062 SecondModule, SecondTemplate->getLocation(), 11063 SecondTemplate->getSourceRange(), 11064 FunctionTemplateParameterDifferentDefaultArgument) 11065 << SecondTemplate << (i + 1) << SecondTA; 11066 ParameterMismatch = true; 11067 break; 11068 } 11069 } 11070 11071 if (FirstTTPD->isParameterPack() != 11072 SecondTTPD->isParameterPack()) { 11073 ODRDiagDeclError(FirstRecord, FirstModule, 11074 FirstTemplate->getLocation(), 11075 FirstTemplate->getSourceRange(), 11076 FunctionTemplatePackParameter) 11077 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 11078 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11079 SecondTemplate->getSourceRange(), 11080 FunctionTemplatePackParameter) 11081 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 11082 ParameterMismatch = true; 11083 break; 11084 } 11085 } 11086 11087 if (isa<NonTypeTemplateParmDecl>(FirstParam) && 11088 isa<NonTypeTemplateParmDecl>(SecondParam)) { 11089 NonTypeTemplateParmDecl *FirstNTTPD = 11090 cast<NonTypeTemplateParmDecl>(FirstParam); 11091 NonTypeTemplateParmDecl *SecondNTTPD = 11092 cast<NonTypeTemplateParmDecl>(SecondParam); 11093 11094 QualType FirstType = FirstNTTPD->getType(); 11095 QualType SecondType = SecondNTTPD->getType(); 11096 if (ComputeQualTypeODRHash(FirstType) != 11097 ComputeQualTypeODRHash(SecondType)) { 11098 ODRDiagDeclError(FirstRecord, FirstModule, 11099 FirstTemplate->getLocation(), 11100 FirstTemplate->getSourceRange(), 11101 FunctionTemplateParameterDifferentType) 11102 << FirstTemplate << (i + 1); 11103 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11104 SecondTemplate->getSourceRange(), 11105 FunctionTemplateParameterDifferentType) 11106 << SecondTemplate << (i + 1); 11107 ParameterMismatch = true; 11108 break; 11109 } 11110 11111 bool HasFirstDefaultArgument = 11112 FirstNTTPD->hasDefaultArgument() && 11113 !FirstNTTPD->defaultArgumentWasInherited(); 11114 bool HasSecondDefaultArgument = 11115 SecondNTTPD->hasDefaultArgument() && 11116 !SecondNTTPD->defaultArgumentWasInherited(); 11117 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 11118 ODRDiagDeclError(FirstRecord, FirstModule, 11119 FirstTemplate->getLocation(), 11120 FirstTemplate->getSourceRange(), 11121 FunctionTemplateParameterSingleDefaultArgument) 11122 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 11123 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11124 SecondTemplate->getSourceRange(), 11125 FunctionTemplateParameterSingleDefaultArgument) 11126 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 11127 ParameterMismatch = true; 11128 break; 11129 } 11130 11131 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 11132 Expr *FirstDefaultArgument = FirstNTTPD->getDefaultArgument(); 11133 Expr *SecondDefaultArgument = SecondNTTPD->getDefaultArgument(); 11134 if (ComputeODRHash(FirstDefaultArgument) != 11135 ComputeODRHash(SecondDefaultArgument)) { 11136 ODRDiagDeclError( 11137 FirstRecord, FirstModule, FirstTemplate->getLocation(), 11138 FirstTemplate->getSourceRange(), 11139 FunctionTemplateParameterDifferentDefaultArgument) 11140 << FirstTemplate << (i + 1) << FirstDefaultArgument; 11141 ODRDiagDeclNote( 11142 SecondModule, SecondTemplate->getLocation(), 11143 SecondTemplate->getSourceRange(), 11144 FunctionTemplateParameterDifferentDefaultArgument) 11145 << SecondTemplate << (i + 1) << SecondDefaultArgument; 11146 ParameterMismatch = true; 11147 break; 11148 } 11149 } 11150 11151 if (FirstNTTPD->isParameterPack() != 11152 SecondNTTPD->isParameterPack()) { 11153 ODRDiagDeclError(FirstRecord, FirstModule, 11154 FirstTemplate->getLocation(), 11155 FirstTemplate->getSourceRange(), 11156 FunctionTemplatePackParameter) 11157 << FirstTemplate << (i + 1) << FirstNTTPD->isParameterPack(); 11158 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11159 SecondTemplate->getSourceRange(), 11160 FunctionTemplatePackParameter) 11161 << SecondTemplate << (i + 1) 11162 << SecondNTTPD->isParameterPack(); 11163 ParameterMismatch = true; 11164 break; 11165 } 11166 } 11167 } 11168 11169 if (ParameterMismatch) { 11170 Diagnosed = true; 11171 break; 11172 } 11173 11174 break; 11175 } 11176 } 11177 11178 if (Diagnosed) 11179 continue; 11180 11181 Diag(FirstDecl->getLocation(), 11182 diag::err_module_odr_violation_mismatch_decl_unknown) 11183 << FirstRecord << FirstModule.empty() << FirstModule << FirstDiffType 11184 << FirstDecl->getSourceRange(); 11185 Diag(SecondDecl->getLocation(), 11186 diag::note_module_odr_violation_mismatch_decl_unknown) 11187 << SecondModule << FirstDiffType << SecondDecl->getSourceRange(); 11188 Diagnosed = true; 11189 } 11190 11191 if (!Diagnosed) { 11192 // All definitions are updates to the same declaration. This happens if a 11193 // module instantiates the declaration of a class template specialization 11194 // and two or more other modules instantiate its definition. 11195 // 11196 // FIXME: Indicate which modules had instantiations of this definition. 11197 // FIXME: How can this even happen? 11198 Diag(Merge.first->getLocation(), 11199 diag::err_module_odr_violation_different_instantiations) 11200 << Merge.first; 11201 } 11202 } 11203 11204 // Issue ODR failures diagnostics for functions. 11205 for (auto &Merge : FunctionOdrMergeFailures) { 11206 enum ODRFunctionDifference { 11207 ReturnType, 11208 ParameterName, 11209 ParameterType, 11210 ParameterSingleDefaultArgument, 11211 ParameterDifferentDefaultArgument, 11212 FunctionBody, 11213 }; 11214 11215 FunctionDecl *FirstFunction = Merge.first; 11216 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstFunction); 11217 11218 bool Diagnosed = false; 11219 for (auto &SecondFunction : Merge.second) { 11220 11221 if (FirstFunction == SecondFunction) 11222 continue; 11223 11224 std::string SecondModule = 11225 getOwningModuleNameForDiagnostic(SecondFunction); 11226 11227 auto ODRDiagError = [FirstFunction, &FirstModule, 11228 this](SourceLocation Loc, SourceRange Range, 11229 ODRFunctionDifference DiffType) { 11230 return Diag(Loc, diag::err_module_odr_violation_function) 11231 << FirstFunction << FirstModule.empty() << FirstModule << Range 11232 << DiffType; 11233 }; 11234 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11235 SourceRange Range, 11236 ODRFunctionDifference DiffType) { 11237 return Diag(Loc, diag::note_module_odr_violation_function) 11238 << SecondModule << Range << DiffType; 11239 }; 11240 11241 if (ComputeQualTypeODRHash(FirstFunction->getReturnType()) != 11242 ComputeQualTypeODRHash(SecondFunction->getReturnType())) { 11243 ODRDiagError(FirstFunction->getReturnTypeSourceRange().getBegin(), 11244 FirstFunction->getReturnTypeSourceRange(), ReturnType) 11245 << FirstFunction->getReturnType(); 11246 ODRDiagNote(SecondFunction->getReturnTypeSourceRange().getBegin(), 11247 SecondFunction->getReturnTypeSourceRange(), ReturnType) 11248 << SecondFunction->getReturnType(); 11249 Diagnosed = true; 11250 break; 11251 } 11252 11253 assert(FirstFunction->param_size() == SecondFunction->param_size() && 11254 "Merged functions with different number of parameters"); 11255 11256 auto ParamSize = FirstFunction->param_size(); 11257 bool ParameterMismatch = false; 11258 for (unsigned I = 0; I < ParamSize; ++I) { 11259 auto *FirstParam = FirstFunction->getParamDecl(I); 11260 auto *SecondParam = SecondFunction->getParamDecl(I); 11261 11262 assert(getContext().hasSameType(FirstParam->getType(), 11263 SecondParam->getType()) && 11264 "Merged function has different parameter types."); 11265 11266 if (FirstParam->getDeclName() != SecondParam->getDeclName()) { 11267 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11268 ParameterName) 11269 << I + 1 << FirstParam->getDeclName(); 11270 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11271 ParameterName) 11272 << I + 1 << SecondParam->getDeclName(); 11273 ParameterMismatch = true; 11274 break; 11275 }; 11276 11277 QualType FirstParamType = FirstParam->getType(); 11278 QualType SecondParamType = SecondParam->getType(); 11279 if (FirstParamType != SecondParamType && 11280 ComputeQualTypeODRHash(FirstParamType) != 11281 ComputeQualTypeODRHash(SecondParamType)) { 11282 if (const DecayedType *ParamDecayedType = 11283 FirstParamType->getAs<DecayedType>()) { 11284 ODRDiagError(FirstParam->getLocation(), 11285 FirstParam->getSourceRange(), ParameterType) 11286 << (I + 1) << FirstParamType << true 11287 << ParamDecayedType->getOriginalType(); 11288 } else { 11289 ODRDiagError(FirstParam->getLocation(), 11290 FirstParam->getSourceRange(), ParameterType) 11291 << (I + 1) << FirstParamType << false; 11292 } 11293 11294 if (const DecayedType *ParamDecayedType = 11295 SecondParamType->getAs<DecayedType>()) { 11296 ODRDiagNote(SecondParam->getLocation(), 11297 SecondParam->getSourceRange(), ParameterType) 11298 << (I + 1) << SecondParamType << true 11299 << ParamDecayedType->getOriginalType(); 11300 } else { 11301 ODRDiagNote(SecondParam->getLocation(), 11302 SecondParam->getSourceRange(), ParameterType) 11303 << (I + 1) << SecondParamType << false; 11304 } 11305 ParameterMismatch = true; 11306 break; 11307 } 11308 11309 const Expr *FirstInit = FirstParam->getInit(); 11310 const Expr *SecondInit = SecondParam->getInit(); 11311 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 11312 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11313 ParameterSingleDefaultArgument) 11314 << (I + 1) << (FirstInit == nullptr) 11315 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 11316 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11317 ParameterSingleDefaultArgument) 11318 << (I + 1) << (SecondInit == nullptr) 11319 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 11320 ParameterMismatch = true; 11321 break; 11322 } 11323 11324 if (FirstInit && SecondInit && 11325 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11326 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11327 ParameterDifferentDefaultArgument) 11328 << (I + 1) << FirstInit->getSourceRange(); 11329 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11330 ParameterDifferentDefaultArgument) 11331 << (I + 1) << SecondInit->getSourceRange(); 11332 ParameterMismatch = true; 11333 break; 11334 } 11335 11336 assert(ComputeSubDeclODRHash(FirstParam) == 11337 ComputeSubDeclODRHash(SecondParam) && 11338 "Undiagnosed parameter difference."); 11339 } 11340 11341 if (ParameterMismatch) { 11342 Diagnosed = true; 11343 break; 11344 } 11345 11346 // If no error has been generated before now, assume the problem is in 11347 // the body and generate a message. 11348 ODRDiagError(FirstFunction->getLocation(), 11349 FirstFunction->getSourceRange(), FunctionBody); 11350 ODRDiagNote(SecondFunction->getLocation(), 11351 SecondFunction->getSourceRange(), FunctionBody); 11352 Diagnosed = true; 11353 break; 11354 } 11355 (void)Diagnosed; 11356 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11357 } 11358 11359 // Issue ODR failures diagnostics for enums. 11360 for (auto &Merge : EnumOdrMergeFailures) { 11361 enum ODREnumDifference { 11362 SingleScopedEnum, 11363 EnumTagKeywordMismatch, 11364 SingleSpecifiedType, 11365 DifferentSpecifiedTypes, 11366 DifferentNumberEnumConstants, 11367 EnumConstantName, 11368 EnumConstantSingleInitilizer, 11369 EnumConstantDifferentInitilizer, 11370 }; 11371 11372 // If we've already pointed out a specific problem with this enum, don't 11373 // bother issuing a general "something's different" diagnostic. 11374 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 11375 continue; 11376 11377 EnumDecl *FirstEnum = Merge.first; 11378 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstEnum); 11379 11380 using DeclHashes = 11381 llvm::SmallVector<std::pair<EnumConstantDecl *, unsigned>, 4>; 11382 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstEnum]( 11383 DeclHashes &Hashes, EnumDecl *Enum) { 11384 for (auto *D : Enum->decls()) { 11385 // Due to decl merging, the first EnumDecl is the parent of 11386 // Decls in both records. 11387 if (!ODRHash::isDeclToBeProcessed(D, FirstEnum)) 11388 continue; 11389 assert(isa<EnumConstantDecl>(D) && "Unexpected Decl kind"); 11390 Hashes.emplace_back(cast<EnumConstantDecl>(D), 11391 ComputeSubDeclODRHash(D)); 11392 } 11393 }; 11394 DeclHashes FirstHashes; 11395 PopulateHashes(FirstHashes, FirstEnum); 11396 bool Diagnosed = false; 11397 for (auto &SecondEnum : Merge.second) { 11398 11399 if (FirstEnum == SecondEnum) 11400 continue; 11401 11402 std::string SecondModule = 11403 getOwningModuleNameForDiagnostic(SecondEnum); 11404 11405 auto ODRDiagError = [FirstEnum, &FirstModule, 11406 this](SourceLocation Loc, SourceRange Range, 11407 ODREnumDifference DiffType) { 11408 return Diag(Loc, diag::err_module_odr_violation_enum) 11409 << FirstEnum << FirstModule.empty() << FirstModule << Range 11410 << DiffType; 11411 }; 11412 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11413 SourceRange Range, 11414 ODREnumDifference DiffType) { 11415 return Diag(Loc, diag::note_module_odr_violation_enum) 11416 << SecondModule << Range << DiffType; 11417 }; 11418 11419 if (FirstEnum->isScoped() != SecondEnum->isScoped()) { 11420 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11421 SingleScopedEnum) 11422 << FirstEnum->isScoped(); 11423 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11424 SingleScopedEnum) 11425 << SecondEnum->isScoped(); 11426 Diagnosed = true; 11427 continue; 11428 } 11429 11430 if (FirstEnum->isScoped() && SecondEnum->isScoped()) { 11431 if (FirstEnum->isScopedUsingClassTag() != 11432 SecondEnum->isScopedUsingClassTag()) { 11433 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11434 EnumTagKeywordMismatch) 11435 << FirstEnum->isScopedUsingClassTag(); 11436 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11437 EnumTagKeywordMismatch) 11438 << SecondEnum->isScopedUsingClassTag(); 11439 Diagnosed = true; 11440 continue; 11441 } 11442 } 11443 11444 QualType FirstUnderlyingType = 11445 FirstEnum->getIntegerTypeSourceInfo() 11446 ? FirstEnum->getIntegerTypeSourceInfo()->getType() 11447 : QualType(); 11448 QualType SecondUnderlyingType = 11449 SecondEnum->getIntegerTypeSourceInfo() 11450 ? SecondEnum->getIntegerTypeSourceInfo()->getType() 11451 : QualType(); 11452 if (FirstUnderlyingType.isNull() != SecondUnderlyingType.isNull()) { 11453 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11454 SingleSpecifiedType) 11455 << !FirstUnderlyingType.isNull(); 11456 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11457 SingleSpecifiedType) 11458 << !SecondUnderlyingType.isNull(); 11459 Diagnosed = true; 11460 continue; 11461 } 11462 11463 if (!FirstUnderlyingType.isNull() && !SecondUnderlyingType.isNull()) { 11464 if (ComputeQualTypeODRHash(FirstUnderlyingType) != 11465 ComputeQualTypeODRHash(SecondUnderlyingType)) { 11466 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11467 DifferentSpecifiedTypes) 11468 << FirstUnderlyingType; 11469 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11470 DifferentSpecifiedTypes) 11471 << SecondUnderlyingType; 11472 Diagnosed = true; 11473 continue; 11474 } 11475 } 11476 11477 DeclHashes SecondHashes; 11478 PopulateHashes(SecondHashes, SecondEnum); 11479 11480 if (FirstHashes.size() != SecondHashes.size()) { 11481 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11482 DifferentNumberEnumConstants) 11483 << (int)FirstHashes.size(); 11484 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11485 DifferentNumberEnumConstants) 11486 << (int)SecondHashes.size(); 11487 Diagnosed = true; 11488 continue; 11489 } 11490 11491 for (unsigned I = 0; I < FirstHashes.size(); ++I) { 11492 if (FirstHashes[I].second == SecondHashes[I].second) 11493 continue; 11494 const EnumConstantDecl *FirstEnumConstant = FirstHashes[I].first; 11495 const EnumConstantDecl *SecondEnumConstant = SecondHashes[I].first; 11496 11497 if (FirstEnumConstant->getDeclName() != 11498 SecondEnumConstant->getDeclName()) { 11499 11500 ODRDiagError(FirstEnumConstant->getLocation(), 11501 FirstEnumConstant->getSourceRange(), EnumConstantName) 11502 << I + 1 << FirstEnumConstant; 11503 ODRDiagNote(SecondEnumConstant->getLocation(), 11504 SecondEnumConstant->getSourceRange(), EnumConstantName) 11505 << I + 1 << SecondEnumConstant; 11506 Diagnosed = true; 11507 break; 11508 } 11509 11510 const Expr *FirstInit = FirstEnumConstant->getInitExpr(); 11511 const Expr *SecondInit = SecondEnumConstant->getInitExpr(); 11512 if (!FirstInit && !SecondInit) 11513 continue; 11514 11515 if (!FirstInit || !SecondInit) { 11516 ODRDiagError(FirstEnumConstant->getLocation(), 11517 FirstEnumConstant->getSourceRange(), 11518 EnumConstantSingleInitilizer) 11519 << I + 1 << FirstEnumConstant << (FirstInit != nullptr); 11520 ODRDiagNote(SecondEnumConstant->getLocation(), 11521 SecondEnumConstant->getSourceRange(), 11522 EnumConstantSingleInitilizer) 11523 << I + 1 << SecondEnumConstant << (SecondInit != nullptr); 11524 Diagnosed = true; 11525 break; 11526 } 11527 11528 if (ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11529 ODRDiagError(FirstEnumConstant->getLocation(), 11530 FirstEnumConstant->getSourceRange(), 11531 EnumConstantDifferentInitilizer) 11532 << I + 1 << FirstEnumConstant; 11533 ODRDiagNote(SecondEnumConstant->getLocation(), 11534 SecondEnumConstant->getSourceRange(), 11535 EnumConstantDifferentInitilizer) 11536 << I + 1 << SecondEnumConstant; 11537 Diagnosed = true; 11538 break; 11539 } 11540 } 11541 } 11542 11543 (void)Diagnosed; 11544 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11545 } 11546 } 11547 11548 void ASTReader::StartedDeserializing() { 11549 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get()) 11550 ReadTimer->startTimer(); 11551 } 11552 11553 void ASTReader::FinishedDeserializing() { 11554 assert(NumCurrentElementsDeserializing && 11555 "FinishedDeserializing not paired with StartedDeserializing"); 11556 if (NumCurrentElementsDeserializing == 1) { 11557 // We decrease NumCurrentElementsDeserializing only after pending actions 11558 // are finished, to avoid recursively re-calling finishPendingActions(). 11559 finishPendingActions(); 11560 } 11561 --NumCurrentElementsDeserializing; 11562 11563 if (NumCurrentElementsDeserializing == 0) { 11564 // Propagate exception specification and deduced type updates along 11565 // redeclaration chains. 11566 // 11567 // We do this now rather than in finishPendingActions because we want to 11568 // be able to walk the complete redeclaration chains of the updated decls. 11569 while (!PendingExceptionSpecUpdates.empty() || 11570 !PendingDeducedTypeUpdates.empty()) { 11571 auto ESUpdates = std::move(PendingExceptionSpecUpdates); 11572 PendingExceptionSpecUpdates.clear(); 11573 for (auto Update : ESUpdates) { 11574 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11575 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>(); 11576 auto ESI = FPT->getExtProtoInfo().ExceptionSpec; 11577 if (auto *Listener = getContext().getASTMutationListener()) 11578 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second)); 11579 for (auto *Redecl : Update.second->redecls()) 11580 getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI); 11581 } 11582 11583 auto DTUpdates = std::move(PendingDeducedTypeUpdates); 11584 PendingDeducedTypeUpdates.clear(); 11585 for (auto Update : DTUpdates) { 11586 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11587 // FIXME: If the return type is already deduced, check that it matches. 11588 getContext().adjustDeducedFunctionResultType(Update.first, 11589 Update.second); 11590 } 11591 } 11592 11593 if (ReadTimer) 11594 ReadTimer->stopTimer(); 11595 11596 diagnoseOdrViolations(); 11597 11598 // We are not in recursive loading, so it's safe to pass the "interesting" 11599 // decls to the consumer. 11600 if (Consumer) 11601 PassInterestingDeclsToConsumer(); 11602 } 11603 } 11604 11605 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 11606 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { 11607 // Remove any fake results before adding any real ones. 11608 auto It = PendingFakeLookupResults.find(II); 11609 if (It != PendingFakeLookupResults.end()) { 11610 for (auto *ND : It->second) 11611 SemaObj->IdResolver.RemoveDecl(ND); 11612 // FIXME: this works around module+PCH performance issue. 11613 // Rather than erase the result from the map, which is O(n), just clear 11614 // the vector of NamedDecls. 11615 It->second.clear(); 11616 } 11617 } 11618 11619 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 11620 SemaObj->TUScope->AddDecl(D); 11621 } else if (SemaObj->TUScope) { 11622 // Adding the decl to IdResolver may have failed because it was already in 11623 // (even though it was not added in scope). If it is already in, make sure 11624 // it gets in the scope as well. 11625 if (std::find(SemaObj->IdResolver.begin(Name), 11626 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 11627 SemaObj->TUScope->AddDecl(D); 11628 } 11629 } 11630 11631 ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache, 11632 ASTContext *Context, 11633 const PCHContainerReader &PCHContainerRdr, 11634 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions, 11635 StringRef isysroot, 11636 DisableValidationForModuleKind DisableValidationKind, 11637 bool AllowASTWithCompilerErrors, 11638 bool AllowConfigurationMismatch, bool ValidateSystemInputs, 11639 bool ValidateASTInputFilesContent, bool UseGlobalIndex, 11640 std::unique_ptr<llvm::Timer> ReadTimer) 11641 : Listener(bool(DisableValidationKind &DisableValidationForModuleKind::PCH) 11642 ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP)) 11643 : cast<ASTReaderListener>(new PCHValidator(PP, *this))), 11644 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), 11645 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP), 11646 ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache, 11647 PCHContainerRdr, PP.getHeaderSearchInfo()), 11648 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot), 11649 DisableValidationKind(DisableValidationKind), 11650 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 11651 AllowConfigurationMismatch(AllowConfigurationMismatch), 11652 ValidateSystemInputs(ValidateSystemInputs), 11653 ValidateASTInputFilesContent(ValidateASTInputFilesContent), 11654 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) { 11655 SourceMgr.setExternalSLocEntrySource(this); 11656 11657 for (const auto &Ext : Extensions) { 11658 auto BlockName = Ext->getExtensionMetadata().BlockName; 11659 auto Known = ModuleFileExtensions.find(BlockName); 11660 if (Known != ModuleFileExtensions.end()) { 11661 Diags.Report(diag::warn_duplicate_module_file_extension) 11662 << BlockName; 11663 continue; 11664 } 11665 11666 ModuleFileExtensions.insert({BlockName, Ext}); 11667 } 11668 } 11669 11670 ASTReader::~ASTReader() { 11671 if (OwnsDeserializationListener) 11672 delete DeserializationListener; 11673 } 11674 11675 IdentifierResolver &ASTReader::getIdResolver() { 11676 return SemaObj ? SemaObj->IdResolver : DummyIdResolver; 11677 } 11678 11679 Expected<unsigned> ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor, 11680 unsigned AbbrevID) { 11681 Idx = 0; 11682 Record.clear(); 11683 return Cursor.readRecord(AbbrevID, Record); 11684 } 11685 //===----------------------------------------------------------------------===// 11686 //// OMPClauseReader implementation 11687 ////===----------------------------------------------------------------------===// 11688 11689 // This has to be in namespace clang because it's friended by all 11690 // of the OMP clauses. 11691 namespace clang { 11692 11693 class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> { 11694 ASTRecordReader &Record; 11695 ASTContext &Context; 11696 11697 public: 11698 OMPClauseReader(ASTRecordReader &Record) 11699 : Record(Record), Context(Record.getContext()) {} 11700 #define GEN_CLANG_CLAUSE_CLASS 11701 #define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C); 11702 #include "llvm/Frontend/OpenMP/OMP.inc" 11703 OMPClause *readClause(); 11704 void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C); 11705 void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C); 11706 }; 11707 11708 } // end namespace clang 11709 11710 OMPClause *ASTRecordReader::readOMPClause() { 11711 return OMPClauseReader(*this).readClause(); 11712 } 11713 11714 OMPClause *OMPClauseReader::readClause() { 11715 OMPClause *C = nullptr; 11716 switch (llvm::omp::Clause(Record.readInt())) { 11717 case llvm::omp::OMPC_if: 11718 C = new (Context) OMPIfClause(); 11719 break; 11720 case llvm::omp::OMPC_final: 11721 C = new (Context) OMPFinalClause(); 11722 break; 11723 case llvm::omp::OMPC_num_threads: 11724 C = new (Context) OMPNumThreadsClause(); 11725 break; 11726 case llvm::omp::OMPC_safelen: 11727 C = new (Context) OMPSafelenClause(); 11728 break; 11729 case llvm::omp::OMPC_simdlen: 11730 C = new (Context) OMPSimdlenClause(); 11731 break; 11732 case llvm::omp::OMPC_sizes: { 11733 unsigned NumSizes = Record.readInt(); 11734 C = OMPSizesClause::CreateEmpty(Context, NumSizes); 11735 break; 11736 } 11737 case llvm::omp::OMPC_full: 11738 C = OMPFullClause::CreateEmpty(Context); 11739 break; 11740 case llvm::omp::OMPC_partial: 11741 C = OMPPartialClause::CreateEmpty(Context); 11742 break; 11743 case llvm::omp::OMPC_allocator: 11744 C = new (Context) OMPAllocatorClause(); 11745 break; 11746 case llvm::omp::OMPC_collapse: 11747 C = new (Context) OMPCollapseClause(); 11748 break; 11749 case llvm::omp::OMPC_default: 11750 C = new (Context) OMPDefaultClause(); 11751 break; 11752 case llvm::omp::OMPC_proc_bind: 11753 C = new (Context) OMPProcBindClause(); 11754 break; 11755 case llvm::omp::OMPC_schedule: 11756 C = new (Context) OMPScheduleClause(); 11757 break; 11758 case llvm::omp::OMPC_ordered: 11759 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt()); 11760 break; 11761 case llvm::omp::OMPC_nowait: 11762 C = new (Context) OMPNowaitClause(); 11763 break; 11764 case llvm::omp::OMPC_untied: 11765 C = new (Context) OMPUntiedClause(); 11766 break; 11767 case llvm::omp::OMPC_mergeable: 11768 C = new (Context) OMPMergeableClause(); 11769 break; 11770 case llvm::omp::OMPC_read: 11771 C = new (Context) OMPReadClause(); 11772 break; 11773 case llvm::omp::OMPC_write: 11774 C = new (Context) OMPWriteClause(); 11775 break; 11776 case llvm::omp::OMPC_update: 11777 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt()); 11778 break; 11779 case llvm::omp::OMPC_capture: 11780 C = new (Context) OMPCaptureClause(); 11781 break; 11782 case llvm::omp::OMPC_seq_cst: 11783 C = new (Context) OMPSeqCstClause(); 11784 break; 11785 case llvm::omp::OMPC_acq_rel: 11786 C = new (Context) OMPAcqRelClause(); 11787 break; 11788 case llvm::omp::OMPC_acquire: 11789 C = new (Context) OMPAcquireClause(); 11790 break; 11791 case llvm::omp::OMPC_release: 11792 C = new (Context) OMPReleaseClause(); 11793 break; 11794 case llvm::omp::OMPC_relaxed: 11795 C = new (Context) OMPRelaxedClause(); 11796 break; 11797 case llvm::omp::OMPC_threads: 11798 C = new (Context) OMPThreadsClause(); 11799 break; 11800 case llvm::omp::OMPC_simd: 11801 C = new (Context) OMPSIMDClause(); 11802 break; 11803 case llvm::omp::OMPC_nogroup: 11804 C = new (Context) OMPNogroupClause(); 11805 break; 11806 case llvm::omp::OMPC_unified_address: 11807 C = new (Context) OMPUnifiedAddressClause(); 11808 break; 11809 case llvm::omp::OMPC_unified_shared_memory: 11810 C = new (Context) OMPUnifiedSharedMemoryClause(); 11811 break; 11812 case llvm::omp::OMPC_reverse_offload: 11813 C = new (Context) OMPReverseOffloadClause(); 11814 break; 11815 case llvm::omp::OMPC_dynamic_allocators: 11816 C = new (Context) OMPDynamicAllocatorsClause(); 11817 break; 11818 case llvm::omp::OMPC_atomic_default_mem_order: 11819 C = new (Context) OMPAtomicDefaultMemOrderClause(); 11820 break; 11821 case llvm::omp::OMPC_private: 11822 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt()); 11823 break; 11824 case llvm::omp::OMPC_firstprivate: 11825 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt()); 11826 break; 11827 case llvm::omp::OMPC_lastprivate: 11828 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt()); 11829 break; 11830 case llvm::omp::OMPC_shared: 11831 C = OMPSharedClause::CreateEmpty(Context, Record.readInt()); 11832 break; 11833 case llvm::omp::OMPC_reduction: { 11834 unsigned N = Record.readInt(); 11835 auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>(); 11836 C = OMPReductionClause::CreateEmpty(Context, N, Modifier); 11837 break; 11838 } 11839 case llvm::omp::OMPC_task_reduction: 11840 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt()); 11841 break; 11842 case llvm::omp::OMPC_in_reduction: 11843 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt()); 11844 break; 11845 case llvm::omp::OMPC_linear: 11846 C = OMPLinearClause::CreateEmpty(Context, Record.readInt()); 11847 break; 11848 case llvm::omp::OMPC_aligned: 11849 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt()); 11850 break; 11851 case llvm::omp::OMPC_copyin: 11852 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt()); 11853 break; 11854 case llvm::omp::OMPC_copyprivate: 11855 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt()); 11856 break; 11857 case llvm::omp::OMPC_flush: 11858 C = OMPFlushClause::CreateEmpty(Context, Record.readInt()); 11859 break; 11860 case llvm::omp::OMPC_depobj: 11861 C = OMPDepobjClause::CreateEmpty(Context); 11862 break; 11863 case llvm::omp::OMPC_depend: { 11864 unsigned NumVars = Record.readInt(); 11865 unsigned NumLoops = Record.readInt(); 11866 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops); 11867 break; 11868 } 11869 case llvm::omp::OMPC_device: 11870 C = new (Context) OMPDeviceClause(); 11871 break; 11872 case llvm::omp::OMPC_map: { 11873 OMPMappableExprListSizeTy Sizes; 11874 Sizes.NumVars = Record.readInt(); 11875 Sizes.NumUniqueDeclarations = Record.readInt(); 11876 Sizes.NumComponentLists = Record.readInt(); 11877 Sizes.NumComponents = Record.readInt(); 11878 C = OMPMapClause::CreateEmpty(Context, Sizes); 11879 break; 11880 } 11881 case llvm::omp::OMPC_num_teams: 11882 C = new (Context) OMPNumTeamsClause(); 11883 break; 11884 case llvm::omp::OMPC_thread_limit: 11885 C = new (Context) OMPThreadLimitClause(); 11886 break; 11887 case llvm::omp::OMPC_priority: 11888 C = new (Context) OMPPriorityClause(); 11889 break; 11890 case llvm::omp::OMPC_grainsize: 11891 C = new (Context) OMPGrainsizeClause(); 11892 break; 11893 case llvm::omp::OMPC_num_tasks: 11894 C = new (Context) OMPNumTasksClause(); 11895 break; 11896 case llvm::omp::OMPC_hint: 11897 C = new (Context) OMPHintClause(); 11898 break; 11899 case llvm::omp::OMPC_dist_schedule: 11900 C = new (Context) OMPDistScheduleClause(); 11901 break; 11902 case llvm::omp::OMPC_defaultmap: 11903 C = new (Context) OMPDefaultmapClause(); 11904 break; 11905 case llvm::omp::OMPC_to: { 11906 OMPMappableExprListSizeTy Sizes; 11907 Sizes.NumVars = Record.readInt(); 11908 Sizes.NumUniqueDeclarations = Record.readInt(); 11909 Sizes.NumComponentLists = Record.readInt(); 11910 Sizes.NumComponents = Record.readInt(); 11911 C = OMPToClause::CreateEmpty(Context, Sizes); 11912 break; 11913 } 11914 case llvm::omp::OMPC_from: { 11915 OMPMappableExprListSizeTy Sizes; 11916 Sizes.NumVars = Record.readInt(); 11917 Sizes.NumUniqueDeclarations = Record.readInt(); 11918 Sizes.NumComponentLists = Record.readInt(); 11919 Sizes.NumComponents = Record.readInt(); 11920 C = OMPFromClause::CreateEmpty(Context, Sizes); 11921 break; 11922 } 11923 case llvm::omp::OMPC_use_device_ptr: { 11924 OMPMappableExprListSizeTy Sizes; 11925 Sizes.NumVars = Record.readInt(); 11926 Sizes.NumUniqueDeclarations = Record.readInt(); 11927 Sizes.NumComponentLists = Record.readInt(); 11928 Sizes.NumComponents = Record.readInt(); 11929 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes); 11930 break; 11931 } 11932 case llvm::omp::OMPC_use_device_addr: { 11933 OMPMappableExprListSizeTy Sizes; 11934 Sizes.NumVars = Record.readInt(); 11935 Sizes.NumUniqueDeclarations = Record.readInt(); 11936 Sizes.NumComponentLists = Record.readInt(); 11937 Sizes.NumComponents = Record.readInt(); 11938 C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes); 11939 break; 11940 } 11941 case llvm::omp::OMPC_is_device_ptr: { 11942 OMPMappableExprListSizeTy Sizes; 11943 Sizes.NumVars = Record.readInt(); 11944 Sizes.NumUniqueDeclarations = Record.readInt(); 11945 Sizes.NumComponentLists = Record.readInt(); 11946 Sizes.NumComponents = Record.readInt(); 11947 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes); 11948 break; 11949 } 11950 case llvm::omp::OMPC_allocate: 11951 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt()); 11952 break; 11953 case llvm::omp::OMPC_nontemporal: 11954 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt()); 11955 break; 11956 case llvm::omp::OMPC_inclusive: 11957 C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt()); 11958 break; 11959 case llvm::omp::OMPC_exclusive: 11960 C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt()); 11961 break; 11962 case llvm::omp::OMPC_order: 11963 C = new (Context) OMPOrderClause(); 11964 break; 11965 case llvm::omp::OMPC_init: 11966 C = OMPInitClause::CreateEmpty(Context, Record.readInt()); 11967 break; 11968 case llvm::omp::OMPC_use: 11969 C = new (Context) OMPUseClause(); 11970 break; 11971 case llvm::omp::OMPC_destroy: 11972 C = new (Context) OMPDestroyClause(); 11973 break; 11974 case llvm::omp::OMPC_novariants: 11975 C = new (Context) OMPNovariantsClause(); 11976 break; 11977 case llvm::omp::OMPC_nocontext: 11978 C = new (Context) OMPNocontextClause(); 11979 break; 11980 case llvm::omp::OMPC_detach: 11981 C = new (Context) OMPDetachClause(); 11982 break; 11983 case llvm::omp::OMPC_uses_allocators: 11984 C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt()); 11985 break; 11986 case llvm::omp::OMPC_affinity: 11987 C = OMPAffinityClause::CreateEmpty(Context, Record.readInt()); 11988 break; 11989 case llvm::omp::OMPC_filter: 11990 C = new (Context) OMPFilterClause(); 11991 break; 11992 #define OMP_CLAUSE_NO_CLASS(Enum, Str) \ 11993 case llvm::omp::Enum: \ 11994 break; 11995 #include "llvm/Frontend/OpenMP/OMPKinds.def" 11996 default: 11997 break; 11998 } 11999 assert(C && "Unknown OMPClause type"); 12000 12001 Visit(C); 12002 C->setLocStart(Record.readSourceLocation()); 12003 C->setLocEnd(Record.readSourceLocation()); 12004 12005 return C; 12006 } 12007 12008 void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) { 12009 C->setPreInitStmt(Record.readSubStmt(), 12010 static_cast<OpenMPDirectiveKind>(Record.readInt())); 12011 } 12012 12013 void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) { 12014 VisitOMPClauseWithPreInit(C); 12015 C->setPostUpdateExpr(Record.readSubExpr()); 12016 } 12017 12018 void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) { 12019 VisitOMPClauseWithPreInit(C); 12020 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt())); 12021 C->setNameModifierLoc(Record.readSourceLocation()); 12022 C->setColonLoc(Record.readSourceLocation()); 12023 C->setCondition(Record.readSubExpr()); 12024 C->setLParenLoc(Record.readSourceLocation()); 12025 } 12026 12027 void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) { 12028 VisitOMPClauseWithPreInit(C); 12029 C->setCondition(Record.readSubExpr()); 12030 C->setLParenLoc(Record.readSourceLocation()); 12031 } 12032 12033 void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) { 12034 VisitOMPClauseWithPreInit(C); 12035 C->setNumThreads(Record.readSubExpr()); 12036 C->setLParenLoc(Record.readSourceLocation()); 12037 } 12038 12039 void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) { 12040 C->setSafelen(Record.readSubExpr()); 12041 C->setLParenLoc(Record.readSourceLocation()); 12042 } 12043 12044 void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) { 12045 C->setSimdlen(Record.readSubExpr()); 12046 C->setLParenLoc(Record.readSourceLocation()); 12047 } 12048 12049 void OMPClauseReader::VisitOMPSizesClause(OMPSizesClause *C) { 12050 for (Expr *&E : C->getSizesRefs()) 12051 E = Record.readSubExpr(); 12052 C->setLParenLoc(Record.readSourceLocation()); 12053 } 12054 12055 void OMPClauseReader::VisitOMPFullClause(OMPFullClause *C) {} 12056 12057 void OMPClauseReader::VisitOMPPartialClause(OMPPartialClause *C) { 12058 C->setFactor(Record.readSubExpr()); 12059 C->setLParenLoc(Record.readSourceLocation()); 12060 } 12061 12062 void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) { 12063 C->setAllocator(Record.readExpr()); 12064 C->setLParenLoc(Record.readSourceLocation()); 12065 } 12066 12067 void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) { 12068 C->setNumForLoops(Record.readSubExpr()); 12069 C->setLParenLoc(Record.readSourceLocation()); 12070 } 12071 12072 void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) { 12073 C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt())); 12074 C->setLParenLoc(Record.readSourceLocation()); 12075 C->setDefaultKindKwLoc(Record.readSourceLocation()); 12076 } 12077 12078 void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) { 12079 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt())); 12080 C->setLParenLoc(Record.readSourceLocation()); 12081 C->setProcBindKindKwLoc(Record.readSourceLocation()); 12082 } 12083 12084 void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) { 12085 VisitOMPClauseWithPreInit(C); 12086 C->setScheduleKind( 12087 static_cast<OpenMPScheduleClauseKind>(Record.readInt())); 12088 C->setFirstScheduleModifier( 12089 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 12090 C->setSecondScheduleModifier( 12091 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 12092 C->setChunkSize(Record.readSubExpr()); 12093 C->setLParenLoc(Record.readSourceLocation()); 12094 C->setFirstScheduleModifierLoc(Record.readSourceLocation()); 12095 C->setSecondScheduleModifierLoc(Record.readSourceLocation()); 12096 C->setScheduleKindLoc(Record.readSourceLocation()); 12097 C->setCommaLoc(Record.readSourceLocation()); 12098 } 12099 12100 void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) { 12101 C->setNumForLoops(Record.readSubExpr()); 12102 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 12103 C->setLoopNumIterations(I, Record.readSubExpr()); 12104 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 12105 C->setLoopCounter(I, Record.readSubExpr()); 12106 C->setLParenLoc(Record.readSourceLocation()); 12107 } 12108 12109 void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) { 12110 C->setEventHandler(Record.readSubExpr()); 12111 C->setLParenLoc(Record.readSourceLocation()); 12112 } 12113 12114 void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {} 12115 12116 void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {} 12117 12118 void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {} 12119 12120 void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {} 12121 12122 void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {} 12123 12124 void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) { 12125 if (C->isExtended()) { 12126 C->setLParenLoc(Record.readSourceLocation()); 12127 C->setArgumentLoc(Record.readSourceLocation()); 12128 C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>()); 12129 } 12130 } 12131 12132 void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {} 12133 12134 void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {} 12135 12136 void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {} 12137 12138 void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {} 12139 12140 void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {} 12141 12142 void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {} 12143 12144 void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {} 12145 12146 void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {} 12147 12148 void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {} 12149 12150 void OMPClauseReader::VisitOMPInitClause(OMPInitClause *C) { 12151 unsigned NumVars = C->varlist_size(); 12152 SmallVector<Expr *, 16> Vars; 12153 Vars.reserve(NumVars); 12154 for (unsigned I = 0; I != NumVars; ++I) 12155 Vars.push_back(Record.readSubExpr()); 12156 C->setVarRefs(Vars); 12157 C->setIsTarget(Record.readBool()); 12158 C->setIsTargetSync(Record.readBool()); 12159 C->setLParenLoc(Record.readSourceLocation()); 12160 C->setVarLoc(Record.readSourceLocation()); 12161 } 12162 12163 void OMPClauseReader::VisitOMPUseClause(OMPUseClause *C) { 12164 C->setInteropVar(Record.readSubExpr()); 12165 C->setLParenLoc(Record.readSourceLocation()); 12166 C->setVarLoc(Record.readSourceLocation()); 12167 } 12168 12169 void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *C) { 12170 C->setInteropVar(Record.readSubExpr()); 12171 C->setLParenLoc(Record.readSourceLocation()); 12172 C->setVarLoc(Record.readSourceLocation()); 12173 } 12174 12175 void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *C) { 12176 VisitOMPClauseWithPreInit(C); 12177 C->setCondition(Record.readSubExpr()); 12178 C->setLParenLoc(Record.readSourceLocation()); 12179 } 12180 12181 void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *C) { 12182 VisitOMPClauseWithPreInit(C); 12183 C->setCondition(Record.readSubExpr()); 12184 C->setLParenLoc(Record.readSourceLocation()); 12185 } 12186 12187 void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {} 12188 12189 void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause( 12190 OMPUnifiedSharedMemoryClause *) {} 12191 12192 void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {} 12193 12194 void 12195 OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) { 12196 } 12197 12198 void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause( 12199 OMPAtomicDefaultMemOrderClause *C) { 12200 C->setAtomicDefaultMemOrderKind( 12201 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt())); 12202 C->setLParenLoc(Record.readSourceLocation()); 12203 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation()); 12204 } 12205 12206 void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) { 12207 C->setLParenLoc(Record.readSourceLocation()); 12208 unsigned NumVars = C->varlist_size(); 12209 SmallVector<Expr *, 16> Vars; 12210 Vars.reserve(NumVars); 12211 for (unsigned i = 0; i != NumVars; ++i) 12212 Vars.push_back(Record.readSubExpr()); 12213 C->setVarRefs(Vars); 12214 Vars.clear(); 12215 for (unsigned i = 0; i != NumVars; ++i) 12216 Vars.push_back(Record.readSubExpr()); 12217 C->setPrivateCopies(Vars); 12218 } 12219 12220 void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) { 12221 VisitOMPClauseWithPreInit(C); 12222 C->setLParenLoc(Record.readSourceLocation()); 12223 unsigned NumVars = C->varlist_size(); 12224 SmallVector<Expr *, 16> Vars; 12225 Vars.reserve(NumVars); 12226 for (unsigned i = 0; i != NumVars; ++i) 12227 Vars.push_back(Record.readSubExpr()); 12228 C->setVarRefs(Vars); 12229 Vars.clear(); 12230 for (unsigned i = 0; i != NumVars; ++i) 12231 Vars.push_back(Record.readSubExpr()); 12232 C->setPrivateCopies(Vars); 12233 Vars.clear(); 12234 for (unsigned i = 0; i != NumVars; ++i) 12235 Vars.push_back(Record.readSubExpr()); 12236 C->setInits(Vars); 12237 } 12238 12239 void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) { 12240 VisitOMPClauseWithPostUpdate(C); 12241 C->setLParenLoc(Record.readSourceLocation()); 12242 C->setKind(Record.readEnum<OpenMPLastprivateModifier>()); 12243 C->setKindLoc(Record.readSourceLocation()); 12244 C->setColonLoc(Record.readSourceLocation()); 12245 unsigned NumVars = C->varlist_size(); 12246 SmallVector<Expr *, 16> Vars; 12247 Vars.reserve(NumVars); 12248 for (unsigned i = 0; i != NumVars; ++i) 12249 Vars.push_back(Record.readSubExpr()); 12250 C->setVarRefs(Vars); 12251 Vars.clear(); 12252 for (unsigned i = 0; i != NumVars; ++i) 12253 Vars.push_back(Record.readSubExpr()); 12254 C->setPrivateCopies(Vars); 12255 Vars.clear(); 12256 for (unsigned i = 0; i != NumVars; ++i) 12257 Vars.push_back(Record.readSubExpr()); 12258 C->setSourceExprs(Vars); 12259 Vars.clear(); 12260 for (unsigned i = 0; i != NumVars; ++i) 12261 Vars.push_back(Record.readSubExpr()); 12262 C->setDestinationExprs(Vars); 12263 Vars.clear(); 12264 for (unsigned i = 0; i != NumVars; ++i) 12265 Vars.push_back(Record.readSubExpr()); 12266 C->setAssignmentOps(Vars); 12267 } 12268 12269 void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) { 12270 C->setLParenLoc(Record.readSourceLocation()); 12271 unsigned NumVars = C->varlist_size(); 12272 SmallVector<Expr *, 16> Vars; 12273 Vars.reserve(NumVars); 12274 for (unsigned i = 0; i != NumVars; ++i) 12275 Vars.push_back(Record.readSubExpr()); 12276 C->setVarRefs(Vars); 12277 } 12278 12279 void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) { 12280 VisitOMPClauseWithPostUpdate(C); 12281 C->setLParenLoc(Record.readSourceLocation()); 12282 C->setModifierLoc(Record.readSourceLocation()); 12283 C->setColonLoc(Record.readSourceLocation()); 12284 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12285 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12286 C->setQualifierLoc(NNSL); 12287 C->setNameInfo(DNI); 12288 12289 unsigned NumVars = C->varlist_size(); 12290 SmallVector<Expr *, 16> Vars; 12291 Vars.reserve(NumVars); 12292 for (unsigned i = 0; i != NumVars; ++i) 12293 Vars.push_back(Record.readSubExpr()); 12294 C->setVarRefs(Vars); 12295 Vars.clear(); 12296 for (unsigned i = 0; i != NumVars; ++i) 12297 Vars.push_back(Record.readSubExpr()); 12298 C->setPrivates(Vars); 12299 Vars.clear(); 12300 for (unsigned i = 0; i != NumVars; ++i) 12301 Vars.push_back(Record.readSubExpr()); 12302 C->setLHSExprs(Vars); 12303 Vars.clear(); 12304 for (unsigned i = 0; i != NumVars; ++i) 12305 Vars.push_back(Record.readSubExpr()); 12306 C->setRHSExprs(Vars); 12307 Vars.clear(); 12308 for (unsigned i = 0; i != NumVars; ++i) 12309 Vars.push_back(Record.readSubExpr()); 12310 C->setReductionOps(Vars); 12311 if (C->getModifier() == OMPC_REDUCTION_inscan) { 12312 Vars.clear(); 12313 for (unsigned i = 0; i != NumVars; ++i) 12314 Vars.push_back(Record.readSubExpr()); 12315 C->setInscanCopyOps(Vars); 12316 Vars.clear(); 12317 for (unsigned i = 0; i != NumVars; ++i) 12318 Vars.push_back(Record.readSubExpr()); 12319 C->setInscanCopyArrayTemps(Vars); 12320 Vars.clear(); 12321 for (unsigned i = 0; i != NumVars; ++i) 12322 Vars.push_back(Record.readSubExpr()); 12323 C->setInscanCopyArrayElems(Vars); 12324 } 12325 } 12326 12327 void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) { 12328 VisitOMPClauseWithPostUpdate(C); 12329 C->setLParenLoc(Record.readSourceLocation()); 12330 C->setColonLoc(Record.readSourceLocation()); 12331 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12332 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12333 C->setQualifierLoc(NNSL); 12334 C->setNameInfo(DNI); 12335 12336 unsigned NumVars = C->varlist_size(); 12337 SmallVector<Expr *, 16> Vars; 12338 Vars.reserve(NumVars); 12339 for (unsigned I = 0; I != NumVars; ++I) 12340 Vars.push_back(Record.readSubExpr()); 12341 C->setVarRefs(Vars); 12342 Vars.clear(); 12343 for (unsigned I = 0; I != NumVars; ++I) 12344 Vars.push_back(Record.readSubExpr()); 12345 C->setPrivates(Vars); 12346 Vars.clear(); 12347 for (unsigned I = 0; I != NumVars; ++I) 12348 Vars.push_back(Record.readSubExpr()); 12349 C->setLHSExprs(Vars); 12350 Vars.clear(); 12351 for (unsigned I = 0; I != NumVars; ++I) 12352 Vars.push_back(Record.readSubExpr()); 12353 C->setRHSExprs(Vars); 12354 Vars.clear(); 12355 for (unsigned I = 0; I != NumVars; ++I) 12356 Vars.push_back(Record.readSubExpr()); 12357 C->setReductionOps(Vars); 12358 } 12359 12360 void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) { 12361 VisitOMPClauseWithPostUpdate(C); 12362 C->setLParenLoc(Record.readSourceLocation()); 12363 C->setColonLoc(Record.readSourceLocation()); 12364 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12365 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12366 C->setQualifierLoc(NNSL); 12367 C->setNameInfo(DNI); 12368 12369 unsigned NumVars = C->varlist_size(); 12370 SmallVector<Expr *, 16> Vars; 12371 Vars.reserve(NumVars); 12372 for (unsigned I = 0; I != NumVars; ++I) 12373 Vars.push_back(Record.readSubExpr()); 12374 C->setVarRefs(Vars); 12375 Vars.clear(); 12376 for (unsigned I = 0; I != NumVars; ++I) 12377 Vars.push_back(Record.readSubExpr()); 12378 C->setPrivates(Vars); 12379 Vars.clear(); 12380 for (unsigned I = 0; I != NumVars; ++I) 12381 Vars.push_back(Record.readSubExpr()); 12382 C->setLHSExprs(Vars); 12383 Vars.clear(); 12384 for (unsigned I = 0; I != NumVars; ++I) 12385 Vars.push_back(Record.readSubExpr()); 12386 C->setRHSExprs(Vars); 12387 Vars.clear(); 12388 for (unsigned I = 0; I != NumVars; ++I) 12389 Vars.push_back(Record.readSubExpr()); 12390 C->setReductionOps(Vars); 12391 Vars.clear(); 12392 for (unsigned I = 0; I != NumVars; ++I) 12393 Vars.push_back(Record.readSubExpr()); 12394 C->setTaskgroupDescriptors(Vars); 12395 } 12396 12397 void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) { 12398 VisitOMPClauseWithPostUpdate(C); 12399 C->setLParenLoc(Record.readSourceLocation()); 12400 C->setColonLoc(Record.readSourceLocation()); 12401 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt())); 12402 C->setModifierLoc(Record.readSourceLocation()); 12403 unsigned NumVars = C->varlist_size(); 12404 SmallVector<Expr *, 16> Vars; 12405 Vars.reserve(NumVars); 12406 for (unsigned i = 0; i != NumVars; ++i) 12407 Vars.push_back(Record.readSubExpr()); 12408 C->setVarRefs(Vars); 12409 Vars.clear(); 12410 for (unsigned i = 0; i != NumVars; ++i) 12411 Vars.push_back(Record.readSubExpr()); 12412 C->setPrivates(Vars); 12413 Vars.clear(); 12414 for (unsigned i = 0; i != NumVars; ++i) 12415 Vars.push_back(Record.readSubExpr()); 12416 C->setInits(Vars); 12417 Vars.clear(); 12418 for (unsigned i = 0; i != NumVars; ++i) 12419 Vars.push_back(Record.readSubExpr()); 12420 C->setUpdates(Vars); 12421 Vars.clear(); 12422 for (unsigned i = 0; i != NumVars; ++i) 12423 Vars.push_back(Record.readSubExpr()); 12424 C->setFinals(Vars); 12425 C->setStep(Record.readSubExpr()); 12426 C->setCalcStep(Record.readSubExpr()); 12427 Vars.clear(); 12428 for (unsigned I = 0; I != NumVars + 1; ++I) 12429 Vars.push_back(Record.readSubExpr()); 12430 C->setUsedExprs(Vars); 12431 } 12432 12433 void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) { 12434 C->setLParenLoc(Record.readSourceLocation()); 12435 C->setColonLoc(Record.readSourceLocation()); 12436 unsigned NumVars = C->varlist_size(); 12437 SmallVector<Expr *, 16> Vars; 12438 Vars.reserve(NumVars); 12439 for (unsigned i = 0; i != NumVars; ++i) 12440 Vars.push_back(Record.readSubExpr()); 12441 C->setVarRefs(Vars); 12442 C->setAlignment(Record.readSubExpr()); 12443 } 12444 12445 void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) { 12446 C->setLParenLoc(Record.readSourceLocation()); 12447 unsigned NumVars = C->varlist_size(); 12448 SmallVector<Expr *, 16> Exprs; 12449 Exprs.reserve(NumVars); 12450 for (unsigned i = 0; i != NumVars; ++i) 12451 Exprs.push_back(Record.readSubExpr()); 12452 C->setVarRefs(Exprs); 12453 Exprs.clear(); 12454 for (unsigned i = 0; i != NumVars; ++i) 12455 Exprs.push_back(Record.readSubExpr()); 12456 C->setSourceExprs(Exprs); 12457 Exprs.clear(); 12458 for (unsigned i = 0; i != NumVars; ++i) 12459 Exprs.push_back(Record.readSubExpr()); 12460 C->setDestinationExprs(Exprs); 12461 Exprs.clear(); 12462 for (unsigned i = 0; i != NumVars; ++i) 12463 Exprs.push_back(Record.readSubExpr()); 12464 C->setAssignmentOps(Exprs); 12465 } 12466 12467 void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) { 12468 C->setLParenLoc(Record.readSourceLocation()); 12469 unsigned NumVars = C->varlist_size(); 12470 SmallVector<Expr *, 16> Exprs; 12471 Exprs.reserve(NumVars); 12472 for (unsigned i = 0; i != NumVars; ++i) 12473 Exprs.push_back(Record.readSubExpr()); 12474 C->setVarRefs(Exprs); 12475 Exprs.clear(); 12476 for (unsigned i = 0; i != NumVars; ++i) 12477 Exprs.push_back(Record.readSubExpr()); 12478 C->setSourceExprs(Exprs); 12479 Exprs.clear(); 12480 for (unsigned i = 0; i != NumVars; ++i) 12481 Exprs.push_back(Record.readSubExpr()); 12482 C->setDestinationExprs(Exprs); 12483 Exprs.clear(); 12484 for (unsigned i = 0; i != NumVars; ++i) 12485 Exprs.push_back(Record.readSubExpr()); 12486 C->setAssignmentOps(Exprs); 12487 } 12488 12489 void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) { 12490 C->setLParenLoc(Record.readSourceLocation()); 12491 unsigned NumVars = C->varlist_size(); 12492 SmallVector<Expr *, 16> Vars; 12493 Vars.reserve(NumVars); 12494 for (unsigned i = 0; i != NumVars; ++i) 12495 Vars.push_back(Record.readSubExpr()); 12496 C->setVarRefs(Vars); 12497 } 12498 12499 void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) { 12500 C->setDepobj(Record.readSubExpr()); 12501 C->setLParenLoc(Record.readSourceLocation()); 12502 } 12503 12504 void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) { 12505 C->setLParenLoc(Record.readSourceLocation()); 12506 C->setModifier(Record.readSubExpr()); 12507 C->setDependencyKind( 12508 static_cast<OpenMPDependClauseKind>(Record.readInt())); 12509 C->setDependencyLoc(Record.readSourceLocation()); 12510 C->setColonLoc(Record.readSourceLocation()); 12511 unsigned NumVars = C->varlist_size(); 12512 SmallVector<Expr *, 16> Vars; 12513 Vars.reserve(NumVars); 12514 for (unsigned I = 0; I != NumVars; ++I) 12515 Vars.push_back(Record.readSubExpr()); 12516 C->setVarRefs(Vars); 12517 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I) 12518 C->setLoopData(I, Record.readSubExpr()); 12519 } 12520 12521 void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) { 12522 VisitOMPClauseWithPreInit(C); 12523 C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>()); 12524 C->setDevice(Record.readSubExpr()); 12525 C->setModifierLoc(Record.readSourceLocation()); 12526 C->setLParenLoc(Record.readSourceLocation()); 12527 } 12528 12529 void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) { 12530 C->setLParenLoc(Record.readSourceLocation()); 12531 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) { 12532 C->setMapTypeModifier( 12533 I, static_cast<OpenMPMapModifierKind>(Record.readInt())); 12534 C->setMapTypeModifierLoc(I, Record.readSourceLocation()); 12535 } 12536 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12537 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12538 C->setMapType( 12539 static_cast<OpenMPMapClauseKind>(Record.readInt())); 12540 C->setMapLoc(Record.readSourceLocation()); 12541 C->setColonLoc(Record.readSourceLocation()); 12542 auto NumVars = C->varlist_size(); 12543 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12544 auto TotalLists = C->getTotalComponentListNum(); 12545 auto TotalComponents = C->getTotalComponentsNum(); 12546 12547 SmallVector<Expr *, 16> Vars; 12548 Vars.reserve(NumVars); 12549 for (unsigned i = 0; i != NumVars; ++i) 12550 Vars.push_back(Record.readExpr()); 12551 C->setVarRefs(Vars); 12552 12553 SmallVector<Expr *, 16> UDMappers; 12554 UDMappers.reserve(NumVars); 12555 for (unsigned I = 0; I < NumVars; ++I) 12556 UDMappers.push_back(Record.readExpr()); 12557 C->setUDMapperRefs(UDMappers); 12558 12559 SmallVector<ValueDecl *, 16> Decls; 12560 Decls.reserve(UniqueDecls); 12561 for (unsigned i = 0; i < UniqueDecls; ++i) 12562 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12563 C->setUniqueDecls(Decls); 12564 12565 SmallVector<unsigned, 16> ListsPerDecl; 12566 ListsPerDecl.reserve(UniqueDecls); 12567 for (unsigned i = 0; i < UniqueDecls; ++i) 12568 ListsPerDecl.push_back(Record.readInt()); 12569 C->setDeclNumLists(ListsPerDecl); 12570 12571 SmallVector<unsigned, 32> ListSizes; 12572 ListSizes.reserve(TotalLists); 12573 for (unsigned i = 0; i < TotalLists; ++i) 12574 ListSizes.push_back(Record.readInt()); 12575 C->setComponentListSizes(ListSizes); 12576 12577 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12578 Components.reserve(TotalComponents); 12579 for (unsigned i = 0; i < TotalComponents; ++i) { 12580 Expr *AssociatedExprPr = Record.readExpr(); 12581 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12582 Components.emplace_back(AssociatedExprPr, AssociatedDecl, 12583 /*IsNonContiguous=*/false); 12584 } 12585 C->setComponents(Components, ListSizes); 12586 } 12587 12588 void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) { 12589 C->setLParenLoc(Record.readSourceLocation()); 12590 C->setColonLoc(Record.readSourceLocation()); 12591 C->setAllocator(Record.readSubExpr()); 12592 unsigned NumVars = C->varlist_size(); 12593 SmallVector<Expr *, 16> Vars; 12594 Vars.reserve(NumVars); 12595 for (unsigned i = 0; i != NumVars; ++i) 12596 Vars.push_back(Record.readSubExpr()); 12597 C->setVarRefs(Vars); 12598 } 12599 12600 void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) { 12601 VisitOMPClauseWithPreInit(C); 12602 C->setNumTeams(Record.readSubExpr()); 12603 C->setLParenLoc(Record.readSourceLocation()); 12604 } 12605 12606 void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) { 12607 VisitOMPClauseWithPreInit(C); 12608 C->setThreadLimit(Record.readSubExpr()); 12609 C->setLParenLoc(Record.readSourceLocation()); 12610 } 12611 12612 void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) { 12613 VisitOMPClauseWithPreInit(C); 12614 C->setPriority(Record.readSubExpr()); 12615 C->setLParenLoc(Record.readSourceLocation()); 12616 } 12617 12618 void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) { 12619 VisitOMPClauseWithPreInit(C); 12620 C->setGrainsize(Record.readSubExpr()); 12621 C->setLParenLoc(Record.readSourceLocation()); 12622 } 12623 12624 void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) { 12625 VisitOMPClauseWithPreInit(C); 12626 C->setNumTasks(Record.readSubExpr()); 12627 C->setLParenLoc(Record.readSourceLocation()); 12628 } 12629 12630 void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) { 12631 C->setHint(Record.readSubExpr()); 12632 C->setLParenLoc(Record.readSourceLocation()); 12633 } 12634 12635 void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) { 12636 VisitOMPClauseWithPreInit(C); 12637 C->setDistScheduleKind( 12638 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt())); 12639 C->setChunkSize(Record.readSubExpr()); 12640 C->setLParenLoc(Record.readSourceLocation()); 12641 C->setDistScheduleKindLoc(Record.readSourceLocation()); 12642 C->setCommaLoc(Record.readSourceLocation()); 12643 } 12644 12645 void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) { 12646 C->setDefaultmapKind( 12647 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt())); 12648 C->setDefaultmapModifier( 12649 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt())); 12650 C->setLParenLoc(Record.readSourceLocation()); 12651 C->setDefaultmapModifierLoc(Record.readSourceLocation()); 12652 C->setDefaultmapKindLoc(Record.readSourceLocation()); 12653 } 12654 12655 void OMPClauseReader::VisitOMPToClause(OMPToClause *C) { 12656 C->setLParenLoc(Record.readSourceLocation()); 12657 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) { 12658 C->setMotionModifier( 12659 I, static_cast<OpenMPMotionModifierKind>(Record.readInt())); 12660 C->setMotionModifierLoc(I, Record.readSourceLocation()); 12661 } 12662 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12663 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12664 C->setColonLoc(Record.readSourceLocation()); 12665 auto NumVars = C->varlist_size(); 12666 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12667 auto TotalLists = C->getTotalComponentListNum(); 12668 auto TotalComponents = C->getTotalComponentsNum(); 12669 12670 SmallVector<Expr *, 16> Vars; 12671 Vars.reserve(NumVars); 12672 for (unsigned i = 0; i != NumVars; ++i) 12673 Vars.push_back(Record.readSubExpr()); 12674 C->setVarRefs(Vars); 12675 12676 SmallVector<Expr *, 16> UDMappers; 12677 UDMappers.reserve(NumVars); 12678 for (unsigned I = 0; I < NumVars; ++I) 12679 UDMappers.push_back(Record.readSubExpr()); 12680 C->setUDMapperRefs(UDMappers); 12681 12682 SmallVector<ValueDecl *, 16> Decls; 12683 Decls.reserve(UniqueDecls); 12684 for (unsigned i = 0; i < UniqueDecls; ++i) 12685 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12686 C->setUniqueDecls(Decls); 12687 12688 SmallVector<unsigned, 16> ListsPerDecl; 12689 ListsPerDecl.reserve(UniqueDecls); 12690 for (unsigned i = 0; i < UniqueDecls; ++i) 12691 ListsPerDecl.push_back(Record.readInt()); 12692 C->setDeclNumLists(ListsPerDecl); 12693 12694 SmallVector<unsigned, 32> ListSizes; 12695 ListSizes.reserve(TotalLists); 12696 for (unsigned i = 0; i < TotalLists; ++i) 12697 ListSizes.push_back(Record.readInt()); 12698 C->setComponentListSizes(ListSizes); 12699 12700 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12701 Components.reserve(TotalComponents); 12702 for (unsigned i = 0; i < TotalComponents; ++i) { 12703 Expr *AssociatedExprPr = Record.readSubExpr(); 12704 bool IsNonContiguous = Record.readBool(); 12705 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12706 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous); 12707 } 12708 C->setComponents(Components, ListSizes); 12709 } 12710 12711 void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) { 12712 C->setLParenLoc(Record.readSourceLocation()); 12713 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) { 12714 C->setMotionModifier( 12715 I, static_cast<OpenMPMotionModifierKind>(Record.readInt())); 12716 C->setMotionModifierLoc(I, Record.readSourceLocation()); 12717 } 12718 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12719 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12720 C->setColonLoc(Record.readSourceLocation()); 12721 auto NumVars = C->varlist_size(); 12722 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12723 auto TotalLists = C->getTotalComponentListNum(); 12724 auto TotalComponents = C->getTotalComponentsNum(); 12725 12726 SmallVector<Expr *, 16> Vars; 12727 Vars.reserve(NumVars); 12728 for (unsigned i = 0; i != NumVars; ++i) 12729 Vars.push_back(Record.readSubExpr()); 12730 C->setVarRefs(Vars); 12731 12732 SmallVector<Expr *, 16> UDMappers; 12733 UDMappers.reserve(NumVars); 12734 for (unsigned I = 0; I < NumVars; ++I) 12735 UDMappers.push_back(Record.readSubExpr()); 12736 C->setUDMapperRefs(UDMappers); 12737 12738 SmallVector<ValueDecl *, 16> Decls; 12739 Decls.reserve(UniqueDecls); 12740 for (unsigned i = 0; i < UniqueDecls; ++i) 12741 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12742 C->setUniqueDecls(Decls); 12743 12744 SmallVector<unsigned, 16> ListsPerDecl; 12745 ListsPerDecl.reserve(UniqueDecls); 12746 for (unsigned i = 0; i < UniqueDecls; ++i) 12747 ListsPerDecl.push_back(Record.readInt()); 12748 C->setDeclNumLists(ListsPerDecl); 12749 12750 SmallVector<unsigned, 32> ListSizes; 12751 ListSizes.reserve(TotalLists); 12752 for (unsigned i = 0; i < TotalLists; ++i) 12753 ListSizes.push_back(Record.readInt()); 12754 C->setComponentListSizes(ListSizes); 12755 12756 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12757 Components.reserve(TotalComponents); 12758 for (unsigned i = 0; i < TotalComponents; ++i) { 12759 Expr *AssociatedExprPr = Record.readSubExpr(); 12760 bool IsNonContiguous = Record.readBool(); 12761 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12762 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous); 12763 } 12764 C->setComponents(Components, ListSizes); 12765 } 12766 12767 void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) { 12768 C->setLParenLoc(Record.readSourceLocation()); 12769 auto NumVars = C->varlist_size(); 12770 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12771 auto TotalLists = C->getTotalComponentListNum(); 12772 auto TotalComponents = C->getTotalComponentsNum(); 12773 12774 SmallVector<Expr *, 16> Vars; 12775 Vars.reserve(NumVars); 12776 for (unsigned i = 0; i != NumVars; ++i) 12777 Vars.push_back(Record.readSubExpr()); 12778 C->setVarRefs(Vars); 12779 Vars.clear(); 12780 for (unsigned i = 0; i != NumVars; ++i) 12781 Vars.push_back(Record.readSubExpr()); 12782 C->setPrivateCopies(Vars); 12783 Vars.clear(); 12784 for (unsigned i = 0; i != NumVars; ++i) 12785 Vars.push_back(Record.readSubExpr()); 12786 C->setInits(Vars); 12787 12788 SmallVector<ValueDecl *, 16> Decls; 12789 Decls.reserve(UniqueDecls); 12790 for (unsigned i = 0; i < UniqueDecls; ++i) 12791 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12792 C->setUniqueDecls(Decls); 12793 12794 SmallVector<unsigned, 16> ListsPerDecl; 12795 ListsPerDecl.reserve(UniqueDecls); 12796 for (unsigned i = 0; i < UniqueDecls; ++i) 12797 ListsPerDecl.push_back(Record.readInt()); 12798 C->setDeclNumLists(ListsPerDecl); 12799 12800 SmallVector<unsigned, 32> ListSizes; 12801 ListSizes.reserve(TotalLists); 12802 for (unsigned i = 0; i < TotalLists; ++i) 12803 ListSizes.push_back(Record.readInt()); 12804 C->setComponentListSizes(ListSizes); 12805 12806 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12807 Components.reserve(TotalComponents); 12808 for (unsigned i = 0; i < TotalComponents; ++i) { 12809 auto *AssociatedExprPr = Record.readSubExpr(); 12810 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12811 Components.emplace_back(AssociatedExprPr, AssociatedDecl, 12812 /*IsNonContiguous=*/false); 12813 } 12814 C->setComponents(Components, ListSizes); 12815 } 12816 12817 void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) { 12818 C->setLParenLoc(Record.readSourceLocation()); 12819 auto NumVars = C->varlist_size(); 12820 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12821 auto TotalLists = C->getTotalComponentListNum(); 12822 auto TotalComponents = C->getTotalComponentsNum(); 12823 12824 SmallVector<Expr *, 16> Vars; 12825 Vars.reserve(NumVars); 12826 for (unsigned i = 0; i != NumVars; ++i) 12827 Vars.push_back(Record.readSubExpr()); 12828 C->setVarRefs(Vars); 12829 12830 SmallVector<ValueDecl *, 16> Decls; 12831 Decls.reserve(UniqueDecls); 12832 for (unsigned i = 0; i < UniqueDecls; ++i) 12833 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12834 C->setUniqueDecls(Decls); 12835 12836 SmallVector<unsigned, 16> ListsPerDecl; 12837 ListsPerDecl.reserve(UniqueDecls); 12838 for (unsigned i = 0; i < UniqueDecls; ++i) 12839 ListsPerDecl.push_back(Record.readInt()); 12840 C->setDeclNumLists(ListsPerDecl); 12841 12842 SmallVector<unsigned, 32> ListSizes; 12843 ListSizes.reserve(TotalLists); 12844 for (unsigned i = 0; i < TotalLists; ++i) 12845 ListSizes.push_back(Record.readInt()); 12846 C->setComponentListSizes(ListSizes); 12847 12848 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12849 Components.reserve(TotalComponents); 12850 for (unsigned i = 0; i < TotalComponents; ++i) { 12851 Expr *AssociatedExpr = Record.readSubExpr(); 12852 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12853 Components.emplace_back(AssociatedExpr, AssociatedDecl, 12854 /*IsNonContiguous*/ false); 12855 } 12856 C->setComponents(Components, ListSizes); 12857 } 12858 12859 void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 12860 C->setLParenLoc(Record.readSourceLocation()); 12861 auto NumVars = C->varlist_size(); 12862 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12863 auto TotalLists = C->getTotalComponentListNum(); 12864 auto TotalComponents = C->getTotalComponentsNum(); 12865 12866 SmallVector<Expr *, 16> Vars; 12867 Vars.reserve(NumVars); 12868 for (unsigned i = 0; i != NumVars; ++i) 12869 Vars.push_back(Record.readSubExpr()); 12870 C->setVarRefs(Vars); 12871 Vars.clear(); 12872 12873 SmallVector<ValueDecl *, 16> Decls; 12874 Decls.reserve(UniqueDecls); 12875 for (unsigned i = 0; i < UniqueDecls; ++i) 12876 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12877 C->setUniqueDecls(Decls); 12878 12879 SmallVector<unsigned, 16> ListsPerDecl; 12880 ListsPerDecl.reserve(UniqueDecls); 12881 for (unsigned i = 0; i < UniqueDecls; ++i) 12882 ListsPerDecl.push_back(Record.readInt()); 12883 C->setDeclNumLists(ListsPerDecl); 12884 12885 SmallVector<unsigned, 32> ListSizes; 12886 ListSizes.reserve(TotalLists); 12887 for (unsigned i = 0; i < TotalLists; ++i) 12888 ListSizes.push_back(Record.readInt()); 12889 C->setComponentListSizes(ListSizes); 12890 12891 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12892 Components.reserve(TotalComponents); 12893 for (unsigned i = 0; i < TotalComponents; ++i) { 12894 Expr *AssociatedExpr = Record.readSubExpr(); 12895 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12896 Components.emplace_back(AssociatedExpr, AssociatedDecl, 12897 /*IsNonContiguous=*/false); 12898 } 12899 C->setComponents(Components, ListSizes); 12900 } 12901 12902 void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) { 12903 C->setLParenLoc(Record.readSourceLocation()); 12904 unsigned NumVars = C->varlist_size(); 12905 SmallVector<Expr *, 16> Vars; 12906 Vars.reserve(NumVars); 12907 for (unsigned i = 0; i != NumVars; ++i) 12908 Vars.push_back(Record.readSubExpr()); 12909 C->setVarRefs(Vars); 12910 Vars.clear(); 12911 Vars.reserve(NumVars); 12912 for (unsigned i = 0; i != NumVars; ++i) 12913 Vars.push_back(Record.readSubExpr()); 12914 C->setPrivateRefs(Vars); 12915 } 12916 12917 void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) { 12918 C->setLParenLoc(Record.readSourceLocation()); 12919 unsigned NumVars = C->varlist_size(); 12920 SmallVector<Expr *, 16> Vars; 12921 Vars.reserve(NumVars); 12922 for (unsigned i = 0; i != NumVars; ++i) 12923 Vars.push_back(Record.readSubExpr()); 12924 C->setVarRefs(Vars); 12925 } 12926 12927 void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) { 12928 C->setLParenLoc(Record.readSourceLocation()); 12929 unsigned NumVars = C->varlist_size(); 12930 SmallVector<Expr *, 16> Vars; 12931 Vars.reserve(NumVars); 12932 for (unsigned i = 0; i != NumVars; ++i) 12933 Vars.push_back(Record.readSubExpr()); 12934 C->setVarRefs(Vars); 12935 } 12936 12937 void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) { 12938 C->setLParenLoc(Record.readSourceLocation()); 12939 unsigned NumOfAllocators = C->getNumberOfAllocators(); 12940 SmallVector<OMPUsesAllocatorsClause::Data, 4> Data; 12941 Data.reserve(NumOfAllocators); 12942 for (unsigned I = 0; I != NumOfAllocators; ++I) { 12943 OMPUsesAllocatorsClause::Data &D = Data.emplace_back(); 12944 D.Allocator = Record.readSubExpr(); 12945 D.AllocatorTraits = Record.readSubExpr(); 12946 D.LParenLoc = Record.readSourceLocation(); 12947 D.RParenLoc = Record.readSourceLocation(); 12948 } 12949 C->setAllocatorsData(Data); 12950 } 12951 12952 void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) { 12953 C->setLParenLoc(Record.readSourceLocation()); 12954 C->setModifier(Record.readSubExpr()); 12955 C->setColonLoc(Record.readSourceLocation()); 12956 unsigned NumOfLocators = C->varlist_size(); 12957 SmallVector<Expr *, 4> Locators; 12958 Locators.reserve(NumOfLocators); 12959 for (unsigned I = 0; I != NumOfLocators; ++I) 12960 Locators.push_back(Record.readSubExpr()); 12961 C->setVarRefs(Locators); 12962 } 12963 12964 void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) { 12965 C->setKind(Record.readEnum<OpenMPOrderClauseKind>()); 12966 C->setLParenLoc(Record.readSourceLocation()); 12967 C->setKindKwLoc(Record.readSourceLocation()); 12968 } 12969 12970 void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *C) { 12971 VisitOMPClauseWithPreInit(C); 12972 C->setThreadID(Record.readSubExpr()); 12973 C->setLParenLoc(Record.readSourceLocation()); 12974 } 12975 12976 OMPTraitInfo *ASTRecordReader::readOMPTraitInfo() { 12977 OMPTraitInfo &TI = getContext().getNewOMPTraitInfo(); 12978 TI.Sets.resize(readUInt32()); 12979 for (auto &Set : TI.Sets) { 12980 Set.Kind = readEnum<llvm::omp::TraitSet>(); 12981 Set.Selectors.resize(readUInt32()); 12982 for (auto &Selector : Set.Selectors) { 12983 Selector.Kind = readEnum<llvm::omp::TraitSelector>(); 12984 Selector.ScoreOrCondition = nullptr; 12985 if (readBool()) 12986 Selector.ScoreOrCondition = readExprRef(); 12987 Selector.Properties.resize(readUInt32()); 12988 for (auto &Property : Selector.Properties) 12989 Property.Kind = readEnum<llvm::omp::TraitProperty>(); 12990 } 12991 } 12992 return &TI; 12993 } 12994 12995 void ASTRecordReader::readOMPChildren(OMPChildren *Data) { 12996 if (!Data) 12997 return; 12998 if (Reader->ReadingKind == ASTReader::Read_Stmt) { 12999 // Skip NumClauses, NumChildren and HasAssociatedStmt fields. 13000 skipInts(3); 13001 } 13002 SmallVector<OMPClause *, 4> Clauses(Data->getNumClauses()); 13003 for (unsigned I = 0, E = Data->getNumClauses(); I < E; ++I) 13004 Clauses[I] = readOMPClause(); 13005 Data->setClauses(Clauses); 13006 if (Data->hasAssociatedStmt()) 13007 Data->setAssociatedStmt(readStmt()); 13008 for (unsigned I = 0, E = Data->getNumChildren(); I < E; ++I) 13009 Data->getChildren()[I] = readStmt(); 13010 } 13011