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/MemoryBuffer.h" 118 #include "llvm/Support/Path.h" 119 #include "llvm/Support/SaveAndRestore.h" 120 #include "llvm/Support/Timer.h" 121 #include "llvm/Support/VersionTuple.h" 122 #include "llvm/Support/raw_ostream.h" 123 #include <algorithm> 124 #include <cassert> 125 #include <cstddef> 126 #include <cstdint> 127 #include <cstdio> 128 #include <ctime> 129 #include <iterator> 130 #include <limits> 131 #include <map> 132 #include <memory> 133 #include <string> 134 #include <system_error> 135 #include <tuple> 136 #include <utility> 137 #include <vector> 138 139 using namespace clang; 140 using namespace clang::serialization; 141 using namespace clang::serialization::reader; 142 using llvm::BitstreamCursor; 143 using llvm::RoundingMode; 144 145 //===----------------------------------------------------------------------===// 146 // ChainedASTReaderListener implementation 147 //===----------------------------------------------------------------------===// 148 149 bool 150 ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) { 151 return First->ReadFullVersionInformation(FullVersion) || 152 Second->ReadFullVersionInformation(FullVersion); 153 } 154 155 void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) { 156 First->ReadModuleName(ModuleName); 157 Second->ReadModuleName(ModuleName); 158 } 159 160 void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) { 161 First->ReadModuleMapFile(ModuleMapPath); 162 Second->ReadModuleMapFile(ModuleMapPath); 163 } 164 165 bool 166 ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts, 167 bool Complain, 168 bool AllowCompatibleDifferences) { 169 return First->ReadLanguageOptions(LangOpts, Complain, 170 AllowCompatibleDifferences) || 171 Second->ReadLanguageOptions(LangOpts, Complain, 172 AllowCompatibleDifferences); 173 } 174 175 bool ChainedASTReaderListener::ReadTargetOptions( 176 const TargetOptions &TargetOpts, bool Complain, 177 bool AllowCompatibleDifferences) { 178 return First->ReadTargetOptions(TargetOpts, Complain, 179 AllowCompatibleDifferences) || 180 Second->ReadTargetOptions(TargetOpts, Complain, 181 AllowCompatibleDifferences); 182 } 183 184 bool ChainedASTReaderListener::ReadDiagnosticOptions( 185 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 186 return First->ReadDiagnosticOptions(DiagOpts, Complain) || 187 Second->ReadDiagnosticOptions(DiagOpts, Complain); 188 } 189 190 bool 191 ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts, 192 bool Complain) { 193 return First->ReadFileSystemOptions(FSOpts, Complain) || 194 Second->ReadFileSystemOptions(FSOpts, Complain); 195 } 196 197 bool ChainedASTReaderListener::ReadHeaderSearchOptions( 198 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath, 199 bool Complain) { 200 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 201 Complain) || 202 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 203 Complain); 204 } 205 206 bool ChainedASTReaderListener::ReadPreprocessorOptions( 207 const PreprocessorOptions &PPOpts, bool Complain, 208 std::string &SuggestedPredefines) { 209 return First->ReadPreprocessorOptions(PPOpts, Complain, 210 SuggestedPredefines) || 211 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines); 212 } 213 214 void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M, 215 unsigned Value) { 216 First->ReadCounter(M, Value); 217 Second->ReadCounter(M, Value); 218 } 219 220 bool ChainedASTReaderListener::needsInputFileVisitation() { 221 return First->needsInputFileVisitation() || 222 Second->needsInputFileVisitation(); 223 } 224 225 bool ChainedASTReaderListener::needsSystemInputFileVisitation() { 226 return First->needsSystemInputFileVisitation() || 227 Second->needsSystemInputFileVisitation(); 228 } 229 230 void ChainedASTReaderListener::visitModuleFile(StringRef Filename, 231 ModuleKind Kind) { 232 First->visitModuleFile(Filename, Kind); 233 Second->visitModuleFile(Filename, Kind); 234 } 235 236 bool ChainedASTReaderListener::visitInputFile(StringRef Filename, 237 bool isSystem, 238 bool isOverridden, 239 bool isExplicitModule) { 240 bool Continue = false; 241 if (First->needsInputFileVisitation() && 242 (!isSystem || First->needsSystemInputFileVisitation())) 243 Continue |= First->visitInputFile(Filename, isSystem, isOverridden, 244 isExplicitModule); 245 if (Second->needsInputFileVisitation() && 246 (!isSystem || Second->needsSystemInputFileVisitation())) 247 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden, 248 isExplicitModule); 249 return Continue; 250 } 251 252 void ChainedASTReaderListener::readModuleFileExtension( 253 const ModuleFileExtensionMetadata &Metadata) { 254 First->readModuleFileExtension(Metadata); 255 Second->readModuleFileExtension(Metadata); 256 } 257 258 //===----------------------------------------------------------------------===// 259 // PCH validator implementation 260 //===----------------------------------------------------------------------===// 261 262 ASTReaderListener::~ASTReaderListener() = default; 263 264 /// Compare the given set of language options against an existing set of 265 /// language options. 266 /// 267 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 268 /// \param AllowCompatibleDifferences If true, differences between compatible 269 /// language options will be permitted. 270 /// 271 /// \returns true if the languagae options mis-match, false otherwise. 272 static bool checkLanguageOptions(const LangOptions &LangOpts, 273 const LangOptions &ExistingLangOpts, 274 DiagnosticsEngine *Diags, 275 bool AllowCompatibleDifferences = true) { 276 #define LANGOPT(Name, Bits, Default, Description) \ 277 if (ExistingLangOpts.Name != LangOpts.Name) { \ 278 if (Diags) \ 279 Diags->Report(diag::err_pch_langopt_mismatch) \ 280 << Description << LangOpts.Name << ExistingLangOpts.Name; \ 281 return true; \ 282 } 283 284 #define VALUE_LANGOPT(Name, Bits, Default, Description) \ 285 if (ExistingLangOpts.Name != LangOpts.Name) { \ 286 if (Diags) \ 287 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 288 << Description; \ 289 return true; \ 290 } 291 292 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 293 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ 294 if (Diags) \ 295 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 296 << Description; \ 297 return true; \ 298 } 299 300 #define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \ 301 if (!AllowCompatibleDifferences) \ 302 LANGOPT(Name, Bits, Default, Description) 303 304 #define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \ 305 if (!AllowCompatibleDifferences) \ 306 ENUM_LANGOPT(Name, Bits, Default, Description) 307 308 #define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \ 309 if (!AllowCompatibleDifferences) \ 310 VALUE_LANGOPT(Name, Bits, Default, Description) 311 312 #define BENIGN_LANGOPT(Name, Bits, Default, Description) 313 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) 314 #define BENIGN_VALUE_LANGOPT(Name, Type, Bits, Default, Description) 315 #include "clang/Basic/LangOptions.def" 316 317 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) { 318 if (Diags) 319 Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features"; 320 return true; 321 } 322 323 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) { 324 if (Diags) 325 Diags->Report(diag::err_pch_langopt_value_mismatch) 326 << "target Objective-C runtime"; 327 return true; 328 } 329 330 if (ExistingLangOpts.CommentOpts.BlockCommandNames != 331 LangOpts.CommentOpts.BlockCommandNames) { 332 if (Diags) 333 Diags->Report(diag::err_pch_langopt_value_mismatch) 334 << "block command names"; 335 return true; 336 } 337 338 // Sanitizer feature mismatches are treated as compatible differences. If 339 // compatible differences aren't allowed, we still only want to check for 340 // mismatches of non-modular sanitizers (the only ones which can affect AST 341 // generation). 342 if (!AllowCompatibleDifferences) { 343 SanitizerMask ModularSanitizers = getPPTransparentSanitizers(); 344 SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize; 345 SanitizerSet ImportedSanitizers = LangOpts.Sanitize; 346 ExistingSanitizers.clear(ModularSanitizers); 347 ImportedSanitizers.clear(ModularSanitizers); 348 if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) { 349 const std::string Flag = "-fsanitize="; 350 if (Diags) { 351 #define SANITIZER(NAME, ID) \ 352 { \ 353 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \ 354 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \ 355 if (InExistingModule != InImportedModule) \ 356 Diags->Report(diag::err_pch_targetopt_feature_mismatch) \ 357 << InExistingModule << (Flag + NAME); \ 358 } 359 #include "clang/Basic/Sanitizers.def" 360 } 361 return true; 362 } 363 } 364 365 return false; 366 } 367 368 /// Compare the given set of target options against an existing set of 369 /// target options. 370 /// 371 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 372 /// 373 /// \returns true if the target options mis-match, false otherwise. 374 static bool checkTargetOptions(const TargetOptions &TargetOpts, 375 const TargetOptions &ExistingTargetOpts, 376 DiagnosticsEngine *Diags, 377 bool AllowCompatibleDifferences = true) { 378 #define CHECK_TARGET_OPT(Field, Name) \ 379 if (TargetOpts.Field != ExistingTargetOpts.Field) { \ 380 if (Diags) \ 381 Diags->Report(diag::err_pch_targetopt_mismatch) \ 382 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \ 383 return true; \ 384 } 385 386 // The triple and ABI must match exactly. 387 CHECK_TARGET_OPT(Triple, "target"); 388 CHECK_TARGET_OPT(ABI, "target ABI"); 389 390 // We can tolerate different CPUs in many cases, notably when one CPU 391 // supports a strict superset of another. When allowing compatible 392 // differences skip this check. 393 if (!AllowCompatibleDifferences) 394 CHECK_TARGET_OPT(CPU, "target CPU"); 395 396 #undef CHECK_TARGET_OPT 397 398 // Compare feature sets. 399 SmallVector<StringRef, 4> ExistingFeatures( 400 ExistingTargetOpts.FeaturesAsWritten.begin(), 401 ExistingTargetOpts.FeaturesAsWritten.end()); 402 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(), 403 TargetOpts.FeaturesAsWritten.end()); 404 llvm::sort(ExistingFeatures); 405 llvm::sort(ReadFeatures); 406 407 // We compute the set difference in both directions explicitly so that we can 408 // diagnose the differences differently. 409 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures; 410 std::set_difference( 411 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(), 412 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures)); 413 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(), 414 ExistingFeatures.begin(), ExistingFeatures.end(), 415 std::back_inserter(UnmatchedReadFeatures)); 416 417 // If we are allowing compatible differences and the read feature set is 418 // a strict subset of the existing feature set, there is nothing to diagnose. 419 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty()) 420 return false; 421 422 if (Diags) { 423 for (StringRef Feature : UnmatchedReadFeatures) 424 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 425 << /* is-existing-feature */ false << Feature; 426 for (StringRef Feature : UnmatchedExistingFeatures) 427 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 428 << /* is-existing-feature */ true << Feature; 429 } 430 431 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty(); 432 } 433 434 bool 435 PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts, 436 bool Complain, 437 bool AllowCompatibleDifferences) { 438 const LangOptions &ExistingLangOpts = PP.getLangOpts(); 439 return checkLanguageOptions(LangOpts, ExistingLangOpts, 440 Complain ? &Reader.Diags : nullptr, 441 AllowCompatibleDifferences); 442 } 443 444 bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts, 445 bool Complain, 446 bool AllowCompatibleDifferences) { 447 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts(); 448 return checkTargetOptions(TargetOpts, ExistingTargetOpts, 449 Complain ? &Reader.Diags : nullptr, 450 AllowCompatibleDifferences); 451 } 452 453 namespace { 454 455 using MacroDefinitionsMap = 456 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>; 457 using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>; 458 459 } // namespace 460 461 static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, 462 DiagnosticsEngine &Diags, 463 bool Complain) { 464 using Level = DiagnosticsEngine::Level; 465 466 // Check current mappings for new -Werror mappings, and the stored mappings 467 // for cases that were explicitly mapped to *not* be errors that are now 468 // errors because of options like -Werror. 469 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags }; 470 471 for (DiagnosticsEngine *MappingSource : MappingSources) { 472 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) { 473 diag::kind DiagID = DiagIDMappingPair.first; 474 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation()); 475 if (CurLevel < DiagnosticsEngine::Error) 476 continue; // not significant 477 Level StoredLevel = 478 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation()); 479 if (StoredLevel < DiagnosticsEngine::Error) { 480 if (Complain) 481 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" + 482 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str(); 483 return true; 484 } 485 } 486 } 487 488 return false; 489 } 490 491 static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) { 492 diag::Severity Ext = Diags.getExtensionHandlingBehavior(); 493 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors()) 494 return true; 495 return Ext >= diag::Severity::Error; 496 } 497 498 static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, 499 DiagnosticsEngine &Diags, 500 bool IsSystem, bool Complain) { 501 // Top-level options 502 if (IsSystem) { 503 if (Diags.getSuppressSystemWarnings()) 504 return false; 505 // If -Wsystem-headers was not enabled before, be conservative 506 if (StoredDiags.getSuppressSystemWarnings()) { 507 if (Complain) 508 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers"; 509 return true; 510 } 511 } 512 513 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) { 514 if (Complain) 515 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror"; 516 return true; 517 } 518 519 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() && 520 !StoredDiags.getEnableAllWarnings()) { 521 if (Complain) 522 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror"; 523 return true; 524 } 525 526 if (isExtHandlingFromDiagsError(Diags) && 527 !isExtHandlingFromDiagsError(StoredDiags)) { 528 if (Complain) 529 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors"; 530 return true; 531 } 532 533 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain); 534 } 535 536 /// Return the top import module if it is implicit, nullptr otherwise. 537 static Module *getTopImportImplicitModule(ModuleManager &ModuleMgr, 538 Preprocessor &PP) { 539 // If the original import came from a file explicitly generated by the user, 540 // don't check the diagnostic mappings. 541 // FIXME: currently this is approximated by checking whether this is not a 542 // module import of an implicitly-loaded module file. 543 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in 544 // the transitive closure of its imports, since unrelated modules cannot be 545 // imported until after this module finishes validation. 546 ModuleFile *TopImport = &*ModuleMgr.rbegin(); 547 while (!TopImport->ImportedBy.empty()) 548 TopImport = TopImport->ImportedBy[0]; 549 if (TopImport->Kind != MK_ImplicitModule) 550 return nullptr; 551 552 StringRef ModuleName = TopImport->ModuleName; 553 assert(!ModuleName.empty() && "diagnostic options read before module name"); 554 555 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName); 556 assert(M && "missing module"); 557 return M; 558 } 559 560 bool PCHValidator::ReadDiagnosticOptions( 561 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 562 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics(); 563 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs()); 564 IntrusiveRefCntPtr<DiagnosticsEngine> Diags( 565 new DiagnosticsEngine(DiagIDs, DiagOpts.get())); 566 // This should never fail, because we would have processed these options 567 // before writing them to an ASTFile. 568 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false); 569 570 ModuleManager &ModuleMgr = Reader.getModuleManager(); 571 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then"); 572 573 Module *TopM = getTopImportImplicitModule(ModuleMgr, PP); 574 if (!TopM) 575 return false; 576 577 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that 578 // contains the union of their flags. 579 return checkDiagnosticMappings(*Diags, ExistingDiags, TopM->IsSystem, 580 Complain); 581 } 582 583 /// Collect the macro definitions provided by the given preprocessor 584 /// options. 585 static void 586 collectMacroDefinitions(const PreprocessorOptions &PPOpts, 587 MacroDefinitionsMap &Macros, 588 SmallVectorImpl<StringRef> *MacroNames = nullptr) { 589 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) { 590 StringRef Macro = PPOpts.Macros[I].first; 591 bool IsUndef = PPOpts.Macros[I].second; 592 593 std::pair<StringRef, StringRef> MacroPair = Macro.split('='); 594 StringRef MacroName = MacroPair.first; 595 StringRef MacroBody = MacroPair.second; 596 597 // For an #undef'd macro, we only care about the name. 598 if (IsUndef) { 599 if (MacroNames && !Macros.count(MacroName)) 600 MacroNames->push_back(MacroName); 601 602 Macros[MacroName] = std::make_pair("", true); 603 continue; 604 } 605 606 // For a #define'd macro, figure out the actual definition. 607 if (MacroName.size() == Macro.size()) 608 MacroBody = "1"; 609 else { 610 // Note: GCC drops anything following an end-of-line character. 611 StringRef::size_type End = MacroBody.find_first_of("\n\r"); 612 MacroBody = MacroBody.substr(0, End); 613 } 614 615 if (MacroNames && !Macros.count(MacroName)) 616 MacroNames->push_back(MacroName); 617 Macros[MacroName] = std::make_pair(MacroBody, false); 618 } 619 } 620 621 /// Check the preprocessor options deserialized from the control block 622 /// against the preprocessor options in an existing preprocessor. 623 /// 624 /// \param Diags If non-null, produce diagnostics for any mismatches incurred. 625 /// \param Validate If true, validate preprocessor options. If false, allow 626 /// macros defined by \p ExistingPPOpts to override those defined by 627 /// \p PPOpts in SuggestedPredefines. 628 static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, 629 const PreprocessorOptions &ExistingPPOpts, 630 DiagnosticsEngine *Diags, 631 FileManager &FileMgr, 632 std::string &SuggestedPredefines, 633 const LangOptions &LangOpts, 634 bool Validate = true) { 635 // Check macro definitions. 636 MacroDefinitionsMap ASTFileMacros; 637 collectMacroDefinitions(PPOpts, ASTFileMacros); 638 MacroDefinitionsMap ExistingMacros; 639 SmallVector<StringRef, 4> ExistingMacroNames; 640 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames); 641 642 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) { 643 // Dig out the macro definition in the existing preprocessor options. 644 StringRef MacroName = ExistingMacroNames[I]; 645 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName]; 646 647 // Check whether we know anything about this macro name or not. 648 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known = 649 ASTFileMacros.find(MacroName); 650 if (!Validate || Known == ASTFileMacros.end()) { 651 // FIXME: Check whether this identifier was referenced anywhere in the 652 // AST file. If so, we should reject the AST file. Unfortunately, this 653 // information isn't in the control block. What shall we do about it? 654 655 if (Existing.second) { 656 SuggestedPredefines += "#undef "; 657 SuggestedPredefines += MacroName.str(); 658 SuggestedPredefines += '\n'; 659 } else { 660 SuggestedPredefines += "#define "; 661 SuggestedPredefines += MacroName.str(); 662 SuggestedPredefines += ' '; 663 SuggestedPredefines += Existing.first.str(); 664 SuggestedPredefines += '\n'; 665 } 666 continue; 667 } 668 669 // If the macro was defined in one but undef'd in the other, we have a 670 // conflict. 671 if (Existing.second != Known->second.second) { 672 if (Diags) { 673 Diags->Report(diag::err_pch_macro_def_undef) 674 << MacroName << Known->second.second; 675 } 676 return true; 677 } 678 679 // If the macro was #undef'd in both, or if the macro bodies are identical, 680 // it's fine. 681 if (Existing.second || Existing.first == Known->second.first) 682 continue; 683 684 // The macro bodies differ; complain. 685 if (Diags) { 686 Diags->Report(diag::err_pch_macro_def_conflict) 687 << MacroName << Known->second.first << Existing.first; 688 } 689 return true; 690 } 691 692 // Check whether we're using predefines. 693 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines && Validate) { 694 if (Diags) { 695 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines; 696 } 697 return true; 698 } 699 700 // Detailed record is important since it is used for the module cache hash. 701 if (LangOpts.Modules && 702 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord && Validate) { 703 if (Diags) { 704 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord; 705 } 706 return true; 707 } 708 709 // Compute the #include and #include_macros lines we need. 710 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) { 711 StringRef File = ExistingPPOpts.Includes[I]; 712 713 if (!ExistingPPOpts.ImplicitPCHInclude.empty() && 714 !ExistingPPOpts.PCHThroughHeader.empty()) { 715 // In case the through header is an include, we must add all the includes 716 // to the predefines so the start point can be determined. 717 SuggestedPredefines += "#include \""; 718 SuggestedPredefines += File; 719 SuggestedPredefines += "\"\n"; 720 continue; 721 } 722 723 if (File == ExistingPPOpts.ImplicitPCHInclude) 724 continue; 725 726 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File) 727 != PPOpts.Includes.end()) 728 continue; 729 730 SuggestedPredefines += "#include \""; 731 SuggestedPredefines += File; 732 SuggestedPredefines += "\"\n"; 733 } 734 735 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) { 736 StringRef File = ExistingPPOpts.MacroIncludes[I]; 737 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(), 738 File) 739 != PPOpts.MacroIncludes.end()) 740 continue; 741 742 SuggestedPredefines += "#__include_macros \""; 743 SuggestedPredefines += File; 744 SuggestedPredefines += "\"\n##\n"; 745 } 746 747 return false; 748 } 749 750 bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 751 bool Complain, 752 std::string &SuggestedPredefines) { 753 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts(); 754 755 return checkPreprocessorOptions(PPOpts, ExistingPPOpts, 756 Complain? &Reader.Diags : nullptr, 757 PP.getFileManager(), 758 SuggestedPredefines, 759 PP.getLangOpts()); 760 } 761 762 bool SimpleASTReaderListener::ReadPreprocessorOptions( 763 const PreprocessorOptions &PPOpts, 764 bool Complain, 765 std::string &SuggestedPredefines) { 766 return checkPreprocessorOptions(PPOpts, 767 PP.getPreprocessorOpts(), 768 nullptr, 769 PP.getFileManager(), 770 SuggestedPredefines, 771 PP.getLangOpts(), 772 false); 773 } 774 775 /// Check the header search options deserialized from the control block 776 /// against the header search options in an existing preprocessor. 777 /// 778 /// \param Diags If non-null, produce diagnostics for any mismatches incurred. 779 static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 780 StringRef SpecificModuleCachePath, 781 StringRef ExistingModuleCachePath, 782 DiagnosticsEngine *Diags, 783 const LangOptions &LangOpts) { 784 if (LangOpts.Modules) { 785 if (SpecificModuleCachePath != ExistingModuleCachePath) { 786 if (Diags) 787 Diags->Report(diag::err_pch_modulecache_mismatch) 788 << SpecificModuleCachePath << ExistingModuleCachePath; 789 return true; 790 } 791 } 792 793 return false; 794 } 795 796 bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 797 StringRef SpecificModuleCachePath, 798 bool Complain) { 799 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 800 PP.getHeaderSearchInfo().getModuleCachePath(), 801 Complain ? &Reader.Diags : nullptr, 802 PP.getLangOpts()); 803 } 804 805 void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) { 806 PP.setCounterValue(Value); 807 } 808 809 //===----------------------------------------------------------------------===// 810 // AST reader implementation 811 //===----------------------------------------------------------------------===// 812 813 void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener, 814 bool TakeOwnership) { 815 DeserializationListener = Listener; 816 OwnsDeserializationListener = TakeOwnership; 817 } 818 819 unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) { 820 return serialization::ComputeHash(Sel); 821 } 822 823 std::pair<unsigned, unsigned> 824 ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) { 825 using namespace llvm::support; 826 827 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d); 828 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d); 829 return std::make_pair(KeyLen, DataLen); 830 } 831 832 ASTSelectorLookupTrait::internal_key_type 833 ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) { 834 using namespace llvm::support; 835 836 SelectorTable &SelTable = Reader.getContext().Selectors; 837 unsigned N = endian::readNext<uint16_t, little, unaligned>(d); 838 IdentifierInfo *FirstII = Reader.getLocalIdentifier( 839 F, endian::readNext<uint32_t, little, unaligned>(d)); 840 if (N == 0) 841 return SelTable.getNullarySelector(FirstII); 842 else if (N == 1) 843 return SelTable.getUnarySelector(FirstII); 844 845 SmallVector<IdentifierInfo *, 16> Args; 846 Args.push_back(FirstII); 847 for (unsigned I = 1; I != N; ++I) 848 Args.push_back(Reader.getLocalIdentifier( 849 F, endian::readNext<uint32_t, little, unaligned>(d))); 850 851 return SelTable.getSelector(N, Args.data()); 852 } 853 854 ASTSelectorLookupTrait::data_type 855 ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d, 856 unsigned DataLen) { 857 using namespace llvm::support; 858 859 data_type Result; 860 861 Result.ID = Reader.getGlobalSelectorID( 862 F, endian::readNext<uint32_t, little, unaligned>(d)); 863 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d); 864 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d); 865 Result.InstanceBits = FullInstanceBits & 0x3; 866 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1; 867 Result.FactoryBits = FullFactoryBits & 0x3; 868 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1; 869 unsigned NumInstanceMethods = FullInstanceBits >> 3; 870 unsigned NumFactoryMethods = FullFactoryBits >> 3; 871 872 // Load instance methods 873 for (unsigned I = 0; I != NumInstanceMethods; ++I) { 874 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 875 F, endian::readNext<uint32_t, little, unaligned>(d))) 876 Result.Instance.push_back(Method); 877 } 878 879 // Load factory methods 880 for (unsigned I = 0; I != NumFactoryMethods; ++I) { 881 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 882 F, endian::readNext<uint32_t, little, unaligned>(d))) 883 Result.Factory.push_back(Method); 884 } 885 886 return Result; 887 } 888 889 unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) { 890 return llvm::djbHash(a); 891 } 892 893 std::pair<unsigned, unsigned> 894 ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) { 895 using namespace llvm::support; 896 897 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d); 898 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d); 899 return std::make_pair(KeyLen, DataLen); 900 } 901 902 ASTIdentifierLookupTraitBase::internal_key_type 903 ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) { 904 assert(n >= 2 && d[n-1] == '\0'); 905 return StringRef((const char*) d, n-1); 906 } 907 908 /// Whether the given identifier is "interesting". 909 static bool isInterestingIdentifier(ASTReader &Reader, IdentifierInfo &II, 910 bool IsModule) { 911 return II.hadMacroDefinition() || 912 II.isPoisoned() || 913 (IsModule ? II.hasRevertedBuiltin() : II.getObjCOrBuiltinID()) || 914 II.hasRevertedTokenIDToIdentifier() || 915 (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) && 916 II.getFETokenInfo()); 917 } 918 919 static bool readBit(unsigned &Bits) { 920 bool Value = Bits & 0x1; 921 Bits >>= 1; 922 return Value; 923 } 924 925 IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) { 926 using namespace llvm::support; 927 928 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 929 return Reader.getGlobalIdentifierID(F, RawID >> 1); 930 } 931 932 static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II) { 933 if (!II.isFromAST()) { 934 II.setIsFromAST(); 935 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr; 936 if (isInterestingIdentifier(Reader, II, IsModule)) 937 II.setChangedSinceDeserialization(); 938 } 939 } 940 941 IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, 942 const unsigned char* d, 943 unsigned DataLen) { 944 using namespace llvm::support; 945 946 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 947 bool IsInteresting = RawID & 0x01; 948 949 // Wipe out the "is interesting" bit. 950 RawID = RawID >> 1; 951 952 // Build the IdentifierInfo and link the identifier ID with it. 953 IdentifierInfo *II = KnownII; 954 if (!II) { 955 II = &Reader.getIdentifierTable().getOwn(k); 956 KnownII = II; 957 } 958 markIdentifierFromAST(Reader, *II); 959 Reader.markIdentifierUpToDate(II); 960 961 IdentID ID = Reader.getGlobalIdentifierID(F, RawID); 962 if (!IsInteresting) { 963 // For uninteresting identifiers, there's nothing else to do. Just notify 964 // the reader that we've finished loading this identifier. 965 Reader.SetIdentifierInfo(ID, II); 966 return II; 967 } 968 969 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d); 970 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d); 971 bool CPlusPlusOperatorKeyword = readBit(Bits); 972 bool HasRevertedTokenIDToIdentifier = readBit(Bits); 973 bool HasRevertedBuiltin = readBit(Bits); 974 bool Poisoned = readBit(Bits); 975 bool ExtensionToken = readBit(Bits); 976 bool HadMacroDefinition = readBit(Bits); 977 978 assert(Bits == 0 && "Extra bits in the identifier?"); 979 DataLen -= 8; 980 981 // Set or check the various bits in the IdentifierInfo structure. 982 // Token IDs are read-only. 983 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier) 984 II->revertTokenIDToIdentifier(); 985 if (!F.isModule()) 986 II->setObjCOrBuiltinID(ObjCOrBuiltinID); 987 else if (HasRevertedBuiltin && II->getBuiltinID()) { 988 II->revertBuiltin(); 989 assert((II->hasRevertedBuiltin() || 990 II->getObjCOrBuiltinID() == ObjCOrBuiltinID) && 991 "Incorrect ObjC keyword or builtin ID"); 992 } 993 assert(II->isExtensionToken() == ExtensionToken && 994 "Incorrect extension token flag"); 995 (void)ExtensionToken; 996 if (Poisoned) 997 II->setIsPoisoned(true); 998 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword && 999 "Incorrect C++ operator keyword flag"); 1000 (void)CPlusPlusOperatorKeyword; 1001 1002 // If this identifier is a macro, deserialize the macro 1003 // definition. 1004 if (HadMacroDefinition) { 1005 uint32_t MacroDirectivesOffset = 1006 endian::readNext<uint32_t, little, unaligned>(d); 1007 DataLen -= 4; 1008 1009 Reader.addPendingMacro(II, &F, MacroDirectivesOffset); 1010 } 1011 1012 Reader.SetIdentifierInfo(ID, II); 1013 1014 // Read all of the declarations visible at global scope with this 1015 // name. 1016 if (DataLen > 0) { 1017 SmallVector<uint32_t, 4> DeclIDs; 1018 for (; DataLen > 0; DataLen -= 4) 1019 DeclIDs.push_back(Reader.getGlobalDeclID( 1020 F, endian::readNext<uint32_t, little, unaligned>(d))); 1021 Reader.SetGloballyVisibleDecls(II, DeclIDs); 1022 } 1023 1024 return II; 1025 } 1026 1027 DeclarationNameKey::DeclarationNameKey(DeclarationName Name) 1028 : Kind(Name.getNameKind()) { 1029 switch (Kind) { 1030 case DeclarationName::Identifier: 1031 Data = (uint64_t)Name.getAsIdentifierInfo(); 1032 break; 1033 case DeclarationName::ObjCZeroArgSelector: 1034 case DeclarationName::ObjCOneArgSelector: 1035 case DeclarationName::ObjCMultiArgSelector: 1036 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr(); 1037 break; 1038 case DeclarationName::CXXOperatorName: 1039 Data = Name.getCXXOverloadedOperator(); 1040 break; 1041 case DeclarationName::CXXLiteralOperatorName: 1042 Data = (uint64_t)Name.getCXXLiteralIdentifier(); 1043 break; 1044 case DeclarationName::CXXDeductionGuideName: 1045 Data = (uint64_t)Name.getCXXDeductionGuideTemplate() 1046 ->getDeclName().getAsIdentifierInfo(); 1047 break; 1048 case DeclarationName::CXXConstructorName: 1049 case DeclarationName::CXXDestructorName: 1050 case DeclarationName::CXXConversionFunctionName: 1051 case DeclarationName::CXXUsingDirective: 1052 Data = 0; 1053 break; 1054 } 1055 } 1056 1057 unsigned DeclarationNameKey::getHash() const { 1058 llvm::FoldingSetNodeID ID; 1059 ID.AddInteger(Kind); 1060 1061 switch (Kind) { 1062 case DeclarationName::Identifier: 1063 case DeclarationName::CXXLiteralOperatorName: 1064 case DeclarationName::CXXDeductionGuideName: 1065 ID.AddString(((IdentifierInfo*)Data)->getName()); 1066 break; 1067 case DeclarationName::ObjCZeroArgSelector: 1068 case DeclarationName::ObjCOneArgSelector: 1069 case DeclarationName::ObjCMultiArgSelector: 1070 ID.AddInteger(serialization::ComputeHash(Selector(Data))); 1071 break; 1072 case DeclarationName::CXXOperatorName: 1073 ID.AddInteger((OverloadedOperatorKind)Data); 1074 break; 1075 case DeclarationName::CXXConstructorName: 1076 case DeclarationName::CXXDestructorName: 1077 case DeclarationName::CXXConversionFunctionName: 1078 case DeclarationName::CXXUsingDirective: 1079 break; 1080 } 1081 1082 return ID.ComputeHash(); 1083 } 1084 1085 ModuleFile * 1086 ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) { 1087 using namespace llvm::support; 1088 1089 uint32_t ModuleFileID = endian::readNext<uint32_t, little, unaligned>(d); 1090 return Reader.getLocalModuleFile(F, ModuleFileID); 1091 } 1092 1093 std::pair<unsigned, unsigned> 1094 ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) { 1095 using namespace llvm::support; 1096 1097 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d); 1098 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d); 1099 return std::make_pair(KeyLen, DataLen); 1100 } 1101 1102 ASTDeclContextNameLookupTrait::internal_key_type 1103 ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) { 1104 using namespace llvm::support; 1105 1106 auto Kind = (DeclarationName::NameKind)*d++; 1107 uint64_t Data; 1108 switch (Kind) { 1109 case DeclarationName::Identifier: 1110 case DeclarationName::CXXLiteralOperatorName: 1111 case DeclarationName::CXXDeductionGuideName: 1112 Data = (uint64_t)Reader.getLocalIdentifier( 1113 F, endian::readNext<uint32_t, little, unaligned>(d)); 1114 break; 1115 case DeclarationName::ObjCZeroArgSelector: 1116 case DeclarationName::ObjCOneArgSelector: 1117 case DeclarationName::ObjCMultiArgSelector: 1118 Data = 1119 (uint64_t)Reader.getLocalSelector( 1120 F, endian::readNext<uint32_t, little, unaligned>( 1121 d)).getAsOpaquePtr(); 1122 break; 1123 case DeclarationName::CXXOperatorName: 1124 Data = *d++; // OverloadedOperatorKind 1125 break; 1126 case DeclarationName::CXXConstructorName: 1127 case DeclarationName::CXXDestructorName: 1128 case DeclarationName::CXXConversionFunctionName: 1129 case DeclarationName::CXXUsingDirective: 1130 Data = 0; 1131 break; 1132 } 1133 1134 return DeclarationNameKey(Kind, Data); 1135 } 1136 1137 void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type, 1138 const unsigned char *d, 1139 unsigned DataLen, 1140 data_type_builder &Val) { 1141 using namespace llvm::support; 1142 1143 for (unsigned NumDecls = DataLen / 4; NumDecls; --NumDecls) { 1144 uint32_t LocalID = endian::readNext<uint32_t, little, unaligned>(d); 1145 Val.insert(Reader.getGlobalDeclID(F, LocalID)); 1146 } 1147 } 1148 1149 bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M, 1150 BitstreamCursor &Cursor, 1151 uint64_t Offset, 1152 DeclContext *DC) { 1153 assert(Offset != 0); 1154 1155 SavedStreamPosition SavedPosition(Cursor); 1156 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1157 Error(std::move(Err)); 1158 return true; 1159 } 1160 1161 RecordData Record; 1162 StringRef Blob; 1163 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1164 if (!MaybeCode) { 1165 Error(MaybeCode.takeError()); 1166 return true; 1167 } 1168 unsigned Code = MaybeCode.get(); 1169 1170 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob); 1171 if (!MaybeRecCode) { 1172 Error(MaybeRecCode.takeError()); 1173 return true; 1174 } 1175 unsigned RecCode = MaybeRecCode.get(); 1176 if (RecCode != DECL_CONTEXT_LEXICAL) { 1177 Error("Expected lexical block"); 1178 return true; 1179 } 1180 1181 assert(!isa<TranslationUnitDecl>(DC) && 1182 "expected a TU_UPDATE_LEXICAL record for TU"); 1183 // If we are handling a C++ class template instantiation, we can see multiple 1184 // lexical updates for the same record. It's important that we select only one 1185 // of them, so that field numbering works properly. Just pick the first one we 1186 // see. 1187 auto &Lex = LexicalDecls[DC]; 1188 if (!Lex.first) { 1189 Lex = std::make_pair( 1190 &M, llvm::makeArrayRef( 1191 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 1192 Blob.data()), 1193 Blob.size() / 4)); 1194 } 1195 DC->setHasExternalLexicalStorage(true); 1196 return false; 1197 } 1198 1199 bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M, 1200 BitstreamCursor &Cursor, 1201 uint64_t Offset, 1202 DeclID ID) { 1203 assert(Offset != 0); 1204 1205 SavedStreamPosition SavedPosition(Cursor); 1206 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1207 Error(std::move(Err)); 1208 return true; 1209 } 1210 1211 RecordData Record; 1212 StringRef Blob; 1213 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1214 if (!MaybeCode) { 1215 Error(MaybeCode.takeError()); 1216 return true; 1217 } 1218 unsigned Code = MaybeCode.get(); 1219 1220 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob); 1221 if (!MaybeRecCode) { 1222 Error(MaybeRecCode.takeError()); 1223 return true; 1224 } 1225 unsigned RecCode = MaybeRecCode.get(); 1226 if (RecCode != DECL_CONTEXT_VISIBLE) { 1227 Error("Expected visible lookup table block"); 1228 return true; 1229 } 1230 1231 // We can't safely determine the primary context yet, so delay attaching the 1232 // lookup table until we're done with recursive deserialization. 1233 auto *Data = (const unsigned char*)Blob.data(); 1234 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data}); 1235 return false; 1236 } 1237 1238 void ASTReader::Error(StringRef Msg) const { 1239 Error(diag::err_fe_pch_malformed, Msg); 1240 if (PP.getLangOpts().Modules && !Diags.isDiagnosticInFlight() && 1241 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) { 1242 Diag(diag::note_module_cache_path) 1243 << PP.getHeaderSearchInfo().getModuleCachePath(); 1244 } 1245 } 1246 1247 void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2, 1248 StringRef Arg3) const { 1249 if (Diags.isDiagnosticInFlight()) 1250 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2, Arg3); 1251 else 1252 Diag(DiagID) << Arg1 << Arg2 << Arg3; 1253 } 1254 1255 void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2, 1256 unsigned Select) const { 1257 if (!Diags.isDiagnosticInFlight()) 1258 Diag(DiagID) << Arg1 << Arg2 << Select; 1259 } 1260 1261 void ASTReader::Error(llvm::Error &&Err) const { 1262 Error(toString(std::move(Err))); 1263 } 1264 1265 //===----------------------------------------------------------------------===// 1266 // Source Manager Deserialization 1267 //===----------------------------------------------------------------------===// 1268 1269 /// Read the line table in the source manager block. 1270 /// \returns true if there was an error. 1271 bool ASTReader::ParseLineTable(ModuleFile &F, 1272 const RecordData &Record) { 1273 unsigned Idx = 0; 1274 LineTableInfo &LineTable = SourceMgr.getLineTable(); 1275 1276 // Parse the file names 1277 std::map<int, int> FileIDs; 1278 FileIDs[-1] = -1; // For unspecified filenames. 1279 for (unsigned I = 0; Record[Idx]; ++I) { 1280 // Extract the file name 1281 auto Filename = ReadPath(F, Record, Idx); 1282 FileIDs[I] = LineTable.getLineTableFilenameID(Filename); 1283 } 1284 ++Idx; 1285 1286 // Parse the line entries 1287 std::vector<LineEntry> Entries; 1288 while (Idx < Record.size()) { 1289 int FID = Record[Idx++]; 1290 assert(FID >= 0 && "Serialized line entries for non-local file."); 1291 // Remap FileID from 1-based old view. 1292 FID += F.SLocEntryBaseID - 1; 1293 1294 // Extract the line entries 1295 unsigned NumEntries = Record[Idx++]; 1296 assert(NumEntries && "no line entries for file ID"); 1297 Entries.clear(); 1298 Entries.reserve(NumEntries); 1299 for (unsigned I = 0; I != NumEntries; ++I) { 1300 unsigned FileOffset = Record[Idx++]; 1301 unsigned LineNo = Record[Idx++]; 1302 int FilenameID = FileIDs[Record[Idx++]]; 1303 SrcMgr::CharacteristicKind FileKind 1304 = (SrcMgr::CharacteristicKind)Record[Idx++]; 1305 unsigned IncludeOffset = Record[Idx++]; 1306 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID, 1307 FileKind, IncludeOffset)); 1308 } 1309 LineTable.AddEntry(FileID::get(FID), Entries); 1310 } 1311 1312 return false; 1313 } 1314 1315 /// Read a source manager block 1316 bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) { 1317 using namespace SrcMgr; 1318 1319 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor; 1320 1321 // Set the source-location entry cursor to the current position in 1322 // the stream. This cursor will be used to read the contents of the 1323 // source manager block initially, and then lazily read 1324 // source-location entries as needed. 1325 SLocEntryCursor = F.Stream; 1326 1327 // The stream itself is going to skip over the source manager block. 1328 if (llvm::Error Err = F.Stream.SkipBlock()) { 1329 Error(std::move(Err)); 1330 return true; 1331 } 1332 1333 // Enter the source manager block. 1334 if (llvm::Error Err = 1335 SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) { 1336 Error(std::move(Err)); 1337 return true; 1338 } 1339 F.SourceManagerBlockStartOffset = SLocEntryCursor.GetCurrentBitNo(); 1340 1341 RecordData Record; 1342 while (true) { 1343 Expected<llvm::BitstreamEntry> MaybeE = 1344 SLocEntryCursor.advanceSkippingSubblocks(); 1345 if (!MaybeE) { 1346 Error(MaybeE.takeError()); 1347 return true; 1348 } 1349 llvm::BitstreamEntry E = MaybeE.get(); 1350 1351 switch (E.Kind) { 1352 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1353 case llvm::BitstreamEntry::Error: 1354 Error("malformed block record in AST file"); 1355 return true; 1356 case llvm::BitstreamEntry::EndBlock: 1357 return false; 1358 case llvm::BitstreamEntry::Record: 1359 // The interesting case. 1360 break; 1361 } 1362 1363 // Read a record. 1364 Record.clear(); 1365 StringRef Blob; 1366 Expected<unsigned> MaybeRecord = 1367 SLocEntryCursor.readRecord(E.ID, Record, &Blob); 1368 if (!MaybeRecord) { 1369 Error(MaybeRecord.takeError()); 1370 return true; 1371 } 1372 switch (MaybeRecord.get()) { 1373 default: // Default behavior: ignore. 1374 break; 1375 1376 case SM_SLOC_FILE_ENTRY: 1377 case SM_SLOC_BUFFER_ENTRY: 1378 case SM_SLOC_EXPANSION_ENTRY: 1379 // Once we hit one of the source location entries, we're done. 1380 return false; 1381 } 1382 } 1383 } 1384 1385 /// If a header file is not found at the path that we expect it to be 1386 /// and the PCH file was moved from its original location, try to resolve the 1387 /// file by assuming that header+PCH were moved together and the header is in 1388 /// the same place relative to the PCH. 1389 static std::string 1390 resolveFileRelativeToOriginalDir(const std::string &Filename, 1391 const std::string &OriginalDir, 1392 const std::string &CurrDir) { 1393 assert(OriginalDir != CurrDir && 1394 "No point trying to resolve the file if the PCH dir didn't change"); 1395 1396 using namespace llvm::sys; 1397 1398 SmallString<128> filePath(Filename); 1399 fs::make_absolute(filePath); 1400 assert(path::is_absolute(OriginalDir)); 1401 SmallString<128> currPCHPath(CurrDir); 1402 1403 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)), 1404 fileDirE = path::end(path::parent_path(filePath)); 1405 path::const_iterator origDirI = path::begin(OriginalDir), 1406 origDirE = path::end(OriginalDir); 1407 // Skip the common path components from filePath and OriginalDir. 1408 while (fileDirI != fileDirE && origDirI != origDirE && 1409 *fileDirI == *origDirI) { 1410 ++fileDirI; 1411 ++origDirI; 1412 } 1413 for (; origDirI != origDirE; ++origDirI) 1414 path::append(currPCHPath, ".."); 1415 path::append(currPCHPath, fileDirI, fileDirE); 1416 path::append(currPCHPath, path::filename(Filename)); 1417 return std::string(currPCHPath.str()); 1418 } 1419 1420 bool ASTReader::ReadSLocEntry(int ID) { 1421 if (ID == 0) 1422 return false; 1423 1424 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1425 Error("source location entry ID out-of-range for AST file"); 1426 return true; 1427 } 1428 1429 // Local helper to read the (possibly-compressed) buffer data following the 1430 // entry record. 1431 auto ReadBuffer = [this]( 1432 BitstreamCursor &SLocEntryCursor, 1433 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> { 1434 RecordData Record; 1435 StringRef Blob; 1436 Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode(); 1437 if (!MaybeCode) { 1438 Error(MaybeCode.takeError()); 1439 return nullptr; 1440 } 1441 unsigned Code = MaybeCode.get(); 1442 1443 Expected<unsigned> MaybeRecCode = 1444 SLocEntryCursor.readRecord(Code, Record, &Blob); 1445 if (!MaybeRecCode) { 1446 Error(MaybeRecCode.takeError()); 1447 return nullptr; 1448 } 1449 unsigned RecCode = MaybeRecCode.get(); 1450 1451 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) { 1452 if (!llvm::zlib::isAvailable()) { 1453 Error("zlib is not available"); 1454 return nullptr; 1455 } 1456 SmallString<0> Uncompressed; 1457 if (llvm::Error E = 1458 llvm::zlib::uncompress(Blob, Uncompressed, Record[0])) { 1459 Error("could not decompress embedded file contents: " + 1460 llvm::toString(std::move(E))); 1461 return nullptr; 1462 } 1463 return llvm::MemoryBuffer::getMemBufferCopy(Uncompressed, Name); 1464 } else if (RecCode == SM_SLOC_BUFFER_BLOB) { 1465 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true); 1466 } else { 1467 Error("AST record has invalid code"); 1468 return nullptr; 1469 } 1470 }; 1471 1472 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second; 1473 if (llvm::Error Err = F->SLocEntryCursor.JumpToBit( 1474 F->SLocEntryOffsetsBase + 1475 F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) { 1476 Error(std::move(Err)); 1477 return true; 1478 } 1479 1480 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor; 1481 unsigned BaseOffset = F->SLocEntryBaseOffset; 1482 1483 ++NumSLocEntriesRead; 1484 Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance(); 1485 if (!MaybeEntry) { 1486 Error(MaybeEntry.takeError()); 1487 return true; 1488 } 1489 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1490 1491 if (Entry.Kind != llvm::BitstreamEntry::Record) { 1492 Error("incorrectly-formatted source location entry in AST file"); 1493 return true; 1494 } 1495 1496 RecordData Record; 1497 StringRef Blob; 1498 Expected<unsigned> MaybeSLOC = 1499 SLocEntryCursor.readRecord(Entry.ID, Record, &Blob); 1500 if (!MaybeSLOC) { 1501 Error(MaybeSLOC.takeError()); 1502 return true; 1503 } 1504 switch (MaybeSLOC.get()) { 1505 default: 1506 Error("incorrectly-formatted source location entry in AST file"); 1507 return true; 1508 1509 case SM_SLOC_FILE_ENTRY: { 1510 // We will detect whether a file changed and return 'Failure' for it, but 1511 // we will also try to fail gracefully by setting up the SLocEntry. 1512 unsigned InputID = Record[4]; 1513 InputFile IF = getInputFile(*F, InputID); 1514 const FileEntry *File = IF.getFile(); 1515 bool OverriddenBuffer = IF.isOverridden(); 1516 1517 // Note that we only check if a File was returned. If it was out-of-date 1518 // we have complained but we will continue creating a FileID to recover 1519 // gracefully. 1520 if (!File) 1521 return true; 1522 1523 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1524 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) { 1525 // This is the module's main file. 1526 IncludeLoc = getImportLocation(F); 1527 } 1528 SrcMgr::CharacteristicKind 1529 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1530 // FIXME: The FileID should be created from the FileEntryRef. 1531 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter, 1532 ID, BaseOffset + Record[0]); 1533 SrcMgr::FileInfo &FileInfo = 1534 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile()); 1535 FileInfo.NumCreatedFIDs = Record[5]; 1536 if (Record[3]) 1537 FileInfo.setHasLineDirectives(); 1538 1539 unsigned NumFileDecls = Record[7]; 1540 if (NumFileDecls && ContextObj) { 1541 const DeclID *FirstDecl = F->FileSortedDecls + Record[6]; 1542 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?"); 1543 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl, 1544 NumFileDecls)); 1545 } 1546 1547 const SrcMgr::ContentCache *ContentCache 1548 = SourceMgr.getOrCreateContentCache(File, isSystem(FileCharacter)); 1549 if (OverriddenBuffer && !ContentCache->BufferOverridden && 1550 ContentCache->ContentsEntry == ContentCache->OrigEntry && 1551 !ContentCache->getRawBuffer()) { 1552 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName()); 1553 if (!Buffer) 1554 return true; 1555 SourceMgr.overrideFileContents(File, std::move(Buffer)); 1556 } 1557 1558 break; 1559 } 1560 1561 case SM_SLOC_BUFFER_ENTRY: { 1562 const char *Name = Blob.data(); 1563 unsigned Offset = Record[0]; 1564 SrcMgr::CharacteristicKind 1565 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1566 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1567 if (IncludeLoc.isInvalid() && F->isModule()) { 1568 IncludeLoc = getImportLocation(F); 1569 } 1570 1571 auto Buffer = ReadBuffer(SLocEntryCursor, Name); 1572 if (!Buffer) 1573 return true; 1574 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID, 1575 BaseOffset + Offset, IncludeLoc); 1576 break; 1577 } 1578 1579 case SM_SLOC_EXPANSION_ENTRY: { 1580 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]); 1581 SourceMgr.createExpansionLoc(SpellingLoc, 1582 ReadSourceLocation(*F, Record[2]), 1583 ReadSourceLocation(*F, Record[3]), 1584 Record[5], 1585 Record[4], 1586 ID, 1587 BaseOffset + Record[0]); 1588 break; 1589 } 1590 } 1591 1592 return false; 1593 } 1594 1595 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) { 1596 if (ID == 0) 1597 return std::make_pair(SourceLocation(), ""); 1598 1599 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1600 Error("source location entry ID out-of-range for AST file"); 1601 return std::make_pair(SourceLocation(), ""); 1602 } 1603 1604 // Find which module file this entry lands in. 1605 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second; 1606 if (!M->isModule()) 1607 return std::make_pair(SourceLocation(), ""); 1608 1609 // FIXME: Can we map this down to a particular submodule? That would be 1610 // ideal. 1611 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName)); 1612 } 1613 1614 /// Find the location where the module F is imported. 1615 SourceLocation ASTReader::getImportLocation(ModuleFile *F) { 1616 if (F->ImportLoc.isValid()) 1617 return F->ImportLoc; 1618 1619 // Otherwise we have a PCH. It's considered to be "imported" at the first 1620 // location of its includer. 1621 if (F->ImportedBy.empty() || !F->ImportedBy[0]) { 1622 // Main file is the importer. 1623 assert(SourceMgr.getMainFileID().isValid() && "missing main file"); 1624 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID()); 1625 } 1626 return F->ImportedBy[0]->FirstLoc; 1627 } 1628 1629 /// Enter a subblock of the specified BlockID with the specified cursor. Read 1630 /// the abbreviations that are at the top of the block and then leave the cursor 1631 /// pointing into the block. 1632 bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID, 1633 uint64_t *StartOfBlockOffset) { 1634 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) { 1635 // FIXME this drops errors on the floor. 1636 consumeError(std::move(Err)); 1637 return true; 1638 } 1639 1640 if (StartOfBlockOffset) 1641 *StartOfBlockOffset = Cursor.GetCurrentBitNo(); 1642 1643 while (true) { 1644 uint64_t Offset = Cursor.GetCurrentBitNo(); 1645 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1646 if (!MaybeCode) { 1647 // FIXME this drops errors on the floor. 1648 consumeError(MaybeCode.takeError()); 1649 return true; 1650 } 1651 unsigned Code = MaybeCode.get(); 1652 1653 // We expect all abbrevs to be at the start of the block. 1654 if (Code != llvm::bitc::DEFINE_ABBREV) { 1655 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1656 // FIXME this drops errors on the floor. 1657 consumeError(std::move(Err)); 1658 return true; 1659 } 1660 return false; 1661 } 1662 if (llvm::Error Err = Cursor.ReadAbbrevRecord()) { 1663 // FIXME this drops errors on the floor. 1664 consumeError(std::move(Err)); 1665 return true; 1666 } 1667 } 1668 } 1669 1670 Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record, 1671 unsigned &Idx) { 1672 Token Tok; 1673 Tok.startToken(); 1674 Tok.setLocation(ReadSourceLocation(F, Record, Idx)); 1675 Tok.setLength(Record[Idx++]); 1676 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++])) 1677 Tok.setIdentifierInfo(II); 1678 Tok.setKind((tok::TokenKind)Record[Idx++]); 1679 Tok.setFlag((Token::TokenFlags)Record[Idx++]); 1680 return Tok; 1681 } 1682 1683 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { 1684 BitstreamCursor &Stream = F.MacroCursor; 1685 1686 // Keep track of where we are in the stream, then jump back there 1687 // after reading this macro. 1688 SavedStreamPosition SavedPosition(Stream); 1689 1690 if (llvm::Error Err = Stream.JumpToBit(Offset)) { 1691 // FIXME this drops errors on the floor. 1692 consumeError(std::move(Err)); 1693 return nullptr; 1694 } 1695 RecordData Record; 1696 SmallVector<IdentifierInfo*, 16> MacroParams; 1697 MacroInfo *Macro = nullptr; 1698 1699 while (true) { 1700 // Advance to the next record, but if we get to the end of the block, don't 1701 // pop it (removing all the abbreviations from the cursor) since we want to 1702 // be able to reseek within the block and read entries. 1703 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd; 1704 Expected<llvm::BitstreamEntry> MaybeEntry = 1705 Stream.advanceSkippingSubblocks(Flags); 1706 if (!MaybeEntry) { 1707 Error(MaybeEntry.takeError()); 1708 return Macro; 1709 } 1710 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1711 1712 switch (Entry.Kind) { 1713 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1714 case llvm::BitstreamEntry::Error: 1715 Error("malformed block record in AST file"); 1716 return Macro; 1717 case llvm::BitstreamEntry::EndBlock: 1718 return Macro; 1719 case llvm::BitstreamEntry::Record: 1720 // The interesting case. 1721 break; 1722 } 1723 1724 // Read a record. 1725 Record.clear(); 1726 PreprocessorRecordTypes RecType; 1727 if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record)) 1728 RecType = (PreprocessorRecordTypes)MaybeRecType.get(); 1729 else { 1730 Error(MaybeRecType.takeError()); 1731 return Macro; 1732 } 1733 switch (RecType) { 1734 case PP_MODULE_MACRO: 1735 case PP_MACRO_DIRECTIVE_HISTORY: 1736 return Macro; 1737 1738 case PP_MACRO_OBJECT_LIKE: 1739 case PP_MACRO_FUNCTION_LIKE: { 1740 // If we already have a macro, that means that we've hit the end 1741 // of the definition of the macro we were looking for. We're 1742 // done. 1743 if (Macro) 1744 return Macro; 1745 1746 unsigned NextIndex = 1; // Skip identifier ID. 1747 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex); 1748 MacroInfo *MI = PP.AllocateMacroInfo(Loc); 1749 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex)); 1750 MI->setIsUsed(Record[NextIndex++]); 1751 MI->setUsedForHeaderGuard(Record[NextIndex++]); 1752 1753 if (RecType == PP_MACRO_FUNCTION_LIKE) { 1754 // Decode function-like macro info. 1755 bool isC99VarArgs = Record[NextIndex++]; 1756 bool isGNUVarArgs = Record[NextIndex++]; 1757 bool hasCommaPasting = Record[NextIndex++]; 1758 MacroParams.clear(); 1759 unsigned NumArgs = Record[NextIndex++]; 1760 for (unsigned i = 0; i != NumArgs; ++i) 1761 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++])); 1762 1763 // Install function-like macro info. 1764 MI->setIsFunctionLike(); 1765 if (isC99VarArgs) MI->setIsC99Varargs(); 1766 if (isGNUVarArgs) MI->setIsGNUVarargs(); 1767 if (hasCommaPasting) MI->setHasCommaPasting(); 1768 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator()); 1769 } 1770 1771 // Remember that we saw this macro last so that we add the tokens that 1772 // form its body to it. 1773 Macro = MI; 1774 1775 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() && 1776 Record[NextIndex]) { 1777 // We have a macro definition. Register the association 1778 PreprocessedEntityID 1779 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]); 1780 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 1781 PreprocessingRecord::PPEntityID PPID = 1782 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true); 1783 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>( 1784 PPRec.getPreprocessedEntity(PPID)); 1785 if (PPDef) 1786 PPRec.RegisterMacroDefinition(Macro, PPDef); 1787 } 1788 1789 ++NumMacrosRead; 1790 break; 1791 } 1792 1793 case PP_TOKEN: { 1794 // If we see a TOKEN before a PP_MACRO_*, then the file is 1795 // erroneous, just pretend we didn't see this. 1796 if (!Macro) break; 1797 1798 unsigned Idx = 0; 1799 Token Tok = ReadToken(F, Record, Idx); 1800 Macro->AddTokenToBody(Tok); 1801 break; 1802 } 1803 } 1804 } 1805 } 1806 1807 PreprocessedEntityID 1808 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, 1809 unsigned LocalID) const { 1810 if (!M.ModuleOffsetMap.empty()) 1811 ReadModuleOffsetMap(M); 1812 1813 ContinuousRangeMap<uint32_t, int, 2>::const_iterator 1814 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS); 1815 assert(I != M.PreprocessedEntityRemap.end() 1816 && "Invalid index into preprocessed entity index remap"); 1817 1818 return LocalID + I->second; 1819 } 1820 1821 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) { 1822 return llvm::hash_combine(ikey.Size, ikey.ModTime); 1823 } 1824 1825 HeaderFileInfoTrait::internal_key_type 1826 HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) { 1827 internal_key_type ikey = {FE->getSize(), 1828 M.HasTimestamps ? FE->getModificationTime() : 0, 1829 FE->getName(), /*Imported*/ false}; 1830 return ikey; 1831 } 1832 1833 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) { 1834 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime)) 1835 return false; 1836 1837 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename) 1838 return true; 1839 1840 // Determine whether the actual files are equivalent. 1841 FileManager &FileMgr = Reader.getFileManager(); 1842 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* { 1843 if (!Key.Imported) { 1844 if (auto File = FileMgr.getFile(Key.Filename)) 1845 return *File; 1846 return nullptr; 1847 } 1848 1849 std::string Resolved = std::string(Key.Filename); 1850 Reader.ResolveImportedPath(M, Resolved); 1851 if (auto File = FileMgr.getFile(Resolved)) 1852 return *File; 1853 return nullptr; 1854 }; 1855 1856 const FileEntry *FEA = GetFile(a); 1857 const FileEntry *FEB = GetFile(b); 1858 return FEA && FEA == FEB; 1859 } 1860 1861 std::pair<unsigned, unsigned> 1862 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) { 1863 using namespace llvm::support; 1864 1865 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d); 1866 unsigned DataLen = (unsigned) *d++; 1867 return std::make_pair(KeyLen, DataLen); 1868 } 1869 1870 HeaderFileInfoTrait::internal_key_type 1871 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) { 1872 using namespace llvm::support; 1873 1874 internal_key_type ikey; 1875 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d)); 1876 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d)); 1877 ikey.Filename = (const char *)d; 1878 ikey.Imported = true; 1879 return ikey; 1880 } 1881 1882 HeaderFileInfoTrait::data_type 1883 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d, 1884 unsigned DataLen) { 1885 using namespace llvm::support; 1886 1887 const unsigned char *End = d + DataLen; 1888 HeaderFileInfo HFI; 1889 unsigned Flags = *d++; 1890 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp. 1891 HFI.isImport |= (Flags >> 5) & 0x01; 1892 HFI.isPragmaOnce |= (Flags >> 4) & 0x01; 1893 HFI.DirInfo = (Flags >> 1) & 0x07; 1894 HFI.IndexHeaderMapHeader = Flags & 0x01; 1895 // FIXME: Find a better way to handle this. Maybe just store a 1896 // "has been included" flag? 1897 HFI.NumIncludes = std::max(endian::readNext<uint16_t, little, unaligned>(d), 1898 HFI.NumIncludes); 1899 HFI.ControllingMacroID = Reader.getGlobalIdentifierID( 1900 M, endian::readNext<uint32_t, little, unaligned>(d)); 1901 if (unsigned FrameworkOffset = 1902 endian::readNext<uint32_t, little, unaligned>(d)) { 1903 // The framework offset is 1 greater than the actual offset, 1904 // since 0 is used as an indicator for "no framework name". 1905 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1); 1906 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName); 1907 } 1908 1909 assert((End - d) % 4 == 0 && 1910 "Wrong data length in HeaderFileInfo deserialization"); 1911 while (d != End) { 1912 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d); 1913 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3); 1914 LocalSMID >>= 2; 1915 1916 // This header is part of a module. Associate it with the module to enable 1917 // implicit module import. 1918 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID); 1919 Module *Mod = Reader.getSubmodule(GlobalSMID); 1920 FileManager &FileMgr = Reader.getFileManager(); 1921 ModuleMap &ModMap = 1922 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap(); 1923 1924 std::string Filename = std::string(key.Filename); 1925 if (key.Imported) 1926 Reader.ResolveImportedPath(M, Filename); 1927 // FIXME: This is not always the right filename-as-written, but we're not 1928 // going to use this information to rebuild the module, so it doesn't make 1929 // a lot of difference. 1930 Module::Header H = {std::string(key.Filename), *FileMgr.getFile(Filename)}; 1931 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true); 1932 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader); 1933 } 1934 1935 // This HeaderFileInfo was externally loaded. 1936 HFI.External = true; 1937 HFI.IsValid = true; 1938 return HFI; 1939 } 1940 1941 void ASTReader::addPendingMacro(IdentifierInfo *II, ModuleFile *M, 1942 uint32_t MacroDirectivesOffset) { 1943 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"); 1944 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset)); 1945 } 1946 1947 void ASTReader::ReadDefinedMacros() { 1948 // Note that we are loading defined macros. 1949 Deserializing Macros(this); 1950 1951 for (ModuleFile &I : llvm::reverse(ModuleMgr)) { 1952 BitstreamCursor &MacroCursor = I.MacroCursor; 1953 1954 // If there was no preprocessor block, skip this file. 1955 if (MacroCursor.getBitcodeBytes().empty()) 1956 continue; 1957 1958 BitstreamCursor Cursor = MacroCursor; 1959 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) { 1960 Error(std::move(Err)); 1961 return; 1962 } 1963 1964 RecordData Record; 1965 while (true) { 1966 Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks(); 1967 if (!MaybeE) { 1968 Error(MaybeE.takeError()); 1969 return; 1970 } 1971 llvm::BitstreamEntry E = MaybeE.get(); 1972 1973 switch (E.Kind) { 1974 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1975 case llvm::BitstreamEntry::Error: 1976 Error("malformed block record in AST file"); 1977 return; 1978 case llvm::BitstreamEntry::EndBlock: 1979 goto NextCursor; 1980 1981 case llvm::BitstreamEntry::Record: { 1982 Record.clear(); 1983 Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record); 1984 if (!MaybeRecord) { 1985 Error(MaybeRecord.takeError()); 1986 return; 1987 } 1988 switch (MaybeRecord.get()) { 1989 default: // Default behavior: ignore. 1990 break; 1991 1992 case PP_MACRO_OBJECT_LIKE: 1993 case PP_MACRO_FUNCTION_LIKE: { 1994 IdentifierInfo *II = getLocalIdentifier(I, Record[0]); 1995 if (II->isOutOfDate()) 1996 updateOutOfDateIdentifier(*II); 1997 break; 1998 } 1999 2000 case PP_TOKEN: 2001 // Ignore tokens. 2002 break; 2003 } 2004 break; 2005 } 2006 } 2007 } 2008 NextCursor: ; 2009 } 2010 } 2011 2012 namespace { 2013 2014 /// Visitor class used to look up identifirs in an AST file. 2015 class IdentifierLookupVisitor { 2016 StringRef Name; 2017 unsigned NameHash; 2018 unsigned PriorGeneration; 2019 unsigned &NumIdentifierLookups; 2020 unsigned &NumIdentifierLookupHits; 2021 IdentifierInfo *Found = nullptr; 2022 2023 public: 2024 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration, 2025 unsigned &NumIdentifierLookups, 2026 unsigned &NumIdentifierLookupHits) 2027 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)), 2028 PriorGeneration(PriorGeneration), 2029 NumIdentifierLookups(NumIdentifierLookups), 2030 NumIdentifierLookupHits(NumIdentifierLookupHits) {} 2031 2032 bool operator()(ModuleFile &M) { 2033 // If we've already searched this module file, skip it now. 2034 if (M.Generation <= PriorGeneration) 2035 return true; 2036 2037 ASTIdentifierLookupTable *IdTable 2038 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable; 2039 if (!IdTable) 2040 return false; 2041 2042 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M, 2043 Found); 2044 ++NumIdentifierLookups; 2045 ASTIdentifierLookupTable::iterator Pos = 2046 IdTable->find_hashed(Name, NameHash, &Trait); 2047 if (Pos == IdTable->end()) 2048 return false; 2049 2050 // Dereferencing the iterator has the effect of building the 2051 // IdentifierInfo node and populating it with the various 2052 // declarations it needs. 2053 ++NumIdentifierLookupHits; 2054 Found = *Pos; 2055 return true; 2056 } 2057 2058 // Retrieve the identifier info found within the module 2059 // files. 2060 IdentifierInfo *getIdentifierInfo() const { return Found; } 2061 }; 2062 2063 } // namespace 2064 2065 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) { 2066 // Note that we are loading an identifier. 2067 Deserializing AnIdentifier(this); 2068 2069 unsigned PriorGeneration = 0; 2070 if (getContext().getLangOpts().Modules) 2071 PriorGeneration = IdentifierGeneration[&II]; 2072 2073 // If there is a global index, look there first to determine which modules 2074 // provably do not have any results for this identifier. 2075 GlobalModuleIndex::HitSet Hits; 2076 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 2077 if (!loadGlobalIndex()) { 2078 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) { 2079 HitsPtr = &Hits; 2080 } 2081 } 2082 2083 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration, 2084 NumIdentifierLookups, 2085 NumIdentifierLookupHits); 2086 ModuleMgr.visit(Visitor, HitsPtr); 2087 markIdentifierUpToDate(&II); 2088 } 2089 2090 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) { 2091 if (!II) 2092 return; 2093 2094 II->setOutOfDate(false); 2095 2096 // Update the generation for this identifier. 2097 if (getContext().getLangOpts().Modules) 2098 IdentifierGeneration[II] = getGeneration(); 2099 } 2100 2101 void ASTReader::resolvePendingMacro(IdentifierInfo *II, 2102 const PendingMacroInfo &PMInfo) { 2103 ModuleFile &M = *PMInfo.M; 2104 2105 BitstreamCursor &Cursor = M.MacroCursor; 2106 SavedStreamPosition SavedPosition(Cursor); 2107 if (llvm::Error Err = 2108 Cursor.JumpToBit(M.MacroOffsetsBase + PMInfo.MacroDirectivesOffset)) { 2109 Error(std::move(Err)); 2110 return; 2111 } 2112 2113 struct ModuleMacroRecord { 2114 SubmoduleID SubModID; 2115 MacroInfo *MI; 2116 SmallVector<SubmoduleID, 8> Overrides; 2117 }; 2118 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros; 2119 2120 // We expect to see a sequence of PP_MODULE_MACRO records listing exported 2121 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete 2122 // macro histroy. 2123 RecordData Record; 2124 while (true) { 2125 Expected<llvm::BitstreamEntry> MaybeEntry = 2126 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 2127 if (!MaybeEntry) { 2128 Error(MaybeEntry.takeError()); 2129 return; 2130 } 2131 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2132 2133 if (Entry.Kind != llvm::BitstreamEntry::Record) { 2134 Error("malformed block record in AST file"); 2135 return; 2136 } 2137 2138 Record.clear(); 2139 Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record); 2140 if (!MaybePP) { 2141 Error(MaybePP.takeError()); 2142 return; 2143 } 2144 switch ((PreprocessorRecordTypes)MaybePP.get()) { 2145 case PP_MACRO_DIRECTIVE_HISTORY: 2146 break; 2147 2148 case PP_MODULE_MACRO: { 2149 ModuleMacros.push_back(ModuleMacroRecord()); 2150 auto &Info = ModuleMacros.back(); 2151 Info.SubModID = getGlobalSubmoduleID(M, Record[0]); 2152 Info.MI = getMacro(getGlobalMacroID(M, Record[1])); 2153 for (int I = 2, N = Record.size(); I != N; ++I) 2154 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I])); 2155 continue; 2156 } 2157 2158 default: 2159 Error("malformed block record in AST file"); 2160 return; 2161 } 2162 2163 // We found the macro directive history; that's the last record 2164 // for this macro. 2165 break; 2166 } 2167 2168 // Module macros are listed in reverse dependency order. 2169 { 2170 std::reverse(ModuleMacros.begin(), ModuleMacros.end()); 2171 llvm::SmallVector<ModuleMacro*, 8> Overrides; 2172 for (auto &MMR : ModuleMacros) { 2173 Overrides.clear(); 2174 for (unsigned ModID : MMR.Overrides) { 2175 Module *Mod = getSubmodule(ModID); 2176 auto *Macro = PP.getModuleMacro(Mod, II); 2177 assert(Macro && "missing definition for overridden macro"); 2178 Overrides.push_back(Macro); 2179 } 2180 2181 bool Inserted = false; 2182 Module *Owner = getSubmodule(MMR.SubModID); 2183 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted); 2184 } 2185 } 2186 2187 // Don't read the directive history for a module; we don't have anywhere 2188 // to put it. 2189 if (M.isModule()) 2190 return; 2191 2192 // Deserialize the macro directives history in reverse source-order. 2193 MacroDirective *Latest = nullptr, *Earliest = nullptr; 2194 unsigned Idx = 0, N = Record.size(); 2195 while (Idx < N) { 2196 MacroDirective *MD = nullptr; 2197 SourceLocation Loc = ReadSourceLocation(M, Record, Idx); 2198 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++]; 2199 switch (K) { 2200 case MacroDirective::MD_Define: { 2201 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++])); 2202 MD = PP.AllocateDefMacroDirective(MI, Loc); 2203 break; 2204 } 2205 case MacroDirective::MD_Undefine: 2206 MD = PP.AllocateUndefMacroDirective(Loc); 2207 break; 2208 case MacroDirective::MD_Visibility: 2209 bool isPublic = Record[Idx++]; 2210 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic); 2211 break; 2212 } 2213 2214 if (!Latest) 2215 Latest = MD; 2216 if (Earliest) 2217 Earliest->setPrevious(MD); 2218 Earliest = MD; 2219 } 2220 2221 if (Latest) 2222 PP.setLoadedMacroDirective(II, Earliest, Latest); 2223 } 2224 2225 ASTReader::InputFileInfo 2226 ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) { 2227 // Go find this input file. 2228 BitstreamCursor &Cursor = F.InputFilesCursor; 2229 SavedStreamPosition SavedPosition(Cursor); 2230 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2231 // FIXME this drops errors on the floor. 2232 consumeError(std::move(Err)); 2233 } 2234 2235 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 2236 if (!MaybeCode) { 2237 // FIXME this drops errors on the floor. 2238 consumeError(MaybeCode.takeError()); 2239 } 2240 unsigned Code = MaybeCode.get(); 2241 RecordData Record; 2242 StringRef Blob; 2243 2244 if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob)) 2245 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE && 2246 "invalid record type for input file"); 2247 else { 2248 // FIXME this drops errors on the floor. 2249 consumeError(Maybe.takeError()); 2250 } 2251 2252 assert(Record[0] == ID && "Bogus stored ID or offset"); 2253 InputFileInfo R; 2254 R.StoredSize = static_cast<off_t>(Record[1]); 2255 R.StoredTime = static_cast<time_t>(Record[2]); 2256 R.Overridden = static_cast<bool>(Record[3]); 2257 R.Transient = static_cast<bool>(Record[4]); 2258 R.TopLevelModuleMap = static_cast<bool>(Record[5]); 2259 R.Filename = std::string(Blob); 2260 ResolveImportedPath(F, R.Filename); 2261 2262 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 2263 if (!MaybeEntry) // FIXME this drops errors on the floor. 2264 consumeError(MaybeEntry.takeError()); 2265 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2266 assert(Entry.Kind == llvm::BitstreamEntry::Record && 2267 "expected record type for input file hash"); 2268 2269 Record.clear(); 2270 if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record)) 2271 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH && 2272 "invalid record type for input file hash"); 2273 else { 2274 // FIXME this drops errors on the floor. 2275 consumeError(Maybe.takeError()); 2276 } 2277 R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) | 2278 static_cast<uint64_t>(Record[0]); 2279 return R; 2280 } 2281 2282 static unsigned moduleKindForDiagnostic(ModuleKind Kind); 2283 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { 2284 // If this ID is bogus, just return an empty input file. 2285 if (ID == 0 || ID > F.InputFilesLoaded.size()) 2286 return InputFile(); 2287 2288 // If we've already loaded this input file, return it. 2289 if (F.InputFilesLoaded[ID-1].getFile()) 2290 return F.InputFilesLoaded[ID-1]; 2291 2292 if (F.InputFilesLoaded[ID-1].isNotFound()) 2293 return InputFile(); 2294 2295 // Go find this input file. 2296 BitstreamCursor &Cursor = F.InputFilesCursor; 2297 SavedStreamPosition SavedPosition(Cursor); 2298 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2299 // FIXME this drops errors on the floor. 2300 consumeError(std::move(Err)); 2301 } 2302 2303 InputFileInfo FI = readInputFileInfo(F, ID); 2304 off_t StoredSize = FI.StoredSize; 2305 time_t StoredTime = FI.StoredTime; 2306 bool Overridden = FI.Overridden; 2307 bool Transient = FI.Transient; 2308 StringRef Filename = FI.Filename; 2309 uint64_t StoredContentHash = FI.ContentHash; 2310 2311 const FileEntry *File = nullptr; 2312 if (auto FE = FileMgr.getFile(Filename, /*OpenFile=*/false)) 2313 File = *FE; 2314 2315 // If we didn't find the file, resolve it relative to the 2316 // original directory from which this AST file was created. 2317 if (File == nullptr && !F.OriginalDir.empty() && !F.BaseDirectory.empty() && 2318 F.OriginalDir != F.BaseDirectory) { 2319 std::string Resolved = resolveFileRelativeToOriginalDir( 2320 std::string(Filename), F.OriginalDir, F.BaseDirectory); 2321 if (!Resolved.empty()) 2322 if (auto FE = FileMgr.getFile(Resolved)) 2323 File = *FE; 2324 } 2325 2326 // For an overridden file, create a virtual file with the stored 2327 // size/timestamp. 2328 if ((Overridden || Transient) && File == nullptr) 2329 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime); 2330 2331 if (File == nullptr) { 2332 if (Complain) { 2333 std::string ErrorStr = "could not find file '"; 2334 ErrorStr += Filename; 2335 ErrorStr += "' referenced by AST file '"; 2336 ErrorStr += F.FileName; 2337 ErrorStr += "'"; 2338 Error(ErrorStr); 2339 } 2340 // Record that we didn't find the file. 2341 F.InputFilesLoaded[ID-1] = InputFile::getNotFound(); 2342 return InputFile(); 2343 } 2344 2345 // Check if there was a request to override the contents of the file 2346 // that was part of the precompiled header. Overriding such a file 2347 // can lead to problems when lexing using the source locations from the 2348 // PCH. 2349 SourceManager &SM = getSourceManager(); 2350 // FIXME: Reject if the overrides are different. 2351 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) { 2352 if (Complain) 2353 Error(diag::err_fe_pch_file_overridden, Filename); 2354 2355 // After emitting the diagnostic, bypass the overriding file to recover 2356 // (this creates a separate FileEntry). 2357 File = SM.bypassFileContentsOverride(*File); 2358 if (!File) { 2359 F.InputFilesLoaded[ID - 1] = InputFile::getNotFound(); 2360 return InputFile(); 2361 } 2362 } 2363 2364 enum ModificationType { 2365 Size, 2366 ModTime, 2367 Content, 2368 None, 2369 }; 2370 auto HasInputFileChanged = [&]() { 2371 if (StoredSize != File->getSize()) 2372 return ModificationType::Size; 2373 if (!DisableValidation && StoredTime && 2374 StoredTime != File->getModificationTime()) { 2375 // In case the modification time changes but not the content, 2376 // accept the cached file as legit. 2377 if (ValidateASTInputFilesContent && 2378 StoredContentHash != static_cast<uint64_t>(llvm::hash_code(-1))) { 2379 auto MemBuffOrError = FileMgr.getBufferForFile(File); 2380 if (!MemBuffOrError) { 2381 if (!Complain) 2382 return ModificationType::ModTime; 2383 std::string ErrorStr = "could not get buffer for file '"; 2384 ErrorStr += File->getName(); 2385 ErrorStr += "'"; 2386 Error(ErrorStr); 2387 return ModificationType::ModTime; 2388 } 2389 2390 auto ContentHash = hash_value(MemBuffOrError.get()->getBuffer()); 2391 if (StoredContentHash == static_cast<uint64_t>(ContentHash)) 2392 return ModificationType::None; 2393 return ModificationType::Content; 2394 } 2395 return ModificationType::ModTime; 2396 } 2397 return ModificationType::None; 2398 }; 2399 2400 bool IsOutOfDate = false; 2401 auto FileChange = HasInputFileChanged(); 2402 // For an overridden file, there is nothing to validate. 2403 if (!Overridden && FileChange != ModificationType::None) { 2404 if (Complain) { 2405 // Build a list of the PCH imports that got us here (in reverse). 2406 SmallVector<ModuleFile *, 4> ImportStack(1, &F); 2407 while (!ImportStack.back()->ImportedBy.empty()) 2408 ImportStack.push_back(ImportStack.back()->ImportedBy[0]); 2409 2410 // The top-level PCH is stale. 2411 StringRef TopLevelPCHName(ImportStack.back()->FileName); 2412 unsigned DiagnosticKind = 2413 moduleKindForDiagnostic(ImportStack.back()->Kind); 2414 if (DiagnosticKind == 0) 2415 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName, 2416 (unsigned)FileChange); 2417 else if (DiagnosticKind == 1) 2418 Error(diag::err_fe_module_file_modified, Filename, TopLevelPCHName, 2419 (unsigned)FileChange); 2420 else 2421 Error(diag::err_fe_ast_file_modified, Filename, TopLevelPCHName, 2422 (unsigned)FileChange); 2423 2424 // Print the import stack. 2425 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) { 2426 Diag(diag::note_pch_required_by) 2427 << Filename << ImportStack[0]->FileName; 2428 for (unsigned I = 1; I < ImportStack.size(); ++I) 2429 Diag(diag::note_pch_required_by) 2430 << ImportStack[I-1]->FileName << ImportStack[I]->FileName; 2431 } 2432 2433 if (!Diags.isDiagnosticInFlight()) 2434 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName; 2435 } 2436 2437 IsOutOfDate = true; 2438 } 2439 // FIXME: If the file is overridden and we've already opened it, 2440 // issue an error (or split it into a separate FileEntry). 2441 2442 InputFile IF = InputFile(File, Overridden || Transient, IsOutOfDate); 2443 2444 // Note that we've loaded this input file. 2445 F.InputFilesLoaded[ID-1] = IF; 2446 return IF; 2447 } 2448 2449 /// If we are loading a relocatable PCH or module file, and the filename 2450 /// is not an absolute path, add the system or module root to the beginning of 2451 /// the file name. 2452 void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) { 2453 // Resolve relative to the base directory, if we have one. 2454 if (!M.BaseDirectory.empty()) 2455 return ResolveImportedPath(Filename, M.BaseDirectory); 2456 } 2457 2458 void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) { 2459 if (Filename.empty() || llvm::sys::path::is_absolute(Filename)) 2460 return; 2461 2462 SmallString<128> Buffer; 2463 llvm::sys::path::append(Buffer, Prefix, Filename); 2464 Filename.assign(Buffer.begin(), Buffer.end()); 2465 } 2466 2467 static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) { 2468 switch (ARR) { 2469 case ASTReader::Failure: return true; 2470 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing); 2471 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate); 2472 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch); 2473 case ASTReader::ConfigurationMismatch: 2474 return !(Caps & ASTReader::ARR_ConfigurationMismatch); 2475 case ASTReader::HadErrors: return true; 2476 case ASTReader::Success: return false; 2477 } 2478 2479 llvm_unreachable("unknown ASTReadResult"); 2480 } 2481 2482 ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( 2483 BitstreamCursor &Stream, unsigned ClientLoadCapabilities, 2484 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener, 2485 std::string &SuggestedPredefines) { 2486 if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) { 2487 // FIXME this drops errors on the floor. 2488 consumeError(std::move(Err)); 2489 return Failure; 2490 } 2491 2492 // Read all of the records in the options block. 2493 RecordData Record; 2494 ASTReadResult Result = Success; 2495 while (true) { 2496 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2497 if (!MaybeEntry) { 2498 // FIXME this drops errors on the floor. 2499 consumeError(MaybeEntry.takeError()); 2500 return Failure; 2501 } 2502 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2503 2504 switch (Entry.Kind) { 2505 case llvm::BitstreamEntry::Error: 2506 case llvm::BitstreamEntry::SubBlock: 2507 return Failure; 2508 2509 case llvm::BitstreamEntry::EndBlock: 2510 return Result; 2511 2512 case llvm::BitstreamEntry::Record: 2513 // The interesting case. 2514 break; 2515 } 2516 2517 // Read and process a record. 2518 Record.clear(); 2519 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 2520 if (!MaybeRecordType) { 2521 // FIXME this drops errors on the floor. 2522 consumeError(MaybeRecordType.takeError()); 2523 return Failure; 2524 } 2525 switch ((OptionsRecordTypes)MaybeRecordType.get()) { 2526 case LANGUAGE_OPTIONS: { 2527 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2528 if (ParseLanguageOptions(Record, Complain, Listener, 2529 AllowCompatibleConfigurationMismatch)) 2530 Result = ConfigurationMismatch; 2531 break; 2532 } 2533 2534 case TARGET_OPTIONS: { 2535 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2536 if (ParseTargetOptions(Record, Complain, Listener, 2537 AllowCompatibleConfigurationMismatch)) 2538 Result = ConfigurationMismatch; 2539 break; 2540 } 2541 2542 case FILE_SYSTEM_OPTIONS: { 2543 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2544 if (!AllowCompatibleConfigurationMismatch && 2545 ParseFileSystemOptions(Record, Complain, Listener)) 2546 Result = ConfigurationMismatch; 2547 break; 2548 } 2549 2550 case HEADER_SEARCH_OPTIONS: { 2551 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2552 if (!AllowCompatibleConfigurationMismatch && 2553 ParseHeaderSearchOptions(Record, Complain, Listener)) 2554 Result = ConfigurationMismatch; 2555 break; 2556 } 2557 2558 case PREPROCESSOR_OPTIONS: 2559 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2560 if (!AllowCompatibleConfigurationMismatch && 2561 ParsePreprocessorOptions(Record, Complain, Listener, 2562 SuggestedPredefines)) 2563 Result = ConfigurationMismatch; 2564 break; 2565 } 2566 } 2567 } 2568 2569 ASTReader::ASTReadResult 2570 ASTReader::ReadControlBlock(ModuleFile &F, 2571 SmallVectorImpl<ImportedModule> &Loaded, 2572 const ModuleFile *ImportedBy, 2573 unsigned ClientLoadCapabilities) { 2574 BitstreamCursor &Stream = F.Stream; 2575 2576 if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) { 2577 Error(std::move(Err)); 2578 return Failure; 2579 } 2580 2581 // Lambda to read the unhashed control block the first time it's called. 2582 // 2583 // For PCM files, the unhashed control block cannot be read until after the 2584 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still 2585 // need to look ahead before reading the IMPORTS record. For consistency, 2586 // this block is always read somehow (see BitstreamEntry::EndBlock). 2587 bool HasReadUnhashedControlBlock = false; 2588 auto readUnhashedControlBlockOnce = [&]() { 2589 if (!HasReadUnhashedControlBlock) { 2590 HasReadUnhashedControlBlock = true; 2591 if (ASTReadResult Result = 2592 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities)) 2593 return Result; 2594 } 2595 return Success; 2596 }; 2597 2598 // Read all of the records and blocks in the control block. 2599 RecordData Record; 2600 unsigned NumInputs = 0; 2601 unsigned NumUserInputs = 0; 2602 StringRef BaseDirectoryAsWritten; 2603 while (true) { 2604 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2605 if (!MaybeEntry) { 2606 Error(MaybeEntry.takeError()); 2607 return Failure; 2608 } 2609 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2610 2611 switch (Entry.Kind) { 2612 case llvm::BitstreamEntry::Error: 2613 Error("malformed block record in AST file"); 2614 return Failure; 2615 case llvm::BitstreamEntry::EndBlock: { 2616 // Validate the module before returning. This call catches an AST with 2617 // no module name and no imports. 2618 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2619 return Result; 2620 2621 // Validate input files. 2622 const HeaderSearchOptions &HSOpts = 2623 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 2624 2625 // All user input files reside at the index range [0, NumUserInputs), and 2626 // system input files reside at [NumUserInputs, NumInputs). For explicitly 2627 // loaded module files, ignore missing inputs. 2628 if (!DisableValidation && F.Kind != MK_ExplicitModule && 2629 F.Kind != MK_PrebuiltModule) { 2630 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 2631 2632 // If we are reading a module, we will create a verification timestamp, 2633 // so we verify all input files. Otherwise, verify only user input 2634 // files. 2635 2636 unsigned N = NumUserInputs; 2637 if (ValidateSystemInputs || 2638 (HSOpts.ModulesValidateOncePerBuildSession && 2639 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp && 2640 F.Kind == MK_ImplicitModule)) 2641 N = NumInputs; 2642 2643 for (unsigned I = 0; I < N; ++I) { 2644 InputFile IF = getInputFile(F, I+1, Complain); 2645 if (!IF.getFile() || IF.isOutOfDate()) 2646 return OutOfDate; 2647 } 2648 } 2649 2650 if (Listener) 2651 Listener->visitModuleFile(F.FileName, F.Kind); 2652 2653 if (Listener && Listener->needsInputFileVisitation()) { 2654 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs 2655 : NumUserInputs; 2656 for (unsigned I = 0; I < N; ++I) { 2657 bool IsSystem = I >= NumUserInputs; 2658 InputFileInfo FI = readInputFileInfo(F, I+1); 2659 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden, 2660 F.Kind == MK_ExplicitModule || 2661 F.Kind == MK_PrebuiltModule); 2662 } 2663 } 2664 2665 return Success; 2666 } 2667 2668 case llvm::BitstreamEntry::SubBlock: 2669 switch (Entry.ID) { 2670 case INPUT_FILES_BLOCK_ID: 2671 F.InputFilesCursor = Stream; 2672 if (llvm::Error Err = Stream.SkipBlock()) { 2673 Error(std::move(Err)); 2674 return Failure; 2675 } 2676 if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) { 2677 Error("malformed block record in AST file"); 2678 return Failure; 2679 } 2680 continue; 2681 2682 case OPTIONS_BLOCK_ID: 2683 // If we're reading the first module for this group, check its options 2684 // are compatible with ours. For modules it imports, no further checking 2685 // is required, because we checked them when we built it. 2686 if (Listener && !ImportedBy) { 2687 // Should we allow the configuration of the module file to differ from 2688 // the configuration of the current translation unit in a compatible 2689 // way? 2690 // 2691 // FIXME: Allow this for files explicitly specified with -include-pch. 2692 bool AllowCompatibleConfigurationMismatch = 2693 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 2694 2695 ASTReadResult Result = 2696 ReadOptionsBlock(Stream, ClientLoadCapabilities, 2697 AllowCompatibleConfigurationMismatch, *Listener, 2698 SuggestedPredefines); 2699 if (Result == Failure) { 2700 Error("malformed block record in AST file"); 2701 return Result; 2702 } 2703 2704 if (DisableValidation || 2705 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 2706 Result = Success; 2707 2708 // If we can't load the module, exit early since we likely 2709 // will rebuild the module anyway. The stream may be in the 2710 // middle of a block. 2711 if (Result != Success) 2712 return Result; 2713 } else if (llvm::Error Err = Stream.SkipBlock()) { 2714 Error(std::move(Err)); 2715 return Failure; 2716 } 2717 continue; 2718 2719 default: 2720 if (llvm::Error Err = Stream.SkipBlock()) { 2721 Error(std::move(Err)); 2722 return Failure; 2723 } 2724 continue; 2725 } 2726 2727 case llvm::BitstreamEntry::Record: 2728 // The interesting case. 2729 break; 2730 } 2731 2732 // Read and process a record. 2733 Record.clear(); 2734 StringRef Blob; 2735 Expected<unsigned> MaybeRecordType = 2736 Stream.readRecord(Entry.ID, Record, &Blob); 2737 if (!MaybeRecordType) { 2738 Error(MaybeRecordType.takeError()); 2739 return Failure; 2740 } 2741 switch ((ControlRecordTypes)MaybeRecordType.get()) { 2742 case METADATA: { 2743 if (Record[0] != VERSION_MAJOR && !DisableValidation) { 2744 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2745 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old 2746 : diag::err_pch_version_too_new); 2747 return VersionMismatch; 2748 } 2749 2750 bool hasErrors = Record[7]; 2751 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) { 2752 Diag(diag::err_pch_with_compiler_errors); 2753 return HadErrors; 2754 } 2755 if (hasErrors) { 2756 Diags.ErrorOccurred = true; 2757 Diags.UncompilableErrorOccurred = true; 2758 Diags.UnrecoverableErrorOccurred = true; 2759 } 2760 2761 F.RelocatablePCH = Record[4]; 2762 // Relative paths in a relocatable PCH are relative to our sysroot. 2763 if (F.RelocatablePCH) 2764 F.BaseDirectory = isysroot.empty() ? "/" : isysroot; 2765 2766 F.HasTimestamps = Record[5]; 2767 2768 F.PCHHasObjectFile = Record[6]; 2769 2770 const std::string &CurBranch = getClangFullRepositoryVersion(); 2771 StringRef ASTBranch = Blob; 2772 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) { 2773 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2774 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch; 2775 return VersionMismatch; 2776 } 2777 break; 2778 } 2779 2780 case IMPORTS: { 2781 // Validate the AST before processing any imports (otherwise, untangling 2782 // them can be error-prone and expensive). A module will have a name and 2783 // will already have been validated, but this catches the PCH case. 2784 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2785 return Result; 2786 2787 // Load each of the imported PCH files. 2788 unsigned Idx = 0, N = Record.size(); 2789 while (Idx < N) { 2790 // Read information about the AST file. 2791 ModuleKind ImportedKind = (ModuleKind)Record[Idx++]; 2792 // The import location will be the local one for now; we will adjust 2793 // all import locations of module imports after the global source 2794 // location info are setup, in ReadAST. 2795 SourceLocation ImportLoc = 2796 ReadUntranslatedSourceLocation(Record[Idx++]); 2797 off_t StoredSize = (off_t)Record[Idx++]; 2798 time_t StoredModTime = (time_t)Record[Idx++]; 2799 auto FirstSignatureByte = Record.begin() + Idx; 2800 ASTFileSignature StoredSignature = ASTFileSignature::create( 2801 FirstSignatureByte, FirstSignatureByte + ASTFileSignature::size); 2802 Idx += ASTFileSignature::size; 2803 2804 std::string ImportedName = ReadString(Record, Idx); 2805 std::string ImportedFile; 2806 2807 // For prebuilt and explicit modules first consult the file map for 2808 // an override. Note that here we don't search prebuilt module 2809 // directories, only the explicit name to file mappings. Also, we will 2810 // still verify the size/signature making sure it is essentially the 2811 // same file but perhaps in a different location. 2812 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule) 2813 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName( 2814 ImportedName, /*FileMapOnly*/ true); 2815 2816 if (ImportedFile.empty()) 2817 // Use BaseDirectoryAsWritten to ensure we use the same path in the 2818 // ModuleCache as when writing. 2819 ImportedFile = ReadPath(BaseDirectoryAsWritten, Record, Idx); 2820 else 2821 SkipPath(Record, Idx); 2822 2823 // If our client can't cope with us being out of date, we can't cope with 2824 // our dependency being missing. 2825 unsigned Capabilities = ClientLoadCapabilities; 2826 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2827 Capabilities &= ~ARR_Missing; 2828 2829 // Load the AST file. 2830 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, 2831 Loaded, StoredSize, StoredModTime, 2832 StoredSignature, Capabilities); 2833 2834 // If we diagnosed a problem, produce a backtrace. 2835 if (isDiagnosedResult(Result, Capabilities)) 2836 Diag(diag::note_module_file_imported_by) 2837 << F.FileName << !F.ModuleName.empty() << F.ModuleName; 2838 2839 switch (Result) { 2840 case Failure: return Failure; 2841 // If we have to ignore the dependency, we'll have to ignore this too. 2842 case Missing: 2843 case OutOfDate: return OutOfDate; 2844 case VersionMismatch: return VersionMismatch; 2845 case ConfigurationMismatch: return ConfigurationMismatch; 2846 case HadErrors: return HadErrors; 2847 case Success: break; 2848 } 2849 } 2850 break; 2851 } 2852 2853 case ORIGINAL_FILE: 2854 F.OriginalSourceFileID = FileID::get(Record[0]); 2855 F.ActualOriginalSourceFileName = std::string(Blob); 2856 F.OriginalSourceFileName = F.ActualOriginalSourceFileName; 2857 ResolveImportedPath(F, F.OriginalSourceFileName); 2858 break; 2859 2860 case ORIGINAL_FILE_ID: 2861 F.OriginalSourceFileID = FileID::get(Record[0]); 2862 break; 2863 2864 case ORIGINAL_PCH_DIR: 2865 F.OriginalDir = std::string(Blob); 2866 break; 2867 2868 case MODULE_NAME: 2869 F.ModuleName = std::string(Blob); 2870 Diag(diag::remark_module_import) 2871 << F.ModuleName << F.FileName << (ImportedBy ? true : false) 2872 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 2873 if (Listener) 2874 Listener->ReadModuleName(F.ModuleName); 2875 2876 // Validate the AST as soon as we have a name so we can exit early on 2877 // failure. 2878 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2879 return Result; 2880 2881 break; 2882 2883 case MODULE_DIRECTORY: { 2884 // Save the BaseDirectory as written in the PCM for computing the module 2885 // filename for the ModuleCache. 2886 BaseDirectoryAsWritten = Blob; 2887 assert(!F.ModuleName.empty() && 2888 "MODULE_DIRECTORY found before MODULE_NAME"); 2889 // If we've already loaded a module map file covering this module, we may 2890 // have a better path for it (relative to the current build). 2891 Module *M = PP.getHeaderSearchInfo().lookupModule( 2892 F.ModuleName, /*AllowSearch*/ true, 2893 /*AllowExtraModuleMapSearch*/ true); 2894 if (M && M->Directory) { 2895 // If we're implicitly loading a module, the base directory can't 2896 // change between the build and use. 2897 // Don't emit module relocation error if we have -fno-validate-pch 2898 if (!PP.getPreprocessorOpts().DisablePCHValidation && 2899 F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) { 2900 auto BuildDir = PP.getFileManager().getDirectory(Blob); 2901 if (!BuildDir || *BuildDir != M->Directory) { 2902 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2903 Diag(diag::err_imported_module_relocated) 2904 << F.ModuleName << Blob << M->Directory->getName(); 2905 return OutOfDate; 2906 } 2907 } 2908 F.BaseDirectory = std::string(M->Directory->getName()); 2909 } else { 2910 F.BaseDirectory = std::string(Blob); 2911 } 2912 break; 2913 } 2914 2915 case MODULE_MAP_FILE: 2916 if (ASTReadResult Result = 2917 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities)) 2918 return Result; 2919 break; 2920 2921 case INPUT_FILE_OFFSETS: 2922 NumInputs = Record[0]; 2923 NumUserInputs = Record[1]; 2924 F.InputFileOffsets = 2925 (const llvm::support::unaligned_uint64_t *)Blob.data(); 2926 F.InputFilesLoaded.resize(NumInputs); 2927 F.NumUserInputFiles = NumUserInputs; 2928 break; 2929 } 2930 } 2931 } 2932 2933 ASTReader::ASTReadResult 2934 ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 2935 BitstreamCursor &Stream = F.Stream; 2936 2937 if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID)) { 2938 Error(std::move(Err)); 2939 return Failure; 2940 } 2941 F.ASTBlockStartOffset = Stream.GetCurrentBitNo(); 2942 2943 // Read all of the records and blocks for the AST file. 2944 RecordData Record; 2945 while (true) { 2946 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2947 if (!MaybeEntry) { 2948 Error(MaybeEntry.takeError()); 2949 return Failure; 2950 } 2951 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2952 2953 switch (Entry.Kind) { 2954 case llvm::BitstreamEntry::Error: 2955 Error("error at end of module block in AST file"); 2956 return Failure; 2957 case llvm::BitstreamEntry::EndBlock: 2958 // Outside of C++, we do not store a lookup map for the translation unit. 2959 // Instead, mark it as needing a lookup map to be built if this module 2960 // contains any declarations lexically within it (which it always does!). 2961 // This usually has no cost, since we very rarely need the lookup map for 2962 // the translation unit outside C++. 2963 if (ASTContext *Ctx = ContextObj) { 2964 DeclContext *DC = Ctx->getTranslationUnitDecl(); 2965 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus) 2966 DC->setMustBuildLookupTable(); 2967 } 2968 2969 return Success; 2970 case llvm::BitstreamEntry::SubBlock: 2971 switch (Entry.ID) { 2972 case DECLTYPES_BLOCK_ID: 2973 // We lazily load the decls block, but we want to set up the 2974 // DeclsCursor cursor to point into it. Clone our current bitcode 2975 // cursor to it, enter the block and read the abbrevs in that block. 2976 // With the main cursor, we just skip over it. 2977 F.DeclsCursor = Stream; 2978 if (llvm::Error Err = Stream.SkipBlock()) { 2979 Error(std::move(Err)); 2980 return Failure; 2981 } 2982 if (ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID, 2983 &F.DeclsBlockStartOffset)) { 2984 Error("malformed block record in AST file"); 2985 return Failure; 2986 } 2987 break; 2988 2989 case PREPROCESSOR_BLOCK_ID: 2990 F.MacroCursor = Stream; 2991 if (!PP.getExternalSource()) 2992 PP.setExternalSource(this); 2993 2994 if (llvm::Error Err = Stream.SkipBlock()) { 2995 Error(std::move(Err)); 2996 return Failure; 2997 } 2998 if (ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) { 2999 Error("malformed block record in AST file"); 3000 return Failure; 3001 } 3002 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo(); 3003 break; 3004 3005 case PREPROCESSOR_DETAIL_BLOCK_ID: 3006 F.PreprocessorDetailCursor = Stream; 3007 3008 if (llvm::Error Err = Stream.SkipBlock()) { 3009 Error(std::move(Err)); 3010 return Failure; 3011 } 3012 if (ReadBlockAbbrevs(F.PreprocessorDetailCursor, 3013 PREPROCESSOR_DETAIL_BLOCK_ID)) { 3014 Error("malformed preprocessor detail record in AST file"); 3015 return Failure; 3016 } 3017 F.PreprocessorDetailStartOffset 3018 = F.PreprocessorDetailCursor.GetCurrentBitNo(); 3019 3020 if (!PP.getPreprocessingRecord()) 3021 PP.createPreprocessingRecord(); 3022 if (!PP.getPreprocessingRecord()->getExternalSource()) 3023 PP.getPreprocessingRecord()->SetExternalSource(*this); 3024 break; 3025 3026 case SOURCE_MANAGER_BLOCK_ID: 3027 if (ReadSourceManagerBlock(F)) 3028 return Failure; 3029 break; 3030 3031 case SUBMODULE_BLOCK_ID: 3032 if (ASTReadResult Result = 3033 ReadSubmoduleBlock(F, ClientLoadCapabilities)) 3034 return Result; 3035 break; 3036 3037 case COMMENTS_BLOCK_ID: { 3038 BitstreamCursor C = Stream; 3039 3040 if (llvm::Error Err = Stream.SkipBlock()) { 3041 Error(std::move(Err)); 3042 return Failure; 3043 } 3044 if (ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) { 3045 Error("malformed comments block in AST file"); 3046 return Failure; 3047 } 3048 CommentsCursors.push_back(std::make_pair(C, &F)); 3049 break; 3050 } 3051 3052 default: 3053 if (llvm::Error Err = Stream.SkipBlock()) { 3054 Error(std::move(Err)); 3055 return Failure; 3056 } 3057 break; 3058 } 3059 continue; 3060 3061 case llvm::BitstreamEntry::Record: 3062 // The interesting case. 3063 break; 3064 } 3065 3066 // Read and process a record. 3067 Record.clear(); 3068 StringRef Blob; 3069 Expected<unsigned> MaybeRecordType = 3070 Stream.readRecord(Entry.ID, Record, &Blob); 3071 if (!MaybeRecordType) { 3072 Error(MaybeRecordType.takeError()); 3073 return Failure; 3074 } 3075 ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get(); 3076 3077 // If we're not loading an AST context, we don't care about most records. 3078 if (!ContextObj) { 3079 switch (RecordType) { 3080 case IDENTIFIER_TABLE: 3081 case IDENTIFIER_OFFSET: 3082 case INTERESTING_IDENTIFIERS: 3083 case STATISTICS: 3084 case PP_CONDITIONAL_STACK: 3085 case PP_COUNTER_VALUE: 3086 case SOURCE_LOCATION_OFFSETS: 3087 case MODULE_OFFSET_MAP: 3088 case SOURCE_MANAGER_LINE_TABLE: 3089 case SOURCE_LOCATION_PRELOADS: 3090 case PPD_ENTITIES_OFFSETS: 3091 case HEADER_SEARCH_TABLE: 3092 case IMPORTED_MODULES: 3093 case MACRO_OFFSET: 3094 break; 3095 default: 3096 continue; 3097 } 3098 } 3099 3100 switch (RecordType) { 3101 default: // Default behavior: ignore. 3102 break; 3103 3104 case TYPE_OFFSET: { 3105 if (F.LocalNumTypes != 0) { 3106 Error("duplicate TYPE_OFFSET record in AST file"); 3107 return Failure; 3108 } 3109 F.TypeOffsets = reinterpret_cast<const UnderalignedInt64 *>(Blob.data()); 3110 F.LocalNumTypes = Record[0]; 3111 unsigned LocalBaseTypeIndex = Record[1]; 3112 F.BaseTypeIndex = getTotalNumTypes(); 3113 3114 if (F.LocalNumTypes > 0) { 3115 // Introduce the global -> local mapping for types within this module. 3116 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F)); 3117 3118 // Introduce the local -> global mapping for types within this module. 3119 F.TypeRemap.insertOrReplace( 3120 std::make_pair(LocalBaseTypeIndex, 3121 F.BaseTypeIndex - LocalBaseTypeIndex)); 3122 3123 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes); 3124 } 3125 break; 3126 } 3127 3128 case DECL_OFFSET: { 3129 if (F.LocalNumDecls != 0) { 3130 Error("duplicate DECL_OFFSET record in AST file"); 3131 return Failure; 3132 } 3133 F.DeclOffsets = (const DeclOffset *)Blob.data(); 3134 F.LocalNumDecls = Record[0]; 3135 unsigned LocalBaseDeclID = Record[1]; 3136 F.BaseDeclID = getTotalNumDecls(); 3137 3138 if (F.LocalNumDecls > 0) { 3139 // Introduce the global -> local mapping for declarations within this 3140 // module. 3141 GlobalDeclMap.insert( 3142 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F)); 3143 3144 // Introduce the local -> global mapping for declarations within this 3145 // module. 3146 F.DeclRemap.insertOrReplace( 3147 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID)); 3148 3149 // Introduce the global -> local mapping for declarations within this 3150 // module. 3151 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID; 3152 3153 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls); 3154 } 3155 break; 3156 } 3157 3158 case TU_UPDATE_LEXICAL: { 3159 DeclContext *TU = ContextObj->getTranslationUnitDecl(); 3160 LexicalContents Contents( 3161 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 3162 Blob.data()), 3163 static_cast<unsigned int>(Blob.size() / 4)); 3164 TULexicalDecls.push_back(std::make_pair(&F, Contents)); 3165 TU->setHasExternalLexicalStorage(true); 3166 break; 3167 } 3168 3169 case UPDATE_VISIBLE: { 3170 unsigned Idx = 0; 3171 serialization::DeclID ID = ReadDeclID(F, Record, Idx); 3172 auto *Data = (const unsigned char*)Blob.data(); 3173 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data}); 3174 // If we've already loaded the decl, perform the updates when we finish 3175 // loading this block. 3176 if (Decl *D = GetExistingDecl(ID)) 3177 PendingUpdateRecords.push_back( 3178 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3179 break; 3180 } 3181 3182 case IDENTIFIER_TABLE: 3183 F.IdentifierTableData = Blob.data(); 3184 if (Record[0]) { 3185 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create( 3186 (const unsigned char *)F.IdentifierTableData + Record[0], 3187 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t), 3188 (const unsigned char *)F.IdentifierTableData, 3189 ASTIdentifierLookupTrait(*this, F)); 3190 3191 PP.getIdentifierTable().setExternalIdentifierLookup(this); 3192 } 3193 break; 3194 3195 case IDENTIFIER_OFFSET: { 3196 if (F.LocalNumIdentifiers != 0) { 3197 Error("duplicate IDENTIFIER_OFFSET record in AST file"); 3198 return Failure; 3199 } 3200 F.IdentifierOffsets = (const uint32_t *)Blob.data(); 3201 F.LocalNumIdentifiers = Record[0]; 3202 unsigned LocalBaseIdentifierID = Record[1]; 3203 F.BaseIdentifierID = getTotalNumIdentifiers(); 3204 3205 if (F.LocalNumIdentifiers > 0) { 3206 // Introduce the global -> local mapping for identifiers within this 3207 // module. 3208 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1, 3209 &F)); 3210 3211 // Introduce the local -> global mapping for identifiers within this 3212 // module. 3213 F.IdentifierRemap.insertOrReplace( 3214 std::make_pair(LocalBaseIdentifierID, 3215 F.BaseIdentifierID - LocalBaseIdentifierID)); 3216 3217 IdentifiersLoaded.resize(IdentifiersLoaded.size() 3218 + F.LocalNumIdentifiers); 3219 } 3220 break; 3221 } 3222 3223 case INTERESTING_IDENTIFIERS: 3224 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end()); 3225 break; 3226 3227 case EAGERLY_DESERIALIZED_DECLS: 3228 // FIXME: Skip reading this record if our ASTConsumer doesn't care 3229 // about "interesting" decls (for instance, if we're building a module). 3230 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3231 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3232 break; 3233 3234 case MODULAR_CODEGEN_DECLS: 3235 // FIXME: Skip reading this record if our ASTConsumer doesn't care about 3236 // them (ie: if we're not codegenerating this module). 3237 if (F.Kind == MK_MainFile || 3238 getContext().getLangOpts().BuildingPCHWithObjectFile) 3239 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3240 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3241 break; 3242 3243 case SPECIAL_TYPES: 3244 if (SpecialTypes.empty()) { 3245 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3246 SpecialTypes.push_back(getGlobalTypeID(F, Record[I])); 3247 break; 3248 } 3249 3250 if (SpecialTypes.size() != Record.size()) { 3251 Error("invalid special-types record"); 3252 return Failure; 3253 } 3254 3255 for (unsigned I = 0, N = Record.size(); I != N; ++I) { 3256 serialization::TypeID ID = getGlobalTypeID(F, Record[I]); 3257 if (!SpecialTypes[I]) 3258 SpecialTypes[I] = ID; 3259 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate 3260 // merge step? 3261 } 3262 break; 3263 3264 case STATISTICS: 3265 TotalNumStatements += Record[0]; 3266 TotalNumMacros += Record[1]; 3267 TotalLexicalDeclContexts += Record[2]; 3268 TotalVisibleDeclContexts += Record[3]; 3269 break; 3270 3271 case UNUSED_FILESCOPED_DECLS: 3272 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3273 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I])); 3274 break; 3275 3276 case DELEGATING_CTORS: 3277 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3278 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I])); 3279 break; 3280 3281 case WEAK_UNDECLARED_IDENTIFIERS: 3282 if (Record.size() % 4 != 0) { 3283 Error("invalid weak identifiers record"); 3284 return Failure; 3285 } 3286 3287 // FIXME: Ignore weak undeclared identifiers from non-original PCH 3288 // files. This isn't the way to do it :) 3289 WeakUndeclaredIdentifiers.clear(); 3290 3291 // Translate the weak, undeclared identifiers into global IDs. 3292 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) { 3293 WeakUndeclaredIdentifiers.push_back( 3294 getGlobalIdentifierID(F, Record[I++])); 3295 WeakUndeclaredIdentifiers.push_back( 3296 getGlobalIdentifierID(F, Record[I++])); 3297 WeakUndeclaredIdentifiers.push_back( 3298 ReadSourceLocation(F, Record, I).getRawEncoding()); 3299 WeakUndeclaredIdentifiers.push_back(Record[I++]); 3300 } 3301 break; 3302 3303 case SELECTOR_OFFSETS: { 3304 F.SelectorOffsets = (const uint32_t *)Blob.data(); 3305 F.LocalNumSelectors = Record[0]; 3306 unsigned LocalBaseSelectorID = Record[1]; 3307 F.BaseSelectorID = getTotalNumSelectors(); 3308 3309 if (F.LocalNumSelectors > 0) { 3310 // Introduce the global -> local mapping for selectors within this 3311 // module. 3312 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F)); 3313 3314 // Introduce the local -> global mapping for selectors within this 3315 // module. 3316 F.SelectorRemap.insertOrReplace( 3317 std::make_pair(LocalBaseSelectorID, 3318 F.BaseSelectorID - LocalBaseSelectorID)); 3319 3320 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors); 3321 } 3322 break; 3323 } 3324 3325 case METHOD_POOL: 3326 F.SelectorLookupTableData = (const unsigned char *)Blob.data(); 3327 if (Record[0]) 3328 F.SelectorLookupTable 3329 = ASTSelectorLookupTable::Create( 3330 F.SelectorLookupTableData + Record[0], 3331 F.SelectorLookupTableData, 3332 ASTSelectorLookupTrait(*this, F)); 3333 TotalNumMethodPoolEntries += Record[1]; 3334 break; 3335 3336 case REFERENCED_SELECTOR_POOL: 3337 if (!Record.empty()) { 3338 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) { 3339 ReferencedSelectorsData.push_back(getGlobalSelectorID(F, 3340 Record[Idx++])); 3341 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx). 3342 getRawEncoding()); 3343 } 3344 } 3345 break; 3346 3347 case PP_CONDITIONAL_STACK: 3348 if (!Record.empty()) { 3349 unsigned Idx = 0, End = Record.size() - 1; 3350 bool ReachedEOFWhileSkipping = Record[Idx++]; 3351 llvm::Optional<Preprocessor::PreambleSkipInfo> SkipInfo; 3352 if (ReachedEOFWhileSkipping) { 3353 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx); 3354 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx); 3355 bool FoundNonSkipPortion = Record[Idx++]; 3356 bool FoundElse = Record[Idx++]; 3357 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx); 3358 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion, 3359 FoundElse, ElseLoc); 3360 } 3361 SmallVector<PPConditionalInfo, 4> ConditionalStack; 3362 while (Idx < End) { 3363 auto Loc = ReadSourceLocation(F, Record, Idx); 3364 bool WasSkipping = Record[Idx++]; 3365 bool FoundNonSkip = Record[Idx++]; 3366 bool FoundElse = Record[Idx++]; 3367 ConditionalStack.push_back( 3368 {Loc, WasSkipping, FoundNonSkip, FoundElse}); 3369 } 3370 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo); 3371 } 3372 break; 3373 3374 case PP_COUNTER_VALUE: 3375 if (!Record.empty() && Listener) 3376 Listener->ReadCounter(F, Record[0]); 3377 break; 3378 3379 case FILE_SORTED_DECLS: 3380 F.FileSortedDecls = (const DeclID *)Blob.data(); 3381 F.NumFileSortedDecls = Record[0]; 3382 break; 3383 3384 case SOURCE_LOCATION_OFFSETS: { 3385 F.SLocEntryOffsets = (const uint32_t *)Blob.data(); 3386 F.LocalNumSLocEntries = Record[0]; 3387 unsigned SLocSpaceSize = Record[1]; 3388 F.SLocEntryOffsetsBase = Record[2] + F.SourceManagerBlockStartOffset; 3389 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) = 3390 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries, 3391 SLocSpaceSize); 3392 if (!F.SLocEntryBaseID) { 3393 Error("ran out of source locations"); 3394 break; 3395 } 3396 // Make our entry in the range map. BaseID is negative and growing, so 3397 // we invert it. Because we invert it, though, we need the other end of 3398 // the range. 3399 unsigned RangeStart = 3400 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1; 3401 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F)); 3402 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset); 3403 3404 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing. 3405 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0); 3406 GlobalSLocOffsetMap.insert( 3407 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset 3408 - SLocSpaceSize,&F)); 3409 3410 // Initialize the remapping table. 3411 // Invalid stays invalid. 3412 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0)); 3413 // This module. Base was 2 when being compiled. 3414 F.SLocRemap.insertOrReplace(std::make_pair(2U, 3415 static_cast<int>(F.SLocEntryBaseOffset - 2))); 3416 3417 TotalNumSLocEntries += F.LocalNumSLocEntries; 3418 break; 3419 } 3420 3421 case MODULE_OFFSET_MAP: 3422 F.ModuleOffsetMap = Blob; 3423 break; 3424 3425 case SOURCE_MANAGER_LINE_TABLE: 3426 if (ParseLineTable(F, Record)) { 3427 Error("malformed SOURCE_MANAGER_LINE_TABLE in AST file"); 3428 return Failure; 3429 } 3430 break; 3431 3432 case SOURCE_LOCATION_PRELOADS: { 3433 // Need to transform from the local view (1-based IDs) to the global view, 3434 // which is based off F.SLocEntryBaseID. 3435 if (!F.PreloadSLocEntries.empty()) { 3436 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file"); 3437 return Failure; 3438 } 3439 3440 F.PreloadSLocEntries.swap(Record); 3441 break; 3442 } 3443 3444 case EXT_VECTOR_DECLS: 3445 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3446 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I])); 3447 break; 3448 3449 case VTABLE_USES: 3450 if (Record.size() % 3 != 0) { 3451 Error("Invalid VTABLE_USES record"); 3452 return Failure; 3453 } 3454 3455 // Later tables overwrite earlier ones. 3456 // FIXME: Modules will have some trouble with this. This is clearly not 3457 // the right way to do this. 3458 VTableUses.clear(); 3459 3460 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) { 3461 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++])); 3462 VTableUses.push_back( 3463 ReadSourceLocation(F, Record, Idx).getRawEncoding()); 3464 VTableUses.push_back(Record[Idx++]); 3465 } 3466 break; 3467 3468 case PENDING_IMPLICIT_INSTANTIATIONS: 3469 if (PendingInstantiations.size() % 2 != 0) { 3470 Error("Invalid existing PendingInstantiations"); 3471 return Failure; 3472 } 3473 3474 if (Record.size() % 2 != 0) { 3475 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block"); 3476 return Failure; 3477 } 3478 3479 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3480 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++])); 3481 PendingInstantiations.push_back( 3482 ReadSourceLocation(F, Record, I).getRawEncoding()); 3483 } 3484 break; 3485 3486 case SEMA_DECL_REFS: 3487 if (Record.size() != 3) { 3488 Error("Invalid SEMA_DECL_REFS block"); 3489 return Failure; 3490 } 3491 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3492 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3493 break; 3494 3495 case PPD_ENTITIES_OFFSETS: { 3496 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data(); 3497 assert(Blob.size() % sizeof(PPEntityOffset) == 0); 3498 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset); 3499 3500 unsigned LocalBasePreprocessedEntityID = Record[0]; 3501 3502 unsigned StartingID; 3503 if (!PP.getPreprocessingRecord()) 3504 PP.createPreprocessingRecord(); 3505 if (!PP.getPreprocessingRecord()->getExternalSource()) 3506 PP.getPreprocessingRecord()->SetExternalSource(*this); 3507 StartingID 3508 = PP.getPreprocessingRecord() 3509 ->allocateLoadedEntities(F.NumPreprocessedEntities); 3510 F.BasePreprocessedEntityID = StartingID; 3511 3512 if (F.NumPreprocessedEntities > 0) { 3513 // Introduce the global -> local mapping for preprocessed entities in 3514 // this module. 3515 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F)); 3516 3517 // Introduce the local -> global mapping for preprocessed entities in 3518 // this module. 3519 F.PreprocessedEntityRemap.insertOrReplace( 3520 std::make_pair(LocalBasePreprocessedEntityID, 3521 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID)); 3522 } 3523 3524 break; 3525 } 3526 3527 case PPD_SKIPPED_RANGES: { 3528 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data(); 3529 assert(Blob.size() % sizeof(PPSkippedRange) == 0); 3530 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange); 3531 3532 if (!PP.getPreprocessingRecord()) 3533 PP.createPreprocessingRecord(); 3534 if (!PP.getPreprocessingRecord()->getExternalSource()) 3535 PP.getPreprocessingRecord()->SetExternalSource(*this); 3536 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord() 3537 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges); 3538 3539 if (F.NumPreprocessedSkippedRanges > 0) 3540 GlobalSkippedRangeMap.insert( 3541 std::make_pair(F.BasePreprocessedSkippedRangeID, &F)); 3542 break; 3543 } 3544 3545 case DECL_UPDATE_OFFSETS: 3546 if (Record.size() % 2 != 0) { 3547 Error("invalid DECL_UPDATE_OFFSETS block in AST file"); 3548 return Failure; 3549 } 3550 for (unsigned I = 0, N = Record.size(); I != N; I += 2) { 3551 GlobalDeclID ID = getGlobalDeclID(F, Record[I]); 3552 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1])); 3553 3554 // If we've already loaded the decl, perform the updates when we finish 3555 // loading this block. 3556 if (Decl *D = GetExistingDecl(ID)) 3557 PendingUpdateRecords.push_back( 3558 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3559 } 3560 break; 3561 3562 case OBJC_CATEGORIES_MAP: 3563 if (F.LocalNumObjCCategoriesInMap != 0) { 3564 Error("duplicate OBJC_CATEGORIES_MAP record in AST file"); 3565 return Failure; 3566 } 3567 3568 F.LocalNumObjCCategoriesInMap = Record[0]; 3569 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data(); 3570 break; 3571 3572 case OBJC_CATEGORIES: 3573 F.ObjCCategories.swap(Record); 3574 break; 3575 3576 case CUDA_SPECIAL_DECL_REFS: 3577 // Later tables overwrite earlier ones. 3578 // FIXME: Modules will have trouble with this. 3579 CUDASpecialDeclRefs.clear(); 3580 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3581 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3582 break; 3583 3584 case HEADER_SEARCH_TABLE: 3585 F.HeaderFileInfoTableData = Blob.data(); 3586 F.LocalNumHeaderFileInfos = Record[1]; 3587 if (Record[0]) { 3588 F.HeaderFileInfoTable 3589 = HeaderFileInfoLookupTable::Create( 3590 (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 3591 (const unsigned char *)F.HeaderFileInfoTableData, 3592 HeaderFileInfoTrait(*this, F, 3593 &PP.getHeaderSearchInfo(), 3594 Blob.data() + Record[2])); 3595 3596 PP.getHeaderSearchInfo().SetExternalSource(this); 3597 if (!PP.getHeaderSearchInfo().getExternalLookup()) 3598 PP.getHeaderSearchInfo().SetExternalLookup(this); 3599 } 3600 break; 3601 3602 case FP_PRAGMA_OPTIONS: 3603 // Later tables overwrite earlier ones. 3604 FPPragmaOptions.swap(Record); 3605 break; 3606 3607 case OPENCL_EXTENSIONS: 3608 for (unsigned I = 0, E = Record.size(); I != E; ) { 3609 auto Name = ReadString(Record, I); 3610 auto &Opt = OpenCLExtensions.OptMap[Name]; 3611 Opt.Supported = Record[I++] != 0; 3612 Opt.Enabled = Record[I++] != 0; 3613 Opt.Avail = Record[I++]; 3614 Opt.Core = Record[I++]; 3615 } 3616 break; 3617 3618 case OPENCL_EXTENSION_TYPES: 3619 for (unsigned I = 0, E = Record.size(); I != E;) { 3620 auto TypeID = static_cast<::TypeID>(Record[I++]); 3621 auto *Type = GetType(TypeID).getTypePtr(); 3622 auto NumExt = static_cast<unsigned>(Record[I++]); 3623 for (unsigned II = 0; II != NumExt; ++II) { 3624 auto Ext = ReadString(Record, I); 3625 OpenCLTypeExtMap[Type].insert(Ext); 3626 } 3627 } 3628 break; 3629 3630 case OPENCL_EXTENSION_DECLS: 3631 for (unsigned I = 0, E = Record.size(); I != E;) { 3632 auto DeclID = static_cast<::DeclID>(Record[I++]); 3633 auto *Decl = GetDecl(DeclID); 3634 auto NumExt = static_cast<unsigned>(Record[I++]); 3635 for (unsigned II = 0; II != NumExt; ++II) { 3636 auto Ext = ReadString(Record, I); 3637 OpenCLDeclExtMap[Decl].insert(Ext); 3638 } 3639 } 3640 break; 3641 3642 case TENTATIVE_DEFINITIONS: 3643 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3644 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 3645 break; 3646 3647 case KNOWN_NAMESPACES: 3648 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3649 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 3650 break; 3651 3652 case UNDEFINED_BUT_USED: 3653 if (UndefinedButUsed.size() % 2 != 0) { 3654 Error("Invalid existing UndefinedButUsed"); 3655 return Failure; 3656 } 3657 3658 if (Record.size() % 2 != 0) { 3659 Error("invalid undefined-but-used record"); 3660 return Failure; 3661 } 3662 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3663 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 3664 UndefinedButUsed.push_back( 3665 ReadSourceLocation(F, Record, I).getRawEncoding()); 3666 } 3667 break; 3668 3669 case DELETE_EXPRS_TO_ANALYZE: 3670 for (unsigned I = 0, N = Record.size(); I != N;) { 3671 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++])); 3672 const uint64_t Count = Record[I++]; 3673 DelayedDeleteExprs.push_back(Count); 3674 for (uint64_t C = 0; C < Count; ++C) { 3675 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding()); 3676 bool IsArrayForm = Record[I++] == 1; 3677 DelayedDeleteExprs.push_back(IsArrayForm); 3678 } 3679 } 3680 break; 3681 3682 case IMPORTED_MODULES: 3683 if (!F.isModule()) { 3684 // If we aren't loading a module (which has its own exports), make 3685 // all of the imported modules visible. 3686 // FIXME: Deal with macros-only imports. 3687 for (unsigned I = 0, N = Record.size(); I != N; /**/) { 3688 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]); 3689 SourceLocation Loc = ReadSourceLocation(F, Record, I); 3690 if (GlobalID) { 3691 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc)); 3692 if (DeserializationListener) 3693 DeserializationListener->ModuleImportRead(GlobalID, Loc); 3694 } 3695 } 3696 } 3697 break; 3698 3699 case MACRO_OFFSET: { 3700 if (F.LocalNumMacros != 0) { 3701 Error("duplicate MACRO_OFFSET record in AST file"); 3702 return Failure; 3703 } 3704 F.MacroOffsets = (const uint32_t *)Blob.data(); 3705 F.LocalNumMacros = Record[0]; 3706 unsigned LocalBaseMacroID = Record[1]; 3707 F.MacroOffsetsBase = Record[2] + F.ASTBlockStartOffset; 3708 F.BaseMacroID = getTotalNumMacros(); 3709 3710 if (F.LocalNumMacros > 0) { 3711 // Introduce the global -> local mapping for macros within this module. 3712 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 3713 3714 // Introduce the local -> global mapping for macros within this module. 3715 F.MacroRemap.insertOrReplace( 3716 std::make_pair(LocalBaseMacroID, 3717 F.BaseMacroID - LocalBaseMacroID)); 3718 3719 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 3720 } 3721 break; 3722 } 3723 3724 case LATE_PARSED_TEMPLATE: 3725 LateParsedTemplates.append(Record.begin(), Record.end()); 3726 break; 3727 3728 case OPTIMIZE_PRAGMA_OPTIONS: 3729 if (Record.size() != 1) { 3730 Error("invalid pragma optimize record"); 3731 return Failure; 3732 } 3733 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]); 3734 break; 3735 3736 case MSSTRUCT_PRAGMA_OPTIONS: 3737 if (Record.size() != 1) { 3738 Error("invalid pragma ms_struct record"); 3739 return Failure; 3740 } 3741 PragmaMSStructState = Record[0]; 3742 break; 3743 3744 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS: 3745 if (Record.size() != 2) { 3746 Error("invalid pragma ms_struct record"); 3747 return Failure; 3748 } 3749 PragmaMSPointersToMembersState = Record[0]; 3750 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]); 3751 break; 3752 3753 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES: 3754 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3755 UnusedLocalTypedefNameCandidates.push_back( 3756 getGlobalDeclID(F, Record[I])); 3757 break; 3758 3759 case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH: 3760 if (Record.size() != 1) { 3761 Error("invalid cuda pragma options record"); 3762 return Failure; 3763 } 3764 ForceCUDAHostDeviceDepth = Record[0]; 3765 break; 3766 3767 case PACK_PRAGMA_OPTIONS: { 3768 if (Record.size() < 3) { 3769 Error("invalid pragma pack record"); 3770 return Failure; 3771 } 3772 PragmaPackCurrentValue = Record[0]; 3773 PragmaPackCurrentLocation = ReadSourceLocation(F, Record[1]); 3774 unsigned NumStackEntries = Record[2]; 3775 unsigned Idx = 3; 3776 // Reset the stack when importing a new module. 3777 PragmaPackStack.clear(); 3778 for (unsigned I = 0; I < NumStackEntries; ++I) { 3779 PragmaPackStackEntry Entry; 3780 Entry.Value = Record[Idx++]; 3781 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3782 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3783 PragmaPackStrings.push_back(ReadString(Record, Idx)); 3784 Entry.SlotLabel = PragmaPackStrings.back(); 3785 PragmaPackStack.push_back(Entry); 3786 } 3787 break; 3788 } 3789 3790 case FLOAT_CONTROL_PRAGMA_OPTIONS: { 3791 if (Record.size() < 3) { 3792 Error("invalid pragma pack record"); 3793 return Failure; 3794 } 3795 FpPragmaCurrentValue = Record[0]; 3796 FpPragmaCurrentLocation = ReadSourceLocation(F, Record[1]); 3797 unsigned NumStackEntries = Record[2]; 3798 unsigned Idx = 3; 3799 // Reset the stack when importing a new module. 3800 FpPragmaStack.clear(); 3801 for (unsigned I = 0; I < NumStackEntries; ++I) { 3802 FpPragmaStackEntry Entry; 3803 Entry.Value = Record[Idx++]; 3804 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3805 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3806 FpPragmaStrings.push_back(ReadString(Record, Idx)); 3807 Entry.SlotLabel = FpPragmaStrings.back(); 3808 FpPragmaStack.push_back(Entry); 3809 } 3810 break; 3811 } 3812 3813 case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS: 3814 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3815 DeclsToCheckForDeferredDiags.push_back(getGlobalDeclID(F, Record[I])); 3816 break; 3817 } 3818 } 3819 } 3820 3821 void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const { 3822 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read"); 3823 3824 // Additional remapping information. 3825 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data(); 3826 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size(); 3827 F.ModuleOffsetMap = StringRef(); 3828 3829 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders. 3830 if (F.SLocRemap.find(0) == F.SLocRemap.end()) { 3831 F.SLocRemap.insert(std::make_pair(0U, 0)); 3832 F.SLocRemap.insert(std::make_pair(2U, 1)); 3833 } 3834 3835 // Continuous range maps we may be updating in our module. 3836 using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder; 3837 RemapBuilder SLocRemap(F.SLocRemap); 3838 RemapBuilder IdentifierRemap(F.IdentifierRemap); 3839 RemapBuilder MacroRemap(F.MacroRemap); 3840 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap); 3841 RemapBuilder SubmoduleRemap(F.SubmoduleRemap); 3842 RemapBuilder SelectorRemap(F.SelectorRemap); 3843 RemapBuilder DeclRemap(F.DeclRemap); 3844 RemapBuilder TypeRemap(F.TypeRemap); 3845 3846 while (Data < DataEnd) { 3847 // FIXME: Looking up dependency modules by filename is horrible. Let's 3848 // start fixing this with prebuilt, explicit and implicit modules and see 3849 // how it goes... 3850 using namespace llvm::support; 3851 ModuleKind Kind = static_cast<ModuleKind>( 3852 endian::readNext<uint8_t, little, unaligned>(Data)); 3853 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data); 3854 StringRef Name = StringRef((const char*)Data, Len); 3855 Data += Len; 3856 ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule || 3857 Kind == MK_ImplicitModule 3858 ? ModuleMgr.lookupByModuleName(Name) 3859 : ModuleMgr.lookupByFileName(Name)); 3860 if (!OM) { 3861 std::string Msg = 3862 "SourceLocation remap refers to unknown module, cannot find "; 3863 Msg.append(std::string(Name)); 3864 Error(Msg); 3865 return; 3866 } 3867 3868 uint32_t SLocOffset = 3869 endian::readNext<uint32_t, little, unaligned>(Data); 3870 uint32_t IdentifierIDOffset = 3871 endian::readNext<uint32_t, little, unaligned>(Data); 3872 uint32_t MacroIDOffset = 3873 endian::readNext<uint32_t, little, unaligned>(Data); 3874 uint32_t PreprocessedEntityIDOffset = 3875 endian::readNext<uint32_t, little, unaligned>(Data); 3876 uint32_t SubmoduleIDOffset = 3877 endian::readNext<uint32_t, little, unaligned>(Data); 3878 uint32_t SelectorIDOffset = 3879 endian::readNext<uint32_t, little, unaligned>(Data); 3880 uint32_t DeclIDOffset = 3881 endian::readNext<uint32_t, little, unaligned>(Data); 3882 uint32_t TypeIndexOffset = 3883 endian::readNext<uint32_t, little, unaligned>(Data); 3884 3885 uint32_t None = std::numeric_limits<uint32_t>::max(); 3886 3887 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset, 3888 RemapBuilder &Remap) { 3889 if (Offset != None) 3890 Remap.insert(std::make_pair(Offset, 3891 static_cast<int>(BaseOffset - Offset))); 3892 }; 3893 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap); 3894 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap); 3895 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap); 3896 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID, 3897 PreprocessedEntityRemap); 3898 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap); 3899 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap); 3900 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap); 3901 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap); 3902 3903 // Global -> local mappings. 3904 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset; 3905 } 3906 } 3907 3908 ASTReader::ASTReadResult 3909 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F, 3910 const ModuleFile *ImportedBy, 3911 unsigned ClientLoadCapabilities) { 3912 unsigned Idx = 0; 3913 F.ModuleMapPath = ReadPath(F, Record, Idx); 3914 3915 // Try to resolve ModuleName in the current header search context and 3916 // verify that it is found in the same module map file as we saved. If the 3917 // top-level AST file is a main file, skip this check because there is no 3918 // usable header search context. 3919 assert(!F.ModuleName.empty() && 3920 "MODULE_NAME should come before MODULE_MAP_FILE"); 3921 if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) { 3922 // An implicitly-loaded module file should have its module listed in some 3923 // module map file that we've already loaded. 3924 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName); 3925 auto &Map = PP.getHeaderSearchInfo().getModuleMap(); 3926 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr; 3927 // Don't emit module relocation error if we have -fno-validate-pch 3928 if (!PP.getPreprocessorOpts().DisablePCHValidation && !ModMap) { 3929 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) { 3930 if (auto *ASTFE = M ? M->getASTFile() : nullptr) { 3931 // This module was defined by an imported (explicit) module. 3932 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName 3933 << ASTFE->getName(); 3934 } else { 3935 // This module was built with a different module map. 3936 Diag(diag::err_imported_module_not_found) 3937 << F.ModuleName << F.FileName 3938 << (ImportedBy ? ImportedBy->FileName : "") << F.ModuleMapPath 3939 << !ImportedBy; 3940 // In case it was imported by a PCH, there's a chance the user is 3941 // just missing to include the search path to the directory containing 3942 // the modulemap. 3943 if (ImportedBy && ImportedBy->Kind == MK_PCH) 3944 Diag(diag::note_imported_by_pch_module_not_found) 3945 << llvm::sys::path::parent_path(F.ModuleMapPath); 3946 } 3947 } 3948 return OutOfDate; 3949 } 3950 3951 assert(M->Name == F.ModuleName && "found module with different name"); 3952 3953 // Check the primary module map file. 3954 auto StoredModMap = FileMgr.getFile(F.ModuleMapPath); 3955 if (!StoredModMap || *StoredModMap != ModMap) { 3956 assert(ModMap && "found module is missing module map file"); 3957 assert((ImportedBy || F.Kind == MK_ImplicitModule) && 3958 "top-level import should be verified"); 3959 bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy; 3960 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3961 Diag(diag::err_imported_module_modmap_changed) 3962 << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName) 3963 << ModMap->getName() << F.ModuleMapPath << NotImported; 3964 return OutOfDate; 3965 } 3966 3967 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps; 3968 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) { 3969 // FIXME: we should use input files rather than storing names. 3970 std::string Filename = ReadPath(F, Record, Idx); 3971 auto F = FileMgr.getFile(Filename, false, false); 3972 if (!F) { 3973 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3974 Error("could not find file '" + Filename +"' referenced by AST file"); 3975 return OutOfDate; 3976 } 3977 AdditionalStoredMaps.insert(*F); 3978 } 3979 3980 // Check any additional module map files (e.g. module.private.modulemap) 3981 // that are not in the pcm. 3982 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) { 3983 for (const FileEntry *ModMap : *AdditionalModuleMaps) { 3984 // Remove files that match 3985 // Note: SmallPtrSet::erase is really remove 3986 if (!AdditionalStoredMaps.erase(ModMap)) { 3987 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3988 Diag(diag::err_module_different_modmap) 3989 << F.ModuleName << /*new*/0 << ModMap->getName(); 3990 return OutOfDate; 3991 } 3992 } 3993 } 3994 3995 // Check any additional module map files that are in the pcm, but not 3996 // found in header search. Cases that match are already removed. 3997 for (const FileEntry *ModMap : AdditionalStoredMaps) { 3998 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3999 Diag(diag::err_module_different_modmap) 4000 << F.ModuleName << /*not new*/1 << ModMap->getName(); 4001 return OutOfDate; 4002 } 4003 } 4004 4005 if (Listener) 4006 Listener->ReadModuleMapFile(F.ModuleMapPath); 4007 return Success; 4008 } 4009 4010 /// Move the given method to the back of the global list of methods. 4011 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 4012 // Find the entry for this selector in the method pool. 4013 Sema::GlobalMethodPool::iterator Known 4014 = S.MethodPool.find(Method->getSelector()); 4015 if (Known == S.MethodPool.end()) 4016 return; 4017 4018 // Retrieve the appropriate method list. 4019 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 4020 : Known->second.second; 4021 bool Found = false; 4022 for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 4023 if (!Found) { 4024 if (List->getMethod() == Method) { 4025 Found = true; 4026 } else { 4027 // Keep searching. 4028 continue; 4029 } 4030 } 4031 4032 if (List->getNext()) 4033 List->setMethod(List->getNext()->getMethod()); 4034 else 4035 List->setMethod(Method); 4036 } 4037 } 4038 4039 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) { 4040 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?"); 4041 for (Decl *D : Names) { 4042 bool wasHidden = !D->isUnconditionallyVisible(); 4043 D->setVisibleDespiteOwningModule(); 4044 4045 if (wasHidden && SemaObj) { 4046 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 4047 moveMethodToBackOfGlobalList(*SemaObj, Method); 4048 } 4049 } 4050 } 4051 } 4052 4053 void ASTReader::makeModuleVisible(Module *Mod, 4054 Module::NameVisibilityKind NameVisibility, 4055 SourceLocation ImportLoc) { 4056 llvm::SmallPtrSet<Module *, 4> Visited; 4057 SmallVector<Module *, 4> Stack; 4058 Stack.push_back(Mod); 4059 while (!Stack.empty()) { 4060 Mod = Stack.pop_back_val(); 4061 4062 if (NameVisibility <= Mod->NameVisibility) { 4063 // This module already has this level of visibility (or greater), so 4064 // there is nothing more to do. 4065 continue; 4066 } 4067 4068 if (Mod->isUnimportable()) { 4069 // Modules that aren't importable cannot be made visible. 4070 continue; 4071 } 4072 4073 // Update the module's name visibility. 4074 Mod->NameVisibility = NameVisibility; 4075 4076 // If we've already deserialized any names from this module, 4077 // mark them as visible. 4078 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 4079 if (Hidden != HiddenNamesMap.end()) { 4080 auto HiddenNames = std::move(*Hidden); 4081 HiddenNamesMap.erase(Hidden); 4082 makeNamesVisible(HiddenNames.second, HiddenNames.first); 4083 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && 4084 "making names visible added hidden names"); 4085 } 4086 4087 // Push any exported modules onto the stack to be marked as visible. 4088 SmallVector<Module *, 16> Exports; 4089 Mod->getExportedModules(Exports); 4090 for (SmallVectorImpl<Module *>::iterator 4091 I = Exports.begin(), E = Exports.end(); I != E; ++I) { 4092 Module *Exported = *I; 4093 if (Visited.insert(Exported).second) 4094 Stack.push_back(Exported); 4095 } 4096 } 4097 } 4098 4099 /// We've merged the definition \p MergedDef into the existing definition 4100 /// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made 4101 /// visible. 4102 void ASTReader::mergeDefinitionVisibility(NamedDecl *Def, 4103 NamedDecl *MergedDef) { 4104 if (!Def->isUnconditionallyVisible()) { 4105 // If MergedDef is visible or becomes visible, make the definition visible. 4106 if (MergedDef->isUnconditionallyVisible()) 4107 Def->setVisibleDespiteOwningModule(); 4108 else { 4109 getContext().mergeDefinitionIntoModule( 4110 Def, MergedDef->getImportedOwningModule(), 4111 /*NotifyListeners*/ false); 4112 PendingMergedDefinitionsToDeduplicate.insert(Def); 4113 } 4114 } 4115 } 4116 4117 bool ASTReader::loadGlobalIndex() { 4118 if (GlobalIndex) 4119 return false; 4120 4121 if (TriedLoadingGlobalIndex || !UseGlobalIndex || 4122 !PP.getLangOpts().Modules) 4123 return true; 4124 4125 // Try to load the global index. 4126 TriedLoadingGlobalIndex = true; 4127 StringRef ModuleCachePath 4128 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 4129 std::pair<GlobalModuleIndex *, llvm::Error> Result = 4130 GlobalModuleIndex::readIndex(ModuleCachePath); 4131 if (llvm::Error Err = std::move(Result.second)) { 4132 assert(!Result.first); 4133 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 4134 return true; 4135 } 4136 4137 GlobalIndex.reset(Result.first); 4138 ModuleMgr.setGlobalIndex(GlobalIndex.get()); 4139 return false; 4140 } 4141 4142 bool ASTReader::isGlobalIndexUnavailable() const { 4143 return PP.getLangOpts().Modules && UseGlobalIndex && 4144 !hasGlobalIndex() && TriedLoadingGlobalIndex; 4145 } 4146 4147 static void updateModuleTimestamp(ModuleFile &MF) { 4148 // Overwrite the timestamp file contents so that file's mtime changes. 4149 std::string TimestampFilename = MF.getTimestampFilename(); 4150 std::error_code EC; 4151 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::OF_Text); 4152 if (EC) 4153 return; 4154 OS << "Timestamp file\n"; 4155 OS.close(); 4156 OS.clear_error(); // Avoid triggering a fatal error. 4157 } 4158 4159 /// Given a cursor at the start of an AST file, scan ahead and drop the 4160 /// cursor into the start of the given block ID, returning false on success and 4161 /// true on failure. 4162 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 4163 while (true) { 4164 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 4165 if (!MaybeEntry) { 4166 // FIXME this drops errors on the floor. 4167 consumeError(MaybeEntry.takeError()); 4168 return true; 4169 } 4170 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4171 4172 switch (Entry.Kind) { 4173 case llvm::BitstreamEntry::Error: 4174 case llvm::BitstreamEntry::EndBlock: 4175 return true; 4176 4177 case llvm::BitstreamEntry::Record: 4178 // Ignore top-level records. 4179 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID)) 4180 break; 4181 else { 4182 // FIXME this drops errors on the floor. 4183 consumeError(Skipped.takeError()); 4184 return true; 4185 } 4186 4187 case llvm::BitstreamEntry::SubBlock: 4188 if (Entry.ID == BlockID) { 4189 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) { 4190 // FIXME this drops the error on the floor. 4191 consumeError(std::move(Err)); 4192 return true; 4193 } 4194 // Found it! 4195 return false; 4196 } 4197 4198 if (llvm::Error Err = Cursor.SkipBlock()) { 4199 // FIXME this drops the error on the floor. 4200 consumeError(std::move(Err)); 4201 return true; 4202 } 4203 } 4204 } 4205 } 4206 4207 ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, 4208 ModuleKind Type, 4209 SourceLocation ImportLoc, 4210 unsigned ClientLoadCapabilities, 4211 SmallVectorImpl<ImportedSubmodule> *Imported) { 4212 llvm::SaveAndRestore<SourceLocation> 4213 SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 4214 4215 // Defer any pending actions until we get to the end of reading the AST file. 4216 Deserializing AnASTFile(this); 4217 4218 // Bump the generation number. 4219 unsigned PreviousGeneration = 0; 4220 if (ContextObj) 4221 PreviousGeneration = incrementGeneration(*ContextObj); 4222 4223 unsigned NumModules = ModuleMgr.size(); 4224 auto removeModulesAndReturn = [&](ASTReadResult ReadResult) { 4225 assert(ReadResult && "expected to return error"); 4226 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, 4227 PP.getLangOpts().Modules 4228 ? &PP.getHeaderSearchInfo().getModuleMap() 4229 : nullptr); 4230 4231 // If we find that any modules are unusable, the global index is going 4232 // to be out-of-date. Just remove it. 4233 GlobalIndex.reset(); 4234 ModuleMgr.setGlobalIndex(nullptr); 4235 return ReadResult; 4236 }; 4237 4238 SmallVector<ImportedModule, 4> Loaded; 4239 switch (ASTReadResult ReadResult = 4240 ReadASTCore(FileName, Type, ImportLoc, 4241 /*ImportedBy=*/nullptr, Loaded, 0, 0, 4242 ASTFileSignature(), ClientLoadCapabilities)) { 4243 case Failure: 4244 case Missing: 4245 case OutOfDate: 4246 case VersionMismatch: 4247 case ConfigurationMismatch: 4248 case HadErrors: 4249 return removeModulesAndReturn(ReadResult); 4250 case Success: 4251 break; 4252 } 4253 4254 // Here comes stuff that we only do once the entire chain is loaded. 4255 4256 // Load the AST blocks of all of the modules that we loaded. We can still 4257 // hit errors parsing the ASTs at this point. 4258 for (ImportedModule &M : Loaded) { 4259 ModuleFile &F = *M.Mod; 4260 4261 // Read the AST block. 4262 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities)) 4263 return removeModulesAndReturn(Result); 4264 4265 // The AST block should always have a definition for the main module. 4266 if (F.isModule() && !F.DidReadTopLevelSubmodule) { 4267 Error(diag::err_module_file_missing_top_level_submodule, F.FileName); 4268 return removeModulesAndReturn(Failure); 4269 } 4270 4271 // Read the extension blocks. 4272 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) { 4273 if (ASTReadResult Result = ReadExtensionBlock(F)) 4274 return removeModulesAndReturn(Result); 4275 } 4276 4277 // Once read, set the ModuleFile bit base offset and update the size in 4278 // bits of all files we've seen. 4279 F.GlobalBitOffset = TotalModulesSizeInBits; 4280 TotalModulesSizeInBits += F.SizeInBits; 4281 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 4282 } 4283 4284 // Preload source locations and interesting indentifiers. 4285 for (ImportedModule &M : Loaded) { 4286 ModuleFile &F = *M.Mod; 4287 4288 // Preload SLocEntries. 4289 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 4290 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 4291 // Load it through the SourceManager and don't call ReadSLocEntry() 4292 // directly because the entry may have already been loaded in which case 4293 // calling ReadSLocEntry() directly would trigger an assertion in 4294 // SourceManager. 4295 SourceMgr.getLoadedSLocEntryByID(Index); 4296 } 4297 4298 // Map the original source file ID into the ID space of the current 4299 // compilation. 4300 if (F.OriginalSourceFileID.isValid()) { 4301 F.OriginalSourceFileID = FileID::get( 4302 F.SLocEntryBaseID + F.OriginalSourceFileID.getOpaqueValue() - 1); 4303 } 4304 4305 // Preload all the pending interesting identifiers by marking them out of 4306 // date. 4307 for (auto Offset : F.PreloadIdentifierOffsets) { 4308 const unsigned char *Data = reinterpret_cast<const unsigned char *>( 4309 F.IdentifierTableData + Offset); 4310 4311 ASTIdentifierLookupTrait Trait(*this, F); 4312 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 4313 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 4314 auto &II = PP.getIdentifierTable().getOwn(Key); 4315 II.setOutOfDate(true); 4316 4317 // Mark this identifier as being from an AST file so that we can track 4318 // whether we need to serialize it. 4319 markIdentifierFromAST(*this, II); 4320 4321 // Associate the ID with the identifier so that the writer can reuse it. 4322 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first); 4323 SetIdentifierInfo(ID, &II); 4324 } 4325 } 4326 4327 // Setup the import locations and notify the module manager that we've 4328 // committed to these module files. 4329 for (ImportedModule &M : Loaded) { 4330 ModuleFile &F = *M.Mod; 4331 4332 ModuleMgr.moduleFileAccepted(&F); 4333 4334 // Set the import location. 4335 F.DirectImportLoc = ImportLoc; 4336 // FIXME: We assume that locations from PCH / preamble do not need 4337 // any translation. 4338 if (!M.ImportedBy) 4339 F.ImportLoc = M.ImportLoc; 4340 else 4341 F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc); 4342 } 4343 4344 if (!PP.getLangOpts().CPlusPlus || 4345 (Type != MK_ImplicitModule && Type != MK_ExplicitModule && 4346 Type != MK_PrebuiltModule)) { 4347 // Mark all of the identifiers in the identifier table as being out of date, 4348 // so that various accessors know to check the loaded modules when the 4349 // identifier is used. 4350 // 4351 // For C++ modules, we don't need information on many identifiers (just 4352 // those that provide macros or are poisoned), so we mark all of 4353 // the interesting ones via PreloadIdentifierOffsets. 4354 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 4355 IdEnd = PP.getIdentifierTable().end(); 4356 Id != IdEnd; ++Id) 4357 Id->second->setOutOfDate(true); 4358 } 4359 // Mark selectors as out of date. 4360 for (auto Sel : SelectorGeneration) 4361 SelectorOutOfDate[Sel.first] = true; 4362 4363 // Resolve any unresolved module exports. 4364 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) { 4365 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I]; 4366 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 4367 Module *ResolvedMod = getSubmodule(GlobalID); 4368 4369 switch (Unresolved.Kind) { 4370 case UnresolvedModuleRef::Conflict: 4371 if (ResolvedMod) { 4372 Module::Conflict Conflict; 4373 Conflict.Other = ResolvedMod; 4374 Conflict.Message = Unresolved.String.str(); 4375 Unresolved.Mod->Conflicts.push_back(Conflict); 4376 } 4377 continue; 4378 4379 case UnresolvedModuleRef::Import: 4380 if (ResolvedMod) 4381 Unresolved.Mod->Imports.insert(ResolvedMod); 4382 continue; 4383 4384 case UnresolvedModuleRef::Export: 4385 if (ResolvedMod || Unresolved.IsWildcard) 4386 Unresolved.Mod->Exports.push_back( 4387 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 4388 continue; 4389 } 4390 } 4391 UnresolvedModuleRefs.clear(); 4392 4393 if (Imported) 4394 Imported->append(ImportedModules.begin(), 4395 ImportedModules.end()); 4396 4397 // FIXME: How do we load the 'use'd modules? They may not be submodules. 4398 // Might be unnecessary as use declarations are only used to build the 4399 // module itself. 4400 4401 if (ContextObj) 4402 InitializeContext(); 4403 4404 if (SemaObj) 4405 UpdateSema(); 4406 4407 if (DeserializationListener) 4408 DeserializationListener->ReaderInitialized(this); 4409 4410 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 4411 if (PrimaryModule.OriginalSourceFileID.isValid()) { 4412 // If this AST file is a precompiled preamble, then set the 4413 // preamble file ID of the source manager to the file source file 4414 // from which the preamble was built. 4415 if (Type == MK_Preamble) { 4416 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 4417 } else if (Type == MK_MainFile) { 4418 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 4419 } 4420 } 4421 4422 // For any Objective-C class definitions we have already loaded, make sure 4423 // that we load any additional categories. 4424 if (ContextObj) { 4425 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 4426 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 4427 ObjCClassesLoaded[I], 4428 PreviousGeneration); 4429 } 4430 } 4431 4432 if (PP.getHeaderSearchInfo() 4433 .getHeaderSearchOpts() 4434 .ModulesValidateOncePerBuildSession) { 4435 // Now we are certain that the module and all modules it depends on are 4436 // up to date. Create or update timestamp files for modules that are 4437 // located in the module cache (not for PCH files that could be anywhere 4438 // in the filesystem). 4439 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) { 4440 ImportedModule &M = Loaded[I]; 4441 if (M.Mod->Kind == MK_ImplicitModule) { 4442 updateModuleTimestamp(*M.Mod); 4443 } 4444 } 4445 } 4446 4447 return Success; 4448 } 4449 4450 static ASTFileSignature readASTFileSignature(StringRef PCH); 4451 4452 /// Whether \p Stream doesn't start with the AST/PCH file magic number 'CPCH'. 4453 static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) { 4454 // FIXME checking magic headers is done in other places such as 4455 // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't 4456 // always done the same. Unify it all with a helper. 4457 if (!Stream.canSkipToPos(4)) 4458 return llvm::createStringError(std::errc::illegal_byte_sequence, 4459 "file too small to contain AST file magic"); 4460 for (unsigned C : {'C', 'P', 'C', 'H'}) 4461 if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) { 4462 if (Res.get() != C) 4463 return llvm::createStringError( 4464 std::errc::illegal_byte_sequence, 4465 "file doesn't start with AST file magic"); 4466 } else 4467 return Res.takeError(); 4468 return llvm::Error::success(); 4469 } 4470 4471 static unsigned moduleKindForDiagnostic(ModuleKind Kind) { 4472 switch (Kind) { 4473 case MK_PCH: 4474 return 0; // PCH 4475 case MK_ImplicitModule: 4476 case MK_ExplicitModule: 4477 case MK_PrebuiltModule: 4478 return 1; // module 4479 case MK_MainFile: 4480 case MK_Preamble: 4481 return 2; // main source file 4482 } 4483 llvm_unreachable("unknown module kind"); 4484 } 4485 4486 ASTReader::ASTReadResult 4487 ASTReader::ReadASTCore(StringRef FileName, 4488 ModuleKind Type, 4489 SourceLocation ImportLoc, 4490 ModuleFile *ImportedBy, 4491 SmallVectorImpl<ImportedModule> &Loaded, 4492 off_t ExpectedSize, time_t ExpectedModTime, 4493 ASTFileSignature ExpectedSignature, 4494 unsigned ClientLoadCapabilities) { 4495 ModuleFile *M; 4496 std::string ErrorStr; 4497 ModuleManager::AddModuleResult AddResult 4498 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy, 4499 getGeneration(), ExpectedSize, ExpectedModTime, 4500 ExpectedSignature, readASTFileSignature, 4501 M, ErrorStr); 4502 4503 switch (AddResult) { 4504 case ModuleManager::AlreadyLoaded: 4505 Diag(diag::remark_module_import) 4506 << M->ModuleName << M->FileName << (ImportedBy ? true : false) 4507 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 4508 return Success; 4509 4510 case ModuleManager::NewlyLoaded: 4511 // Load module file below. 4512 break; 4513 4514 case ModuleManager::Missing: 4515 // The module file was missing; if the client can handle that, return 4516 // it. 4517 if (ClientLoadCapabilities & ARR_Missing) 4518 return Missing; 4519 4520 // Otherwise, return an error. 4521 Diag(diag::err_module_file_not_found) << moduleKindForDiagnostic(Type) 4522 << FileName << !ErrorStr.empty() 4523 << ErrorStr; 4524 return Failure; 4525 4526 case ModuleManager::OutOfDate: 4527 // We couldn't load the module file because it is out-of-date. If the 4528 // client can handle out-of-date, return it. 4529 if (ClientLoadCapabilities & ARR_OutOfDate) 4530 return OutOfDate; 4531 4532 // Otherwise, return an error. 4533 Diag(diag::err_module_file_out_of_date) << moduleKindForDiagnostic(Type) 4534 << FileName << !ErrorStr.empty() 4535 << ErrorStr; 4536 return Failure; 4537 } 4538 4539 assert(M && "Missing module file"); 4540 4541 bool ShouldFinalizePCM = false; 4542 auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() { 4543 auto &MC = getModuleManager().getModuleCache(); 4544 if (ShouldFinalizePCM) 4545 MC.finalizePCM(FileName); 4546 else 4547 MC.tryToDropPCM(FileName); 4548 }); 4549 ModuleFile &F = *M; 4550 BitstreamCursor &Stream = F.Stream; 4551 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer)); 4552 F.SizeInBits = F.Buffer->getBufferSize() * 8; 4553 4554 // Sniff for the signature. 4555 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4556 Diag(diag::err_module_file_invalid) 4557 << moduleKindForDiagnostic(Type) << FileName << std::move(Err); 4558 return Failure; 4559 } 4560 4561 // This is used for compatibility with older PCH formats. 4562 bool HaveReadControlBlock = false; 4563 while (true) { 4564 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4565 if (!MaybeEntry) { 4566 Error(MaybeEntry.takeError()); 4567 return Failure; 4568 } 4569 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4570 4571 switch (Entry.Kind) { 4572 case llvm::BitstreamEntry::Error: 4573 case llvm::BitstreamEntry::Record: 4574 case llvm::BitstreamEntry::EndBlock: 4575 Error("invalid record at top-level of AST file"); 4576 return Failure; 4577 4578 case llvm::BitstreamEntry::SubBlock: 4579 break; 4580 } 4581 4582 switch (Entry.ID) { 4583 case CONTROL_BLOCK_ID: 4584 HaveReadControlBlock = true; 4585 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) { 4586 case Success: 4587 // Check that we didn't try to load a non-module AST file as a module. 4588 // 4589 // FIXME: Should we also perform the converse check? Loading a module as 4590 // a PCH file sort of works, but it's a bit wonky. 4591 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule || 4592 Type == MK_PrebuiltModule) && 4593 F.ModuleName.empty()) { 4594 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure; 4595 if (Result != OutOfDate || 4596 (ClientLoadCapabilities & ARR_OutOfDate) == 0) 4597 Diag(diag::err_module_file_not_module) << FileName; 4598 return Result; 4599 } 4600 break; 4601 4602 case Failure: return Failure; 4603 case Missing: return Missing; 4604 case OutOfDate: return OutOfDate; 4605 case VersionMismatch: return VersionMismatch; 4606 case ConfigurationMismatch: return ConfigurationMismatch; 4607 case HadErrors: return HadErrors; 4608 } 4609 break; 4610 4611 case AST_BLOCK_ID: 4612 if (!HaveReadControlBlock) { 4613 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 4614 Diag(diag::err_pch_version_too_old); 4615 return VersionMismatch; 4616 } 4617 4618 // Record that we've loaded this module. 4619 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 4620 ShouldFinalizePCM = true; 4621 return Success; 4622 4623 case UNHASHED_CONTROL_BLOCK_ID: 4624 // This block is handled using look-ahead during ReadControlBlock. We 4625 // shouldn't get here! 4626 Error("malformed block record in AST file"); 4627 return Failure; 4628 4629 default: 4630 if (llvm::Error Err = Stream.SkipBlock()) { 4631 Error(std::move(Err)); 4632 return Failure; 4633 } 4634 break; 4635 } 4636 } 4637 4638 llvm_unreachable("unexpected break; expected return"); 4639 } 4640 4641 ASTReader::ASTReadResult 4642 ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy, 4643 unsigned ClientLoadCapabilities) { 4644 const HeaderSearchOptions &HSOpts = 4645 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 4646 bool AllowCompatibleConfigurationMismatch = 4647 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 4648 4649 ASTReadResult Result = readUnhashedControlBlockImpl( 4650 &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch, 4651 Listener.get(), 4652 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions); 4653 4654 // If F was directly imported by another module, it's implicitly validated by 4655 // the importing module. 4656 if (DisableValidation || WasImportedBy || 4657 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 4658 return Success; 4659 4660 if (Result == Failure) { 4661 Error("malformed block record in AST file"); 4662 return Failure; 4663 } 4664 4665 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) { 4666 // If this module has already been finalized in the ModuleCache, we're stuck 4667 // with it; we can only load a single version of each module. 4668 // 4669 // This can happen when a module is imported in two contexts: in one, as a 4670 // user module; in another, as a system module (due to an import from 4671 // another module marked with the [system] flag). It usually indicates a 4672 // bug in the module map: this module should also be marked with [system]. 4673 // 4674 // If -Wno-system-headers (the default), and the first import is as a 4675 // system module, then validation will fail during the as-user import, 4676 // since -Werror flags won't have been validated. However, it's reasonable 4677 // to treat this consistently as a system module. 4678 // 4679 // If -Wsystem-headers, the PCM on disk was built with 4680 // -Wno-system-headers, and the first import is as a user module, then 4681 // validation will fail during the as-system import since the PCM on disk 4682 // doesn't guarantee that -Werror was respected. However, the -Werror 4683 // flags were checked during the initial as-user import. 4684 if (getModuleManager().getModuleCache().isPCMFinal(F.FileName)) { 4685 Diag(diag::warn_module_system_bit_conflict) << F.FileName; 4686 return Success; 4687 } 4688 } 4689 4690 return Result; 4691 } 4692 4693 ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl( 4694 ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities, 4695 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener, 4696 bool ValidateDiagnosticOptions) { 4697 // Initialize a stream. 4698 BitstreamCursor Stream(StreamData); 4699 4700 // Sniff for the signature. 4701 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4702 // FIXME this drops the error on the floor. 4703 consumeError(std::move(Err)); 4704 return Failure; 4705 } 4706 4707 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 4708 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 4709 return Failure; 4710 4711 // Read all of the records in the options block. 4712 RecordData Record; 4713 ASTReadResult Result = Success; 4714 while (true) { 4715 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4716 if (!MaybeEntry) { 4717 // FIXME this drops the error on the floor. 4718 consumeError(MaybeEntry.takeError()); 4719 return Failure; 4720 } 4721 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4722 4723 switch (Entry.Kind) { 4724 case llvm::BitstreamEntry::Error: 4725 case llvm::BitstreamEntry::SubBlock: 4726 return Failure; 4727 4728 case llvm::BitstreamEntry::EndBlock: 4729 return Result; 4730 4731 case llvm::BitstreamEntry::Record: 4732 // The interesting case. 4733 break; 4734 } 4735 4736 // Read and process a record. 4737 Record.clear(); 4738 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 4739 if (!MaybeRecordType) { 4740 // FIXME this drops the error. 4741 return Failure; 4742 } 4743 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) { 4744 case SIGNATURE: 4745 if (F) 4746 F->Signature = ASTFileSignature::create(Record.begin(), Record.end()); 4747 break; 4748 case AST_BLOCK_HASH: 4749 if (F) 4750 F->ASTBlockHash = 4751 ASTFileSignature::create(Record.begin(), Record.end()); 4752 break; 4753 case DIAGNOSTIC_OPTIONS: { 4754 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 4755 if (Listener && ValidateDiagnosticOptions && 4756 !AllowCompatibleConfigurationMismatch && 4757 ParseDiagnosticOptions(Record, Complain, *Listener)) 4758 Result = OutOfDate; // Don't return early. Read the signature. 4759 break; 4760 } 4761 case DIAG_PRAGMA_MAPPINGS: 4762 if (!F) 4763 break; 4764 if (F->PragmaDiagMappings.empty()) 4765 F->PragmaDiagMappings.swap(Record); 4766 else 4767 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(), 4768 Record.begin(), Record.end()); 4769 break; 4770 } 4771 } 4772 } 4773 4774 /// Parse a record and blob containing module file extension metadata. 4775 static bool parseModuleFileExtensionMetadata( 4776 const SmallVectorImpl<uint64_t> &Record, 4777 StringRef Blob, 4778 ModuleFileExtensionMetadata &Metadata) { 4779 if (Record.size() < 4) return true; 4780 4781 Metadata.MajorVersion = Record[0]; 4782 Metadata.MinorVersion = Record[1]; 4783 4784 unsigned BlockNameLen = Record[2]; 4785 unsigned UserInfoLen = Record[3]; 4786 4787 if (BlockNameLen + UserInfoLen > Blob.size()) return true; 4788 4789 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen); 4790 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen, 4791 Blob.data() + BlockNameLen + UserInfoLen); 4792 return false; 4793 } 4794 4795 ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) { 4796 BitstreamCursor &Stream = F.Stream; 4797 4798 RecordData Record; 4799 while (true) { 4800 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4801 if (!MaybeEntry) { 4802 Error(MaybeEntry.takeError()); 4803 return Failure; 4804 } 4805 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4806 4807 switch (Entry.Kind) { 4808 case llvm::BitstreamEntry::SubBlock: 4809 if (llvm::Error Err = Stream.SkipBlock()) { 4810 Error(std::move(Err)); 4811 return Failure; 4812 } 4813 continue; 4814 4815 case llvm::BitstreamEntry::EndBlock: 4816 return Success; 4817 4818 case llvm::BitstreamEntry::Error: 4819 return HadErrors; 4820 4821 case llvm::BitstreamEntry::Record: 4822 break; 4823 } 4824 4825 Record.clear(); 4826 StringRef Blob; 4827 Expected<unsigned> MaybeRecCode = 4828 Stream.readRecord(Entry.ID, Record, &Blob); 4829 if (!MaybeRecCode) { 4830 Error(MaybeRecCode.takeError()); 4831 return Failure; 4832 } 4833 switch (MaybeRecCode.get()) { 4834 case EXTENSION_METADATA: { 4835 ModuleFileExtensionMetadata Metadata; 4836 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) { 4837 Error("malformed EXTENSION_METADATA in AST file"); 4838 return Failure; 4839 } 4840 4841 // Find a module file extension with this block name. 4842 auto Known = ModuleFileExtensions.find(Metadata.BlockName); 4843 if (Known == ModuleFileExtensions.end()) break; 4844 4845 // Form a reader. 4846 if (auto Reader = Known->second->createExtensionReader(Metadata, *this, 4847 F, Stream)) { 4848 F.ExtensionReaders.push_back(std::move(Reader)); 4849 } 4850 4851 break; 4852 } 4853 } 4854 } 4855 4856 return Success; 4857 } 4858 4859 void ASTReader::InitializeContext() { 4860 assert(ContextObj && "no context to initialize"); 4861 ASTContext &Context = *ContextObj; 4862 4863 // If there's a listener, notify them that we "read" the translation unit. 4864 if (DeserializationListener) 4865 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 4866 Context.getTranslationUnitDecl()); 4867 4868 // FIXME: Find a better way to deal with collisions between these 4869 // built-in types. Right now, we just ignore the problem. 4870 4871 // Load the special types. 4872 if (SpecialTypes.size() >= NumSpecialTypeIDs) { 4873 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 4874 if (!Context.CFConstantStringTypeDecl) 4875 Context.setCFConstantStringType(GetType(String)); 4876 } 4877 4878 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 4879 QualType FileType = GetType(File); 4880 if (FileType.isNull()) { 4881 Error("FILE type is NULL"); 4882 return; 4883 } 4884 4885 if (!Context.FILEDecl) { 4886 if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 4887 Context.setFILEDecl(Typedef->getDecl()); 4888 else { 4889 const TagType *Tag = FileType->getAs<TagType>(); 4890 if (!Tag) { 4891 Error("Invalid FILE type in AST file"); 4892 return; 4893 } 4894 Context.setFILEDecl(Tag->getDecl()); 4895 } 4896 } 4897 } 4898 4899 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 4900 QualType Jmp_bufType = GetType(Jmp_buf); 4901 if (Jmp_bufType.isNull()) { 4902 Error("jmp_buf type is NULL"); 4903 return; 4904 } 4905 4906 if (!Context.jmp_bufDecl) { 4907 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 4908 Context.setjmp_bufDecl(Typedef->getDecl()); 4909 else { 4910 const TagType *Tag = Jmp_bufType->getAs<TagType>(); 4911 if (!Tag) { 4912 Error("Invalid jmp_buf type in AST file"); 4913 return; 4914 } 4915 Context.setjmp_bufDecl(Tag->getDecl()); 4916 } 4917 } 4918 } 4919 4920 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 4921 QualType Sigjmp_bufType = GetType(Sigjmp_buf); 4922 if (Sigjmp_bufType.isNull()) { 4923 Error("sigjmp_buf type is NULL"); 4924 return; 4925 } 4926 4927 if (!Context.sigjmp_bufDecl) { 4928 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 4929 Context.setsigjmp_bufDecl(Typedef->getDecl()); 4930 else { 4931 const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 4932 assert(Tag && "Invalid sigjmp_buf type in AST file"); 4933 Context.setsigjmp_bufDecl(Tag->getDecl()); 4934 } 4935 } 4936 } 4937 4938 if (unsigned ObjCIdRedef 4939 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 4940 if (Context.ObjCIdRedefinitionType.isNull()) 4941 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 4942 } 4943 4944 if (unsigned ObjCClassRedef 4945 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 4946 if (Context.ObjCClassRedefinitionType.isNull()) 4947 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 4948 } 4949 4950 if (unsigned ObjCSelRedef 4951 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 4952 if (Context.ObjCSelRedefinitionType.isNull()) 4953 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 4954 } 4955 4956 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 4957 QualType Ucontext_tType = GetType(Ucontext_t); 4958 if (Ucontext_tType.isNull()) { 4959 Error("ucontext_t type is NULL"); 4960 return; 4961 } 4962 4963 if (!Context.ucontext_tDecl) { 4964 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 4965 Context.setucontext_tDecl(Typedef->getDecl()); 4966 else { 4967 const TagType *Tag = Ucontext_tType->getAs<TagType>(); 4968 assert(Tag && "Invalid ucontext_t type in AST file"); 4969 Context.setucontext_tDecl(Tag->getDecl()); 4970 } 4971 } 4972 } 4973 } 4974 4975 ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 4976 4977 // If there were any CUDA special declarations, deserialize them. 4978 if (!CUDASpecialDeclRefs.empty()) { 4979 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 4980 Context.setcudaConfigureCallDecl( 4981 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 4982 } 4983 4984 // Re-export any modules that were imported by a non-module AST file. 4985 // FIXME: This does not make macro-only imports visible again. 4986 for (auto &Import : ImportedModules) { 4987 if (Module *Imported = getSubmodule(Import.ID)) { 4988 makeModuleVisible(Imported, Module::AllVisible, 4989 /*ImportLoc=*/Import.ImportLoc); 4990 if (Import.ImportLoc.isValid()) 4991 PP.makeModuleVisible(Imported, Import.ImportLoc); 4992 // FIXME: should we tell Sema to make the module visible too? 4993 } 4994 } 4995 ImportedModules.clear(); 4996 } 4997 4998 void ASTReader::finalizeForWriting() { 4999 // Nothing to do for now. 5000 } 5001 5002 /// Reads and return the signature record from \p PCH's control block, or 5003 /// else returns 0. 5004 static ASTFileSignature readASTFileSignature(StringRef PCH) { 5005 BitstreamCursor Stream(PCH); 5006 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5007 // FIXME this drops the error on the floor. 5008 consumeError(std::move(Err)); 5009 return ASTFileSignature(); 5010 } 5011 5012 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 5013 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 5014 return ASTFileSignature(); 5015 5016 // Scan for SIGNATURE inside the diagnostic options block. 5017 ASTReader::RecordData Record; 5018 while (true) { 5019 Expected<llvm::BitstreamEntry> MaybeEntry = 5020 Stream.advanceSkippingSubblocks(); 5021 if (!MaybeEntry) { 5022 // FIXME this drops the error on the floor. 5023 consumeError(MaybeEntry.takeError()); 5024 return ASTFileSignature(); 5025 } 5026 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5027 5028 if (Entry.Kind != llvm::BitstreamEntry::Record) 5029 return ASTFileSignature(); 5030 5031 Record.clear(); 5032 StringRef Blob; 5033 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5034 if (!MaybeRecord) { 5035 // FIXME this drops the error on the floor. 5036 consumeError(MaybeRecord.takeError()); 5037 return ASTFileSignature(); 5038 } 5039 if (SIGNATURE == MaybeRecord.get()) 5040 return ASTFileSignature::create(Record.begin(), 5041 Record.begin() + ASTFileSignature::size); 5042 } 5043 } 5044 5045 /// Retrieve the name of the original source file name 5046 /// directly from the AST file, without actually loading the AST 5047 /// file. 5048 std::string ASTReader::getOriginalSourceFile( 5049 const std::string &ASTFileName, FileManager &FileMgr, 5050 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) { 5051 // Open the AST file. 5052 auto Buffer = FileMgr.getBufferForFile(ASTFileName); 5053 if (!Buffer) { 5054 Diags.Report(diag::err_fe_unable_to_read_pch_file) 5055 << ASTFileName << Buffer.getError().message(); 5056 return std::string(); 5057 } 5058 5059 // Initialize the stream 5060 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer)); 5061 5062 // Sniff for the signature. 5063 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5064 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err); 5065 return std::string(); 5066 } 5067 5068 // Scan for the CONTROL_BLOCK_ID block. 5069 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 5070 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5071 return std::string(); 5072 } 5073 5074 // Scan for ORIGINAL_FILE inside the control block. 5075 RecordData Record; 5076 while (true) { 5077 Expected<llvm::BitstreamEntry> MaybeEntry = 5078 Stream.advanceSkippingSubblocks(); 5079 if (!MaybeEntry) { 5080 // FIXME this drops errors on the floor. 5081 consumeError(MaybeEntry.takeError()); 5082 return std::string(); 5083 } 5084 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5085 5086 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 5087 return std::string(); 5088 5089 if (Entry.Kind != llvm::BitstreamEntry::Record) { 5090 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5091 return std::string(); 5092 } 5093 5094 Record.clear(); 5095 StringRef Blob; 5096 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5097 if (!MaybeRecord) { 5098 // FIXME this drops the errors on the floor. 5099 consumeError(MaybeRecord.takeError()); 5100 return std::string(); 5101 } 5102 if (ORIGINAL_FILE == MaybeRecord.get()) 5103 return Blob.str(); 5104 } 5105 } 5106 5107 namespace { 5108 5109 class SimplePCHValidator : public ASTReaderListener { 5110 const LangOptions &ExistingLangOpts; 5111 const TargetOptions &ExistingTargetOpts; 5112 const PreprocessorOptions &ExistingPPOpts; 5113 std::string ExistingModuleCachePath; 5114 FileManager &FileMgr; 5115 5116 public: 5117 SimplePCHValidator(const LangOptions &ExistingLangOpts, 5118 const TargetOptions &ExistingTargetOpts, 5119 const PreprocessorOptions &ExistingPPOpts, 5120 StringRef ExistingModuleCachePath, FileManager &FileMgr) 5121 : ExistingLangOpts(ExistingLangOpts), 5122 ExistingTargetOpts(ExistingTargetOpts), 5123 ExistingPPOpts(ExistingPPOpts), 5124 ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr) {} 5125 5126 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, 5127 bool AllowCompatibleDifferences) override { 5128 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr, 5129 AllowCompatibleDifferences); 5130 } 5131 5132 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, 5133 bool AllowCompatibleDifferences) override { 5134 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr, 5135 AllowCompatibleDifferences); 5136 } 5137 5138 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 5139 StringRef SpecificModuleCachePath, 5140 bool Complain) override { 5141 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5142 ExistingModuleCachePath, 5143 nullptr, ExistingLangOpts); 5144 } 5145 5146 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 5147 bool Complain, 5148 std::string &SuggestedPredefines) override { 5149 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr, 5150 SuggestedPredefines, ExistingLangOpts); 5151 } 5152 }; 5153 5154 } // namespace 5155 5156 bool ASTReader::readASTFileControlBlock( 5157 StringRef Filename, FileManager &FileMgr, 5158 const PCHContainerReader &PCHContainerRdr, 5159 bool FindModuleFileExtensions, 5160 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) { 5161 // Open the AST file. 5162 // FIXME: This allows use of the VFS; we do not allow use of the 5163 // VFS when actually loading a module. 5164 auto Buffer = FileMgr.getBufferForFile(Filename); 5165 if (!Buffer) { 5166 return true; 5167 } 5168 5169 // Initialize the stream 5170 StringRef Bytes = PCHContainerRdr.ExtractPCH(**Buffer); 5171 BitstreamCursor Stream(Bytes); 5172 5173 // Sniff for the signature. 5174 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5175 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 5176 return true; 5177 } 5178 5179 // Scan for the CONTROL_BLOCK_ID block. 5180 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 5181 return true; 5182 5183 bool NeedsInputFiles = Listener.needsInputFileVisitation(); 5184 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation(); 5185 bool NeedsImports = Listener.needsImportVisitation(); 5186 BitstreamCursor InputFilesCursor; 5187 5188 RecordData Record; 5189 std::string ModuleDir; 5190 bool DoneWithControlBlock = false; 5191 while (!DoneWithControlBlock) { 5192 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5193 if (!MaybeEntry) { 5194 // FIXME this drops the error on the floor. 5195 consumeError(MaybeEntry.takeError()); 5196 return true; 5197 } 5198 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5199 5200 switch (Entry.Kind) { 5201 case llvm::BitstreamEntry::SubBlock: { 5202 switch (Entry.ID) { 5203 case OPTIONS_BLOCK_ID: { 5204 std::string IgnoredSuggestedPredefines; 5205 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate, 5206 /*AllowCompatibleConfigurationMismatch*/ false, 5207 Listener, IgnoredSuggestedPredefines) != Success) 5208 return true; 5209 break; 5210 } 5211 5212 case INPUT_FILES_BLOCK_ID: 5213 InputFilesCursor = Stream; 5214 if (llvm::Error Err = Stream.SkipBlock()) { 5215 // FIXME this drops the error on the floor. 5216 consumeError(std::move(Err)); 5217 return true; 5218 } 5219 if (NeedsInputFiles && 5220 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID)) 5221 return true; 5222 break; 5223 5224 default: 5225 if (llvm::Error Err = Stream.SkipBlock()) { 5226 // FIXME this drops the error on the floor. 5227 consumeError(std::move(Err)); 5228 return true; 5229 } 5230 break; 5231 } 5232 5233 continue; 5234 } 5235 5236 case llvm::BitstreamEntry::EndBlock: 5237 DoneWithControlBlock = true; 5238 break; 5239 5240 case llvm::BitstreamEntry::Error: 5241 return true; 5242 5243 case llvm::BitstreamEntry::Record: 5244 break; 5245 } 5246 5247 if (DoneWithControlBlock) break; 5248 5249 Record.clear(); 5250 StringRef Blob; 5251 Expected<unsigned> MaybeRecCode = 5252 Stream.readRecord(Entry.ID, Record, &Blob); 5253 if (!MaybeRecCode) { 5254 // FIXME this drops the error. 5255 return Failure; 5256 } 5257 switch ((ControlRecordTypes)MaybeRecCode.get()) { 5258 case METADATA: 5259 if (Record[0] != VERSION_MAJOR) 5260 return true; 5261 if (Listener.ReadFullVersionInformation(Blob)) 5262 return true; 5263 break; 5264 case MODULE_NAME: 5265 Listener.ReadModuleName(Blob); 5266 break; 5267 case MODULE_DIRECTORY: 5268 ModuleDir = std::string(Blob); 5269 break; 5270 case MODULE_MAP_FILE: { 5271 unsigned Idx = 0; 5272 auto Path = ReadString(Record, Idx); 5273 ResolveImportedPath(Path, ModuleDir); 5274 Listener.ReadModuleMapFile(Path); 5275 break; 5276 } 5277 case INPUT_FILE_OFFSETS: { 5278 if (!NeedsInputFiles) 5279 break; 5280 5281 unsigned NumInputFiles = Record[0]; 5282 unsigned NumUserFiles = Record[1]; 5283 const llvm::support::unaligned_uint64_t *InputFileOffs = 5284 (const llvm::support::unaligned_uint64_t *)Blob.data(); 5285 for (unsigned I = 0; I != NumInputFiles; ++I) { 5286 // Go find this input file. 5287 bool isSystemFile = I >= NumUserFiles; 5288 5289 if (isSystemFile && !NeedsSystemInputFiles) 5290 break; // the rest are system input files 5291 5292 BitstreamCursor &Cursor = InputFilesCursor; 5293 SavedStreamPosition SavedPosition(Cursor); 5294 if (llvm::Error Err = Cursor.JumpToBit(InputFileOffs[I])) { 5295 // FIXME this drops errors on the floor. 5296 consumeError(std::move(Err)); 5297 } 5298 5299 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 5300 if (!MaybeCode) { 5301 // FIXME this drops errors on the floor. 5302 consumeError(MaybeCode.takeError()); 5303 } 5304 unsigned Code = MaybeCode.get(); 5305 5306 RecordData Record; 5307 StringRef Blob; 5308 bool shouldContinue = false; 5309 Expected<unsigned> MaybeRecordType = 5310 Cursor.readRecord(Code, Record, &Blob); 5311 if (!MaybeRecordType) { 5312 // FIXME this drops errors on the floor. 5313 consumeError(MaybeRecordType.takeError()); 5314 } 5315 switch ((InputFileRecordTypes)MaybeRecordType.get()) { 5316 case INPUT_FILE_HASH: 5317 break; 5318 case INPUT_FILE: 5319 bool Overridden = static_cast<bool>(Record[3]); 5320 std::string Filename = std::string(Blob); 5321 ResolveImportedPath(Filename, ModuleDir); 5322 shouldContinue = Listener.visitInputFile( 5323 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false); 5324 break; 5325 } 5326 if (!shouldContinue) 5327 break; 5328 } 5329 break; 5330 } 5331 5332 case IMPORTS: { 5333 if (!NeedsImports) 5334 break; 5335 5336 unsigned Idx = 0, N = Record.size(); 5337 while (Idx < N) { 5338 // Read information about the AST file. 5339 Idx += 5340 1 + 1 + 1 + 1 + 5341 ASTFileSignature::size; // Kind, ImportLoc, Size, ModTime, Signature 5342 std::string ModuleName = ReadString(Record, Idx); 5343 std::string Filename = ReadString(Record, Idx); 5344 ResolveImportedPath(Filename, ModuleDir); 5345 Listener.visitImport(ModuleName, Filename); 5346 } 5347 break; 5348 } 5349 5350 default: 5351 // No other validation to perform. 5352 break; 5353 } 5354 } 5355 5356 // Look for module file extension blocks, if requested. 5357 if (FindModuleFileExtensions) { 5358 BitstreamCursor SavedStream = Stream; 5359 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) { 5360 bool DoneWithExtensionBlock = false; 5361 while (!DoneWithExtensionBlock) { 5362 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5363 if (!MaybeEntry) { 5364 // FIXME this drops the error. 5365 return true; 5366 } 5367 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5368 5369 switch (Entry.Kind) { 5370 case llvm::BitstreamEntry::SubBlock: 5371 if (llvm::Error Err = Stream.SkipBlock()) { 5372 // FIXME this drops the error on the floor. 5373 consumeError(std::move(Err)); 5374 return true; 5375 } 5376 continue; 5377 5378 case llvm::BitstreamEntry::EndBlock: 5379 DoneWithExtensionBlock = true; 5380 continue; 5381 5382 case llvm::BitstreamEntry::Error: 5383 return true; 5384 5385 case llvm::BitstreamEntry::Record: 5386 break; 5387 } 5388 5389 Record.clear(); 5390 StringRef Blob; 5391 Expected<unsigned> MaybeRecCode = 5392 Stream.readRecord(Entry.ID, Record, &Blob); 5393 if (!MaybeRecCode) { 5394 // FIXME this drops the error. 5395 return true; 5396 } 5397 switch (MaybeRecCode.get()) { 5398 case EXTENSION_METADATA: { 5399 ModuleFileExtensionMetadata Metadata; 5400 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 5401 return true; 5402 5403 Listener.readModuleFileExtension(Metadata); 5404 break; 5405 } 5406 } 5407 } 5408 } 5409 Stream = SavedStream; 5410 } 5411 5412 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 5413 if (readUnhashedControlBlockImpl( 5414 nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate, 5415 /*AllowCompatibleConfigurationMismatch*/ false, &Listener, 5416 ValidateDiagnosticOptions) != Success) 5417 return true; 5418 5419 return false; 5420 } 5421 5422 bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, 5423 const PCHContainerReader &PCHContainerRdr, 5424 const LangOptions &LangOpts, 5425 const TargetOptions &TargetOpts, 5426 const PreprocessorOptions &PPOpts, 5427 StringRef ExistingModuleCachePath) { 5428 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, 5429 ExistingModuleCachePath, FileMgr); 5430 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr, 5431 /*FindModuleFileExtensions=*/false, 5432 validator, 5433 /*ValidateDiagnosticOptions=*/true); 5434 } 5435 5436 ASTReader::ASTReadResult 5437 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 5438 // Enter the submodule block. 5439 if (llvm::Error Err = F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) { 5440 Error(std::move(Err)); 5441 return Failure; 5442 } 5443 5444 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 5445 bool First = true; 5446 Module *CurrentModule = nullptr; 5447 RecordData Record; 5448 while (true) { 5449 Expected<llvm::BitstreamEntry> MaybeEntry = 5450 F.Stream.advanceSkippingSubblocks(); 5451 if (!MaybeEntry) { 5452 Error(MaybeEntry.takeError()); 5453 return Failure; 5454 } 5455 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5456 5457 switch (Entry.Kind) { 5458 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 5459 case llvm::BitstreamEntry::Error: 5460 Error("malformed block record in AST file"); 5461 return Failure; 5462 case llvm::BitstreamEntry::EndBlock: 5463 return Success; 5464 case llvm::BitstreamEntry::Record: 5465 // The interesting case. 5466 break; 5467 } 5468 5469 // Read a record. 5470 StringRef Blob; 5471 Record.clear(); 5472 Expected<unsigned> MaybeKind = F.Stream.readRecord(Entry.ID, Record, &Blob); 5473 if (!MaybeKind) { 5474 Error(MaybeKind.takeError()); 5475 return Failure; 5476 } 5477 unsigned Kind = MaybeKind.get(); 5478 5479 if ((Kind == SUBMODULE_METADATA) != First) { 5480 Error("submodule metadata record should be at beginning of block"); 5481 return Failure; 5482 } 5483 First = false; 5484 5485 // Submodule information is only valid if we have a current module. 5486 // FIXME: Should we error on these cases? 5487 if (!CurrentModule && Kind != SUBMODULE_METADATA && 5488 Kind != SUBMODULE_DEFINITION) 5489 continue; 5490 5491 switch (Kind) { 5492 default: // Default behavior: ignore. 5493 break; 5494 5495 case SUBMODULE_DEFINITION: { 5496 if (Record.size() < 12) { 5497 Error("malformed module definition"); 5498 return Failure; 5499 } 5500 5501 StringRef Name = Blob; 5502 unsigned Idx = 0; 5503 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]); 5504 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]); 5505 Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++]; 5506 bool IsFramework = Record[Idx++]; 5507 bool IsExplicit = Record[Idx++]; 5508 bool IsSystem = Record[Idx++]; 5509 bool IsExternC = Record[Idx++]; 5510 bool InferSubmodules = Record[Idx++]; 5511 bool InferExplicitSubmodules = Record[Idx++]; 5512 bool InferExportWildcard = Record[Idx++]; 5513 bool ConfigMacrosExhaustive = Record[Idx++]; 5514 bool ModuleMapIsPrivate = Record[Idx++]; 5515 5516 Module *ParentModule = nullptr; 5517 if (Parent) 5518 ParentModule = getSubmodule(Parent); 5519 5520 // Retrieve this (sub)module from the module map, creating it if 5521 // necessary. 5522 CurrentModule = 5523 ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit) 5524 .first; 5525 5526 // FIXME: set the definition loc for CurrentModule, or call 5527 // ModMap.setInferredModuleAllowedBy() 5528 5529 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 5530 if (GlobalIndex >= SubmodulesLoaded.size() || 5531 SubmodulesLoaded[GlobalIndex]) { 5532 Error("too many submodules"); 5533 return Failure; 5534 } 5535 5536 if (!ParentModule) { 5537 if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 5538 // Don't emit module relocation error if we have -fno-validate-pch 5539 if (!PP.getPreprocessorOpts().DisablePCHValidation && 5540 CurFile != F.File) { 5541 Error(diag::err_module_file_conflict, 5542 CurrentModule->getTopLevelModuleName(), CurFile->getName(), 5543 F.File->getName()); 5544 return Failure; 5545 } 5546 } 5547 5548 F.DidReadTopLevelSubmodule = true; 5549 CurrentModule->setASTFile(F.File); 5550 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath; 5551 } 5552 5553 CurrentModule->Kind = Kind; 5554 CurrentModule->Signature = F.Signature; 5555 CurrentModule->IsFromModuleFile = true; 5556 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 5557 CurrentModule->IsExternC = IsExternC; 5558 CurrentModule->InferSubmodules = InferSubmodules; 5559 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 5560 CurrentModule->InferExportWildcard = InferExportWildcard; 5561 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive; 5562 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate; 5563 if (DeserializationListener) 5564 DeserializationListener->ModuleRead(GlobalID, CurrentModule); 5565 5566 SubmodulesLoaded[GlobalIndex] = CurrentModule; 5567 5568 // Clear out data that will be replaced by what is in the module file. 5569 CurrentModule->LinkLibraries.clear(); 5570 CurrentModule->ConfigMacros.clear(); 5571 CurrentModule->UnresolvedConflicts.clear(); 5572 CurrentModule->Conflicts.clear(); 5573 5574 // The module is available unless it's missing a requirement; relevant 5575 // requirements will be (re-)added by SUBMODULE_REQUIRES records. 5576 // Missing headers that were present when the module was built do not 5577 // make it unavailable -- if we got this far, this must be an explicitly 5578 // imported module file. 5579 CurrentModule->Requirements.clear(); 5580 CurrentModule->MissingHeaders.clear(); 5581 CurrentModule->IsUnimportable = 5582 ParentModule && ParentModule->IsUnimportable; 5583 CurrentModule->IsAvailable = !CurrentModule->IsUnimportable; 5584 break; 5585 } 5586 5587 case SUBMODULE_UMBRELLA_HEADER: { 5588 std::string Filename = std::string(Blob); 5589 ResolveImportedPath(F, Filename); 5590 if (auto Umbrella = PP.getFileManager().getFile(Filename)) { 5591 if (!CurrentModule->getUmbrellaHeader()) 5592 ModMap.setUmbrellaHeader(CurrentModule, *Umbrella, Blob); 5593 else if (CurrentModule->getUmbrellaHeader().Entry != *Umbrella) { 5594 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 5595 Error("mismatched umbrella headers in submodule"); 5596 return OutOfDate; 5597 } 5598 } 5599 break; 5600 } 5601 5602 case SUBMODULE_HEADER: 5603 case SUBMODULE_EXCLUDED_HEADER: 5604 case SUBMODULE_PRIVATE_HEADER: 5605 // We lazily associate headers with their modules via the HeaderInfo table. 5606 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 5607 // of complete filenames or remove it entirely. 5608 break; 5609 5610 case SUBMODULE_TEXTUAL_HEADER: 5611 case SUBMODULE_PRIVATE_TEXTUAL_HEADER: 5612 // FIXME: Textual headers are not marked in the HeaderInfo table. Load 5613 // them here. 5614 break; 5615 5616 case SUBMODULE_TOPHEADER: 5617 CurrentModule->addTopHeaderFilename(Blob); 5618 break; 5619 5620 case SUBMODULE_UMBRELLA_DIR: { 5621 std::string Dirname = std::string(Blob); 5622 ResolveImportedPath(F, Dirname); 5623 if (auto Umbrella = PP.getFileManager().getDirectory(Dirname)) { 5624 if (!CurrentModule->getUmbrellaDir()) 5625 ModMap.setUmbrellaDir(CurrentModule, *Umbrella, Blob); 5626 else if (CurrentModule->getUmbrellaDir().Entry != *Umbrella) { 5627 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 5628 Error("mismatched umbrella directories in submodule"); 5629 return OutOfDate; 5630 } 5631 } 5632 break; 5633 } 5634 5635 case SUBMODULE_METADATA: { 5636 F.BaseSubmoduleID = getTotalNumSubmodules(); 5637 F.LocalNumSubmodules = Record[0]; 5638 unsigned LocalBaseSubmoduleID = Record[1]; 5639 if (F.LocalNumSubmodules > 0) { 5640 // Introduce the global -> local mapping for submodules within this 5641 // module. 5642 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 5643 5644 // Introduce the local -> global mapping for submodules within this 5645 // module. 5646 F.SubmoduleRemap.insertOrReplace( 5647 std::make_pair(LocalBaseSubmoduleID, 5648 F.BaseSubmoduleID - LocalBaseSubmoduleID)); 5649 5650 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 5651 } 5652 break; 5653 } 5654 5655 case SUBMODULE_IMPORTS: 5656 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 5657 UnresolvedModuleRef Unresolved; 5658 Unresolved.File = &F; 5659 Unresolved.Mod = CurrentModule; 5660 Unresolved.ID = Record[Idx]; 5661 Unresolved.Kind = UnresolvedModuleRef::Import; 5662 Unresolved.IsWildcard = false; 5663 UnresolvedModuleRefs.push_back(Unresolved); 5664 } 5665 break; 5666 5667 case SUBMODULE_EXPORTS: 5668 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 5669 UnresolvedModuleRef Unresolved; 5670 Unresolved.File = &F; 5671 Unresolved.Mod = CurrentModule; 5672 Unresolved.ID = Record[Idx]; 5673 Unresolved.Kind = UnresolvedModuleRef::Export; 5674 Unresolved.IsWildcard = Record[Idx + 1]; 5675 UnresolvedModuleRefs.push_back(Unresolved); 5676 } 5677 5678 // Once we've loaded the set of exports, there's no reason to keep 5679 // the parsed, unresolved exports around. 5680 CurrentModule->UnresolvedExports.clear(); 5681 break; 5682 5683 case SUBMODULE_REQUIRES: 5684 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(), 5685 PP.getTargetInfo()); 5686 break; 5687 5688 case SUBMODULE_LINK_LIBRARY: 5689 ModMap.resolveLinkAsDependencies(CurrentModule); 5690 CurrentModule->LinkLibraries.push_back( 5691 Module::LinkLibrary(std::string(Blob), Record[0])); 5692 break; 5693 5694 case SUBMODULE_CONFIG_MACRO: 5695 CurrentModule->ConfigMacros.push_back(Blob.str()); 5696 break; 5697 5698 case SUBMODULE_CONFLICT: { 5699 UnresolvedModuleRef Unresolved; 5700 Unresolved.File = &F; 5701 Unresolved.Mod = CurrentModule; 5702 Unresolved.ID = Record[0]; 5703 Unresolved.Kind = UnresolvedModuleRef::Conflict; 5704 Unresolved.IsWildcard = false; 5705 Unresolved.String = Blob; 5706 UnresolvedModuleRefs.push_back(Unresolved); 5707 break; 5708 } 5709 5710 case SUBMODULE_INITIALIZERS: { 5711 if (!ContextObj) 5712 break; 5713 SmallVector<uint32_t, 16> Inits; 5714 for (auto &ID : Record) 5715 Inits.push_back(getGlobalDeclID(F, ID)); 5716 ContextObj->addLazyModuleInitializers(CurrentModule, Inits); 5717 break; 5718 } 5719 5720 case SUBMODULE_EXPORT_AS: 5721 CurrentModule->ExportAsModule = Blob.str(); 5722 ModMap.addLinkAsDependency(CurrentModule); 5723 break; 5724 } 5725 } 5726 } 5727 5728 /// Parse the record that corresponds to a LangOptions data 5729 /// structure. 5730 /// 5731 /// This routine parses the language options from the AST file and then gives 5732 /// them to the AST listener if one is set. 5733 /// 5734 /// \returns true if the listener deems the file unacceptable, false otherwise. 5735 bool ASTReader::ParseLanguageOptions(const RecordData &Record, 5736 bool Complain, 5737 ASTReaderListener &Listener, 5738 bool AllowCompatibleDifferences) { 5739 LangOptions LangOpts; 5740 unsigned Idx = 0; 5741 #define LANGOPT(Name, Bits, Default, Description) \ 5742 LangOpts.Name = Record[Idx++]; 5743 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 5744 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 5745 #include "clang/Basic/LangOptions.def" 5746 #define SANITIZER(NAME, ID) \ 5747 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]); 5748 #include "clang/Basic/Sanitizers.def" 5749 5750 for (unsigned N = Record[Idx++]; N; --N) 5751 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx)); 5752 5753 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 5754 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 5755 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 5756 5757 LangOpts.CurrentModule = ReadString(Record, Idx); 5758 5759 // Comment options. 5760 for (unsigned N = Record[Idx++]; N; --N) { 5761 LangOpts.CommentOpts.BlockCommandNames.push_back( 5762 ReadString(Record, Idx)); 5763 } 5764 LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 5765 5766 // OpenMP offloading options. 5767 for (unsigned N = Record[Idx++]; N; --N) { 5768 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx))); 5769 } 5770 5771 LangOpts.OMPHostIRFile = ReadString(Record, Idx); 5772 5773 return Listener.ReadLanguageOptions(LangOpts, Complain, 5774 AllowCompatibleDifferences); 5775 } 5776 5777 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain, 5778 ASTReaderListener &Listener, 5779 bool AllowCompatibleDifferences) { 5780 unsigned Idx = 0; 5781 TargetOptions TargetOpts; 5782 TargetOpts.Triple = ReadString(Record, Idx); 5783 TargetOpts.CPU = ReadString(Record, Idx); 5784 TargetOpts.ABI = ReadString(Record, Idx); 5785 for (unsigned N = Record[Idx++]; N; --N) { 5786 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 5787 } 5788 for (unsigned N = Record[Idx++]; N; --N) { 5789 TargetOpts.Features.push_back(ReadString(Record, Idx)); 5790 } 5791 5792 return Listener.ReadTargetOptions(TargetOpts, Complain, 5793 AllowCompatibleDifferences); 5794 } 5795 5796 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 5797 ASTReaderListener &Listener) { 5798 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); 5799 unsigned Idx = 0; 5800 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++]; 5801 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 5802 DiagOpts->set##Name(static_cast<Type>(Record[Idx++])); 5803 #include "clang/Basic/DiagnosticOptions.def" 5804 5805 for (unsigned N = Record[Idx++]; N; --N) 5806 DiagOpts->Warnings.push_back(ReadString(Record, Idx)); 5807 for (unsigned N = Record[Idx++]; N; --N) 5808 DiagOpts->Remarks.push_back(ReadString(Record, Idx)); 5809 5810 return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 5811 } 5812 5813 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 5814 ASTReaderListener &Listener) { 5815 FileSystemOptions FSOpts; 5816 unsigned Idx = 0; 5817 FSOpts.WorkingDir = ReadString(Record, Idx); 5818 return Listener.ReadFileSystemOptions(FSOpts, Complain); 5819 } 5820 5821 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 5822 bool Complain, 5823 ASTReaderListener &Listener) { 5824 HeaderSearchOptions HSOpts; 5825 unsigned Idx = 0; 5826 HSOpts.Sysroot = ReadString(Record, Idx); 5827 5828 // Include entries. 5829 for (unsigned N = Record[Idx++]; N; --N) { 5830 std::string Path = ReadString(Record, Idx); 5831 frontend::IncludeDirGroup Group 5832 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 5833 bool IsFramework = Record[Idx++]; 5834 bool IgnoreSysRoot = Record[Idx++]; 5835 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework, 5836 IgnoreSysRoot); 5837 } 5838 5839 // System header prefixes. 5840 for (unsigned N = Record[Idx++]; N; --N) { 5841 std::string Prefix = ReadString(Record, Idx); 5842 bool IsSystemHeader = Record[Idx++]; 5843 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader); 5844 } 5845 5846 HSOpts.ResourceDir = ReadString(Record, Idx); 5847 HSOpts.ModuleCachePath = ReadString(Record, Idx); 5848 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx); 5849 HSOpts.DisableModuleHash = Record[Idx++]; 5850 HSOpts.ImplicitModuleMaps = Record[Idx++]; 5851 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++]; 5852 HSOpts.UseBuiltinIncludes = Record[Idx++]; 5853 HSOpts.UseStandardSystemIncludes = Record[Idx++]; 5854 HSOpts.UseStandardCXXIncludes = Record[Idx++]; 5855 HSOpts.UseLibcxx = Record[Idx++]; 5856 std::string SpecificModuleCachePath = ReadString(Record, Idx); 5857 5858 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5859 Complain); 5860 } 5861 5862 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 5863 bool Complain, 5864 ASTReaderListener &Listener, 5865 std::string &SuggestedPredefines) { 5866 PreprocessorOptions PPOpts; 5867 unsigned Idx = 0; 5868 5869 // Macro definitions/undefs 5870 for (unsigned N = Record[Idx++]; N; --N) { 5871 std::string Macro = ReadString(Record, Idx); 5872 bool IsUndef = Record[Idx++]; 5873 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 5874 } 5875 5876 // Includes 5877 for (unsigned N = Record[Idx++]; N; --N) { 5878 PPOpts.Includes.push_back(ReadString(Record, Idx)); 5879 } 5880 5881 // Macro Includes 5882 for (unsigned N = Record[Idx++]; N; --N) { 5883 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 5884 } 5885 5886 PPOpts.UsePredefines = Record[Idx++]; 5887 PPOpts.DetailedRecord = Record[Idx++]; 5888 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 5889 PPOpts.ObjCXXARCStandardLibrary = 5890 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 5891 SuggestedPredefines.clear(); 5892 return Listener.ReadPreprocessorOptions(PPOpts, Complain, 5893 SuggestedPredefines); 5894 } 5895 5896 std::pair<ModuleFile *, unsigned> 5897 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 5898 GlobalPreprocessedEntityMapType::iterator 5899 I = GlobalPreprocessedEntityMap.find(GlobalIndex); 5900 assert(I != GlobalPreprocessedEntityMap.end() && 5901 "Corrupted global preprocessed entity map"); 5902 ModuleFile *M = I->second; 5903 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 5904 return std::make_pair(M, LocalIndex); 5905 } 5906 5907 llvm::iterator_range<PreprocessingRecord::iterator> 5908 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 5909 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 5910 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 5911 Mod.NumPreprocessedEntities); 5912 5913 return llvm::make_range(PreprocessingRecord::iterator(), 5914 PreprocessingRecord::iterator()); 5915 } 5916 5917 llvm::iterator_range<ASTReader::ModuleDeclIterator> 5918 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 5919 return llvm::make_range( 5920 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 5921 ModuleDeclIterator(this, &Mod, 5922 Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 5923 } 5924 5925 SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) { 5926 auto I = GlobalSkippedRangeMap.find(GlobalIndex); 5927 assert(I != GlobalSkippedRangeMap.end() && 5928 "Corrupted global skipped range map"); 5929 ModuleFile *M = I->second; 5930 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID; 5931 assert(LocalIndex < M->NumPreprocessedSkippedRanges); 5932 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex]; 5933 SourceRange Range(TranslateSourceLocation(*M, RawRange.getBegin()), 5934 TranslateSourceLocation(*M, RawRange.getEnd())); 5935 assert(Range.isValid()); 5936 return Range; 5937 } 5938 5939 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 5940 PreprocessedEntityID PPID = Index+1; 5941 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 5942 ModuleFile &M = *PPInfo.first; 5943 unsigned LocalIndex = PPInfo.second; 5944 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 5945 5946 if (!PP.getPreprocessingRecord()) { 5947 Error("no preprocessing record"); 5948 return nullptr; 5949 } 5950 5951 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 5952 if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit( 5953 M.MacroOffsetsBase + PPOffs.BitOffset)) { 5954 Error(std::move(Err)); 5955 return nullptr; 5956 } 5957 5958 Expected<llvm::BitstreamEntry> MaybeEntry = 5959 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 5960 if (!MaybeEntry) { 5961 Error(MaybeEntry.takeError()); 5962 return nullptr; 5963 } 5964 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5965 5966 if (Entry.Kind != llvm::BitstreamEntry::Record) 5967 return nullptr; 5968 5969 // Read the record. 5970 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()), 5971 TranslateSourceLocation(M, PPOffs.getEnd())); 5972 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 5973 StringRef Blob; 5974 RecordData Record; 5975 Expected<unsigned> MaybeRecType = 5976 M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob); 5977 if (!MaybeRecType) { 5978 Error(MaybeRecType.takeError()); 5979 return nullptr; 5980 } 5981 switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) { 5982 case PPD_MACRO_EXPANSION: { 5983 bool isBuiltin = Record[0]; 5984 IdentifierInfo *Name = nullptr; 5985 MacroDefinitionRecord *Def = nullptr; 5986 if (isBuiltin) 5987 Name = getLocalIdentifier(M, Record[1]); 5988 else { 5989 PreprocessedEntityID GlobalID = 5990 getGlobalPreprocessedEntityID(M, Record[1]); 5991 Def = cast<MacroDefinitionRecord>( 5992 PPRec.getLoadedPreprocessedEntity(GlobalID - 1)); 5993 } 5994 5995 MacroExpansion *ME; 5996 if (isBuiltin) 5997 ME = new (PPRec) MacroExpansion(Name, Range); 5998 else 5999 ME = new (PPRec) MacroExpansion(Def, Range); 6000 6001 return ME; 6002 } 6003 6004 case PPD_MACRO_DEFINITION: { 6005 // Decode the identifier info and then check again; if the macro is 6006 // still defined and associated with the identifier, 6007 IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 6008 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range); 6009 6010 if (DeserializationListener) 6011 DeserializationListener->MacroDefinitionRead(PPID, MD); 6012 6013 return MD; 6014 } 6015 6016 case PPD_INCLUSION_DIRECTIVE: { 6017 const char *FullFileNameStart = Blob.data() + Record[0]; 6018 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 6019 const FileEntry *File = nullptr; 6020 if (!FullFileName.empty()) 6021 if (auto FE = PP.getFileManager().getFile(FullFileName)) 6022 File = *FE; 6023 6024 // FIXME: Stable encoding 6025 InclusionDirective::InclusionKind Kind 6026 = static_cast<InclusionDirective::InclusionKind>(Record[2]); 6027 InclusionDirective *ID 6028 = new (PPRec) InclusionDirective(PPRec, Kind, 6029 StringRef(Blob.data(), Record[0]), 6030 Record[1], Record[3], 6031 File, 6032 Range); 6033 return ID; 6034 } 6035 } 6036 6037 llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 6038 } 6039 6040 /// Find the next module that contains entities and return the ID 6041 /// of the first entry. 6042 /// 6043 /// \param SLocMapI points at a chunk of a module that contains no 6044 /// preprocessed entities or the entities it contains are not the ones we are 6045 /// looking for. 6046 PreprocessedEntityID ASTReader::findNextPreprocessedEntity( 6047 GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 6048 ++SLocMapI; 6049 for (GlobalSLocOffsetMapType::const_iterator 6050 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 6051 ModuleFile &M = *SLocMapI->second; 6052 if (M.NumPreprocessedEntities) 6053 return M.BasePreprocessedEntityID; 6054 } 6055 6056 return getTotalNumPreprocessedEntities(); 6057 } 6058 6059 namespace { 6060 6061 struct PPEntityComp { 6062 const ASTReader &Reader; 6063 ModuleFile &M; 6064 6065 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {} 6066 6067 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 6068 SourceLocation LHS = getLoc(L); 6069 SourceLocation RHS = getLoc(R); 6070 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6071 } 6072 6073 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 6074 SourceLocation LHS = getLoc(L); 6075 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6076 } 6077 6078 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 6079 SourceLocation RHS = getLoc(R); 6080 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6081 } 6082 6083 SourceLocation getLoc(const PPEntityOffset &PPE) const { 6084 return Reader.TranslateSourceLocation(M, PPE.getBegin()); 6085 } 6086 }; 6087 6088 } // namespace 6089 6090 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc, 6091 bool EndsAfter) const { 6092 if (SourceMgr.isLocalSourceLocation(Loc)) 6093 return getTotalNumPreprocessedEntities(); 6094 6095 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find( 6096 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1); 6097 assert(SLocMapI != GlobalSLocOffsetMap.end() && 6098 "Corrupted global sloc offset map"); 6099 6100 if (SLocMapI->second->NumPreprocessedEntities == 0) 6101 return findNextPreprocessedEntity(SLocMapI); 6102 6103 ModuleFile &M = *SLocMapI->second; 6104 6105 using pp_iterator = const PPEntityOffset *; 6106 6107 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 6108 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 6109 6110 size_t Count = M.NumPreprocessedEntities; 6111 size_t Half; 6112 pp_iterator First = pp_begin; 6113 pp_iterator PPI; 6114 6115 if (EndsAfter) { 6116 PPI = std::upper_bound(pp_begin, pp_end, Loc, 6117 PPEntityComp(*this, M)); 6118 } else { 6119 // Do a binary search manually instead of using std::lower_bound because 6120 // The end locations of entities may be unordered (when a macro expansion 6121 // is inside another macro argument), but for this case it is not important 6122 // whether we get the first macro expansion or its containing macro. 6123 while (Count > 0) { 6124 Half = Count / 2; 6125 PPI = First; 6126 std::advance(PPI, Half); 6127 if (SourceMgr.isBeforeInTranslationUnit( 6128 TranslateSourceLocation(M, PPI->getEnd()), Loc)) { 6129 First = PPI; 6130 ++First; 6131 Count = Count - Half - 1; 6132 } else 6133 Count = Half; 6134 } 6135 } 6136 6137 if (PPI == pp_end) 6138 return findNextPreprocessedEntity(SLocMapI); 6139 6140 return M.BasePreprocessedEntityID + (PPI - pp_begin); 6141 } 6142 6143 /// Returns a pair of [Begin, End) indices of preallocated 6144 /// preprocessed entities that \arg Range encompasses. 6145 std::pair<unsigned, unsigned> 6146 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 6147 if (Range.isInvalid()) 6148 return std::make_pair(0,0); 6149 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 6150 6151 PreprocessedEntityID BeginID = 6152 findPreprocessedEntity(Range.getBegin(), false); 6153 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true); 6154 return std::make_pair(BeginID, EndID); 6155 } 6156 6157 /// Optionally returns true or false if the preallocated preprocessed 6158 /// entity with index \arg Index came from file \arg FID. 6159 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 6160 FileID FID) { 6161 if (FID.isInvalid()) 6162 return false; 6163 6164 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 6165 ModuleFile &M = *PPInfo.first; 6166 unsigned LocalIndex = PPInfo.second; 6167 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 6168 6169 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin()); 6170 if (Loc.isInvalid()) 6171 return false; 6172 6173 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 6174 return true; 6175 else 6176 return false; 6177 } 6178 6179 namespace { 6180 6181 /// Visitor used to search for information about a header file. 6182 class HeaderFileInfoVisitor { 6183 const FileEntry *FE; 6184 Optional<HeaderFileInfo> HFI; 6185 6186 public: 6187 explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {} 6188 6189 bool operator()(ModuleFile &M) { 6190 HeaderFileInfoLookupTable *Table 6191 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 6192 if (!Table) 6193 return false; 6194 6195 // Look in the on-disk hash table for an entry for this file name. 6196 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE); 6197 if (Pos == Table->end()) 6198 return false; 6199 6200 HFI = *Pos; 6201 return true; 6202 } 6203 6204 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 6205 }; 6206 6207 } // namespace 6208 6209 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 6210 HeaderFileInfoVisitor Visitor(FE); 6211 ModuleMgr.visit(Visitor); 6212 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 6213 return *HFI; 6214 6215 return HeaderFileInfo(); 6216 } 6217 6218 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 6219 using DiagState = DiagnosticsEngine::DiagState; 6220 SmallVector<DiagState *, 32> DiagStates; 6221 6222 for (ModuleFile &F : ModuleMgr) { 6223 unsigned Idx = 0; 6224 auto &Record = F.PragmaDiagMappings; 6225 if (Record.empty()) 6226 continue; 6227 6228 DiagStates.clear(); 6229 6230 auto ReadDiagState = 6231 [&](const DiagState &BasedOn, SourceLocation Loc, 6232 bool IncludeNonPragmaStates) -> DiagnosticsEngine::DiagState * { 6233 unsigned BackrefID = Record[Idx++]; 6234 if (BackrefID != 0) 6235 return DiagStates[BackrefID - 1]; 6236 6237 // A new DiagState was created here. 6238 Diag.DiagStates.push_back(BasedOn); 6239 DiagState *NewState = &Diag.DiagStates.back(); 6240 DiagStates.push_back(NewState); 6241 unsigned Size = Record[Idx++]; 6242 assert(Idx + Size * 2 <= Record.size() && 6243 "Invalid data, not enough diag/map pairs"); 6244 while (Size--) { 6245 unsigned DiagID = Record[Idx++]; 6246 DiagnosticMapping NewMapping = 6247 DiagnosticMapping::deserialize(Record[Idx++]); 6248 if (!NewMapping.isPragma() && !IncludeNonPragmaStates) 6249 continue; 6250 6251 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID); 6252 6253 // If this mapping was specified as a warning but the severity was 6254 // upgraded due to diagnostic settings, simulate the current diagnostic 6255 // settings (and use a warning). 6256 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) { 6257 NewMapping.setSeverity(diag::Severity::Warning); 6258 NewMapping.setUpgradedFromWarning(false); 6259 } 6260 6261 Mapping = NewMapping; 6262 } 6263 return NewState; 6264 }; 6265 6266 // Read the first state. 6267 DiagState *FirstState; 6268 if (F.Kind == MK_ImplicitModule) { 6269 // Implicitly-built modules are reused with different diagnostic 6270 // settings. Use the initial diagnostic state from Diag to simulate this 6271 // compilation's diagnostic settings. 6272 FirstState = Diag.DiagStatesByLoc.FirstDiagState; 6273 DiagStates.push_back(FirstState); 6274 6275 // Skip the initial diagnostic state from the serialized module. 6276 assert(Record[1] == 0 && 6277 "Invalid data, unexpected backref in initial state"); 6278 Idx = 3 + Record[2] * 2; 6279 assert(Idx < Record.size() && 6280 "Invalid data, not enough state change pairs in initial state"); 6281 } else if (F.isModule()) { 6282 // For an explicit module, preserve the flags from the module build 6283 // command line (-w, -Weverything, -Werror, ...) along with any explicit 6284 // -Wblah flags. 6285 unsigned Flags = Record[Idx++]; 6286 DiagState Initial; 6287 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1; 6288 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1; 6289 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1; 6290 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1; 6291 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1; 6292 Initial.ExtBehavior = (diag::Severity)Flags; 6293 FirstState = ReadDiagState(Initial, SourceLocation(), true); 6294 6295 assert(F.OriginalSourceFileID.isValid()); 6296 6297 // Set up the root buffer of the module to start with the initial 6298 // diagnostic state of the module itself, to cover files that contain no 6299 // explicit transitions (for which we did not serialize anything). 6300 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID] 6301 .StateTransitions.push_back({FirstState, 0}); 6302 } else { 6303 // For prefix ASTs, start with whatever the user configured on the 6304 // command line. 6305 Idx++; // Skip flags. 6306 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, 6307 SourceLocation(), false); 6308 } 6309 6310 // Read the state transitions. 6311 unsigned NumLocations = Record[Idx++]; 6312 while (NumLocations--) { 6313 assert(Idx < Record.size() && 6314 "Invalid data, missing pragma diagnostic states"); 6315 SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]); 6316 auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc); 6317 assert(IDAndOffset.first.isValid() && "invalid FileID for transition"); 6318 assert(IDAndOffset.second == 0 && "not a start location for a FileID"); 6319 unsigned Transitions = Record[Idx++]; 6320 6321 // Note that we don't need to set up Parent/ParentOffset here, because 6322 // we won't be changing the diagnostic state within imported FileIDs 6323 // (other than perhaps appending to the main source file, which has no 6324 // parent). 6325 auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first]; 6326 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions); 6327 for (unsigned I = 0; I != Transitions; ++I) { 6328 unsigned Offset = Record[Idx++]; 6329 auto *State = 6330 ReadDiagState(*FirstState, Loc.getLocWithOffset(Offset), false); 6331 F.StateTransitions.push_back({State, Offset}); 6332 } 6333 } 6334 6335 // Read the final state. 6336 assert(Idx < Record.size() && 6337 "Invalid data, missing final pragma diagnostic state"); 6338 SourceLocation CurStateLoc = 6339 ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 6340 auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false); 6341 6342 if (!F.isModule()) { 6343 Diag.DiagStatesByLoc.CurDiagState = CurState; 6344 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc; 6345 6346 // Preserve the property that the imaginary root file describes the 6347 // current state. 6348 FileID NullFile; 6349 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions; 6350 if (T.empty()) 6351 T.push_back({CurState, 0}); 6352 else 6353 T[0].State = CurState; 6354 } 6355 6356 // Don't try to read these mappings again. 6357 Record.clear(); 6358 } 6359 } 6360 6361 /// Get the correct cursor and offset for loading a type. 6362 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 6363 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 6364 assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 6365 ModuleFile *M = I->second; 6366 return RecordLocation( 6367 M, M->TypeOffsets[Index - M->BaseTypeIndex].getBitOffset() + 6368 M->DeclsBlockStartOffset); 6369 } 6370 6371 static llvm::Optional<Type::TypeClass> getTypeClassForCode(TypeCode code) { 6372 switch (code) { 6373 #define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \ 6374 case TYPE_##CODE_ID: return Type::CLASS_ID; 6375 #include "clang/Serialization/TypeBitCodes.def" 6376 default: return llvm::None; 6377 } 6378 } 6379 6380 /// Read and return the type with the given index.. 6381 /// 6382 /// The index is the type ID, shifted and minus the number of predefs. This 6383 /// routine actually reads the record corresponding to the type at the given 6384 /// location. It is a helper routine for GetType, which deals with reading type 6385 /// IDs. 6386 QualType ASTReader::readTypeRecord(unsigned Index) { 6387 assert(ContextObj && "reading type with no AST context"); 6388 ASTContext &Context = *ContextObj; 6389 RecordLocation Loc = TypeCursorForIndex(Index); 6390 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 6391 6392 // Keep track of where we are in the stream, then jump back there 6393 // after reading this type. 6394 SavedStreamPosition SavedPosition(DeclsCursor); 6395 6396 ReadingKindTracker ReadingKind(Read_Type, *this); 6397 6398 // Note that we are loading a type record. 6399 Deserializing AType(this); 6400 6401 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) { 6402 Error(std::move(Err)); 6403 return QualType(); 6404 } 6405 Expected<unsigned> RawCode = DeclsCursor.ReadCode(); 6406 if (!RawCode) { 6407 Error(RawCode.takeError()); 6408 return QualType(); 6409 } 6410 6411 ASTRecordReader Record(*this, *Loc.F); 6412 Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get()); 6413 if (!Code) { 6414 Error(Code.takeError()); 6415 return QualType(); 6416 } 6417 if (Code.get() == TYPE_EXT_QUAL) { 6418 QualType baseType = Record.readQualType(); 6419 Qualifiers quals = Record.readQualifiers(); 6420 return Context.getQualifiedType(baseType, quals); 6421 } 6422 6423 auto maybeClass = getTypeClassForCode((TypeCode) Code.get()); 6424 if (!maybeClass) { 6425 Error("Unexpected code for type"); 6426 return QualType(); 6427 } 6428 6429 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record); 6430 return TypeReader.read(*maybeClass); 6431 } 6432 6433 namespace clang { 6434 6435 class TypeLocReader : public TypeLocVisitor<TypeLocReader> { 6436 ASTRecordReader &Reader; 6437 6438 SourceLocation readSourceLocation() { 6439 return Reader.readSourceLocation(); 6440 } 6441 6442 TypeSourceInfo *GetTypeSourceInfo() { 6443 return Reader.readTypeSourceInfo(); 6444 } 6445 6446 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() { 6447 return Reader.readNestedNameSpecifierLoc(); 6448 } 6449 6450 Attr *ReadAttr() { 6451 return Reader.readAttr(); 6452 } 6453 6454 public: 6455 TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {} 6456 6457 // We want compile-time assurance that we've enumerated all of 6458 // these, so unfortunately we have to declare them first, then 6459 // define them out-of-line. 6460 #define ABSTRACT_TYPELOC(CLASS, PARENT) 6461 #define TYPELOC(CLASS, PARENT) \ 6462 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 6463 #include "clang/AST/TypeLocNodes.def" 6464 6465 void VisitFunctionTypeLoc(FunctionTypeLoc); 6466 void VisitArrayTypeLoc(ArrayTypeLoc); 6467 }; 6468 6469 } // namespace clang 6470 6471 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 6472 // nothing to do 6473 } 6474 6475 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 6476 TL.setBuiltinLoc(readSourceLocation()); 6477 if (TL.needsExtraLocalData()) { 6478 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt())); 6479 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Reader.readInt())); 6480 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Reader.readInt())); 6481 TL.setModeAttr(Reader.readInt()); 6482 } 6483 } 6484 6485 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 6486 TL.setNameLoc(readSourceLocation()); 6487 } 6488 6489 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 6490 TL.setStarLoc(readSourceLocation()); 6491 } 6492 6493 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 6494 // nothing to do 6495 } 6496 6497 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 6498 // nothing to do 6499 } 6500 6501 void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) { 6502 TL.setExpansionLoc(readSourceLocation()); 6503 } 6504 6505 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 6506 TL.setCaretLoc(readSourceLocation()); 6507 } 6508 6509 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 6510 TL.setAmpLoc(readSourceLocation()); 6511 } 6512 6513 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 6514 TL.setAmpAmpLoc(readSourceLocation()); 6515 } 6516 6517 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 6518 TL.setStarLoc(readSourceLocation()); 6519 TL.setClassTInfo(GetTypeSourceInfo()); 6520 } 6521 6522 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 6523 TL.setLBracketLoc(readSourceLocation()); 6524 TL.setRBracketLoc(readSourceLocation()); 6525 if (Reader.readBool()) 6526 TL.setSizeExpr(Reader.readExpr()); 6527 else 6528 TL.setSizeExpr(nullptr); 6529 } 6530 6531 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 6532 VisitArrayTypeLoc(TL); 6533 } 6534 6535 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 6536 VisitArrayTypeLoc(TL); 6537 } 6538 6539 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 6540 VisitArrayTypeLoc(TL); 6541 } 6542 6543 void TypeLocReader::VisitDependentSizedArrayTypeLoc( 6544 DependentSizedArrayTypeLoc TL) { 6545 VisitArrayTypeLoc(TL); 6546 } 6547 6548 void TypeLocReader::VisitDependentAddressSpaceTypeLoc( 6549 DependentAddressSpaceTypeLoc TL) { 6550 6551 TL.setAttrNameLoc(readSourceLocation()); 6552 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6553 TL.setAttrExprOperand(Reader.readExpr()); 6554 } 6555 6556 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 6557 DependentSizedExtVectorTypeLoc TL) { 6558 TL.setNameLoc(readSourceLocation()); 6559 } 6560 6561 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 6562 TL.setNameLoc(readSourceLocation()); 6563 } 6564 6565 void TypeLocReader::VisitDependentVectorTypeLoc( 6566 DependentVectorTypeLoc TL) { 6567 TL.setNameLoc(readSourceLocation()); 6568 } 6569 6570 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 6571 TL.setNameLoc(readSourceLocation()); 6572 } 6573 6574 void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) { 6575 TL.setAttrNameLoc(readSourceLocation()); 6576 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6577 TL.setAttrRowOperand(Reader.readExpr()); 6578 TL.setAttrColumnOperand(Reader.readExpr()); 6579 } 6580 6581 void TypeLocReader::VisitDependentSizedMatrixTypeLoc( 6582 DependentSizedMatrixTypeLoc TL) { 6583 TL.setAttrNameLoc(readSourceLocation()); 6584 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6585 TL.setAttrRowOperand(Reader.readExpr()); 6586 TL.setAttrColumnOperand(Reader.readExpr()); 6587 } 6588 6589 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 6590 TL.setLocalRangeBegin(readSourceLocation()); 6591 TL.setLParenLoc(readSourceLocation()); 6592 TL.setRParenLoc(readSourceLocation()); 6593 TL.setExceptionSpecRange(Reader.readSourceRange()); 6594 TL.setLocalRangeEnd(readSourceLocation()); 6595 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) { 6596 TL.setParam(i, Reader.readDeclAs<ParmVarDecl>()); 6597 } 6598 } 6599 6600 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 6601 VisitFunctionTypeLoc(TL); 6602 } 6603 6604 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 6605 VisitFunctionTypeLoc(TL); 6606 } 6607 6608 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 6609 TL.setNameLoc(readSourceLocation()); 6610 } 6611 6612 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 6613 TL.setNameLoc(readSourceLocation()); 6614 } 6615 6616 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 6617 TL.setTypeofLoc(readSourceLocation()); 6618 TL.setLParenLoc(readSourceLocation()); 6619 TL.setRParenLoc(readSourceLocation()); 6620 } 6621 6622 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 6623 TL.setTypeofLoc(readSourceLocation()); 6624 TL.setLParenLoc(readSourceLocation()); 6625 TL.setRParenLoc(readSourceLocation()); 6626 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6627 } 6628 6629 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 6630 TL.setNameLoc(readSourceLocation()); 6631 } 6632 6633 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 6634 TL.setKWLoc(readSourceLocation()); 6635 TL.setLParenLoc(readSourceLocation()); 6636 TL.setRParenLoc(readSourceLocation()); 6637 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6638 } 6639 6640 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 6641 TL.setNameLoc(readSourceLocation()); 6642 if (Reader.readBool()) { 6643 TL.setNestedNameSpecifierLoc(ReadNestedNameSpecifierLoc()); 6644 TL.setTemplateKWLoc(readSourceLocation()); 6645 TL.setConceptNameLoc(readSourceLocation()); 6646 TL.setFoundDecl(Reader.readDeclAs<NamedDecl>()); 6647 TL.setLAngleLoc(readSourceLocation()); 6648 TL.setRAngleLoc(readSourceLocation()); 6649 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6650 TL.setArgLocInfo(i, Reader.readTemplateArgumentLocInfo( 6651 TL.getTypePtr()->getArg(i).getKind())); 6652 } 6653 } 6654 6655 void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc( 6656 DeducedTemplateSpecializationTypeLoc TL) { 6657 TL.setTemplateNameLoc(readSourceLocation()); 6658 } 6659 6660 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 6661 TL.setNameLoc(readSourceLocation()); 6662 } 6663 6664 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 6665 TL.setNameLoc(readSourceLocation()); 6666 } 6667 6668 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 6669 TL.setAttr(ReadAttr()); 6670 } 6671 6672 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 6673 TL.setNameLoc(readSourceLocation()); 6674 } 6675 6676 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 6677 SubstTemplateTypeParmTypeLoc TL) { 6678 TL.setNameLoc(readSourceLocation()); 6679 } 6680 6681 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 6682 SubstTemplateTypeParmPackTypeLoc TL) { 6683 TL.setNameLoc(readSourceLocation()); 6684 } 6685 6686 void TypeLocReader::VisitTemplateSpecializationTypeLoc( 6687 TemplateSpecializationTypeLoc TL) { 6688 TL.setTemplateKeywordLoc(readSourceLocation()); 6689 TL.setTemplateNameLoc(readSourceLocation()); 6690 TL.setLAngleLoc(readSourceLocation()); 6691 TL.setRAngleLoc(readSourceLocation()); 6692 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6693 TL.setArgLocInfo( 6694 i, 6695 Reader.readTemplateArgumentLocInfo( 6696 TL.getTypePtr()->getArg(i).getKind())); 6697 } 6698 6699 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 6700 TL.setLParenLoc(readSourceLocation()); 6701 TL.setRParenLoc(readSourceLocation()); 6702 } 6703 6704 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 6705 TL.setElaboratedKeywordLoc(readSourceLocation()); 6706 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6707 } 6708 6709 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 6710 TL.setNameLoc(readSourceLocation()); 6711 } 6712 6713 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 6714 TL.setElaboratedKeywordLoc(readSourceLocation()); 6715 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6716 TL.setNameLoc(readSourceLocation()); 6717 } 6718 6719 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 6720 DependentTemplateSpecializationTypeLoc TL) { 6721 TL.setElaboratedKeywordLoc(readSourceLocation()); 6722 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6723 TL.setTemplateKeywordLoc(readSourceLocation()); 6724 TL.setTemplateNameLoc(readSourceLocation()); 6725 TL.setLAngleLoc(readSourceLocation()); 6726 TL.setRAngleLoc(readSourceLocation()); 6727 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 6728 TL.setArgLocInfo( 6729 I, 6730 Reader.readTemplateArgumentLocInfo( 6731 TL.getTypePtr()->getArg(I).getKind())); 6732 } 6733 6734 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 6735 TL.setEllipsisLoc(readSourceLocation()); 6736 } 6737 6738 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 6739 TL.setNameLoc(readSourceLocation()); 6740 } 6741 6742 void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) { 6743 if (TL.getNumProtocols()) { 6744 TL.setProtocolLAngleLoc(readSourceLocation()); 6745 TL.setProtocolRAngleLoc(readSourceLocation()); 6746 } 6747 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6748 TL.setProtocolLoc(i, readSourceLocation()); 6749 } 6750 6751 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 6752 TL.setHasBaseTypeAsWritten(Reader.readBool()); 6753 TL.setTypeArgsLAngleLoc(readSourceLocation()); 6754 TL.setTypeArgsRAngleLoc(readSourceLocation()); 6755 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i) 6756 TL.setTypeArgTInfo(i, GetTypeSourceInfo()); 6757 TL.setProtocolLAngleLoc(readSourceLocation()); 6758 TL.setProtocolRAngleLoc(readSourceLocation()); 6759 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6760 TL.setProtocolLoc(i, readSourceLocation()); 6761 } 6762 6763 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 6764 TL.setStarLoc(readSourceLocation()); 6765 } 6766 6767 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 6768 TL.setKWLoc(readSourceLocation()); 6769 TL.setLParenLoc(readSourceLocation()); 6770 TL.setRParenLoc(readSourceLocation()); 6771 } 6772 6773 void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) { 6774 TL.setKWLoc(readSourceLocation()); 6775 } 6776 6777 void TypeLocReader::VisitExtIntTypeLoc(clang::ExtIntTypeLoc TL) { 6778 TL.setNameLoc(readSourceLocation()); 6779 } 6780 void TypeLocReader::VisitDependentExtIntTypeLoc( 6781 clang::DependentExtIntTypeLoc TL) { 6782 TL.setNameLoc(readSourceLocation()); 6783 } 6784 6785 6786 void ASTRecordReader::readTypeLoc(TypeLoc TL) { 6787 TypeLocReader TLR(*this); 6788 for (; !TL.isNull(); TL = TL.getNextTypeLoc()) 6789 TLR.Visit(TL); 6790 } 6791 6792 TypeSourceInfo *ASTRecordReader::readTypeSourceInfo() { 6793 QualType InfoTy = readType(); 6794 if (InfoTy.isNull()) 6795 return nullptr; 6796 6797 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 6798 readTypeLoc(TInfo->getTypeLoc()); 6799 return TInfo; 6800 } 6801 6802 QualType ASTReader::GetType(TypeID ID) { 6803 assert(ContextObj && "reading type with no AST context"); 6804 ASTContext &Context = *ContextObj; 6805 6806 unsigned FastQuals = ID & Qualifiers::FastMask; 6807 unsigned Index = ID >> Qualifiers::FastWidth; 6808 6809 if (Index < NUM_PREDEF_TYPE_IDS) { 6810 QualType T; 6811 switch ((PredefinedTypeIDs)Index) { 6812 case PREDEF_TYPE_NULL_ID: 6813 return QualType(); 6814 case PREDEF_TYPE_VOID_ID: 6815 T = Context.VoidTy; 6816 break; 6817 case PREDEF_TYPE_BOOL_ID: 6818 T = Context.BoolTy; 6819 break; 6820 case PREDEF_TYPE_CHAR_U_ID: 6821 case PREDEF_TYPE_CHAR_S_ID: 6822 // FIXME: Check that the signedness of CharTy is correct! 6823 T = Context.CharTy; 6824 break; 6825 case PREDEF_TYPE_UCHAR_ID: 6826 T = Context.UnsignedCharTy; 6827 break; 6828 case PREDEF_TYPE_USHORT_ID: 6829 T = Context.UnsignedShortTy; 6830 break; 6831 case PREDEF_TYPE_UINT_ID: 6832 T = Context.UnsignedIntTy; 6833 break; 6834 case PREDEF_TYPE_ULONG_ID: 6835 T = Context.UnsignedLongTy; 6836 break; 6837 case PREDEF_TYPE_ULONGLONG_ID: 6838 T = Context.UnsignedLongLongTy; 6839 break; 6840 case PREDEF_TYPE_UINT128_ID: 6841 T = Context.UnsignedInt128Ty; 6842 break; 6843 case PREDEF_TYPE_SCHAR_ID: 6844 T = Context.SignedCharTy; 6845 break; 6846 case PREDEF_TYPE_WCHAR_ID: 6847 T = Context.WCharTy; 6848 break; 6849 case PREDEF_TYPE_SHORT_ID: 6850 T = Context.ShortTy; 6851 break; 6852 case PREDEF_TYPE_INT_ID: 6853 T = Context.IntTy; 6854 break; 6855 case PREDEF_TYPE_LONG_ID: 6856 T = Context.LongTy; 6857 break; 6858 case PREDEF_TYPE_LONGLONG_ID: 6859 T = Context.LongLongTy; 6860 break; 6861 case PREDEF_TYPE_INT128_ID: 6862 T = Context.Int128Ty; 6863 break; 6864 case PREDEF_TYPE_BFLOAT16_ID: 6865 T = Context.BFloat16Ty; 6866 break; 6867 case PREDEF_TYPE_HALF_ID: 6868 T = Context.HalfTy; 6869 break; 6870 case PREDEF_TYPE_FLOAT_ID: 6871 T = Context.FloatTy; 6872 break; 6873 case PREDEF_TYPE_DOUBLE_ID: 6874 T = Context.DoubleTy; 6875 break; 6876 case PREDEF_TYPE_LONGDOUBLE_ID: 6877 T = Context.LongDoubleTy; 6878 break; 6879 case PREDEF_TYPE_SHORT_ACCUM_ID: 6880 T = Context.ShortAccumTy; 6881 break; 6882 case PREDEF_TYPE_ACCUM_ID: 6883 T = Context.AccumTy; 6884 break; 6885 case PREDEF_TYPE_LONG_ACCUM_ID: 6886 T = Context.LongAccumTy; 6887 break; 6888 case PREDEF_TYPE_USHORT_ACCUM_ID: 6889 T = Context.UnsignedShortAccumTy; 6890 break; 6891 case PREDEF_TYPE_UACCUM_ID: 6892 T = Context.UnsignedAccumTy; 6893 break; 6894 case PREDEF_TYPE_ULONG_ACCUM_ID: 6895 T = Context.UnsignedLongAccumTy; 6896 break; 6897 case PREDEF_TYPE_SHORT_FRACT_ID: 6898 T = Context.ShortFractTy; 6899 break; 6900 case PREDEF_TYPE_FRACT_ID: 6901 T = Context.FractTy; 6902 break; 6903 case PREDEF_TYPE_LONG_FRACT_ID: 6904 T = Context.LongFractTy; 6905 break; 6906 case PREDEF_TYPE_USHORT_FRACT_ID: 6907 T = Context.UnsignedShortFractTy; 6908 break; 6909 case PREDEF_TYPE_UFRACT_ID: 6910 T = Context.UnsignedFractTy; 6911 break; 6912 case PREDEF_TYPE_ULONG_FRACT_ID: 6913 T = Context.UnsignedLongFractTy; 6914 break; 6915 case PREDEF_TYPE_SAT_SHORT_ACCUM_ID: 6916 T = Context.SatShortAccumTy; 6917 break; 6918 case PREDEF_TYPE_SAT_ACCUM_ID: 6919 T = Context.SatAccumTy; 6920 break; 6921 case PREDEF_TYPE_SAT_LONG_ACCUM_ID: 6922 T = Context.SatLongAccumTy; 6923 break; 6924 case PREDEF_TYPE_SAT_USHORT_ACCUM_ID: 6925 T = Context.SatUnsignedShortAccumTy; 6926 break; 6927 case PREDEF_TYPE_SAT_UACCUM_ID: 6928 T = Context.SatUnsignedAccumTy; 6929 break; 6930 case PREDEF_TYPE_SAT_ULONG_ACCUM_ID: 6931 T = Context.SatUnsignedLongAccumTy; 6932 break; 6933 case PREDEF_TYPE_SAT_SHORT_FRACT_ID: 6934 T = Context.SatShortFractTy; 6935 break; 6936 case PREDEF_TYPE_SAT_FRACT_ID: 6937 T = Context.SatFractTy; 6938 break; 6939 case PREDEF_TYPE_SAT_LONG_FRACT_ID: 6940 T = Context.SatLongFractTy; 6941 break; 6942 case PREDEF_TYPE_SAT_USHORT_FRACT_ID: 6943 T = Context.SatUnsignedShortFractTy; 6944 break; 6945 case PREDEF_TYPE_SAT_UFRACT_ID: 6946 T = Context.SatUnsignedFractTy; 6947 break; 6948 case PREDEF_TYPE_SAT_ULONG_FRACT_ID: 6949 T = Context.SatUnsignedLongFractTy; 6950 break; 6951 case PREDEF_TYPE_FLOAT16_ID: 6952 T = Context.Float16Ty; 6953 break; 6954 case PREDEF_TYPE_FLOAT128_ID: 6955 T = Context.Float128Ty; 6956 break; 6957 case PREDEF_TYPE_OVERLOAD_ID: 6958 T = Context.OverloadTy; 6959 break; 6960 case PREDEF_TYPE_BOUND_MEMBER: 6961 T = Context.BoundMemberTy; 6962 break; 6963 case PREDEF_TYPE_PSEUDO_OBJECT: 6964 T = Context.PseudoObjectTy; 6965 break; 6966 case PREDEF_TYPE_DEPENDENT_ID: 6967 T = Context.DependentTy; 6968 break; 6969 case PREDEF_TYPE_UNKNOWN_ANY: 6970 T = Context.UnknownAnyTy; 6971 break; 6972 case PREDEF_TYPE_NULLPTR_ID: 6973 T = Context.NullPtrTy; 6974 break; 6975 case PREDEF_TYPE_CHAR8_ID: 6976 T = Context.Char8Ty; 6977 break; 6978 case PREDEF_TYPE_CHAR16_ID: 6979 T = Context.Char16Ty; 6980 break; 6981 case PREDEF_TYPE_CHAR32_ID: 6982 T = Context.Char32Ty; 6983 break; 6984 case PREDEF_TYPE_OBJC_ID: 6985 T = Context.ObjCBuiltinIdTy; 6986 break; 6987 case PREDEF_TYPE_OBJC_CLASS: 6988 T = Context.ObjCBuiltinClassTy; 6989 break; 6990 case PREDEF_TYPE_OBJC_SEL: 6991 T = Context.ObjCBuiltinSelTy; 6992 break; 6993 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 6994 case PREDEF_TYPE_##Id##_ID: \ 6995 T = Context.SingletonId; \ 6996 break; 6997 #include "clang/Basic/OpenCLImageTypes.def" 6998 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 6999 case PREDEF_TYPE_##Id##_ID: \ 7000 T = Context.Id##Ty; \ 7001 break; 7002 #include "clang/Basic/OpenCLExtensionTypes.def" 7003 case PREDEF_TYPE_SAMPLER_ID: 7004 T = Context.OCLSamplerTy; 7005 break; 7006 case PREDEF_TYPE_EVENT_ID: 7007 T = Context.OCLEventTy; 7008 break; 7009 case PREDEF_TYPE_CLK_EVENT_ID: 7010 T = Context.OCLClkEventTy; 7011 break; 7012 case PREDEF_TYPE_QUEUE_ID: 7013 T = Context.OCLQueueTy; 7014 break; 7015 case PREDEF_TYPE_RESERVE_ID_ID: 7016 T = Context.OCLReserveIDTy; 7017 break; 7018 case PREDEF_TYPE_AUTO_DEDUCT: 7019 T = Context.getAutoDeductType(); 7020 break; 7021 case PREDEF_TYPE_AUTO_RREF_DEDUCT: 7022 T = Context.getAutoRRefDeductType(); 7023 break; 7024 case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 7025 T = Context.ARCUnbridgedCastTy; 7026 break; 7027 case PREDEF_TYPE_BUILTIN_FN: 7028 T = Context.BuiltinFnTy; 7029 break; 7030 case PREDEF_TYPE_INCOMPLETE_MATRIX_IDX: 7031 T = Context.IncompleteMatrixIdxTy; 7032 break; 7033 case PREDEF_TYPE_OMP_ARRAY_SECTION: 7034 T = Context.OMPArraySectionTy; 7035 break; 7036 case PREDEF_TYPE_OMP_ARRAY_SHAPING: 7037 T = Context.OMPArraySectionTy; 7038 break; 7039 case PREDEF_TYPE_OMP_ITERATOR: 7040 T = Context.OMPIteratorTy; 7041 break; 7042 #define SVE_TYPE(Name, Id, SingletonId) \ 7043 case PREDEF_TYPE_##Id##_ID: \ 7044 T = Context.SingletonId; \ 7045 break; 7046 #include "clang/Basic/AArch64SVEACLETypes.def" 7047 } 7048 7049 assert(!T.isNull() && "Unknown predefined type"); 7050 return T.withFastQualifiers(FastQuals); 7051 } 7052 7053 Index -= NUM_PREDEF_TYPE_IDS; 7054 assert(Index < TypesLoaded.size() && "Type index out-of-range"); 7055 if (TypesLoaded[Index].isNull()) { 7056 TypesLoaded[Index] = readTypeRecord(Index); 7057 if (TypesLoaded[Index].isNull()) 7058 return QualType(); 7059 7060 TypesLoaded[Index]->setFromAST(); 7061 if (DeserializationListener) 7062 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 7063 TypesLoaded[Index]); 7064 } 7065 7066 return TypesLoaded[Index].withFastQualifiers(FastQuals); 7067 } 7068 7069 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 7070 return GetType(getGlobalTypeID(F, LocalID)); 7071 } 7072 7073 serialization::TypeID 7074 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 7075 unsigned FastQuals = LocalID & Qualifiers::FastMask; 7076 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 7077 7078 if (LocalIndex < NUM_PREDEF_TYPE_IDS) 7079 return LocalID; 7080 7081 if (!F.ModuleOffsetMap.empty()) 7082 ReadModuleOffsetMap(F); 7083 7084 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7085 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 7086 assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 7087 7088 unsigned GlobalIndex = LocalIndex + I->second; 7089 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 7090 } 7091 7092 TemplateArgumentLocInfo 7093 ASTRecordReader::readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind) { 7094 switch (Kind) { 7095 case TemplateArgument::Expression: 7096 return readExpr(); 7097 case TemplateArgument::Type: 7098 return readTypeSourceInfo(); 7099 case TemplateArgument::Template: { 7100 NestedNameSpecifierLoc QualifierLoc = 7101 readNestedNameSpecifierLoc(); 7102 SourceLocation TemplateNameLoc = readSourceLocation(); 7103 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 7104 SourceLocation()); 7105 } 7106 case TemplateArgument::TemplateExpansion: { 7107 NestedNameSpecifierLoc QualifierLoc = readNestedNameSpecifierLoc(); 7108 SourceLocation TemplateNameLoc = readSourceLocation(); 7109 SourceLocation EllipsisLoc = readSourceLocation(); 7110 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 7111 EllipsisLoc); 7112 } 7113 case TemplateArgument::Null: 7114 case TemplateArgument::Integral: 7115 case TemplateArgument::Declaration: 7116 case TemplateArgument::NullPtr: 7117 case TemplateArgument::Pack: 7118 // FIXME: Is this right? 7119 return TemplateArgumentLocInfo(); 7120 } 7121 llvm_unreachable("unexpected template argument loc"); 7122 } 7123 7124 TemplateArgumentLoc ASTRecordReader::readTemplateArgumentLoc() { 7125 TemplateArgument Arg = readTemplateArgument(); 7126 7127 if (Arg.getKind() == TemplateArgument::Expression) { 7128 if (readBool()) // bool InfoHasSameExpr. 7129 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 7130 } 7131 return TemplateArgumentLoc(Arg, readTemplateArgumentLocInfo(Arg.getKind())); 7132 } 7133 7134 const ASTTemplateArgumentListInfo * 7135 ASTRecordReader::readASTTemplateArgumentListInfo() { 7136 SourceLocation LAngleLoc = readSourceLocation(); 7137 SourceLocation RAngleLoc = readSourceLocation(); 7138 unsigned NumArgsAsWritten = readInt(); 7139 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 7140 for (unsigned i = 0; i != NumArgsAsWritten; ++i) 7141 TemplArgsInfo.addArgument(readTemplateArgumentLoc()); 7142 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 7143 } 7144 7145 Decl *ASTReader::GetExternalDecl(uint32_t ID) { 7146 return GetDecl(ID); 7147 } 7148 7149 void ASTReader::CompleteRedeclChain(const Decl *D) { 7150 if (NumCurrentElementsDeserializing) { 7151 // We arrange to not care about the complete redeclaration chain while we're 7152 // deserializing. Just remember that the AST has marked this one as complete 7153 // but that it's not actually complete yet, so we know we still need to 7154 // complete it later. 7155 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D)); 7156 return; 7157 } 7158 7159 const DeclContext *DC = D->getDeclContext()->getRedeclContext(); 7160 7161 // If this is a named declaration, complete it by looking it up 7162 // within its context. 7163 // 7164 // FIXME: Merging a function definition should merge 7165 // all mergeable entities within it. 7166 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) || 7167 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) { 7168 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) { 7169 if (!getContext().getLangOpts().CPlusPlus && 7170 isa<TranslationUnitDecl>(DC)) { 7171 // Outside of C++, we don't have a lookup table for the TU, so update 7172 // the identifier instead. (For C++ modules, we don't store decls 7173 // in the serialized identifier table, so we do the lookup in the TU.) 7174 auto *II = Name.getAsIdentifierInfo(); 7175 assert(II && "non-identifier name in C?"); 7176 if (II->isOutOfDate()) 7177 updateOutOfDateIdentifier(*II); 7178 } else 7179 DC->lookup(Name); 7180 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) { 7181 // Find all declarations of this kind from the relevant context. 7182 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) { 7183 auto *DC = cast<DeclContext>(DCDecl); 7184 SmallVector<Decl*, 8> Decls; 7185 FindExternalLexicalDecls( 7186 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls); 7187 } 7188 } 7189 } 7190 7191 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) 7192 CTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7193 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) 7194 VTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7195 if (auto *FD = dyn_cast<FunctionDecl>(D)) { 7196 if (auto *Template = FD->getPrimaryTemplate()) 7197 Template->LoadLazySpecializations(); 7198 } 7199 } 7200 7201 CXXCtorInitializer ** 7202 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) { 7203 RecordLocation Loc = getLocalBitOffset(Offset); 7204 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7205 SavedStreamPosition SavedPosition(Cursor); 7206 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7207 Error(std::move(Err)); 7208 return nullptr; 7209 } 7210 ReadingKindTracker ReadingKind(Read_Decl, *this); 7211 7212 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7213 if (!MaybeCode) { 7214 Error(MaybeCode.takeError()); 7215 return nullptr; 7216 } 7217 unsigned Code = MaybeCode.get(); 7218 7219 ASTRecordReader Record(*this, *Loc.F); 7220 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7221 if (!MaybeRecCode) { 7222 Error(MaybeRecCode.takeError()); 7223 return nullptr; 7224 } 7225 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) { 7226 Error("malformed AST file: missing C++ ctor initializers"); 7227 return nullptr; 7228 } 7229 7230 return Record.readCXXCtorInitializers(); 7231 } 7232 7233 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 7234 assert(ContextObj && "reading base specifiers with no AST context"); 7235 ASTContext &Context = *ContextObj; 7236 7237 RecordLocation Loc = getLocalBitOffset(Offset); 7238 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7239 SavedStreamPosition SavedPosition(Cursor); 7240 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7241 Error(std::move(Err)); 7242 return nullptr; 7243 } 7244 ReadingKindTracker ReadingKind(Read_Decl, *this); 7245 7246 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7247 if (!MaybeCode) { 7248 Error(MaybeCode.takeError()); 7249 return nullptr; 7250 } 7251 unsigned Code = MaybeCode.get(); 7252 7253 ASTRecordReader Record(*this, *Loc.F); 7254 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7255 if (!MaybeRecCode) { 7256 Error(MaybeCode.takeError()); 7257 return nullptr; 7258 } 7259 unsigned RecCode = MaybeRecCode.get(); 7260 7261 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 7262 Error("malformed AST file: missing C++ base specifiers"); 7263 return nullptr; 7264 } 7265 7266 unsigned NumBases = Record.readInt(); 7267 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 7268 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 7269 for (unsigned I = 0; I != NumBases; ++I) 7270 Bases[I] = Record.readCXXBaseSpecifier(); 7271 return Bases; 7272 } 7273 7274 serialization::DeclID 7275 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 7276 if (LocalID < NUM_PREDEF_DECL_IDS) 7277 return LocalID; 7278 7279 if (!F.ModuleOffsetMap.empty()) 7280 ReadModuleOffsetMap(F); 7281 7282 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7283 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 7284 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 7285 7286 return LocalID + I->second; 7287 } 7288 7289 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 7290 ModuleFile &M) const { 7291 // Predefined decls aren't from any module. 7292 if (ID < NUM_PREDEF_DECL_IDS) 7293 return false; 7294 7295 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID && 7296 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls; 7297 } 7298 7299 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 7300 if (!D->isFromASTFile()) 7301 return nullptr; 7302 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 7303 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7304 return I->second; 7305 } 7306 7307 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 7308 if (ID < NUM_PREDEF_DECL_IDS) 7309 return SourceLocation(); 7310 7311 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7312 7313 if (Index > DeclsLoaded.size()) { 7314 Error("declaration ID out-of-range for AST file"); 7315 return SourceLocation(); 7316 } 7317 7318 if (Decl *D = DeclsLoaded[Index]) 7319 return D->getLocation(); 7320 7321 SourceLocation Loc; 7322 DeclCursorForID(ID, Loc); 7323 return Loc; 7324 } 7325 7326 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) { 7327 switch (ID) { 7328 case PREDEF_DECL_NULL_ID: 7329 return nullptr; 7330 7331 case PREDEF_DECL_TRANSLATION_UNIT_ID: 7332 return Context.getTranslationUnitDecl(); 7333 7334 case PREDEF_DECL_OBJC_ID_ID: 7335 return Context.getObjCIdDecl(); 7336 7337 case PREDEF_DECL_OBJC_SEL_ID: 7338 return Context.getObjCSelDecl(); 7339 7340 case PREDEF_DECL_OBJC_CLASS_ID: 7341 return Context.getObjCClassDecl(); 7342 7343 case PREDEF_DECL_OBJC_PROTOCOL_ID: 7344 return Context.getObjCProtocolDecl(); 7345 7346 case PREDEF_DECL_INT_128_ID: 7347 return Context.getInt128Decl(); 7348 7349 case PREDEF_DECL_UNSIGNED_INT_128_ID: 7350 return Context.getUInt128Decl(); 7351 7352 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 7353 return Context.getObjCInstanceTypeDecl(); 7354 7355 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 7356 return Context.getBuiltinVaListDecl(); 7357 7358 case PREDEF_DECL_VA_LIST_TAG: 7359 return Context.getVaListTagDecl(); 7360 7361 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID: 7362 return Context.getBuiltinMSVaListDecl(); 7363 7364 case PREDEF_DECL_BUILTIN_MS_GUID_ID: 7365 return Context.getMSGuidTagDecl(); 7366 7367 case PREDEF_DECL_EXTERN_C_CONTEXT_ID: 7368 return Context.getExternCContextDecl(); 7369 7370 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID: 7371 return Context.getMakeIntegerSeqDecl(); 7372 7373 case PREDEF_DECL_CF_CONSTANT_STRING_ID: 7374 return Context.getCFConstantStringDecl(); 7375 7376 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID: 7377 return Context.getCFConstantStringTagDecl(); 7378 7379 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID: 7380 return Context.getTypePackElementDecl(); 7381 } 7382 llvm_unreachable("PredefinedDeclIDs unknown enum value"); 7383 } 7384 7385 Decl *ASTReader::GetExistingDecl(DeclID ID) { 7386 assert(ContextObj && "reading decl with no AST context"); 7387 if (ID < NUM_PREDEF_DECL_IDS) { 7388 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID); 7389 if (D) { 7390 // Track that we have merged the declaration with ID \p ID into the 7391 // pre-existing predefined declaration \p D. 7392 auto &Merged = KeyDecls[D->getCanonicalDecl()]; 7393 if (Merged.empty()) 7394 Merged.push_back(ID); 7395 } 7396 return D; 7397 } 7398 7399 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7400 7401 if (Index >= DeclsLoaded.size()) { 7402 assert(0 && "declaration ID out-of-range for AST file"); 7403 Error("declaration ID out-of-range for AST file"); 7404 return nullptr; 7405 } 7406 7407 return DeclsLoaded[Index]; 7408 } 7409 7410 Decl *ASTReader::GetDecl(DeclID ID) { 7411 if (ID < NUM_PREDEF_DECL_IDS) 7412 return GetExistingDecl(ID); 7413 7414 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7415 7416 if (Index >= DeclsLoaded.size()) { 7417 assert(0 && "declaration ID out-of-range for AST file"); 7418 Error("declaration ID out-of-range for AST file"); 7419 return nullptr; 7420 } 7421 7422 if (!DeclsLoaded[Index]) { 7423 ReadDeclRecord(ID); 7424 if (DeserializationListener) 7425 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 7426 } 7427 7428 return DeclsLoaded[Index]; 7429 } 7430 7431 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 7432 DeclID GlobalID) { 7433 if (GlobalID < NUM_PREDEF_DECL_IDS) 7434 return GlobalID; 7435 7436 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 7437 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7438 ModuleFile *Owner = I->second; 7439 7440 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 7441 = M.GlobalToLocalDeclIDs.find(Owner); 7442 if (Pos == M.GlobalToLocalDeclIDs.end()) 7443 return 0; 7444 7445 return GlobalID - Owner->BaseDeclID + Pos->second; 7446 } 7447 7448 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 7449 const RecordData &Record, 7450 unsigned &Idx) { 7451 if (Idx >= Record.size()) { 7452 Error("Corrupted AST file"); 7453 return 0; 7454 } 7455 7456 return getGlobalDeclID(F, Record[Idx++]); 7457 } 7458 7459 /// Resolve the offset of a statement into a statement. 7460 /// 7461 /// This operation will read a new statement from the external 7462 /// source each time it is called, and is meant to be used via a 7463 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 7464 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 7465 // Switch case IDs are per Decl. 7466 ClearSwitchCaseIDs(); 7467 7468 // Offset here is a global offset across the entire chain. 7469 RecordLocation Loc = getLocalBitOffset(Offset); 7470 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) { 7471 Error(std::move(Err)); 7472 return nullptr; 7473 } 7474 assert(NumCurrentElementsDeserializing == 0 && 7475 "should not be called while already deserializing"); 7476 Deserializing D(this); 7477 return ReadStmtFromStream(*Loc.F); 7478 } 7479 7480 void ASTReader::FindExternalLexicalDecls( 7481 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 7482 SmallVectorImpl<Decl *> &Decls) { 7483 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {}; 7484 7485 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) { 7486 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries"); 7487 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) { 7488 auto K = (Decl::Kind)+LexicalDecls[I]; 7489 if (!IsKindWeWant(K)) 7490 continue; 7491 7492 auto ID = (serialization::DeclID)+LexicalDecls[I + 1]; 7493 7494 // Don't add predefined declarations to the lexical context more 7495 // than once. 7496 if (ID < NUM_PREDEF_DECL_IDS) { 7497 if (PredefsVisited[ID]) 7498 continue; 7499 7500 PredefsVisited[ID] = true; 7501 } 7502 7503 if (Decl *D = GetLocalDecl(*M, ID)) { 7504 assert(D->getKind() == K && "wrong kind for lexical decl"); 7505 if (!DC->isDeclInLexicalTraversal(D)) 7506 Decls.push_back(D); 7507 } 7508 } 7509 }; 7510 7511 if (isa<TranslationUnitDecl>(DC)) { 7512 for (auto Lexical : TULexicalDecls) 7513 Visit(Lexical.first, Lexical.second); 7514 } else { 7515 auto I = LexicalDecls.find(DC); 7516 if (I != LexicalDecls.end()) 7517 Visit(I->second.first, I->second.second); 7518 } 7519 7520 ++NumLexicalDeclContextsRead; 7521 } 7522 7523 namespace { 7524 7525 class DeclIDComp { 7526 ASTReader &Reader; 7527 ModuleFile &Mod; 7528 7529 public: 7530 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 7531 7532 bool operator()(LocalDeclID L, LocalDeclID R) const { 7533 SourceLocation LHS = getLocation(L); 7534 SourceLocation RHS = getLocation(R); 7535 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7536 } 7537 7538 bool operator()(SourceLocation LHS, LocalDeclID R) const { 7539 SourceLocation RHS = getLocation(R); 7540 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7541 } 7542 7543 bool operator()(LocalDeclID L, SourceLocation RHS) const { 7544 SourceLocation LHS = getLocation(L); 7545 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7546 } 7547 7548 SourceLocation getLocation(LocalDeclID ID) const { 7549 return Reader.getSourceManager().getFileLoc( 7550 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 7551 } 7552 }; 7553 7554 } // namespace 7555 7556 void ASTReader::FindFileRegionDecls(FileID File, 7557 unsigned Offset, unsigned Length, 7558 SmallVectorImpl<Decl *> &Decls) { 7559 SourceManager &SM = getSourceManager(); 7560 7561 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 7562 if (I == FileDeclIDs.end()) 7563 return; 7564 7565 FileDeclsInfo &DInfo = I->second; 7566 if (DInfo.Decls.empty()) 7567 return; 7568 7569 SourceLocation 7570 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 7571 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 7572 7573 DeclIDComp DIDComp(*this, *DInfo.Mod); 7574 ArrayRef<serialization::LocalDeclID>::iterator BeginIt = 7575 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp); 7576 if (BeginIt != DInfo.Decls.begin()) 7577 --BeginIt; 7578 7579 // If we are pointing at a top-level decl inside an objc container, we need 7580 // to backtrack until we find it otherwise we will fail to report that the 7581 // region overlaps with an objc container. 7582 while (BeginIt != DInfo.Decls.begin() && 7583 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 7584 ->isTopLevelDeclInObjCContainer()) 7585 --BeginIt; 7586 7587 ArrayRef<serialization::LocalDeclID>::iterator EndIt = 7588 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp); 7589 if (EndIt != DInfo.Decls.end()) 7590 ++EndIt; 7591 7592 for (ArrayRef<serialization::LocalDeclID>::iterator 7593 DIt = BeginIt; DIt != EndIt; ++DIt) 7594 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 7595 } 7596 7597 bool 7598 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 7599 DeclarationName Name) { 7600 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && 7601 "DeclContext has no visible decls in storage"); 7602 if (!Name) 7603 return false; 7604 7605 auto It = Lookups.find(DC); 7606 if (It == Lookups.end()) 7607 return false; 7608 7609 Deserializing LookupResults(this); 7610 7611 // Load the list of declarations. 7612 SmallVector<NamedDecl *, 64> Decls; 7613 for (DeclID ID : It->second.Table.find(Name)) { 7614 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7615 if (ND->getDeclName() == Name) 7616 Decls.push_back(ND); 7617 } 7618 7619 ++NumVisibleDeclContextsRead; 7620 SetExternalVisibleDeclsForName(DC, Name, Decls); 7621 return !Decls.empty(); 7622 } 7623 7624 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 7625 if (!DC->hasExternalVisibleStorage()) 7626 return; 7627 7628 auto It = Lookups.find(DC); 7629 assert(It != Lookups.end() && 7630 "have external visible storage but no lookup tables"); 7631 7632 DeclsMap Decls; 7633 7634 for (DeclID ID : It->second.Table.findAll()) { 7635 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7636 Decls[ND->getDeclName()].push_back(ND); 7637 } 7638 7639 ++NumVisibleDeclContextsRead; 7640 7641 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 7642 SetExternalVisibleDeclsForName(DC, I->first, I->second); 7643 } 7644 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 7645 } 7646 7647 const serialization::reader::DeclContextLookupTable * 7648 ASTReader::getLoadedLookupTables(DeclContext *Primary) const { 7649 auto I = Lookups.find(Primary); 7650 return I == Lookups.end() ? nullptr : &I->second; 7651 } 7652 7653 /// Under non-PCH compilation the consumer receives the objc methods 7654 /// before receiving the implementation, and codegen depends on this. 7655 /// We simulate this by deserializing and passing to consumer the methods of the 7656 /// implementation before passing the deserialized implementation decl. 7657 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 7658 ASTConsumer *Consumer) { 7659 assert(ImplD && Consumer); 7660 7661 for (auto *I : ImplD->methods()) 7662 Consumer->HandleInterestingDecl(DeclGroupRef(I)); 7663 7664 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 7665 } 7666 7667 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 7668 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 7669 PassObjCImplDeclToConsumer(ImplD, Consumer); 7670 else 7671 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 7672 } 7673 7674 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 7675 this->Consumer = Consumer; 7676 7677 if (Consumer) 7678 PassInterestingDeclsToConsumer(); 7679 7680 if (DeserializationListener) 7681 DeserializationListener->ReaderInitialized(this); 7682 } 7683 7684 void ASTReader::PrintStats() { 7685 std::fprintf(stderr, "*** AST File Statistics:\n"); 7686 7687 unsigned NumTypesLoaded 7688 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 7689 QualType()); 7690 unsigned NumDeclsLoaded 7691 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 7692 (Decl *)nullptr); 7693 unsigned NumIdentifiersLoaded 7694 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 7695 IdentifiersLoaded.end(), 7696 (IdentifierInfo *)nullptr); 7697 unsigned NumMacrosLoaded 7698 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 7699 MacrosLoaded.end(), 7700 (MacroInfo *)nullptr); 7701 unsigned NumSelectorsLoaded 7702 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 7703 SelectorsLoaded.end(), 7704 Selector()); 7705 7706 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 7707 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 7708 NumSLocEntriesRead, TotalNumSLocEntries, 7709 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 7710 if (!TypesLoaded.empty()) 7711 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 7712 NumTypesLoaded, (unsigned)TypesLoaded.size(), 7713 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 7714 if (!DeclsLoaded.empty()) 7715 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 7716 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 7717 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 7718 if (!IdentifiersLoaded.empty()) 7719 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 7720 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 7721 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 7722 if (!MacrosLoaded.empty()) 7723 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7724 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 7725 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 7726 if (!SelectorsLoaded.empty()) 7727 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 7728 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 7729 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 7730 if (TotalNumStatements) 7731 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 7732 NumStatementsRead, TotalNumStatements, 7733 ((float)NumStatementsRead/TotalNumStatements * 100)); 7734 if (TotalNumMacros) 7735 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7736 NumMacrosRead, TotalNumMacros, 7737 ((float)NumMacrosRead/TotalNumMacros * 100)); 7738 if (TotalLexicalDeclContexts) 7739 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 7740 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 7741 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 7742 * 100)); 7743 if (TotalVisibleDeclContexts) 7744 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 7745 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 7746 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 7747 * 100)); 7748 if (TotalNumMethodPoolEntries) 7749 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 7750 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 7751 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 7752 * 100)); 7753 if (NumMethodPoolLookups) 7754 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 7755 NumMethodPoolHits, NumMethodPoolLookups, 7756 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 7757 if (NumMethodPoolTableLookups) 7758 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 7759 NumMethodPoolTableHits, NumMethodPoolTableLookups, 7760 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 7761 * 100.0)); 7762 if (NumIdentifierLookupHits) 7763 std::fprintf(stderr, 7764 " %u / %u identifier table lookups succeeded (%f%%)\n", 7765 NumIdentifierLookupHits, NumIdentifierLookups, 7766 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 7767 7768 if (GlobalIndex) { 7769 std::fprintf(stderr, "\n"); 7770 GlobalIndex->printStats(); 7771 } 7772 7773 std::fprintf(stderr, "\n"); 7774 dump(); 7775 std::fprintf(stderr, "\n"); 7776 } 7777 7778 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 7779 LLVM_DUMP_METHOD static void 7780 dumpModuleIDMap(StringRef Name, 7781 const ContinuousRangeMap<Key, ModuleFile *, 7782 InitialCapacity> &Map) { 7783 if (Map.begin() == Map.end()) 7784 return; 7785 7786 using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>; 7787 7788 llvm::errs() << Name << ":\n"; 7789 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 7790 I != IEnd; ++I) { 7791 llvm::errs() << " " << I->first << " -> " << I->second->FileName 7792 << "\n"; 7793 } 7794 } 7795 7796 LLVM_DUMP_METHOD void ASTReader::dump() { 7797 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 7798 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 7799 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 7800 dumpModuleIDMap("Global type map", GlobalTypeMap); 7801 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 7802 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 7803 dumpModuleIDMap("Global macro map", GlobalMacroMap); 7804 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 7805 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 7806 dumpModuleIDMap("Global preprocessed entity map", 7807 GlobalPreprocessedEntityMap); 7808 7809 llvm::errs() << "\n*** PCH/Modules Loaded:"; 7810 for (ModuleFile &M : ModuleMgr) 7811 M.dump(); 7812 } 7813 7814 /// Return the amount of memory used by memory buffers, breaking down 7815 /// by heap-backed versus mmap'ed memory. 7816 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 7817 for (ModuleFile &I : ModuleMgr) { 7818 if (llvm::MemoryBuffer *buf = I.Buffer) { 7819 size_t bytes = buf->getBufferSize(); 7820 switch (buf->getBufferKind()) { 7821 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 7822 sizes.malloc_bytes += bytes; 7823 break; 7824 case llvm::MemoryBuffer::MemoryBuffer_MMap: 7825 sizes.mmap_bytes += bytes; 7826 break; 7827 } 7828 } 7829 } 7830 } 7831 7832 void ASTReader::InitializeSema(Sema &S) { 7833 SemaObj = &S; 7834 S.addExternalSource(this); 7835 7836 // Makes sure any declarations that were deserialized "too early" 7837 // still get added to the identifier's declaration chains. 7838 for (uint64_t ID : PreloadedDeclIDs) { 7839 NamedDecl *D = cast<NamedDecl>(GetDecl(ID)); 7840 pushExternalDeclIntoScope(D, D->getDeclName()); 7841 } 7842 PreloadedDeclIDs.clear(); 7843 7844 // FIXME: What happens if these are changed by a module import? 7845 if (!FPPragmaOptions.empty()) { 7846 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 7847 FPOptionsOverride NewOverrides(FPPragmaOptions[0]); 7848 SemaObj->CurFPFeatures = 7849 NewOverrides.applyOverrides(SemaObj->getLangOpts()); 7850 } 7851 7852 SemaObj->OpenCLFeatures.copy(OpenCLExtensions); 7853 SemaObj->OpenCLTypeExtMap = OpenCLTypeExtMap; 7854 SemaObj->OpenCLDeclExtMap = OpenCLDeclExtMap; 7855 7856 UpdateSema(); 7857 } 7858 7859 void ASTReader::UpdateSema() { 7860 assert(SemaObj && "no Sema to update"); 7861 7862 // Load the offsets of the declarations that Sema references. 7863 // They will be lazily deserialized when needed. 7864 if (!SemaDeclRefs.empty()) { 7865 assert(SemaDeclRefs.size() % 3 == 0); 7866 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) { 7867 if (!SemaObj->StdNamespace) 7868 SemaObj->StdNamespace = SemaDeclRefs[I]; 7869 if (!SemaObj->StdBadAlloc) 7870 SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 7871 if (!SemaObj->StdAlignValT) 7872 SemaObj->StdAlignValT = SemaDeclRefs[I+2]; 7873 } 7874 SemaDeclRefs.clear(); 7875 } 7876 7877 // Update the state of pragmas. Use the same API as if we had encountered the 7878 // pragma in the source. 7879 if(OptimizeOffPragmaLocation.isValid()) 7880 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation); 7881 if (PragmaMSStructState != -1) 7882 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState); 7883 if (PointersToMembersPragmaLocation.isValid()) { 7884 SemaObj->ActOnPragmaMSPointersToMembers( 7885 (LangOptions::PragmaMSPointersToMembersKind) 7886 PragmaMSPointersToMembersState, 7887 PointersToMembersPragmaLocation); 7888 } 7889 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth; 7890 7891 if (PragmaPackCurrentValue) { 7892 // The bottom of the stack might have a default value. It must be adjusted 7893 // to the current value to ensure that the packing state is preserved after 7894 // popping entries that were included/imported from a PCH/module. 7895 bool DropFirst = false; 7896 if (!PragmaPackStack.empty() && 7897 PragmaPackStack.front().Location.isInvalid()) { 7898 assert(PragmaPackStack.front().Value == SemaObj->PackStack.DefaultValue && 7899 "Expected a default alignment value"); 7900 SemaObj->PackStack.Stack.emplace_back( 7901 PragmaPackStack.front().SlotLabel, SemaObj->PackStack.CurrentValue, 7902 SemaObj->PackStack.CurrentPragmaLocation, 7903 PragmaPackStack.front().PushLocation); 7904 DropFirst = true; 7905 } 7906 for (const auto &Entry : 7907 llvm::makeArrayRef(PragmaPackStack).drop_front(DropFirst ? 1 : 0)) 7908 SemaObj->PackStack.Stack.emplace_back(Entry.SlotLabel, Entry.Value, 7909 Entry.Location, Entry.PushLocation); 7910 if (PragmaPackCurrentLocation.isInvalid()) { 7911 assert(*PragmaPackCurrentValue == SemaObj->PackStack.DefaultValue && 7912 "Expected a default alignment value"); 7913 // Keep the current values. 7914 } else { 7915 SemaObj->PackStack.CurrentValue = *PragmaPackCurrentValue; 7916 SemaObj->PackStack.CurrentPragmaLocation = PragmaPackCurrentLocation; 7917 } 7918 } 7919 if (FpPragmaCurrentValue) { 7920 // The bottom of the stack might have a default value. It must be adjusted 7921 // to the current value to ensure that fp-pragma state is preserved after 7922 // popping entries that were included/imported from a PCH/module. 7923 bool DropFirst = false; 7924 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) { 7925 assert(FpPragmaStack.front().Value == 7926 SemaObj->FpPragmaStack.DefaultValue && 7927 "Expected a default pragma float_control value"); 7928 SemaObj->FpPragmaStack.Stack.emplace_back( 7929 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue, 7930 SemaObj->FpPragmaStack.CurrentPragmaLocation, 7931 FpPragmaStack.front().PushLocation); 7932 DropFirst = true; 7933 } 7934 for (const auto &Entry : 7935 llvm::makeArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0)) 7936 SemaObj->FpPragmaStack.Stack.emplace_back( 7937 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation); 7938 if (FpPragmaCurrentLocation.isInvalid()) { 7939 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue && 7940 "Expected a default pragma float_control value"); 7941 // Keep the current values. 7942 } else { 7943 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue; 7944 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation; 7945 } 7946 } 7947 } 7948 7949 IdentifierInfo *ASTReader::get(StringRef Name) { 7950 // Note that we are loading an identifier. 7951 Deserializing AnIdentifier(this); 7952 7953 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 7954 NumIdentifierLookups, 7955 NumIdentifierLookupHits); 7956 7957 // We don't need to do identifier table lookups in C++ modules (we preload 7958 // all interesting declarations, and don't need to use the scope for name 7959 // lookups). Perform the lookup in PCH files, though, since we don't build 7960 // a complete initial identifier table if we're carrying on from a PCH. 7961 if (PP.getLangOpts().CPlusPlus) { 7962 for (auto F : ModuleMgr.pch_modules()) 7963 if (Visitor(*F)) 7964 break; 7965 } else { 7966 // If there is a global index, look there first to determine which modules 7967 // provably do not have any results for this identifier. 7968 GlobalModuleIndex::HitSet Hits; 7969 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 7970 if (!loadGlobalIndex()) { 7971 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 7972 HitsPtr = &Hits; 7973 } 7974 } 7975 7976 ModuleMgr.visit(Visitor, HitsPtr); 7977 } 7978 7979 IdentifierInfo *II = Visitor.getIdentifierInfo(); 7980 markIdentifierUpToDate(II); 7981 return II; 7982 } 7983 7984 namespace clang { 7985 7986 /// An identifier-lookup iterator that enumerates all of the 7987 /// identifiers stored within a set of AST files. 7988 class ASTIdentifierIterator : public IdentifierIterator { 7989 /// The AST reader whose identifiers are being enumerated. 7990 const ASTReader &Reader; 7991 7992 /// The current index into the chain of AST files stored in 7993 /// the AST reader. 7994 unsigned Index; 7995 7996 /// The current position within the identifier lookup table 7997 /// of the current AST file. 7998 ASTIdentifierLookupTable::key_iterator Current; 7999 8000 /// The end position within the identifier lookup table of 8001 /// the current AST file. 8002 ASTIdentifierLookupTable::key_iterator End; 8003 8004 /// Whether to skip any modules in the ASTReader. 8005 bool SkipModules; 8006 8007 public: 8008 explicit ASTIdentifierIterator(const ASTReader &Reader, 8009 bool SkipModules = false); 8010 8011 StringRef Next() override; 8012 }; 8013 8014 } // namespace clang 8015 8016 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader, 8017 bool SkipModules) 8018 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) { 8019 } 8020 8021 StringRef ASTIdentifierIterator::Next() { 8022 while (Current == End) { 8023 // If we have exhausted all of our AST files, we're done. 8024 if (Index == 0) 8025 return StringRef(); 8026 8027 --Index; 8028 ModuleFile &F = Reader.ModuleMgr[Index]; 8029 if (SkipModules && F.isModule()) 8030 continue; 8031 8032 ASTIdentifierLookupTable *IdTable = 8033 (ASTIdentifierLookupTable *)F.IdentifierLookupTable; 8034 Current = IdTable->key_begin(); 8035 End = IdTable->key_end(); 8036 } 8037 8038 // We have any identifiers remaining in the current AST file; return 8039 // the next one. 8040 StringRef Result = *Current; 8041 ++Current; 8042 return Result; 8043 } 8044 8045 namespace { 8046 8047 /// A utility for appending two IdentifierIterators. 8048 class ChainedIdentifierIterator : public IdentifierIterator { 8049 std::unique_ptr<IdentifierIterator> Current; 8050 std::unique_ptr<IdentifierIterator> Queued; 8051 8052 public: 8053 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First, 8054 std::unique_ptr<IdentifierIterator> Second) 8055 : Current(std::move(First)), Queued(std::move(Second)) {} 8056 8057 StringRef Next() override { 8058 if (!Current) 8059 return StringRef(); 8060 8061 StringRef result = Current->Next(); 8062 if (!result.empty()) 8063 return result; 8064 8065 // Try the queued iterator, which may itself be empty. 8066 Current.reset(); 8067 std::swap(Current, Queued); 8068 return Next(); 8069 } 8070 }; 8071 8072 } // namespace 8073 8074 IdentifierIterator *ASTReader::getIdentifiers() { 8075 if (!loadGlobalIndex()) { 8076 std::unique_ptr<IdentifierIterator> ReaderIter( 8077 new ASTIdentifierIterator(*this, /*SkipModules=*/true)); 8078 std::unique_ptr<IdentifierIterator> ModulesIter( 8079 GlobalIndex->createIdentifierIterator()); 8080 return new ChainedIdentifierIterator(std::move(ReaderIter), 8081 std::move(ModulesIter)); 8082 } 8083 8084 return new ASTIdentifierIterator(*this); 8085 } 8086 8087 namespace clang { 8088 namespace serialization { 8089 8090 class ReadMethodPoolVisitor { 8091 ASTReader &Reader; 8092 Selector Sel; 8093 unsigned PriorGeneration; 8094 unsigned InstanceBits = 0; 8095 unsigned FactoryBits = 0; 8096 bool InstanceHasMoreThanOneDecl = false; 8097 bool FactoryHasMoreThanOneDecl = false; 8098 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 8099 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 8100 8101 public: 8102 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 8103 unsigned PriorGeneration) 8104 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {} 8105 8106 bool operator()(ModuleFile &M) { 8107 if (!M.SelectorLookupTable) 8108 return false; 8109 8110 // If we've already searched this module file, skip it now. 8111 if (M.Generation <= PriorGeneration) 8112 return true; 8113 8114 ++Reader.NumMethodPoolTableLookups; 8115 ASTSelectorLookupTable *PoolTable 8116 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 8117 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel); 8118 if (Pos == PoolTable->end()) 8119 return false; 8120 8121 ++Reader.NumMethodPoolTableHits; 8122 ++Reader.NumSelectorsRead; 8123 // FIXME: Not quite happy with the statistics here. We probably should 8124 // disable this tracking when called via LoadSelector. 8125 // Also, should entries without methods count as misses? 8126 ++Reader.NumMethodPoolEntriesRead; 8127 ASTSelectorLookupTrait::data_type Data = *Pos; 8128 if (Reader.DeserializationListener) 8129 Reader.DeserializationListener->SelectorRead(Data.ID, Sel); 8130 8131 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 8132 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 8133 InstanceBits = Data.InstanceBits; 8134 FactoryBits = Data.FactoryBits; 8135 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl; 8136 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl; 8137 return true; 8138 } 8139 8140 /// Retrieve the instance methods found by this visitor. 8141 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 8142 return InstanceMethods; 8143 } 8144 8145 /// Retrieve the instance methods found by this visitor. 8146 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 8147 return FactoryMethods; 8148 } 8149 8150 unsigned getInstanceBits() const { return InstanceBits; } 8151 unsigned getFactoryBits() const { return FactoryBits; } 8152 8153 bool instanceHasMoreThanOneDecl() const { 8154 return InstanceHasMoreThanOneDecl; 8155 } 8156 8157 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; } 8158 }; 8159 8160 } // namespace serialization 8161 } // namespace clang 8162 8163 /// Add the given set of methods to the method list. 8164 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 8165 ObjCMethodList &List) { 8166 for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 8167 S.addMethodToGlobalList(&List, Methods[I]); 8168 } 8169 } 8170 8171 void ASTReader::ReadMethodPool(Selector Sel) { 8172 // Get the selector generation and update it to the current generation. 8173 unsigned &Generation = SelectorGeneration[Sel]; 8174 unsigned PriorGeneration = Generation; 8175 Generation = getGeneration(); 8176 SelectorOutOfDate[Sel] = false; 8177 8178 // Search for methods defined with this selector. 8179 ++NumMethodPoolLookups; 8180 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 8181 ModuleMgr.visit(Visitor); 8182 8183 if (Visitor.getInstanceMethods().empty() && 8184 Visitor.getFactoryMethods().empty()) 8185 return; 8186 8187 ++NumMethodPoolHits; 8188 8189 if (!getSema()) 8190 return; 8191 8192 Sema &S = *getSema(); 8193 Sema::GlobalMethodPool::iterator Pos 8194 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first; 8195 8196 Pos->second.first.setBits(Visitor.getInstanceBits()); 8197 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl()); 8198 Pos->second.second.setBits(Visitor.getFactoryBits()); 8199 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl()); 8200 8201 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since 8202 // when building a module we keep every method individually and may need to 8203 // update hasMoreThanOneDecl as we add the methods. 8204 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 8205 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 8206 } 8207 8208 void ASTReader::updateOutOfDateSelector(Selector Sel) { 8209 if (SelectorOutOfDate[Sel]) 8210 ReadMethodPool(Sel); 8211 } 8212 8213 void ASTReader::ReadKnownNamespaces( 8214 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 8215 Namespaces.clear(); 8216 8217 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 8218 if (NamespaceDecl *Namespace 8219 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 8220 Namespaces.push_back(Namespace); 8221 } 8222 } 8223 8224 void ASTReader::ReadUndefinedButUsed( 8225 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) { 8226 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 8227 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 8228 SourceLocation Loc = 8229 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 8230 Undefined.insert(std::make_pair(D, Loc)); 8231 } 8232 } 8233 8234 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector< 8235 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> & 8236 Exprs) { 8237 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) { 8238 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++])); 8239 uint64_t Count = DelayedDeleteExprs[Idx++]; 8240 for (uint64_t C = 0; C < Count; ++C) { 8241 SourceLocation DeleteLoc = 8242 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]); 8243 const bool IsArrayForm = DelayedDeleteExprs[Idx++]; 8244 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm)); 8245 } 8246 } 8247 } 8248 8249 void ASTReader::ReadTentativeDefinitions( 8250 SmallVectorImpl<VarDecl *> &TentativeDefs) { 8251 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 8252 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 8253 if (Var) 8254 TentativeDefs.push_back(Var); 8255 } 8256 TentativeDefinitions.clear(); 8257 } 8258 8259 void ASTReader::ReadUnusedFileScopedDecls( 8260 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 8261 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 8262 DeclaratorDecl *D 8263 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 8264 if (D) 8265 Decls.push_back(D); 8266 } 8267 UnusedFileScopedDecls.clear(); 8268 } 8269 8270 void ASTReader::ReadDelegatingConstructors( 8271 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 8272 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 8273 CXXConstructorDecl *D 8274 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 8275 if (D) 8276 Decls.push_back(D); 8277 } 8278 DelegatingCtorDecls.clear(); 8279 } 8280 8281 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 8282 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 8283 TypedefNameDecl *D 8284 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 8285 if (D) 8286 Decls.push_back(D); 8287 } 8288 ExtVectorDecls.clear(); 8289 } 8290 8291 void ASTReader::ReadUnusedLocalTypedefNameCandidates( 8292 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 8293 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N; 8294 ++I) { 8295 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>( 8296 GetDecl(UnusedLocalTypedefNameCandidates[I])); 8297 if (D) 8298 Decls.insert(D); 8299 } 8300 UnusedLocalTypedefNameCandidates.clear(); 8301 } 8302 8303 void ASTReader::ReadDeclsToCheckForDeferredDiags( 8304 llvm::SmallVector<Decl *, 4> &Decls) { 8305 for (unsigned I = 0, N = DeclsToCheckForDeferredDiags.size(); I != N; 8306 ++I) { 8307 auto *D = dyn_cast_or_null<Decl>( 8308 GetDecl(DeclsToCheckForDeferredDiags[I])); 8309 if (D) 8310 Decls.push_back(D); 8311 } 8312 DeclsToCheckForDeferredDiags.clear(); 8313 } 8314 8315 8316 void ASTReader::ReadReferencedSelectors( 8317 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) { 8318 if (ReferencedSelectorsData.empty()) 8319 return; 8320 8321 // If there are @selector references added them to its pool. This is for 8322 // implementation of -Wselector. 8323 unsigned int DataSize = ReferencedSelectorsData.size()-1; 8324 unsigned I = 0; 8325 while (I < DataSize) { 8326 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 8327 SourceLocation SelLoc 8328 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 8329 Sels.push_back(std::make_pair(Sel, SelLoc)); 8330 } 8331 ReferencedSelectorsData.clear(); 8332 } 8333 8334 void ASTReader::ReadWeakUndeclaredIdentifiers( 8335 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) { 8336 if (WeakUndeclaredIdentifiers.empty()) 8337 return; 8338 8339 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 8340 IdentifierInfo *WeakId 8341 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8342 IdentifierInfo *AliasId 8343 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8344 SourceLocation Loc 8345 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 8346 bool Used = WeakUndeclaredIdentifiers[I++]; 8347 WeakInfo WI(AliasId, Loc); 8348 WI.setUsed(Used); 8349 WeakIDs.push_back(std::make_pair(WeakId, WI)); 8350 } 8351 WeakUndeclaredIdentifiers.clear(); 8352 } 8353 8354 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 8355 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 8356 ExternalVTableUse VT; 8357 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 8358 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 8359 VT.DefinitionRequired = VTableUses[Idx++]; 8360 VTables.push_back(VT); 8361 } 8362 8363 VTableUses.clear(); 8364 } 8365 8366 void ASTReader::ReadPendingInstantiations( 8367 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) { 8368 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 8369 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 8370 SourceLocation Loc 8371 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 8372 8373 Pending.push_back(std::make_pair(D, Loc)); 8374 } 8375 PendingInstantiations.clear(); 8376 } 8377 8378 void ASTReader::ReadLateParsedTemplates( 8379 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>> 8380 &LPTMap) { 8381 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N; 8382 /* In loop */) { 8383 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++])); 8384 8385 auto LT = std::make_unique<LateParsedTemplate>(); 8386 LT->D = GetDecl(LateParsedTemplates[Idx++]); 8387 8388 ModuleFile *F = getOwningModuleFile(LT->D); 8389 assert(F && "No module"); 8390 8391 unsigned TokN = LateParsedTemplates[Idx++]; 8392 LT->Toks.reserve(TokN); 8393 for (unsigned T = 0; T < TokN; ++T) 8394 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx)); 8395 8396 LPTMap.insert(std::make_pair(FD, std::move(LT))); 8397 } 8398 8399 LateParsedTemplates.clear(); 8400 } 8401 8402 void ASTReader::LoadSelector(Selector Sel) { 8403 // It would be complicated to avoid reading the methods anyway. So don't. 8404 ReadMethodPool(Sel); 8405 } 8406 8407 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 8408 assert(ID && "Non-zero identifier ID required"); 8409 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 8410 IdentifiersLoaded[ID - 1] = II; 8411 if (DeserializationListener) 8412 DeserializationListener->IdentifierRead(ID, II); 8413 } 8414 8415 /// Set the globally-visible declarations associated with the given 8416 /// identifier. 8417 /// 8418 /// If the AST reader is currently in a state where the given declaration IDs 8419 /// cannot safely be resolved, they are queued until it is safe to resolve 8420 /// them. 8421 /// 8422 /// \param II an IdentifierInfo that refers to one or more globally-visible 8423 /// declarations. 8424 /// 8425 /// \param DeclIDs the set of declaration IDs with the name @p II that are 8426 /// visible at global scope. 8427 /// 8428 /// \param Decls if non-null, this vector will be populated with the set of 8429 /// deserialized declarations. These declarations will not be pushed into 8430 /// scope. 8431 void 8432 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 8433 const SmallVectorImpl<uint32_t> &DeclIDs, 8434 SmallVectorImpl<Decl *> *Decls) { 8435 if (NumCurrentElementsDeserializing && !Decls) { 8436 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 8437 return; 8438 } 8439 8440 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 8441 if (!SemaObj) { 8442 // Queue this declaration so that it will be added to the 8443 // translation unit scope and identifier's declaration chain 8444 // once a Sema object is known. 8445 PreloadedDeclIDs.push_back(DeclIDs[I]); 8446 continue; 8447 } 8448 8449 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 8450 8451 // If we're simply supposed to record the declarations, do so now. 8452 if (Decls) { 8453 Decls->push_back(D); 8454 continue; 8455 } 8456 8457 // Introduce this declaration into the translation-unit scope 8458 // and add it to the declaration chain for this identifier, so 8459 // that (unqualified) name lookup will find it. 8460 pushExternalDeclIntoScope(D, II); 8461 } 8462 } 8463 8464 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 8465 if (ID == 0) 8466 return nullptr; 8467 8468 if (IdentifiersLoaded.empty()) { 8469 Error("no identifier table in AST file"); 8470 return nullptr; 8471 } 8472 8473 ID -= 1; 8474 if (!IdentifiersLoaded[ID]) { 8475 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 8476 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 8477 ModuleFile *M = I->second; 8478 unsigned Index = ID - M->BaseIdentifierID; 8479 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index]; 8480 8481 // All of the strings in the AST file are preceded by a 16-bit length. 8482 // Extract that 16-bit length to avoid having to execute strlen(). 8483 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as 8484 // unsigned integers. This is important to avoid integer overflow when 8485 // we cast them to 'unsigned'. 8486 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2; 8487 unsigned StrLen = (((unsigned) StrLenPtr[0]) 8488 | (((unsigned) StrLenPtr[1]) << 8)) - 1; 8489 auto &II = PP.getIdentifierTable().get(StringRef(Str, StrLen)); 8490 IdentifiersLoaded[ID] = &II; 8491 markIdentifierFromAST(*this, II); 8492 if (DeserializationListener) 8493 DeserializationListener->IdentifierRead(ID + 1, &II); 8494 } 8495 8496 return IdentifiersLoaded[ID]; 8497 } 8498 8499 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 8500 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 8501 } 8502 8503 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 8504 if (LocalID < NUM_PREDEF_IDENT_IDS) 8505 return LocalID; 8506 8507 if (!M.ModuleOffsetMap.empty()) 8508 ReadModuleOffsetMap(M); 8509 8510 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8511 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 8512 assert(I != M.IdentifierRemap.end() 8513 && "Invalid index into identifier index remap"); 8514 8515 return LocalID + I->second; 8516 } 8517 8518 MacroInfo *ASTReader::getMacro(MacroID ID) { 8519 if (ID == 0) 8520 return nullptr; 8521 8522 if (MacrosLoaded.empty()) { 8523 Error("no macro table in AST file"); 8524 return nullptr; 8525 } 8526 8527 ID -= NUM_PREDEF_MACRO_IDS; 8528 if (!MacrosLoaded[ID]) { 8529 GlobalMacroMapType::iterator I 8530 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 8531 assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 8532 ModuleFile *M = I->second; 8533 unsigned Index = ID - M->BaseMacroID; 8534 MacrosLoaded[ID] = 8535 ReadMacroRecord(*M, M->MacroOffsetsBase + M->MacroOffsets[Index]); 8536 8537 if (DeserializationListener) 8538 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 8539 MacrosLoaded[ID]); 8540 } 8541 8542 return MacrosLoaded[ID]; 8543 } 8544 8545 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 8546 if (LocalID < NUM_PREDEF_MACRO_IDS) 8547 return LocalID; 8548 8549 if (!M.ModuleOffsetMap.empty()) 8550 ReadModuleOffsetMap(M); 8551 8552 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8553 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 8554 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 8555 8556 return LocalID + I->second; 8557 } 8558 8559 serialization::SubmoduleID 8560 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 8561 if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 8562 return LocalID; 8563 8564 if (!M.ModuleOffsetMap.empty()) 8565 ReadModuleOffsetMap(M); 8566 8567 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8568 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 8569 assert(I != M.SubmoduleRemap.end() 8570 && "Invalid index into submodule index remap"); 8571 8572 return LocalID + I->second; 8573 } 8574 8575 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) { 8576 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 8577 assert(GlobalID == 0 && "Unhandled global submodule ID"); 8578 return nullptr; 8579 } 8580 8581 if (GlobalID > SubmodulesLoaded.size()) { 8582 Error("submodule ID out of range in AST file"); 8583 return nullptr; 8584 } 8585 8586 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 8587 } 8588 8589 Module *ASTReader::getModule(unsigned ID) { 8590 return getSubmodule(ID); 8591 } 8592 8593 bool ASTReader::DeclIsFromPCHWithObjectFile(const Decl *D) { 8594 ModuleFile *MF = getOwningModuleFile(D); 8595 return MF && MF->PCHHasObjectFile; 8596 } 8597 8598 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) { 8599 if (ID & 1) { 8600 // It's a module, look it up by submodule ID. 8601 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1)); 8602 return I == GlobalSubmoduleMap.end() ? nullptr : I->second; 8603 } else { 8604 // It's a prefix (preamble, PCH, ...). Look it up by index. 8605 unsigned IndexFromEnd = ID >> 1; 8606 assert(IndexFromEnd && "got reference to unknown module file"); 8607 return getModuleManager().pch_modules().end()[-IndexFromEnd]; 8608 } 8609 } 8610 8611 unsigned ASTReader::getModuleFileID(ModuleFile *F) { 8612 if (!F) 8613 return 1; 8614 8615 // For a file representing a module, use the submodule ID of the top-level 8616 // module as the file ID. For any other kind of file, the number of such 8617 // files loaded beforehand will be the same on reload. 8618 // FIXME: Is this true even if we have an explicit module file and a PCH? 8619 if (F->isModule()) 8620 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1; 8621 8622 auto PCHModules = getModuleManager().pch_modules(); 8623 auto I = llvm::find(PCHModules, F); 8624 assert(I != PCHModules.end() && "emitting reference to unknown file"); 8625 return (I - PCHModules.end()) << 1; 8626 } 8627 8628 llvm::Optional<ASTSourceDescriptor> 8629 ASTReader::getSourceDescriptor(unsigned ID) { 8630 if (Module *M = getSubmodule(ID)) 8631 return ASTSourceDescriptor(*M); 8632 8633 // If there is only a single PCH, return it instead. 8634 // Chained PCH are not supported. 8635 const auto &PCHChain = ModuleMgr.pch_modules(); 8636 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) { 8637 ModuleFile &MF = ModuleMgr.getPrimaryModule(); 8638 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName); 8639 StringRef FileName = llvm::sys::path::filename(MF.FileName); 8640 return ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName, 8641 MF.Signature); 8642 } 8643 return None; 8644 } 8645 8646 ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) { 8647 auto I = DefinitionSource.find(FD); 8648 if (I == DefinitionSource.end()) 8649 return EK_ReplyHazy; 8650 return I->second ? EK_Never : EK_Always; 8651 } 8652 8653 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 8654 return DecodeSelector(getGlobalSelectorID(M, LocalID)); 8655 } 8656 8657 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { 8658 if (ID == 0) 8659 return Selector(); 8660 8661 if (ID > SelectorsLoaded.size()) { 8662 Error("selector ID out of range in AST file"); 8663 return Selector(); 8664 } 8665 8666 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) { 8667 // Load this selector from the selector table. 8668 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 8669 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 8670 ModuleFile &M = *I->second; 8671 ASTSelectorLookupTrait Trait(*this, M); 8672 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 8673 SelectorsLoaded[ID - 1] = 8674 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 8675 if (DeserializationListener) 8676 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 8677 } 8678 8679 return SelectorsLoaded[ID - 1]; 8680 } 8681 8682 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 8683 return DecodeSelector(ID); 8684 } 8685 8686 uint32_t ASTReader::GetNumExternalSelectors() { 8687 // ID 0 (the null selector) is considered an external selector. 8688 return getTotalNumSelectors() + 1; 8689 } 8690 8691 serialization::SelectorID 8692 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 8693 if (LocalID < NUM_PREDEF_SELECTOR_IDS) 8694 return LocalID; 8695 8696 if (!M.ModuleOffsetMap.empty()) 8697 ReadModuleOffsetMap(M); 8698 8699 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8700 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 8701 assert(I != M.SelectorRemap.end() 8702 && "Invalid index into selector index remap"); 8703 8704 return LocalID + I->second; 8705 } 8706 8707 DeclarationNameLoc 8708 ASTRecordReader::readDeclarationNameLoc(DeclarationName Name) { 8709 DeclarationNameLoc DNLoc; 8710 switch (Name.getNameKind()) { 8711 case DeclarationName::CXXConstructorName: 8712 case DeclarationName::CXXDestructorName: 8713 case DeclarationName::CXXConversionFunctionName: 8714 DNLoc.NamedType.TInfo = readTypeSourceInfo(); 8715 break; 8716 8717 case DeclarationName::CXXOperatorName: 8718 DNLoc.CXXOperatorName.BeginOpNameLoc 8719 = readSourceLocation().getRawEncoding(); 8720 DNLoc.CXXOperatorName.EndOpNameLoc 8721 = readSourceLocation().getRawEncoding(); 8722 break; 8723 8724 case DeclarationName::CXXLiteralOperatorName: 8725 DNLoc.CXXLiteralOperatorName.OpNameLoc 8726 = readSourceLocation().getRawEncoding(); 8727 break; 8728 8729 case DeclarationName::Identifier: 8730 case DeclarationName::ObjCZeroArgSelector: 8731 case DeclarationName::ObjCOneArgSelector: 8732 case DeclarationName::ObjCMultiArgSelector: 8733 case DeclarationName::CXXUsingDirective: 8734 case DeclarationName::CXXDeductionGuideName: 8735 break; 8736 } 8737 return DNLoc; 8738 } 8739 8740 DeclarationNameInfo ASTRecordReader::readDeclarationNameInfo() { 8741 DeclarationNameInfo NameInfo; 8742 NameInfo.setName(readDeclarationName()); 8743 NameInfo.setLoc(readSourceLocation()); 8744 NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName())); 8745 return NameInfo; 8746 } 8747 8748 void ASTRecordReader::readQualifierInfo(QualifierInfo &Info) { 8749 Info.QualifierLoc = readNestedNameSpecifierLoc(); 8750 unsigned NumTPLists = readInt(); 8751 Info.NumTemplParamLists = NumTPLists; 8752 if (NumTPLists) { 8753 Info.TemplParamLists = 8754 new (getContext()) TemplateParameterList *[NumTPLists]; 8755 for (unsigned i = 0; i != NumTPLists; ++i) 8756 Info.TemplParamLists[i] = readTemplateParameterList(); 8757 } 8758 } 8759 8760 TemplateParameterList * 8761 ASTRecordReader::readTemplateParameterList() { 8762 SourceLocation TemplateLoc = readSourceLocation(); 8763 SourceLocation LAngleLoc = readSourceLocation(); 8764 SourceLocation RAngleLoc = readSourceLocation(); 8765 8766 unsigned NumParams = readInt(); 8767 SmallVector<NamedDecl *, 16> Params; 8768 Params.reserve(NumParams); 8769 while (NumParams--) 8770 Params.push_back(readDeclAs<NamedDecl>()); 8771 8772 bool HasRequiresClause = readBool(); 8773 Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr; 8774 8775 TemplateParameterList *TemplateParams = TemplateParameterList::Create( 8776 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause); 8777 return TemplateParams; 8778 } 8779 8780 void ASTRecordReader::readTemplateArgumentList( 8781 SmallVectorImpl<TemplateArgument> &TemplArgs, 8782 bool Canonicalize) { 8783 unsigned NumTemplateArgs = readInt(); 8784 TemplArgs.reserve(NumTemplateArgs); 8785 while (NumTemplateArgs--) 8786 TemplArgs.push_back(readTemplateArgument(Canonicalize)); 8787 } 8788 8789 /// Read a UnresolvedSet structure. 8790 void ASTRecordReader::readUnresolvedSet(LazyASTUnresolvedSet &Set) { 8791 unsigned NumDecls = readInt(); 8792 Set.reserve(getContext(), NumDecls); 8793 while (NumDecls--) { 8794 DeclID ID = readDeclID(); 8795 AccessSpecifier AS = (AccessSpecifier) readInt(); 8796 Set.addLazyDecl(getContext(), ID, AS); 8797 } 8798 } 8799 8800 CXXBaseSpecifier 8801 ASTRecordReader::readCXXBaseSpecifier() { 8802 bool isVirtual = readBool(); 8803 bool isBaseOfClass = readBool(); 8804 AccessSpecifier AS = static_cast<AccessSpecifier>(readInt()); 8805 bool inheritConstructors = readBool(); 8806 TypeSourceInfo *TInfo = readTypeSourceInfo(); 8807 SourceRange Range = readSourceRange(); 8808 SourceLocation EllipsisLoc = readSourceLocation(); 8809 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 8810 EllipsisLoc); 8811 Result.setInheritConstructors(inheritConstructors); 8812 return Result; 8813 } 8814 8815 CXXCtorInitializer ** 8816 ASTRecordReader::readCXXCtorInitializers() { 8817 ASTContext &Context = getContext(); 8818 unsigned NumInitializers = readInt(); 8819 assert(NumInitializers && "wrote ctor initializers but have no inits"); 8820 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers]; 8821 for (unsigned i = 0; i != NumInitializers; ++i) { 8822 TypeSourceInfo *TInfo = nullptr; 8823 bool IsBaseVirtual = false; 8824 FieldDecl *Member = nullptr; 8825 IndirectFieldDecl *IndirectMember = nullptr; 8826 8827 CtorInitializerType Type = (CtorInitializerType) readInt(); 8828 switch (Type) { 8829 case CTOR_INITIALIZER_BASE: 8830 TInfo = readTypeSourceInfo(); 8831 IsBaseVirtual = readBool(); 8832 break; 8833 8834 case CTOR_INITIALIZER_DELEGATING: 8835 TInfo = readTypeSourceInfo(); 8836 break; 8837 8838 case CTOR_INITIALIZER_MEMBER: 8839 Member = readDeclAs<FieldDecl>(); 8840 break; 8841 8842 case CTOR_INITIALIZER_INDIRECT_MEMBER: 8843 IndirectMember = readDeclAs<IndirectFieldDecl>(); 8844 break; 8845 } 8846 8847 SourceLocation MemberOrEllipsisLoc = readSourceLocation(); 8848 Expr *Init = readExpr(); 8849 SourceLocation LParenLoc = readSourceLocation(); 8850 SourceLocation RParenLoc = readSourceLocation(); 8851 8852 CXXCtorInitializer *BOMInit; 8853 if (Type == CTOR_INITIALIZER_BASE) 8854 BOMInit = new (Context) 8855 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init, 8856 RParenLoc, MemberOrEllipsisLoc); 8857 else if (Type == CTOR_INITIALIZER_DELEGATING) 8858 BOMInit = new (Context) 8859 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc); 8860 else if (Member) 8861 BOMInit = new (Context) 8862 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc, 8863 Init, RParenLoc); 8864 else 8865 BOMInit = new (Context) 8866 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc, 8867 LParenLoc, Init, RParenLoc); 8868 8869 if (/*IsWritten*/readBool()) { 8870 unsigned SourceOrder = readInt(); 8871 BOMInit->setSourceOrder(SourceOrder); 8872 } 8873 8874 CtorInitializers[i] = BOMInit; 8875 } 8876 8877 return CtorInitializers; 8878 } 8879 8880 NestedNameSpecifierLoc 8881 ASTRecordReader::readNestedNameSpecifierLoc() { 8882 ASTContext &Context = getContext(); 8883 unsigned N = readInt(); 8884 NestedNameSpecifierLocBuilder Builder; 8885 for (unsigned I = 0; I != N; ++I) { 8886 auto Kind = readNestedNameSpecifierKind(); 8887 switch (Kind) { 8888 case NestedNameSpecifier::Identifier: { 8889 IdentifierInfo *II = readIdentifier(); 8890 SourceRange Range = readSourceRange(); 8891 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 8892 break; 8893 } 8894 8895 case NestedNameSpecifier::Namespace: { 8896 NamespaceDecl *NS = readDeclAs<NamespaceDecl>(); 8897 SourceRange Range = readSourceRange(); 8898 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 8899 break; 8900 } 8901 8902 case NestedNameSpecifier::NamespaceAlias: { 8903 NamespaceAliasDecl *Alias = readDeclAs<NamespaceAliasDecl>(); 8904 SourceRange Range = readSourceRange(); 8905 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 8906 break; 8907 } 8908 8909 case NestedNameSpecifier::TypeSpec: 8910 case NestedNameSpecifier::TypeSpecWithTemplate: { 8911 bool Template = readBool(); 8912 TypeSourceInfo *T = readTypeSourceInfo(); 8913 if (!T) 8914 return NestedNameSpecifierLoc(); 8915 SourceLocation ColonColonLoc = readSourceLocation(); 8916 8917 // FIXME: 'template' keyword location not saved anywhere, so we fake it. 8918 Builder.Extend(Context, 8919 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 8920 T->getTypeLoc(), ColonColonLoc); 8921 break; 8922 } 8923 8924 case NestedNameSpecifier::Global: { 8925 SourceLocation ColonColonLoc = readSourceLocation(); 8926 Builder.MakeGlobal(Context, ColonColonLoc); 8927 break; 8928 } 8929 8930 case NestedNameSpecifier::Super: { 8931 CXXRecordDecl *RD = readDeclAs<CXXRecordDecl>(); 8932 SourceRange Range = readSourceRange(); 8933 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd()); 8934 break; 8935 } 8936 } 8937 } 8938 8939 return Builder.getWithLocInContext(Context); 8940 } 8941 8942 SourceRange 8943 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 8944 unsigned &Idx) { 8945 SourceLocation beg = ReadSourceLocation(F, Record, Idx); 8946 SourceLocation end = ReadSourceLocation(F, Record, Idx); 8947 return SourceRange(beg, end); 8948 } 8949 8950 static FixedPointSemantics 8951 ReadFixedPointSemantics(const SmallVectorImpl<uint64_t> &Record, 8952 unsigned &Idx) { 8953 unsigned Width = Record[Idx++]; 8954 unsigned Scale = Record[Idx++]; 8955 uint64_t Tmp = Record[Idx++]; 8956 bool IsSigned = Tmp & 0x1; 8957 bool IsSaturated = Tmp & 0x2; 8958 bool HasUnsignedPadding = Tmp & 0x4; 8959 return FixedPointSemantics(Width, Scale, IsSigned, IsSaturated, 8960 HasUnsignedPadding); 8961 } 8962 8963 static const llvm::fltSemantics & 8964 readAPFloatSemantics(ASTRecordReader &reader) { 8965 return llvm::APFloatBase::EnumToSemantics( 8966 static_cast<llvm::APFloatBase::Semantics>(reader.readInt())); 8967 } 8968 8969 APValue ASTRecordReader::readAPValue() { 8970 unsigned Kind = readInt(); 8971 switch ((APValue::ValueKind) Kind) { 8972 case APValue::None: 8973 return APValue(); 8974 case APValue::Indeterminate: 8975 return APValue::IndeterminateValue(); 8976 case APValue::Int: 8977 return APValue(readAPSInt()); 8978 case APValue::Float: { 8979 const llvm::fltSemantics &FloatSema = readAPFloatSemantics(*this); 8980 return APValue(readAPFloat(FloatSema)); 8981 } 8982 case APValue::FixedPoint: { 8983 FixedPointSemantics FPSema = ReadFixedPointSemantics(Record, Idx); 8984 return APValue(APFixedPoint(readAPInt(), FPSema)); 8985 } 8986 case APValue::ComplexInt: { 8987 llvm::APSInt First = readAPSInt(); 8988 return APValue(std::move(First), readAPSInt()); 8989 } 8990 case APValue::ComplexFloat: { 8991 const llvm::fltSemantics &FloatSema1 = readAPFloatSemantics(*this); 8992 llvm::APFloat First = readAPFloat(FloatSema1); 8993 const llvm::fltSemantics &FloatSema2 = readAPFloatSemantics(*this); 8994 return APValue(std::move(First), readAPFloat(FloatSema2)); 8995 } 8996 case APValue::LValue: 8997 case APValue::Vector: 8998 case APValue::Array: 8999 case APValue::Struct: 9000 case APValue::Union: 9001 case APValue::MemberPointer: 9002 case APValue::AddrLabelDiff: 9003 // TODO : Handle all these APValue::ValueKind. 9004 return APValue(); 9005 } 9006 llvm_unreachable("Invalid APValue::ValueKind"); 9007 } 9008 9009 /// Read a floating-point value 9010 llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) { 9011 return llvm::APFloat(Sem, readAPInt()); 9012 } 9013 9014 // Read a string 9015 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 9016 unsigned Len = Record[Idx++]; 9017 std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 9018 Idx += Len; 9019 return Result; 9020 } 9021 9022 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record, 9023 unsigned &Idx) { 9024 std::string Filename = ReadString(Record, Idx); 9025 ResolveImportedPath(F, Filename); 9026 return Filename; 9027 } 9028 9029 std::string ASTReader::ReadPath(StringRef BaseDirectory, 9030 const RecordData &Record, unsigned &Idx) { 9031 std::string Filename = ReadString(Record, Idx); 9032 if (!BaseDirectory.empty()) 9033 ResolveImportedPath(Filename, BaseDirectory); 9034 return Filename; 9035 } 9036 9037 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 9038 unsigned &Idx) { 9039 unsigned Major = Record[Idx++]; 9040 unsigned Minor = Record[Idx++]; 9041 unsigned Subminor = Record[Idx++]; 9042 if (Minor == 0) 9043 return VersionTuple(Major); 9044 if (Subminor == 0) 9045 return VersionTuple(Major, Minor - 1); 9046 return VersionTuple(Major, Minor - 1, Subminor - 1); 9047 } 9048 9049 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 9050 const RecordData &Record, 9051 unsigned &Idx) { 9052 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 9053 return CXXTemporary::Create(getContext(), Decl); 9054 } 9055 9056 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const { 9057 return Diag(CurrentImportLoc, DiagID); 9058 } 9059 9060 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const { 9061 return Diags.Report(Loc, DiagID); 9062 } 9063 9064 /// Retrieve the identifier table associated with the 9065 /// preprocessor. 9066 IdentifierTable &ASTReader::getIdentifierTable() { 9067 return PP.getIdentifierTable(); 9068 } 9069 9070 /// Record that the given ID maps to the given switch-case 9071 /// statement. 9072 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 9073 assert((*CurrSwitchCaseStmts)[ID] == nullptr && 9074 "Already have a SwitchCase with this ID"); 9075 (*CurrSwitchCaseStmts)[ID] = SC; 9076 } 9077 9078 /// Retrieve the switch-case statement with the given ID. 9079 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 9080 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID"); 9081 return (*CurrSwitchCaseStmts)[ID]; 9082 } 9083 9084 void ASTReader::ClearSwitchCaseIDs() { 9085 CurrSwitchCaseStmts->clear(); 9086 } 9087 9088 void ASTReader::ReadComments() { 9089 ASTContext &Context = getContext(); 9090 std::vector<RawComment *> Comments; 9091 for (SmallVectorImpl<std::pair<BitstreamCursor, 9092 serialization::ModuleFile *>>::iterator 9093 I = CommentsCursors.begin(), 9094 E = CommentsCursors.end(); 9095 I != E; ++I) { 9096 Comments.clear(); 9097 BitstreamCursor &Cursor = I->first; 9098 serialization::ModuleFile &F = *I->second; 9099 SavedStreamPosition SavedPosition(Cursor); 9100 9101 RecordData Record; 9102 while (true) { 9103 Expected<llvm::BitstreamEntry> MaybeEntry = 9104 Cursor.advanceSkippingSubblocks( 9105 BitstreamCursor::AF_DontPopBlockAtEnd); 9106 if (!MaybeEntry) { 9107 Error(MaybeEntry.takeError()); 9108 return; 9109 } 9110 llvm::BitstreamEntry Entry = MaybeEntry.get(); 9111 9112 switch (Entry.Kind) { 9113 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 9114 case llvm::BitstreamEntry::Error: 9115 Error("malformed block record in AST file"); 9116 return; 9117 case llvm::BitstreamEntry::EndBlock: 9118 goto NextCursor; 9119 case llvm::BitstreamEntry::Record: 9120 // The interesting case. 9121 break; 9122 } 9123 9124 // Read a record. 9125 Record.clear(); 9126 Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record); 9127 if (!MaybeComment) { 9128 Error(MaybeComment.takeError()); 9129 return; 9130 } 9131 switch ((CommentRecordTypes)MaybeComment.get()) { 9132 case COMMENTS_RAW_COMMENT: { 9133 unsigned Idx = 0; 9134 SourceRange SR = ReadSourceRange(F, Record, Idx); 9135 RawComment::CommentKind Kind = 9136 (RawComment::CommentKind) Record[Idx++]; 9137 bool IsTrailingComment = Record[Idx++]; 9138 bool IsAlmostTrailingComment = Record[Idx++]; 9139 Comments.push_back(new (Context) RawComment( 9140 SR, Kind, IsTrailingComment, IsAlmostTrailingComment)); 9141 break; 9142 } 9143 } 9144 } 9145 NextCursor: 9146 llvm::DenseMap<FileID, std::map<unsigned, RawComment *>> 9147 FileToOffsetToComment; 9148 for (RawComment *C : Comments) { 9149 SourceLocation CommentLoc = C->getBeginLoc(); 9150 if (CommentLoc.isValid()) { 9151 std::pair<FileID, unsigned> Loc = 9152 SourceMgr.getDecomposedLoc(CommentLoc); 9153 if (Loc.first.isValid()) 9154 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C); 9155 } 9156 } 9157 } 9158 } 9159 9160 void ASTReader::visitInputFiles(serialization::ModuleFile &MF, 9161 bool IncludeSystem, bool Complain, 9162 llvm::function_ref<void(const serialization::InputFile &IF, 9163 bool isSystem)> Visitor) { 9164 unsigned NumUserInputs = MF.NumUserInputFiles; 9165 unsigned NumInputs = MF.InputFilesLoaded.size(); 9166 assert(NumUserInputs <= NumInputs); 9167 unsigned N = IncludeSystem ? NumInputs : NumUserInputs; 9168 for (unsigned I = 0; I < N; ++I) { 9169 bool IsSystem = I >= NumUserInputs; 9170 InputFile IF = getInputFile(MF, I+1, Complain); 9171 Visitor(IF, IsSystem); 9172 } 9173 } 9174 9175 void ASTReader::visitTopLevelModuleMaps( 9176 serialization::ModuleFile &MF, 9177 llvm::function_ref<void(const FileEntry *FE)> Visitor) { 9178 unsigned NumInputs = MF.InputFilesLoaded.size(); 9179 for (unsigned I = 0; I < NumInputs; ++I) { 9180 InputFileInfo IFI = readInputFileInfo(MF, I + 1); 9181 if (IFI.TopLevelModuleMap) 9182 // FIXME: This unnecessarily re-reads the InputFileInfo. 9183 if (auto *FE = getInputFile(MF, I + 1).getFile()) 9184 Visitor(FE); 9185 } 9186 } 9187 9188 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) { 9189 // If we know the owning module, use it. 9190 if (Module *M = D->getImportedOwningModule()) 9191 return M->getFullModuleName(); 9192 9193 // Otherwise, use the name of the top-level module the decl is within. 9194 if (ModuleFile *M = getOwningModuleFile(D)) 9195 return M->ModuleName; 9196 9197 // Not from a module. 9198 return {}; 9199 } 9200 9201 void ASTReader::finishPendingActions() { 9202 while (!PendingIdentifierInfos.empty() || !PendingFunctionTypes.empty() || 9203 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() || 9204 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || 9205 !PendingUpdateRecords.empty()) { 9206 // If any identifiers with corresponding top-level declarations have 9207 // been loaded, load those declarations now. 9208 using TopLevelDeclsMap = 9209 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>; 9210 TopLevelDeclsMap TopLevelDecls; 9211 9212 while (!PendingIdentifierInfos.empty()) { 9213 IdentifierInfo *II = PendingIdentifierInfos.back().first; 9214 SmallVector<uint32_t, 4> DeclIDs = 9215 std::move(PendingIdentifierInfos.back().second); 9216 PendingIdentifierInfos.pop_back(); 9217 9218 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 9219 } 9220 9221 // Load each function type that we deferred loading because it was a 9222 // deduced type that might refer to a local type declared within itself. 9223 for (unsigned I = 0; I != PendingFunctionTypes.size(); ++I) { 9224 auto *FD = PendingFunctionTypes[I].first; 9225 FD->setType(GetType(PendingFunctionTypes[I].second)); 9226 9227 // If we gave a function a deduced return type, remember that we need to 9228 // propagate that along the redeclaration chain. 9229 auto *DT = FD->getReturnType()->getContainedDeducedType(); 9230 if (DT && DT->isDeduced()) 9231 PendingDeducedTypeUpdates.insert( 9232 {FD->getCanonicalDecl(), FD->getReturnType()}); 9233 } 9234 PendingFunctionTypes.clear(); 9235 9236 // For each decl chain that we wanted to complete while deserializing, mark 9237 // it as "still needs to be completed". 9238 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) { 9239 markIncompleteDeclChain(PendingIncompleteDeclChains[I]); 9240 } 9241 PendingIncompleteDeclChains.clear(); 9242 9243 // Load pending declaration chains. 9244 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) 9245 loadPendingDeclChain(PendingDeclChains[I].first, 9246 PendingDeclChains[I].second); 9247 PendingDeclChains.clear(); 9248 9249 // Make the most recent of the top-level declarations visible. 9250 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 9251 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 9252 IdentifierInfo *II = TLD->first; 9253 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 9254 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 9255 } 9256 } 9257 9258 // Load any pending macro definitions. 9259 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 9260 IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 9261 SmallVector<PendingMacroInfo, 2> GlobalIDs; 9262 GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 9263 // Initialize the macro history from chained-PCHs ahead of module imports. 9264 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9265 ++IDIdx) { 9266 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9267 if (!Info.M->isModule()) 9268 resolvePendingMacro(II, Info); 9269 } 9270 // Handle module imports. 9271 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9272 ++IDIdx) { 9273 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9274 if (Info.M->isModule()) 9275 resolvePendingMacro(II, Info); 9276 } 9277 } 9278 PendingMacroIDs.clear(); 9279 9280 // Wire up the DeclContexts for Decls that we delayed setting until 9281 // recursive loading is completed. 9282 while (!PendingDeclContextInfos.empty()) { 9283 PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 9284 PendingDeclContextInfos.pop_front(); 9285 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 9286 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 9287 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 9288 } 9289 9290 // Perform any pending declaration updates. 9291 while (!PendingUpdateRecords.empty()) { 9292 auto Update = PendingUpdateRecords.pop_back_val(); 9293 ReadingKindTracker ReadingKind(Read_Decl, *this); 9294 loadDeclUpdateRecords(Update); 9295 } 9296 } 9297 9298 // At this point, all update records for loaded decls are in place, so any 9299 // fake class definitions should have become real. 9300 assert(PendingFakeDefinitionData.empty() && 9301 "faked up a class definition but never saw the real one"); 9302 9303 // If we deserialized any C++ or Objective-C class definitions, any 9304 // Objective-C protocol definitions, or any redeclarable templates, make sure 9305 // that all redeclarations point to the definitions. Note that this can only 9306 // happen now, after the redeclaration chains have been fully wired. 9307 for (Decl *D : PendingDefinitions) { 9308 if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 9309 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) { 9310 // Make sure that the TagType points at the definition. 9311 const_cast<TagType*>(TagT)->decl = TD; 9312 } 9313 9314 if (auto RD = dyn_cast<CXXRecordDecl>(D)) { 9315 for (auto *R = getMostRecentExistingDecl(RD); R; 9316 R = R->getPreviousDecl()) { 9317 assert((R == D) == 9318 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && 9319 "declaration thinks it's the definition but it isn't"); 9320 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData; 9321 } 9322 } 9323 9324 continue; 9325 } 9326 9327 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) { 9328 // Make sure that the ObjCInterfaceType points at the definition. 9329 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 9330 ->Decl = ID; 9331 9332 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl()) 9333 cast<ObjCInterfaceDecl>(R)->Data = ID->Data; 9334 9335 continue; 9336 } 9337 9338 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) { 9339 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl()) 9340 cast<ObjCProtocolDecl>(R)->Data = PD->Data; 9341 9342 continue; 9343 } 9344 9345 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl(); 9346 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl()) 9347 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common; 9348 } 9349 PendingDefinitions.clear(); 9350 9351 // Load the bodies of any functions or methods we've encountered. We do 9352 // this now (delayed) so that we can be sure that the declaration chains 9353 // have been fully wired up (hasBody relies on this). 9354 // FIXME: We shouldn't require complete redeclaration chains here. 9355 for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 9356 PBEnd = PendingBodies.end(); 9357 PB != PBEnd; ++PB) { 9358 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 9359 // For a function defined inline within a class template, force the 9360 // canonical definition to be the one inside the canonical definition of 9361 // the template. This ensures that we instantiate from a correct view 9362 // of the template. 9363 // 9364 // Sadly we can't do this more generally: we can't be sure that all 9365 // copies of an arbitrary class definition will have the same members 9366 // defined (eg, some member functions may not be instantiated, and some 9367 // special members may or may not have been implicitly defined). 9368 if (auto *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalParent())) 9369 if (RD->isDependentContext() && !RD->isThisDeclarationADefinition()) 9370 continue; 9371 9372 // FIXME: Check for =delete/=default? 9373 // FIXME: Complain about ODR violations here? 9374 const FunctionDecl *Defn = nullptr; 9375 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) { 9376 FD->setLazyBody(PB->second); 9377 } else { 9378 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn); 9379 mergeDefinitionVisibility(NonConstDefn, FD); 9380 9381 if (!FD->isLateTemplateParsed() && 9382 !NonConstDefn->isLateTemplateParsed() && 9383 FD->getODRHash() != NonConstDefn->getODRHash()) { 9384 if (!isa<CXXMethodDecl>(FD)) { 9385 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9386 } else if (FD->getLexicalParent()->isFileContext() && 9387 NonConstDefn->getLexicalParent()->isFileContext()) { 9388 // Only diagnose out-of-line method definitions. If they are 9389 // in class definitions, then an error will be generated when 9390 // processing the class bodies. 9391 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9392 } 9393 } 9394 } 9395 continue; 9396 } 9397 9398 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 9399 if (!getContext().getLangOpts().Modules || !MD->hasBody()) 9400 MD->setLazyBody(PB->second); 9401 } 9402 PendingBodies.clear(); 9403 9404 // Do some cleanup. 9405 for (auto *ND : PendingMergedDefinitionsToDeduplicate) 9406 getContext().deduplicateMergedDefinitonsFor(ND); 9407 PendingMergedDefinitionsToDeduplicate.clear(); 9408 } 9409 9410 void ASTReader::diagnoseOdrViolations() { 9411 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() && 9412 PendingFunctionOdrMergeFailures.empty() && 9413 PendingEnumOdrMergeFailures.empty()) 9414 return; 9415 9416 // Trigger the import of the full definition of each class that had any 9417 // odr-merging problems, so we can produce better diagnostics for them. 9418 // These updates may in turn find and diagnose some ODR failures, so take 9419 // ownership of the set first. 9420 auto OdrMergeFailures = std::move(PendingOdrMergeFailures); 9421 PendingOdrMergeFailures.clear(); 9422 for (auto &Merge : OdrMergeFailures) { 9423 Merge.first->buildLookup(); 9424 Merge.first->decls_begin(); 9425 Merge.first->bases_begin(); 9426 Merge.first->vbases_begin(); 9427 for (auto &RecordPair : Merge.second) { 9428 auto *RD = RecordPair.first; 9429 RD->decls_begin(); 9430 RD->bases_begin(); 9431 RD->vbases_begin(); 9432 } 9433 } 9434 9435 // Trigger the import of functions. 9436 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures); 9437 PendingFunctionOdrMergeFailures.clear(); 9438 for (auto &Merge : FunctionOdrMergeFailures) { 9439 Merge.first->buildLookup(); 9440 Merge.first->decls_begin(); 9441 Merge.first->getBody(); 9442 for (auto &FD : Merge.second) { 9443 FD->buildLookup(); 9444 FD->decls_begin(); 9445 FD->getBody(); 9446 } 9447 } 9448 9449 // Trigger the import of enums. 9450 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures); 9451 PendingEnumOdrMergeFailures.clear(); 9452 for (auto &Merge : EnumOdrMergeFailures) { 9453 Merge.first->decls_begin(); 9454 for (auto &Enum : Merge.second) { 9455 Enum->decls_begin(); 9456 } 9457 } 9458 9459 // For each declaration from a merged context, check that the canonical 9460 // definition of that context also contains a declaration of the same 9461 // entity. 9462 // 9463 // Caution: this loop does things that might invalidate iterators into 9464 // PendingOdrMergeChecks. Don't turn this into a range-based for loop! 9465 while (!PendingOdrMergeChecks.empty()) { 9466 NamedDecl *D = PendingOdrMergeChecks.pop_back_val(); 9467 9468 // FIXME: Skip over implicit declarations for now. This matters for things 9469 // like implicitly-declared special member functions. This isn't entirely 9470 // correct; we can end up with multiple unmerged declarations of the same 9471 // implicit entity. 9472 if (D->isImplicit()) 9473 continue; 9474 9475 DeclContext *CanonDef = D->getDeclContext(); 9476 9477 bool Found = false; 9478 const Decl *DCanon = D->getCanonicalDecl(); 9479 9480 for (auto RI : D->redecls()) { 9481 if (RI->getLexicalDeclContext() == CanonDef) { 9482 Found = true; 9483 break; 9484 } 9485 } 9486 if (Found) 9487 continue; 9488 9489 // Quick check failed, time to do the slow thing. Note, we can't just 9490 // look up the name of D in CanonDef here, because the member that is 9491 // in CanonDef might not be found by name lookup (it might have been 9492 // replaced by a more recent declaration in the lookup table), and we 9493 // can't necessarily find it in the redeclaration chain because it might 9494 // be merely mergeable, not redeclarable. 9495 llvm::SmallVector<const NamedDecl*, 4> Candidates; 9496 for (auto *CanonMember : CanonDef->decls()) { 9497 if (CanonMember->getCanonicalDecl() == DCanon) { 9498 // This can happen if the declaration is merely mergeable and not 9499 // actually redeclarable (we looked for redeclarations earlier). 9500 // 9501 // FIXME: We should be able to detect this more efficiently, without 9502 // pulling in all of the members of CanonDef. 9503 Found = true; 9504 break; 9505 } 9506 if (auto *ND = dyn_cast<NamedDecl>(CanonMember)) 9507 if (ND->getDeclName() == D->getDeclName()) 9508 Candidates.push_back(ND); 9509 } 9510 9511 if (!Found) { 9512 // The AST doesn't like TagDecls becoming invalid after they've been 9513 // completed. We only really need to mark FieldDecls as invalid here. 9514 if (!isa<TagDecl>(D)) 9515 D->setInvalidDecl(); 9516 9517 // Ensure we don't accidentally recursively enter deserialization while 9518 // we're producing our diagnostic. 9519 Deserializing RecursionGuard(this); 9520 9521 std::string CanonDefModule = 9522 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef)); 9523 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl) 9524 << D << getOwningModuleNameForDiagnostic(D) 9525 << CanonDef << CanonDefModule.empty() << CanonDefModule; 9526 9527 if (Candidates.empty()) 9528 Diag(cast<Decl>(CanonDef)->getLocation(), 9529 diag::note_module_odr_violation_no_possible_decls) << D; 9530 else { 9531 for (unsigned I = 0, N = Candidates.size(); I != N; ++I) 9532 Diag(Candidates[I]->getLocation(), 9533 diag::note_module_odr_violation_possible_decl) 9534 << Candidates[I]; 9535 } 9536 9537 DiagnosedOdrMergeFailures.insert(CanonDef); 9538 } 9539 } 9540 9541 if (OdrMergeFailures.empty() && FunctionOdrMergeFailures.empty() && 9542 EnumOdrMergeFailures.empty()) 9543 return; 9544 9545 // Ensure we don't accidentally recursively enter deserialization while 9546 // we're producing our diagnostics. 9547 Deserializing RecursionGuard(this); 9548 9549 // Common code for hashing helpers. 9550 ODRHash Hash; 9551 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) { 9552 Hash.clear(); 9553 Hash.AddQualType(Ty); 9554 return Hash.CalculateHash(); 9555 }; 9556 9557 auto ComputeODRHash = [&Hash](const Stmt *S) { 9558 assert(S); 9559 Hash.clear(); 9560 Hash.AddStmt(S); 9561 return Hash.CalculateHash(); 9562 }; 9563 9564 auto ComputeSubDeclODRHash = [&Hash](const Decl *D) { 9565 assert(D); 9566 Hash.clear(); 9567 Hash.AddSubDecl(D); 9568 return Hash.CalculateHash(); 9569 }; 9570 9571 auto ComputeTemplateArgumentODRHash = [&Hash](const TemplateArgument &TA) { 9572 Hash.clear(); 9573 Hash.AddTemplateArgument(TA); 9574 return Hash.CalculateHash(); 9575 }; 9576 9577 auto ComputeTemplateParameterListODRHash = 9578 [&Hash](const TemplateParameterList *TPL) { 9579 assert(TPL); 9580 Hash.clear(); 9581 Hash.AddTemplateParameterList(TPL); 9582 return Hash.CalculateHash(); 9583 }; 9584 9585 // Used with err_module_odr_violation_mismatch_decl and 9586 // note_module_odr_violation_mismatch_decl 9587 // This list should be the same Decl's as in ODRHash::isDeclToBeProcessed 9588 enum ODRMismatchDecl { 9589 EndOfClass, 9590 PublicSpecifer, 9591 PrivateSpecifer, 9592 ProtectedSpecifer, 9593 StaticAssert, 9594 Field, 9595 CXXMethod, 9596 TypeAlias, 9597 TypeDef, 9598 Var, 9599 Friend, 9600 FunctionTemplate, 9601 Other 9602 }; 9603 9604 // Used with err_module_odr_violation_mismatch_decl_diff and 9605 // note_module_odr_violation_mismatch_decl_diff 9606 enum ODRMismatchDeclDifference { 9607 StaticAssertCondition, 9608 StaticAssertMessage, 9609 StaticAssertOnlyMessage, 9610 FieldName, 9611 FieldTypeName, 9612 FieldSingleBitField, 9613 FieldDifferentWidthBitField, 9614 FieldSingleMutable, 9615 FieldSingleInitializer, 9616 FieldDifferentInitializers, 9617 MethodName, 9618 MethodDeleted, 9619 MethodDefaulted, 9620 MethodVirtual, 9621 MethodStatic, 9622 MethodVolatile, 9623 MethodConst, 9624 MethodInline, 9625 MethodNumberParameters, 9626 MethodParameterType, 9627 MethodParameterName, 9628 MethodParameterSingleDefaultArgument, 9629 MethodParameterDifferentDefaultArgument, 9630 MethodNoTemplateArguments, 9631 MethodDifferentNumberTemplateArguments, 9632 MethodDifferentTemplateArgument, 9633 MethodSingleBody, 9634 MethodDifferentBody, 9635 TypedefName, 9636 TypedefType, 9637 VarName, 9638 VarType, 9639 VarSingleInitializer, 9640 VarDifferentInitializer, 9641 VarConstexpr, 9642 FriendTypeFunction, 9643 FriendType, 9644 FriendFunction, 9645 FunctionTemplateDifferentNumberParameters, 9646 FunctionTemplateParameterDifferentKind, 9647 FunctionTemplateParameterName, 9648 FunctionTemplateParameterSingleDefaultArgument, 9649 FunctionTemplateParameterDifferentDefaultArgument, 9650 FunctionTemplateParameterDifferentType, 9651 FunctionTemplatePackParameter, 9652 }; 9653 9654 // These lambdas have the common portions of the ODR diagnostics. This 9655 // has the same return as Diag(), so addition parameters can be passed 9656 // in with operator<< 9657 auto ODRDiagDeclError = [this](NamedDecl *FirstRecord, StringRef FirstModule, 9658 SourceLocation Loc, SourceRange Range, 9659 ODRMismatchDeclDifference DiffType) { 9660 return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff) 9661 << FirstRecord << FirstModule.empty() << FirstModule << Range 9662 << DiffType; 9663 }; 9664 auto ODRDiagDeclNote = [this](StringRef SecondModule, SourceLocation Loc, 9665 SourceRange Range, ODRMismatchDeclDifference DiffType) { 9666 return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff) 9667 << SecondModule << Range << DiffType; 9668 }; 9669 9670 auto ODRDiagField = [this, &ODRDiagDeclError, &ODRDiagDeclNote, 9671 &ComputeQualTypeODRHash, &ComputeODRHash]( 9672 NamedDecl *FirstRecord, StringRef FirstModule, 9673 StringRef SecondModule, FieldDecl *FirstField, 9674 FieldDecl *SecondField) { 9675 IdentifierInfo *FirstII = FirstField->getIdentifier(); 9676 IdentifierInfo *SecondII = SecondField->getIdentifier(); 9677 if (FirstII->getName() != SecondII->getName()) { 9678 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9679 FirstField->getSourceRange(), FieldName) 9680 << FirstII; 9681 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9682 SecondField->getSourceRange(), FieldName) 9683 << SecondII; 9684 9685 return true; 9686 } 9687 9688 assert(getContext().hasSameType(FirstField->getType(), 9689 SecondField->getType())); 9690 9691 QualType FirstType = FirstField->getType(); 9692 QualType SecondType = SecondField->getType(); 9693 if (ComputeQualTypeODRHash(FirstType) != 9694 ComputeQualTypeODRHash(SecondType)) { 9695 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9696 FirstField->getSourceRange(), FieldTypeName) 9697 << FirstII << FirstType; 9698 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9699 SecondField->getSourceRange(), FieldTypeName) 9700 << SecondII << SecondType; 9701 9702 return true; 9703 } 9704 9705 const bool IsFirstBitField = FirstField->isBitField(); 9706 const bool IsSecondBitField = SecondField->isBitField(); 9707 if (IsFirstBitField != IsSecondBitField) { 9708 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9709 FirstField->getSourceRange(), FieldSingleBitField) 9710 << FirstII << IsFirstBitField; 9711 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9712 SecondField->getSourceRange(), FieldSingleBitField) 9713 << SecondII << IsSecondBitField; 9714 return true; 9715 } 9716 9717 if (IsFirstBitField && IsSecondBitField) { 9718 unsigned FirstBitWidthHash = 9719 ComputeODRHash(FirstField->getBitWidth()); 9720 unsigned SecondBitWidthHash = 9721 ComputeODRHash(SecondField->getBitWidth()); 9722 if (FirstBitWidthHash != SecondBitWidthHash) { 9723 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9724 FirstField->getSourceRange(), 9725 FieldDifferentWidthBitField) 9726 << FirstII << FirstField->getBitWidth()->getSourceRange(); 9727 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9728 SecondField->getSourceRange(), 9729 FieldDifferentWidthBitField) 9730 << SecondII << SecondField->getBitWidth()->getSourceRange(); 9731 return true; 9732 } 9733 } 9734 9735 if (!PP.getLangOpts().CPlusPlus) 9736 return false; 9737 9738 const bool IsFirstMutable = FirstField->isMutable(); 9739 const bool IsSecondMutable = SecondField->isMutable(); 9740 if (IsFirstMutable != IsSecondMutable) { 9741 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9742 FirstField->getSourceRange(), FieldSingleMutable) 9743 << FirstII << IsFirstMutable; 9744 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9745 SecondField->getSourceRange(), FieldSingleMutable) 9746 << SecondII << IsSecondMutable; 9747 return true; 9748 } 9749 9750 const Expr *FirstInitializer = FirstField->getInClassInitializer(); 9751 const Expr *SecondInitializer = SecondField->getInClassInitializer(); 9752 if ((!FirstInitializer && SecondInitializer) || 9753 (FirstInitializer && !SecondInitializer)) { 9754 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9755 FirstField->getSourceRange(), FieldSingleInitializer) 9756 << FirstII << (FirstInitializer != nullptr); 9757 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9758 SecondField->getSourceRange(), FieldSingleInitializer) 9759 << SecondII << (SecondInitializer != nullptr); 9760 return true; 9761 } 9762 9763 if (FirstInitializer && SecondInitializer) { 9764 unsigned FirstInitHash = ComputeODRHash(FirstInitializer); 9765 unsigned SecondInitHash = ComputeODRHash(SecondInitializer); 9766 if (FirstInitHash != SecondInitHash) { 9767 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9768 FirstField->getSourceRange(), 9769 FieldDifferentInitializers) 9770 << FirstII << FirstInitializer->getSourceRange(); 9771 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9772 SecondField->getSourceRange(), 9773 FieldDifferentInitializers) 9774 << SecondII << SecondInitializer->getSourceRange(); 9775 return true; 9776 } 9777 } 9778 9779 return false; 9780 }; 9781 9782 auto ODRDiagTypeDefOrAlias = 9783 [&ODRDiagDeclError, &ODRDiagDeclNote, &ComputeQualTypeODRHash]( 9784 NamedDecl *FirstRecord, StringRef FirstModule, StringRef SecondModule, 9785 TypedefNameDecl *FirstTD, TypedefNameDecl *SecondTD, 9786 bool IsTypeAlias) { 9787 auto FirstName = FirstTD->getDeclName(); 9788 auto SecondName = SecondTD->getDeclName(); 9789 if (FirstName != SecondName) { 9790 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), 9791 FirstTD->getSourceRange(), TypedefName) 9792 << IsTypeAlias << FirstName; 9793 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), 9794 SecondTD->getSourceRange(), TypedefName) 9795 << IsTypeAlias << SecondName; 9796 return true; 9797 } 9798 9799 QualType FirstType = FirstTD->getUnderlyingType(); 9800 QualType SecondType = SecondTD->getUnderlyingType(); 9801 if (ComputeQualTypeODRHash(FirstType) != 9802 ComputeQualTypeODRHash(SecondType)) { 9803 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), 9804 FirstTD->getSourceRange(), TypedefType) 9805 << IsTypeAlias << FirstName << FirstType; 9806 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), 9807 SecondTD->getSourceRange(), TypedefType) 9808 << IsTypeAlias << SecondName << SecondType; 9809 return true; 9810 } 9811 9812 return false; 9813 }; 9814 9815 auto ODRDiagVar = [&ODRDiagDeclError, &ODRDiagDeclNote, 9816 &ComputeQualTypeODRHash, &ComputeODRHash, 9817 this](NamedDecl *FirstRecord, StringRef FirstModule, 9818 StringRef SecondModule, VarDecl *FirstVD, 9819 VarDecl *SecondVD) { 9820 auto FirstName = FirstVD->getDeclName(); 9821 auto SecondName = SecondVD->getDeclName(); 9822 if (FirstName != SecondName) { 9823 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9824 FirstVD->getSourceRange(), VarName) 9825 << FirstName; 9826 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9827 SecondVD->getSourceRange(), VarName) 9828 << SecondName; 9829 return true; 9830 } 9831 9832 QualType FirstType = FirstVD->getType(); 9833 QualType SecondType = SecondVD->getType(); 9834 if (ComputeQualTypeODRHash(FirstType) != 9835 ComputeQualTypeODRHash(SecondType)) { 9836 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9837 FirstVD->getSourceRange(), VarType) 9838 << FirstName << FirstType; 9839 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9840 SecondVD->getSourceRange(), VarType) 9841 << SecondName << SecondType; 9842 return true; 9843 } 9844 9845 if (!PP.getLangOpts().CPlusPlus) 9846 return false; 9847 9848 const Expr *FirstInit = FirstVD->getInit(); 9849 const Expr *SecondInit = SecondVD->getInit(); 9850 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 9851 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9852 FirstVD->getSourceRange(), VarSingleInitializer) 9853 << FirstName << (FirstInit == nullptr) 9854 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 9855 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9856 SecondVD->getSourceRange(), VarSingleInitializer) 9857 << SecondName << (SecondInit == nullptr) 9858 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 9859 return true; 9860 } 9861 9862 if (FirstInit && SecondInit && 9863 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 9864 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9865 FirstVD->getSourceRange(), VarDifferentInitializer) 9866 << FirstName << FirstInit->getSourceRange(); 9867 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9868 SecondVD->getSourceRange(), VarDifferentInitializer) 9869 << SecondName << SecondInit->getSourceRange(); 9870 return true; 9871 } 9872 9873 const bool FirstIsConstexpr = FirstVD->isConstexpr(); 9874 const bool SecondIsConstexpr = SecondVD->isConstexpr(); 9875 if (FirstIsConstexpr != SecondIsConstexpr) { 9876 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9877 FirstVD->getSourceRange(), VarConstexpr) 9878 << FirstName << FirstIsConstexpr; 9879 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9880 SecondVD->getSourceRange(), VarConstexpr) 9881 << SecondName << SecondIsConstexpr; 9882 return true; 9883 } 9884 return false; 9885 }; 9886 9887 auto DifferenceSelector = [](Decl *D) { 9888 assert(D && "valid Decl required"); 9889 switch (D->getKind()) { 9890 default: 9891 return Other; 9892 case Decl::AccessSpec: 9893 switch (D->getAccess()) { 9894 case AS_public: 9895 return PublicSpecifer; 9896 case AS_private: 9897 return PrivateSpecifer; 9898 case AS_protected: 9899 return ProtectedSpecifer; 9900 case AS_none: 9901 break; 9902 } 9903 llvm_unreachable("Invalid access specifier"); 9904 case Decl::StaticAssert: 9905 return StaticAssert; 9906 case Decl::Field: 9907 return Field; 9908 case Decl::CXXMethod: 9909 case Decl::CXXConstructor: 9910 case Decl::CXXDestructor: 9911 return CXXMethod; 9912 case Decl::TypeAlias: 9913 return TypeAlias; 9914 case Decl::Typedef: 9915 return TypeDef; 9916 case Decl::Var: 9917 return Var; 9918 case Decl::Friend: 9919 return Friend; 9920 case Decl::FunctionTemplate: 9921 return FunctionTemplate; 9922 } 9923 }; 9924 9925 using DeclHashes = llvm::SmallVector<std::pair<Decl *, unsigned>, 4>; 9926 auto PopulateHashes = [&ComputeSubDeclODRHash](DeclHashes &Hashes, 9927 RecordDecl *Record, 9928 const DeclContext *DC) { 9929 for (auto *D : Record->decls()) { 9930 if (!ODRHash::isDeclToBeProcessed(D, DC)) 9931 continue; 9932 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 9933 } 9934 }; 9935 9936 struct DiffResult { 9937 Decl *FirstDecl = nullptr, *SecondDecl = nullptr; 9938 ODRMismatchDecl FirstDiffType = Other, SecondDiffType = Other; 9939 }; 9940 9941 // If there is a diagnoseable difference, FirstDiffType and 9942 // SecondDiffType will not be Other and FirstDecl and SecondDecl will be 9943 // filled in if not EndOfClass. 9944 auto FindTypeDiffs = [&DifferenceSelector](DeclHashes &FirstHashes, 9945 DeclHashes &SecondHashes) { 9946 DiffResult DR; 9947 auto FirstIt = FirstHashes.begin(); 9948 auto SecondIt = SecondHashes.begin(); 9949 while (FirstIt != FirstHashes.end() || SecondIt != SecondHashes.end()) { 9950 if (FirstIt != FirstHashes.end() && SecondIt != SecondHashes.end() && 9951 FirstIt->second == SecondIt->second) { 9952 ++FirstIt; 9953 ++SecondIt; 9954 continue; 9955 } 9956 9957 DR.FirstDecl = FirstIt == FirstHashes.end() ? nullptr : FirstIt->first; 9958 DR.SecondDecl = 9959 SecondIt == SecondHashes.end() ? nullptr : SecondIt->first; 9960 9961 DR.FirstDiffType = 9962 DR.FirstDecl ? DifferenceSelector(DR.FirstDecl) : EndOfClass; 9963 DR.SecondDiffType = 9964 DR.SecondDecl ? DifferenceSelector(DR.SecondDecl) : EndOfClass; 9965 return DR; 9966 } 9967 return DR; 9968 }; 9969 9970 // Use this to diagnose that an unexpected Decl was encountered 9971 // or no difference was detected. This causes a generic error 9972 // message to be emitted. 9973 auto DiagnoseODRUnexpected = [this](DiffResult &DR, NamedDecl *FirstRecord, 9974 StringRef FirstModule, 9975 NamedDecl *SecondRecord, 9976 StringRef SecondModule) { 9977 Diag(FirstRecord->getLocation(), 9978 diag::err_module_odr_violation_different_definitions) 9979 << FirstRecord << FirstModule.empty() << FirstModule; 9980 9981 if (DR.FirstDecl) { 9982 Diag(DR.FirstDecl->getLocation(), diag::note_first_module_difference) 9983 << FirstRecord << DR.FirstDecl->getSourceRange(); 9984 } 9985 9986 Diag(SecondRecord->getLocation(), 9987 diag::note_module_odr_violation_different_definitions) 9988 << SecondModule; 9989 9990 if (DR.SecondDecl) { 9991 Diag(DR.SecondDecl->getLocation(), diag::note_second_module_difference) 9992 << DR.SecondDecl->getSourceRange(); 9993 } 9994 }; 9995 9996 auto DiagnoseODRMismatch = 9997 [this](DiffResult &DR, NamedDecl *FirstRecord, StringRef FirstModule, 9998 NamedDecl *SecondRecord, StringRef SecondModule) { 9999 SourceLocation FirstLoc; 10000 SourceRange FirstRange; 10001 auto *FirstTag = dyn_cast<TagDecl>(FirstRecord); 10002 if (DR.FirstDiffType == EndOfClass && FirstTag) { 10003 FirstLoc = FirstTag->getBraceRange().getEnd(); 10004 } else { 10005 FirstLoc = DR.FirstDecl->getLocation(); 10006 FirstRange = DR.FirstDecl->getSourceRange(); 10007 } 10008 Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl) 10009 << FirstRecord << FirstModule.empty() << FirstModule << FirstRange 10010 << DR.FirstDiffType; 10011 10012 SourceLocation SecondLoc; 10013 SourceRange SecondRange; 10014 auto *SecondTag = dyn_cast<TagDecl>(SecondRecord); 10015 if (DR.SecondDiffType == EndOfClass && SecondTag) { 10016 SecondLoc = SecondTag->getBraceRange().getEnd(); 10017 } else { 10018 SecondLoc = DR.SecondDecl->getLocation(); 10019 SecondRange = DR.SecondDecl->getSourceRange(); 10020 } 10021 Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl) 10022 << SecondModule << SecondRange << DR.SecondDiffType; 10023 }; 10024 10025 // Issue any pending ODR-failure diagnostics. 10026 for (auto &Merge : OdrMergeFailures) { 10027 // If we've already pointed out a specific problem with this class, don't 10028 // bother issuing a general "something's different" diagnostic. 10029 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 10030 continue; 10031 10032 bool Diagnosed = false; 10033 CXXRecordDecl *FirstRecord = Merge.first; 10034 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstRecord); 10035 for (auto &RecordPair : Merge.second) { 10036 CXXRecordDecl *SecondRecord = RecordPair.first; 10037 // Multiple different declarations got merged together; tell the user 10038 // where they came from. 10039 if (FirstRecord == SecondRecord) 10040 continue; 10041 10042 std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord); 10043 10044 auto *FirstDD = FirstRecord->DefinitionData; 10045 auto *SecondDD = RecordPair.second; 10046 10047 assert(FirstDD && SecondDD && "Definitions without DefinitionData"); 10048 10049 // Diagnostics from DefinitionData are emitted here. 10050 if (FirstDD != SecondDD) { 10051 enum ODRDefinitionDataDifference { 10052 NumBases, 10053 NumVBases, 10054 BaseType, 10055 BaseVirtual, 10056 BaseAccess, 10057 }; 10058 auto ODRDiagBaseError = [FirstRecord, &FirstModule, 10059 this](SourceLocation Loc, SourceRange Range, 10060 ODRDefinitionDataDifference DiffType) { 10061 return Diag(Loc, diag::err_module_odr_violation_definition_data) 10062 << FirstRecord << FirstModule.empty() << FirstModule << Range 10063 << DiffType; 10064 }; 10065 auto ODRDiagBaseNote = [&SecondModule, 10066 this](SourceLocation Loc, SourceRange Range, 10067 ODRDefinitionDataDifference DiffType) { 10068 return Diag(Loc, diag::note_module_odr_violation_definition_data) 10069 << SecondModule << Range << DiffType; 10070 }; 10071 10072 unsigned FirstNumBases = FirstDD->NumBases; 10073 unsigned FirstNumVBases = FirstDD->NumVBases; 10074 unsigned SecondNumBases = SecondDD->NumBases; 10075 unsigned SecondNumVBases = SecondDD->NumVBases; 10076 10077 auto GetSourceRange = [](struct CXXRecordDecl::DefinitionData *DD) { 10078 unsigned NumBases = DD->NumBases; 10079 if (NumBases == 0) return SourceRange(); 10080 auto bases = DD->bases(); 10081 return SourceRange(bases[0].getBeginLoc(), 10082 bases[NumBases - 1].getEndLoc()); 10083 }; 10084 10085 if (FirstNumBases != SecondNumBases) { 10086 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 10087 NumBases) 10088 << FirstNumBases; 10089 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 10090 NumBases) 10091 << SecondNumBases; 10092 Diagnosed = true; 10093 break; 10094 } 10095 10096 if (FirstNumVBases != SecondNumVBases) { 10097 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 10098 NumVBases) 10099 << FirstNumVBases; 10100 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 10101 NumVBases) 10102 << SecondNumVBases; 10103 Diagnosed = true; 10104 break; 10105 } 10106 10107 auto FirstBases = FirstDD->bases(); 10108 auto SecondBases = SecondDD->bases(); 10109 unsigned i = 0; 10110 for (i = 0; i < FirstNumBases; ++i) { 10111 auto FirstBase = FirstBases[i]; 10112 auto SecondBase = SecondBases[i]; 10113 if (ComputeQualTypeODRHash(FirstBase.getType()) != 10114 ComputeQualTypeODRHash(SecondBase.getType())) { 10115 ODRDiagBaseError(FirstRecord->getLocation(), 10116 FirstBase.getSourceRange(), BaseType) 10117 << (i + 1) << FirstBase.getType(); 10118 ODRDiagBaseNote(SecondRecord->getLocation(), 10119 SecondBase.getSourceRange(), BaseType) 10120 << (i + 1) << SecondBase.getType(); 10121 break; 10122 } 10123 10124 if (FirstBase.isVirtual() != SecondBase.isVirtual()) { 10125 ODRDiagBaseError(FirstRecord->getLocation(), 10126 FirstBase.getSourceRange(), BaseVirtual) 10127 << (i + 1) << FirstBase.isVirtual() << FirstBase.getType(); 10128 ODRDiagBaseNote(SecondRecord->getLocation(), 10129 SecondBase.getSourceRange(), BaseVirtual) 10130 << (i + 1) << SecondBase.isVirtual() << SecondBase.getType(); 10131 break; 10132 } 10133 10134 if (FirstBase.getAccessSpecifierAsWritten() != 10135 SecondBase.getAccessSpecifierAsWritten()) { 10136 ODRDiagBaseError(FirstRecord->getLocation(), 10137 FirstBase.getSourceRange(), BaseAccess) 10138 << (i + 1) << FirstBase.getType() 10139 << (int)FirstBase.getAccessSpecifierAsWritten(); 10140 ODRDiagBaseNote(SecondRecord->getLocation(), 10141 SecondBase.getSourceRange(), BaseAccess) 10142 << (i + 1) << SecondBase.getType() 10143 << (int)SecondBase.getAccessSpecifierAsWritten(); 10144 break; 10145 } 10146 } 10147 10148 if (i != FirstNumBases) { 10149 Diagnosed = true; 10150 break; 10151 } 10152 } 10153 10154 const ClassTemplateDecl *FirstTemplate = 10155 FirstRecord->getDescribedClassTemplate(); 10156 const ClassTemplateDecl *SecondTemplate = 10157 SecondRecord->getDescribedClassTemplate(); 10158 10159 assert(!FirstTemplate == !SecondTemplate && 10160 "Both pointers should be null or non-null"); 10161 10162 enum ODRTemplateDifference { 10163 ParamEmptyName, 10164 ParamName, 10165 ParamSingleDefaultArgument, 10166 ParamDifferentDefaultArgument, 10167 }; 10168 10169 if (FirstTemplate && SecondTemplate) { 10170 DeclHashes FirstTemplateHashes; 10171 DeclHashes SecondTemplateHashes; 10172 10173 auto PopulateTemplateParameterHashs = 10174 [&ComputeSubDeclODRHash](DeclHashes &Hashes, 10175 const ClassTemplateDecl *TD) { 10176 for (auto *D : TD->getTemplateParameters()->asArray()) { 10177 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 10178 } 10179 }; 10180 10181 PopulateTemplateParameterHashs(FirstTemplateHashes, FirstTemplate); 10182 PopulateTemplateParameterHashs(SecondTemplateHashes, SecondTemplate); 10183 10184 assert(FirstTemplateHashes.size() == SecondTemplateHashes.size() && 10185 "Number of template parameters should be equal."); 10186 10187 auto FirstIt = FirstTemplateHashes.begin(); 10188 auto FirstEnd = FirstTemplateHashes.end(); 10189 auto SecondIt = SecondTemplateHashes.begin(); 10190 for (; FirstIt != FirstEnd; ++FirstIt, ++SecondIt) { 10191 if (FirstIt->second == SecondIt->second) 10192 continue; 10193 10194 auto ODRDiagTemplateError = [FirstRecord, &FirstModule, this]( 10195 SourceLocation Loc, SourceRange Range, 10196 ODRTemplateDifference DiffType) { 10197 return Diag(Loc, diag::err_module_odr_violation_template_parameter) 10198 << FirstRecord << FirstModule.empty() << FirstModule << Range 10199 << DiffType; 10200 }; 10201 auto ODRDiagTemplateNote = [&SecondModule, this]( 10202 SourceLocation Loc, SourceRange Range, 10203 ODRTemplateDifference DiffType) { 10204 return Diag(Loc, diag::note_module_odr_violation_template_parameter) 10205 << SecondModule << Range << DiffType; 10206 }; 10207 10208 const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first); 10209 const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first); 10210 10211 assert(FirstDecl->getKind() == SecondDecl->getKind() && 10212 "Parameter Decl's should be the same kind."); 10213 10214 DeclarationName FirstName = FirstDecl->getDeclName(); 10215 DeclarationName SecondName = SecondDecl->getDeclName(); 10216 10217 if (FirstName != SecondName) { 10218 const bool FirstNameEmpty = 10219 FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo(); 10220 const bool SecondNameEmpty = 10221 SecondName.isIdentifier() && !SecondName.getAsIdentifierInfo(); 10222 assert((!FirstNameEmpty || !SecondNameEmpty) && 10223 "Both template parameters cannot be unnamed."); 10224 ODRDiagTemplateError(FirstDecl->getLocation(), 10225 FirstDecl->getSourceRange(), 10226 FirstNameEmpty ? ParamEmptyName : ParamName) 10227 << FirstName; 10228 ODRDiagTemplateNote(SecondDecl->getLocation(), 10229 SecondDecl->getSourceRange(), 10230 SecondNameEmpty ? ParamEmptyName : ParamName) 10231 << SecondName; 10232 break; 10233 } 10234 10235 switch (FirstDecl->getKind()) { 10236 default: 10237 llvm_unreachable("Invalid template parameter type."); 10238 case Decl::TemplateTypeParm: { 10239 const auto *FirstParam = cast<TemplateTypeParmDecl>(FirstDecl); 10240 const auto *SecondParam = cast<TemplateTypeParmDecl>(SecondDecl); 10241 const bool HasFirstDefaultArgument = 10242 FirstParam->hasDefaultArgument() && 10243 !FirstParam->defaultArgumentWasInherited(); 10244 const bool HasSecondDefaultArgument = 10245 SecondParam->hasDefaultArgument() && 10246 !SecondParam->defaultArgumentWasInherited(); 10247 10248 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10249 ODRDiagTemplateError(FirstDecl->getLocation(), 10250 FirstDecl->getSourceRange(), 10251 ParamSingleDefaultArgument) 10252 << HasFirstDefaultArgument; 10253 ODRDiagTemplateNote(SecondDecl->getLocation(), 10254 SecondDecl->getSourceRange(), 10255 ParamSingleDefaultArgument) 10256 << HasSecondDefaultArgument; 10257 break; 10258 } 10259 10260 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10261 "Expecting default arguments."); 10262 10263 ODRDiagTemplateError(FirstDecl->getLocation(), 10264 FirstDecl->getSourceRange(), 10265 ParamDifferentDefaultArgument); 10266 ODRDiagTemplateNote(SecondDecl->getLocation(), 10267 SecondDecl->getSourceRange(), 10268 ParamDifferentDefaultArgument); 10269 10270 break; 10271 } 10272 case Decl::NonTypeTemplateParm: { 10273 const auto *FirstParam = cast<NonTypeTemplateParmDecl>(FirstDecl); 10274 const auto *SecondParam = cast<NonTypeTemplateParmDecl>(SecondDecl); 10275 const bool HasFirstDefaultArgument = 10276 FirstParam->hasDefaultArgument() && 10277 !FirstParam->defaultArgumentWasInherited(); 10278 const bool HasSecondDefaultArgument = 10279 SecondParam->hasDefaultArgument() && 10280 !SecondParam->defaultArgumentWasInherited(); 10281 10282 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10283 ODRDiagTemplateError(FirstDecl->getLocation(), 10284 FirstDecl->getSourceRange(), 10285 ParamSingleDefaultArgument) 10286 << HasFirstDefaultArgument; 10287 ODRDiagTemplateNote(SecondDecl->getLocation(), 10288 SecondDecl->getSourceRange(), 10289 ParamSingleDefaultArgument) 10290 << HasSecondDefaultArgument; 10291 break; 10292 } 10293 10294 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10295 "Expecting default arguments."); 10296 10297 ODRDiagTemplateError(FirstDecl->getLocation(), 10298 FirstDecl->getSourceRange(), 10299 ParamDifferentDefaultArgument); 10300 ODRDiagTemplateNote(SecondDecl->getLocation(), 10301 SecondDecl->getSourceRange(), 10302 ParamDifferentDefaultArgument); 10303 10304 break; 10305 } 10306 case Decl::TemplateTemplateParm: { 10307 const auto *FirstParam = cast<TemplateTemplateParmDecl>(FirstDecl); 10308 const auto *SecondParam = 10309 cast<TemplateTemplateParmDecl>(SecondDecl); 10310 const bool HasFirstDefaultArgument = 10311 FirstParam->hasDefaultArgument() && 10312 !FirstParam->defaultArgumentWasInherited(); 10313 const bool HasSecondDefaultArgument = 10314 SecondParam->hasDefaultArgument() && 10315 !SecondParam->defaultArgumentWasInherited(); 10316 10317 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10318 ODRDiagTemplateError(FirstDecl->getLocation(), 10319 FirstDecl->getSourceRange(), 10320 ParamSingleDefaultArgument) 10321 << HasFirstDefaultArgument; 10322 ODRDiagTemplateNote(SecondDecl->getLocation(), 10323 SecondDecl->getSourceRange(), 10324 ParamSingleDefaultArgument) 10325 << HasSecondDefaultArgument; 10326 break; 10327 } 10328 10329 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10330 "Expecting default arguments."); 10331 10332 ODRDiagTemplateError(FirstDecl->getLocation(), 10333 FirstDecl->getSourceRange(), 10334 ParamDifferentDefaultArgument); 10335 ODRDiagTemplateNote(SecondDecl->getLocation(), 10336 SecondDecl->getSourceRange(), 10337 ParamDifferentDefaultArgument); 10338 10339 break; 10340 } 10341 } 10342 10343 break; 10344 } 10345 10346 if (FirstIt != FirstEnd) { 10347 Diagnosed = true; 10348 break; 10349 } 10350 } 10351 10352 DeclHashes FirstHashes; 10353 DeclHashes SecondHashes; 10354 const DeclContext *DC = FirstRecord; 10355 PopulateHashes(FirstHashes, FirstRecord, DC); 10356 PopulateHashes(SecondHashes, SecondRecord, DC); 10357 10358 auto DR = FindTypeDiffs(FirstHashes, SecondHashes); 10359 ODRMismatchDecl FirstDiffType = DR.FirstDiffType; 10360 ODRMismatchDecl SecondDiffType = DR.SecondDiffType; 10361 Decl *FirstDecl = DR.FirstDecl; 10362 Decl *SecondDecl = DR.SecondDecl; 10363 10364 if (FirstDiffType == Other || SecondDiffType == Other) { 10365 DiagnoseODRUnexpected(DR, FirstRecord, FirstModule, SecondRecord, 10366 SecondModule); 10367 Diagnosed = true; 10368 break; 10369 } 10370 10371 if (FirstDiffType != SecondDiffType) { 10372 DiagnoseODRMismatch(DR, FirstRecord, FirstModule, SecondRecord, 10373 SecondModule); 10374 Diagnosed = true; 10375 break; 10376 } 10377 10378 assert(FirstDiffType == SecondDiffType); 10379 10380 switch (FirstDiffType) { 10381 case Other: 10382 case EndOfClass: 10383 case PublicSpecifer: 10384 case PrivateSpecifer: 10385 case ProtectedSpecifer: 10386 llvm_unreachable("Invalid diff type"); 10387 10388 case StaticAssert: { 10389 StaticAssertDecl *FirstSA = cast<StaticAssertDecl>(FirstDecl); 10390 StaticAssertDecl *SecondSA = cast<StaticAssertDecl>(SecondDecl); 10391 10392 Expr *FirstExpr = FirstSA->getAssertExpr(); 10393 Expr *SecondExpr = SecondSA->getAssertExpr(); 10394 unsigned FirstODRHash = ComputeODRHash(FirstExpr); 10395 unsigned SecondODRHash = ComputeODRHash(SecondExpr); 10396 if (FirstODRHash != SecondODRHash) { 10397 ODRDiagDeclError(FirstRecord, FirstModule, FirstExpr->getBeginLoc(), 10398 FirstExpr->getSourceRange(), StaticAssertCondition); 10399 ODRDiagDeclNote(SecondModule, SecondExpr->getBeginLoc(), 10400 SecondExpr->getSourceRange(), StaticAssertCondition); 10401 Diagnosed = true; 10402 break; 10403 } 10404 10405 StringLiteral *FirstStr = FirstSA->getMessage(); 10406 StringLiteral *SecondStr = SecondSA->getMessage(); 10407 assert((FirstStr || SecondStr) && "Both messages cannot be empty"); 10408 if ((FirstStr && !SecondStr) || (!FirstStr && SecondStr)) { 10409 SourceLocation FirstLoc, SecondLoc; 10410 SourceRange FirstRange, SecondRange; 10411 if (FirstStr) { 10412 FirstLoc = FirstStr->getBeginLoc(); 10413 FirstRange = FirstStr->getSourceRange(); 10414 } else { 10415 FirstLoc = FirstSA->getBeginLoc(); 10416 FirstRange = FirstSA->getSourceRange(); 10417 } 10418 if (SecondStr) { 10419 SecondLoc = SecondStr->getBeginLoc(); 10420 SecondRange = SecondStr->getSourceRange(); 10421 } else { 10422 SecondLoc = SecondSA->getBeginLoc(); 10423 SecondRange = SecondSA->getSourceRange(); 10424 } 10425 ODRDiagDeclError(FirstRecord, FirstModule, FirstLoc, FirstRange, 10426 StaticAssertOnlyMessage) 10427 << (FirstStr == nullptr); 10428 ODRDiagDeclNote(SecondModule, SecondLoc, SecondRange, 10429 StaticAssertOnlyMessage) 10430 << (SecondStr == nullptr); 10431 Diagnosed = true; 10432 break; 10433 } 10434 10435 if (FirstStr && SecondStr && 10436 FirstStr->getString() != SecondStr->getString()) { 10437 ODRDiagDeclError(FirstRecord, FirstModule, FirstStr->getBeginLoc(), 10438 FirstStr->getSourceRange(), StaticAssertMessage); 10439 ODRDiagDeclNote(SecondModule, SecondStr->getBeginLoc(), 10440 SecondStr->getSourceRange(), StaticAssertMessage); 10441 Diagnosed = true; 10442 break; 10443 } 10444 break; 10445 } 10446 case Field: { 10447 Diagnosed = ODRDiagField(FirstRecord, FirstModule, SecondModule, 10448 cast<FieldDecl>(FirstDecl), 10449 cast<FieldDecl>(SecondDecl)); 10450 break; 10451 } 10452 case CXXMethod: { 10453 enum { 10454 DiagMethod, 10455 DiagConstructor, 10456 DiagDestructor, 10457 } FirstMethodType, 10458 SecondMethodType; 10459 auto GetMethodTypeForDiagnostics = [](const CXXMethodDecl* D) { 10460 if (isa<CXXConstructorDecl>(D)) return DiagConstructor; 10461 if (isa<CXXDestructorDecl>(D)) return DiagDestructor; 10462 return DiagMethod; 10463 }; 10464 const CXXMethodDecl *FirstMethod = cast<CXXMethodDecl>(FirstDecl); 10465 const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl); 10466 FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod); 10467 SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod); 10468 auto FirstName = FirstMethod->getDeclName(); 10469 auto SecondName = SecondMethod->getDeclName(); 10470 if (FirstMethodType != SecondMethodType || FirstName != SecondName) { 10471 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10472 FirstMethod->getSourceRange(), MethodName) 10473 << FirstMethodType << FirstName; 10474 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10475 SecondMethod->getSourceRange(), MethodName) 10476 << SecondMethodType << SecondName; 10477 10478 Diagnosed = true; 10479 break; 10480 } 10481 10482 const bool FirstDeleted = FirstMethod->isDeletedAsWritten(); 10483 const bool SecondDeleted = SecondMethod->isDeletedAsWritten(); 10484 if (FirstDeleted != SecondDeleted) { 10485 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10486 FirstMethod->getSourceRange(), MethodDeleted) 10487 << FirstMethodType << FirstName << FirstDeleted; 10488 10489 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10490 SecondMethod->getSourceRange(), MethodDeleted) 10491 << SecondMethodType << SecondName << SecondDeleted; 10492 Diagnosed = true; 10493 break; 10494 } 10495 10496 const bool FirstDefaulted = FirstMethod->isExplicitlyDefaulted(); 10497 const bool SecondDefaulted = SecondMethod->isExplicitlyDefaulted(); 10498 if (FirstDefaulted != SecondDefaulted) { 10499 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10500 FirstMethod->getSourceRange(), MethodDefaulted) 10501 << FirstMethodType << FirstName << FirstDefaulted; 10502 10503 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10504 SecondMethod->getSourceRange(), MethodDefaulted) 10505 << SecondMethodType << SecondName << SecondDefaulted; 10506 Diagnosed = true; 10507 break; 10508 } 10509 10510 const bool FirstVirtual = FirstMethod->isVirtualAsWritten(); 10511 const bool SecondVirtual = SecondMethod->isVirtualAsWritten(); 10512 const bool FirstPure = FirstMethod->isPure(); 10513 const bool SecondPure = SecondMethod->isPure(); 10514 if ((FirstVirtual || SecondVirtual) && 10515 (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) { 10516 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10517 FirstMethod->getSourceRange(), MethodVirtual) 10518 << FirstMethodType << FirstName << FirstPure << FirstVirtual; 10519 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10520 SecondMethod->getSourceRange(), MethodVirtual) 10521 << SecondMethodType << SecondName << SecondPure << SecondVirtual; 10522 Diagnosed = true; 10523 break; 10524 } 10525 10526 // CXXMethodDecl::isStatic uses the canonical Decl. With Decl merging, 10527 // FirstDecl is the canonical Decl of SecondDecl, so the storage 10528 // class needs to be checked instead. 10529 const auto FirstStorage = FirstMethod->getStorageClass(); 10530 const auto SecondStorage = SecondMethod->getStorageClass(); 10531 const bool FirstStatic = FirstStorage == SC_Static; 10532 const bool SecondStatic = SecondStorage == SC_Static; 10533 if (FirstStatic != SecondStatic) { 10534 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10535 FirstMethod->getSourceRange(), MethodStatic) 10536 << FirstMethodType << FirstName << FirstStatic; 10537 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10538 SecondMethod->getSourceRange(), MethodStatic) 10539 << SecondMethodType << SecondName << SecondStatic; 10540 Diagnosed = true; 10541 break; 10542 } 10543 10544 const bool FirstVolatile = FirstMethod->isVolatile(); 10545 const bool SecondVolatile = SecondMethod->isVolatile(); 10546 if (FirstVolatile != SecondVolatile) { 10547 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10548 FirstMethod->getSourceRange(), MethodVolatile) 10549 << FirstMethodType << FirstName << FirstVolatile; 10550 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10551 SecondMethod->getSourceRange(), MethodVolatile) 10552 << SecondMethodType << SecondName << SecondVolatile; 10553 Diagnosed = true; 10554 break; 10555 } 10556 10557 const bool FirstConst = FirstMethod->isConst(); 10558 const bool SecondConst = SecondMethod->isConst(); 10559 if (FirstConst != SecondConst) { 10560 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10561 FirstMethod->getSourceRange(), MethodConst) 10562 << FirstMethodType << FirstName << FirstConst; 10563 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10564 SecondMethod->getSourceRange(), MethodConst) 10565 << SecondMethodType << SecondName << SecondConst; 10566 Diagnosed = true; 10567 break; 10568 } 10569 10570 const bool FirstInline = FirstMethod->isInlineSpecified(); 10571 const bool SecondInline = SecondMethod->isInlineSpecified(); 10572 if (FirstInline != SecondInline) { 10573 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10574 FirstMethod->getSourceRange(), MethodInline) 10575 << FirstMethodType << FirstName << FirstInline; 10576 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10577 SecondMethod->getSourceRange(), MethodInline) 10578 << SecondMethodType << SecondName << SecondInline; 10579 Diagnosed = true; 10580 break; 10581 } 10582 10583 const unsigned FirstNumParameters = FirstMethod->param_size(); 10584 const unsigned SecondNumParameters = SecondMethod->param_size(); 10585 if (FirstNumParameters != SecondNumParameters) { 10586 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10587 FirstMethod->getSourceRange(), 10588 MethodNumberParameters) 10589 << FirstMethodType << FirstName << FirstNumParameters; 10590 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10591 SecondMethod->getSourceRange(), 10592 MethodNumberParameters) 10593 << SecondMethodType << SecondName << SecondNumParameters; 10594 Diagnosed = true; 10595 break; 10596 } 10597 10598 // Need this status boolean to know when break out of the switch. 10599 bool ParameterMismatch = false; 10600 for (unsigned I = 0; I < FirstNumParameters; ++I) { 10601 const ParmVarDecl *FirstParam = FirstMethod->getParamDecl(I); 10602 const ParmVarDecl *SecondParam = SecondMethod->getParamDecl(I); 10603 10604 QualType FirstParamType = FirstParam->getType(); 10605 QualType SecondParamType = SecondParam->getType(); 10606 if (FirstParamType != SecondParamType && 10607 ComputeQualTypeODRHash(FirstParamType) != 10608 ComputeQualTypeODRHash(SecondParamType)) { 10609 if (const DecayedType *ParamDecayedType = 10610 FirstParamType->getAs<DecayedType>()) { 10611 ODRDiagDeclError( 10612 FirstRecord, FirstModule, FirstMethod->getLocation(), 10613 FirstMethod->getSourceRange(), MethodParameterType) 10614 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10615 << true << ParamDecayedType->getOriginalType(); 10616 } else { 10617 ODRDiagDeclError( 10618 FirstRecord, FirstModule, FirstMethod->getLocation(), 10619 FirstMethod->getSourceRange(), MethodParameterType) 10620 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10621 << false; 10622 } 10623 10624 if (const DecayedType *ParamDecayedType = 10625 SecondParamType->getAs<DecayedType>()) { 10626 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10627 SecondMethod->getSourceRange(), 10628 MethodParameterType) 10629 << SecondMethodType << SecondName << (I + 1) 10630 << SecondParamType << true 10631 << ParamDecayedType->getOriginalType(); 10632 } else { 10633 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10634 SecondMethod->getSourceRange(), 10635 MethodParameterType) 10636 << SecondMethodType << SecondName << (I + 1) 10637 << SecondParamType << false; 10638 } 10639 ParameterMismatch = true; 10640 break; 10641 } 10642 10643 DeclarationName FirstParamName = FirstParam->getDeclName(); 10644 DeclarationName SecondParamName = SecondParam->getDeclName(); 10645 if (FirstParamName != SecondParamName) { 10646 ODRDiagDeclError(FirstRecord, FirstModule, 10647 FirstMethod->getLocation(), 10648 FirstMethod->getSourceRange(), MethodParameterName) 10649 << FirstMethodType << FirstName << (I + 1) << FirstParamName; 10650 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10651 SecondMethod->getSourceRange(), MethodParameterName) 10652 << SecondMethodType << SecondName << (I + 1) << SecondParamName; 10653 ParameterMismatch = true; 10654 break; 10655 } 10656 10657 const Expr *FirstInit = FirstParam->getInit(); 10658 const Expr *SecondInit = SecondParam->getInit(); 10659 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 10660 ODRDiagDeclError(FirstRecord, FirstModule, 10661 FirstMethod->getLocation(), 10662 FirstMethod->getSourceRange(), 10663 MethodParameterSingleDefaultArgument) 10664 << FirstMethodType << FirstName << (I + 1) 10665 << (FirstInit == nullptr) 10666 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 10667 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10668 SecondMethod->getSourceRange(), 10669 MethodParameterSingleDefaultArgument) 10670 << SecondMethodType << SecondName << (I + 1) 10671 << (SecondInit == nullptr) 10672 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 10673 ParameterMismatch = true; 10674 break; 10675 } 10676 10677 if (FirstInit && SecondInit && 10678 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 10679 ODRDiagDeclError(FirstRecord, FirstModule, 10680 FirstMethod->getLocation(), 10681 FirstMethod->getSourceRange(), 10682 MethodParameterDifferentDefaultArgument) 10683 << FirstMethodType << FirstName << (I + 1) 10684 << FirstInit->getSourceRange(); 10685 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10686 SecondMethod->getSourceRange(), 10687 MethodParameterDifferentDefaultArgument) 10688 << SecondMethodType << SecondName << (I + 1) 10689 << SecondInit->getSourceRange(); 10690 ParameterMismatch = true; 10691 break; 10692 10693 } 10694 } 10695 10696 if (ParameterMismatch) { 10697 Diagnosed = true; 10698 break; 10699 } 10700 10701 const auto *FirstTemplateArgs = 10702 FirstMethod->getTemplateSpecializationArgs(); 10703 const auto *SecondTemplateArgs = 10704 SecondMethod->getTemplateSpecializationArgs(); 10705 10706 if ((FirstTemplateArgs && !SecondTemplateArgs) || 10707 (!FirstTemplateArgs && SecondTemplateArgs)) { 10708 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10709 FirstMethod->getSourceRange(), 10710 MethodNoTemplateArguments) 10711 << FirstMethodType << FirstName << (FirstTemplateArgs != nullptr); 10712 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10713 SecondMethod->getSourceRange(), 10714 MethodNoTemplateArguments) 10715 << SecondMethodType << SecondName 10716 << (SecondTemplateArgs != nullptr); 10717 10718 Diagnosed = true; 10719 break; 10720 } 10721 10722 if (FirstTemplateArgs && SecondTemplateArgs) { 10723 // Remove pack expansions from argument list. 10724 auto ExpandTemplateArgumentList = 10725 [](const TemplateArgumentList *TAL) { 10726 llvm::SmallVector<const TemplateArgument *, 8> ExpandedList; 10727 for (const TemplateArgument &TA : TAL->asArray()) { 10728 if (TA.getKind() != TemplateArgument::Pack) { 10729 ExpandedList.push_back(&TA); 10730 continue; 10731 } 10732 for (const TemplateArgument &PackTA : TA.getPackAsArray()) { 10733 ExpandedList.push_back(&PackTA); 10734 } 10735 } 10736 return ExpandedList; 10737 }; 10738 llvm::SmallVector<const TemplateArgument *, 8> FirstExpandedList = 10739 ExpandTemplateArgumentList(FirstTemplateArgs); 10740 llvm::SmallVector<const TemplateArgument *, 8> SecondExpandedList = 10741 ExpandTemplateArgumentList(SecondTemplateArgs); 10742 10743 if (FirstExpandedList.size() != SecondExpandedList.size()) { 10744 ODRDiagDeclError(FirstRecord, FirstModule, 10745 FirstMethod->getLocation(), 10746 FirstMethod->getSourceRange(), 10747 MethodDifferentNumberTemplateArguments) 10748 << FirstMethodType << FirstName 10749 << (unsigned)FirstExpandedList.size(); 10750 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10751 SecondMethod->getSourceRange(), 10752 MethodDifferentNumberTemplateArguments) 10753 << SecondMethodType << SecondName 10754 << (unsigned)SecondExpandedList.size(); 10755 10756 Diagnosed = true; 10757 break; 10758 } 10759 10760 bool TemplateArgumentMismatch = false; 10761 for (unsigned i = 0, e = FirstExpandedList.size(); i != e; ++i) { 10762 const TemplateArgument &FirstTA = *FirstExpandedList[i], 10763 &SecondTA = *SecondExpandedList[i]; 10764 if (ComputeTemplateArgumentODRHash(FirstTA) == 10765 ComputeTemplateArgumentODRHash(SecondTA)) { 10766 continue; 10767 } 10768 10769 ODRDiagDeclError( 10770 FirstRecord, FirstModule, FirstMethod->getLocation(), 10771 FirstMethod->getSourceRange(), MethodDifferentTemplateArgument) 10772 << FirstMethodType << FirstName << FirstTA << i + 1; 10773 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10774 SecondMethod->getSourceRange(), 10775 MethodDifferentTemplateArgument) 10776 << SecondMethodType << SecondName << SecondTA << i + 1; 10777 10778 TemplateArgumentMismatch = true; 10779 break; 10780 } 10781 10782 if (TemplateArgumentMismatch) { 10783 Diagnosed = true; 10784 break; 10785 } 10786 } 10787 10788 // Compute the hash of the method as if it has no body. 10789 auto ComputeCXXMethodODRHash = [&Hash](const CXXMethodDecl *D) { 10790 Hash.clear(); 10791 Hash.AddFunctionDecl(D, true /*SkipBody*/); 10792 return Hash.CalculateHash(); 10793 }; 10794 10795 // Compare the hash generated to the hash stored. A difference means 10796 // that a body was present in the original source. Due to merging, 10797 // the stardard way of detecting a body will not work. 10798 const bool HasFirstBody = 10799 ComputeCXXMethodODRHash(FirstMethod) != FirstMethod->getODRHash(); 10800 const bool HasSecondBody = 10801 ComputeCXXMethodODRHash(SecondMethod) != SecondMethod->getODRHash(); 10802 10803 if (HasFirstBody != HasSecondBody) { 10804 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10805 FirstMethod->getSourceRange(), MethodSingleBody) 10806 << FirstMethodType << FirstName << HasFirstBody; 10807 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10808 SecondMethod->getSourceRange(), MethodSingleBody) 10809 << SecondMethodType << SecondName << HasSecondBody; 10810 Diagnosed = true; 10811 break; 10812 } 10813 10814 if (HasFirstBody && HasSecondBody) { 10815 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10816 FirstMethod->getSourceRange(), MethodDifferentBody) 10817 << FirstMethodType << FirstName; 10818 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10819 SecondMethod->getSourceRange(), MethodDifferentBody) 10820 << SecondMethodType << SecondName; 10821 Diagnosed = true; 10822 break; 10823 } 10824 10825 break; 10826 } 10827 case TypeAlias: 10828 case TypeDef: { 10829 Diagnosed = ODRDiagTypeDefOrAlias( 10830 FirstRecord, FirstModule, SecondModule, 10831 cast<TypedefNameDecl>(FirstDecl), cast<TypedefNameDecl>(SecondDecl), 10832 FirstDiffType == TypeAlias); 10833 break; 10834 } 10835 case Var: { 10836 Diagnosed = 10837 ODRDiagVar(FirstRecord, FirstModule, SecondModule, 10838 cast<VarDecl>(FirstDecl), cast<VarDecl>(SecondDecl)); 10839 break; 10840 } 10841 case Friend: { 10842 FriendDecl *FirstFriend = cast<FriendDecl>(FirstDecl); 10843 FriendDecl *SecondFriend = cast<FriendDecl>(SecondDecl); 10844 10845 NamedDecl *FirstND = FirstFriend->getFriendDecl(); 10846 NamedDecl *SecondND = SecondFriend->getFriendDecl(); 10847 10848 TypeSourceInfo *FirstTSI = FirstFriend->getFriendType(); 10849 TypeSourceInfo *SecondTSI = SecondFriend->getFriendType(); 10850 10851 if (FirstND && SecondND) { 10852 ODRDiagDeclError(FirstRecord, FirstModule, 10853 FirstFriend->getFriendLoc(), 10854 FirstFriend->getSourceRange(), FriendFunction) 10855 << FirstND; 10856 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10857 SecondFriend->getSourceRange(), FriendFunction) 10858 << SecondND; 10859 10860 Diagnosed = true; 10861 break; 10862 } 10863 10864 if (FirstTSI && SecondTSI) { 10865 QualType FirstFriendType = FirstTSI->getType(); 10866 QualType SecondFriendType = SecondTSI->getType(); 10867 assert(ComputeQualTypeODRHash(FirstFriendType) != 10868 ComputeQualTypeODRHash(SecondFriendType)); 10869 ODRDiagDeclError(FirstRecord, FirstModule, 10870 FirstFriend->getFriendLoc(), 10871 FirstFriend->getSourceRange(), FriendType) 10872 << FirstFriendType; 10873 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10874 SecondFriend->getSourceRange(), FriendType) 10875 << SecondFriendType; 10876 Diagnosed = true; 10877 break; 10878 } 10879 10880 ODRDiagDeclError(FirstRecord, FirstModule, FirstFriend->getFriendLoc(), 10881 FirstFriend->getSourceRange(), FriendTypeFunction) 10882 << (FirstTSI == nullptr); 10883 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10884 SecondFriend->getSourceRange(), FriendTypeFunction) 10885 << (SecondTSI == nullptr); 10886 10887 Diagnosed = true; 10888 break; 10889 } 10890 case FunctionTemplate: { 10891 FunctionTemplateDecl *FirstTemplate = 10892 cast<FunctionTemplateDecl>(FirstDecl); 10893 FunctionTemplateDecl *SecondTemplate = 10894 cast<FunctionTemplateDecl>(SecondDecl); 10895 10896 TemplateParameterList *FirstTPL = 10897 FirstTemplate->getTemplateParameters(); 10898 TemplateParameterList *SecondTPL = 10899 SecondTemplate->getTemplateParameters(); 10900 10901 if (FirstTPL->size() != SecondTPL->size()) { 10902 ODRDiagDeclError(FirstRecord, FirstModule, 10903 FirstTemplate->getLocation(), 10904 FirstTemplate->getSourceRange(), 10905 FunctionTemplateDifferentNumberParameters) 10906 << FirstTemplate << FirstTPL->size(); 10907 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10908 SecondTemplate->getSourceRange(), 10909 FunctionTemplateDifferentNumberParameters) 10910 << SecondTemplate << SecondTPL->size(); 10911 10912 Diagnosed = true; 10913 break; 10914 } 10915 10916 bool ParameterMismatch = false; 10917 for (unsigned i = 0, e = FirstTPL->size(); i != e; ++i) { 10918 NamedDecl *FirstParam = FirstTPL->getParam(i); 10919 NamedDecl *SecondParam = SecondTPL->getParam(i); 10920 10921 if (FirstParam->getKind() != SecondParam->getKind()) { 10922 enum { 10923 TemplateTypeParameter, 10924 NonTypeTemplateParameter, 10925 TemplateTemplateParameter, 10926 }; 10927 auto GetParamType = [](NamedDecl *D) { 10928 switch (D->getKind()) { 10929 default: 10930 llvm_unreachable("Unexpected template parameter type"); 10931 case Decl::TemplateTypeParm: 10932 return TemplateTypeParameter; 10933 case Decl::NonTypeTemplateParm: 10934 return NonTypeTemplateParameter; 10935 case Decl::TemplateTemplateParm: 10936 return TemplateTemplateParameter; 10937 } 10938 }; 10939 10940 ODRDiagDeclError(FirstRecord, FirstModule, 10941 FirstTemplate->getLocation(), 10942 FirstTemplate->getSourceRange(), 10943 FunctionTemplateParameterDifferentKind) 10944 << FirstTemplate << (i + 1) << GetParamType(FirstParam); 10945 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10946 SecondTemplate->getSourceRange(), 10947 FunctionTemplateParameterDifferentKind) 10948 << SecondTemplate << (i + 1) << GetParamType(SecondParam); 10949 10950 ParameterMismatch = true; 10951 break; 10952 } 10953 10954 if (FirstParam->getName() != SecondParam->getName()) { 10955 ODRDiagDeclError( 10956 FirstRecord, FirstModule, FirstTemplate->getLocation(), 10957 FirstTemplate->getSourceRange(), FunctionTemplateParameterName) 10958 << FirstTemplate << (i + 1) << (bool)FirstParam->getIdentifier() 10959 << FirstParam; 10960 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10961 SecondTemplate->getSourceRange(), 10962 FunctionTemplateParameterName) 10963 << SecondTemplate << (i + 1) 10964 << (bool)SecondParam->getIdentifier() << SecondParam; 10965 ParameterMismatch = true; 10966 break; 10967 } 10968 10969 if (isa<TemplateTypeParmDecl>(FirstParam) && 10970 isa<TemplateTypeParmDecl>(SecondParam)) { 10971 TemplateTypeParmDecl *FirstTTPD = 10972 cast<TemplateTypeParmDecl>(FirstParam); 10973 TemplateTypeParmDecl *SecondTTPD = 10974 cast<TemplateTypeParmDecl>(SecondParam); 10975 bool HasFirstDefaultArgument = 10976 FirstTTPD->hasDefaultArgument() && 10977 !FirstTTPD->defaultArgumentWasInherited(); 10978 bool HasSecondDefaultArgument = 10979 SecondTTPD->hasDefaultArgument() && 10980 !SecondTTPD->defaultArgumentWasInherited(); 10981 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10982 ODRDiagDeclError(FirstRecord, FirstModule, 10983 FirstTemplate->getLocation(), 10984 FirstTemplate->getSourceRange(), 10985 FunctionTemplateParameterSingleDefaultArgument) 10986 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 10987 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10988 SecondTemplate->getSourceRange(), 10989 FunctionTemplateParameterSingleDefaultArgument) 10990 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 10991 ParameterMismatch = true; 10992 break; 10993 } 10994 10995 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 10996 QualType FirstType = FirstTTPD->getDefaultArgument(); 10997 QualType SecondType = SecondTTPD->getDefaultArgument(); 10998 if (ComputeQualTypeODRHash(FirstType) != 10999 ComputeQualTypeODRHash(SecondType)) { 11000 ODRDiagDeclError( 11001 FirstRecord, FirstModule, FirstTemplate->getLocation(), 11002 FirstTemplate->getSourceRange(), 11003 FunctionTemplateParameterDifferentDefaultArgument) 11004 << FirstTemplate << (i + 1) << FirstType; 11005 ODRDiagDeclNote( 11006 SecondModule, SecondTemplate->getLocation(), 11007 SecondTemplate->getSourceRange(), 11008 FunctionTemplateParameterDifferentDefaultArgument) 11009 << SecondTemplate << (i + 1) << SecondType; 11010 ParameterMismatch = true; 11011 break; 11012 } 11013 } 11014 11015 if (FirstTTPD->isParameterPack() != 11016 SecondTTPD->isParameterPack()) { 11017 ODRDiagDeclError(FirstRecord, FirstModule, 11018 FirstTemplate->getLocation(), 11019 FirstTemplate->getSourceRange(), 11020 FunctionTemplatePackParameter) 11021 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 11022 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11023 SecondTemplate->getSourceRange(), 11024 FunctionTemplatePackParameter) 11025 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 11026 ParameterMismatch = true; 11027 break; 11028 } 11029 } 11030 11031 if (isa<TemplateTemplateParmDecl>(FirstParam) && 11032 isa<TemplateTemplateParmDecl>(SecondParam)) { 11033 TemplateTemplateParmDecl *FirstTTPD = 11034 cast<TemplateTemplateParmDecl>(FirstParam); 11035 TemplateTemplateParmDecl *SecondTTPD = 11036 cast<TemplateTemplateParmDecl>(SecondParam); 11037 11038 TemplateParameterList *FirstTPL = 11039 FirstTTPD->getTemplateParameters(); 11040 TemplateParameterList *SecondTPL = 11041 SecondTTPD->getTemplateParameters(); 11042 11043 if (ComputeTemplateParameterListODRHash(FirstTPL) != 11044 ComputeTemplateParameterListODRHash(SecondTPL)) { 11045 ODRDiagDeclError(FirstRecord, FirstModule, 11046 FirstTemplate->getLocation(), 11047 FirstTemplate->getSourceRange(), 11048 FunctionTemplateParameterDifferentType) 11049 << FirstTemplate << (i + 1); 11050 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11051 SecondTemplate->getSourceRange(), 11052 FunctionTemplateParameterDifferentType) 11053 << SecondTemplate << (i + 1); 11054 ParameterMismatch = true; 11055 break; 11056 } 11057 11058 bool HasFirstDefaultArgument = 11059 FirstTTPD->hasDefaultArgument() && 11060 !FirstTTPD->defaultArgumentWasInherited(); 11061 bool HasSecondDefaultArgument = 11062 SecondTTPD->hasDefaultArgument() && 11063 !SecondTTPD->defaultArgumentWasInherited(); 11064 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 11065 ODRDiagDeclError(FirstRecord, FirstModule, 11066 FirstTemplate->getLocation(), 11067 FirstTemplate->getSourceRange(), 11068 FunctionTemplateParameterSingleDefaultArgument) 11069 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 11070 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11071 SecondTemplate->getSourceRange(), 11072 FunctionTemplateParameterSingleDefaultArgument) 11073 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 11074 ParameterMismatch = true; 11075 break; 11076 } 11077 11078 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 11079 TemplateArgument FirstTA = 11080 FirstTTPD->getDefaultArgument().getArgument(); 11081 TemplateArgument SecondTA = 11082 SecondTTPD->getDefaultArgument().getArgument(); 11083 if (ComputeTemplateArgumentODRHash(FirstTA) != 11084 ComputeTemplateArgumentODRHash(SecondTA)) { 11085 ODRDiagDeclError( 11086 FirstRecord, FirstModule, FirstTemplate->getLocation(), 11087 FirstTemplate->getSourceRange(), 11088 FunctionTemplateParameterDifferentDefaultArgument) 11089 << FirstTemplate << (i + 1) << FirstTA; 11090 ODRDiagDeclNote( 11091 SecondModule, SecondTemplate->getLocation(), 11092 SecondTemplate->getSourceRange(), 11093 FunctionTemplateParameterDifferentDefaultArgument) 11094 << SecondTemplate << (i + 1) << SecondTA; 11095 ParameterMismatch = true; 11096 break; 11097 } 11098 } 11099 11100 if (FirstTTPD->isParameterPack() != 11101 SecondTTPD->isParameterPack()) { 11102 ODRDiagDeclError(FirstRecord, FirstModule, 11103 FirstTemplate->getLocation(), 11104 FirstTemplate->getSourceRange(), 11105 FunctionTemplatePackParameter) 11106 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 11107 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11108 SecondTemplate->getSourceRange(), 11109 FunctionTemplatePackParameter) 11110 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 11111 ParameterMismatch = true; 11112 break; 11113 } 11114 } 11115 11116 if (isa<NonTypeTemplateParmDecl>(FirstParam) && 11117 isa<NonTypeTemplateParmDecl>(SecondParam)) { 11118 NonTypeTemplateParmDecl *FirstNTTPD = 11119 cast<NonTypeTemplateParmDecl>(FirstParam); 11120 NonTypeTemplateParmDecl *SecondNTTPD = 11121 cast<NonTypeTemplateParmDecl>(SecondParam); 11122 11123 QualType FirstType = FirstNTTPD->getType(); 11124 QualType SecondType = SecondNTTPD->getType(); 11125 if (ComputeQualTypeODRHash(FirstType) != 11126 ComputeQualTypeODRHash(SecondType)) { 11127 ODRDiagDeclError(FirstRecord, FirstModule, 11128 FirstTemplate->getLocation(), 11129 FirstTemplate->getSourceRange(), 11130 FunctionTemplateParameterDifferentType) 11131 << FirstTemplate << (i + 1); 11132 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11133 SecondTemplate->getSourceRange(), 11134 FunctionTemplateParameterDifferentType) 11135 << SecondTemplate << (i + 1); 11136 ParameterMismatch = true; 11137 break; 11138 } 11139 11140 bool HasFirstDefaultArgument = 11141 FirstNTTPD->hasDefaultArgument() && 11142 !FirstNTTPD->defaultArgumentWasInherited(); 11143 bool HasSecondDefaultArgument = 11144 SecondNTTPD->hasDefaultArgument() && 11145 !SecondNTTPD->defaultArgumentWasInherited(); 11146 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 11147 ODRDiagDeclError(FirstRecord, FirstModule, 11148 FirstTemplate->getLocation(), 11149 FirstTemplate->getSourceRange(), 11150 FunctionTemplateParameterSingleDefaultArgument) 11151 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 11152 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11153 SecondTemplate->getSourceRange(), 11154 FunctionTemplateParameterSingleDefaultArgument) 11155 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 11156 ParameterMismatch = true; 11157 break; 11158 } 11159 11160 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 11161 Expr *FirstDefaultArgument = FirstNTTPD->getDefaultArgument(); 11162 Expr *SecondDefaultArgument = SecondNTTPD->getDefaultArgument(); 11163 if (ComputeODRHash(FirstDefaultArgument) != 11164 ComputeODRHash(SecondDefaultArgument)) { 11165 ODRDiagDeclError( 11166 FirstRecord, FirstModule, FirstTemplate->getLocation(), 11167 FirstTemplate->getSourceRange(), 11168 FunctionTemplateParameterDifferentDefaultArgument) 11169 << FirstTemplate << (i + 1) << FirstDefaultArgument; 11170 ODRDiagDeclNote( 11171 SecondModule, SecondTemplate->getLocation(), 11172 SecondTemplate->getSourceRange(), 11173 FunctionTemplateParameterDifferentDefaultArgument) 11174 << SecondTemplate << (i + 1) << SecondDefaultArgument; 11175 ParameterMismatch = true; 11176 break; 11177 } 11178 } 11179 11180 if (FirstNTTPD->isParameterPack() != 11181 SecondNTTPD->isParameterPack()) { 11182 ODRDiagDeclError(FirstRecord, FirstModule, 11183 FirstTemplate->getLocation(), 11184 FirstTemplate->getSourceRange(), 11185 FunctionTemplatePackParameter) 11186 << FirstTemplate << (i + 1) << FirstNTTPD->isParameterPack(); 11187 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11188 SecondTemplate->getSourceRange(), 11189 FunctionTemplatePackParameter) 11190 << SecondTemplate << (i + 1) 11191 << SecondNTTPD->isParameterPack(); 11192 ParameterMismatch = true; 11193 break; 11194 } 11195 } 11196 } 11197 11198 if (ParameterMismatch) { 11199 Diagnosed = true; 11200 break; 11201 } 11202 11203 break; 11204 } 11205 } 11206 11207 if (Diagnosed) 11208 continue; 11209 11210 Diag(FirstDecl->getLocation(), 11211 diag::err_module_odr_violation_mismatch_decl_unknown) 11212 << FirstRecord << FirstModule.empty() << FirstModule << FirstDiffType 11213 << FirstDecl->getSourceRange(); 11214 Diag(SecondDecl->getLocation(), 11215 diag::note_module_odr_violation_mismatch_decl_unknown) 11216 << SecondModule << FirstDiffType << SecondDecl->getSourceRange(); 11217 Diagnosed = true; 11218 } 11219 11220 if (!Diagnosed) { 11221 // All definitions are updates to the same declaration. This happens if a 11222 // module instantiates the declaration of a class template specialization 11223 // and two or more other modules instantiate its definition. 11224 // 11225 // FIXME: Indicate which modules had instantiations of this definition. 11226 // FIXME: How can this even happen? 11227 Diag(Merge.first->getLocation(), 11228 diag::err_module_odr_violation_different_instantiations) 11229 << Merge.first; 11230 } 11231 } 11232 11233 // Issue ODR failures diagnostics for functions. 11234 for (auto &Merge : FunctionOdrMergeFailures) { 11235 enum ODRFunctionDifference { 11236 ReturnType, 11237 ParameterName, 11238 ParameterType, 11239 ParameterSingleDefaultArgument, 11240 ParameterDifferentDefaultArgument, 11241 FunctionBody, 11242 }; 11243 11244 FunctionDecl *FirstFunction = Merge.first; 11245 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstFunction); 11246 11247 bool Diagnosed = false; 11248 for (auto &SecondFunction : Merge.second) { 11249 11250 if (FirstFunction == SecondFunction) 11251 continue; 11252 11253 std::string SecondModule = 11254 getOwningModuleNameForDiagnostic(SecondFunction); 11255 11256 auto ODRDiagError = [FirstFunction, &FirstModule, 11257 this](SourceLocation Loc, SourceRange Range, 11258 ODRFunctionDifference DiffType) { 11259 return Diag(Loc, diag::err_module_odr_violation_function) 11260 << FirstFunction << FirstModule.empty() << FirstModule << Range 11261 << DiffType; 11262 }; 11263 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11264 SourceRange Range, 11265 ODRFunctionDifference DiffType) { 11266 return Diag(Loc, diag::note_module_odr_violation_function) 11267 << SecondModule << Range << DiffType; 11268 }; 11269 11270 if (ComputeQualTypeODRHash(FirstFunction->getReturnType()) != 11271 ComputeQualTypeODRHash(SecondFunction->getReturnType())) { 11272 ODRDiagError(FirstFunction->getReturnTypeSourceRange().getBegin(), 11273 FirstFunction->getReturnTypeSourceRange(), ReturnType) 11274 << FirstFunction->getReturnType(); 11275 ODRDiagNote(SecondFunction->getReturnTypeSourceRange().getBegin(), 11276 SecondFunction->getReturnTypeSourceRange(), ReturnType) 11277 << SecondFunction->getReturnType(); 11278 Diagnosed = true; 11279 break; 11280 } 11281 11282 assert(FirstFunction->param_size() == SecondFunction->param_size() && 11283 "Merged functions with different number of parameters"); 11284 11285 auto ParamSize = FirstFunction->param_size(); 11286 bool ParameterMismatch = false; 11287 for (unsigned I = 0; I < ParamSize; ++I) { 11288 auto *FirstParam = FirstFunction->getParamDecl(I); 11289 auto *SecondParam = SecondFunction->getParamDecl(I); 11290 11291 assert(getContext().hasSameType(FirstParam->getType(), 11292 SecondParam->getType()) && 11293 "Merged function has different parameter types."); 11294 11295 if (FirstParam->getDeclName() != SecondParam->getDeclName()) { 11296 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11297 ParameterName) 11298 << I + 1 << FirstParam->getDeclName(); 11299 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11300 ParameterName) 11301 << I + 1 << SecondParam->getDeclName(); 11302 ParameterMismatch = true; 11303 break; 11304 }; 11305 11306 QualType FirstParamType = FirstParam->getType(); 11307 QualType SecondParamType = SecondParam->getType(); 11308 if (FirstParamType != SecondParamType && 11309 ComputeQualTypeODRHash(FirstParamType) != 11310 ComputeQualTypeODRHash(SecondParamType)) { 11311 if (const DecayedType *ParamDecayedType = 11312 FirstParamType->getAs<DecayedType>()) { 11313 ODRDiagError(FirstParam->getLocation(), 11314 FirstParam->getSourceRange(), ParameterType) 11315 << (I + 1) << FirstParamType << true 11316 << ParamDecayedType->getOriginalType(); 11317 } else { 11318 ODRDiagError(FirstParam->getLocation(), 11319 FirstParam->getSourceRange(), ParameterType) 11320 << (I + 1) << FirstParamType << false; 11321 } 11322 11323 if (const DecayedType *ParamDecayedType = 11324 SecondParamType->getAs<DecayedType>()) { 11325 ODRDiagNote(SecondParam->getLocation(), 11326 SecondParam->getSourceRange(), ParameterType) 11327 << (I + 1) << SecondParamType << true 11328 << ParamDecayedType->getOriginalType(); 11329 } else { 11330 ODRDiagNote(SecondParam->getLocation(), 11331 SecondParam->getSourceRange(), ParameterType) 11332 << (I + 1) << SecondParamType << false; 11333 } 11334 ParameterMismatch = true; 11335 break; 11336 } 11337 11338 const Expr *FirstInit = FirstParam->getInit(); 11339 const Expr *SecondInit = SecondParam->getInit(); 11340 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 11341 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11342 ParameterSingleDefaultArgument) 11343 << (I + 1) << (FirstInit == nullptr) 11344 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 11345 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11346 ParameterSingleDefaultArgument) 11347 << (I + 1) << (SecondInit == nullptr) 11348 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 11349 ParameterMismatch = true; 11350 break; 11351 } 11352 11353 if (FirstInit && SecondInit && 11354 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11355 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11356 ParameterDifferentDefaultArgument) 11357 << (I + 1) << FirstInit->getSourceRange(); 11358 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11359 ParameterDifferentDefaultArgument) 11360 << (I + 1) << SecondInit->getSourceRange(); 11361 ParameterMismatch = true; 11362 break; 11363 } 11364 11365 assert(ComputeSubDeclODRHash(FirstParam) == 11366 ComputeSubDeclODRHash(SecondParam) && 11367 "Undiagnosed parameter difference."); 11368 } 11369 11370 if (ParameterMismatch) { 11371 Diagnosed = true; 11372 break; 11373 } 11374 11375 // If no error has been generated before now, assume the problem is in 11376 // the body and generate a message. 11377 ODRDiagError(FirstFunction->getLocation(), 11378 FirstFunction->getSourceRange(), FunctionBody); 11379 ODRDiagNote(SecondFunction->getLocation(), 11380 SecondFunction->getSourceRange(), FunctionBody); 11381 Diagnosed = true; 11382 break; 11383 } 11384 (void)Diagnosed; 11385 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11386 } 11387 11388 // Issue ODR failures diagnostics for enums. 11389 for (auto &Merge : EnumOdrMergeFailures) { 11390 enum ODREnumDifference { 11391 SingleScopedEnum, 11392 EnumTagKeywordMismatch, 11393 SingleSpecifiedType, 11394 DifferentSpecifiedTypes, 11395 DifferentNumberEnumConstants, 11396 EnumConstantName, 11397 EnumConstantSingleInitilizer, 11398 EnumConstantDifferentInitilizer, 11399 }; 11400 11401 // If we've already pointed out a specific problem with this enum, don't 11402 // bother issuing a general "something's different" diagnostic. 11403 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 11404 continue; 11405 11406 EnumDecl *FirstEnum = Merge.first; 11407 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstEnum); 11408 11409 using DeclHashes = 11410 llvm::SmallVector<std::pair<EnumConstantDecl *, unsigned>, 4>; 11411 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstEnum]( 11412 DeclHashes &Hashes, EnumDecl *Enum) { 11413 for (auto *D : Enum->decls()) { 11414 // Due to decl merging, the first EnumDecl is the parent of 11415 // Decls in both records. 11416 if (!ODRHash::isDeclToBeProcessed(D, FirstEnum)) 11417 continue; 11418 assert(isa<EnumConstantDecl>(D) && "Unexpected Decl kind"); 11419 Hashes.emplace_back(cast<EnumConstantDecl>(D), 11420 ComputeSubDeclODRHash(D)); 11421 } 11422 }; 11423 DeclHashes FirstHashes; 11424 PopulateHashes(FirstHashes, FirstEnum); 11425 bool Diagnosed = false; 11426 for (auto &SecondEnum : Merge.second) { 11427 11428 if (FirstEnum == SecondEnum) 11429 continue; 11430 11431 std::string SecondModule = 11432 getOwningModuleNameForDiagnostic(SecondEnum); 11433 11434 auto ODRDiagError = [FirstEnum, &FirstModule, 11435 this](SourceLocation Loc, SourceRange Range, 11436 ODREnumDifference DiffType) { 11437 return Diag(Loc, diag::err_module_odr_violation_enum) 11438 << FirstEnum << FirstModule.empty() << FirstModule << Range 11439 << DiffType; 11440 }; 11441 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11442 SourceRange Range, 11443 ODREnumDifference DiffType) { 11444 return Diag(Loc, diag::note_module_odr_violation_enum) 11445 << SecondModule << Range << DiffType; 11446 }; 11447 11448 if (FirstEnum->isScoped() != SecondEnum->isScoped()) { 11449 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11450 SingleScopedEnum) 11451 << FirstEnum->isScoped(); 11452 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11453 SingleScopedEnum) 11454 << SecondEnum->isScoped(); 11455 Diagnosed = true; 11456 continue; 11457 } 11458 11459 if (FirstEnum->isScoped() && SecondEnum->isScoped()) { 11460 if (FirstEnum->isScopedUsingClassTag() != 11461 SecondEnum->isScopedUsingClassTag()) { 11462 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11463 EnumTagKeywordMismatch) 11464 << FirstEnum->isScopedUsingClassTag(); 11465 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11466 EnumTagKeywordMismatch) 11467 << SecondEnum->isScopedUsingClassTag(); 11468 Diagnosed = true; 11469 continue; 11470 } 11471 } 11472 11473 QualType FirstUnderlyingType = 11474 FirstEnum->getIntegerTypeSourceInfo() 11475 ? FirstEnum->getIntegerTypeSourceInfo()->getType() 11476 : QualType(); 11477 QualType SecondUnderlyingType = 11478 SecondEnum->getIntegerTypeSourceInfo() 11479 ? SecondEnum->getIntegerTypeSourceInfo()->getType() 11480 : QualType(); 11481 if (FirstUnderlyingType.isNull() != SecondUnderlyingType.isNull()) { 11482 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11483 SingleSpecifiedType) 11484 << !FirstUnderlyingType.isNull(); 11485 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11486 SingleSpecifiedType) 11487 << !SecondUnderlyingType.isNull(); 11488 Diagnosed = true; 11489 continue; 11490 } 11491 11492 if (!FirstUnderlyingType.isNull() && !SecondUnderlyingType.isNull()) { 11493 if (ComputeQualTypeODRHash(FirstUnderlyingType) != 11494 ComputeQualTypeODRHash(SecondUnderlyingType)) { 11495 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11496 DifferentSpecifiedTypes) 11497 << FirstUnderlyingType; 11498 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11499 DifferentSpecifiedTypes) 11500 << SecondUnderlyingType; 11501 Diagnosed = true; 11502 continue; 11503 } 11504 } 11505 11506 DeclHashes SecondHashes; 11507 PopulateHashes(SecondHashes, SecondEnum); 11508 11509 if (FirstHashes.size() != SecondHashes.size()) { 11510 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11511 DifferentNumberEnumConstants) 11512 << (int)FirstHashes.size(); 11513 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11514 DifferentNumberEnumConstants) 11515 << (int)SecondHashes.size(); 11516 Diagnosed = true; 11517 continue; 11518 } 11519 11520 for (unsigned I = 0; I < FirstHashes.size(); ++I) { 11521 if (FirstHashes[I].second == SecondHashes[I].second) 11522 continue; 11523 const EnumConstantDecl *FirstEnumConstant = FirstHashes[I].first; 11524 const EnumConstantDecl *SecondEnumConstant = SecondHashes[I].first; 11525 11526 if (FirstEnumConstant->getDeclName() != 11527 SecondEnumConstant->getDeclName()) { 11528 11529 ODRDiagError(FirstEnumConstant->getLocation(), 11530 FirstEnumConstant->getSourceRange(), EnumConstantName) 11531 << I + 1 << FirstEnumConstant; 11532 ODRDiagNote(SecondEnumConstant->getLocation(), 11533 SecondEnumConstant->getSourceRange(), EnumConstantName) 11534 << I + 1 << SecondEnumConstant; 11535 Diagnosed = true; 11536 break; 11537 } 11538 11539 const Expr *FirstInit = FirstEnumConstant->getInitExpr(); 11540 const Expr *SecondInit = SecondEnumConstant->getInitExpr(); 11541 if (!FirstInit && !SecondInit) 11542 continue; 11543 11544 if (!FirstInit || !SecondInit) { 11545 ODRDiagError(FirstEnumConstant->getLocation(), 11546 FirstEnumConstant->getSourceRange(), 11547 EnumConstantSingleInitilizer) 11548 << I + 1 << FirstEnumConstant << (FirstInit != nullptr); 11549 ODRDiagNote(SecondEnumConstant->getLocation(), 11550 SecondEnumConstant->getSourceRange(), 11551 EnumConstantSingleInitilizer) 11552 << I + 1 << SecondEnumConstant << (SecondInit != nullptr); 11553 Diagnosed = true; 11554 break; 11555 } 11556 11557 if (ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11558 ODRDiagError(FirstEnumConstant->getLocation(), 11559 FirstEnumConstant->getSourceRange(), 11560 EnumConstantDifferentInitilizer) 11561 << I + 1 << FirstEnumConstant; 11562 ODRDiagNote(SecondEnumConstant->getLocation(), 11563 SecondEnumConstant->getSourceRange(), 11564 EnumConstantDifferentInitilizer) 11565 << I + 1 << SecondEnumConstant; 11566 Diagnosed = true; 11567 break; 11568 } 11569 } 11570 } 11571 11572 (void)Diagnosed; 11573 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11574 } 11575 } 11576 11577 void ASTReader::StartedDeserializing() { 11578 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get()) 11579 ReadTimer->startTimer(); 11580 } 11581 11582 void ASTReader::FinishedDeserializing() { 11583 assert(NumCurrentElementsDeserializing && 11584 "FinishedDeserializing not paired with StartedDeserializing"); 11585 if (NumCurrentElementsDeserializing == 1) { 11586 // We decrease NumCurrentElementsDeserializing only after pending actions 11587 // are finished, to avoid recursively re-calling finishPendingActions(). 11588 finishPendingActions(); 11589 } 11590 --NumCurrentElementsDeserializing; 11591 11592 if (NumCurrentElementsDeserializing == 0) { 11593 // Propagate exception specification and deduced type updates along 11594 // redeclaration chains. 11595 // 11596 // We do this now rather than in finishPendingActions because we want to 11597 // be able to walk the complete redeclaration chains of the updated decls. 11598 while (!PendingExceptionSpecUpdates.empty() || 11599 !PendingDeducedTypeUpdates.empty()) { 11600 auto ESUpdates = std::move(PendingExceptionSpecUpdates); 11601 PendingExceptionSpecUpdates.clear(); 11602 for (auto Update : ESUpdates) { 11603 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11604 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>(); 11605 auto ESI = FPT->getExtProtoInfo().ExceptionSpec; 11606 if (auto *Listener = getContext().getASTMutationListener()) 11607 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second)); 11608 for (auto *Redecl : Update.second->redecls()) 11609 getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI); 11610 } 11611 11612 auto DTUpdates = std::move(PendingDeducedTypeUpdates); 11613 PendingDeducedTypeUpdates.clear(); 11614 for (auto Update : DTUpdates) { 11615 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11616 // FIXME: If the return type is already deduced, check that it matches. 11617 getContext().adjustDeducedFunctionResultType(Update.first, 11618 Update.second); 11619 } 11620 } 11621 11622 if (ReadTimer) 11623 ReadTimer->stopTimer(); 11624 11625 diagnoseOdrViolations(); 11626 11627 // We are not in recursive loading, so it's safe to pass the "interesting" 11628 // decls to the consumer. 11629 if (Consumer) 11630 PassInterestingDeclsToConsumer(); 11631 } 11632 } 11633 11634 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 11635 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { 11636 // Remove any fake results before adding any real ones. 11637 auto It = PendingFakeLookupResults.find(II); 11638 if (It != PendingFakeLookupResults.end()) { 11639 for (auto *ND : It->second) 11640 SemaObj->IdResolver.RemoveDecl(ND); 11641 // FIXME: this works around module+PCH performance issue. 11642 // Rather than erase the result from the map, which is O(n), just clear 11643 // the vector of NamedDecls. 11644 It->second.clear(); 11645 } 11646 } 11647 11648 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 11649 SemaObj->TUScope->AddDecl(D); 11650 } else if (SemaObj->TUScope) { 11651 // Adding the decl to IdResolver may have failed because it was already in 11652 // (even though it was not added in scope). If it is already in, make sure 11653 // it gets in the scope as well. 11654 if (std::find(SemaObj->IdResolver.begin(Name), 11655 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 11656 SemaObj->TUScope->AddDecl(D); 11657 } 11658 } 11659 11660 ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache, 11661 ASTContext *Context, 11662 const PCHContainerReader &PCHContainerRdr, 11663 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions, 11664 StringRef isysroot, bool DisableValidation, 11665 bool AllowASTWithCompilerErrors, 11666 bool AllowConfigurationMismatch, bool ValidateSystemInputs, 11667 bool ValidateASTInputFilesContent, bool UseGlobalIndex, 11668 std::unique_ptr<llvm::Timer> ReadTimer) 11669 : Listener(DisableValidation 11670 ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP)) 11671 : cast<ASTReaderListener>(new PCHValidator(PP, *this))), 11672 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), 11673 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP), 11674 ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache, 11675 PCHContainerRdr, PP.getHeaderSearchInfo()), 11676 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot), 11677 DisableValidation(DisableValidation), 11678 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 11679 AllowConfigurationMismatch(AllowConfigurationMismatch), 11680 ValidateSystemInputs(ValidateSystemInputs), 11681 ValidateASTInputFilesContent(ValidateASTInputFilesContent), 11682 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) { 11683 SourceMgr.setExternalSLocEntrySource(this); 11684 11685 for (const auto &Ext : Extensions) { 11686 auto BlockName = Ext->getExtensionMetadata().BlockName; 11687 auto Known = ModuleFileExtensions.find(BlockName); 11688 if (Known != ModuleFileExtensions.end()) { 11689 Diags.Report(diag::warn_duplicate_module_file_extension) 11690 << BlockName; 11691 continue; 11692 } 11693 11694 ModuleFileExtensions.insert({BlockName, Ext}); 11695 } 11696 } 11697 11698 ASTReader::~ASTReader() { 11699 if (OwnsDeserializationListener) 11700 delete DeserializationListener; 11701 } 11702 11703 IdentifierResolver &ASTReader::getIdResolver() { 11704 return SemaObj ? SemaObj->IdResolver : DummyIdResolver; 11705 } 11706 11707 Expected<unsigned> ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor, 11708 unsigned AbbrevID) { 11709 Idx = 0; 11710 Record.clear(); 11711 return Cursor.readRecord(AbbrevID, Record); 11712 } 11713 //===----------------------------------------------------------------------===// 11714 //// OMPClauseReader implementation 11715 ////===----------------------------------------------------------------------===// 11716 11717 // This has to be in namespace clang because it's friended by all 11718 // of the OMP clauses. 11719 namespace clang { 11720 11721 class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> { 11722 ASTRecordReader &Record; 11723 ASTContext &Context; 11724 11725 public: 11726 OMPClauseReader(ASTRecordReader &Record) 11727 : Record(Record), Context(Record.getContext()) {} 11728 11729 #define OMP_CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C); 11730 #include "llvm/Frontend/OpenMP/OMPKinds.def" 11731 OMPClause *readClause(); 11732 void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C); 11733 void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C); 11734 }; 11735 11736 } // end namespace clang 11737 11738 OMPClause *ASTRecordReader::readOMPClause() { 11739 return OMPClauseReader(*this).readClause(); 11740 } 11741 11742 OMPClause *OMPClauseReader::readClause() { 11743 OMPClause *C = nullptr; 11744 switch (llvm::omp::Clause(Record.readInt())) { 11745 case llvm::omp::OMPC_if: 11746 C = new (Context) OMPIfClause(); 11747 break; 11748 case llvm::omp::OMPC_final: 11749 C = new (Context) OMPFinalClause(); 11750 break; 11751 case llvm::omp::OMPC_num_threads: 11752 C = new (Context) OMPNumThreadsClause(); 11753 break; 11754 case llvm::omp::OMPC_safelen: 11755 C = new (Context) OMPSafelenClause(); 11756 break; 11757 case llvm::omp::OMPC_simdlen: 11758 C = new (Context) OMPSimdlenClause(); 11759 break; 11760 case llvm::omp::OMPC_allocator: 11761 C = new (Context) OMPAllocatorClause(); 11762 break; 11763 case llvm::omp::OMPC_collapse: 11764 C = new (Context) OMPCollapseClause(); 11765 break; 11766 case llvm::omp::OMPC_default: 11767 C = new (Context) OMPDefaultClause(); 11768 break; 11769 case llvm::omp::OMPC_proc_bind: 11770 C = new (Context) OMPProcBindClause(); 11771 break; 11772 case llvm::omp::OMPC_schedule: 11773 C = new (Context) OMPScheduleClause(); 11774 break; 11775 case llvm::omp::OMPC_ordered: 11776 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt()); 11777 break; 11778 case llvm::omp::OMPC_nowait: 11779 C = new (Context) OMPNowaitClause(); 11780 break; 11781 case llvm::omp::OMPC_untied: 11782 C = new (Context) OMPUntiedClause(); 11783 break; 11784 case llvm::omp::OMPC_mergeable: 11785 C = new (Context) OMPMergeableClause(); 11786 break; 11787 case llvm::omp::OMPC_read: 11788 C = new (Context) OMPReadClause(); 11789 break; 11790 case llvm::omp::OMPC_write: 11791 C = new (Context) OMPWriteClause(); 11792 break; 11793 case llvm::omp::OMPC_update: 11794 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt()); 11795 break; 11796 case llvm::omp::OMPC_capture: 11797 C = new (Context) OMPCaptureClause(); 11798 break; 11799 case llvm::omp::OMPC_seq_cst: 11800 C = new (Context) OMPSeqCstClause(); 11801 break; 11802 case llvm::omp::OMPC_acq_rel: 11803 C = new (Context) OMPAcqRelClause(); 11804 break; 11805 case llvm::omp::OMPC_acquire: 11806 C = new (Context) OMPAcquireClause(); 11807 break; 11808 case llvm::omp::OMPC_release: 11809 C = new (Context) OMPReleaseClause(); 11810 break; 11811 case llvm::omp::OMPC_relaxed: 11812 C = new (Context) OMPRelaxedClause(); 11813 break; 11814 case llvm::omp::OMPC_threads: 11815 C = new (Context) OMPThreadsClause(); 11816 break; 11817 case llvm::omp::OMPC_simd: 11818 C = new (Context) OMPSIMDClause(); 11819 break; 11820 case llvm::omp::OMPC_nogroup: 11821 C = new (Context) OMPNogroupClause(); 11822 break; 11823 case llvm::omp::OMPC_unified_address: 11824 C = new (Context) OMPUnifiedAddressClause(); 11825 break; 11826 case llvm::omp::OMPC_unified_shared_memory: 11827 C = new (Context) OMPUnifiedSharedMemoryClause(); 11828 break; 11829 case llvm::omp::OMPC_reverse_offload: 11830 C = new (Context) OMPReverseOffloadClause(); 11831 break; 11832 case llvm::omp::OMPC_dynamic_allocators: 11833 C = new (Context) OMPDynamicAllocatorsClause(); 11834 break; 11835 case llvm::omp::OMPC_atomic_default_mem_order: 11836 C = new (Context) OMPAtomicDefaultMemOrderClause(); 11837 break; 11838 case llvm::omp::OMPC_private: 11839 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt()); 11840 break; 11841 case llvm::omp::OMPC_firstprivate: 11842 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt()); 11843 break; 11844 case llvm::omp::OMPC_lastprivate: 11845 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt()); 11846 break; 11847 case llvm::omp::OMPC_shared: 11848 C = OMPSharedClause::CreateEmpty(Context, Record.readInt()); 11849 break; 11850 case llvm::omp::OMPC_reduction: { 11851 unsigned N = Record.readInt(); 11852 auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>(); 11853 C = OMPReductionClause::CreateEmpty(Context, N, Modifier); 11854 break; 11855 } 11856 case llvm::omp::OMPC_task_reduction: 11857 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt()); 11858 break; 11859 case llvm::omp::OMPC_in_reduction: 11860 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt()); 11861 break; 11862 case llvm::omp::OMPC_linear: 11863 C = OMPLinearClause::CreateEmpty(Context, Record.readInt()); 11864 break; 11865 case llvm::omp::OMPC_aligned: 11866 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt()); 11867 break; 11868 case llvm::omp::OMPC_copyin: 11869 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt()); 11870 break; 11871 case llvm::omp::OMPC_copyprivate: 11872 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt()); 11873 break; 11874 case llvm::omp::OMPC_flush: 11875 C = OMPFlushClause::CreateEmpty(Context, Record.readInt()); 11876 break; 11877 case llvm::omp::OMPC_depobj: 11878 C = OMPDepobjClause::CreateEmpty(Context); 11879 break; 11880 case llvm::omp::OMPC_depend: { 11881 unsigned NumVars = Record.readInt(); 11882 unsigned NumLoops = Record.readInt(); 11883 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops); 11884 break; 11885 } 11886 case llvm::omp::OMPC_device: 11887 C = new (Context) OMPDeviceClause(); 11888 break; 11889 case llvm::omp::OMPC_map: { 11890 OMPMappableExprListSizeTy Sizes; 11891 Sizes.NumVars = Record.readInt(); 11892 Sizes.NumUniqueDeclarations = Record.readInt(); 11893 Sizes.NumComponentLists = Record.readInt(); 11894 Sizes.NumComponents = Record.readInt(); 11895 C = OMPMapClause::CreateEmpty(Context, Sizes); 11896 break; 11897 } 11898 case llvm::omp::OMPC_num_teams: 11899 C = new (Context) OMPNumTeamsClause(); 11900 break; 11901 case llvm::omp::OMPC_thread_limit: 11902 C = new (Context) OMPThreadLimitClause(); 11903 break; 11904 case llvm::omp::OMPC_priority: 11905 C = new (Context) OMPPriorityClause(); 11906 break; 11907 case llvm::omp::OMPC_grainsize: 11908 C = new (Context) OMPGrainsizeClause(); 11909 break; 11910 case llvm::omp::OMPC_num_tasks: 11911 C = new (Context) OMPNumTasksClause(); 11912 break; 11913 case llvm::omp::OMPC_hint: 11914 C = new (Context) OMPHintClause(); 11915 break; 11916 case llvm::omp::OMPC_dist_schedule: 11917 C = new (Context) OMPDistScheduleClause(); 11918 break; 11919 case llvm::omp::OMPC_defaultmap: 11920 C = new (Context) OMPDefaultmapClause(); 11921 break; 11922 case llvm::omp::OMPC_to: { 11923 OMPMappableExprListSizeTy Sizes; 11924 Sizes.NumVars = Record.readInt(); 11925 Sizes.NumUniqueDeclarations = Record.readInt(); 11926 Sizes.NumComponentLists = Record.readInt(); 11927 Sizes.NumComponents = Record.readInt(); 11928 C = OMPToClause::CreateEmpty(Context, Sizes); 11929 break; 11930 } 11931 case llvm::omp::OMPC_from: { 11932 OMPMappableExprListSizeTy Sizes; 11933 Sizes.NumVars = Record.readInt(); 11934 Sizes.NumUniqueDeclarations = Record.readInt(); 11935 Sizes.NumComponentLists = Record.readInt(); 11936 Sizes.NumComponents = Record.readInt(); 11937 C = OMPFromClause::CreateEmpty(Context, Sizes); 11938 break; 11939 } 11940 case llvm::omp::OMPC_use_device_ptr: { 11941 OMPMappableExprListSizeTy Sizes; 11942 Sizes.NumVars = Record.readInt(); 11943 Sizes.NumUniqueDeclarations = Record.readInt(); 11944 Sizes.NumComponentLists = Record.readInt(); 11945 Sizes.NumComponents = Record.readInt(); 11946 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes); 11947 break; 11948 } 11949 case llvm::omp::OMPC_use_device_addr: { 11950 OMPMappableExprListSizeTy Sizes; 11951 Sizes.NumVars = Record.readInt(); 11952 Sizes.NumUniqueDeclarations = Record.readInt(); 11953 Sizes.NumComponentLists = Record.readInt(); 11954 Sizes.NumComponents = Record.readInt(); 11955 C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes); 11956 break; 11957 } 11958 case llvm::omp::OMPC_is_device_ptr: { 11959 OMPMappableExprListSizeTy Sizes; 11960 Sizes.NumVars = Record.readInt(); 11961 Sizes.NumUniqueDeclarations = Record.readInt(); 11962 Sizes.NumComponentLists = Record.readInt(); 11963 Sizes.NumComponents = Record.readInt(); 11964 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes); 11965 break; 11966 } 11967 case llvm::omp::OMPC_allocate: 11968 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt()); 11969 break; 11970 case llvm::omp::OMPC_nontemporal: 11971 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt()); 11972 break; 11973 case llvm::omp::OMPC_inclusive: 11974 C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt()); 11975 break; 11976 case llvm::omp::OMPC_exclusive: 11977 C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt()); 11978 break; 11979 case llvm::omp::OMPC_order: 11980 C = new (Context) OMPOrderClause(); 11981 break; 11982 case llvm::omp::OMPC_destroy: 11983 C = new (Context) OMPDestroyClause(); 11984 break; 11985 case llvm::omp::OMPC_detach: 11986 C = new (Context) OMPDetachClause(); 11987 break; 11988 case llvm::omp::OMPC_uses_allocators: 11989 C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt()); 11990 break; 11991 case llvm::omp::OMPC_affinity: 11992 C = OMPAffinityClause::CreateEmpty(Context, Record.readInt()); 11993 break; 11994 #define OMP_CLAUSE_NO_CLASS(Enum, Str) \ 11995 case llvm::omp::Enum: \ 11996 break; 11997 #include "llvm/Frontend/OpenMP/OMPKinds.def" 11998 default: 11999 break; 12000 } 12001 assert(C && "Unknown OMPClause type"); 12002 12003 Visit(C); 12004 C->setLocStart(Record.readSourceLocation()); 12005 C->setLocEnd(Record.readSourceLocation()); 12006 12007 return C; 12008 } 12009 12010 void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) { 12011 C->setPreInitStmt(Record.readSubStmt(), 12012 static_cast<OpenMPDirectiveKind>(Record.readInt())); 12013 } 12014 12015 void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) { 12016 VisitOMPClauseWithPreInit(C); 12017 C->setPostUpdateExpr(Record.readSubExpr()); 12018 } 12019 12020 void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) { 12021 VisitOMPClauseWithPreInit(C); 12022 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt())); 12023 C->setNameModifierLoc(Record.readSourceLocation()); 12024 C->setColonLoc(Record.readSourceLocation()); 12025 C->setCondition(Record.readSubExpr()); 12026 C->setLParenLoc(Record.readSourceLocation()); 12027 } 12028 12029 void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) { 12030 VisitOMPClauseWithPreInit(C); 12031 C->setCondition(Record.readSubExpr()); 12032 C->setLParenLoc(Record.readSourceLocation()); 12033 } 12034 12035 void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) { 12036 VisitOMPClauseWithPreInit(C); 12037 C->setNumThreads(Record.readSubExpr()); 12038 C->setLParenLoc(Record.readSourceLocation()); 12039 } 12040 12041 void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) { 12042 C->setSafelen(Record.readSubExpr()); 12043 C->setLParenLoc(Record.readSourceLocation()); 12044 } 12045 12046 void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) { 12047 C->setSimdlen(Record.readSubExpr()); 12048 C->setLParenLoc(Record.readSourceLocation()); 12049 } 12050 12051 void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) { 12052 C->setAllocator(Record.readExpr()); 12053 C->setLParenLoc(Record.readSourceLocation()); 12054 } 12055 12056 void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) { 12057 C->setNumForLoops(Record.readSubExpr()); 12058 C->setLParenLoc(Record.readSourceLocation()); 12059 } 12060 12061 void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) { 12062 C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt())); 12063 C->setLParenLoc(Record.readSourceLocation()); 12064 C->setDefaultKindKwLoc(Record.readSourceLocation()); 12065 } 12066 12067 void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) { 12068 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt())); 12069 C->setLParenLoc(Record.readSourceLocation()); 12070 C->setProcBindKindKwLoc(Record.readSourceLocation()); 12071 } 12072 12073 void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) { 12074 VisitOMPClauseWithPreInit(C); 12075 C->setScheduleKind( 12076 static_cast<OpenMPScheduleClauseKind>(Record.readInt())); 12077 C->setFirstScheduleModifier( 12078 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 12079 C->setSecondScheduleModifier( 12080 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 12081 C->setChunkSize(Record.readSubExpr()); 12082 C->setLParenLoc(Record.readSourceLocation()); 12083 C->setFirstScheduleModifierLoc(Record.readSourceLocation()); 12084 C->setSecondScheduleModifierLoc(Record.readSourceLocation()); 12085 C->setScheduleKindLoc(Record.readSourceLocation()); 12086 C->setCommaLoc(Record.readSourceLocation()); 12087 } 12088 12089 void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) { 12090 C->setNumForLoops(Record.readSubExpr()); 12091 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 12092 C->setLoopNumIterations(I, Record.readSubExpr()); 12093 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 12094 C->setLoopCounter(I, Record.readSubExpr()); 12095 C->setLParenLoc(Record.readSourceLocation()); 12096 } 12097 12098 void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) { 12099 C->setEventHandler(Record.readSubExpr()); 12100 C->setLParenLoc(Record.readSourceLocation()); 12101 } 12102 12103 void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {} 12104 12105 void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {} 12106 12107 void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {} 12108 12109 void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {} 12110 12111 void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {} 12112 12113 void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) { 12114 if (C->isExtended()) { 12115 C->setLParenLoc(Record.readSourceLocation()); 12116 C->setArgumentLoc(Record.readSourceLocation()); 12117 C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>()); 12118 } 12119 } 12120 12121 void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {} 12122 12123 void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {} 12124 12125 void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {} 12126 12127 void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {} 12128 12129 void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {} 12130 12131 void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {} 12132 12133 void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {} 12134 12135 void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {} 12136 12137 void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {} 12138 12139 void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *) {} 12140 12141 void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {} 12142 12143 void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause( 12144 OMPUnifiedSharedMemoryClause *) {} 12145 12146 void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {} 12147 12148 void 12149 OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) { 12150 } 12151 12152 void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause( 12153 OMPAtomicDefaultMemOrderClause *C) { 12154 C->setAtomicDefaultMemOrderKind( 12155 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt())); 12156 C->setLParenLoc(Record.readSourceLocation()); 12157 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation()); 12158 } 12159 12160 void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) { 12161 C->setLParenLoc(Record.readSourceLocation()); 12162 unsigned NumVars = C->varlist_size(); 12163 SmallVector<Expr *, 16> Vars; 12164 Vars.reserve(NumVars); 12165 for (unsigned i = 0; i != NumVars; ++i) 12166 Vars.push_back(Record.readSubExpr()); 12167 C->setVarRefs(Vars); 12168 Vars.clear(); 12169 for (unsigned i = 0; i != NumVars; ++i) 12170 Vars.push_back(Record.readSubExpr()); 12171 C->setPrivateCopies(Vars); 12172 } 12173 12174 void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) { 12175 VisitOMPClauseWithPreInit(C); 12176 C->setLParenLoc(Record.readSourceLocation()); 12177 unsigned NumVars = C->varlist_size(); 12178 SmallVector<Expr *, 16> Vars; 12179 Vars.reserve(NumVars); 12180 for (unsigned i = 0; i != NumVars; ++i) 12181 Vars.push_back(Record.readSubExpr()); 12182 C->setVarRefs(Vars); 12183 Vars.clear(); 12184 for (unsigned i = 0; i != NumVars; ++i) 12185 Vars.push_back(Record.readSubExpr()); 12186 C->setPrivateCopies(Vars); 12187 Vars.clear(); 12188 for (unsigned i = 0; i != NumVars; ++i) 12189 Vars.push_back(Record.readSubExpr()); 12190 C->setInits(Vars); 12191 } 12192 12193 void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) { 12194 VisitOMPClauseWithPostUpdate(C); 12195 C->setLParenLoc(Record.readSourceLocation()); 12196 C->setKind(Record.readEnum<OpenMPLastprivateModifier>()); 12197 C->setKindLoc(Record.readSourceLocation()); 12198 C->setColonLoc(Record.readSourceLocation()); 12199 unsigned NumVars = C->varlist_size(); 12200 SmallVector<Expr *, 16> Vars; 12201 Vars.reserve(NumVars); 12202 for (unsigned i = 0; i != NumVars; ++i) 12203 Vars.push_back(Record.readSubExpr()); 12204 C->setVarRefs(Vars); 12205 Vars.clear(); 12206 for (unsigned i = 0; i != NumVars; ++i) 12207 Vars.push_back(Record.readSubExpr()); 12208 C->setPrivateCopies(Vars); 12209 Vars.clear(); 12210 for (unsigned i = 0; i != NumVars; ++i) 12211 Vars.push_back(Record.readSubExpr()); 12212 C->setSourceExprs(Vars); 12213 Vars.clear(); 12214 for (unsigned i = 0; i != NumVars; ++i) 12215 Vars.push_back(Record.readSubExpr()); 12216 C->setDestinationExprs(Vars); 12217 Vars.clear(); 12218 for (unsigned i = 0; i != NumVars; ++i) 12219 Vars.push_back(Record.readSubExpr()); 12220 C->setAssignmentOps(Vars); 12221 } 12222 12223 void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) { 12224 C->setLParenLoc(Record.readSourceLocation()); 12225 unsigned NumVars = C->varlist_size(); 12226 SmallVector<Expr *, 16> Vars; 12227 Vars.reserve(NumVars); 12228 for (unsigned i = 0; i != NumVars; ++i) 12229 Vars.push_back(Record.readSubExpr()); 12230 C->setVarRefs(Vars); 12231 } 12232 12233 void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) { 12234 VisitOMPClauseWithPostUpdate(C); 12235 C->setLParenLoc(Record.readSourceLocation()); 12236 C->setModifierLoc(Record.readSourceLocation()); 12237 C->setColonLoc(Record.readSourceLocation()); 12238 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12239 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12240 C->setQualifierLoc(NNSL); 12241 C->setNameInfo(DNI); 12242 12243 unsigned NumVars = C->varlist_size(); 12244 SmallVector<Expr *, 16> Vars; 12245 Vars.reserve(NumVars); 12246 for (unsigned i = 0; i != NumVars; ++i) 12247 Vars.push_back(Record.readSubExpr()); 12248 C->setVarRefs(Vars); 12249 Vars.clear(); 12250 for (unsigned i = 0; i != NumVars; ++i) 12251 Vars.push_back(Record.readSubExpr()); 12252 C->setPrivates(Vars); 12253 Vars.clear(); 12254 for (unsigned i = 0; i != NumVars; ++i) 12255 Vars.push_back(Record.readSubExpr()); 12256 C->setLHSExprs(Vars); 12257 Vars.clear(); 12258 for (unsigned i = 0; i != NumVars; ++i) 12259 Vars.push_back(Record.readSubExpr()); 12260 C->setRHSExprs(Vars); 12261 Vars.clear(); 12262 for (unsigned i = 0; i != NumVars; ++i) 12263 Vars.push_back(Record.readSubExpr()); 12264 C->setReductionOps(Vars); 12265 if (C->getModifier() == OMPC_REDUCTION_inscan) { 12266 Vars.clear(); 12267 for (unsigned i = 0; i != NumVars; ++i) 12268 Vars.push_back(Record.readSubExpr()); 12269 C->setInscanCopyOps(Vars); 12270 Vars.clear(); 12271 for (unsigned i = 0; i != NumVars; ++i) 12272 Vars.push_back(Record.readSubExpr()); 12273 C->setInscanCopyArrayTemps(Vars); 12274 Vars.clear(); 12275 for (unsigned i = 0; i != NumVars; ++i) 12276 Vars.push_back(Record.readSubExpr()); 12277 C->setInscanCopyArrayElems(Vars); 12278 } 12279 } 12280 12281 void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) { 12282 VisitOMPClauseWithPostUpdate(C); 12283 C->setLParenLoc(Record.readSourceLocation()); 12284 C->setColonLoc(Record.readSourceLocation()); 12285 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12286 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12287 C->setQualifierLoc(NNSL); 12288 C->setNameInfo(DNI); 12289 12290 unsigned NumVars = C->varlist_size(); 12291 SmallVector<Expr *, 16> Vars; 12292 Vars.reserve(NumVars); 12293 for (unsigned I = 0; I != NumVars; ++I) 12294 Vars.push_back(Record.readSubExpr()); 12295 C->setVarRefs(Vars); 12296 Vars.clear(); 12297 for (unsigned I = 0; I != NumVars; ++I) 12298 Vars.push_back(Record.readSubExpr()); 12299 C->setPrivates(Vars); 12300 Vars.clear(); 12301 for (unsigned I = 0; I != NumVars; ++I) 12302 Vars.push_back(Record.readSubExpr()); 12303 C->setLHSExprs(Vars); 12304 Vars.clear(); 12305 for (unsigned I = 0; I != NumVars; ++I) 12306 Vars.push_back(Record.readSubExpr()); 12307 C->setRHSExprs(Vars); 12308 Vars.clear(); 12309 for (unsigned I = 0; I != NumVars; ++I) 12310 Vars.push_back(Record.readSubExpr()); 12311 C->setReductionOps(Vars); 12312 } 12313 12314 void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) { 12315 VisitOMPClauseWithPostUpdate(C); 12316 C->setLParenLoc(Record.readSourceLocation()); 12317 C->setColonLoc(Record.readSourceLocation()); 12318 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12319 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12320 C->setQualifierLoc(NNSL); 12321 C->setNameInfo(DNI); 12322 12323 unsigned NumVars = C->varlist_size(); 12324 SmallVector<Expr *, 16> Vars; 12325 Vars.reserve(NumVars); 12326 for (unsigned I = 0; I != NumVars; ++I) 12327 Vars.push_back(Record.readSubExpr()); 12328 C->setVarRefs(Vars); 12329 Vars.clear(); 12330 for (unsigned I = 0; I != NumVars; ++I) 12331 Vars.push_back(Record.readSubExpr()); 12332 C->setPrivates(Vars); 12333 Vars.clear(); 12334 for (unsigned I = 0; I != NumVars; ++I) 12335 Vars.push_back(Record.readSubExpr()); 12336 C->setLHSExprs(Vars); 12337 Vars.clear(); 12338 for (unsigned I = 0; I != NumVars; ++I) 12339 Vars.push_back(Record.readSubExpr()); 12340 C->setRHSExprs(Vars); 12341 Vars.clear(); 12342 for (unsigned I = 0; I != NumVars; ++I) 12343 Vars.push_back(Record.readSubExpr()); 12344 C->setReductionOps(Vars); 12345 Vars.clear(); 12346 for (unsigned I = 0; I != NumVars; ++I) 12347 Vars.push_back(Record.readSubExpr()); 12348 C->setTaskgroupDescriptors(Vars); 12349 } 12350 12351 void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) { 12352 VisitOMPClauseWithPostUpdate(C); 12353 C->setLParenLoc(Record.readSourceLocation()); 12354 C->setColonLoc(Record.readSourceLocation()); 12355 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt())); 12356 C->setModifierLoc(Record.readSourceLocation()); 12357 unsigned NumVars = C->varlist_size(); 12358 SmallVector<Expr *, 16> Vars; 12359 Vars.reserve(NumVars); 12360 for (unsigned i = 0; i != NumVars; ++i) 12361 Vars.push_back(Record.readSubExpr()); 12362 C->setVarRefs(Vars); 12363 Vars.clear(); 12364 for (unsigned i = 0; i != NumVars; ++i) 12365 Vars.push_back(Record.readSubExpr()); 12366 C->setPrivates(Vars); 12367 Vars.clear(); 12368 for (unsigned i = 0; i != NumVars; ++i) 12369 Vars.push_back(Record.readSubExpr()); 12370 C->setInits(Vars); 12371 Vars.clear(); 12372 for (unsigned i = 0; i != NumVars; ++i) 12373 Vars.push_back(Record.readSubExpr()); 12374 C->setUpdates(Vars); 12375 Vars.clear(); 12376 for (unsigned i = 0; i != NumVars; ++i) 12377 Vars.push_back(Record.readSubExpr()); 12378 C->setFinals(Vars); 12379 C->setStep(Record.readSubExpr()); 12380 C->setCalcStep(Record.readSubExpr()); 12381 Vars.clear(); 12382 for (unsigned I = 0; I != NumVars + 1; ++I) 12383 Vars.push_back(Record.readSubExpr()); 12384 C->setUsedExprs(Vars); 12385 } 12386 12387 void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) { 12388 C->setLParenLoc(Record.readSourceLocation()); 12389 C->setColonLoc(Record.readSourceLocation()); 12390 unsigned NumVars = C->varlist_size(); 12391 SmallVector<Expr *, 16> Vars; 12392 Vars.reserve(NumVars); 12393 for (unsigned i = 0; i != NumVars; ++i) 12394 Vars.push_back(Record.readSubExpr()); 12395 C->setVarRefs(Vars); 12396 C->setAlignment(Record.readSubExpr()); 12397 } 12398 12399 void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) { 12400 C->setLParenLoc(Record.readSourceLocation()); 12401 unsigned NumVars = C->varlist_size(); 12402 SmallVector<Expr *, 16> Exprs; 12403 Exprs.reserve(NumVars); 12404 for (unsigned i = 0; i != NumVars; ++i) 12405 Exprs.push_back(Record.readSubExpr()); 12406 C->setVarRefs(Exprs); 12407 Exprs.clear(); 12408 for (unsigned i = 0; i != NumVars; ++i) 12409 Exprs.push_back(Record.readSubExpr()); 12410 C->setSourceExprs(Exprs); 12411 Exprs.clear(); 12412 for (unsigned i = 0; i != NumVars; ++i) 12413 Exprs.push_back(Record.readSubExpr()); 12414 C->setDestinationExprs(Exprs); 12415 Exprs.clear(); 12416 for (unsigned i = 0; i != NumVars; ++i) 12417 Exprs.push_back(Record.readSubExpr()); 12418 C->setAssignmentOps(Exprs); 12419 } 12420 12421 void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) { 12422 C->setLParenLoc(Record.readSourceLocation()); 12423 unsigned NumVars = C->varlist_size(); 12424 SmallVector<Expr *, 16> Exprs; 12425 Exprs.reserve(NumVars); 12426 for (unsigned i = 0; i != NumVars; ++i) 12427 Exprs.push_back(Record.readSubExpr()); 12428 C->setVarRefs(Exprs); 12429 Exprs.clear(); 12430 for (unsigned i = 0; i != NumVars; ++i) 12431 Exprs.push_back(Record.readSubExpr()); 12432 C->setSourceExprs(Exprs); 12433 Exprs.clear(); 12434 for (unsigned i = 0; i != NumVars; ++i) 12435 Exprs.push_back(Record.readSubExpr()); 12436 C->setDestinationExprs(Exprs); 12437 Exprs.clear(); 12438 for (unsigned i = 0; i != NumVars; ++i) 12439 Exprs.push_back(Record.readSubExpr()); 12440 C->setAssignmentOps(Exprs); 12441 } 12442 12443 void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) { 12444 C->setLParenLoc(Record.readSourceLocation()); 12445 unsigned NumVars = C->varlist_size(); 12446 SmallVector<Expr *, 16> Vars; 12447 Vars.reserve(NumVars); 12448 for (unsigned i = 0; i != NumVars; ++i) 12449 Vars.push_back(Record.readSubExpr()); 12450 C->setVarRefs(Vars); 12451 } 12452 12453 void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) { 12454 C->setDepobj(Record.readSubExpr()); 12455 C->setLParenLoc(Record.readSourceLocation()); 12456 } 12457 12458 void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) { 12459 C->setLParenLoc(Record.readSourceLocation()); 12460 C->setModifier(Record.readSubExpr()); 12461 C->setDependencyKind( 12462 static_cast<OpenMPDependClauseKind>(Record.readInt())); 12463 C->setDependencyLoc(Record.readSourceLocation()); 12464 C->setColonLoc(Record.readSourceLocation()); 12465 unsigned NumVars = C->varlist_size(); 12466 SmallVector<Expr *, 16> Vars; 12467 Vars.reserve(NumVars); 12468 for (unsigned I = 0; I != NumVars; ++I) 12469 Vars.push_back(Record.readSubExpr()); 12470 C->setVarRefs(Vars); 12471 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I) 12472 C->setLoopData(I, Record.readSubExpr()); 12473 } 12474 12475 void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) { 12476 VisitOMPClauseWithPreInit(C); 12477 C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>()); 12478 C->setDevice(Record.readSubExpr()); 12479 C->setModifierLoc(Record.readSourceLocation()); 12480 C->setLParenLoc(Record.readSourceLocation()); 12481 } 12482 12483 void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) { 12484 C->setLParenLoc(Record.readSourceLocation()); 12485 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) { 12486 C->setMapTypeModifier( 12487 I, static_cast<OpenMPMapModifierKind>(Record.readInt())); 12488 C->setMapTypeModifierLoc(I, Record.readSourceLocation()); 12489 } 12490 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12491 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12492 C->setMapType( 12493 static_cast<OpenMPMapClauseKind>(Record.readInt())); 12494 C->setMapLoc(Record.readSourceLocation()); 12495 C->setColonLoc(Record.readSourceLocation()); 12496 auto NumVars = C->varlist_size(); 12497 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12498 auto TotalLists = C->getTotalComponentListNum(); 12499 auto TotalComponents = C->getTotalComponentsNum(); 12500 12501 SmallVector<Expr *, 16> Vars; 12502 Vars.reserve(NumVars); 12503 for (unsigned i = 0; i != NumVars; ++i) 12504 Vars.push_back(Record.readExpr()); 12505 C->setVarRefs(Vars); 12506 12507 SmallVector<Expr *, 16> UDMappers; 12508 UDMappers.reserve(NumVars); 12509 for (unsigned I = 0; I < NumVars; ++I) 12510 UDMappers.push_back(Record.readExpr()); 12511 C->setUDMapperRefs(UDMappers); 12512 12513 SmallVector<ValueDecl *, 16> Decls; 12514 Decls.reserve(UniqueDecls); 12515 for (unsigned i = 0; i < UniqueDecls; ++i) 12516 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12517 C->setUniqueDecls(Decls); 12518 12519 SmallVector<unsigned, 16> ListsPerDecl; 12520 ListsPerDecl.reserve(UniqueDecls); 12521 for (unsigned i = 0; i < UniqueDecls; ++i) 12522 ListsPerDecl.push_back(Record.readInt()); 12523 C->setDeclNumLists(ListsPerDecl); 12524 12525 SmallVector<unsigned, 32> ListSizes; 12526 ListSizes.reserve(TotalLists); 12527 for (unsigned i = 0; i < TotalLists; ++i) 12528 ListSizes.push_back(Record.readInt()); 12529 C->setComponentListSizes(ListSizes); 12530 12531 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12532 Components.reserve(TotalComponents); 12533 for (unsigned i = 0; i < TotalComponents; ++i) { 12534 Expr *AssociatedExpr = Record.readExpr(); 12535 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12536 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12537 AssociatedExpr, AssociatedDecl)); 12538 } 12539 C->setComponents(Components, ListSizes); 12540 } 12541 12542 void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) { 12543 C->setLParenLoc(Record.readSourceLocation()); 12544 C->setColonLoc(Record.readSourceLocation()); 12545 C->setAllocator(Record.readSubExpr()); 12546 unsigned NumVars = C->varlist_size(); 12547 SmallVector<Expr *, 16> Vars; 12548 Vars.reserve(NumVars); 12549 for (unsigned i = 0; i != NumVars; ++i) 12550 Vars.push_back(Record.readSubExpr()); 12551 C->setVarRefs(Vars); 12552 } 12553 12554 void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) { 12555 VisitOMPClauseWithPreInit(C); 12556 C->setNumTeams(Record.readSubExpr()); 12557 C->setLParenLoc(Record.readSourceLocation()); 12558 } 12559 12560 void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) { 12561 VisitOMPClauseWithPreInit(C); 12562 C->setThreadLimit(Record.readSubExpr()); 12563 C->setLParenLoc(Record.readSourceLocation()); 12564 } 12565 12566 void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) { 12567 VisitOMPClauseWithPreInit(C); 12568 C->setPriority(Record.readSubExpr()); 12569 C->setLParenLoc(Record.readSourceLocation()); 12570 } 12571 12572 void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) { 12573 VisitOMPClauseWithPreInit(C); 12574 C->setGrainsize(Record.readSubExpr()); 12575 C->setLParenLoc(Record.readSourceLocation()); 12576 } 12577 12578 void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) { 12579 VisitOMPClauseWithPreInit(C); 12580 C->setNumTasks(Record.readSubExpr()); 12581 C->setLParenLoc(Record.readSourceLocation()); 12582 } 12583 12584 void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) { 12585 C->setHint(Record.readSubExpr()); 12586 C->setLParenLoc(Record.readSourceLocation()); 12587 } 12588 12589 void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) { 12590 VisitOMPClauseWithPreInit(C); 12591 C->setDistScheduleKind( 12592 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt())); 12593 C->setChunkSize(Record.readSubExpr()); 12594 C->setLParenLoc(Record.readSourceLocation()); 12595 C->setDistScheduleKindLoc(Record.readSourceLocation()); 12596 C->setCommaLoc(Record.readSourceLocation()); 12597 } 12598 12599 void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) { 12600 C->setDefaultmapKind( 12601 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt())); 12602 C->setDefaultmapModifier( 12603 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt())); 12604 C->setLParenLoc(Record.readSourceLocation()); 12605 C->setDefaultmapModifierLoc(Record.readSourceLocation()); 12606 C->setDefaultmapKindLoc(Record.readSourceLocation()); 12607 } 12608 12609 void OMPClauseReader::VisitOMPToClause(OMPToClause *C) { 12610 C->setLParenLoc(Record.readSourceLocation()); 12611 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12612 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12613 auto NumVars = C->varlist_size(); 12614 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12615 auto TotalLists = C->getTotalComponentListNum(); 12616 auto TotalComponents = C->getTotalComponentsNum(); 12617 12618 SmallVector<Expr *, 16> Vars; 12619 Vars.reserve(NumVars); 12620 for (unsigned i = 0; i != NumVars; ++i) 12621 Vars.push_back(Record.readSubExpr()); 12622 C->setVarRefs(Vars); 12623 12624 SmallVector<Expr *, 16> UDMappers; 12625 UDMappers.reserve(NumVars); 12626 for (unsigned I = 0; I < NumVars; ++I) 12627 UDMappers.push_back(Record.readSubExpr()); 12628 C->setUDMapperRefs(UDMappers); 12629 12630 SmallVector<ValueDecl *, 16> Decls; 12631 Decls.reserve(UniqueDecls); 12632 for (unsigned i = 0; i < UniqueDecls; ++i) 12633 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12634 C->setUniqueDecls(Decls); 12635 12636 SmallVector<unsigned, 16> ListsPerDecl; 12637 ListsPerDecl.reserve(UniqueDecls); 12638 for (unsigned i = 0; i < UniqueDecls; ++i) 12639 ListsPerDecl.push_back(Record.readInt()); 12640 C->setDeclNumLists(ListsPerDecl); 12641 12642 SmallVector<unsigned, 32> ListSizes; 12643 ListSizes.reserve(TotalLists); 12644 for (unsigned i = 0; i < TotalLists; ++i) 12645 ListSizes.push_back(Record.readInt()); 12646 C->setComponentListSizes(ListSizes); 12647 12648 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12649 Components.reserve(TotalComponents); 12650 for (unsigned i = 0; i < TotalComponents; ++i) { 12651 Expr *AssociatedExpr = Record.readSubExpr(); 12652 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12653 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12654 AssociatedExpr, AssociatedDecl)); 12655 } 12656 C->setComponents(Components, ListSizes); 12657 } 12658 12659 void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) { 12660 C->setLParenLoc(Record.readSourceLocation()); 12661 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12662 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12663 auto NumVars = C->varlist_size(); 12664 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12665 auto TotalLists = C->getTotalComponentListNum(); 12666 auto TotalComponents = C->getTotalComponentsNum(); 12667 12668 SmallVector<Expr *, 16> Vars; 12669 Vars.reserve(NumVars); 12670 for (unsigned i = 0; i != NumVars; ++i) 12671 Vars.push_back(Record.readSubExpr()); 12672 C->setVarRefs(Vars); 12673 12674 SmallVector<Expr *, 16> UDMappers; 12675 UDMappers.reserve(NumVars); 12676 for (unsigned I = 0; I < NumVars; ++I) 12677 UDMappers.push_back(Record.readSubExpr()); 12678 C->setUDMapperRefs(UDMappers); 12679 12680 SmallVector<ValueDecl *, 16> Decls; 12681 Decls.reserve(UniqueDecls); 12682 for (unsigned i = 0; i < UniqueDecls; ++i) 12683 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12684 C->setUniqueDecls(Decls); 12685 12686 SmallVector<unsigned, 16> ListsPerDecl; 12687 ListsPerDecl.reserve(UniqueDecls); 12688 for (unsigned i = 0; i < UniqueDecls; ++i) 12689 ListsPerDecl.push_back(Record.readInt()); 12690 C->setDeclNumLists(ListsPerDecl); 12691 12692 SmallVector<unsigned, 32> ListSizes; 12693 ListSizes.reserve(TotalLists); 12694 for (unsigned i = 0; i < TotalLists; ++i) 12695 ListSizes.push_back(Record.readInt()); 12696 C->setComponentListSizes(ListSizes); 12697 12698 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12699 Components.reserve(TotalComponents); 12700 for (unsigned i = 0; i < TotalComponents; ++i) { 12701 Expr *AssociatedExpr = Record.readSubExpr(); 12702 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12703 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12704 AssociatedExpr, AssociatedDecl)); 12705 } 12706 C->setComponents(Components, ListSizes); 12707 } 12708 12709 void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) { 12710 C->setLParenLoc(Record.readSourceLocation()); 12711 auto NumVars = C->varlist_size(); 12712 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12713 auto TotalLists = C->getTotalComponentListNum(); 12714 auto TotalComponents = C->getTotalComponentsNum(); 12715 12716 SmallVector<Expr *, 16> Vars; 12717 Vars.reserve(NumVars); 12718 for (unsigned i = 0; i != NumVars; ++i) 12719 Vars.push_back(Record.readSubExpr()); 12720 C->setVarRefs(Vars); 12721 Vars.clear(); 12722 for (unsigned i = 0; i != NumVars; ++i) 12723 Vars.push_back(Record.readSubExpr()); 12724 C->setPrivateCopies(Vars); 12725 Vars.clear(); 12726 for (unsigned i = 0; i != NumVars; ++i) 12727 Vars.push_back(Record.readSubExpr()); 12728 C->setInits(Vars); 12729 12730 SmallVector<ValueDecl *, 16> Decls; 12731 Decls.reserve(UniqueDecls); 12732 for (unsigned i = 0; i < UniqueDecls; ++i) 12733 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12734 C->setUniqueDecls(Decls); 12735 12736 SmallVector<unsigned, 16> ListsPerDecl; 12737 ListsPerDecl.reserve(UniqueDecls); 12738 for (unsigned i = 0; i < UniqueDecls; ++i) 12739 ListsPerDecl.push_back(Record.readInt()); 12740 C->setDeclNumLists(ListsPerDecl); 12741 12742 SmallVector<unsigned, 32> ListSizes; 12743 ListSizes.reserve(TotalLists); 12744 for (unsigned i = 0; i < TotalLists; ++i) 12745 ListSizes.push_back(Record.readInt()); 12746 C->setComponentListSizes(ListSizes); 12747 12748 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12749 Components.reserve(TotalComponents); 12750 for (unsigned i = 0; i < TotalComponents; ++i) { 12751 Expr *AssociatedExpr = Record.readSubExpr(); 12752 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12753 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12754 AssociatedExpr, AssociatedDecl)); 12755 } 12756 C->setComponents(Components, ListSizes); 12757 } 12758 12759 void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) { 12760 C->setLParenLoc(Record.readSourceLocation()); 12761 auto NumVars = C->varlist_size(); 12762 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12763 auto TotalLists = C->getTotalComponentListNum(); 12764 auto TotalComponents = C->getTotalComponentsNum(); 12765 12766 SmallVector<Expr *, 16> Vars; 12767 Vars.reserve(NumVars); 12768 for (unsigned i = 0; i != NumVars; ++i) 12769 Vars.push_back(Record.readSubExpr()); 12770 C->setVarRefs(Vars); 12771 12772 SmallVector<ValueDecl *, 16> Decls; 12773 Decls.reserve(UniqueDecls); 12774 for (unsigned i = 0; i < UniqueDecls; ++i) 12775 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12776 C->setUniqueDecls(Decls); 12777 12778 SmallVector<unsigned, 16> ListsPerDecl; 12779 ListsPerDecl.reserve(UniqueDecls); 12780 for (unsigned i = 0; i < UniqueDecls; ++i) 12781 ListsPerDecl.push_back(Record.readInt()); 12782 C->setDeclNumLists(ListsPerDecl); 12783 12784 SmallVector<unsigned, 32> ListSizes; 12785 ListSizes.reserve(TotalLists); 12786 for (unsigned i = 0; i < TotalLists; ++i) 12787 ListSizes.push_back(Record.readInt()); 12788 C->setComponentListSizes(ListSizes); 12789 12790 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12791 Components.reserve(TotalComponents); 12792 for (unsigned i = 0; i < TotalComponents; ++i) { 12793 Expr *AssociatedExpr = Record.readSubExpr(); 12794 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12795 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12796 AssociatedExpr, AssociatedDecl)); 12797 } 12798 C->setComponents(Components, ListSizes); 12799 } 12800 12801 void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 12802 C->setLParenLoc(Record.readSourceLocation()); 12803 auto NumVars = C->varlist_size(); 12804 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12805 auto TotalLists = C->getTotalComponentListNum(); 12806 auto TotalComponents = C->getTotalComponentsNum(); 12807 12808 SmallVector<Expr *, 16> Vars; 12809 Vars.reserve(NumVars); 12810 for (unsigned i = 0; i != NumVars; ++i) 12811 Vars.push_back(Record.readSubExpr()); 12812 C->setVarRefs(Vars); 12813 Vars.clear(); 12814 12815 SmallVector<ValueDecl *, 16> Decls; 12816 Decls.reserve(UniqueDecls); 12817 for (unsigned i = 0; i < UniqueDecls; ++i) 12818 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12819 C->setUniqueDecls(Decls); 12820 12821 SmallVector<unsigned, 16> ListsPerDecl; 12822 ListsPerDecl.reserve(UniqueDecls); 12823 for (unsigned i = 0; i < UniqueDecls; ++i) 12824 ListsPerDecl.push_back(Record.readInt()); 12825 C->setDeclNumLists(ListsPerDecl); 12826 12827 SmallVector<unsigned, 32> ListSizes; 12828 ListSizes.reserve(TotalLists); 12829 for (unsigned i = 0; i < TotalLists; ++i) 12830 ListSizes.push_back(Record.readInt()); 12831 C->setComponentListSizes(ListSizes); 12832 12833 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12834 Components.reserve(TotalComponents); 12835 for (unsigned i = 0; i < TotalComponents; ++i) { 12836 Expr *AssociatedExpr = Record.readSubExpr(); 12837 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12838 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12839 AssociatedExpr, AssociatedDecl)); 12840 } 12841 C->setComponents(Components, ListSizes); 12842 } 12843 12844 void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) { 12845 C->setLParenLoc(Record.readSourceLocation()); 12846 unsigned NumVars = C->varlist_size(); 12847 SmallVector<Expr *, 16> Vars; 12848 Vars.reserve(NumVars); 12849 for (unsigned i = 0; i != NumVars; ++i) 12850 Vars.push_back(Record.readSubExpr()); 12851 C->setVarRefs(Vars); 12852 Vars.clear(); 12853 Vars.reserve(NumVars); 12854 for (unsigned i = 0; i != NumVars; ++i) 12855 Vars.push_back(Record.readSubExpr()); 12856 C->setPrivateRefs(Vars); 12857 } 12858 12859 void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) { 12860 C->setLParenLoc(Record.readSourceLocation()); 12861 unsigned NumVars = C->varlist_size(); 12862 SmallVector<Expr *, 16> Vars; 12863 Vars.reserve(NumVars); 12864 for (unsigned i = 0; i != NumVars; ++i) 12865 Vars.push_back(Record.readSubExpr()); 12866 C->setVarRefs(Vars); 12867 } 12868 12869 void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) { 12870 C->setLParenLoc(Record.readSourceLocation()); 12871 unsigned NumVars = C->varlist_size(); 12872 SmallVector<Expr *, 16> Vars; 12873 Vars.reserve(NumVars); 12874 for (unsigned i = 0; i != NumVars; ++i) 12875 Vars.push_back(Record.readSubExpr()); 12876 C->setVarRefs(Vars); 12877 } 12878 12879 void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) { 12880 C->setLParenLoc(Record.readSourceLocation()); 12881 unsigned NumOfAllocators = C->getNumberOfAllocators(); 12882 SmallVector<OMPUsesAllocatorsClause::Data, 4> Data; 12883 Data.reserve(NumOfAllocators); 12884 for (unsigned I = 0; I != NumOfAllocators; ++I) { 12885 OMPUsesAllocatorsClause::Data &D = Data.emplace_back(); 12886 D.Allocator = Record.readSubExpr(); 12887 D.AllocatorTraits = Record.readSubExpr(); 12888 D.LParenLoc = Record.readSourceLocation(); 12889 D.RParenLoc = Record.readSourceLocation(); 12890 } 12891 C->setAllocatorsData(Data); 12892 } 12893 12894 void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) { 12895 C->setLParenLoc(Record.readSourceLocation()); 12896 C->setModifier(Record.readSubExpr()); 12897 C->setColonLoc(Record.readSourceLocation()); 12898 unsigned NumOfLocators = C->varlist_size(); 12899 SmallVector<Expr *, 4> Locators; 12900 Locators.reserve(NumOfLocators); 12901 for (unsigned I = 0; I != NumOfLocators; ++I) 12902 Locators.push_back(Record.readSubExpr()); 12903 C->setVarRefs(Locators); 12904 } 12905 12906 void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) { 12907 C->setKind(Record.readEnum<OpenMPOrderClauseKind>()); 12908 C->setLParenLoc(Record.readSourceLocation()); 12909 C->setKindKwLoc(Record.readSourceLocation()); 12910 } 12911 12912 OMPTraitInfo *ASTRecordReader::readOMPTraitInfo() { 12913 OMPTraitInfo &TI = getContext().getNewOMPTraitInfo(); 12914 TI.Sets.resize(readUInt32()); 12915 for (auto &Set : TI.Sets) { 12916 Set.Kind = readEnum<llvm::omp::TraitSet>(); 12917 Set.Selectors.resize(readUInt32()); 12918 for (auto &Selector : Set.Selectors) { 12919 Selector.Kind = readEnum<llvm::omp::TraitSelector>(); 12920 Selector.ScoreOrCondition = nullptr; 12921 if (readBool()) 12922 Selector.ScoreOrCondition = readExprRef(); 12923 Selector.Properties.resize(readUInt32()); 12924 for (auto &Property : Selector.Properties) 12925 Property.Kind = readEnum<llvm::omp::TraitProperty>(); 12926 } 12927 } 12928 return &TI; 12929 } 12930