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 1340 RecordData Record; 1341 while (true) { 1342 Expected<llvm::BitstreamEntry> MaybeE = 1343 SLocEntryCursor.advanceSkippingSubblocks(); 1344 if (!MaybeE) { 1345 Error(MaybeE.takeError()); 1346 return true; 1347 } 1348 llvm::BitstreamEntry E = MaybeE.get(); 1349 1350 switch (E.Kind) { 1351 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1352 case llvm::BitstreamEntry::Error: 1353 Error("malformed block record in AST file"); 1354 return true; 1355 case llvm::BitstreamEntry::EndBlock: 1356 return false; 1357 case llvm::BitstreamEntry::Record: 1358 // The interesting case. 1359 break; 1360 } 1361 1362 // Read a record. 1363 Record.clear(); 1364 StringRef Blob; 1365 Expected<unsigned> MaybeRecord = 1366 SLocEntryCursor.readRecord(E.ID, Record, &Blob); 1367 if (!MaybeRecord) { 1368 Error(MaybeRecord.takeError()); 1369 return true; 1370 } 1371 switch (MaybeRecord.get()) { 1372 default: // Default behavior: ignore. 1373 break; 1374 1375 case SM_SLOC_FILE_ENTRY: 1376 case SM_SLOC_BUFFER_ENTRY: 1377 case SM_SLOC_EXPANSION_ENTRY: 1378 // Once we hit one of the source location entries, we're done. 1379 return false; 1380 } 1381 } 1382 } 1383 1384 /// If a header file is not found at the path that we expect it to be 1385 /// and the PCH file was moved from its original location, try to resolve the 1386 /// file by assuming that header+PCH were moved together and the header is in 1387 /// the same place relative to the PCH. 1388 static std::string 1389 resolveFileRelativeToOriginalDir(const std::string &Filename, 1390 const std::string &OriginalDir, 1391 const std::string &CurrDir) { 1392 assert(OriginalDir != CurrDir && 1393 "No point trying to resolve the file if the PCH dir didn't change"); 1394 1395 using namespace llvm::sys; 1396 1397 SmallString<128> filePath(Filename); 1398 fs::make_absolute(filePath); 1399 assert(path::is_absolute(OriginalDir)); 1400 SmallString<128> currPCHPath(CurrDir); 1401 1402 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)), 1403 fileDirE = path::end(path::parent_path(filePath)); 1404 path::const_iterator origDirI = path::begin(OriginalDir), 1405 origDirE = path::end(OriginalDir); 1406 // Skip the common path components from filePath and OriginalDir. 1407 while (fileDirI != fileDirE && origDirI != origDirE && 1408 *fileDirI == *origDirI) { 1409 ++fileDirI; 1410 ++origDirI; 1411 } 1412 for (; origDirI != origDirE; ++origDirI) 1413 path::append(currPCHPath, ".."); 1414 path::append(currPCHPath, fileDirI, fileDirE); 1415 path::append(currPCHPath, path::filename(Filename)); 1416 return std::string(currPCHPath.str()); 1417 } 1418 1419 bool ASTReader::ReadSLocEntry(int ID) { 1420 if (ID == 0) 1421 return false; 1422 1423 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1424 Error("source location entry ID out-of-range for AST file"); 1425 return true; 1426 } 1427 1428 // Local helper to read the (possibly-compressed) buffer data following the 1429 // entry record. 1430 auto ReadBuffer = [this]( 1431 BitstreamCursor &SLocEntryCursor, 1432 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> { 1433 RecordData Record; 1434 StringRef Blob; 1435 Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode(); 1436 if (!MaybeCode) { 1437 Error(MaybeCode.takeError()); 1438 return nullptr; 1439 } 1440 unsigned Code = MaybeCode.get(); 1441 1442 Expected<unsigned> MaybeRecCode = 1443 SLocEntryCursor.readRecord(Code, Record, &Blob); 1444 if (!MaybeRecCode) { 1445 Error(MaybeRecCode.takeError()); 1446 return nullptr; 1447 } 1448 unsigned RecCode = MaybeRecCode.get(); 1449 1450 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) { 1451 if (!llvm::zlib::isAvailable()) { 1452 Error("zlib is not available"); 1453 return nullptr; 1454 } 1455 SmallString<0> Uncompressed; 1456 if (llvm::Error E = 1457 llvm::zlib::uncompress(Blob, Uncompressed, Record[0])) { 1458 Error("could not decompress embedded file contents: " + 1459 llvm::toString(std::move(E))); 1460 return nullptr; 1461 } 1462 return llvm::MemoryBuffer::getMemBufferCopy(Uncompressed, Name); 1463 } else if (RecCode == SM_SLOC_BUFFER_BLOB) { 1464 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true); 1465 } else { 1466 Error("AST record has invalid code"); 1467 return nullptr; 1468 } 1469 }; 1470 1471 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second; 1472 if (llvm::Error Err = F->SLocEntryCursor.JumpToBit( 1473 F->SLocEntryOffsetsBase + 1474 F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) { 1475 Error(std::move(Err)); 1476 return true; 1477 } 1478 1479 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor; 1480 unsigned BaseOffset = F->SLocEntryBaseOffset; 1481 1482 ++NumSLocEntriesRead; 1483 Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance(); 1484 if (!MaybeEntry) { 1485 Error(MaybeEntry.takeError()); 1486 return true; 1487 } 1488 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1489 1490 if (Entry.Kind != llvm::BitstreamEntry::Record) { 1491 Error("incorrectly-formatted source location entry in AST file"); 1492 return true; 1493 } 1494 1495 RecordData Record; 1496 StringRef Blob; 1497 Expected<unsigned> MaybeSLOC = 1498 SLocEntryCursor.readRecord(Entry.ID, Record, &Blob); 1499 if (!MaybeSLOC) { 1500 Error(MaybeSLOC.takeError()); 1501 return true; 1502 } 1503 switch (MaybeSLOC.get()) { 1504 default: 1505 Error("incorrectly-formatted source location entry in AST file"); 1506 return true; 1507 1508 case SM_SLOC_FILE_ENTRY: { 1509 // We will detect whether a file changed and return 'Failure' for it, but 1510 // we will also try to fail gracefully by setting up the SLocEntry. 1511 unsigned InputID = Record[4]; 1512 InputFile IF = getInputFile(*F, InputID); 1513 const FileEntry *File = IF.getFile(); 1514 bool OverriddenBuffer = IF.isOverridden(); 1515 1516 // Note that we only check if a File was returned. If it was out-of-date 1517 // we have complained but we will continue creating a FileID to recover 1518 // gracefully. 1519 if (!File) 1520 return true; 1521 1522 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1523 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) { 1524 // This is the module's main file. 1525 IncludeLoc = getImportLocation(F); 1526 } 1527 SrcMgr::CharacteristicKind 1528 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1529 // FIXME: The FileID should be created from the FileEntryRef. 1530 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter, 1531 ID, BaseOffset + Record[0]); 1532 SrcMgr::FileInfo &FileInfo = 1533 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile()); 1534 FileInfo.NumCreatedFIDs = Record[5]; 1535 if (Record[3]) 1536 FileInfo.setHasLineDirectives(); 1537 1538 unsigned NumFileDecls = Record[7]; 1539 if (NumFileDecls && ContextObj) { 1540 const DeclID *FirstDecl = F->FileSortedDecls + Record[6]; 1541 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?"); 1542 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl, 1543 NumFileDecls)); 1544 } 1545 1546 const SrcMgr::ContentCache *ContentCache 1547 = SourceMgr.getOrCreateContentCache(File, isSystem(FileCharacter)); 1548 if (OverriddenBuffer && !ContentCache->BufferOverridden && 1549 ContentCache->ContentsEntry == ContentCache->OrigEntry && 1550 !ContentCache->getRawBuffer()) { 1551 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName()); 1552 if (!Buffer) 1553 return true; 1554 SourceMgr.overrideFileContents(File, std::move(Buffer)); 1555 } 1556 1557 break; 1558 } 1559 1560 case SM_SLOC_BUFFER_ENTRY: { 1561 const char *Name = Blob.data(); 1562 unsigned Offset = Record[0]; 1563 SrcMgr::CharacteristicKind 1564 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1565 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1566 if (IncludeLoc.isInvalid() && F->isModule()) { 1567 IncludeLoc = getImportLocation(F); 1568 } 1569 1570 auto Buffer = ReadBuffer(SLocEntryCursor, Name); 1571 if (!Buffer) 1572 return true; 1573 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID, 1574 BaseOffset + Offset, IncludeLoc); 1575 break; 1576 } 1577 1578 case SM_SLOC_EXPANSION_ENTRY: { 1579 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]); 1580 SourceMgr.createExpansionLoc(SpellingLoc, 1581 ReadSourceLocation(*F, Record[2]), 1582 ReadSourceLocation(*F, Record[3]), 1583 Record[5], 1584 Record[4], 1585 ID, 1586 BaseOffset + Record[0]); 1587 break; 1588 } 1589 } 1590 1591 return false; 1592 } 1593 1594 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) { 1595 if (ID == 0) 1596 return std::make_pair(SourceLocation(), ""); 1597 1598 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1599 Error("source location entry ID out-of-range for AST file"); 1600 return std::make_pair(SourceLocation(), ""); 1601 } 1602 1603 // Find which module file this entry lands in. 1604 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second; 1605 if (!M->isModule()) 1606 return std::make_pair(SourceLocation(), ""); 1607 1608 // FIXME: Can we map this down to a particular submodule? That would be 1609 // ideal. 1610 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName)); 1611 } 1612 1613 /// Find the location where the module F is imported. 1614 SourceLocation ASTReader::getImportLocation(ModuleFile *F) { 1615 if (F->ImportLoc.isValid()) 1616 return F->ImportLoc; 1617 1618 // Otherwise we have a PCH. It's considered to be "imported" at the first 1619 // location of its includer. 1620 if (F->ImportedBy.empty() || !F->ImportedBy[0]) { 1621 // Main file is the importer. 1622 assert(SourceMgr.getMainFileID().isValid() && "missing main file"); 1623 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID()); 1624 } 1625 return F->ImportedBy[0]->FirstLoc; 1626 } 1627 1628 /// Enter a subblock of the specified BlockID with the specified cursor. Read 1629 /// the abbreviations that are at the top of the block and then leave the cursor 1630 /// pointing into the block. 1631 bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) { 1632 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) { 1633 // FIXME this drops errors on the floor. 1634 consumeError(std::move(Err)); 1635 return true; 1636 } 1637 1638 while (true) { 1639 uint64_t Offset = Cursor.GetCurrentBitNo(); 1640 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1641 if (!MaybeCode) { 1642 // FIXME this drops errors on the floor. 1643 consumeError(MaybeCode.takeError()); 1644 return true; 1645 } 1646 unsigned Code = MaybeCode.get(); 1647 1648 // We expect all abbrevs to be at the start of the block. 1649 if (Code != llvm::bitc::DEFINE_ABBREV) { 1650 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1651 // FIXME this drops errors on the floor. 1652 consumeError(std::move(Err)); 1653 return true; 1654 } 1655 return false; 1656 } 1657 if (llvm::Error Err = Cursor.ReadAbbrevRecord()) { 1658 // FIXME this drops errors on the floor. 1659 consumeError(std::move(Err)); 1660 return true; 1661 } 1662 } 1663 } 1664 1665 Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record, 1666 unsigned &Idx) { 1667 Token Tok; 1668 Tok.startToken(); 1669 Tok.setLocation(ReadSourceLocation(F, Record, Idx)); 1670 Tok.setLength(Record[Idx++]); 1671 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++])) 1672 Tok.setIdentifierInfo(II); 1673 Tok.setKind((tok::TokenKind)Record[Idx++]); 1674 Tok.setFlag((Token::TokenFlags)Record[Idx++]); 1675 return Tok; 1676 } 1677 1678 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { 1679 BitstreamCursor &Stream = F.MacroCursor; 1680 1681 // Keep track of where we are in the stream, then jump back there 1682 // after reading this macro. 1683 SavedStreamPosition SavedPosition(Stream); 1684 1685 if (llvm::Error Err = Stream.JumpToBit(Offset)) { 1686 // FIXME this drops errors on the floor. 1687 consumeError(std::move(Err)); 1688 return nullptr; 1689 } 1690 RecordData Record; 1691 SmallVector<IdentifierInfo*, 16> MacroParams; 1692 MacroInfo *Macro = nullptr; 1693 1694 while (true) { 1695 // Advance to the next record, but if we get to the end of the block, don't 1696 // pop it (removing all the abbreviations from the cursor) since we want to 1697 // be able to reseek within the block and read entries. 1698 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd; 1699 Expected<llvm::BitstreamEntry> MaybeEntry = 1700 Stream.advanceSkippingSubblocks(Flags); 1701 if (!MaybeEntry) { 1702 Error(MaybeEntry.takeError()); 1703 return Macro; 1704 } 1705 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1706 1707 switch (Entry.Kind) { 1708 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1709 case llvm::BitstreamEntry::Error: 1710 Error("malformed block record in AST file"); 1711 return Macro; 1712 case llvm::BitstreamEntry::EndBlock: 1713 return Macro; 1714 case llvm::BitstreamEntry::Record: 1715 // The interesting case. 1716 break; 1717 } 1718 1719 // Read a record. 1720 Record.clear(); 1721 PreprocessorRecordTypes RecType; 1722 if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record)) 1723 RecType = (PreprocessorRecordTypes)MaybeRecType.get(); 1724 else { 1725 Error(MaybeRecType.takeError()); 1726 return Macro; 1727 } 1728 switch (RecType) { 1729 case PP_MODULE_MACRO: 1730 case PP_MACRO_DIRECTIVE_HISTORY: 1731 return Macro; 1732 1733 case PP_MACRO_OBJECT_LIKE: 1734 case PP_MACRO_FUNCTION_LIKE: { 1735 // If we already have a macro, that means that we've hit the end 1736 // of the definition of the macro we were looking for. We're 1737 // done. 1738 if (Macro) 1739 return Macro; 1740 1741 unsigned NextIndex = 1; // Skip identifier ID. 1742 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex); 1743 MacroInfo *MI = PP.AllocateMacroInfo(Loc); 1744 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex)); 1745 MI->setIsUsed(Record[NextIndex++]); 1746 MI->setUsedForHeaderGuard(Record[NextIndex++]); 1747 1748 if (RecType == PP_MACRO_FUNCTION_LIKE) { 1749 // Decode function-like macro info. 1750 bool isC99VarArgs = Record[NextIndex++]; 1751 bool isGNUVarArgs = Record[NextIndex++]; 1752 bool hasCommaPasting = Record[NextIndex++]; 1753 MacroParams.clear(); 1754 unsigned NumArgs = Record[NextIndex++]; 1755 for (unsigned i = 0; i != NumArgs; ++i) 1756 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++])); 1757 1758 // Install function-like macro info. 1759 MI->setIsFunctionLike(); 1760 if (isC99VarArgs) MI->setIsC99Varargs(); 1761 if (isGNUVarArgs) MI->setIsGNUVarargs(); 1762 if (hasCommaPasting) MI->setHasCommaPasting(); 1763 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator()); 1764 } 1765 1766 // Remember that we saw this macro last so that we add the tokens that 1767 // form its body to it. 1768 Macro = MI; 1769 1770 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() && 1771 Record[NextIndex]) { 1772 // We have a macro definition. Register the association 1773 PreprocessedEntityID 1774 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]); 1775 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 1776 PreprocessingRecord::PPEntityID PPID = 1777 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true); 1778 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>( 1779 PPRec.getPreprocessedEntity(PPID)); 1780 if (PPDef) 1781 PPRec.RegisterMacroDefinition(Macro, PPDef); 1782 } 1783 1784 ++NumMacrosRead; 1785 break; 1786 } 1787 1788 case PP_TOKEN: { 1789 // If we see a TOKEN before a PP_MACRO_*, then the file is 1790 // erroneous, just pretend we didn't see this. 1791 if (!Macro) break; 1792 1793 unsigned Idx = 0; 1794 Token Tok = ReadToken(F, Record, Idx); 1795 Macro->AddTokenToBody(Tok); 1796 break; 1797 } 1798 } 1799 } 1800 } 1801 1802 PreprocessedEntityID 1803 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, 1804 unsigned LocalID) const { 1805 if (!M.ModuleOffsetMap.empty()) 1806 ReadModuleOffsetMap(M); 1807 1808 ContinuousRangeMap<uint32_t, int, 2>::const_iterator 1809 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS); 1810 assert(I != M.PreprocessedEntityRemap.end() 1811 && "Invalid index into preprocessed entity index remap"); 1812 1813 return LocalID + I->second; 1814 } 1815 1816 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) { 1817 return llvm::hash_combine(ikey.Size, ikey.ModTime); 1818 } 1819 1820 HeaderFileInfoTrait::internal_key_type 1821 HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) { 1822 internal_key_type ikey = {FE->getSize(), 1823 M.HasTimestamps ? FE->getModificationTime() : 0, 1824 FE->getName(), /*Imported*/ false}; 1825 return ikey; 1826 } 1827 1828 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) { 1829 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime)) 1830 return false; 1831 1832 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename) 1833 return true; 1834 1835 // Determine whether the actual files are equivalent. 1836 FileManager &FileMgr = Reader.getFileManager(); 1837 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* { 1838 if (!Key.Imported) { 1839 if (auto File = FileMgr.getFile(Key.Filename)) 1840 return *File; 1841 return nullptr; 1842 } 1843 1844 std::string Resolved = std::string(Key.Filename); 1845 Reader.ResolveImportedPath(M, Resolved); 1846 if (auto File = FileMgr.getFile(Resolved)) 1847 return *File; 1848 return nullptr; 1849 }; 1850 1851 const FileEntry *FEA = GetFile(a); 1852 const FileEntry *FEB = GetFile(b); 1853 return FEA && FEA == FEB; 1854 } 1855 1856 std::pair<unsigned, unsigned> 1857 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) { 1858 using namespace llvm::support; 1859 1860 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d); 1861 unsigned DataLen = (unsigned) *d++; 1862 return std::make_pair(KeyLen, DataLen); 1863 } 1864 1865 HeaderFileInfoTrait::internal_key_type 1866 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) { 1867 using namespace llvm::support; 1868 1869 internal_key_type ikey; 1870 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d)); 1871 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d)); 1872 ikey.Filename = (const char *)d; 1873 ikey.Imported = true; 1874 return ikey; 1875 } 1876 1877 HeaderFileInfoTrait::data_type 1878 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d, 1879 unsigned DataLen) { 1880 using namespace llvm::support; 1881 1882 const unsigned char *End = d + DataLen; 1883 HeaderFileInfo HFI; 1884 unsigned Flags = *d++; 1885 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp. 1886 HFI.isImport |= (Flags >> 5) & 0x01; 1887 HFI.isPragmaOnce |= (Flags >> 4) & 0x01; 1888 HFI.DirInfo = (Flags >> 1) & 0x07; 1889 HFI.IndexHeaderMapHeader = Flags & 0x01; 1890 // FIXME: Find a better way to handle this. Maybe just store a 1891 // "has been included" flag? 1892 HFI.NumIncludes = std::max(endian::readNext<uint16_t, little, unaligned>(d), 1893 HFI.NumIncludes); 1894 HFI.ControllingMacroID = Reader.getGlobalIdentifierID( 1895 M, endian::readNext<uint32_t, little, unaligned>(d)); 1896 if (unsigned FrameworkOffset = 1897 endian::readNext<uint32_t, little, unaligned>(d)) { 1898 // The framework offset is 1 greater than the actual offset, 1899 // since 0 is used as an indicator for "no framework name". 1900 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1); 1901 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName); 1902 } 1903 1904 assert((End - d) % 4 == 0 && 1905 "Wrong data length in HeaderFileInfo deserialization"); 1906 while (d != End) { 1907 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d); 1908 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3); 1909 LocalSMID >>= 2; 1910 1911 // This header is part of a module. Associate it with the module to enable 1912 // implicit module import. 1913 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID); 1914 Module *Mod = Reader.getSubmodule(GlobalSMID); 1915 FileManager &FileMgr = Reader.getFileManager(); 1916 ModuleMap &ModMap = 1917 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap(); 1918 1919 std::string Filename = std::string(key.Filename); 1920 if (key.Imported) 1921 Reader.ResolveImportedPath(M, Filename); 1922 // FIXME: This is not always the right filename-as-written, but we're not 1923 // going to use this information to rebuild the module, so it doesn't make 1924 // a lot of difference. 1925 Module::Header H = {std::string(key.Filename), *FileMgr.getFile(Filename)}; 1926 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true); 1927 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader); 1928 } 1929 1930 // This HeaderFileInfo was externally loaded. 1931 HFI.External = true; 1932 HFI.IsValid = true; 1933 return HFI; 1934 } 1935 1936 void ASTReader::addPendingMacro(IdentifierInfo *II, ModuleFile *M, 1937 uint32_t MacroDirectivesOffset) { 1938 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"); 1939 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset)); 1940 } 1941 1942 void ASTReader::ReadDefinedMacros() { 1943 // Note that we are loading defined macros. 1944 Deserializing Macros(this); 1945 1946 for (ModuleFile &I : llvm::reverse(ModuleMgr)) { 1947 BitstreamCursor &MacroCursor = I.MacroCursor; 1948 1949 // If there was no preprocessor block, skip this file. 1950 if (MacroCursor.getBitcodeBytes().empty()) 1951 continue; 1952 1953 BitstreamCursor Cursor = MacroCursor; 1954 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) { 1955 Error(std::move(Err)); 1956 return; 1957 } 1958 1959 RecordData Record; 1960 while (true) { 1961 Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks(); 1962 if (!MaybeE) { 1963 Error(MaybeE.takeError()); 1964 return; 1965 } 1966 llvm::BitstreamEntry E = MaybeE.get(); 1967 1968 switch (E.Kind) { 1969 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1970 case llvm::BitstreamEntry::Error: 1971 Error("malformed block record in AST file"); 1972 return; 1973 case llvm::BitstreamEntry::EndBlock: 1974 goto NextCursor; 1975 1976 case llvm::BitstreamEntry::Record: { 1977 Record.clear(); 1978 Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record); 1979 if (!MaybeRecord) { 1980 Error(MaybeRecord.takeError()); 1981 return; 1982 } 1983 switch (MaybeRecord.get()) { 1984 default: // Default behavior: ignore. 1985 break; 1986 1987 case PP_MACRO_OBJECT_LIKE: 1988 case PP_MACRO_FUNCTION_LIKE: { 1989 IdentifierInfo *II = getLocalIdentifier(I, Record[0]); 1990 if (II->isOutOfDate()) 1991 updateOutOfDateIdentifier(*II); 1992 break; 1993 } 1994 1995 case PP_TOKEN: 1996 // Ignore tokens. 1997 break; 1998 } 1999 break; 2000 } 2001 } 2002 } 2003 NextCursor: ; 2004 } 2005 } 2006 2007 namespace { 2008 2009 /// Visitor class used to look up identifirs in an AST file. 2010 class IdentifierLookupVisitor { 2011 StringRef Name; 2012 unsigned NameHash; 2013 unsigned PriorGeneration; 2014 unsigned &NumIdentifierLookups; 2015 unsigned &NumIdentifierLookupHits; 2016 IdentifierInfo *Found = nullptr; 2017 2018 public: 2019 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration, 2020 unsigned &NumIdentifierLookups, 2021 unsigned &NumIdentifierLookupHits) 2022 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)), 2023 PriorGeneration(PriorGeneration), 2024 NumIdentifierLookups(NumIdentifierLookups), 2025 NumIdentifierLookupHits(NumIdentifierLookupHits) {} 2026 2027 bool operator()(ModuleFile &M) { 2028 // If we've already searched this module file, skip it now. 2029 if (M.Generation <= PriorGeneration) 2030 return true; 2031 2032 ASTIdentifierLookupTable *IdTable 2033 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable; 2034 if (!IdTable) 2035 return false; 2036 2037 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M, 2038 Found); 2039 ++NumIdentifierLookups; 2040 ASTIdentifierLookupTable::iterator Pos = 2041 IdTable->find_hashed(Name, NameHash, &Trait); 2042 if (Pos == IdTable->end()) 2043 return false; 2044 2045 // Dereferencing the iterator has the effect of building the 2046 // IdentifierInfo node and populating it with the various 2047 // declarations it needs. 2048 ++NumIdentifierLookupHits; 2049 Found = *Pos; 2050 return true; 2051 } 2052 2053 // Retrieve the identifier info found within the module 2054 // files. 2055 IdentifierInfo *getIdentifierInfo() const { return Found; } 2056 }; 2057 2058 } // namespace 2059 2060 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) { 2061 // Note that we are loading an identifier. 2062 Deserializing AnIdentifier(this); 2063 2064 unsigned PriorGeneration = 0; 2065 if (getContext().getLangOpts().Modules) 2066 PriorGeneration = IdentifierGeneration[&II]; 2067 2068 // If there is a global index, look there first to determine which modules 2069 // provably do not have any results for this identifier. 2070 GlobalModuleIndex::HitSet Hits; 2071 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 2072 if (!loadGlobalIndex()) { 2073 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) { 2074 HitsPtr = &Hits; 2075 } 2076 } 2077 2078 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration, 2079 NumIdentifierLookups, 2080 NumIdentifierLookupHits); 2081 ModuleMgr.visit(Visitor, HitsPtr); 2082 markIdentifierUpToDate(&II); 2083 } 2084 2085 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) { 2086 if (!II) 2087 return; 2088 2089 II->setOutOfDate(false); 2090 2091 // Update the generation for this identifier. 2092 if (getContext().getLangOpts().Modules) 2093 IdentifierGeneration[II] = getGeneration(); 2094 } 2095 2096 void ASTReader::resolvePendingMacro(IdentifierInfo *II, 2097 const PendingMacroInfo &PMInfo) { 2098 ModuleFile &M = *PMInfo.M; 2099 2100 BitstreamCursor &Cursor = M.MacroCursor; 2101 SavedStreamPosition SavedPosition(Cursor); 2102 if (llvm::Error Err = 2103 Cursor.JumpToBit(M.MacroOffsetsBase + PMInfo.MacroDirectivesOffset)) { 2104 Error(std::move(Err)); 2105 return; 2106 } 2107 2108 struct ModuleMacroRecord { 2109 SubmoduleID SubModID; 2110 MacroInfo *MI; 2111 SmallVector<SubmoduleID, 8> Overrides; 2112 }; 2113 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros; 2114 2115 // We expect to see a sequence of PP_MODULE_MACRO records listing exported 2116 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete 2117 // macro histroy. 2118 RecordData Record; 2119 while (true) { 2120 Expected<llvm::BitstreamEntry> MaybeEntry = 2121 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 2122 if (!MaybeEntry) { 2123 Error(MaybeEntry.takeError()); 2124 return; 2125 } 2126 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2127 2128 if (Entry.Kind != llvm::BitstreamEntry::Record) { 2129 Error("malformed block record in AST file"); 2130 return; 2131 } 2132 2133 Record.clear(); 2134 Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record); 2135 if (!MaybePP) { 2136 Error(MaybePP.takeError()); 2137 return; 2138 } 2139 switch ((PreprocessorRecordTypes)MaybePP.get()) { 2140 case PP_MACRO_DIRECTIVE_HISTORY: 2141 break; 2142 2143 case PP_MODULE_MACRO: { 2144 ModuleMacros.push_back(ModuleMacroRecord()); 2145 auto &Info = ModuleMacros.back(); 2146 Info.SubModID = getGlobalSubmoduleID(M, Record[0]); 2147 Info.MI = getMacro(getGlobalMacroID(M, Record[1])); 2148 for (int I = 2, N = Record.size(); I != N; ++I) 2149 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I])); 2150 continue; 2151 } 2152 2153 default: 2154 Error("malformed block record in AST file"); 2155 return; 2156 } 2157 2158 // We found the macro directive history; that's the last record 2159 // for this macro. 2160 break; 2161 } 2162 2163 // Module macros are listed in reverse dependency order. 2164 { 2165 std::reverse(ModuleMacros.begin(), ModuleMacros.end()); 2166 llvm::SmallVector<ModuleMacro*, 8> Overrides; 2167 for (auto &MMR : ModuleMacros) { 2168 Overrides.clear(); 2169 for (unsigned ModID : MMR.Overrides) { 2170 Module *Mod = getSubmodule(ModID); 2171 auto *Macro = PP.getModuleMacro(Mod, II); 2172 assert(Macro && "missing definition for overridden macro"); 2173 Overrides.push_back(Macro); 2174 } 2175 2176 bool Inserted = false; 2177 Module *Owner = getSubmodule(MMR.SubModID); 2178 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted); 2179 } 2180 } 2181 2182 // Don't read the directive history for a module; we don't have anywhere 2183 // to put it. 2184 if (M.isModule()) 2185 return; 2186 2187 // Deserialize the macro directives history in reverse source-order. 2188 MacroDirective *Latest = nullptr, *Earliest = nullptr; 2189 unsigned Idx = 0, N = Record.size(); 2190 while (Idx < N) { 2191 MacroDirective *MD = nullptr; 2192 SourceLocation Loc = ReadSourceLocation(M, Record, Idx); 2193 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++]; 2194 switch (K) { 2195 case MacroDirective::MD_Define: { 2196 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++])); 2197 MD = PP.AllocateDefMacroDirective(MI, Loc); 2198 break; 2199 } 2200 case MacroDirective::MD_Undefine: 2201 MD = PP.AllocateUndefMacroDirective(Loc); 2202 break; 2203 case MacroDirective::MD_Visibility: 2204 bool isPublic = Record[Idx++]; 2205 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic); 2206 break; 2207 } 2208 2209 if (!Latest) 2210 Latest = MD; 2211 if (Earliest) 2212 Earliest->setPrevious(MD); 2213 Earliest = MD; 2214 } 2215 2216 if (Latest) 2217 PP.setLoadedMacroDirective(II, Earliest, Latest); 2218 } 2219 2220 ASTReader::InputFileInfo 2221 ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) { 2222 // Go find this input file. 2223 BitstreamCursor &Cursor = F.InputFilesCursor; 2224 SavedStreamPosition SavedPosition(Cursor); 2225 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2226 // FIXME this drops errors on the floor. 2227 consumeError(std::move(Err)); 2228 } 2229 2230 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 2231 if (!MaybeCode) { 2232 // FIXME this drops errors on the floor. 2233 consumeError(MaybeCode.takeError()); 2234 } 2235 unsigned Code = MaybeCode.get(); 2236 RecordData Record; 2237 StringRef Blob; 2238 2239 if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob)) 2240 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE && 2241 "invalid record type for input file"); 2242 else { 2243 // FIXME this drops errors on the floor. 2244 consumeError(Maybe.takeError()); 2245 } 2246 2247 assert(Record[0] == ID && "Bogus stored ID or offset"); 2248 InputFileInfo R; 2249 R.StoredSize = static_cast<off_t>(Record[1]); 2250 R.StoredTime = static_cast<time_t>(Record[2]); 2251 R.Overridden = static_cast<bool>(Record[3]); 2252 R.Transient = static_cast<bool>(Record[4]); 2253 R.TopLevelModuleMap = static_cast<bool>(Record[5]); 2254 R.Filename = std::string(Blob); 2255 ResolveImportedPath(F, R.Filename); 2256 2257 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 2258 if (!MaybeEntry) // FIXME this drops errors on the floor. 2259 consumeError(MaybeEntry.takeError()); 2260 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2261 assert(Entry.Kind == llvm::BitstreamEntry::Record && 2262 "expected record type for input file hash"); 2263 2264 Record.clear(); 2265 if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record)) 2266 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH && 2267 "invalid record type for input file hash"); 2268 else { 2269 // FIXME this drops errors on the floor. 2270 consumeError(Maybe.takeError()); 2271 } 2272 R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) | 2273 static_cast<uint64_t>(Record[0]); 2274 return R; 2275 } 2276 2277 static unsigned moduleKindForDiagnostic(ModuleKind Kind); 2278 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { 2279 // If this ID is bogus, just return an empty input file. 2280 if (ID == 0 || ID > F.InputFilesLoaded.size()) 2281 return InputFile(); 2282 2283 // If we've already loaded this input file, return it. 2284 if (F.InputFilesLoaded[ID-1].getFile()) 2285 return F.InputFilesLoaded[ID-1]; 2286 2287 if (F.InputFilesLoaded[ID-1].isNotFound()) 2288 return InputFile(); 2289 2290 // Go find this input file. 2291 BitstreamCursor &Cursor = F.InputFilesCursor; 2292 SavedStreamPosition SavedPosition(Cursor); 2293 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2294 // FIXME this drops errors on the floor. 2295 consumeError(std::move(Err)); 2296 } 2297 2298 InputFileInfo FI = readInputFileInfo(F, ID); 2299 off_t StoredSize = FI.StoredSize; 2300 time_t StoredTime = FI.StoredTime; 2301 bool Overridden = FI.Overridden; 2302 bool Transient = FI.Transient; 2303 StringRef Filename = FI.Filename; 2304 uint64_t StoredContentHash = FI.ContentHash; 2305 2306 const FileEntry *File = nullptr; 2307 if (auto FE = FileMgr.getFile(Filename, /*OpenFile=*/false)) 2308 File = *FE; 2309 2310 // If we didn't find the file, resolve it relative to the 2311 // original directory from which this AST file was created. 2312 if (File == nullptr && !F.OriginalDir.empty() && !F.BaseDirectory.empty() && 2313 F.OriginalDir != F.BaseDirectory) { 2314 std::string Resolved = resolveFileRelativeToOriginalDir( 2315 std::string(Filename), F.OriginalDir, F.BaseDirectory); 2316 if (!Resolved.empty()) 2317 if (auto FE = FileMgr.getFile(Resolved)) 2318 File = *FE; 2319 } 2320 2321 // For an overridden file, create a virtual file with the stored 2322 // size/timestamp. 2323 if ((Overridden || Transient) && File == nullptr) 2324 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime); 2325 2326 if (File == nullptr) { 2327 if (Complain) { 2328 std::string ErrorStr = "could not find file '"; 2329 ErrorStr += Filename; 2330 ErrorStr += "' referenced by AST file '"; 2331 ErrorStr += F.FileName; 2332 ErrorStr += "'"; 2333 Error(ErrorStr); 2334 } 2335 // Record that we didn't find the file. 2336 F.InputFilesLoaded[ID-1] = InputFile::getNotFound(); 2337 return InputFile(); 2338 } 2339 2340 // Check if there was a request to override the contents of the file 2341 // that was part of the precompiled header. Overriding such a file 2342 // can lead to problems when lexing using the source locations from the 2343 // PCH. 2344 SourceManager &SM = getSourceManager(); 2345 // FIXME: Reject if the overrides are different. 2346 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) { 2347 if (Complain) 2348 Error(diag::err_fe_pch_file_overridden, Filename); 2349 2350 // After emitting the diagnostic, bypass the overriding file to recover 2351 // (this creates a separate FileEntry). 2352 File = SM.bypassFileContentsOverride(*File); 2353 if (!File) { 2354 F.InputFilesLoaded[ID - 1] = InputFile::getNotFound(); 2355 return InputFile(); 2356 } 2357 } 2358 2359 enum ModificationType { 2360 Size, 2361 ModTime, 2362 Content, 2363 None, 2364 }; 2365 auto HasInputFileChanged = [&]() { 2366 if (StoredSize != File->getSize()) 2367 return ModificationType::Size; 2368 if (!DisableValidation && StoredTime && 2369 StoredTime != File->getModificationTime()) { 2370 // In case the modification time changes but not the content, 2371 // accept the cached file as legit. 2372 if (ValidateASTInputFilesContent && 2373 StoredContentHash != static_cast<uint64_t>(llvm::hash_code(-1))) { 2374 auto MemBuffOrError = FileMgr.getBufferForFile(File); 2375 if (!MemBuffOrError) { 2376 if (!Complain) 2377 return ModificationType::ModTime; 2378 std::string ErrorStr = "could not get buffer for file '"; 2379 ErrorStr += File->getName(); 2380 ErrorStr += "'"; 2381 Error(ErrorStr); 2382 return ModificationType::ModTime; 2383 } 2384 2385 auto ContentHash = hash_value(MemBuffOrError.get()->getBuffer()); 2386 if (StoredContentHash == static_cast<uint64_t>(ContentHash)) 2387 return ModificationType::None; 2388 return ModificationType::Content; 2389 } 2390 return ModificationType::ModTime; 2391 } 2392 return ModificationType::None; 2393 }; 2394 2395 bool IsOutOfDate = false; 2396 auto FileChange = HasInputFileChanged(); 2397 // For an overridden file, there is nothing to validate. 2398 if (!Overridden && FileChange != ModificationType::None) { 2399 if (Complain) { 2400 // Build a list of the PCH imports that got us here (in reverse). 2401 SmallVector<ModuleFile *, 4> ImportStack(1, &F); 2402 while (!ImportStack.back()->ImportedBy.empty()) 2403 ImportStack.push_back(ImportStack.back()->ImportedBy[0]); 2404 2405 // The top-level PCH is stale. 2406 StringRef TopLevelPCHName(ImportStack.back()->FileName); 2407 unsigned DiagnosticKind = 2408 moduleKindForDiagnostic(ImportStack.back()->Kind); 2409 if (DiagnosticKind == 0) 2410 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName, 2411 (unsigned)FileChange); 2412 else if (DiagnosticKind == 1) 2413 Error(diag::err_fe_module_file_modified, Filename, TopLevelPCHName, 2414 (unsigned)FileChange); 2415 else 2416 Error(diag::err_fe_ast_file_modified, Filename, TopLevelPCHName, 2417 (unsigned)FileChange); 2418 2419 // Print the import stack. 2420 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) { 2421 Diag(diag::note_pch_required_by) 2422 << Filename << ImportStack[0]->FileName; 2423 for (unsigned I = 1; I < ImportStack.size(); ++I) 2424 Diag(diag::note_pch_required_by) 2425 << ImportStack[I-1]->FileName << ImportStack[I]->FileName; 2426 } 2427 2428 if (!Diags.isDiagnosticInFlight()) 2429 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName; 2430 } 2431 2432 IsOutOfDate = true; 2433 } 2434 // FIXME: If the file is overridden and we've already opened it, 2435 // issue an error (or split it into a separate FileEntry). 2436 2437 InputFile IF = InputFile(File, Overridden || Transient, IsOutOfDate); 2438 2439 // Note that we've loaded this input file. 2440 F.InputFilesLoaded[ID-1] = IF; 2441 return IF; 2442 } 2443 2444 /// If we are loading a relocatable PCH or module file, and the filename 2445 /// is not an absolute path, add the system or module root to the beginning of 2446 /// the file name. 2447 void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) { 2448 // Resolve relative to the base directory, if we have one. 2449 if (!M.BaseDirectory.empty()) 2450 return ResolveImportedPath(Filename, M.BaseDirectory); 2451 } 2452 2453 void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) { 2454 if (Filename.empty() || llvm::sys::path::is_absolute(Filename)) 2455 return; 2456 2457 SmallString<128> Buffer; 2458 llvm::sys::path::append(Buffer, Prefix, Filename); 2459 Filename.assign(Buffer.begin(), Buffer.end()); 2460 } 2461 2462 static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) { 2463 switch (ARR) { 2464 case ASTReader::Failure: return true; 2465 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing); 2466 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate); 2467 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch); 2468 case ASTReader::ConfigurationMismatch: 2469 return !(Caps & ASTReader::ARR_ConfigurationMismatch); 2470 case ASTReader::HadErrors: return true; 2471 case ASTReader::Success: return false; 2472 } 2473 2474 llvm_unreachable("unknown ASTReadResult"); 2475 } 2476 2477 ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( 2478 BitstreamCursor &Stream, unsigned ClientLoadCapabilities, 2479 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener, 2480 std::string &SuggestedPredefines) { 2481 if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) { 2482 // FIXME this drops errors on the floor. 2483 consumeError(std::move(Err)); 2484 return Failure; 2485 } 2486 2487 // Read all of the records in the options block. 2488 RecordData Record; 2489 ASTReadResult Result = Success; 2490 while (true) { 2491 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2492 if (!MaybeEntry) { 2493 // FIXME this drops errors on the floor. 2494 consumeError(MaybeEntry.takeError()); 2495 return Failure; 2496 } 2497 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2498 2499 switch (Entry.Kind) { 2500 case llvm::BitstreamEntry::Error: 2501 case llvm::BitstreamEntry::SubBlock: 2502 return Failure; 2503 2504 case llvm::BitstreamEntry::EndBlock: 2505 return Result; 2506 2507 case llvm::BitstreamEntry::Record: 2508 // The interesting case. 2509 break; 2510 } 2511 2512 // Read and process a record. 2513 Record.clear(); 2514 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 2515 if (!MaybeRecordType) { 2516 // FIXME this drops errors on the floor. 2517 consumeError(MaybeRecordType.takeError()); 2518 return Failure; 2519 } 2520 switch ((OptionsRecordTypes)MaybeRecordType.get()) { 2521 case LANGUAGE_OPTIONS: { 2522 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2523 if (ParseLanguageOptions(Record, Complain, Listener, 2524 AllowCompatibleConfigurationMismatch)) 2525 Result = ConfigurationMismatch; 2526 break; 2527 } 2528 2529 case TARGET_OPTIONS: { 2530 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2531 if (ParseTargetOptions(Record, Complain, Listener, 2532 AllowCompatibleConfigurationMismatch)) 2533 Result = ConfigurationMismatch; 2534 break; 2535 } 2536 2537 case FILE_SYSTEM_OPTIONS: { 2538 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2539 if (!AllowCompatibleConfigurationMismatch && 2540 ParseFileSystemOptions(Record, Complain, Listener)) 2541 Result = ConfigurationMismatch; 2542 break; 2543 } 2544 2545 case HEADER_SEARCH_OPTIONS: { 2546 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2547 if (!AllowCompatibleConfigurationMismatch && 2548 ParseHeaderSearchOptions(Record, Complain, Listener)) 2549 Result = ConfigurationMismatch; 2550 break; 2551 } 2552 2553 case PREPROCESSOR_OPTIONS: 2554 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2555 if (!AllowCompatibleConfigurationMismatch && 2556 ParsePreprocessorOptions(Record, Complain, Listener, 2557 SuggestedPredefines)) 2558 Result = ConfigurationMismatch; 2559 break; 2560 } 2561 } 2562 } 2563 2564 ASTReader::ASTReadResult 2565 ASTReader::ReadControlBlock(ModuleFile &F, 2566 SmallVectorImpl<ImportedModule> &Loaded, 2567 const ModuleFile *ImportedBy, 2568 unsigned ClientLoadCapabilities) { 2569 BitstreamCursor &Stream = F.Stream; 2570 2571 if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) { 2572 Error(std::move(Err)); 2573 return Failure; 2574 } 2575 2576 // Lambda to read the unhashed control block the first time it's called. 2577 // 2578 // For PCM files, the unhashed control block cannot be read until after the 2579 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still 2580 // need to look ahead before reading the IMPORTS record. For consistency, 2581 // this block is always read somehow (see BitstreamEntry::EndBlock). 2582 bool HasReadUnhashedControlBlock = false; 2583 auto readUnhashedControlBlockOnce = [&]() { 2584 if (!HasReadUnhashedControlBlock) { 2585 HasReadUnhashedControlBlock = true; 2586 if (ASTReadResult Result = 2587 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities)) 2588 return Result; 2589 } 2590 return Success; 2591 }; 2592 2593 // Read all of the records and blocks in the control block. 2594 RecordData Record; 2595 unsigned NumInputs = 0; 2596 unsigned NumUserInputs = 0; 2597 StringRef BaseDirectoryAsWritten; 2598 while (true) { 2599 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2600 if (!MaybeEntry) { 2601 Error(MaybeEntry.takeError()); 2602 return Failure; 2603 } 2604 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2605 2606 switch (Entry.Kind) { 2607 case llvm::BitstreamEntry::Error: 2608 Error("malformed block record in AST file"); 2609 return Failure; 2610 case llvm::BitstreamEntry::EndBlock: { 2611 // Validate the module before returning. This call catches an AST with 2612 // no module name and no imports. 2613 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2614 return Result; 2615 2616 // Validate input files. 2617 const HeaderSearchOptions &HSOpts = 2618 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 2619 2620 // All user input files reside at the index range [0, NumUserInputs), and 2621 // system input files reside at [NumUserInputs, NumInputs). For explicitly 2622 // loaded module files, ignore missing inputs. 2623 if (!DisableValidation && F.Kind != MK_ExplicitModule && 2624 F.Kind != MK_PrebuiltModule) { 2625 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 2626 2627 // If we are reading a module, we will create a verification timestamp, 2628 // so we verify all input files. Otherwise, verify only user input 2629 // files. 2630 2631 unsigned N = NumUserInputs; 2632 if (ValidateSystemInputs || 2633 (HSOpts.ModulesValidateOncePerBuildSession && 2634 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp && 2635 F.Kind == MK_ImplicitModule)) 2636 N = NumInputs; 2637 2638 for (unsigned I = 0; I < N; ++I) { 2639 InputFile IF = getInputFile(F, I+1, Complain); 2640 if (!IF.getFile() || IF.isOutOfDate()) 2641 return OutOfDate; 2642 } 2643 } 2644 2645 if (Listener) 2646 Listener->visitModuleFile(F.FileName, F.Kind); 2647 2648 if (Listener && Listener->needsInputFileVisitation()) { 2649 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs 2650 : NumUserInputs; 2651 for (unsigned I = 0; I < N; ++I) { 2652 bool IsSystem = I >= NumUserInputs; 2653 InputFileInfo FI = readInputFileInfo(F, I+1); 2654 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden, 2655 F.Kind == MK_ExplicitModule || 2656 F.Kind == MK_PrebuiltModule); 2657 } 2658 } 2659 2660 return Success; 2661 } 2662 2663 case llvm::BitstreamEntry::SubBlock: 2664 switch (Entry.ID) { 2665 case INPUT_FILES_BLOCK_ID: 2666 F.InputFilesCursor = Stream; 2667 if (llvm::Error Err = Stream.SkipBlock()) { 2668 Error(std::move(Err)); 2669 return Failure; 2670 } 2671 if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) { 2672 Error("malformed block record in AST file"); 2673 return Failure; 2674 } 2675 continue; 2676 2677 case OPTIONS_BLOCK_ID: 2678 // If we're reading the first module for this group, check its options 2679 // are compatible with ours. For modules it imports, no further checking 2680 // is required, because we checked them when we built it. 2681 if (Listener && !ImportedBy) { 2682 // Should we allow the configuration of the module file to differ from 2683 // the configuration of the current translation unit in a compatible 2684 // way? 2685 // 2686 // FIXME: Allow this for files explicitly specified with -include-pch. 2687 bool AllowCompatibleConfigurationMismatch = 2688 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 2689 2690 ASTReadResult Result = 2691 ReadOptionsBlock(Stream, ClientLoadCapabilities, 2692 AllowCompatibleConfigurationMismatch, *Listener, 2693 SuggestedPredefines); 2694 if (Result == Failure) { 2695 Error("malformed block record in AST file"); 2696 return Result; 2697 } 2698 2699 if (DisableValidation || 2700 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 2701 Result = Success; 2702 2703 // If we can't load the module, exit early since we likely 2704 // will rebuild the module anyway. The stream may be in the 2705 // middle of a block. 2706 if (Result != Success) 2707 return Result; 2708 } else if (llvm::Error Err = Stream.SkipBlock()) { 2709 Error(std::move(Err)); 2710 return Failure; 2711 } 2712 continue; 2713 2714 default: 2715 if (llvm::Error Err = Stream.SkipBlock()) { 2716 Error(std::move(Err)); 2717 return Failure; 2718 } 2719 continue; 2720 } 2721 2722 case llvm::BitstreamEntry::Record: 2723 // The interesting case. 2724 break; 2725 } 2726 2727 // Read and process a record. 2728 Record.clear(); 2729 StringRef Blob; 2730 Expected<unsigned> MaybeRecordType = 2731 Stream.readRecord(Entry.ID, Record, &Blob); 2732 if (!MaybeRecordType) { 2733 Error(MaybeRecordType.takeError()); 2734 return Failure; 2735 } 2736 switch ((ControlRecordTypes)MaybeRecordType.get()) { 2737 case METADATA: { 2738 if (Record[0] != VERSION_MAJOR && !DisableValidation) { 2739 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2740 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old 2741 : diag::err_pch_version_too_new); 2742 return VersionMismatch; 2743 } 2744 2745 bool hasErrors = Record[7]; 2746 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) { 2747 Diag(diag::err_pch_with_compiler_errors); 2748 return HadErrors; 2749 } 2750 if (hasErrors) { 2751 Diags.ErrorOccurred = true; 2752 Diags.UncompilableErrorOccurred = true; 2753 Diags.UnrecoverableErrorOccurred = true; 2754 } 2755 2756 F.RelocatablePCH = Record[4]; 2757 // Relative paths in a relocatable PCH are relative to our sysroot. 2758 if (F.RelocatablePCH) 2759 F.BaseDirectory = isysroot.empty() ? "/" : isysroot; 2760 2761 F.HasTimestamps = Record[5]; 2762 2763 F.PCHHasObjectFile = Record[6]; 2764 2765 const std::string &CurBranch = getClangFullRepositoryVersion(); 2766 StringRef ASTBranch = Blob; 2767 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) { 2768 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2769 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch; 2770 return VersionMismatch; 2771 } 2772 break; 2773 } 2774 2775 case IMPORTS: { 2776 // Validate the AST before processing any imports (otherwise, untangling 2777 // them can be error-prone and expensive). A module will have a name and 2778 // will already have been validated, but this catches the PCH case. 2779 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2780 return Result; 2781 2782 // Load each of the imported PCH files. 2783 unsigned Idx = 0, N = Record.size(); 2784 while (Idx < N) { 2785 // Read information about the AST file. 2786 ModuleKind ImportedKind = (ModuleKind)Record[Idx++]; 2787 // The import location will be the local one for now; we will adjust 2788 // all import locations of module imports after the global source 2789 // location info are setup, in ReadAST. 2790 SourceLocation ImportLoc = 2791 ReadUntranslatedSourceLocation(Record[Idx++]); 2792 off_t StoredSize = (off_t)Record[Idx++]; 2793 time_t StoredModTime = (time_t)Record[Idx++]; 2794 ASTFileSignature StoredSignature = { 2795 {{(uint32_t)Record[Idx++], (uint32_t)Record[Idx++], 2796 (uint32_t)Record[Idx++], (uint32_t)Record[Idx++], 2797 (uint32_t)Record[Idx++]}}}; 2798 2799 std::string ImportedName = ReadString(Record, Idx); 2800 std::string ImportedFile; 2801 2802 // For prebuilt and explicit modules first consult the file map for 2803 // an override. Note that here we don't search prebuilt module 2804 // directories, only the explicit name to file mappings. Also, we will 2805 // still verify the size/signature making sure it is essentially the 2806 // same file but perhaps in a different location. 2807 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule) 2808 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName( 2809 ImportedName, /*FileMapOnly*/ true); 2810 2811 if (ImportedFile.empty()) 2812 // Use BaseDirectoryAsWritten to ensure we use the same path in the 2813 // ModuleCache as when writing. 2814 ImportedFile = ReadPath(BaseDirectoryAsWritten, Record, Idx); 2815 else 2816 SkipPath(Record, Idx); 2817 2818 // If our client can't cope with us being out of date, we can't cope with 2819 // our dependency being missing. 2820 unsigned Capabilities = ClientLoadCapabilities; 2821 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2822 Capabilities &= ~ARR_Missing; 2823 2824 // Load the AST file. 2825 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, 2826 Loaded, StoredSize, StoredModTime, 2827 StoredSignature, Capabilities); 2828 2829 // If we diagnosed a problem, produce a backtrace. 2830 if (isDiagnosedResult(Result, Capabilities)) 2831 Diag(diag::note_module_file_imported_by) 2832 << F.FileName << !F.ModuleName.empty() << F.ModuleName; 2833 2834 switch (Result) { 2835 case Failure: return Failure; 2836 // If we have to ignore the dependency, we'll have to ignore this too. 2837 case Missing: 2838 case OutOfDate: return OutOfDate; 2839 case VersionMismatch: return VersionMismatch; 2840 case ConfigurationMismatch: return ConfigurationMismatch; 2841 case HadErrors: return HadErrors; 2842 case Success: break; 2843 } 2844 } 2845 break; 2846 } 2847 2848 case ORIGINAL_FILE: 2849 F.OriginalSourceFileID = FileID::get(Record[0]); 2850 F.ActualOriginalSourceFileName = std::string(Blob); 2851 F.OriginalSourceFileName = F.ActualOriginalSourceFileName; 2852 ResolveImportedPath(F, F.OriginalSourceFileName); 2853 break; 2854 2855 case ORIGINAL_FILE_ID: 2856 F.OriginalSourceFileID = FileID::get(Record[0]); 2857 break; 2858 2859 case ORIGINAL_PCH_DIR: 2860 F.OriginalDir = std::string(Blob); 2861 break; 2862 2863 case MODULE_NAME: 2864 F.ModuleName = std::string(Blob); 2865 Diag(diag::remark_module_import) 2866 << F.ModuleName << F.FileName << (ImportedBy ? true : false) 2867 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 2868 if (Listener) 2869 Listener->ReadModuleName(F.ModuleName); 2870 2871 // Validate the AST as soon as we have a name so we can exit early on 2872 // failure. 2873 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2874 return Result; 2875 2876 break; 2877 2878 case MODULE_DIRECTORY: { 2879 // Save the BaseDirectory as written in the PCM for computing the module 2880 // filename for the ModuleCache. 2881 BaseDirectoryAsWritten = Blob; 2882 assert(!F.ModuleName.empty() && 2883 "MODULE_DIRECTORY found before MODULE_NAME"); 2884 // If we've already loaded a module map file covering this module, we may 2885 // have a better path for it (relative to the current build). 2886 Module *M = PP.getHeaderSearchInfo().lookupModule( 2887 F.ModuleName, /*AllowSearch*/ true, 2888 /*AllowExtraModuleMapSearch*/ true); 2889 if (M && M->Directory) { 2890 // If we're implicitly loading a module, the base directory can't 2891 // change between the build and use. 2892 // Don't emit module relocation error if we have -fno-validate-pch 2893 if (!PP.getPreprocessorOpts().DisablePCHValidation && 2894 F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) { 2895 auto BuildDir = PP.getFileManager().getDirectory(Blob); 2896 if (!BuildDir || *BuildDir != M->Directory) { 2897 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2898 Diag(diag::err_imported_module_relocated) 2899 << F.ModuleName << Blob << M->Directory->getName(); 2900 return OutOfDate; 2901 } 2902 } 2903 F.BaseDirectory = std::string(M->Directory->getName()); 2904 } else { 2905 F.BaseDirectory = std::string(Blob); 2906 } 2907 break; 2908 } 2909 2910 case MODULE_MAP_FILE: 2911 if (ASTReadResult Result = 2912 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities)) 2913 return Result; 2914 break; 2915 2916 case INPUT_FILE_OFFSETS: 2917 NumInputs = Record[0]; 2918 NumUserInputs = Record[1]; 2919 F.InputFileOffsets = 2920 (const llvm::support::unaligned_uint64_t *)Blob.data(); 2921 F.InputFilesLoaded.resize(NumInputs); 2922 F.NumUserInputFiles = NumUserInputs; 2923 break; 2924 } 2925 } 2926 } 2927 2928 ASTReader::ASTReadResult 2929 ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 2930 BitstreamCursor &Stream = F.Stream; 2931 2932 if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID)) { 2933 Error(std::move(Err)); 2934 return Failure; 2935 } 2936 2937 // Read all of the records and blocks for the AST file. 2938 RecordData Record; 2939 while (true) { 2940 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2941 if (!MaybeEntry) { 2942 Error(MaybeEntry.takeError()); 2943 return Failure; 2944 } 2945 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2946 2947 switch (Entry.Kind) { 2948 case llvm::BitstreamEntry::Error: 2949 Error("error at end of module block in AST file"); 2950 return Failure; 2951 case llvm::BitstreamEntry::EndBlock: 2952 // Outside of C++, we do not store a lookup map for the translation unit. 2953 // Instead, mark it as needing a lookup map to be built if this module 2954 // contains any declarations lexically within it (which it always does!). 2955 // This usually has no cost, since we very rarely need the lookup map for 2956 // the translation unit outside C++. 2957 if (ASTContext *Ctx = ContextObj) { 2958 DeclContext *DC = Ctx->getTranslationUnitDecl(); 2959 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus) 2960 DC->setMustBuildLookupTable(); 2961 } 2962 2963 return Success; 2964 case llvm::BitstreamEntry::SubBlock: 2965 switch (Entry.ID) { 2966 case DECLTYPES_BLOCK_ID: 2967 // We lazily load the decls block, but we want to set up the 2968 // DeclsCursor cursor to point into it. Clone our current bitcode 2969 // cursor to it, enter the block and read the abbrevs in that block. 2970 // With the main cursor, we just skip over it. 2971 F.DeclsCursor = Stream; 2972 if (llvm::Error Err = Stream.SkipBlock()) { 2973 Error(std::move(Err)); 2974 return Failure; 2975 } 2976 if (ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) { 2977 Error("malformed block record in AST file"); 2978 return Failure; 2979 } 2980 break; 2981 2982 case PREPROCESSOR_BLOCK_ID: 2983 F.MacroCursor = Stream; 2984 if (!PP.getExternalSource()) 2985 PP.setExternalSource(this); 2986 2987 if (llvm::Error Err = Stream.SkipBlock()) { 2988 Error(std::move(Err)); 2989 return Failure; 2990 } 2991 if (ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) { 2992 Error("malformed block record in AST file"); 2993 return Failure; 2994 } 2995 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo(); 2996 break; 2997 2998 case PREPROCESSOR_DETAIL_BLOCK_ID: 2999 F.PreprocessorDetailCursor = Stream; 3000 3001 if (llvm::Error Err = Stream.SkipBlock()) { 3002 Error(std::move(Err)); 3003 return Failure; 3004 } 3005 if (ReadBlockAbbrevs(F.PreprocessorDetailCursor, 3006 PREPROCESSOR_DETAIL_BLOCK_ID)) { 3007 Error("malformed preprocessor detail record in AST file"); 3008 return Failure; 3009 } 3010 F.PreprocessorDetailStartOffset 3011 = F.PreprocessorDetailCursor.GetCurrentBitNo(); 3012 3013 if (!PP.getPreprocessingRecord()) 3014 PP.createPreprocessingRecord(); 3015 if (!PP.getPreprocessingRecord()->getExternalSource()) 3016 PP.getPreprocessingRecord()->SetExternalSource(*this); 3017 break; 3018 3019 case SOURCE_MANAGER_BLOCK_ID: 3020 if (ReadSourceManagerBlock(F)) 3021 return Failure; 3022 break; 3023 3024 case SUBMODULE_BLOCK_ID: 3025 if (ASTReadResult Result = 3026 ReadSubmoduleBlock(F, ClientLoadCapabilities)) 3027 return Result; 3028 break; 3029 3030 case COMMENTS_BLOCK_ID: { 3031 BitstreamCursor C = Stream; 3032 3033 if (llvm::Error Err = Stream.SkipBlock()) { 3034 Error(std::move(Err)); 3035 return Failure; 3036 } 3037 if (ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) { 3038 Error("malformed comments block in AST file"); 3039 return Failure; 3040 } 3041 CommentsCursors.push_back(std::make_pair(C, &F)); 3042 break; 3043 } 3044 3045 default: 3046 if (llvm::Error Err = Stream.SkipBlock()) { 3047 Error(std::move(Err)); 3048 return Failure; 3049 } 3050 break; 3051 } 3052 continue; 3053 3054 case llvm::BitstreamEntry::Record: 3055 // The interesting case. 3056 break; 3057 } 3058 3059 // Read and process a record. 3060 Record.clear(); 3061 StringRef Blob; 3062 Expected<unsigned> MaybeRecordType = 3063 Stream.readRecord(Entry.ID, Record, &Blob); 3064 if (!MaybeRecordType) { 3065 Error(MaybeRecordType.takeError()); 3066 return Failure; 3067 } 3068 ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get(); 3069 3070 // If we're not loading an AST context, we don't care about most records. 3071 if (!ContextObj) { 3072 switch (RecordType) { 3073 case IDENTIFIER_TABLE: 3074 case IDENTIFIER_OFFSET: 3075 case INTERESTING_IDENTIFIERS: 3076 case STATISTICS: 3077 case PP_CONDITIONAL_STACK: 3078 case PP_COUNTER_VALUE: 3079 case SOURCE_LOCATION_OFFSETS: 3080 case MODULE_OFFSET_MAP: 3081 case SOURCE_MANAGER_LINE_TABLE: 3082 case SOURCE_LOCATION_PRELOADS: 3083 case PPD_ENTITIES_OFFSETS: 3084 case HEADER_SEARCH_TABLE: 3085 case IMPORTED_MODULES: 3086 case MACRO_OFFSET: 3087 break; 3088 default: 3089 continue; 3090 } 3091 } 3092 3093 switch (RecordType) { 3094 default: // Default behavior: ignore. 3095 break; 3096 3097 case TYPE_OFFSET: { 3098 if (F.LocalNumTypes != 0) { 3099 Error("duplicate TYPE_OFFSET record in AST file"); 3100 return Failure; 3101 } 3102 F.TypeOffsets = reinterpret_cast<const uint64_t *>(Blob.data()); 3103 F.LocalNumTypes = Record[0]; 3104 unsigned LocalBaseTypeIndex = Record[1]; 3105 F.BaseTypeIndex = getTotalNumTypes(); 3106 3107 if (F.LocalNumTypes > 0) { 3108 // Introduce the global -> local mapping for types within this module. 3109 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F)); 3110 3111 // Introduce the local -> global mapping for types within this module. 3112 F.TypeRemap.insertOrReplace( 3113 std::make_pair(LocalBaseTypeIndex, 3114 F.BaseTypeIndex - LocalBaseTypeIndex)); 3115 3116 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes); 3117 } 3118 break; 3119 } 3120 3121 case DECL_OFFSET: { 3122 if (F.LocalNumDecls != 0) { 3123 Error("duplicate DECL_OFFSET record in AST file"); 3124 return Failure; 3125 } 3126 F.DeclOffsets = (const DeclOffset *)Blob.data(); 3127 F.LocalNumDecls = Record[0]; 3128 unsigned LocalBaseDeclID = Record[1]; 3129 F.BaseDeclID = getTotalNumDecls(); 3130 3131 if (F.LocalNumDecls > 0) { 3132 // Introduce the global -> local mapping for declarations within this 3133 // module. 3134 GlobalDeclMap.insert( 3135 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F)); 3136 3137 // Introduce the local -> global mapping for declarations within this 3138 // module. 3139 F.DeclRemap.insertOrReplace( 3140 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID)); 3141 3142 // Introduce the global -> local mapping for declarations within this 3143 // module. 3144 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID; 3145 3146 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls); 3147 } 3148 break; 3149 } 3150 3151 case TU_UPDATE_LEXICAL: { 3152 DeclContext *TU = ContextObj->getTranslationUnitDecl(); 3153 LexicalContents Contents( 3154 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 3155 Blob.data()), 3156 static_cast<unsigned int>(Blob.size() / 4)); 3157 TULexicalDecls.push_back(std::make_pair(&F, Contents)); 3158 TU->setHasExternalLexicalStorage(true); 3159 break; 3160 } 3161 3162 case UPDATE_VISIBLE: { 3163 unsigned Idx = 0; 3164 serialization::DeclID ID = ReadDeclID(F, Record, Idx); 3165 auto *Data = (const unsigned char*)Blob.data(); 3166 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data}); 3167 // If we've already loaded the decl, perform the updates when we finish 3168 // loading this block. 3169 if (Decl *D = GetExistingDecl(ID)) 3170 PendingUpdateRecords.push_back( 3171 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3172 break; 3173 } 3174 3175 case IDENTIFIER_TABLE: 3176 F.IdentifierTableData = Blob.data(); 3177 if (Record[0]) { 3178 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create( 3179 (const unsigned char *)F.IdentifierTableData + Record[0], 3180 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t), 3181 (const unsigned char *)F.IdentifierTableData, 3182 ASTIdentifierLookupTrait(*this, F)); 3183 3184 PP.getIdentifierTable().setExternalIdentifierLookup(this); 3185 } 3186 break; 3187 3188 case IDENTIFIER_OFFSET: { 3189 if (F.LocalNumIdentifiers != 0) { 3190 Error("duplicate IDENTIFIER_OFFSET record in AST file"); 3191 return Failure; 3192 } 3193 F.IdentifierOffsets = (const uint32_t *)Blob.data(); 3194 F.LocalNumIdentifiers = Record[0]; 3195 unsigned LocalBaseIdentifierID = Record[1]; 3196 F.BaseIdentifierID = getTotalNumIdentifiers(); 3197 3198 if (F.LocalNumIdentifiers > 0) { 3199 // Introduce the global -> local mapping for identifiers within this 3200 // module. 3201 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1, 3202 &F)); 3203 3204 // Introduce the local -> global mapping for identifiers within this 3205 // module. 3206 F.IdentifierRemap.insertOrReplace( 3207 std::make_pair(LocalBaseIdentifierID, 3208 F.BaseIdentifierID - LocalBaseIdentifierID)); 3209 3210 IdentifiersLoaded.resize(IdentifiersLoaded.size() 3211 + F.LocalNumIdentifiers); 3212 } 3213 break; 3214 } 3215 3216 case INTERESTING_IDENTIFIERS: 3217 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end()); 3218 break; 3219 3220 case EAGERLY_DESERIALIZED_DECLS: 3221 // FIXME: Skip reading this record if our ASTConsumer doesn't care 3222 // about "interesting" decls (for instance, if we're building a module). 3223 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3224 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3225 break; 3226 3227 case MODULAR_CODEGEN_DECLS: 3228 // FIXME: Skip reading this record if our ASTConsumer doesn't care about 3229 // them (ie: if we're not codegenerating this module). 3230 if (F.Kind == MK_MainFile) 3231 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3232 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3233 break; 3234 3235 case SPECIAL_TYPES: 3236 if (SpecialTypes.empty()) { 3237 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3238 SpecialTypes.push_back(getGlobalTypeID(F, Record[I])); 3239 break; 3240 } 3241 3242 if (SpecialTypes.size() != Record.size()) { 3243 Error("invalid special-types record"); 3244 return Failure; 3245 } 3246 3247 for (unsigned I = 0, N = Record.size(); I != N; ++I) { 3248 serialization::TypeID ID = getGlobalTypeID(F, Record[I]); 3249 if (!SpecialTypes[I]) 3250 SpecialTypes[I] = ID; 3251 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate 3252 // merge step? 3253 } 3254 break; 3255 3256 case STATISTICS: 3257 TotalNumStatements += Record[0]; 3258 TotalNumMacros += Record[1]; 3259 TotalLexicalDeclContexts += Record[2]; 3260 TotalVisibleDeclContexts += Record[3]; 3261 break; 3262 3263 case UNUSED_FILESCOPED_DECLS: 3264 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3265 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I])); 3266 break; 3267 3268 case DELEGATING_CTORS: 3269 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3270 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I])); 3271 break; 3272 3273 case WEAK_UNDECLARED_IDENTIFIERS: 3274 if (Record.size() % 4 != 0) { 3275 Error("invalid weak identifiers record"); 3276 return Failure; 3277 } 3278 3279 // FIXME: Ignore weak undeclared identifiers from non-original PCH 3280 // files. This isn't the way to do it :) 3281 WeakUndeclaredIdentifiers.clear(); 3282 3283 // Translate the weak, undeclared identifiers into global IDs. 3284 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) { 3285 WeakUndeclaredIdentifiers.push_back( 3286 getGlobalIdentifierID(F, Record[I++])); 3287 WeakUndeclaredIdentifiers.push_back( 3288 getGlobalIdentifierID(F, Record[I++])); 3289 WeakUndeclaredIdentifiers.push_back( 3290 ReadSourceLocation(F, Record, I).getRawEncoding()); 3291 WeakUndeclaredIdentifiers.push_back(Record[I++]); 3292 } 3293 break; 3294 3295 case SELECTOR_OFFSETS: { 3296 F.SelectorOffsets = (const uint32_t *)Blob.data(); 3297 F.LocalNumSelectors = Record[0]; 3298 unsigned LocalBaseSelectorID = Record[1]; 3299 F.BaseSelectorID = getTotalNumSelectors(); 3300 3301 if (F.LocalNumSelectors > 0) { 3302 // Introduce the global -> local mapping for selectors within this 3303 // module. 3304 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F)); 3305 3306 // Introduce the local -> global mapping for selectors within this 3307 // module. 3308 F.SelectorRemap.insertOrReplace( 3309 std::make_pair(LocalBaseSelectorID, 3310 F.BaseSelectorID - LocalBaseSelectorID)); 3311 3312 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors); 3313 } 3314 break; 3315 } 3316 3317 case METHOD_POOL: 3318 F.SelectorLookupTableData = (const unsigned char *)Blob.data(); 3319 if (Record[0]) 3320 F.SelectorLookupTable 3321 = ASTSelectorLookupTable::Create( 3322 F.SelectorLookupTableData + Record[0], 3323 F.SelectorLookupTableData, 3324 ASTSelectorLookupTrait(*this, F)); 3325 TotalNumMethodPoolEntries += Record[1]; 3326 break; 3327 3328 case REFERENCED_SELECTOR_POOL: 3329 if (!Record.empty()) { 3330 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) { 3331 ReferencedSelectorsData.push_back(getGlobalSelectorID(F, 3332 Record[Idx++])); 3333 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx). 3334 getRawEncoding()); 3335 } 3336 } 3337 break; 3338 3339 case PP_CONDITIONAL_STACK: 3340 if (!Record.empty()) { 3341 unsigned Idx = 0, End = Record.size() - 1; 3342 bool ReachedEOFWhileSkipping = Record[Idx++]; 3343 llvm::Optional<Preprocessor::PreambleSkipInfo> SkipInfo; 3344 if (ReachedEOFWhileSkipping) { 3345 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx); 3346 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx); 3347 bool FoundNonSkipPortion = Record[Idx++]; 3348 bool FoundElse = Record[Idx++]; 3349 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx); 3350 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion, 3351 FoundElse, ElseLoc); 3352 } 3353 SmallVector<PPConditionalInfo, 4> ConditionalStack; 3354 while (Idx < End) { 3355 auto Loc = ReadSourceLocation(F, Record, Idx); 3356 bool WasSkipping = Record[Idx++]; 3357 bool FoundNonSkip = Record[Idx++]; 3358 bool FoundElse = Record[Idx++]; 3359 ConditionalStack.push_back( 3360 {Loc, WasSkipping, FoundNonSkip, FoundElse}); 3361 } 3362 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo); 3363 } 3364 break; 3365 3366 case PP_COUNTER_VALUE: 3367 if (!Record.empty() && Listener) 3368 Listener->ReadCounter(F, Record[0]); 3369 break; 3370 3371 case FILE_SORTED_DECLS: 3372 F.FileSortedDecls = (const DeclID *)Blob.data(); 3373 F.NumFileSortedDecls = Record[0]; 3374 break; 3375 3376 case SOURCE_LOCATION_OFFSETS: { 3377 F.SLocEntryOffsets = (const uint32_t *)Blob.data(); 3378 F.LocalNumSLocEntries = Record[0]; 3379 unsigned SLocSpaceSize = Record[1]; 3380 F.SLocEntryOffsetsBase = Record[2]; 3381 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) = 3382 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries, 3383 SLocSpaceSize); 3384 if (!F.SLocEntryBaseID) { 3385 Error("ran out of source locations"); 3386 break; 3387 } 3388 // Make our entry in the range map. BaseID is negative and growing, so 3389 // we invert it. Because we invert it, though, we need the other end of 3390 // the range. 3391 unsigned RangeStart = 3392 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1; 3393 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F)); 3394 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset); 3395 3396 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing. 3397 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0); 3398 GlobalSLocOffsetMap.insert( 3399 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset 3400 - SLocSpaceSize,&F)); 3401 3402 // Initialize the remapping table. 3403 // Invalid stays invalid. 3404 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0)); 3405 // This module. Base was 2 when being compiled. 3406 F.SLocRemap.insertOrReplace(std::make_pair(2U, 3407 static_cast<int>(F.SLocEntryBaseOffset - 2))); 3408 3409 TotalNumSLocEntries += F.LocalNumSLocEntries; 3410 break; 3411 } 3412 3413 case MODULE_OFFSET_MAP: 3414 F.ModuleOffsetMap = Blob; 3415 break; 3416 3417 case SOURCE_MANAGER_LINE_TABLE: 3418 if (ParseLineTable(F, Record)) { 3419 Error("malformed SOURCE_MANAGER_LINE_TABLE in AST file"); 3420 return Failure; 3421 } 3422 break; 3423 3424 case SOURCE_LOCATION_PRELOADS: { 3425 // Need to transform from the local view (1-based IDs) to the global view, 3426 // which is based off F.SLocEntryBaseID. 3427 if (!F.PreloadSLocEntries.empty()) { 3428 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file"); 3429 return Failure; 3430 } 3431 3432 F.PreloadSLocEntries.swap(Record); 3433 break; 3434 } 3435 3436 case EXT_VECTOR_DECLS: 3437 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3438 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I])); 3439 break; 3440 3441 case VTABLE_USES: 3442 if (Record.size() % 3 != 0) { 3443 Error("Invalid VTABLE_USES record"); 3444 return Failure; 3445 } 3446 3447 // Later tables overwrite earlier ones. 3448 // FIXME: Modules will have some trouble with this. This is clearly not 3449 // the right way to do this. 3450 VTableUses.clear(); 3451 3452 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) { 3453 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++])); 3454 VTableUses.push_back( 3455 ReadSourceLocation(F, Record, Idx).getRawEncoding()); 3456 VTableUses.push_back(Record[Idx++]); 3457 } 3458 break; 3459 3460 case PENDING_IMPLICIT_INSTANTIATIONS: 3461 if (PendingInstantiations.size() % 2 != 0) { 3462 Error("Invalid existing PendingInstantiations"); 3463 return Failure; 3464 } 3465 3466 if (Record.size() % 2 != 0) { 3467 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block"); 3468 return Failure; 3469 } 3470 3471 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3472 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++])); 3473 PendingInstantiations.push_back( 3474 ReadSourceLocation(F, Record, I).getRawEncoding()); 3475 } 3476 break; 3477 3478 case SEMA_DECL_REFS: 3479 if (Record.size() != 3) { 3480 Error("Invalid SEMA_DECL_REFS block"); 3481 return Failure; 3482 } 3483 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3484 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3485 break; 3486 3487 case PPD_ENTITIES_OFFSETS: { 3488 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data(); 3489 assert(Blob.size() % sizeof(PPEntityOffset) == 0); 3490 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset); 3491 3492 unsigned LocalBasePreprocessedEntityID = Record[0]; 3493 3494 unsigned StartingID; 3495 if (!PP.getPreprocessingRecord()) 3496 PP.createPreprocessingRecord(); 3497 if (!PP.getPreprocessingRecord()->getExternalSource()) 3498 PP.getPreprocessingRecord()->SetExternalSource(*this); 3499 StartingID 3500 = PP.getPreprocessingRecord() 3501 ->allocateLoadedEntities(F.NumPreprocessedEntities); 3502 F.BasePreprocessedEntityID = StartingID; 3503 3504 if (F.NumPreprocessedEntities > 0) { 3505 // Introduce the global -> local mapping for preprocessed entities in 3506 // this module. 3507 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F)); 3508 3509 // Introduce the local -> global mapping for preprocessed entities in 3510 // this module. 3511 F.PreprocessedEntityRemap.insertOrReplace( 3512 std::make_pair(LocalBasePreprocessedEntityID, 3513 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID)); 3514 } 3515 3516 break; 3517 } 3518 3519 case PPD_SKIPPED_RANGES: { 3520 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data(); 3521 assert(Blob.size() % sizeof(PPSkippedRange) == 0); 3522 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange); 3523 3524 if (!PP.getPreprocessingRecord()) 3525 PP.createPreprocessingRecord(); 3526 if (!PP.getPreprocessingRecord()->getExternalSource()) 3527 PP.getPreprocessingRecord()->SetExternalSource(*this); 3528 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord() 3529 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges); 3530 3531 if (F.NumPreprocessedSkippedRanges > 0) 3532 GlobalSkippedRangeMap.insert( 3533 std::make_pair(F.BasePreprocessedSkippedRangeID, &F)); 3534 break; 3535 } 3536 3537 case DECL_UPDATE_OFFSETS: 3538 if (Record.size() % 2 != 0) { 3539 Error("invalid DECL_UPDATE_OFFSETS block in AST file"); 3540 return Failure; 3541 } 3542 for (unsigned I = 0, N = Record.size(); I != N; I += 2) { 3543 GlobalDeclID ID = getGlobalDeclID(F, Record[I]); 3544 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1])); 3545 3546 // If we've already loaded the decl, perform the updates when we finish 3547 // loading this block. 3548 if (Decl *D = GetExistingDecl(ID)) 3549 PendingUpdateRecords.push_back( 3550 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3551 } 3552 break; 3553 3554 case OBJC_CATEGORIES_MAP: 3555 if (F.LocalNumObjCCategoriesInMap != 0) { 3556 Error("duplicate OBJC_CATEGORIES_MAP record in AST file"); 3557 return Failure; 3558 } 3559 3560 F.LocalNumObjCCategoriesInMap = Record[0]; 3561 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data(); 3562 break; 3563 3564 case OBJC_CATEGORIES: 3565 F.ObjCCategories.swap(Record); 3566 break; 3567 3568 case CUDA_SPECIAL_DECL_REFS: 3569 // Later tables overwrite earlier ones. 3570 // FIXME: Modules will have trouble with this. 3571 CUDASpecialDeclRefs.clear(); 3572 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3573 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3574 break; 3575 3576 case HEADER_SEARCH_TABLE: 3577 F.HeaderFileInfoTableData = Blob.data(); 3578 F.LocalNumHeaderFileInfos = Record[1]; 3579 if (Record[0]) { 3580 F.HeaderFileInfoTable 3581 = HeaderFileInfoLookupTable::Create( 3582 (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 3583 (const unsigned char *)F.HeaderFileInfoTableData, 3584 HeaderFileInfoTrait(*this, F, 3585 &PP.getHeaderSearchInfo(), 3586 Blob.data() + Record[2])); 3587 3588 PP.getHeaderSearchInfo().SetExternalSource(this); 3589 if (!PP.getHeaderSearchInfo().getExternalLookup()) 3590 PP.getHeaderSearchInfo().SetExternalLookup(this); 3591 } 3592 break; 3593 3594 case FP_PRAGMA_OPTIONS: 3595 // Later tables overwrite earlier ones. 3596 FPPragmaOptions.swap(Record); 3597 break; 3598 3599 case OPENCL_EXTENSIONS: 3600 for (unsigned I = 0, E = Record.size(); I != E; ) { 3601 auto Name = ReadString(Record, I); 3602 auto &Opt = OpenCLExtensions.OptMap[Name]; 3603 Opt.Supported = Record[I++] != 0; 3604 Opt.Enabled = Record[I++] != 0; 3605 Opt.Avail = Record[I++]; 3606 Opt.Core = Record[I++]; 3607 } 3608 break; 3609 3610 case OPENCL_EXTENSION_TYPES: 3611 for (unsigned I = 0, E = Record.size(); I != E;) { 3612 auto TypeID = static_cast<::TypeID>(Record[I++]); 3613 auto *Type = GetType(TypeID).getTypePtr(); 3614 auto NumExt = static_cast<unsigned>(Record[I++]); 3615 for (unsigned II = 0; II != NumExt; ++II) { 3616 auto Ext = ReadString(Record, I); 3617 OpenCLTypeExtMap[Type].insert(Ext); 3618 } 3619 } 3620 break; 3621 3622 case OPENCL_EXTENSION_DECLS: 3623 for (unsigned I = 0, E = Record.size(); I != E;) { 3624 auto DeclID = static_cast<::DeclID>(Record[I++]); 3625 auto *Decl = GetDecl(DeclID); 3626 auto NumExt = static_cast<unsigned>(Record[I++]); 3627 for (unsigned II = 0; II != NumExt; ++II) { 3628 auto Ext = ReadString(Record, I); 3629 OpenCLDeclExtMap[Decl].insert(Ext); 3630 } 3631 } 3632 break; 3633 3634 case TENTATIVE_DEFINITIONS: 3635 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3636 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 3637 break; 3638 3639 case KNOWN_NAMESPACES: 3640 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3641 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 3642 break; 3643 3644 case UNDEFINED_BUT_USED: 3645 if (UndefinedButUsed.size() % 2 != 0) { 3646 Error("Invalid existing UndefinedButUsed"); 3647 return Failure; 3648 } 3649 3650 if (Record.size() % 2 != 0) { 3651 Error("invalid undefined-but-used record"); 3652 return Failure; 3653 } 3654 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3655 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 3656 UndefinedButUsed.push_back( 3657 ReadSourceLocation(F, Record, I).getRawEncoding()); 3658 } 3659 break; 3660 3661 case DELETE_EXPRS_TO_ANALYZE: 3662 for (unsigned I = 0, N = Record.size(); I != N;) { 3663 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++])); 3664 const uint64_t Count = Record[I++]; 3665 DelayedDeleteExprs.push_back(Count); 3666 for (uint64_t C = 0; C < Count; ++C) { 3667 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding()); 3668 bool IsArrayForm = Record[I++] == 1; 3669 DelayedDeleteExprs.push_back(IsArrayForm); 3670 } 3671 } 3672 break; 3673 3674 case IMPORTED_MODULES: 3675 if (!F.isModule()) { 3676 // If we aren't loading a module (which has its own exports), make 3677 // all of the imported modules visible. 3678 // FIXME: Deal with macros-only imports. 3679 for (unsigned I = 0, N = Record.size(); I != N; /**/) { 3680 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]); 3681 SourceLocation Loc = ReadSourceLocation(F, Record, I); 3682 if (GlobalID) { 3683 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc)); 3684 if (DeserializationListener) 3685 DeserializationListener->ModuleImportRead(GlobalID, Loc); 3686 } 3687 } 3688 } 3689 break; 3690 3691 case MACRO_OFFSET: { 3692 if (F.LocalNumMacros != 0) { 3693 Error("duplicate MACRO_OFFSET record in AST file"); 3694 return Failure; 3695 } 3696 F.MacroOffsets = (const uint32_t *)Blob.data(); 3697 F.LocalNumMacros = Record[0]; 3698 unsigned LocalBaseMacroID = Record[1]; 3699 F.MacroOffsetsBase = Record[2]; 3700 F.BaseMacroID = getTotalNumMacros(); 3701 3702 if (F.LocalNumMacros > 0) { 3703 // Introduce the global -> local mapping for macros within this module. 3704 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 3705 3706 // Introduce the local -> global mapping for macros within this module. 3707 F.MacroRemap.insertOrReplace( 3708 std::make_pair(LocalBaseMacroID, 3709 F.BaseMacroID - LocalBaseMacroID)); 3710 3711 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 3712 } 3713 break; 3714 } 3715 3716 case LATE_PARSED_TEMPLATE: 3717 LateParsedTemplates.append(Record.begin(), Record.end()); 3718 break; 3719 3720 case OPTIMIZE_PRAGMA_OPTIONS: 3721 if (Record.size() != 1) { 3722 Error("invalid pragma optimize record"); 3723 return Failure; 3724 } 3725 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]); 3726 break; 3727 3728 case MSSTRUCT_PRAGMA_OPTIONS: 3729 if (Record.size() != 1) { 3730 Error("invalid pragma ms_struct record"); 3731 return Failure; 3732 } 3733 PragmaMSStructState = Record[0]; 3734 break; 3735 3736 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS: 3737 if (Record.size() != 2) { 3738 Error("invalid pragma ms_struct record"); 3739 return Failure; 3740 } 3741 PragmaMSPointersToMembersState = Record[0]; 3742 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]); 3743 break; 3744 3745 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES: 3746 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3747 UnusedLocalTypedefNameCandidates.push_back( 3748 getGlobalDeclID(F, Record[I])); 3749 break; 3750 3751 case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH: 3752 if (Record.size() != 1) { 3753 Error("invalid cuda pragma options record"); 3754 return Failure; 3755 } 3756 ForceCUDAHostDeviceDepth = Record[0]; 3757 break; 3758 3759 case PACK_PRAGMA_OPTIONS: { 3760 if (Record.size() < 3) { 3761 Error("invalid pragma pack record"); 3762 return Failure; 3763 } 3764 PragmaPackCurrentValue = Record[0]; 3765 PragmaPackCurrentLocation = ReadSourceLocation(F, Record[1]); 3766 unsigned NumStackEntries = Record[2]; 3767 unsigned Idx = 3; 3768 // Reset the stack when importing a new module. 3769 PragmaPackStack.clear(); 3770 for (unsigned I = 0; I < NumStackEntries; ++I) { 3771 PragmaPackStackEntry Entry; 3772 Entry.Value = Record[Idx++]; 3773 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3774 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3775 PragmaPackStrings.push_back(ReadString(Record, Idx)); 3776 Entry.SlotLabel = PragmaPackStrings.back(); 3777 PragmaPackStack.push_back(Entry); 3778 } 3779 break; 3780 } 3781 3782 case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS: 3783 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3784 DeclsToCheckForDeferredDiags.push_back(getGlobalDeclID(F, Record[I])); 3785 break; 3786 } 3787 } 3788 } 3789 3790 void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const { 3791 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read"); 3792 3793 // Additional remapping information. 3794 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data(); 3795 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size(); 3796 F.ModuleOffsetMap = StringRef(); 3797 3798 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders. 3799 if (F.SLocRemap.find(0) == F.SLocRemap.end()) { 3800 F.SLocRemap.insert(std::make_pair(0U, 0)); 3801 F.SLocRemap.insert(std::make_pair(2U, 1)); 3802 } 3803 3804 // Continuous range maps we may be updating in our module. 3805 using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder; 3806 RemapBuilder SLocRemap(F.SLocRemap); 3807 RemapBuilder IdentifierRemap(F.IdentifierRemap); 3808 RemapBuilder MacroRemap(F.MacroRemap); 3809 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap); 3810 RemapBuilder SubmoduleRemap(F.SubmoduleRemap); 3811 RemapBuilder SelectorRemap(F.SelectorRemap); 3812 RemapBuilder DeclRemap(F.DeclRemap); 3813 RemapBuilder TypeRemap(F.TypeRemap); 3814 3815 while (Data < DataEnd) { 3816 // FIXME: Looking up dependency modules by filename is horrible. Let's 3817 // start fixing this with prebuilt and explicit modules and see how it 3818 // goes... 3819 using namespace llvm::support; 3820 ModuleKind Kind = static_cast<ModuleKind>( 3821 endian::readNext<uint8_t, little, unaligned>(Data)); 3822 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data); 3823 StringRef Name = StringRef((const char*)Data, Len); 3824 Data += Len; 3825 ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule 3826 ? ModuleMgr.lookupByModuleName(Name) 3827 : ModuleMgr.lookupByFileName(Name)); 3828 if (!OM) { 3829 std::string Msg = 3830 "SourceLocation remap refers to unknown module, cannot find "; 3831 Msg.append(std::string(Name)); 3832 Error(Msg); 3833 return; 3834 } 3835 3836 uint32_t SLocOffset = 3837 endian::readNext<uint32_t, little, unaligned>(Data); 3838 uint32_t IdentifierIDOffset = 3839 endian::readNext<uint32_t, little, unaligned>(Data); 3840 uint32_t MacroIDOffset = 3841 endian::readNext<uint32_t, little, unaligned>(Data); 3842 uint32_t PreprocessedEntityIDOffset = 3843 endian::readNext<uint32_t, little, unaligned>(Data); 3844 uint32_t SubmoduleIDOffset = 3845 endian::readNext<uint32_t, little, unaligned>(Data); 3846 uint32_t SelectorIDOffset = 3847 endian::readNext<uint32_t, little, unaligned>(Data); 3848 uint32_t DeclIDOffset = 3849 endian::readNext<uint32_t, little, unaligned>(Data); 3850 uint32_t TypeIndexOffset = 3851 endian::readNext<uint32_t, little, unaligned>(Data); 3852 3853 uint32_t None = std::numeric_limits<uint32_t>::max(); 3854 3855 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset, 3856 RemapBuilder &Remap) { 3857 if (Offset != None) 3858 Remap.insert(std::make_pair(Offset, 3859 static_cast<int>(BaseOffset - Offset))); 3860 }; 3861 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap); 3862 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap); 3863 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap); 3864 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID, 3865 PreprocessedEntityRemap); 3866 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap); 3867 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap); 3868 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap); 3869 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap); 3870 3871 // Global -> local mappings. 3872 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset; 3873 } 3874 } 3875 3876 ASTReader::ASTReadResult 3877 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F, 3878 const ModuleFile *ImportedBy, 3879 unsigned ClientLoadCapabilities) { 3880 unsigned Idx = 0; 3881 F.ModuleMapPath = ReadPath(F, Record, Idx); 3882 3883 // Try to resolve ModuleName in the current header search context and 3884 // verify that it is found in the same module map file as we saved. If the 3885 // top-level AST file is a main file, skip this check because there is no 3886 // usable header search context. 3887 assert(!F.ModuleName.empty() && 3888 "MODULE_NAME should come before MODULE_MAP_FILE"); 3889 if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) { 3890 // An implicitly-loaded module file should have its module listed in some 3891 // module map file that we've already loaded. 3892 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName); 3893 auto &Map = PP.getHeaderSearchInfo().getModuleMap(); 3894 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr; 3895 // Don't emit module relocation error if we have -fno-validate-pch 3896 if (!PP.getPreprocessorOpts().DisablePCHValidation && !ModMap) { 3897 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) { 3898 if (auto *ASTFE = M ? M->getASTFile() : nullptr) { 3899 // This module was defined by an imported (explicit) module. 3900 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName 3901 << ASTFE->getName(); 3902 } else { 3903 // This module was built with a different module map. 3904 Diag(diag::err_imported_module_not_found) 3905 << F.ModuleName << F.FileName 3906 << (ImportedBy ? ImportedBy->FileName : "") << F.ModuleMapPath 3907 << !ImportedBy; 3908 // In case it was imported by a PCH, there's a chance the user is 3909 // just missing to include the search path to the directory containing 3910 // the modulemap. 3911 if (ImportedBy && ImportedBy->Kind == MK_PCH) 3912 Diag(diag::note_imported_by_pch_module_not_found) 3913 << llvm::sys::path::parent_path(F.ModuleMapPath); 3914 } 3915 } 3916 return OutOfDate; 3917 } 3918 3919 assert(M->Name == F.ModuleName && "found module with different name"); 3920 3921 // Check the primary module map file. 3922 auto StoredModMap = FileMgr.getFile(F.ModuleMapPath); 3923 if (!StoredModMap || *StoredModMap != ModMap) { 3924 assert(ModMap && "found module is missing module map file"); 3925 assert((ImportedBy || F.Kind == MK_ImplicitModule) && 3926 "top-level import should be verified"); 3927 bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy; 3928 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3929 Diag(diag::err_imported_module_modmap_changed) 3930 << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName) 3931 << ModMap->getName() << F.ModuleMapPath << NotImported; 3932 return OutOfDate; 3933 } 3934 3935 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps; 3936 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) { 3937 // FIXME: we should use input files rather than storing names. 3938 std::string Filename = ReadPath(F, Record, Idx); 3939 auto F = FileMgr.getFile(Filename, false, false); 3940 if (!F) { 3941 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3942 Error("could not find file '" + Filename +"' referenced by AST file"); 3943 return OutOfDate; 3944 } 3945 AdditionalStoredMaps.insert(*F); 3946 } 3947 3948 // Check any additional module map files (e.g. module.private.modulemap) 3949 // that are not in the pcm. 3950 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) { 3951 for (const FileEntry *ModMap : *AdditionalModuleMaps) { 3952 // Remove files that match 3953 // Note: SmallPtrSet::erase is really remove 3954 if (!AdditionalStoredMaps.erase(ModMap)) { 3955 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3956 Diag(diag::err_module_different_modmap) 3957 << F.ModuleName << /*new*/0 << ModMap->getName(); 3958 return OutOfDate; 3959 } 3960 } 3961 } 3962 3963 // Check any additional module map files that are in the pcm, but not 3964 // found in header search. Cases that match are already removed. 3965 for (const FileEntry *ModMap : AdditionalStoredMaps) { 3966 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3967 Diag(diag::err_module_different_modmap) 3968 << F.ModuleName << /*not new*/1 << ModMap->getName(); 3969 return OutOfDate; 3970 } 3971 } 3972 3973 if (Listener) 3974 Listener->ReadModuleMapFile(F.ModuleMapPath); 3975 return Success; 3976 } 3977 3978 /// Move the given method to the back of the global list of methods. 3979 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 3980 // Find the entry for this selector in the method pool. 3981 Sema::GlobalMethodPool::iterator Known 3982 = S.MethodPool.find(Method->getSelector()); 3983 if (Known == S.MethodPool.end()) 3984 return; 3985 3986 // Retrieve the appropriate method list. 3987 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 3988 : Known->second.second; 3989 bool Found = false; 3990 for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 3991 if (!Found) { 3992 if (List->getMethod() == Method) { 3993 Found = true; 3994 } else { 3995 // Keep searching. 3996 continue; 3997 } 3998 } 3999 4000 if (List->getNext()) 4001 List->setMethod(List->getNext()->getMethod()); 4002 else 4003 List->setMethod(Method); 4004 } 4005 } 4006 4007 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) { 4008 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?"); 4009 for (Decl *D : Names) { 4010 bool wasHidden = D->isHidden(); 4011 D->setVisibleDespiteOwningModule(); 4012 4013 if (wasHidden && SemaObj) { 4014 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 4015 moveMethodToBackOfGlobalList(*SemaObj, Method); 4016 } 4017 } 4018 } 4019 } 4020 4021 void ASTReader::makeModuleVisible(Module *Mod, 4022 Module::NameVisibilityKind NameVisibility, 4023 SourceLocation ImportLoc) { 4024 llvm::SmallPtrSet<Module *, 4> Visited; 4025 SmallVector<Module *, 4> Stack; 4026 Stack.push_back(Mod); 4027 while (!Stack.empty()) { 4028 Mod = Stack.pop_back_val(); 4029 4030 if (NameVisibility <= Mod->NameVisibility) { 4031 // This module already has this level of visibility (or greater), so 4032 // there is nothing more to do. 4033 continue; 4034 } 4035 4036 if (!Mod->isAvailable()) { 4037 // Modules that aren't available cannot be made visible. 4038 continue; 4039 } 4040 4041 // Update the module's name visibility. 4042 Mod->NameVisibility = NameVisibility; 4043 4044 // If we've already deserialized any names from this module, 4045 // mark them as visible. 4046 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 4047 if (Hidden != HiddenNamesMap.end()) { 4048 auto HiddenNames = std::move(*Hidden); 4049 HiddenNamesMap.erase(Hidden); 4050 makeNamesVisible(HiddenNames.second, HiddenNames.first); 4051 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && 4052 "making names visible added hidden names"); 4053 } 4054 4055 // Push any exported modules onto the stack to be marked as visible. 4056 SmallVector<Module *, 16> Exports; 4057 Mod->getExportedModules(Exports); 4058 for (SmallVectorImpl<Module *>::iterator 4059 I = Exports.begin(), E = Exports.end(); I != E; ++I) { 4060 Module *Exported = *I; 4061 if (Visited.insert(Exported).second) 4062 Stack.push_back(Exported); 4063 } 4064 } 4065 } 4066 4067 /// We've merged the definition \p MergedDef into the existing definition 4068 /// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made 4069 /// visible. 4070 void ASTReader::mergeDefinitionVisibility(NamedDecl *Def, 4071 NamedDecl *MergedDef) { 4072 if (Def->isHidden()) { 4073 // If MergedDef is visible or becomes visible, make the definition visible. 4074 if (!MergedDef->isHidden()) 4075 Def->setVisibleDespiteOwningModule(); 4076 else { 4077 getContext().mergeDefinitionIntoModule( 4078 Def, MergedDef->getImportedOwningModule(), 4079 /*NotifyListeners*/ false); 4080 PendingMergedDefinitionsToDeduplicate.insert(Def); 4081 } 4082 } 4083 } 4084 4085 bool ASTReader::loadGlobalIndex() { 4086 if (GlobalIndex) 4087 return false; 4088 4089 if (TriedLoadingGlobalIndex || !UseGlobalIndex || 4090 !PP.getLangOpts().Modules) 4091 return true; 4092 4093 // Try to load the global index. 4094 TriedLoadingGlobalIndex = true; 4095 StringRef ModuleCachePath 4096 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 4097 std::pair<GlobalModuleIndex *, llvm::Error> Result = 4098 GlobalModuleIndex::readIndex(ModuleCachePath); 4099 if (llvm::Error Err = std::move(Result.second)) { 4100 assert(!Result.first); 4101 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 4102 return true; 4103 } 4104 4105 GlobalIndex.reset(Result.first); 4106 ModuleMgr.setGlobalIndex(GlobalIndex.get()); 4107 return false; 4108 } 4109 4110 bool ASTReader::isGlobalIndexUnavailable() const { 4111 return PP.getLangOpts().Modules && UseGlobalIndex && 4112 !hasGlobalIndex() && TriedLoadingGlobalIndex; 4113 } 4114 4115 static void updateModuleTimestamp(ModuleFile &MF) { 4116 // Overwrite the timestamp file contents so that file's mtime changes. 4117 std::string TimestampFilename = MF.getTimestampFilename(); 4118 std::error_code EC; 4119 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::OF_Text); 4120 if (EC) 4121 return; 4122 OS << "Timestamp file\n"; 4123 OS.close(); 4124 OS.clear_error(); // Avoid triggering a fatal error. 4125 } 4126 4127 /// Given a cursor at the start of an AST file, scan ahead and drop the 4128 /// cursor into the start of the given block ID, returning false on success and 4129 /// true on failure. 4130 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 4131 while (true) { 4132 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 4133 if (!MaybeEntry) { 4134 // FIXME this drops errors on the floor. 4135 consumeError(MaybeEntry.takeError()); 4136 return true; 4137 } 4138 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4139 4140 switch (Entry.Kind) { 4141 case llvm::BitstreamEntry::Error: 4142 case llvm::BitstreamEntry::EndBlock: 4143 return true; 4144 4145 case llvm::BitstreamEntry::Record: 4146 // Ignore top-level records. 4147 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID)) 4148 break; 4149 else { 4150 // FIXME this drops errors on the floor. 4151 consumeError(Skipped.takeError()); 4152 return true; 4153 } 4154 4155 case llvm::BitstreamEntry::SubBlock: 4156 if (Entry.ID == BlockID) { 4157 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) { 4158 // FIXME this drops the error on the floor. 4159 consumeError(std::move(Err)); 4160 return true; 4161 } 4162 // Found it! 4163 return false; 4164 } 4165 4166 if (llvm::Error Err = Cursor.SkipBlock()) { 4167 // FIXME this drops the error on the floor. 4168 consumeError(std::move(Err)); 4169 return true; 4170 } 4171 } 4172 } 4173 } 4174 4175 ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, 4176 ModuleKind Type, 4177 SourceLocation ImportLoc, 4178 unsigned ClientLoadCapabilities, 4179 SmallVectorImpl<ImportedSubmodule> *Imported) { 4180 llvm::SaveAndRestore<SourceLocation> 4181 SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 4182 4183 // Defer any pending actions until we get to the end of reading the AST file. 4184 Deserializing AnASTFile(this); 4185 4186 // Bump the generation number. 4187 unsigned PreviousGeneration = 0; 4188 if (ContextObj) 4189 PreviousGeneration = incrementGeneration(*ContextObj); 4190 4191 unsigned NumModules = ModuleMgr.size(); 4192 auto removeModulesAndReturn = [&](ASTReadResult ReadResult) { 4193 assert(ReadResult && "expected to return error"); 4194 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, 4195 PP.getLangOpts().Modules 4196 ? &PP.getHeaderSearchInfo().getModuleMap() 4197 : nullptr); 4198 4199 // If we find that any modules are unusable, the global index is going 4200 // to be out-of-date. Just remove it. 4201 GlobalIndex.reset(); 4202 ModuleMgr.setGlobalIndex(nullptr); 4203 return ReadResult; 4204 }; 4205 4206 SmallVector<ImportedModule, 4> Loaded; 4207 switch (ASTReadResult ReadResult = 4208 ReadASTCore(FileName, Type, ImportLoc, 4209 /*ImportedBy=*/nullptr, Loaded, 0, 0, 4210 ASTFileSignature(), ClientLoadCapabilities)) { 4211 case Failure: 4212 case Missing: 4213 case OutOfDate: 4214 case VersionMismatch: 4215 case ConfigurationMismatch: 4216 case HadErrors: 4217 return removeModulesAndReturn(ReadResult); 4218 case Success: 4219 break; 4220 } 4221 4222 // Here comes stuff that we only do once the entire chain is loaded. 4223 4224 // Load the AST blocks of all of the modules that we loaded. We can still 4225 // hit errors parsing the ASTs at this point. 4226 for (ImportedModule &M : Loaded) { 4227 ModuleFile &F = *M.Mod; 4228 4229 // Read the AST block. 4230 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities)) 4231 return removeModulesAndReturn(Result); 4232 4233 // The AST block should always have a definition for the main module. 4234 if (F.isModule() && !F.DidReadTopLevelSubmodule) { 4235 Error(diag::err_module_file_missing_top_level_submodule, F.FileName); 4236 return removeModulesAndReturn(Failure); 4237 } 4238 4239 // Read the extension blocks. 4240 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) { 4241 if (ASTReadResult Result = ReadExtensionBlock(F)) 4242 return removeModulesAndReturn(Result); 4243 } 4244 4245 // Once read, set the ModuleFile bit base offset and update the size in 4246 // bits of all files we've seen. 4247 F.GlobalBitOffset = TotalModulesSizeInBits; 4248 TotalModulesSizeInBits += F.SizeInBits; 4249 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 4250 } 4251 4252 // Preload source locations and interesting indentifiers. 4253 for (ImportedModule &M : Loaded) { 4254 ModuleFile &F = *M.Mod; 4255 4256 // Preload SLocEntries. 4257 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 4258 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 4259 // Load it through the SourceManager and don't call ReadSLocEntry() 4260 // directly because the entry may have already been loaded in which case 4261 // calling ReadSLocEntry() directly would trigger an assertion in 4262 // SourceManager. 4263 SourceMgr.getLoadedSLocEntryByID(Index); 4264 } 4265 4266 // Map the original source file ID into the ID space of the current 4267 // compilation. 4268 if (F.OriginalSourceFileID.isValid()) { 4269 F.OriginalSourceFileID = FileID::get( 4270 F.SLocEntryBaseID + F.OriginalSourceFileID.getOpaqueValue() - 1); 4271 } 4272 4273 // Preload all the pending interesting identifiers by marking them out of 4274 // date. 4275 for (auto Offset : F.PreloadIdentifierOffsets) { 4276 const unsigned char *Data = reinterpret_cast<const unsigned char *>( 4277 F.IdentifierTableData + Offset); 4278 4279 ASTIdentifierLookupTrait Trait(*this, F); 4280 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 4281 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 4282 auto &II = PP.getIdentifierTable().getOwn(Key); 4283 II.setOutOfDate(true); 4284 4285 // Mark this identifier as being from an AST file so that we can track 4286 // whether we need to serialize it. 4287 markIdentifierFromAST(*this, II); 4288 4289 // Associate the ID with the identifier so that the writer can reuse it. 4290 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first); 4291 SetIdentifierInfo(ID, &II); 4292 } 4293 } 4294 4295 // Setup the import locations and notify the module manager that we've 4296 // committed to these module files. 4297 for (ImportedModule &M : Loaded) { 4298 ModuleFile &F = *M.Mod; 4299 4300 ModuleMgr.moduleFileAccepted(&F); 4301 4302 // Set the import location. 4303 F.DirectImportLoc = ImportLoc; 4304 // FIXME: We assume that locations from PCH / preamble do not need 4305 // any translation. 4306 if (!M.ImportedBy) 4307 F.ImportLoc = M.ImportLoc; 4308 else 4309 F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc); 4310 } 4311 4312 if (!PP.getLangOpts().CPlusPlus || 4313 (Type != MK_ImplicitModule && Type != MK_ExplicitModule && 4314 Type != MK_PrebuiltModule)) { 4315 // Mark all of the identifiers in the identifier table as being out of date, 4316 // so that various accessors know to check the loaded modules when the 4317 // identifier is used. 4318 // 4319 // For C++ modules, we don't need information on many identifiers (just 4320 // those that provide macros or are poisoned), so we mark all of 4321 // the interesting ones via PreloadIdentifierOffsets. 4322 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 4323 IdEnd = PP.getIdentifierTable().end(); 4324 Id != IdEnd; ++Id) 4325 Id->second->setOutOfDate(true); 4326 } 4327 // Mark selectors as out of date. 4328 for (auto Sel : SelectorGeneration) 4329 SelectorOutOfDate[Sel.first] = true; 4330 4331 // Resolve any unresolved module exports. 4332 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) { 4333 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I]; 4334 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 4335 Module *ResolvedMod = getSubmodule(GlobalID); 4336 4337 switch (Unresolved.Kind) { 4338 case UnresolvedModuleRef::Conflict: 4339 if (ResolvedMod) { 4340 Module::Conflict Conflict; 4341 Conflict.Other = ResolvedMod; 4342 Conflict.Message = Unresolved.String.str(); 4343 Unresolved.Mod->Conflicts.push_back(Conflict); 4344 } 4345 continue; 4346 4347 case UnresolvedModuleRef::Import: 4348 if (ResolvedMod) 4349 Unresolved.Mod->Imports.insert(ResolvedMod); 4350 continue; 4351 4352 case UnresolvedModuleRef::Export: 4353 if (ResolvedMod || Unresolved.IsWildcard) 4354 Unresolved.Mod->Exports.push_back( 4355 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 4356 continue; 4357 } 4358 } 4359 UnresolvedModuleRefs.clear(); 4360 4361 if (Imported) 4362 Imported->append(ImportedModules.begin(), 4363 ImportedModules.end()); 4364 4365 // FIXME: How do we load the 'use'd modules? They may not be submodules. 4366 // Might be unnecessary as use declarations are only used to build the 4367 // module itself. 4368 4369 if (ContextObj) 4370 InitializeContext(); 4371 4372 if (SemaObj) 4373 UpdateSema(); 4374 4375 if (DeserializationListener) 4376 DeserializationListener->ReaderInitialized(this); 4377 4378 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 4379 if (PrimaryModule.OriginalSourceFileID.isValid()) { 4380 // If this AST file is a precompiled preamble, then set the 4381 // preamble file ID of the source manager to the file source file 4382 // from which the preamble was built. 4383 if (Type == MK_Preamble) { 4384 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 4385 } else if (Type == MK_MainFile) { 4386 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 4387 } 4388 } 4389 4390 // For any Objective-C class definitions we have already loaded, make sure 4391 // that we load any additional categories. 4392 if (ContextObj) { 4393 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 4394 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 4395 ObjCClassesLoaded[I], 4396 PreviousGeneration); 4397 } 4398 } 4399 4400 if (PP.getHeaderSearchInfo() 4401 .getHeaderSearchOpts() 4402 .ModulesValidateOncePerBuildSession) { 4403 // Now we are certain that the module and all modules it depends on are 4404 // up to date. Create or update timestamp files for modules that are 4405 // located in the module cache (not for PCH files that could be anywhere 4406 // in the filesystem). 4407 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) { 4408 ImportedModule &M = Loaded[I]; 4409 if (M.Mod->Kind == MK_ImplicitModule) { 4410 updateModuleTimestamp(*M.Mod); 4411 } 4412 } 4413 } 4414 4415 return Success; 4416 } 4417 4418 static ASTFileSignature readASTFileSignature(StringRef PCH); 4419 4420 /// Whether \p Stream doesn't start with the AST/PCH file magic number 'CPCH'. 4421 static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) { 4422 // FIXME checking magic headers is done in other places such as 4423 // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't 4424 // always done the same. Unify it all with a helper. 4425 if (!Stream.canSkipToPos(4)) 4426 return llvm::createStringError(std::errc::illegal_byte_sequence, 4427 "file too small to contain AST file magic"); 4428 for (unsigned C : {'C', 'P', 'C', 'H'}) 4429 if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) { 4430 if (Res.get() != C) 4431 return llvm::createStringError( 4432 std::errc::illegal_byte_sequence, 4433 "file doesn't start with AST file magic"); 4434 } else 4435 return Res.takeError(); 4436 return llvm::Error::success(); 4437 } 4438 4439 static unsigned moduleKindForDiagnostic(ModuleKind Kind) { 4440 switch (Kind) { 4441 case MK_PCH: 4442 return 0; // PCH 4443 case MK_ImplicitModule: 4444 case MK_ExplicitModule: 4445 case MK_PrebuiltModule: 4446 return 1; // module 4447 case MK_MainFile: 4448 case MK_Preamble: 4449 return 2; // main source file 4450 } 4451 llvm_unreachable("unknown module kind"); 4452 } 4453 4454 ASTReader::ASTReadResult 4455 ASTReader::ReadASTCore(StringRef FileName, 4456 ModuleKind Type, 4457 SourceLocation ImportLoc, 4458 ModuleFile *ImportedBy, 4459 SmallVectorImpl<ImportedModule> &Loaded, 4460 off_t ExpectedSize, time_t ExpectedModTime, 4461 ASTFileSignature ExpectedSignature, 4462 unsigned ClientLoadCapabilities) { 4463 ModuleFile *M; 4464 std::string ErrorStr; 4465 ModuleManager::AddModuleResult AddResult 4466 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy, 4467 getGeneration(), ExpectedSize, ExpectedModTime, 4468 ExpectedSignature, readASTFileSignature, 4469 M, ErrorStr); 4470 4471 switch (AddResult) { 4472 case ModuleManager::AlreadyLoaded: 4473 Diag(diag::remark_module_import) 4474 << M->ModuleName << M->FileName << (ImportedBy ? true : false) 4475 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 4476 return Success; 4477 4478 case ModuleManager::NewlyLoaded: 4479 // Load module file below. 4480 break; 4481 4482 case ModuleManager::Missing: 4483 // The module file was missing; if the client can handle that, return 4484 // it. 4485 if (ClientLoadCapabilities & ARR_Missing) 4486 return Missing; 4487 4488 // Otherwise, return an error. 4489 Diag(diag::err_module_file_not_found) << moduleKindForDiagnostic(Type) 4490 << FileName << !ErrorStr.empty() 4491 << ErrorStr; 4492 return Failure; 4493 4494 case ModuleManager::OutOfDate: 4495 // We couldn't load the module file because it is out-of-date. If the 4496 // client can handle out-of-date, return it. 4497 if (ClientLoadCapabilities & ARR_OutOfDate) 4498 return OutOfDate; 4499 4500 // Otherwise, return an error. 4501 Diag(diag::err_module_file_out_of_date) << moduleKindForDiagnostic(Type) 4502 << FileName << !ErrorStr.empty() 4503 << ErrorStr; 4504 return Failure; 4505 } 4506 4507 assert(M && "Missing module file"); 4508 4509 bool ShouldFinalizePCM = false; 4510 auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() { 4511 auto &MC = getModuleManager().getModuleCache(); 4512 if (ShouldFinalizePCM) 4513 MC.finalizePCM(FileName); 4514 else 4515 MC.tryToDropPCM(FileName); 4516 }); 4517 ModuleFile &F = *M; 4518 BitstreamCursor &Stream = F.Stream; 4519 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer)); 4520 F.SizeInBits = F.Buffer->getBufferSize() * 8; 4521 4522 // Sniff for the signature. 4523 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4524 Diag(diag::err_module_file_invalid) 4525 << moduleKindForDiagnostic(Type) << FileName << std::move(Err); 4526 return Failure; 4527 } 4528 4529 // This is used for compatibility with older PCH formats. 4530 bool HaveReadControlBlock = false; 4531 while (true) { 4532 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4533 if (!MaybeEntry) { 4534 Error(MaybeEntry.takeError()); 4535 return Failure; 4536 } 4537 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4538 4539 switch (Entry.Kind) { 4540 case llvm::BitstreamEntry::Error: 4541 case llvm::BitstreamEntry::Record: 4542 case llvm::BitstreamEntry::EndBlock: 4543 Error("invalid record at top-level of AST file"); 4544 return Failure; 4545 4546 case llvm::BitstreamEntry::SubBlock: 4547 break; 4548 } 4549 4550 switch (Entry.ID) { 4551 case CONTROL_BLOCK_ID: 4552 HaveReadControlBlock = true; 4553 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) { 4554 case Success: 4555 // Check that we didn't try to load a non-module AST file as a module. 4556 // 4557 // FIXME: Should we also perform the converse check? Loading a module as 4558 // a PCH file sort of works, but it's a bit wonky. 4559 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule || 4560 Type == MK_PrebuiltModule) && 4561 F.ModuleName.empty()) { 4562 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure; 4563 if (Result != OutOfDate || 4564 (ClientLoadCapabilities & ARR_OutOfDate) == 0) 4565 Diag(diag::err_module_file_not_module) << FileName; 4566 return Result; 4567 } 4568 break; 4569 4570 case Failure: return Failure; 4571 case Missing: return Missing; 4572 case OutOfDate: return OutOfDate; 4573 case VersionMismatch: return VersionMismatch; 4574 case ConfigurationMismatch: return ConfigurationMismatch; 4575 case HadErrors: return HadErrors; 4576 } 4577 break; 4578 4579 case AST_BLOCK_ID: 4580 if (!HaveReadControlBlock) { 4581 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 4582 Diag(diag::err_pch_version_too_old); 4583 return VersionMismatch; 4584 } 4585 4586 // Record that we've loaded this module. 4587 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 4588 ShouldFinalizePCM = true; 4589 return Success; 4590 4591 case UNHASHED_CONTROL_BLOCK_ID: 4592 // This block is handled using look-ahead during ReadControlBlock. We 4593 // shouldn't get here! 4594 Error("malformed block record in AST file"); 4595 return Failure; 4596 4597 default: 4598 if (llvm::Error Err = Stream.SkipBlock()) { 4599 Error(std::move(Err)); 4600 return Failure; 4601 } 4602 break; 4603 } 4604 } 4605 4606 llvm_unreachable("unexpected break; expected return"); 4607 } 4608 4609 ASTReader::ASTReadResult 4610 ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy, 4611 unsigned ClientLoadCapabilities) { 4612 const HeaderSearchOptions &HSOpts = 4613 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 4614 bool AllowCompatibleConfigurationMismatch = 4615 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 4616 4617 ASTReadResult Result = readUnhashedControlBlockImpl( 4618 &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch, 4619 Listener.get(), 4620 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions); 4621 4622 // If F was directly imported by another module, it's implicitly validated by 4623 // the importing module. 4624 if (DisableValidation || WasImportedBy || 4625 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 4626 return Success; 4627 4628 if (Result == Failure) { 4629 Error("malformed block record in AST file"); 4630 return Failure; 4631 } 4632 4633 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) { 4634 // If this module has already been finalized in the ModuleCache, we're stuck 4635 // with it; we can only load a single version of each module. 4636 // 4637 // This can happen when a module is imported in two contexts: in one, as a 4638 // user module; in another, as a system module (due to an import from 4639 // another module marked with the [system] flag). It usually indicates a 4640 // bug in the module map: this module should also be marked with [system]. 4641 // 4642 // If -Wno-system-headers (the default), and the first import is as a 4643 // system module, then validation will fail during the as-user import, 4644 // since -Werror flags won't have been validated. However, it's reasonable 4645 // to treat this consistently as a system module. 4646 // 4647 // If -Wsystem-headers, the PCM on disk was built with 4648 // -Wno-system-headers, and the first import is as a user module, then 4649 // validation will fail during the as-system import since the PCM on disk 4650 // doesn't guarantee that -Werror was respected. However, the -Werror 4651 // flags were checked during the initial as-user import. 4652 if (getModuleManager().getModuleCache().isPCMFinal(F.FileName)) { 4653 Diag(diag::warn_module_system_bit_conflict) << F.FileName; 4654 return Success; 4655 } 4656 } 4657 4658 return Result; 4659 } 4660 4661 ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl( 4662 ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities, 4663 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener, 4664 bool ValidateDiagnosticOptions) { 4665 // Initialize a stream. 4666 BitstreamCursor Stream(StreamData); 4667 4668 // Sniff for the signature. 4669 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4670 // FIXME this drops the error on the floor. 4671 consumeError(std::move(Err)); 4672 return Failure; 4673 } 4674 4675 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 4676 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 4677 return Failure; 4678 4679 // Read all of the records in the options block. 4680 RecordData Record; 4681 ASTReadResult Result = Success; 4682 while (true) { 4683 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4684 if (!MaybeEntry) { 4685 // FIXME this drops the error on the floor. 4686 consumeError(MaybeEntry.takeError()); 4687 return Failure; 4688 } 4689 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4690 4691 switch (Entry.Kind) { 4692 case llvm::BitstreamEntry::Error: 4693 case llvm::BitstreamEntry::SubBlock: 4694 return Failure; 4695 4696 case llvm::BitstreamEntry::EndBlock: 4697 return Result; 4698 4699 case llvm::BitstreamEntry::Record: 4700 // The interesting case. 4701 break; 4702 } 4703 4704 // Read and process a record. 4705 Record.clear(); 4706 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 4707 if (!MaybeRecordType) { 4708 // FIXME this drops the error. 4709 return Failure; 4710 } 4711 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) { 4712 case SIGNATURE: 4713 if (F) 4714 std::copy(Record.begin(), Record.end(), F->Signature.data()); 4715 break; 4716 case DIAGNOSTIC_OPTIONS: { 4717 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 4718 if (Listener && ValidateDiagnosticOptions && 4719 !AllowCompatibleConfigurationMismatch && 4720 ParseDiagnosticOptions(Record, Complain, *Listener)) 4721 Result = OutOfDate; // Don't return early. Read the signature. 4722 break; 4723 } 4724 case DIAG_PRAGMA_MAPPINGS: 4725 if (!F) 4726 break; 4727 if (F->PragmaDiagMappings.empty()) 4728 F->PragmaDiagMappings.swap(Record); 4729 else 4730 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(), 4731 Record.begin(), Record.end()); 4732 break; 4733 } 4734 } 4735 } 4736 4737 /// Parse a record and blob containing module file extension metadata. 4738 static bool parseModuleFileExtensionMetadata( 4739 const SmallVectorImpl<uint64_t> &Record, 4740 StringRef Blob, 4741 ModuleFileExtensionMetadata &Metadata) { 4742 if (Record.size() < 4) return true; 4743 4744 Metadata.MajorVersion = Record[0]; 4745 Metadata.MinorVersion = Record[1]; 4746 4747 unsigned BlockNameLen = Record[2]; 4748 unsigned UserInfoLen = Record[3]; 4749 4750 if (BlockNameLen + UserInfoLen > Blob.size()) return true; 4751 4752 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen); 4753 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen, 4754 Blob.data() + BlockNameLen + UserInfoLen); 4755 return false; 4756 } 4757 4758 ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) { 4759 BitstreamCursor &Stream = F.Stream; 4760 4761 RecordData Record; 4762 while (true) { 4763 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4764 if (!MaybeEntry) { 4765 Error(MaybeEntry.takeError()); 4766 return Failure; 4767 } 4768 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4769 4770 switch (Entry.Kind) { 4771 case llvm::BitstreamEntry::SubBlock: 4772 if (llvm::Error Err = Stream.SkipBlock()) { 4773 Error(std::move(Err)); 4774 return Failure; 4775 } 4776 continue; 4777 4778 case llvm::BitstreamEntry::EndBlock: 4779 return Success; 4780 4781 case llvm::BitstreamEntry::Error: 4782 return HadErrors; 4783 4784 case llvm::BitstreamEntry::Record: 4785 break; 4786 } 4787 4788 Record.clear(); 4789 StringRef Blob; 4790 Expected<unsigned> MaybeRecCode = 4791 Stream.readRecord(Entry.ID, Record, &Blob); 4792 if (!MaybeRecCode) { 4793 Error(MaybeRecCode.takeError()); 4794 return Failure; 4795 } 4796 switch (MaybeRecCode.get()) { 4797 case EXTENSION_METADATA: { 4798 ModuleFileExtensionMetadata Metadata; 4799 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) { 4800 Error("malformed EXTENSION_METADATA in AST file"); 4801 return Failure; 4802 } 4803 4804 // Find a module file extension with this block name. 4805 auto Known = ModuleFileExtensions.find(Metadata.BlockName); 4806 if (Known == ModuleFileExtensions.end()) break; 4807 4808 // Form a reader. 4809 if (auto Reader = Known->second->createExtensionReader(Metadata, *this, 4810 F, Stream)) { 4811 F.ExtensionReaders.push_back(std::move(Reader)); 4812 } 4813 4814 break; 4815 } 4816 } 4817 } 4818 4819 return Success; 4820 } 4821 4822 void ASTReader::InitializeContext() { 4823 assert(ContextObj && "no context to initialize"); 4824 ASTContext &Context = *ContextObj; 4825 4826 // If there's a listener, notify them that we "read" the translation unit. 4827 if (DeserializationListener) 4828 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 4829 Context.getTranslationUnitDecl()); 4830 4831 // FIXME: Find a better way to deal with collisions between these 4832 // built-in types. Right now, we just ignore the problem. 4833 4834 // Load the special types. 4835 if (SpecialTypes.size() >= NumSpecialTypeIDs) { 4836 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 4837 if (!Context.CFConstantStringTypeDecl) 4838 Context.setCFConstantStringType(GetType(String)); 4839 } 4840 4841 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 4842 QualType FileType = GetType(File); 4843 if (FileType.isNull()) { 4844 Error("FILE type is NULL"); 4845 return; 4846 } 4847 4848 if (!Context.FILEDecl) { 4849 if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 4850 Context.setFILEDecl(Typedef->getDecl()); 4851 else { 4852 const TagType *Tag = FileType->getAs<TagType>(); 4853 if (!Tag) { 4854 Error("Invalid FILE type in AST file"); 4855 return; 4856 } 4857 Context.setFILEDecl(Tag->getDecl()); 4858 } 4859 } 4860 } 4861 4862 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 4863 QualType Jmp_bufType = GetType(Jmp_buf); 4864 if (Jmp_bufType.isNull()) { 4865 Error("jmp_buf type is NULL"); 4866 return; 4867 } 4868 4869 if (!Context.jmp_bufDecl) { 4870 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 4871 Context.setjmp_bufDecl(Typedef->getDecl()); 4872 else { 4873 const TagType *Tag = Jmp_bufType->getAs<TagType>(); 4874 if (!Tag) { 4875 Error("Invalid jmp_buf type in AST file"); 4876 return; 4877 } 4878 Context.setjmp_bufDecl(Tag->getDecl()); 4879 } 4880 } 4881 } 4882 4883 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 4884 QualType Sigjmp_bufType = GetType(Sigjmp_buf); 4885 if (Sigjmp_bufType.isNull()) { 4886 Error("sigjmp_buf type is NULL"); 4887 return; 4888 } 4889 4890 if (!Context.sigjmp_bufDecl) { 4891 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 4892 Context.setsigjmp_bufDecl(Typedef->getDecl()); 4893 else { 4894 const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 4895 assert(Tag && "Invalid sigjmp_buf type in AST file"); 4896 Context.setsigjmp_bufDecl(Tag->getDecl()); 4897 } 4898 } 4899 } 4900 4901 if (unsigned ObjCIdRedef 4902 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 4903 if (Context.ObjCIdRedefinitionType.isNull()) 4904 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 4905 } 4906 4907 if (unsigned ObjCClassRedef 4908 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 4909 if (Context.ObjCClassRedefinitionType.isNull()) 4910 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 4911 } 4912 4913 if (unsigned ObjCSelRedef 4914 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 4915 if (Context.ObjCSelRedefinitionType.isNull()) 4916 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 4917 } 4918 4919 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 4920 QualType Ucontext_tType = GetType(Ucontext_t); 4921 if (Ucontext_tType.isNull()) { 4922 Error("ucontext_t type is NULL"); 4923 return; 4924 } 4925 4926 if (!Context.ucontext_tDecl) { 4927 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 4928 Context.setucontext_tDecl(Typedef->getDecl()); 4929 else { 4930 const TagType *Tag = Ucontext_tType->getAs<TagType>(); 4931 assert(Tag && "Invalid ucontext_t type in AST file"); 4932 Context.setucontext_tDecl(Tag->getDecl()); 4933 } 4934 } 4935 } 4936 } 4937 4938 ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 4939 4940 // If there were any CUDA special declarations, deserialize them. 4941 if (!CUDASpecialDeclRefs.empty()) { 4942 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 4943 Context.setcudaConfigureCallDecl( 4944 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 4945 } 4946 4947 // Re-export any modules that were imported by a non-module AST file. 4948 // FIXME: This does not make macro-only imports visible again. 4949 for (auto &Import : ImportedModules) { 4950 if (Module *Imported = getSubmodule(Import.ID)) { 4951 makeModuleVisible(Imported, Module::AllVisible, 4952 /*ImportLoc=*/Import.ImportLoc); 4953 if (Import.ImportLoc.isValid()) 4954 PP.makeModuleVisible(Imported, Import.ImportLoc); 4955 // FIXME: should we tell Sema to make the module visible too? 4956 } 4957 } 4958 ImportedModules.clear(); 4959 } 4960 4961 void ASTReader::finalizeForWriting() { 4962 // Nothing to do for now. 4963 } 4964 4965 /// Reads and return the signature record from \p PCH's control block, or 4966 /// else returns 0. 4967 static ASTFileSignature readASTFileSignature(StringRef PCH) { 4968 BitstreamCursor Stream(PCH); 4969 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4970 // FIXME this drops the error on the floor. 4971 consumeError(std::move(Err)); 4972 return ASTFileSignature(); 4973 } 4974 4975 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 4976 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 4977 return ASTFileSignature(); 4978 4979 // Scan for SIGNATURE inside the diagnostic options block. 4980 ASTReader::RecordData Record; 4981 while (true) { 4982 Expected<llvm::BitstreamEntry> MaybeEntry = 4983 Stream.advanceSkippingSubblocks(); 4984 if (!MaybeEntry) { 4985 // FIXME this drops the error on the floor. 4986 consumeError(MaybeEntry.takeError()); 4987 return ASTFileSignature(); 4988 } 4989 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4990 4991 if (Entry.Kind != llvm::BitstreamEntry::Record) 4992 return ASTFileSignature(); 4993 4994 Record.clear(); 4995 StringRef Blob; 4996 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 4997 if (!MaybeRecord) { 4998 // FIXME this drops the error on the floor. 4999 consumeError(MaybeRecord.takeError()); 5000 return ASTFileSignature(); 5001 } 5002 if (SIGNATURE == MaybeRecord.get()) 5003 return {{{(uint32_t)Record[0], (uint32_t)Record[1], (uint32_t)Record[2], 5004 (uint32_t)Record[3], (uint32_t)Record[4]}}}; 5005 } 5006 } 5007 5008 /// Retrieve the name of the original source file name 5009 /// directly from the AST file, without actually loading the AST 5010 /// file. 5011 std::string ASTReader::getOriginalSourceFile( 5012 const std::string &ASTFileName, FileManager &FileMgr, 5013 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) { 5014 // Open the AST file. 5015 auto Buffer = FileMgr.getBufferForFile(ASTFileName); 5016 if (!Buffer) { 5017 Diags.Report(diag::err_fe_unable_to_read_pch_file) 5018 << ASTFileName << Buffer.getError().message(); 5019 return std::string(); 5020 } 5021 5022 // Initialize the stream 5023 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer)); 5024 5025 // Sniff for the signature. 5026 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5027 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err); 5028 return std::string(); 5029 } 5030 5031 // Scan for the CONTROL_BLOCK_ID block. 5032 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 5033 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5034 return std::string(); 5035 } 5036 5037 // Scan for ORIGINAL_FILE inside the control block. 5038 RecordData Record; 5039 while (true) { 5040 Expected<llvm::BitstreamEntry> MaybeEntry = 5041 Stream.advanceSkippingSubblocks(); 5042 if (!MaybeEntry) { 5043 // FIXME this drops errors on the floor. 5044 consumeError(MaybeEntry.takeError()); 5045 return std::string(); 5046 } 5047 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5048 5049 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 5050 return std::string(); 5051 5052 if (Entry.Kind != llvm::BitstreamEntry::Record) { 5053 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5054 return std::string(); 5055 } 5056 5057 Record.clear(); 5058 StringRef Blob; 5059 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5060 if (!MaybeRecord) { 5061 // FIXME this drops the errors on the floor. 5062 consumeError(MaybeRecord.takeError()); 5063 return std::string(); 5064 } 5065 if (ORIGINAL_FILE == MaybeRecord.get()) 5066 return Blob.str(); 5067 } 5068 } 5069 5070 namespace { 5071 5072 class SimplePCHValidator : public ASTReaderListener { 5073 const LangOptions &ExistingLangOpts; 5074 const TargetOptions &ExistingTargetOpts; 5075 const PreprocessorOptions &ExistingPPOpts; 5076 std::string ExistingModuleCachePath; 5077 FileManager &FileMgr; 5078 5079 public: 5080 SimplePCHValidator(const LangOptions &ExistingLangOpts, 5081 const TargetOptions &ExistingTargetOpts, 5082 const PreprocessorOptions &ExistingPPOpts, 5083 StringRef ExistingModuleCachePath, FileManager &FileMgr) 5084 : ExistingLangOpts(ExistingLangOpts), 5085 ExistingTargetOpts(ExistingTargetOpts), 5086 ExistingPPOpts(ExistingPPOpts), 5087 ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr) {} 5088 5089 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, 5090 bool AllowCompatibleDifferences) override { 5091 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr, 5092 AllowCompatibleDifferences); 5093 } 5094 5095 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, 5096 bool AllowCompatibleDifferences) override { 5097 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr, 5098 AllowCompatibleDifferences); 5099 } 5100 5101 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 5102 StringRef SpecificModuleCachePath, 5103 bool Complain) override { 5104 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5105 ExistingModuleCachePath, 5106 nullptr, ExistingLangOpts); 5107 } 5108 5109 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 5110 bool Complain, 5111 std::string &SuggestedPredefines) override { 5112 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr, 5113 SuggestedPredefines, ExistingLangOpts); 5114 } 5115 }; 5116 5117 } // namespace 5118 5119 bool ASTReader::readASTFileControlBlock( 5120 StringRef Filename, FileManager &FileMgr, 5121 const PCHContainerReader &PCHContainerRdr, 5122 bool FindModuleFileExtensions, 5123 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) { 5124 // Open the AST file. 5125 // FIXME: This allows use of the VFS; we do not allow use of the 5126 // VFS when actually loading a module. 5127 auto Buffer = FileMgr.getBufferForFile(Filename); 5128 if (!Buffer) { 5129 return true; 5130 } 5131 5132 // Initialize the stream 5133 StringRef Bytes = PCHContainerRdr.ExtractPCH(**Buffer); 5134 BitstreamCursor Stream(Bytes); 5135 5136 // Sniff for the signature. 5137 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5138 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 5139 return true; 5140 } 5141 5142 // Scan for the CONTROL_BLOCK_ID block. 5143 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 5144 return true; 5145 5146 bool NeedsInputFiles = Listener.needsInputFileVisitation(); 5147 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation(); 5148 bool NeedsImports = Listener.needsImportVisitation(); 5149 BitstreamCursor InputFilesCursor; 5150 5151 RecordData Record; 5152 std::string ModuleDir; 5153 bool DoneWithControlBlock = false; 5154 while (!DoneWithControlBlock) { 5155 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5156 if (!MaybeEntry) { 5157 // FIXME this drops the error on the floor. 5158 consumeError(MaybeEntry.takeError()); 5159 return true; 5160 } 5161 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5162 5163 switch (Entry.Kind) { 5164 case llvm::BitstreamEntry::SubBlock: { 5165 switch (Entry.ID) { 5166 case OPTIONS_BLOCK_ID: { 5167 std::string IgnoredSuggestedPredefines; 5168 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate, 5169 /*AllowCompatibleConfigurationMismatch*/ false, 5170 Listener, IgnoredSuggestedPredefines) != Success) 5171 return true; 5172 break; 5173 } 5174 5175 case INPUT_FILES_BLOCK_ID: 5176 InputFilesCursor = Stream; 5177 if (llvm::Error Err = Stream.SkipBlock()) { 5178 // FIXME this drops the error on the floor. 5179 consumeError(std::move(Err)); 5180 return true; 5181 } 5182 if (NeedsInputFiles && 5183 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID)) 5184 return true; 5185 break; 5186 5187 default: 5188 if (llvm::Error Err = Stream.SkipBlock()) { 5189 // FIXME this drops the error on the floor. 5190 consumeError(std::move(Err)); 5191 return true; 5192 } 5193 break; 5194 } 5195 5196 continue; 5197 } 5198 5199 case llvm::BitstreamEntry::EndBlock: 5200 DoneWithControlBlock = true; 5201 break; 5202 5203 case llvm::BitstreamEntry::Error: 5204 return true; 5205 5206 case llvm::BitstreamEntry::Record: 5207 break; 5208 } 5209 5210 if (DoneWithControlBlock) break; 5211 5212 Record.clear(); 5213 StringRef Blob; 5214 Expected<unsigned> MaybeRecCode = 5215 Stream.readRecord(Entry.ID, Record, &Blob); 5216 if (!MaybeRecCode) { 5217 // FIXME this drops the error. 5218 return Failure; 5219 } 5220 switch ((ControlRecordTypes)MaybeRecCode.get()) { 5221 case METADATA: 5222 if (Record[0] != VERSION_MAJOR) 5223 return true; 5224 if (Listener.ReadFullVersionInformation(Blob)) 5225 return true; 5226 break; 5227 case MODULE_NAME: 5228 Listener.ReadModuleName(Blob); 5229 break; 5230 case MODULE_DIRECTORY: 5231 ModuleDir = std::string(Blob); 5232 break; 5233 case MODULE_MAP_FILE: { 5234 unsigned Idx = 0; 5235 auto Path = ReadString(Record, Idx); 5236 ResolveImportedPath(Path, ModuleDir); 5237 Listener.ReadModuleMapFile(Path); 5238 break; 5239 } 5240 case INPUT_FILE_OFFSETS: { 5241 if (!NeedsInputFiles) 5242 break; 5243 5244 unsigned NumInputFiles = Record[0]; 5245 unsigned NumUserFiles = Record[1]; 5246 const llvm::support::unaligned_uint64_t *InputFileOffs = 5247 (const llvm::support::unaligned_uint64_t *)Blob.data(); 5248 for (unsigned I = 0; I != NumInputFiles; ++I) { 5249 // Go find this input file. 5250 bool isSystemFile = I >= NumUserFiles; 5251 5252 if (isSystemFile && !NeedsSystemInputFiles) 5253 break; // the rest are system input files 5254 5255 BitstreamCursor &Cursor = InputFilesCursor; 5256 SavedStreamPosition SavedPosition(Cursor); 5257 if (llvm::Error Err = Cursor.JumpToBit(InputFileOffs[I])) { 5258 // FIXME this drops errors on the floor. 5259 consumeError(std::move(Err)); 5260 } 5261 5262 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 5263 if (!MaybeCode) { 5264 // FIXME this drops errors on the floor. 5265 consumeError(MaybeCode.takeError()); 5266 } 5267 unsigned Code = MaybeCode.get(); 5268 5269 RecordData Record; 5270 StringRef Blob; 5271 bool shouldContinue = false; 5272 Expected<unsigned> MaybeRecordType = 5273 Cursor.readRecord(Code, Record, &Blob); 5274 if (!MaybeRecordType) { 5275 // FIXME this drops errors on the floor. 5276 consumeError(MaybeRecordType.takeError()); 5277 } 5278 switch ((InputFileRecordTypes)MaybeRecordType.get()) { 5279 case INPUT_FILE_HASH: 5280 break; 5281 case INPUT_FILE: 5282 bool Overridden = static_cast<bool>(Record[3]); 5283 std::string Filename = std::string(Blob); 5284 ResolveImportedPath(Filename, ModuleDir); 5285 shouldContinue = Listener.visitInputFile( 5286 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false); 5287 break; 5288 } 5289 if (!shouldContinue) 5290 break; 5291 } 5292 break; 5293 } 5294 5295 case IMPORTS: { 5296 if (!NeedsImports) 5297 break; 5298 5299 unsigned Idx = 0, N = Record.size(); 5300 while (Idx < N) { 5301 // Read information about the AST file. 5302 Idx += 1+1+1+1+5; // Kind, ImportLoc, Size, ModTime, Signature 5303 std::string ModuleName = ReadString(Record, Idx); 5304 std::string Filename = ReadString(Record, Idx); 5305 ResolveImportedPath(Filename, ModuleDir); 5306 Listener.visitImport(ModuleName, Filename); 5307 } 5308 break; 5309 } 5310 5311 default: 5312 // No other validation to perform. 5313 break; 5314 } 5315 } 5316 5317 // Look for module file extension blocks, if requested. 5318 if (FindModuleFileExtensions) { 5319 BitstreamCursor SavedStream = Stream; 5320 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) { 5321 bool DoneWithExtensionBlock = false; 5322 while (!DoneWithExtensionBlock) { 5323 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5324 if (!MaybeEntry) { 5325 // FIXME this drops the error. 5326 return true; 5327 } 5328 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5329 5330 switch (Entry.Kind) { 5331 case llvm::BitstreamEntry::SubBlock: 5332 if (llvm::Error Err = Stream.SkipBlock()) { 5333 // FIXME this drops the error on the floor. 5334 consumeError(std::move(Err)); 5335 return true; 5336 } 5337 continue; 5338 5339 case llvm::BitstreamEntry::EndBlock: 5340 DoneWithExtensionBlock = true; 5341 continue; 5342 5343 case llvm::BitstreamEntry::Error: 5344 return true; 5345 5346 case llvm::BitstreamEntry::Record: 5347 break; 5348 } 5349 5350 Record.clear(); 5351 StringRef Blob; 5352 Expected<unsigned> MaybeRecCode = 5353 Stream.readRecord(Entry.ID, Record, &Blob); 5354 if (!MaybeRecCode) { 5355 // FIXME this drops the error. 5356 return true; 5357 } 5358 switch (MaybeRecCode.get()) { 5359 case EXTENSION_METADATA: { 5360 ModuleFileExtensionMetadata Metadata; 5361 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 5362 return true; 5363 5364 Listener.readModuleFileExtension(Metadata); 5365 break; 5366 } 5367 } 5368 } 5369 } 5370 Stream = SavedStream; 5371 } 5372 5373 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 5374 if (readUnhashedControlBlockImpl( 5375 nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate, 5376 /*AllowCompatibleConfigurationMismatch*/ false, &Listener, 5377 ValidateDiagnosticOptions) != Success) 5378 return true; 5379 5380 return false; 5381 } 5382 5383 bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, 5384 const PCHContainerReader &PCHContainerRdr, 5385 const LangOptions &LangOpts, 5386 const TargetOptions &TargetOpts, 5387 const PreprocessorOptions &PPOpts, 5388 StringRef ExistingModuleCachePath) { 5389 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, 5390 ExistingModuleCachePath, FileMgr); 5391 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr, 5392 /*FindModuleFileExtensions=*/false, 5393 validator, 5394 /*ValidateDiagnosticOptions=*/true); 5395 } 5396 5397 ASTReader::ASTReadResult 5398 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 5399 // Enter the submodule block. 5400 if (llvm::Error Err = F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) { 5401 Error(std::move(Err)); 5402 return Failure; 5403 } 5404 5405 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 5406 bool First = true; 5407 Module *CurrentModule = nullptr; 5408 RecordData Record; 5409 while (true) { 5410 Expected<llvm::BitstreamEntry> MaybeEntry = 5411 F.Stream.advanceSkippingSubblocks(); 5412 if (!MaybeEntry) { 5413 Error(MaybeEntry.takeError()); 5414 return Failure; 5415 } 5416 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5417 5418 switch (Entry.Kind) { 5419 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 5420 case llvm::BitstreamEntry::Error: 5421 Error("malformed block record in AST file"); 5422 return Failure; 5423 case llvm::BitstreamEntry::EndBlock: 5424 return Success; 5425 case llvm::BitstreamEntry::Record: 5426 // The interesting case. 5427 break; 5428 } 5429 5430 // Read a record. 5431 StringRef Blob; 5432 Record.clear(); 5433 Expected<unsigned> MaybeKind = F.Stream.readRecord(Entry.ID, Record, &Blob); 5434 if (!MaybeKind) { 5435 Error(MaybeKind.takeError()); 5436 return Failure; 5437 } 5438 unsigned Kind = MaybeKind.get(); 5439 5440 if ((Kind == SUBMODULE_METADATA) != First) { 5441 Error("submodule metadata record should be at beginning of block"); 5442 return Failure; 5443 } 5444 First = false; 5445 5446 // Submodule information is only valid if we have a current module. 5447 // FIXME: Should we error on these cases? 5448 if (!CurrentModule && Kind != SUBMODULE_METADATA && 5449 Kind != SUBMODULE_DEFINITION) 5450 continue; 5451 5452 switch (Kind) { 5453 default: // Default behavior: ignore. 5454 break; 5455 5456 case SUBMODULE_DEFINITION: { 5457 if (Record.size() < 12) { 5458 Error("malformed module definition"); 5459 return Failure; 5460 } 5461 5462 StringRef Name = Blob; 5463 unsigned Idx = 0; 5464 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]); 5465 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]); 5466 Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++]; 5467 bool IsFramework = Record[Idx++]; 5468 bool IsExplicit = Record[Idx++]; 5469 bool IsSystem = Record[Idx++]; 5470 bool IsExternC = Record[Idx++]; 5471 bool InferSubmodules = Record[Idx++]; 5472 bool InferExplicitSubmodules = Record[Idx++]; 5473 bool InferExportWildcard = Record[Idx++]; 5474 bool ConfigMacrosExhaustive = Record[Idx++]; 5475 bool ModuleMapIsPrivate = Record[Idx++]; 5476 5477 Module *ParentModule = nullptr; 5478 if (Parent) 5479 ParentModule = getSubmodule(Parent); 5480 5481 // Retrieve this (sub)module from the module map, creating it if 5482 // necessary. 5483 CurrentModule = 5484 ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit) 5485 .first; 5486 5487 // FIXME: set the definition loc for CurrentModule, or call 5488 // ModMap.setInferredModuleAllowedBy() 5489 5490 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 5491 if (GlobalIndex >= SubmodulesLoaded.size() || 5492 SubmodulesLoaded[GlobalIndex]) { 5493 Error("too many submodules"); 5494 return Failure; 5495 } 5496 5497 if (!ParentModule) { 5498 if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 5499 // Don't emit module relocation error if we have -fno-validate-pch 5500 if (!PP.getPreprocessorOpts().DisablePCHValidation && 5501 CurFile != F.File) { 5502 Error(diag::err_module_file_conflict, 5503 CurrentModule->getTopLevelModuleName(), CurFile->getName(), 5504 F.File->getName()); 5505 return Failure; 5506 } 5507 } 5508 5509 F.DidReadTopLevelSubmodule = true; 5510 CurrentModule->setASTFile(F.File); 5511 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath; 5512 } 5513 5514 CurrentModule->Kind = Kind; 5515 CurrentModule->Signature = F.Signature; 5516 CurrentModule->IsFromModuleFile = true; 5517 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 5518 CurrentModule->IsExternC = IsExternC; 5519 CurrentModule->InferSubmodules = InferSubmodules; 5520 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 5521 CurrentModule->InferExportWildcard = InferExportWildcard; 5522 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive; 5523 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate; 5524 if (DeserializationListener) 5525 DeserializationListener->ModuleRead(GlobalID, CurrentModule); 5526 5527 SubmodulesLoaded[GlobalIndex] = CurrentModule; 5528 5529 // Clear out data that will be replaced by what is in the module file. 5530 CurrentModule->LinkLibraries.clear(); 5531 CurrentModule->ConfigMacros.clear(); 5532 CurrentModule->UnresolvedConflicts.clear(); 5533 CurrentModule->Conflicts.clear(); 5534 5535 // The module is available unless it's missing a requirement; relevant 5536 // requirements will be (re-)added by SUBMODULE_REQUIRES records. 5537 // Missing headers that were present when the module was built do not 5538 // make it unavailable -- if we got this far, this must be an explicitly 5539 // imported module file. 5540 CurrentModule->Requirements.clear(); 5541 CurrentModule->MissingHeaders.clear(); 5542 CurrentModule->IsMissingRequirement = 5543 ParentModule && ParentModule->IsMissingRequirement; 5544 CurrentModule->IsAvailable = !CurrentModule->IsMissingRequirement; 5545 break; 5546 } 5547 5548 case SUBMODULE_UMBRELLA_HEADER: { 5549 std::string Filename = std::string(Blob); 5550 ResolveImportedPath(F, Filename); 5551 if (auto Umbrella = PP.getFileManager().getFile(Filename)) { 5552 if (!CurrentModule->getUmbrellaHeader()) 5553 ModMap.setUmbrellaHeader(CurrentModule, *Umbrella, Blob); 5554 else if (CurrentModule->getUmbrellaHeader().Entry != *Umbrella) { 5555 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 5556 Error("mismatched umbrella headers in submodule"); 5557 return OutOfDate; 5558 } 5559 } 5560 break; 5561 } 5562 5563 case SUBMODULE_HEADER: 5564 case SUBMODULE_EXCLUDED_HEADER: 5565 case SUBMODULE_PRIVATE_HEADER: 5566 // We lazily associate headers with their modules via the HeaderInfo table. 5567 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 5568 // of complete filenames or remove it entirely. 5569 break; 5570 5571 case SUBMODULE_TEXTUAL_HEADER: 5572 case SUBMODULE_PRIVATE_TEXTUAL_HEADER: 5573 // FIXME: Textual headers are not marked in the HeaderInfo table. Load 5574 // them here. 5575 break; 5576 5577 case SUBMODULE_TOPHEADER: 5578 CurrentModule->addTopHeaderFilename(Blob); 5579 break; 5580 5581 case SUBMODULE_UMBRELLA_DIR: { 5582 std::string Dirname = std::string(Blob); 5583 ResolveImportedPath(F, Dirname); 5584 if (auto Umbrella = PP.getFileManager().getDirectory(Dirname)) { 5585 if (!CurrentModule->getUmbrellaDir()) 5586 ModMap.setUmbrellaDir(CurrentModule, *Umbrella, Blob); 5587 else if (CurrentModule->getUmbrellaDir().Entry != *Umbrella) { 5588 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 5589 Error("mismatched umbrella directories in submodule"); 5590 return OutOfDate; 5591 } 5592 } 5593 break; 5594 } 5595 5596 case SUBMODULE_METADATA: { 5597 F.BaseSubmoduleID = getTotalNumSubmodules(); 5598 F.LocalNumSubmodules = Record[0]; 5599 unsigned LocalBaseSubmoduleID = Record[1]; 5600 if (F.LocalNumSubmodules > 0) { 5601 // Introduce the global -> local mapping for submodules within this 5602 // module. 5603 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 5604 5605 // Introduce the local -> global mapping for submodules within this 5606 // module. 5607 F.SubmoduleRemap.insertOrReplace( 5608 std::make_pair(LocalBaseSubmoduleID, 5609 F.BaseSubmoduleID - LocalBaseSubmoduleID)); 5610 5611 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 5612 } 5613 break; 5614 } 5615 5616 case SUBMODULE_IMPORTS: 5617 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 5618 UnresolvedModuleRef Unresolved; 5619 Unresolved.File = &F; 5620 Unresolved.Mod = CurrentModule; 5621 Unresolved.ID = Record[Idx]; 5622 Unresolved.Kind = UnresolvedModuleRef::Import; 5623 Unresolved.IsWildcard = false; 5624 UnresolvedModuleRefs.push_back(Unresolved); 5625 } 5626 break; 5627 5628 case SUBMODULE_EXPORTS: 5629 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 5630 UnresolvedModuleRef Unresolved; 5631 Unresolved.File = &F; 5632 Unresolved.Mod = CurrentModule; 5633 Unresolved.ID = Record[Idx]; 5634 Unresolved.Kind = UnresolvedModuleRef::Export; 5635 Unresolved.IsWildcard = Record[Idx + 1]; 5636 UnresolvedModuleRefs.push_back(Unresolved); 5637 } 5638 5639 // Once we've loaded the set of exports, there's no reason to keep 5640 // the parsed, unresolved exports around. 5641 CurrentModule->UnresolvedExports.clear(); 5642 break; 5643 5644 case SUBMODULE_REQUIRES: 5645 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(), 5646 PP.getTargetInfo()); 5647 break; 5648 5649 case SUBMODULE_LINK_LIBRARY: 5650 ModMap.resolveLinkAsDependencies(CurrentModule); 5651 CurrentModule->LinkLibraries.push_back( 5652 Module::LinkLibrary(std::string(Blob), Record[0])); 5653 break; 5654 5655 case SUBMODULE_CONFIG_MACRO: 5656 CurrentModule->ConfigMacros.push_back(Blob.str()); 5657 break; 5658 5659 case SUBMODULE_CONFLICT: { 5660 UnresolvedModuleRef Unresolved; 5661 Unresolved.File = &F; 5662 Unresolved.Mod = CurrentModule; 5663 Unresolved.ID = Record[0]; 5664 Unresolved.Kind = UnresolvedModuleRef::Conflict; 5665 Unresolved.IsWildcard = false; 5666 Unresolved.String = Blob; 5667 UnresolvedModuleRefs.push_back(Unresolved); 5668 break; 5669 } 5670 5671 case SUBMODULE_INITIALIZERS: { 5672 if (!ContextObj) 5673 break; 5674 SmallVector<uint32_t, 16> Inits; 5675 for (auto &ID : Record) 5676 Inits.push_back(getGlobalDeclID(F, ID)); 5677 ContextObj->addLazyModuleInitializers(CurrentModule, Inits); 5678 break; 5679 } 5680 5681 case SUBMODULE_EXPORT_AS: 5682 CurrentModule->ExportAsModule = Blob.str(); 5683 ModMap.addLinkAsDependency(CurrentModule); 5684 break; 5685 } 5686 } 5687 } 5688 5689 /// Parse the record that corresponds to a LangOptions data 5690 /// structure. 5691 /// 5692 /// This routine parses the language options from the AST file and then gives 5693 /// them to the AST listener if one is set. 5694 /// 5695 /// \returns true if the listener deems the file unacceptable, false otherwise. 5696 bool ASTReader::ParseLanguageOptions(const RecordData &Record, 5697 bool Complain, 5698 ASTReaderListener &Listener, 5699 bool AllowCompatibleDifferences) { 5700 LangOptions LangOpts; 5701 unsigned Idx = 0; 5702 #define LANGOPT(Name, Bits, Default, Description) \ 5703 LangOpts.Name = Record[Idx++]; 5704 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 5705 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 5706 #include "clang/Basic/LangOptions.def" 5707 #define SANITIZER(NAME, ID) \ 5708 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]); 5709 #include "clang/Basic/Sanitizers.def" 5710 5711 for (unsigned N = Record[Idx++]; N; --N) 5712 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx)); 5713 5714 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 5715 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 5716 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 5717 5718 LangOpts.CurrentModule = ReadString(Record, Idx); 5719 5720 // Comment options. 5721 for (unsigned N = Record[Idx++]; N; --N) { 5722 LangOpts.CommentOpts.BlockCommandNames.push_back( 5723 ReadString(Record, Idx)); 5724 } 5725 LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 5726 5727 // OpenMP offloading options. 5728 for (unsigned N = Record[Idx++]; N; --N) { 5729 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx))); 5730 } 5731 5732 LangOpts.OMPHostIRFile = ReadString(Record, Idx); 5733 5734 return Listener.ReadLanguageOptions(LangOpts, Complain, 5735 AllowCompatibleDifferences); 5736 } 5737 5738 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain, 5739 ASTReaderListener &Listener, 5740 bool AllowCompatibleDifferences) { 5741 unsigned Idx = 0; 5742 TargetOptions TargetOpts; 5743 TargetOpts.Triple = ReadString(Record, Idx); 5744 TargetOpts.CPU = ReadString(Record, Idx); 5745 TargetOpts.ABI = ReadString(Record, Idx); 5746 for (unsigned N = Record[Idx++]; N; --N) { 5747 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 5748 } 5749 for (unsigned N = Record[Idx++]; N; --N) { 5750 TargetOpts.Features.push_back(ReadString(Record, Idx)); 5751 } 5752 5753 return Listener.ReadTargetOptions(TargetOpts, Complain, 5754 AllowCompatibleDifferences); 5755 } 5756 5757 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 5758 ASTReaderListener &Listener) { 5759 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); 5760 unsigned Idx = 0; 5761 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++]; 5762 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 5763 DiagOpts->set##Name(static_cast<Type>(Record[Idx++])); 5764 #include "clang/Basic/DiagnosticOptions.def" 5765 5766 for (unsigned N = Record[Idx++]; N; --N) 5767 DiagOpts->Warnings.push_back(ReadString(Record, Idx)); 5768 for (unsigned N = Record[Idx++]; N; --N) 5769 DiagOpts->Remarks.push_back(ReadString(Record, Idx)); 5770 5771 return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 5772 } 5773 5774 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 5775 ASTReaderListener &Listener) { 5776 FileSystemOptions FSOpts; 5777 unsigned Idx = 0; 5778 FSOpts.WorkingDir = ReadString(Record, Idx); 5779 return Listener.ReadFileSystemOptions(FSOpts, Complain); 5780 } 5781 5782 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 5783 bool Complain, 5784 ASTReaderListener &Listener) { 5785 HeaderSearchOptions HSOpts; 5786 unsigned Idx = 0; 5787 HSOpts.Sysroot = ReadString(Record, Idx); 5788 5789 // Include entries. 5790 for (unsigned N = Record[Idx++]; N; --N) { 5791 std::string Path = ReadString(Record, Idx); 5792 frontend::IncludeDirGroup Group 5793 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 5794 bool IsFramework = Record[Idx++]; 5795 bool IgnoreSysRoot = Record[Idx++]; 5796 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework, 5797 IgnoreSysRoot); 5798 } 5799 5800 // System header prefixes. 5801 for (unsigned N = Record[Idx++]; N; --N) { 5802 std::string Prefix = ReadString(Record, Idx); 5803 bool IsSystemHeader = Record[Idx++]; 5804 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader); 5805 } 5806 5807 HSOpts.ResourceDir = ReadString(Record, Idx); 5808 HSOpts.ModuleCachePath = ReadString(Record, Idx); 5809 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx); 5810 HSOpts.DisableModuleHash = Record[Idx++]; 5811 HSOpts.ImplicitModuleMaps = Record[Idx++]; 5812 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++]; 5813 HSOpts.UseBuiltinIncludes = Record[Idx++]; 5814 HSOpts.UseStandardSystemIncludes = Record[Idx++]; 5815 HSOpts.UseStandardCXXIncludes = Record[Idx++]; 5816 HSOpts.UseLibcxx = Record[Idx++]; 5817 std::string SpecificModuleCachePath = ReadString(Record, Idx); 5818 5819 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5820 Complain); 5821 } 5822 5823 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 5824 bool Complain, 5825 ASTReaderListener &Listener, 5826 std::string &SuggestedPredefines) { 5827 PreprocessorOptions PPOpts; 5828 unsigned Idx = 0; 5829 5830 // Macro definitions/undefs 5831 for (unsigned N = Record[Idx++]; N; --N) { 5832 std::string Macro = ReadString(Record, Idx); 5833 bool IsUndef = Record[Idx++]; 5834 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 5835 } 5836 5837 // Includes 5838 for (unsigned N = Record[Idx++]; N; --N) { 5839 PPOpts.Includes.push_back(ReadString(Record, Idx)); 5840 } 5841 5842 // Macro Includes 5843 for (unsigned N = Record[Idx++]; N; --N) { 5844 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 5845 } 5846 5847 PPOpts.UsePredefines = Record[Idx++]; 5848 PPOpts.DetailedRecord = Record[Idx++]; 5849 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 5850 PPOpts.ObjCXXARCStandardLibrary = 5851 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 5852 SuggestedPredefines.clear(); 5853 return Listener.ReadPreprocessorOptions(PPOpts, Complain, 5854 SuggestedPredefines); 5855 } 5856 5857 std::pair<ModuleFile *, unsigned> 5858 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 5859 GlobalPreprocessedEntityMapType::iterator 5860 I = GlobalPreprocessedEntityMap.find(GlobalIndex); 5861 assert(I != GlobalPreprocessedEntityMap.end() && 5862 "Corrupted global preprocessed entity map"); 5863 ModuleFile *M = I->second; 5864 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 5865 return std::make_pair(M, LocalIndex); 5866 } 5867 5868 llvm::iterator_range<PreprocessingRecord::iterator> 5869 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 5870 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 5871 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 5872 Mod.NumPreprocessedEntities); 5873 5874 return llvm::make_range(PreprocessingRecord::iterator(), 5875 PreprocessingRecord::iterator()); 5876 } 5877 5878 llvm::iterator_range<ASTReader::ModuleDeclIterator> 5879 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 5880 return llvm::make_range( 5881 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 5882 ModuleDeclIterator(this, &Mod, 5883 Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 5884 } 5885 5886 SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) { 5887 auto I = GlobalSkippedRangeMap.find(GlobalIndex); 5888 assert(I != GlobalSkippedRangeMap.end() && 5889 "Corrupted global skipped range map"); 5890 ModuleFile *M = I->second; 5891 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID; 5892 assert(LocalIndex < M->NumPreprocessedSkippedRanges); 5893 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex]; 5894 SourceRange Range(TranslateSourceLocation(*M, RawRange.getBegin()), 5895 TranslateSourceLocation(*M, RawRange.getEnd())); 5896 assert(Range.isValid()); 5897 return Range; 5898 } 5899 5900 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 5901 PreprocessedEntityID PPID = Index+1; 5902 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 5903 ModuleFile &M = *PPInfo.first; 5904 unsigned LocalIndex = PPInfo.second; 5905 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 5906 5907 if (!PP.getPreprocessingRecord()) { 5908 Error("no preprocessing record"); 5909 return nullptr; 5910 } 5911 5912 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 5913 if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit( 5914 M.MacroOffsetsBase + PPOffs.BitOffset)) { 5915 Error(std::move(Err)); 5916 return nullptr; 5917 } 5918 5919 Expected<llvm::BitstreamEntry> MaybeEntry = 5920 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 5921 if (!MaybeEntry) { 5922 Error(MaybeEntry.takeError()); 5923 return nullptr; 5924 } 5925 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5926 5927 if (Entry.Kind != llvm::BitstreamEntry::Record) 5928 return nullptr; 5929 5930 // Read the record. 5931 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()), 5932 TranslateSourceLocation(M, PPOffs.getEnd())); 5933 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 5934 StringRef Blob; 5935 RecordData Record; 5936 Expected<unsigned> MaybeRecType = 5937 M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob); 5938 if (!MaybeRecType) { 5939 Error(MaybeRecType.takeError()); 5940 return nullptr; 5941 } 5942 switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) { 5943 case PPD_MACRO_EXPANSION: { 5944 bool isBuiltin = Record[0]; 5945 IdentifierInfo *Name = nullptr; 5946 MacroDefinitionRecord *Def = nullptr; 5947 if (isBuiltin) 5948 Name = getLocalIdentifier(M, Record[1]); 5949 else { 5950 PreprocessedEntityID GlobalID = 5951 getGlobalPreprocessedEntityID(M, Record[1]); 5952 Def = cast<MacroDefinitionRecord>( 5953 PPRec.getLoadedPreprocessedEntity(GlobalID - 1)); 5954 } 5955 5956 MacroExpansion *ME; 5957 if (isBuiltin) 5958 ME = new (PPRec) MacroExpansion(Name, Range); 5959 else 5960 ME = new (PPRec) MacroExpansion(Def, Range); 5961 5962 return ME; 5963 } 5964 5965 case PPD_MACRO_DEFINITION: { 5966 // Decode the identifier info and then check again; if the macro is 5967 // still defined and associated with the identifier, 5968 IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 5969 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range); 5970 5971 if (DeserializationListener) 5972 DeserializationListener->MacroDefinitionRead(PPID, MD); 5973 5974 return MD; 5975 } 5976 5977 case PPD_INCLUSION_DIRECTIVE: { 5978 const char *FullFileNameStart = Blob.data() + Record[0]; 5979 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 5980 const FileEntry *File = nullptr; 5981 if (!FullFileName.empty()) 5982 if (auto FE = PP.getFileManager().getFile(FullFileName)) 5983 File = *FE; 5984 5985 // FIXME: Stable encoding 5986 InclusionDirective::InclusionKind Kind 5987 = static_cast<InclusionDirective::InclusionKind>(Record[2]); 5988 InclusionDirective *ID 5989 = new (PPRec) InclusionDirective(PPRec, Kind, 5990 StringRef(Blob.data(), Record[0]), 5991 Record[1], Record[3], 5992 File, 5993 Range); 5994 return ID; 5995 } 5996 } 5997 5998 llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 5999 } 6000 6001 /// Find the next module that contains entities and return the ID 6002 /// of the first entry. 6003 /// 6004 /// \param SLocMapI points at a chunk of a module that contains no 6005 /// preprocessed entities or the entities it contains are not the ones we are 6006 /// looking for. 6007 PreprocessedEntityID ASTReader::findNextPreprocessedEntity( 6008 GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 6009 ++SLocMapI; 6010 for (GlobalSLocOffsetMapType::const_iterator 6011 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 6012 ModuleFile &M = *SLocMapI->second; 6013 if (M.NumPreprocessedEntities) 6014 return M.BasePreprocessedEntityID; 6015 } 6016 6017 return getTotalNumPreprocessedEntities(); 6018 } 6019 6020 namespace { 6021 6022 struct PPEntityComp { 6023 const ASTReader &Reader; 6024 ModuleFile &M; 6025 6026 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {} 6027 6028 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 6029 SourceLocation LHS = getLoc(L); 6030 SourceLocation RHS = getLoc(R); 6031 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6032 } 6033 6034 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 6035 SourceLocation LHS = getLoc(L); 6036 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6037 } 6038 6039 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 6040 SourceLocation RHS = getLoc(R); 6041 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6042 } 6043 6044 SourceLocation getLoc(const PPEntityOffset &PPE) const { 6045 return Reader.TranslateSourceLocation(M, PPE.getBegin()); 6046 } 6047 }; 6048 6049 } // namespace 6050 6051 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc, 6052 bool EndsAfter) const { 6053 if (SourceMgr.isLocalSourceLocation(Loc)) 6054 return getTotalNumPreprocessedEntities(); 6055 6056 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find( 6057 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1); 6058 assert(SLocMapI != GlobalSLocOffsetMap.end() && 6059 "Corrupted global sloc offset map"); 6060 6061 if (SLocMapI->second->NumPreprocessedEntities == 0) 6062 return findNextPreprocessedEntity(SLocMapI); 6063 6064 ModuleFile &M = *SLocMapI->second; 6065 6066 using pp_iterator = const PPEntityOffset *; 6067 6068 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 6069 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 6070 6071 size_t Count = M.NumPreprocessedEntities; 6072 size_t Half; 6073 pp_iterator First = pp_begin; 6074 pp_iterator PPI; 6075 6076 if (EndsAfter) { 6077 PPI = std::upper_bound(pp_begin, pp_end, Loc, 6078 PPEntityComp(*this, M)); 6079 } else { 6080 // Do a binary search manually instead of using std::lower_bound because 6081 // The end locations of entities may be unordered (when a macro expansion 6082 // is inside another macro argument), but for this case it is not important 6083 // whether we get the first macro expansion or its containing macro. 6084 while (Count > 0) { 6085 Half = Count / 2; 6086 PPI = First; 6087 std::advance(PPI, Half); 6088 if (SourceMgr.isBeforeInTranslationUnit( 6089 TranslateSourceLocation(M, PPI->getEnd()), Loc)) { 6090 First = PPI; 6091 ++First; 6092 Count = Count - Half - 1; 6093 } else 6094 Count = Half; 6095 } 6096 } 6097 6098 if (PPI == pp_end) 6099 return findNextPreprocessedEntity(SLocMapI); 6100 6101 return M.BasePreprocessedEntityID + (PPI - pp_begin); 6102 } 6103 6104 /// Returns a pair of [Begin, End) indices of preallocated 6105 /// preprocessed entities that \arg Range encompasses. 6106 std::pair<unsigned, unsigned> 6107 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 6108 if (Range.isInvalid()) 6109 return std::make_pair(0,0); 6110 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 6111 6112 PreprocessedEntityID BeginID = 6113 findPreprocessedEntity(Range.getBegin(), false); 6114 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true); 6115 return std::make_pair(BeginID, EndID); 6116 } 6117 6118 /// Optionally returns true or false if the preallocated preprocessed 6119 /// entity with index \arg Index came from file \arg FID. 6120 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 6121 FileID FID) { 6122 if (FID.isInvalid()) 6123 return false; 6124 6125 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 6126 ModuleFile &M = *PPInfo.first; 6127 unsigned LocalIndex = PPInfo.second; 6128 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 6129 6130 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin()); 6131 if (Loc.isInvalid()) 6132 return false; 6133 6134 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 6135 return true; 6136 else 6137 return false; 6138 } 6139 6140 namespace { 6141 6142 /// Visitor used to search for information about a header file. 6143 class HeaderFileInfoVisitor { 6144 const FileEntry *FE; 6145 Optional<HeaderFileInfo> HFI; 6146 6147 public: 6148 explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {} 6149 6150 bool operator()(ModuleFile &M) { 6151 HeaderFileInfoLookupTable *Table 6152 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 6153 if (!Table) 6154 return false; 6155 6156 // Look in the on-disk hash table for an entry for this file name. 6157 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE); 6158 if (Pos == Table->end()) 6159 return false; 6160 6161 HFI = *Pos; 6162 return true; 6163 } 6164 6165 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 6166 }; 6167 6168 } // namespace 6169 6170 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 6171 HeaderFileInfoVisitor Visitor(FE); 6172 ModuleMgr.visit(Visitor); 6173 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 6174 return *HFI; 6175 6176 return HeaderFileInfo(); 6177 } 6178 6179 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 6180 using DiagState = DiagnosticsEngine::DiagState; 6181 SmallVector<DiagState *, 32> DiagStates; 6182 6183 for (ModuleFile &F : ModuleMgr) { 6184 unsigned Idx = 0; 6185 auto &Record = F.PragmaDiagMappings; 6186 if (Record.empty()) 6187 continue; 6188 6189 DiagStates.clear(); 6190 6191 auto ReadDiagState = 6192 [&](const DiagState &BasedOn, SourceLocation Loc, 6193 bool IncludeNonPragmaStates) -> DiagnosticsEngine::DiagState * { 6194 unsigned BackrefID = Record[Idx++]; 6195 if (BackrefID != 0) 6196 return DiagStates[BackrefID - 1]; 6197 6198 // A new DiagState was created here. 6199 Diag.DiagStates.push_back(BasedOn); 6200 DiagState *NewState = &Diag.DiagStates.back(); 6201 DiagStates.push_back(NewState); 6202 unsigned Size = Record[Idx++]; 6203 assert(Idx + Size * 2 <= Record.size() && 6204 "Invalid data, not enough diag/map pairs"); 6205 while (Size--) { 6206 unsigned DiagID = Record[Idx++]; 6207 DiagnosticMapping NewMapping = 6208 DiagnosticMapping::deserialize(Record[Idx++]); 6209 if (!NewMapping.isPragma() && !IncludeNonPragmaStates) 6210 continue; 6211 6212 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID); 6213 6214 // If this mapping was specified as a warning but the severity was 6215 // upgraded due to diagnostic settings, simulate the current diagnostic 6216 // settings (and use a warning). 6217 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) { 6218 NewMapping.setSeverity(diag::Severity::Warning); 6219 NewMapping.setUpgradedFromWarning(false); 6220 } 6221 6222 Mapping = NewMapping; 6223 } 6224 return NewState; 6225 }; 6226 6227 // Read the first state. 6228 DiagState *FirstState; 6229 if (F.Kind == MK_ImplicitModule) { 6230 // Implicitly-built modules are reused with different diagnostic 6231 // settings. Use the initial diagnostic state from Diag to simulate this 6232 // compilation's diagnostic settings. 6233 FirstState = Diag.DiagStatesByLoc.FirstDiagState; 6234 DiagStates.push_back(FirstState); 6235 6236 // Skip the initial diagnostic state from the serialized module. 6237 assert(Record[1] == 0 && 6238 "Invalid data, unexpected backref in initial state"); 6239 Idx = 3 + Record[2] * 2; 6240 assert(Idx < Record.size() && 6241 "Invalid data, not enough state change pairs in initial state"); 6242 } else if (F.isModule()) { 6243 // For an explicit module, preserve the flags from the module build 6244 // command line (-w, -Weverything, -Werror, ...) along with any explicit 6245 // -Wblah flags. 6246 unsigned Flags = Record[Idx++]; 6247 DiagState Initial; 6248 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1; 6249 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1; 6250 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1; 6251 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1; 6252 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1; 6253 Initial.ExtBehavior = (diag::Severity)Flags; 6254 FirstState = ReadDiagState(Initial, SourceLocation(), true); 6255 6256 assert(F.OriginalSourceFileID.isValid()); 6257 6258 // Set up the root buffer of the module to start with the initial 6259 // diagnostic state of the module itself, to cover files that contain no 6260 // explicit transitions (for which we did not serialize anything). 6261 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID] 6262 .StateTransitions.push_back({FirstState, 0}); 6263 } else { 6264 // For prefix ASTs, start with whatever the user configured on the 6265 // command line. 6266 Idx++; // Skip flags. 6267 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, 6268 SourceLocation(), false); 6269 } 6270 6271 // Read the state transitions. 6272 unsigned NumLocations = Record[Idx++]; 6273 while (NumLocations--) { 6274 assert(Idx < Record.size() && 6275 "Invalid data, missing pragma diagnostic states"); 6276 SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]); 6277 auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc); 6278 assert(IDAndOffset.first.isValid() && "invalid FileID for transition"); 6279 assert(IDAndOffset.second == 0 && "not a start location for a FileID"); 6280 unsigned Transitions = Record[Idx++]; 6281 6282 // Note that we don't need to set up Parent/ParentOffset here, because 6283 // we won't be changing the diagnostic state within imported FileIDs 6284 // (other than perhaps appending to the main source file, which has no 6285 // parent). 6286 auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first]; 6287 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions); 6288 for (unsigned I = 0; I != Transitions; ++I) { 6289 unsigned Offset = Record[Idx++]; 6290 auto *State = 6291 ReadDiagState(*FirstState, Loc.getLocWithOffset(Offset), false); 6292 F.StateTransitions.push_back({State, Offset}); 6293 } 6294 } 6295 6296 // Read the final state. 6297 assert(Idx < Record.size() && 6298 "Invalid data, missing final pragma diagnostic state"); 6299 SourceLocation CurStateLoc = 6300 ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 6301 auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false); 6302 6303 if (!F.isModule()) { 6304 Diag.DiagStatesByLoc.CurDiagState = CurState; 6305 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc; 6306 6307 // Preserve the property that the imaginary root file describes the 6308 // current state. 6309 FileID NullFile; 6310 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions; 6311 if (T.empty()) 6312 T.push_back({CurState, 0}); 6313 else 6314 T[0].State = CurState; 6315 } 6316 6317 // Don't try to read these mappings again. 6318 Record.clear(); 6319 } 6320 } 6321 6322 /// Get the correct cursor and offset for loading a type. 6323 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 6324 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 6325 assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 6326 ModuleFile *M = I->second; 6327 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]); 6328 } 6329 6330 static llvm::Optional<Type::TypeClass> getTypeClassForCode(TypeCode code) { 6331 switch (code) { 6332 #define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \ 6333 case TYPE_##CODE_ID: return Type::CLASS_ID; 6334 #include "clang/Serialization/TypeBitCodes.def" 6335 default: return llvm::None; 6336 } 6337 } 6338 6339 /// Read and return the type with the given index.. 6340 /// 6341 /// The index is the type ID, shifted and minus the number of predefs. This 6342 /// routine actually reads the record corresponding to the type at the given 6343 /// location. It is a helper routine for GetType, which deals with reading type 6344 /// IDs. 6345 QualType ASTReader::readTypeRecord(unsigned Index) { 6346 assert(ContextObj && "reading type with no AST context"); 6347 ASTContext &Context = *ContextObj; 6348 RecordLocation Loc = TypeCursorForIndex(Index); 6349 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 6350 6351 // Keep track of where we are in the stream, then jump back there 6352 // after reading this type. 6353 SavedStreamPosition SavedPosition(DeclsCursor); 6354 6355 ReadingKindTracker ReadingKind(Read_Type, *this); 6356 6357 // Note that we are loading a type record. 6358 Deserializing AType(this); 6359 6360 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) { 6361 Error(std::move(Err)); 6362 return QualType(); 6363 } 6364 Expected<unsigned> RawCode = DeclsCursor.ReadCode(); 6365 if (!RawCode) { 6366 Error(RawCode.takeError()); 6367 return QualType(); 6368 } 6369 6370 ASTRecordReader Record(*this, *Loc.F); 6371 Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get()); 6372 if (!Code) { 6373 Error(Code.takeError()); 6374 return QualType(); 6375 } 6376 if (Code.get() == TYPE_EXT_QUAL) { 6377 QualType baseType = Record.readQualType(); 6378 Qualifiers quals = Record.readQualifiers(); 6379 return Context.getQualifiedType(baseType, quals); 6380 } 6381 6382 auto maybeClass = getTypeClassForCode((TypeCode) Code.get()); 6383 if (!maybeClass) { 6384 Error("Unexpected code for type"); 6385 return QualType(); 6386 } 6387 6388 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record); 6389 return TypeReader.read(*maybeClass); 6390 } 6391 6392 namespace clang { 6393 6394 class TypeLocReader : public TypeLocVisitor<TypeLocReader> { 6395 ASTRecordReader &Reader; 6396 6397 SourceLocation readSourceLocation() { 6398 return Reader.readSourceLocation(); 6399 } 6400 6401 TypeSourceInfo *GetTypeSourceInfo() { 6402 return Reader.readTypeSourceInfo(); 6403 } 6404 6405 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() { 6406 return Reader.readNestedNameSpecifierLoc(); 6407 } 6408 6409 Attr *ReadAttr() { 6410 return Reader.readAttr(); 6411 } 6412 6413 public: 6414 TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {} 6415 6416 // We want compile-time assurance that we've enumerated all of 6417 // these, so unfortunately we have to declare them first, then 6418 // define them out-of-line. 6419 #define ABSTRACT_TYPELOC(CLASS, PARENT) 6420 #define TYPELOC(CLASS, PARENT) \ 6421 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 6422 #include "clang/AST/TypeLocNodes.def" 6423 6424 void VisitFunctionTypeLoc(FunctionTypeLoc); 6425 void VisitArrayTypeLoc(ArrayTypeLoc); 6426 }; 6427 6428 } // namespace clang 6429 6430 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 6431 // nothing to do 6432 } 6433 6434 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 6435 TL.setBuiltinLoc(readSourceLocation()); 6436 if (TL.needsExtraLocalData()) { 6437 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt())); 6438 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Reader.readInt())); 6439 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Reader.readInt())); 6440 TL.setModeAttr(Reader.readInt()); 6441 } 6442 } 6443 6444 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 6445 TL.setNameLoc(readSourceLocation()); 6446 } 6447 6448 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 6449 TL.setStarLoc(readSourceLocation()); 6450 } 6451 6452 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 6453 // nothing to do 6454 } 6455 6456 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 6457 // nothing to do 6458 } 6459 6460 void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) { 6461 TL.setExpansionLoc(readSourceLocation()); 6462 } 6463 6464 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 6465 TL.setCaretLoc(readSourceLocation()); 6466 } 6467 6468 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 6469 TL.setAmpLoc(readSourceLocation()); 6470 } 6471 6472 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 6473 TL.setAmpAmpLoc(readSourceLocation()); 6474 } 6475 6476 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 6477 TL.setStarLoc(readSourceLocation()); 6478 TL.setClassTInfo(GetTypeSourceInfo()); 6479 } 6480 6481 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 6482 TL.setLBracketLoc(readSourceLocation()); 6483 TL.setRBracketLoc(readSourceLocation()); 6484 if (Reader.readBool()) 6485 TL.setSizeExpr(Reader.readExpr()); 6486 else 6487 TL.setSizeExpr(nullptr); 6488 } 6489 6490 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 6491 VisitArrayTypeLoc(TL); 6492 } 6493 6494 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 6495 VisitArrayTypeLoc(TL); 6496 } 6497 6498 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 6499 VisitArrayTypeLoc(TL); 6500 } 6501 6502 void TypeLocReader::VisitDependentSizedArrayTypeLoc( 6503 DependentSizedArrayTypeLoc TL) { 6504 VisitArrayTypeLoc(TL); 6505 } 6506 6507 void TypeLocReader::VisitDependentAddressSpaceTypeLoc( 6508 DependentAddressSpaceTypeLoc TL) { 6509 6510 TL.setAttrNameLoc(readSourceLocation()); 6511 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6512 TL.setAttrExprOperand(Reader.readExpr()); 6513 } 6514 6515 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 6516 DependentSizedExtVectorTypeLoc TL) { 6517 TL.setNameLoc(readSourceLocation()); 6518 } 6519 6520 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 6521 TL.setNameLoc(readSourceLocation()); 6522 } 6523 6524 void TypeLocReader::VisitDependentVectorTypeLoc( 6525 DependentVectorTypeLoc TL) { 6526 TL.setNameLoc(readSourceLocation()); 6527 } 6528 6529 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 6530 TL.setNameLoc(readSourceLocation()); 6531 } 6532 6533 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 6534 TL.setLocalRangeBegin(readSourceLocation()); 6535 TL.setLParenLoc(readSourceLocation()); 6536 TL.setRParenLoc(readSourceLocation()); 6537 TL.setExceptionSpecRange(Reader.readSourceRange()); 6538 TL.setLocalRangeEnd(readSourceLocation()); 6539 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) { 6540 TL.setParam(i, Reader.readDeclAs<ParmVarDecl>()); 6541 } 6542 } 6543 6544 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 6545 VisitFunctionTypeLoc(TL); 6546 } 6547 6548 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 6549 VisitFunctionTypeLoc(TL); 6550 } 6551 6552 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 6553 TL.setNameLoc(readSourceLocation()); 6554 } 6555 6556 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 6557 TL.setNameLoc(readSourceLocation()); 6558 } 6559 6560 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 6561 TL.setTypeofLoc(readSourceLocation()); 6562 TL.setLParenLoc(readSourceLocation()); 6563 TL.setRParenLoc(readSourceLocation()); 6564 } 6565 6566 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 6567 TL.setTypeofLoc(readSourceLocation()); 6568 TL.setLParenLoc(readSourceLocation()); 6569 TL.setRParenLoc(readSourceLocation()); 6570 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6571 } 6572 6573 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 6574 TL.setNameLoc(readSourceLocation()); 6575 } 6576 6577 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 6578 TL.setKWLoc(readSourceLocation()); 6579 TL.setLParenLoc(readSourceLocation()); 6580 TL.setRParenLoc(readSourceLocation()); 6581 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6582 } 6583 6584 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 6585 TL.setNameLoc(readSourceLocation()); 6586 if (Reader.readBool()) { 6587 TL.setNestedNameSpecifierLoc(ReadNestedNameSpecifierLoc()); 6588 TL.setTemplateKWLoc(readSourceLocation()); 6589 TL.setConceptNameLoc(readSourceLocation()); 6590 TL.setFoundDecl(Reader.readDeclAs<NamedDecl>()); 6591 TL.setLAngleLoc(readSourceLocation()); 6592 TL.setRAngleLoc(readSourceLocation()); 6593 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6594 TL.setArgLocInfo(i, Reader.readTemplateArgumentLocInfo( 6595 TL.getTypePtr()->getArg(i).getKind())); 6596 } 6597 } 6598 6599 void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc( 6600 DeducedTemplateSpecializationTypeLoc TL) { 6601 TL.setTemplateNameLoc(readSourceLocation()); 6602 } 6603 6604 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 6605 TL.setNameLoc(readSourceLocation()); 6606 } 6607 6608 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 6609 TL.setNameLoc(readSourceLocation()); 6610 } 6611 6612 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 6613 TL.setAttr(ReadAttr()); 6614 } 6615 6616 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 6617 TL.setNameLoc(readSourceLocation()); 6618 } 6619 6620 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 6621 SubstTemplateTypeParmTypeLoc TL) { 6622 TL.setNameLoc(readSourceLocation()); 6623 } 6624 6625 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 6626 SubstTemplateTypeParmPackTypeLoc TL) { 6627 TL.setNameLoc(readSourceLocation()); 6628 } 6629 6630 void TypeLocReader::VisitTemplateSpecializationTypeLoc( 6631 TemplateSpecializationTypeLoc TL) { 6632 TL.setTemplateKeywordLoc(readSourceLocation()); 6633 TL.setTemplateNameLoc(readSourceLocation()); 6634 TL.setLAngleLoc(readSourceLocation()); 6635 TL.setRAngleLoc(readSourceLocation()); 6636 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6637 TL.setArgLocInfo( 6638 i, 6639 Reader.readTemplateArgumentLocInfo( 6640 TL.getTypePtr()->getArg(i).getKind())); 6641 } 6642 6643 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 6644 TL.setLParenLoc(readSourceLocation()); 6645 TL.setRParenLoc(readSourceLocation()); 6646 } 6647 6648 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 6649 TL.setElaboratedKeywordLoc(readSourceLocation()); 6650 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6651 } 6652 6653 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 6654 TL.setNameLoc(readSourceLocation()); 6655 } 6656 6657 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 6658 TL.setElaboratedKeywordLoc(readSourceLocation()); 6659 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6660 TL.setNameLoc(readSourceLocation()); 6661 } 6662 6663 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 6664 DependentTemplateSpecializationTypeLoc TL) { 6665 TL.setElaboratedKeywordLoc(readSourceLocation()); 6666 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6667 TL.setTemplateKeywordLoc(readSourceLocation()); 6668 TL.setTemplateNameLoc(readSourceLocation()); 6669 TL.setLAngleLoc(readSourceLocation()); 6670 TL.setRAngleLoc(readSourceLocation()); 6671 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 6672 TL.setArgLocInfo( 6673 I, 6674 Reader.readTemplateArgumentLocInfo( 6675 TL.getTypePtr()->getArg(I).getKind())); 6676 } 6677 6678 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 6679 TL.setEllipsisLoc(readSourceLocation()); 6680 } 6681 6682 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 6683 TL.setNameLoc(readSourceLocation()); 6684 } 6685 6686 void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) { 6687 if (TL.getNumProtocols()) { 6688 TL.setProtocolLAngleLoc(readSourceLocation()); 6689 TL.setProtocolRAngleLoc(readSourceLocation()); 6690 } 6691 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6692 TL.setProtocolLoc(i, readSourceLocation()); 6693 } 6694 6695 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 6696 TL.setHasBaseTypeAsWritten(Reader.readBool()); 6697 TL.setTypeArgsLAngleLoc(readSourceLocation()); 6698 TL.setTypeArgsRAngleLoc(readSourceLocation()); 6699 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i) 6700 TL.setTypeArgTInfo(i, GetTypeSourceInfo()); 6701 TL.setProtocolLAngleLoc(readSourceLocation()); 6702 TL.setProtocolRAngleLoc(readSourceLocation()); 6703 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6704 TL.setProtocolLoc(i, readSourceLocation()); 6705 } 6706 6707 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 6708 TL.setStarLoc(readSourceLocation()); 6709 } 6710 6711 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 6712 TL.setKWLoc(readSourceLocation()); 6713 TL.setLParenLoc(readSourceLocation()); 6714 TL.setRParenLoc(readSourceLocation()); 6715 } 6716 6717 void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) { 6718 TL.setKWLoc(readSourceLocation()); 6719 } 6720 6721 void ASTRecordReader::readTypeLoc(TypeLoc TL) { 6722 TypeLocReader TLR(*this); 6723 for (; !TL.isNull(); TL = TL.getNextTypeLoc()) 6724 TLR.Visit(TL); 6725 } 6726 6727 TypeSourceInfo *ASTRecordReader::readTypeSourceInfo() { 6728 QualType InfoTy = readType(); 6729 if (InfoTy.isNull()) 6730 return nullptr; 6731 6732 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 6733 readTypeLoc(TInfo->getTypeLoc()); 6734 return TInfo; 6735 } 6736 6737 QualType ASTReader::GetType(TypeID ID) { 6738 assert(ContextObj && "reading type with no AST context"); 6739 ASTContext &Context = *ContextObj; 6740 6741 unsigned FastQuals = ID & Qualifiers::FastMask; 6742 unsigned Index = ID >> Qualifiers::FastWidth; 6743 6744 if (Index < NUM_PREDEF_TYPE_IDS) { 6745 QualType T; 6746 switch ((PredefinedTypeIDs)Index) { 6747 case PREDEF_TYPE_NULL_ID: 6748 return QualType(); 6749 case PREDEF_TYPE_VOID_ID: 6750 T = Context.VoidTy; 6751 break; 6752 case PREDEF_TYPE_BOOL_ID: 6753 T = Context.BoolTy; 6754 break; 6755 case PREDEF_TYPE_CHAR_U_ID: 6756 case PREDEF_TYPE_CHAR_S_ID: 6757 // FIXME: Check that the signedness of CharTy is correct! 6758 T = Context.CharTy; 6759 break; 6760 case PREDEF_TYPE_UCHAR_ID: 6761 T = Context.UnsignedCharTy; 6762 break; 6763 case PREDEF_TYPE_USHORT_ID: 6764 T = Context.UnsignedShortTy; 6765 break; 6766 case PREDEF_TYPE_UINT_ID: 6767 T = Context.UnsignedIntTy; 6768 break; 6769 case PREDEF_TYPE_ULONG_ID: 6770 T = Context.UnsignedLongTy; 6771 break; 6772 case PREDEF_TYPE_ULONGLONG_ID: 6773 T = Context.UnsignedLongLongTy; 6774 break; 6775 case PREDEF_TYPE_UINT128_ID: 6776 T = Context.UnsignedInt128Ty; 6777 break; 6778 case PREDEF_TYPE_SCHAR_ID: 6779 T = Context.SignedCharTy; 6780 break; 6781 case PREDEF_TYPE_WCHAR_ID: 6782 T = Context.WCharTy; 6783 break; 6784 case PREDEF_TYPE_SHORT_ID: 6785 T = Context.ShortTy; 6786 break; 6787 case PREDEF_TYPE_INT_ID: 6788 T = Context.IntTy; 6789 break; 6790 case PREDEF_TYPE_LONG_ID: 6791 T = Context.LongTy; 6792 break; 6793 case PREDEF_TYPE_LONGLONG_ID: 6794 T = Context.LongLongTy; 6795 break; 6796 case PREDEF_TYPE_INT128_ID: 6797 T = Context.Int128Ty; 6798 break; 6799 case PREDEF_TYPE_HALF_ID: 6800 T = Context.HalfTy; 6801 break; 6802 case PREDEF_TYPE_FLOAT_ID: 6803 T = Context.FloatTy; 6804 break; 6805 case PREDEF_TYPE_DOUBLE_ID: 6806 T = Context.DoubleTy; 6807 break; 6808 case PREDEF_TYPE_LONGDOUBLE_ID: 6809 T = Context.LongDoubleTy; 6810 break; 6811 case PREDEF_TYPE_SHORT_ACCUM_ID: 6812 T = Context.ShortAccumTy; 6813 break; 6814 case PREDEF_TYPE_ACCUM_ID: 6815 T = Context.AccumTy; 6816 break; 6817 case PREDEF_TYPE_LONG_ACCUM_ID: 6818 T = Context.LongAccumTy; 6819 break; 6820 case PREDEF_TYPE_USHORT_ACCUM_ID: 6821 T = Context.UnsignedShortAccumTy; 6822 break; 6823 case PREDEF_TYPE_UACCUM_ID: 6824 T = Context.UnsignedAccumTy; 6825 break; 6826 case PREDEF_TYPE_ULONG_ACCUM_ID: 6827 T = Context.UnsignedLongAccumTy; 6828 break; 6829 case PREDEF_TYPE_SHORT_FRACT_ID: 6830 T = Context.ShortFractTy; 6831 break; 6832 case PREDEF_TYPE_FRACT_ID: 6833 T = Context.FractTy; 6834 break; 6835 case PREDEF_TYPE_LONG_FRACT_ID: 6836 T = Context.LongFractTy; 6837 break; 6838 case PREDEF_TYPE_USHORT_FRACT_ID: 6839 T = Context.UnsignedShortFractTy; 6840 break; 6841 case PREDEF_TYPE_UFRACT_ID: 6842 T = Context.UnsignedFractTy; 6843 break; 6844 case PREDEF_TYPE_ULONG_FRACT_ID: 6845 T = Context.UnsignedLongFractTy; 6846 break; 6847 case PREDEF_TYPE_SAT_SHORT_ACCUM_ID: 6848 T = Context.SatShortAccumTy; 6849 break; 6850 case PREDEF_TYPE_SAT_ACCUM_ID: 6851 T = Context.SatAccumTy; 6852 break; 6853 case PREDEF_TYPE_SAT_LONG_ACCUM_ID: 6854 T = Context.SatLongAccumTy; 6855 break; 6856 case PREDEF_TYPE_SAT_USHORT_ACCUM_ID: 6857 T = Context.SatUnsignedShortAccumTy; 6858 break; 6859 case PREDEF_TYPE_SAT_UACCUM_ID: 6860 T = Context.SatUnsignedAccumTy; 6861 break; 6862 case PREDEF_TYPE_SAT_ULONG_ACCUM_ID: 6863 T = Context.SatUnsignedLongAccumTy; 6864 break; 6865 case PREDEF_TYPE_SAT_SHORT_FRACT_ID: 6866 T = Context.SatShortFractTy; 6867 break; 6868 case PREDEF_TYPE_SAT_FRACT_ID: 6869 T = Context.SatFractTy; 6870 break; 6871 case PREDEF_TYPE_SAT_LONG_FRACT_ID: 6872 T = Context.SatLongFractTy; 6873 break; 6874 case PREDEF_TYPE_SAT_USHORT_FRACT_ID: 6875 T = Context.SatUnsignedShortFractTy; 6876 break; 6877 case PREDEF_TYPE_SAT_UFRACT_ID: 6878 T = Context.SatUnsignedFractTy; 6879 break; 6880 case PREDEF_TYPE_SAT_ULONG_FRACT_ID: 6881 T = Context.SatUnsignedLongFractTy; 6882 break; 6883 case PREDEF_TYPE_FLOAT16_ID: 6884 T = Context.Float16Ty; 6885 break; 6886 case PREDEF_TYPE_FLOAT128_ID: 6887 T = Context.Float128Ty; 6888 break; 6889 case PREDEF_TYPE_OVERLOAD_ID: 6890 T = Context.OverloadTy; 6891 break; 6892 case PREDEF_TYPE_BOUND_MEMBER: 6893 T = Context.BoundMemberTy; 6894 break; 6895 case PREDEF_TYPE_PSEUDO_OBJECT: 6896 T = Context.PseudoObjectTy; 6897 break; 6898 case PREDEF_TYPE_DEPENDENT_ID: 6899 T = Context.DependentTy; 6900 break; 6901 case PREDEF_TYPE_UNKNOWN_ANY: 6902 T = Context.UnknownAnyTy; 6903 break; 6904 case PREDEF_TYPE_NULLPTR_ID: 6905 T = Context.NullPtrTy; 6906 break; 6907 case PREDEF_TYPE_CHAR8_ID: 6908 T = Context.Char8Ty; 6909 break; 6910 case PREDEF_TYPE_CHAR16_ID: 6911 T = Context.Char16Ty; 6912 break; 6913 case PREDEF_TYPE_CHAR32_ID: 6914 T = Context.Char32Ty; 6915 break; 6916 case PREDEF_TYPE_OBJC_ID: 6917 T = Context.ObjCBuiltinIdTy; 6918 break; 6919 case PREDEF_TYPE_OBJC_CLASS: 6920 T = Context.ObjCBuiltinClassTy; 6921 break; 6922 case PREDEF_TYPE_OBJC_SEL: 6923 T = Context.ObjCBuiltinSelTy; 6924 break; 6925 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 6926 case PREDEF_TYPE_##Id##_ID: \ 6927 T = Context.SingletonId; \ 6928 break; 6929 #include "clang/Basic/OpenCLImageTypes.def" 6930 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 6931 case PREDEF_TYPE_##Id##_ID: \ 6932 T = Context.Id##Ty; \ 6933 break; 6934 #include "clang/Basic/OpenCLExtensionTypes.def" 6935 case PREDEF_TYPE_SAMPLER_ID: 6936 T = Context.OCLSamplerTy; 6937 break; 6938 case PREDEF_TYPE_EVENT_ID: 6939 T = Context.OCLEventTy; 6940 break; 6941 case PREDEF_TYPE_CLK_EVENT_ID: 6942 T = Context.OCLClkEventTy; 6943 break; 6944 case PREDEF_TYPE_QUEUE_ID: 6945 T = Context.OCLQueueTy; 6946 break; 6947 case PREDEF_TYPE_RESERVE_ID_ID: 6948 T = Context.OCLReserveIDTy; 6949 break; 6950 case PREDEF_TYPE_AUTO_DEDUCT: 6951 T = Context.getAutoDeductType(); 6952 break; 6953 case PREDEF_TYPE_AUTO_RREF_DEDUCT: 6954 T = Context.getAutoRRefDeductType(); 6955 break; 6956 case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 6957 T = Context.ARCUnbridgedCastTy; 6958 break; 6959 case PREDEF_TYPE_BUILTIN_FN: 6960 T = Context.BuiltinFnTy; 6961 break; 6962 case PREDEF_TYPE_OMP_ARRAY_SECTION: 6963 T = Context.OMPArraySectionTy; 6964 break; 6965 case PREDEF_TYPE_OMP_ARRAY_SHAPING: 6966 T = Context.OMPArraySectionTy; 6967 break; 6968 case PREDEF_TYPE_OMP_ITERATOR: 6969 T = Context.OMPIteratorTy; 6970 break; 6971 #define SVE_TYPE(Name, Id, SingletonId) \ 6972 case PREDEF_TYPE_##Id##_ID: \ 6973 T = Context.SingletonId; \ 6974 break; 6975 #include "clang/Basic/AArch64SVEACLETypes.def" 6976 } 6977 6978 assert(!T.isNull() && "Unknown predefined type"); 6979 return T.withFastQualifiers(FastQuals); 6980 } 6981 6982 Index -= NUM_PREDEF_TYPE_IDS; 6983 assert(Index < TypesLoaded.size() && "Type index out-of-range"); 6984 if (TypesLoaded[Index].isNull()) { 6985 TypesLoaded[Index] = readTypeRecord(Index); 6986 if (TypesLoaded[Index].isNull()) 6987 return QualType(); 6988 6989 TypesLoaded[Index]->setFromAST(); 6990 if (DeserializationListener) 6991 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 6992 TypesLoaded[Index]); 6993 } 6994 6995 return TypesLoaded[Index].withFastQualifiers(FastQuals); 6996 } 6997 6998 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 6999 return GetType(getGlobalTypeID(F, LocalID)); 7000 } 7001 7002 serialization::TypeID 7003 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 7004 unsigned FastQuals = LocalID & Qualifiers::FastMask; 7005 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 7006 7007 if (LocalIndex < NUM_PREDEF_TYPE_IDS) 7008 return LocalID; 7009 7010 if (!F.ModuleOffsetMap.empty()) 7011 ReadModuleOffsetMap(F); 7012 7013 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7014 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 7015 assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 7016 7017 unsigned GlobalIndex = LocalIndex + I->second; 7018 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 7019 } 7020 7021 TemplateArgumentLocInfo 7022 ASTRecordReader::readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind) { 7023 switch (Kind) { 7024 case TemplateArgument::Expression: 7025 return readExpr(); 7026 case TemplateArgument::Type: 7027 return readTypeSourceInfo(); 7028 case TemplateArgument::Template: { 7029 NestedNameSpecifierLoc QualifierLoc = 7030 readNestedNameSpecifierLoc(); 7031 SourceLocation TemplateNameLoc = readSourceLocation(); 7032 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 7033 SourceLocation()); 7034 } 7035 case TemplateArgument::TemplateExpansion: { 7036 NestedNameSpecifierLoc QualifierLoc = readNestedNameSpecifierLoc(); 7037 SourceLocation TemplateNameLoc = readSourceLocation(); 7038 SourceLocation EllipsisLoc = readSourceLocation(); 7039 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 7040 EllipsisLoc); 7041 } 7042 case TemplateArgument::Null: 7043 case TemplateArgument::Integral: 7044 case TemplateArgument::Declaration: 7045 case TemplateArgument::NullPtr: 7046 case TemplateArgument::Pack: 7047 // FIXME: Is this right? 7048 return TemplateArgumentLocInfo(); 7049 } 7050 llvm_unreachable("unexpected template argument loc"); 7051 } 7052 7053 TemplateArgumentLoc ASTRecordReader::readTemplateArgumentLoc() { 7054 TemplateArgument Arg = readTemplateArgument(); 7055 7056 if (Arg.getKind() == TemplateArgument::Expression) { 7057 if (readBool()) // bool InfoHasSameExpr. 7058 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 7059 } 7060 return TemplateArgumentLoc(Arg, readTemplateArgumentLocInfo(Arg.getKind())); 7061 } 7062 7063 const ASTTemplateArgumentListInfo * 7064 ASTRecordReader::readASTTemplateArgumentListInfo() { 7065 SourceLocation LAngleLoc = readSourceLocation(); 7066 SourceLocation RAngleLoc = readSourceLocation(); 7067 unsigned NumArgsAsWritten = readInt(); 7068 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 7069 for (unsigned i = 0; i != NumArgsAsWritten; ++i) 7070 TemplArgsInfo.addArgument(readTemplateArgumentLoc()); 7071 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 7072 } 7073 7074 Decl *ASTReader::GetExternalDecl(uint32_t ID) { 7075 return GetDecl(ID); 7076 } 7077 7078 void ASTReader::CompleteRedeclChain(const Decl *D) { 7079 if (NumCurrentElementsDeserializing) { 7080 // We arrange to not care about the complete redeclaration chain while we're 7081 // deserializing. Just remember that the AST has marked this one as complete 7082 // but that it's not actually complete yet, so we know we still need to 7083 // complete it later. 7084 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D)); 7085 return; 7086 } 7087 7088 const DeclContext *DC = D->getDeclContext()->getRedeclContext(); 7089 7090 // If this is a named declaration, complete it by looking it up 7091 // within its context. 7092 // 7093 // FIXME: Merging a function definition should merge 7094 // all mergeable entities within it. 7095 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) || 7096 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) { 7097 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) { 7098 if (!getContext().getLangOpts().CPlusPlus && 7099 isa<TranslationUnitDecl>(DC)) { 7100 // Outside of C++, we don't have a lookup table for the TU, so update 7101 // the identifier instead. (For C++ modules, we don't store decls 7102 // in the serialized identifier table, so we do the lookup in the TU.) 7103 auto *II = Name.getAsIdentifierInfo(); 7104 assert(II && "non-identifier name in C?"); 7105 if (II->isOutOfDate()) 7106 updateOutOfDateIdentifier(*II); 7107 } else 7108 DC->lookup(Name); 7109 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) { 7110 // Find all declarations of this kind from the relevant context. 7111 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) { 7112 auto *DC = cast<DeclContext>(DCDecl); 7113 SmallVector<Decl*, 8> Decls; 7114 FindExternalLexicalDecls( 7115 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls); 7116 } 7117 } 7118 } 7119 7120 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) 7121 CTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7122 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) 7123 VTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7124 if (auto *FD = dyn_cast<FunctionDecl>(D)) { 7125 if (auto *Template = FD->getPrimaryTemplate()) 7126 Template->LoadLazySpecializations(); 7127 } 7128 } 7129 7130 CXXCtorInitializer ** 7131 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) { 7132 RecordLocation Loc = getLocalBitOffset(Offset); 7133 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7134 SavedStreamPosition SavedPosition(Cursor); 7135 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7136 Error(std::move(Err)); 7137 return nullptr; 7138 } 7139 ReadingKindTracker ReadingKind(Read_Decl, *this); 7140 7141 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7142 if (!MaybeCode) { 7143 Error(MaybeCode.takeError()); 7144 return nullptr; 7145 } 7146 unsigned Code = MaybeCode.get(); 7147 7148 ASTRecordReader Record(*this, *Loc.F); 7149 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7150 if (!MaybeRecCode) { 7151 Error(MaybeRecCode.takeError()); 7152 return nullptr; 7153 } 7154 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) { 7155 Error("malformed AST file: missing C++ ctor initializers"); 7156 return nullptr; 7157 } 7158 7159 return Record.readCXXCtorInitializers(); 7160 } 7161 7162 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 7163 assert(ContextObj && "reading base specifiers with no AST context"); 7164 ASTContext &Context = *ContextObj; 7165 7166 RecordLocation Loc = getLocalBitOffset(Offset); 7167 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7168 SavedStreamPosition SavedPosition(Cursor); 7169 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7170 Error(std::move(Err)); 7171 return nullptr; 7172 } 7173 ReadingKindTracker ReadingKind(Read_Decl, *this); 7174 7175 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7176 if (!MaybeCode) { 7177 Error(MaybeCode.takeError()); 7178 return nullptr; 7179 } 7180 unsigned Code = MaybeCode.get(); 7181 7182 ASTRecordReader Record(*this, *Loc.F); 7183 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7184 if (!MaybeRecCode) { 7185 Error(MaybeCode.takeError()); 7186 return nullptr; 7187 } 7188 unsigned RecCode = MaybeRecCode.get(); 7189 7190 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 7191 Error("malformed AST file: missing C++ base specifiers"); 7192 return nullptr; 7193 } 7194 7195 unsigned NumBases = Record.readInt(); 7196 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 7197 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 7198 for (unsigned I = 0; I != NumBases; ++I) 7199 Bases[I] = Record.readCXXBaseSpecifier(); 7200 return Bases; 7201 } 7202 7203 serialization::DeclID 7204 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 7205 if (LocalID < NUM_PREDEF_DECL_IDS) 7206 return LocalID; 7207 7208 if (!F.ModuleOffsetMap.empty()) 7209 ReadModuleOffsetMap(F); 7210 7211 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7212 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 7213 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 7214 7215 return LocalID + I->second; 7216 } 7217 7218 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 7219 ModuleFile &M) const { 7220 // Predefined decls aren't from any module. 7221 if (ID < NUM_PREDEF_DECL_IDS) 7222 return false; 7223 7224 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID && 7225 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls; 7226 } 7227 7228 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 7229 if (!D->isFromASTFile()) 7230 return nullptr; 7231 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 7232 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7233 return I->second; 7234 } 7235 7236 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 7237 if (ID < NUM_PREDEF_DECL_IDS) 7238 return SourceLocation(); 7239 7240 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7241 7242 if (Index > DeclsLoaded.size()) { 7243 Error("declaration ID out-of-range for AST file"); 7244 return SourceLocation(); 7245 } 7246 7247 if (Decl *D = DeclsLoaded[Index]) 7248 return D->getLocation(); 7249 7250 SourceLocation Loc; 7251 DeclCursorForID(ID, Loc); 7252 return Loc; 7253 } 7254 7255 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) { 7256 switch (ID) { 7257 case PREDEF_DECL_NULL_ID: 7258 return nullptr; 7259 7260 case PREDEF_DECL_TRANSLATION_UNIT_ID: 7261 return Context.getTranslationUnitDecl(); 7262 7263 case PREDEF_DECL_OBJC_ID_ID: 7264 return Context.getObjCIdDecl(); 7265 7266 case PREDEF_DECL_OBJC_SEL_ID: 7267 return Context.getObjCSelDecl(); 7268 7269 case PREDEF_DECL_OBJC_CLASS_ID: 7270 return Context.getObjCClassDecl(); 7271 7272 case PREDEF_DECL_OBJC_PROTOCOL_ID: 7273 return Context.getObjCProtocolDecl(); 7274 7275 case PREDEF_DECL_INT_128_ID: 7276 return Context.getInt128Decl(); 7277 7278 case PREDEF_DECL_UNSIGNED_INT_128_ID: 7279 return Context.getUInt128Decl(); 7280 7281 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 7282 return Context.getObjCInstanceTypeDecl(); 7283 7284 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 7285 return Context.getBuiltinVaListDecl(); 7286 7287 case PREDEF_DECL_VA_LIST_TAG: 7288 return Context.getVaListTagDecl(); 7289 7290 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID: 7291 return Context.getBuiltinMSVaListDecl(); 7292 7293 case PREDEF_DECL_BUILTIN_MS_GUID_ID: 7294 return Context.getMSGuidTagDecl(); 7295 7296 case PREDEF_DECL_EXTERN_C_CONTEXT_ID: 7297 return Context.getExternCContextDecl(); 7298 7299 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID: 7300 return Context.getMakeIntegerSeqDecl(); 7301 7302 case PREDEF_DECL_CF_CONSTANT_STRING_ID: 7303 return Context.getCFConstantStringDecl(); 7304 7305 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID: 7306 return Context.getCFConstantStringTagDecl(); 7307 7308 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID: 7309 return Context.getTypePackElementDecl(); 7310 } 7311 llvm_unreachable("PredefinedDeclIDs unknown enum value"); 7312 } 7313 7314 Decl *ASTReader::GetExistingDecl(DeclID ID) { 7315 assert(ContextObj && "reading decl with no AST context"); 7316 if (ID < NUM_PREDEF_DECL_IDS) { 7317 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID); 7318 if (D) { 7319 // Track that we have merged the declaration with ID \p ID into the 7320 // pre-existing predefined declaration \p D. 7321 auto &Merged = KeyDecls[D->getCanonicalDecl()]; 7322 if (Merged.empty()) 7323 Merged.push_back(ID); 7324 } 7325 return D; 7326 } 7327 7328 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7329 7330 if (Index >= DeclsLoaded.size()) { 7331 assert(0 && "declaration ID out-of-range for AST file"); 7332 Error("declaration ID out-of-range for AST file"); 7333 return nullptr; 7334 } 7335 7336 return DeclsLoaded[Index]; 7337 } 7338 7339 Decl *ASTReader::GetDecl(DeclID ID) { 7340 if (ID < NUM_PREDEF_DECL_IDS) 7341 return GetExistingDecl(ID); 7342 7343 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7344 7345 if (Index >= DeclsLoaded.size()) { 7346 assert(0 && "declaration ID out-of-range for AST file"); 7347 Error("declaration ID out-of-range for AST file"); 7348 return nullptr; 7349 } 7350 7351 if (!DeclsLoaded[Index]) { 7352 ReadDeclRecord(ID); 7353 if (DeserializationListener) 7354 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 7355 } 7356 7357 return DeclsLoaded[Index]; 7358 } 7359 7360 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 7361 DeclID GlobalID) { 7362 if (GlobalID < NUM_PREDEF_DECL_IDS) 7363 return GlobalID; 7364 7365 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 7366 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7367 ModuleFile *Owner = I->second; 7368 7369 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 7370 = M.GlobalToLocalDeclIDs.find(Owner); 7371 if (Pos == M.GlobalToLocalDeclIDs.end()) 7372 return 0; 7373 7374 return GlobalID - Owner->BaseDeclID + Pos->second; 7375 } 7376 7377 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 7378 const RecordData &Record, 7379 unsigned &Idx) { 7380 if (Idx >= Record.size()) { 7381 Error("Corrupted AST file"); 7382 return 0; 7383 } 7384 7385 return getGlobalDeclID(F, Record[Idx++]); 7386 } 7387 7388 /// Resolve the offset of a statement into a statement. 7389 /// 7390 /// This operation will read a new statement from the external 7391 /// source each time it is called, and is meant to be used via a 7392 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 7393 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 7394 // Switch case IDs are per Decl. 7395 ClearSwitchCaseIDs(); 7396 7397 // Offset here is a global offset across the entire chain. 7398 RecordLocation Loc = getLocalBitOffset(Offset); 7399 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) { 7400 Error(std::move(Err)); 7401 return nullptr; 7402 } 7403 assert(NumCurrentElementsDeserializing == 0 && 7404 "should not be called while already deserializing"); 7405 Deserializing D(this); 7406 return ReadStmtFromStream(*Loc.F); 7407 } 7408 7409 void ASTReader::FindExternalLexicalDecls( 7410 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 7411 SmallVectorImpl<Decl *> &Decls) { 7412 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {}; 7413 7414 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) { 7415 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries"); 7416 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) { 7417 auto K = (Decl::Kind)+LexicalDecls[I]; 7418 if (!IsKindWeWant(K)) 7419 continue; 7420 7421 auto ID = (serialization::DeclID)+LexicalDecls[I + 1]; 7422 7423 // Don't add predefined declarations to the lexical context more 7424 // than once. 7425 if (ID < NUM_PREDEF_DECL_IDS) { 7426 if (PredefsVisited[ID]) 7427 continue; 7428 7429 PredefsVisited[ID] = true; 7430 } 7431 7432 if (Decl *D = GetLocalDecl(*M, ID)) { 7433 assert(D->getKind() == K && "wrong kind for lexical decl"); 7434 if (!DC->isDeclInLexicalTraversal(D)) 7435 Decls.push_back(D); 7436 } 7437 } 7438 }; 7439 7440 if (isa<TranslationUnitDecl>(DC)) { 7441 for (auto Lexical : TULexicalDecls) 7442 Visit(Lexical.first, Lexical.second); 7443 } else { 7444 auto I = LexicalDecls.find(DC); 7445 if (I != LexicalDecls.end()) 7446 Visit(I->second.first, I->second.second); 7447 } 7448 7449 ++NumLexicalDeclContextsRead; 7450 } 7451 7452 namespace { 7453 7454 class DeclIDComp { 7455 ASTReader &Reader; 7456 ModuleFile &Mod; 7457 7458 public: 7459 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 7460 7461 bool operator()(LocalDeclID L, LocalDeclID R) const { 7462 SourceLocation LHS = getLocation(L); 7463 SourceLocation RHS = getLocation(R); 7464 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7465 } 7466 7467 bool operator()(SourceLocation LHS, LocalDeclID R) const { 7468 SourceLocation RHS = getLocation(R); 7469 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7470 } 7471 7472 bool operator()(LocalDeclID L, SourceLocation RHS) const { 7473 SourceLocation LHS = getLocation(L); 7474 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7475 } 7476 7477 SourceLocation getLocation(LocalDeclID ID) const { 7478 return Reader.getSourceManager().getFileLoc( 7479 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 7480 } 7481 }; 7482 7483 } // namespace 7484 7485 void ASTReader::FindFileRegionDecls(FileID File, 7486 unsigned Offset, unsigned Length, 7487 SmallVectorImpl<Decl *> &Decls) { 7488 SourceManager &SM = getSourceManager(); 7489 7490 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 7491 if (I == FileDeclIDs.end()) 7492 return; 7493 7494 FileDeclsInfo &DInfo = I->second; 7495 if (DInfo.Decls.empty()) 7496 return; 7497 7498 SourceLocation 7499 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 7500 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 7501 7502 DeclIDComp DIDComp(*this, *DInfo.Mod); 7503 ArrayRef<serialization::LocalDeclID>::iterator BeginIt = 7504 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp); 7505 if (BeginIt != DInfo.Decls.begin()) 7506 --BeginIt; 7507 7508 // If we are pointing at a top-level decl inside an objc container, we need 7509 // to backtrack until we find it otherwise we will fail to report that the 7510 // region overlaps with an objc container. 7511 while (BeginIt != DInfo.Decls.begin() && 7512 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 7513 ->isTopLevelDeclInObjCContainer()) 7514 --BeginIt; 7515 7516 ArrayRef<serialization::LocalDeclID>::iterator EndIt = 7517 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp); 7518 if (EndIt != DInfo.Decls.end()) 7519 ++EndIt; 7520 7521 for (ArrayRef<serialization::LocalDeclID>::iterator 7522 DIt = BeginIt; DIt != EndIt; ++DIt) 7523 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 7524 } 7525 7526 bool 7527 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 7528 DeclarationName Name) { 7529 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && 7530 "DeclContext has no visible decls in storage"); 7531 if (!Name) 7532 return false; 7533 7534 auto It = Lookups.find(DC); 7535 if (It == Lookups.end()) 7536 return false; 7537 7538 Deserializing LookupResults(this); 7539 7540 // Load the list of declarations. 7541 SmallVector<NamedDecl *, 64> Decls; 7542 for (DeclID ID : It->second.Table.find(Name)) { 7543 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7544 if (ND->getDeclName() == Name) 7545 Decls.push_back(ND); 7546 } 7547 7548 ++NumVisibleDeclContextsRead; 7549 SetExternalVisibleDeclsForName(DC, Name, Decls); 7550 return !Decls.empty(); 7551 } 7552 7553 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 7554 if (!DC->hasExternalVisibleStorage()) 7555 return; 7556 7557 auto It = Lookups.find(DC); 7558 assert(It != Lookups.end() && 7559 "have external visible storage but no lookup tables"); 7560 7561 DeclsMap Decls; 7562 7563 for (DeclID ID : It->second.Table.findAll()) { 7564 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7565 Decls[ND->getDeclName()].push_back(ND); 7566 } 7567 7568 ++NumVisibleDeclContextsRead; 7569 7570 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 7571 SetExternalVisibleDeclsForName(DC, I->first, I->second); 7572 } 7573 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 7574 } 7575 7576 const serialization::reader::DeclContextLookupTable * 7577 ASTReader::getLoadedLookupTables(DeclContext *Primary) const { 7578 auto I = Lookups.find(Primary); 7579 return I == Lookups.end() ? nullptr : &I->second; 7580 } 7581 7582 /// Under non-PCH compilation the consumer receives the objc methods 7583 /// before receiving the implementation, and codegen depends on this. 7584 /// We simulate this by deserializing and passing to consumer the methods of the 7585 /// implementation before passing the deserialized implementation decl. 7586 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 7587 ASTConsumer *Consumer) { 7588 assert(ImplD && Consumer); 7589 7590 for (auto *I : ImplD->methods()) 7591 Consumer->HandleInterestingDecl(DeclGroupRef(I)); 7592 7593 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 7594 } 7595 7596 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 7597 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 7598 PassObjCImplDeclToConsumer(ImplD, Consumer); 7599 else 7600 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 7601 } 7602 7603 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 7604 this->Consumer = Consumer; 7605 7606 if (Consumer) 7607 PassInterestingDeclsToConsumer(); 7608 7609 if (DeserializationListener) 7610 DeserializationListener->ReaderInitialized(this); 7611 } 7612 7613 void ASTReader::PrintStats() { 7614 std::fprintf(stderr, "*** AST File Statistics:\n"); 7615 7616 unsigned NumTypesLoaded 7617 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 7618 QualType()); 7619 unsigned NumDeclsLoaded 7620 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 7621 (Decl *)nullptr); 7622 unsigned NumIdentifiersLoaded 7623 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 7624 IdentifiersLoaded.end(), 7625 (IdentifierInfo *)nullptr); 7626 unsigned NumMacrosLoaded 7627 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 7628 MacrosLoaded.end(), 7629 (MacroInfo *)nullptr); 7630 unsigned NumSelectorsLoaded 7631 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 7632 SelectorsLoaded.end(), 7633 Selector()); 7634 7635 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 7636 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 7637 NumSLocEntriesRead, TotalNumSLocEntries, 7638 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 7639 if (!TypesLoaded.empty()) 7640 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 7641 NumTypesLoaded, (unsigned)TypesLoaded.size(), 7642 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 7643 if (!DeclsLoaded.empty()) 7644 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 7645 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 7646 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 7647 if (!IdentifiersLoaded.empty()) 7648 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 7649 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 7650 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 7651 if (!MacrosLoaded.empty()) 7652 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7653 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 7654 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 7655 if (!SelectorsLoaded.empty()) 7656 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 7657 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 7658 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 7659 if (TotalNumStatements) 7660 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 7661 NumStatementsRead, TotalNumStatements, 7662 ((float)NumStatementsRead/TotalNumStatements * 100)); 7663 if (TotalNumMacros) 7664 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7665 NumMacrosRead, TotalNumMacros, 7666 ((float)NumMacrosRead/TotalNumMacros * 100)); 7667 if (TotalLexicalDeclContexts) 7668 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 7669 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 7670 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 7671 * 100)); 7672 if (TotalVisibleDeclContexts) 7673 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 7674 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 7675 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 7676 * 100)); 7677 if (TotalNumMethodPoolEntries) 7678 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 7679 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 7680 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 7681 * 100)); 7682 if (NumMethodPoolLookups) 7683 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 7684 NumMethodPoolHits, NumMethodPoolLookups, 7685 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 7686 if (NumMethodPoolTableLookups) 7687 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 7688 NumMethodPoolTableHits, NumMethodPoolTableLookups, 7689 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 7690 * 100.0)); 7691 if (NumIdentifierLookupHits) 7692 std::fprintf(stderr, 7693 " %u / %u identifier table lookups succeeded (%f%%)\n", 7694 NumIdentifierLookupHits, NumIdentifierLookups, 7695 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 7696 7697 if (GlobalIndex) { 7698 std::fprintf(stderr, "\n"); 7699 GlobalIndex->printStats(); 7700 } 7701 7702 std::fprintf(stderr, "\n"); 7703 dump(); 7704 std::fprintf(stderr, "\n"); 7705 } 7706 7707 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 7708 LLVM_DUMP_METHOD static void 7709 dumpModuleIDMap(StringRef Name, 7710 const ContinuousRangeMap<Key, ModuleFile *, 7711 InitialCapacity> &Map) { 7712 if (Map.begin() == Map.end()) 7713 return; 7714 7715 using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>; 7716 7717 llvm::errs() << Name << ":\n"; 7718 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 7719 I != IEnd; ++I) { 7720 llvm::errs() << " " << I->first << " -> " << I->second->FileName 7721 << "\n"; 7722 } 7723 } 7724 7725 LLVM_DUMP_METHOD void ASTReader::dump() { 7726 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 7727 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 7728 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 7729 dumpModuleIDMap("Global type map", GlobalTypeMap); 7730 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 7731 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 7732 dumpModuleIDMap("Global macro map", GlobalMacroMap); 7733 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 7734 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 7735 dumpModuleIDMap("Global preprocessed entity map", 7736 GlobalPreprocessedEntityMap); 7737 7738 llvm::errs() << "\n*** PCH/Modules Loaded:"; 7739 for (ModuleFile &M : ModuleMgr) 7740 M.dump(); 7741 } 7742 7743 /// Return the amount of memory used by memory buffers, breaking down 7744 /// by heap-backed versus mmap'ed memory. 7745 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 7746 for (ModuleFile &I : ModuleMgr) { 7747 if (llvm::MemoryBuffer *buf = I.Buffer) { 7748 size_t bytes = buf->getBufferSize(); 7749 switch (buf->getBufferKind()) { 7750 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 7751 sizes.malloc_bytes += bytes; 7752 break; 7753 case llvm::MemoryBuffer::MemoryBuffer_MMap: 7754 sizes.mmap_bytes += bytes; 7755 break; 7756 } 7757 } 7758 } 7759 } 7760 7761 void ASTReader::InitializeSema(Sema &S) { 7762 SemaObj = &S; 7763 S.addExternalSource(this); 7764 7765 // Makes sure any declarations that were deserialized "too early" 7766 // still get added to the identifier's declaration chains. 7767 for (uint64_t ID : PreloadedDeclIDs) { 7768 NamedDecl *D = cast<NamedDecl>(GetDecl(ID)); 7769 pushExternalDeclIntoScope(D, D->getDeclName()); 7770 } 7771 PreloadedDeclIDs.clear(); 7772 7773 // FIXME: What happens if these are changed by a module import? 7774 if (!FPPragmaOptions.empty()) { 7775 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 7776 SemaObj->FPFeatures = FPOptions(FPPragmaOptions[0]); 7777 } 7778 7779 SemaObj->OpenCLFeatures.copy(OpenCLExtensions); 7780 SemaObj->OpenCLTypeExtMap = OpenCLTypeExtMap; 7781 SemaObj->OpenCLDeclExtMap = OpenCLDeclExtMap; 7782 7783 UpdateSema(); 7784 } 7785 7786 void ASTReader::UpdateSema() { 7787 assert(SemaObj && "no Sema to update"); 7788 7789 // Load the offsets of the declarations that Sema references. 7790 // They will be lazily deserialized when needed. 7791 if (!SemaDeclRefs.empty()) { 7792 assert(SemaDeclRefs.size() % 3 == 0); 7793 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) { 7794 if (!SemaObj->StdNamespace) 7795 SemaObj->StdNamespace = SemaDeclRefs[I]; 7796 if (!SemaObj->StdBadAlloc) 7797 SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 7798 if (!SemaObj->StdAlignValT) 7799 SemaObj->StdAlignValT = SemaDeclRefs[I+2]; 7800 } 7801 SemaDeclRefs.clear(); 7802 } 7803 7804 // Update the state of pragmas. Use the same API as if we had encountered the 7805 // pragma in the source. 7806 if(OptimizeOffPragmaLocation.isValid()) 7807 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation); 7808 if (PragmaMSStructState != -1) 7809 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState); 7810 if (PointersToMembersPragmaLocation.isValid()) { 7811 SemaObj->ActOnPragmaMSPointersToMembers( 7812 (LangOptions::PragmaMSPointersToMembersKind) 7813 PragmaMSPointersToMembersState, 7814 PointersToMembersPragmaLocation); 7815 } 7816 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth; 7817 7818 if (PragmaPackCurrentValue) { 7819 // The bottom of the stack might have a default value. It must be adjusted 7820 // to the current value to ensure that the packing state is preserved after 7821 // popping entries that were included/imported from a PCH/module. 7822 bool DropFirst = false; 7823 if (!PragmaPackStack.empty() && 7824 PragmaPackStack.front().Location.isInvalid()) { 7825 assert(PragmaPackStack.front().Value == SemaObj->PackStack.DefaultValue && 7826 "Expected a default alignment value"); 7827 SemaObj->PackStack.Stack.emplace_back( 7828 PragmaPackStack.front().SlotLabel, SemaObj->PackStack.CurrentValue, 7829 SemaObj->PackStack.CurrentPragmaLocation, 7830 PragmaPackStack.front().PushLocation); 7831 DropFirst = true; 7832 } 7833 for (const auto &Entry : 7834 llvm::makeArrayRef(PragmaPackStack).drop_front(DropFirst ? 1 : 0)) 7835 SemaObj->PackStack.Stack.emplace_back(Entry.SlotLabel, Entry.Value, 7836 Entry.Location, Entry.PushLocation); 7837 if (PragmaPackCurrentLocation.isInvalid()) { 7838 assert(*PragmaPackCurrentValue == SemaObj->PackStack.DefaultValue && 7839 "Expected a default alignment value"); 7840 // Keep the current values. 7841 } else { 7842 SemaObj->PackStack.CurrentValue = *PragmaPackCurrentValue; 7843 SemaObj->PackStack.CurrentPragmaLocation = PragmaPackCurrentLocation; 7844 } 7845 } 7846 } 7847 7848 IdentifierInfo *ASTReader::get(StringRef Name) { 7849 // Note that we are loading an identifier. 7850 Deserializing AnIdentifier(this); 7851 7852 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 7853 NumIdentifierLookups, 7854 NumIdentifierLookupHits); 7855 7856 // We don't need to do identifier table lookups in C++ modules (we preload 7857 // all interesting declarations, and don't need to use the scope for name 7858 // lookups). Perform the lookup in PCH files, though, since we don't build 7859 // a complete initial identifier table if we're carrying on from a PCH. 7860 if (PP.getLangOpts().CPlusPlus) { 7861 for (auto F : ModuleMgr.pch_modules()) 7862 if (Visitor(*F)) 7863 break; 7864 } else { 7865 // If there is a global index, look there first to determine which modules 7866 // provably do not have any results for this identifier. 7867 GlobalModuleIndex::HitSet Hits; 7868 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 7869 if (!loadGlobalIndex()) { 7870 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 7871 HitsPtr = &Hits; 7872 } 7873 } 7874 7875 ModuleMgr.visit(Visitor, HitsPtr); 7876 } 7877 7878 IdentifierInfo *II = Visitor.getIdentifierInfo(); 7879 markIdentifierUpToDate(II); 7880 return II; 7881 } 7882 7883 namespace clang { 7884 7885 /// An identifier-lookup iterator that enumerates all of the 7886 /// identifiers stored within a set of AST files. 7887 class ASTIdentifierIterator : public IdentifierIterator { 7888 /// The AST reader whose identifiers are being enumerated. 7889 const ASTReader &Reader; 7890 7891 /// The current index into the chain of AST files stored in 7892 /// the AST reader. 7893 unsigned Index; 7894 7895 /// The current position within the identifier lookup table 7896 /// of the current AST file. 7897 ASTIdentifierLookupTable::key_iterator Current; 7898 7899 /// The end position within the identifier lookup table of 7900 /// the current AST file. 7901 ASTIdentifierLookupTable::key_iterator End; 7902 7903 /// Whether to skip any modules in the ASTReader. 7904 bool SkipModules; 7905 7906 public: 7907 explicit ASTIdentifierIterator(const ASTReader &Reader, 7908 bool SkipModules = false); 7909 7910 StringRef Next() override; 7911 }; 7912 7913 } // namespace clang 7914 7915 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader, 7916 bool SkipModules) 7917 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) { 7918 } 7919 7920 StringRef ASTIdentifierIterator::Next() { 7921 while (Current == End) { 7922 // If we have exhausted all of our AST files, we're done. 7923 if (Index == 0) 7924 return StringRef(); 7925 7926 --Index; 7927 ModuleFile &F = Reader.ModuleMgr[Index]; 7928 if (SkipModules && F.isModule()) 7929 continue; 7930 7931 ASTIdentifierLookupTable *IdTable = 7932 (ASTIdentifierLookupTable *)F.IdentifierLookupTable; 7933 Current = IdTable->key_begin(); 7934 End = IdTable->key_end(); 7935 } 7936 7937 // We have any identifiers remaining in the current AST file; return 7938 // the next one. 7939 StringRef Result = *Current; 7940 ++Current; 7941 return Result; 7942 } 7943 7944 namespace { 7945 7946 /// A utility for appending two IdentifierIterators. 7947 class ChainedIdentifierIterator : public IdentifierIterator { 7948 std::unique_ptr<IdentifierIterator> Current; 7949 std::unique_ptr<IdentifierIterator> Queued; 7950 7951 public: 7952 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First, 7953 std::unique_ptr<IdentifierIterator> Second) 7954 : Current(std::move(First)), Queued(std::move(Second)) {} 7955 7956 StringRef Next() override { 7957 if (!Current) 7958 return StringRef(); 7959 7960 StringRef result = Current->Next(); 7961 if (!result.empty()) 7962 return result; 7963 7964 // Try the queued iterator, which may itself be empty. 7965 Current.reset(); 7966 std::swap(Current, Queued); 7967 return Next(); 7968 } 7969 }; 7970 7971 } // namespace 7972 7973 IdentifierIterator *ASTReader::getIdentifiers() { 7974 if (!loadGlobalIndex()) { 7975 std::unique_ptr<IdentifierIterator> ReaderIter( 7976 new ASTIdentifierIterator(*this, /*SkipModules=*/true)); 7977 std::unique_ptr<IdentifierIterator> ModulesIter( 7978 GlobalIndex->createIdentifierIterator()); 7979 return new ChainedIdentifierIterator(std::move(ReaderIter), 7980 std::move(ModulesIter)); 7981 } 7982 7983 return new ASTIdentifierIterator(*this); 7984 } 7985 7986 namespace clang { 7987 namespace serialization { 7988 7989 class ReadMethodPoolVisitor { 7990 ASTReader &Reader; 7991 Selector Sel; 7992 unsigned PriorGeneration; 7993 unsigned InstanceBits = 0; 7994 unsigned FactoryBits = 0; 7995 bool InstanceHasMoreThanOneDecl = false; 7996 bool FactoryHasMoreThanOneDecl = false; 7997 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 7998 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 7999 8000 public: 8001 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 8002 unsigned PriorGeneration) 8003 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {} 8004 8005 bool operator()(ModuleFile &M) { 8006 if (!M.SelectorLookupTable) 8007 return false; 8008 8009 // If we've already searched this module file, skip it now. 8010 if (M.Generation <= PriorGeneration) 8011 return true; 8012 8013 ++Reader.NumMethodPoolTableLookups; 8014 ASTSelectorLookupTable *PoolTable 8015 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 8016 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel); 8017 if (Pos == PoolTable->end()) 8018 return false; 8019 8020 ++Reader.NumMethodPoolTableHits; 8021 ++Reader.NumSelectorsRead; 8022 // FIXME: Not quite happy with the statistics here. We probably should 8023 // disable this tracking when called via LoadSelector. 8024 // Also, should entries without methods count as misses? 8025 ++Reader.NumMethodPoolEntriesRead; 8026 ASTSelectorLookupTrait::data_type Data = *Pos; 8027 if (Reader.DeserializationListener) 8028 Reader.DeserializationListener->SelectorRead(Data.ID, Sel); 8029 8030 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 8031 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 8032 InstanceBits = Data.InstanceBits; 8033 FactoryBits = Data.FactoryBits; 8034 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl; 8035 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl; 8036 return true; 8037 } 8038 8039 /// Retrieve the instance methods found by this visitor. 8040 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 8041 return InstanceMethods; 8042 } 8043 8044 /// Retrieve the instance methods found by this visitor. 8045 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 8046 return FactoryMethods; 8047 } 8048 8049 unsigned getInstanceBits() const { return InstanceBits; } 8050 unsigned getFactoryBits() const { return FactoryBits; } 8051 8052 bool instanceHasMoreThanOneDecl() const { 8053 return InstanceHasMoreThanOneDecl; 8054 } 8055 8056 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; } 8057 }; 8058 8059 } // namespace serialization 8060 } // namespace clang 8061 8062 /// Add the given set of methods to the method list. 8063 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 8064 ObjCMethodList &List) { 8065 for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 8066 S.addMethodToGlobalList(&List, Methods[I]); 8067 } 8068 } 8069 8070 void ASTReader::ReadMethodPool(Selector Sel) { 8071 // Get the selector generation and update it to the current generation. 8072 unsigned &Generation = SelectorGeneration[Sel]; 8073 unsigned PriorGeneration = Generation; 8074 Generation = getGeneration(); 8075 SelectorOutOfDate[Sel] = false; 8076 8077 // Search for methods defined with this selector. 8078 ++NumMethodPoolLookups; 8079 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 8080 ModuleMgr.visit(Visitor); 8081 8082 if (Visitor.getInstanceMethods().empty() && 8083 Visitor.getFactoryMethods().empty()) 8084 return; 8085 8086 ++NumMethodPoolHits; 8087 8088 if (!getSema()) 8089 return; 8090 8091 Sema &S = *getSema(); 8092 Sema::GlobalMethodPool::iterator Pos 8093 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first; 8094 8095 Pos->second.first.setBits(Visitor.getInstanceBits()); 8096 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl()); 8097 Pos->second.second.setBits(Visitor.getFactoryBits()); 8098 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl()); 8099 8100 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since 8101 // when building a module we keep every method individually and may need to 8102 // update hasMoreThanOneDecl as we add the methods. 8103 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 8104 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 8105 } 8106 8107 void ASTReader::updateOutOfDateSelector(Selector Sel) { 8108 if (SelectorOutOfDate[Sel]) 8109 ReadMethodPool(Sel); 8110 } 8111 8112 void ASTReader::ReadKnownNamespaces( 8113 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 8114 Namespaces.clear(); 8115 8116 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 8117 if (NamespaceDecl *Namespace 8118 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 8119 Namespaces.push_back(Namespace); 8120 } 8121 } 8122 8123 void ASTReader::ReadUndefinedButUsed( 8124 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) { 8125 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 8126 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 8127 SourceLocation Loc = 8128 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 8129 Undefined.insert(std::make_pair(D, Loc)); 8130 } 8131 } 8132 8133 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector< 8134 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> & 8135 Exprs) { 8136 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) { 8137 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++])); 8138 uint64_t Count = DelayedDeleteExprs[Idx++]; 8139 for (uint64_t C = 0; C < Count; ++C) { 8140 SourceLocation DeleteLoc = 8141 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]); 8142 const bool IsArrayForm = DelayedDeleteExprs[Idx++]; 8143 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm)); 8144 } 8145 } 8146 } 8147 8148 void ASTReader::ReadTentativeDefinitions( 8149 SmallVectorImpl<VarDecl *> &TentativeDefs) { 8150 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 8151 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 8152 if (Var) 8153 TentativeDefs.push_back(Var); 8154 } 8155 TentativeDefinitions.clear(); 8156 } 8157 8158 void ASTReader::ReadUnusedFileScopedDecls( 8159 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 8160 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 8161 DeclaratorDecl *D 8162 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 8163 if (D) 8164 Decls.push_back(D); 8165 } 8166 UnusedFileScopedDecls.clear(); 8167 } 8168 8169 void ASTReader::ReadDelegatingConstructors( 8170 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 8171 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 8172 CXXConstructorDecl *D 8173 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 8174 if (D) 8175 Decls.push_back(D); 8176 } 8177 DelegatingCtorDecls.clear(); 8178 } 8179 8180 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 8181 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 8182 TypedefNameDecl *D 8183 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 8184 if (D) 8185 Decls.push_back(D); 8186 } 8187 ExtVectorDecls.clear(); 8188 } 8189 8190 void ASTReader::ReadUnusedLocalTypedefNameCandidates( 8191 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 8192 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N; 8193 ++I) { 8194 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>( 8195 GetDecl(UnusedLocalTypedefNameCandidates[I])); 8196 if (D) 8197 Decls.insert(D); 8198 } 8199 UnusedLocalTypedefNameCandidates.clear(); 8200 } 8201 8202 void ASTReader::ReadDeclsToCheckForDeferredDiags( 8203 llvm::SmallVector<Decl *, 4> &Decls) { 8204 for (unsigned I = 0, N = DeclsToCheckForDeferredDiags.size(); I != N; 8205 ++I) { 8206 auto *D = dyn_cast_or_null<Decl>( 8207 GetDecl(DeclsToCheckForDeferredDiags[I])); 8208 if (D) 8209 Decls.push_back(D); 8210 } 8211 DeclsToCheckForDeferredDiags.clear(); 8212 } 8213 8214 8215 void ASTReader::ReadReferencedSelectors( 8216 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) { 8217 if (ReferencedSelectorsData.empty()) 8218 return; 8219 8220 // If there are @selector references added them to its pool. This is for 8221 // implementation of -Wselector. 8222 unsigned int DataSize = ReferencedSelectorsData.size()-1; 8223 unsigned I = 0; 8224 while (I < DataSize) { 8225 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 8226 SourceLocation SelLoc 8227 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 8228 Sels.push_back(std::make_pair(Sel, SelLoc)); 8229 } 8230 ReferencedSelectorsData.clear(); 8231 } 8232 8233 void ASTReader::ReadWeakUndeclaredIdentifiers( 8234 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) { 8235 if (WeakUndeclaredIdentifiers.empty()) 8236 return; 8237 8238 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 8239 IdentifierInfo *WeakId 8240 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8241 IdentifierInfo *AliasId 8242 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8243 SourceLocation Loc 8244 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 8245 bool Used = WeakUndeclaredIdentifiers[I++]; 8246 WeakInfo WI(AliasId, Loc); 8247 WI.setUsed(Used); 8248 WeakIDs.push_back(std::make_pair(WeakId, WI)); 8249 } 8250 WeakUndeclaredIdentifiers.clear(); 8251 } 8252 8253 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 8254 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 8255 ExternalVTableUse VT; 8256 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 8257 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 8258 VT.DefinitionRequired = VTableUses[Idx++]; 8259 VTables.push_back(VT); 8260 } 8261 8262 VTableUses.clear(); 8263 } 8264 8265 void ASTReader::ReadPendingInstantiations( 8266 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) { 8267 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 8268 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 8269 SourceLocation Loc 8270 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 8271 8272 Pending.push_back(std::make_pair(D, Loc)); 8273 } 8274 PendingInstantiations.clear(); 8275 } 8276 8277 void ASTReader::ReadLateParsedTemplates( 8278 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>> 8279 &LPTMap) { 8280 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N; 8281 /* In loop */) { 8282 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++])); 8283 8284 auto LT = std::make_unique<LateParsedTemplate>(); 8285 LT->D = GetDecl(LateParsedTemplates[Idx++]); 8286 8287 ModuleFile *F = getOwningModuleFile(LT->D); 8288 assert(F && "No module"); 8289 8290 unsigned TokN = LateParsedTemplates[Idx++]; 8291 LT->Toks.reserve(TokN); 8292 for (unsigned T = 0; T < TokN; ++T) 8293 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx)); 8294 8295 LPTMap.insert(std::make_pair(FD, std::move(LT))); 8296 } 8297 8298 LateParsedTemplates.clear(); 8299 } 8300 8301 void ASTReader::LoadSelector(Selector Sel) { 8302 // It would be complicated to avoid reading the methods anyway. So don't. 8303 ReadMethodPool(Sel); 8304 } 8305 8306 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 8307 assert(ID && "Non-zero identifier ID required"); 8308 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 8309 IdentifiersLoaded[ID - 1] = II; 8310 if (DeserializationListener) 8311 DeserializationListener->IdentifierRead(ID, II); 8312 } 8313 8314 /// Set the globally-visible declarations associated with the given 8315 /// identifier. 8316 /// 8317 /// If the AST reader is currently in a state where the given declaration IDs 8318 /// cannot safely be resolved, they are queued until it is safe to resolve 8319 /// them. 8320 /// 8321 /// \param II an IdentifierInfo that refers to one or more globally-visible 8322 /// declarations. 8323 /// 8324 /// \param DeclIDs the set of declaration IDs with the name @p II that are 8325 /// visible at global scope. 8326 /// 8327 /// \param Decls if non-null, this vector will be populated with the set of 8328 /// deserialized declarations. These declarations will not be pushed into 8329 /// scope. 8330 void 8331 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 8332 const SmallVectorImpl<uint32_t> &DeclIDs, 8333 SmallVectorImpl<Decl *> *Decls) { 8334 if (NumCurrentElementsDeserializing && !Decls) { 8335 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 8336 return; 8337 } 8338 8339 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 8340 if (!SemaObj) { 8341 // Queue this declaration so that it will be added to the 8342 // translation unit scope and identifier's declaration chain 8343 // once a Sema object is known. 8344 PreloadedDeclIDs.push_back(DeclIDs[I]); 8345 continue; 8346 } 8347 8348 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 8349 8350 // If we're simply supposed to record the declarations, do so now. 8351 if (Decls) { 8352 Decls->push_back(D); 8353 continue; 8354 } 8355 8356 // Introduce this declaration into the translation-unit scope 8357 // and add it to the declaration chain for this identifier, so 8358 // that (unqualified) name lookup will find it. 8359 pushExternalDeclIntoScope(D, II); 8360 } 8361 } 8362 8363 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 8364 if (ID == 0) 8365 return nullptr; 8366 8367 if (IdentifiersLoaded.empty()) { 8368 Error("no identifier table in AST file"); 8369 return nullptr; 8370 } 8371 8372 ID -= 1; 8373 if (!IdentifiersLoaded[ID]) { 8374 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 8375 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 8376 ModuleFile *M = I->second; 8377 unsigned Index = ID - M->BaseIdentifierID; 8378 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index]; 8379 8380 // All of the strings in the AST file are preceded by a 16-bit length. 8381 // Extract that 16-bit length to avoid having to execute strlen(). 8382 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as 8383 // unsigned integers. This is important to avoid integer overflow when 8384 // we cast them to 'unsigned'. 8385 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2; 8386 unsigned StrLen = (((unsigned) StrLenPtr[0]) 8387 | (((unsigned) StrLenPtr[1]) << 8)) - 1; 8388 auto &II = PP.getIdentifierTable().get(StringRef(Str, StrLen)); 8389 IdentifiersLoaded[ID] = &II; 8390 markIdentifierFromAST(*this, II); 8391 if (DeserializationListener) 8392 DeserializationListener->IdentifierRead(ID + 1, &II); 8393 } 8394 8395 return IdentifiersLoaded[ID]; 8396 } 8397 8398 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 8399 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 8400 } 8401 8402 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 8403 if (LocalID < NUM_PREDEF_IDENT_IDS) 8404 return LocalID; 8405 8406 if (!M.ModuleOffsetMap.empty()) 8407 ReadModuleOffsetMap(M); 8408 8409 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8410 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 8411 assert(I != M.IdentifierRemap.end() 8412 && "Invalid index into identifier index remap"); 8413 8414 return LocalID + I->second; 8415 } 8416 8417 MacroInfo *ASTReader::getMacro(MacroID ID) { 8418 if (ID == 0) 8419 return nullptr; 8420 8421 if (MacrosLoaded.empty()) { 8422 Error("no macro table in AST file"); 8423 return nullptr; 8424 } 8425 8426 ID -= NUM_PREDEF_MACRO_IDS; 8427 if (!MacrosLoaded[ID]) { 8428 GlobalMacroMapType::iterator I 8429 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 8430 assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 8431 ModuleFile *M = I->second; 8432 unsigned Index = ID - M->BaseMacroID; 8433 MacrosLoaded[ID] = 8434 ReadMacroRecord(*M, M->MacroOffsetsBase + M->MacroOffsets[Index]); 8435 8436 if (DeserializationListener) 8437 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 8438 MacrosLoaded[ID]); 8439 } 8440 8441 return MacrosLoaded[ID]; 8442 } 8443 8444 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 8445 if (LocalID < NUM_PREDEF_MACRO_IDS) 8446 return LocalID; 8447 8448 if (!M.ModuleOffsetMap.empty()) 8449 ReadModuleOffsetMap(M); 8450 8451 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8452 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 8453 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 8454 8455 return LocalID + I->second; 8456 } 8457 8458 serialization::SubmoduleID 8459 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 8460 if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 8461 return LocalID; 8462 8463 if (!M.ModuleOffsetMap.empty()) 8464 ReadModuleOffsetMap(M); 8465 8466 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8467 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 8468 assert(I != M.SubmoduleRemap.end() 8469 && "Invalid index into submodule index remap"); 8470 8471 return LocalID + I->second; 8472 } 8473 8474 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) { 8475 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 8476 assert(GlobalID == 0 && "Unhandled global submodule ID"); 8477 return nullptr; 8478 } 8479 8480 if (GlobalID > SubmodulesLoaded.size()) { 8481 Error("submodule ID out of range in AST file"); 8482 return nullptr; 8483 } 8484 8485 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 8486 } 8487 8488 Module *ASTReader::getModule(unsigned ID) { 8489 return getSubmodule(ID); 8490 } 8491 8492 bool ASTReader::DeclIsFromPCHWithObjectFile(const Decl *D) { 8493 ModuleFile *MF = getOwningModuleFile(D); 8494 return MF && MF->PCHHasObjectFile; 8495 } 8496 8497 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) { 8498 if (ID & 1) { 8499 // It's a module, look it up by submodule ID. 8500 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1)); 8501 return I == GlobalSubmoduleMap.end() ? nullptr : I->second; 8502 } else { 8503 // It's a prefix (preamble, PCH, ...). Look it up by index. 8504 unsigned IndexFromEnd = ID >> 1; 8505 assert(IndexFromEnd && "got reference to unknown module file"); 8506 return getModuleManager().pch_modules().end()[-IndexFromEnd]; 8507 } 8508 } 8509 8510 unsigned ASTReader::getModuleFileID(ModuleFile *F) { 8511 if (!F) 8512 return 1; 8513 8514 // For a file representing a module, use the submodule ID of the top-level 8515 // module as the file ID. For any other kind of file, the number of such 8516 // files loaded beforehand will be the same on reload. 8517 // FIXME: Is this true even if we have an explicit module file and a PCH? 8518 if (F->isModule()) 8519 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1; 8520 8521 auto PCHModules = getModuleManager().pch_modules(); 8522 auto I = llvm::find(PCHModules, F); 8523 assert(I != PCHModules.end() && "emitting reference to unknown file"); 8524 return (I - PCHModules.end()) << 1; 8525 } 8526 8527 llvm::Optional<ASTSourceDescriptor> 8528 ASTReader::getSourceDescriptor(unsigned ID) { 8529 if (Module *M = getSubmodule(ID)) 8530 return ASTSourceDescriptor(*M); 8531 8532 // If there is only a single PCH, return it instead. 8533 // Chained PCH are not supported. 8534 const auto &PCHChain = ModuleMgr.pch_modules(); 8535 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) { 8536 ModuleFile &MF = ModuleMgr.getPrimaryModule(); 8537 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName); 8538 StringRef FileName = llvm::sys::path::filename(MF.FileName); 8539 return ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName, 8540 MF.Signature); 8541 } 8542 return None; 8543 } 8544 8545 ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) { 8546 auto I = DefinitionSource.find(FD); 8547 if (I == DefinitionSource.end()) 8548 return EK_ReplyHazy; 8549 return I->second ? EK_Never : EK_Always; 8550 } 8551 8552 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 8553 return DecodeSelector(getGlobalSelectorID(M, LocalID)); 8554 } 8555 8556 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { 8557 if (ID == 0) 8558 return Selector(); 8559 8560 if (ID > SelectorsLoaded.size()) { 8561 Error("selector ID out of range in AST file"); 8562 return Selector(); 8563 } 8564 8565 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) { 8566 // Load this selector from the selector table. 8567 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 8568 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 8569 ModuleFile &M = *I->second; 8570 ASTSelectorLookupTrait Trait(*this, M); 8571 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 8572 SelectorsLoaded[ID - 1] = 8573 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 8574 if (DeserializationListener) 8575 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 8576 } 8577 8578 return SelectorsLoaded[ID - 1]; 8579 } 8580 8581 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 8582 return DecodeSelector(ID); 8583 } 8584 8585 uint32_t ASTReader::GetNumExternalSelectors() { 8586 // ID 0 (the null selector) is considered an external selector. 8587 return getTotalNumSelectors() + 1; 8588 } 8589 8590 serialization::SelectorID 8591 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 8592 if (LocalID < NUM_PREDEF_SELECTOR_IDS) 8593 return LocalID; 8594 8595 if (!M.ModuleOffsetMap.empty()) 8596 ReadModuleOffsetMap(M); 8597 8598 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8599 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 8600 assert(I != M.SelectorRemap.end() 8601 && "Invalid index into selector index remap"); 8602 8603 return LocalID + I->second; 8604 } 8605 8606 DeclarationNameLoc 8607 ASTRecordReader::readDeclarationNameLoc(DeclarationName Name) { 8608 DeclarationNameLoc DNLoc; 8609 switch (Name.getNameKind()) { 8610 case DeclarationName::CXXConstructorName: 8611 case DeclarationName::CXXDestructorName: 8612 case DeclarationName::CXXConversionFunctionName: 8613 DNLoc.NamedType.TInfo = readTypeSourceInfo(); 8614 break; 8615 8616 case DeclarationName::CXXOperatorName: 8617 DNLoc.CXXOperatorName.BeginOpNameLoc 8618 = readSourceLocation().getRawEncoding(); 8619 DNLoc.CXXOperatorName.EndOpNameLoc 8620 = readSourceLocation().getRawEncoding(); 8621 break; 8622 8623 case DeclarationName::CXXLiteralOperatorName: 8624 DNLoc.CXXLiteralOperatorName.OpNameLoc 8625 = readSourceLocation().getRawEncoding(); 8626 break; 8627 8628 case DeclarationName::Identifier: 8629 case DeclarationName::ObjCZeroArgSelector: 8630 case DeclarationName::ObjCOneArgSelector: 8631 case DeclarationName::ObjCMultiArgSelector: 8632 case DeclarationName::CXXUsingDirective: 8633 case DeclarationName::CXXDeductionGuideName: 8634 break; 8635 } 8636 return DNLoc; 8637 } 8638 8639 DeclarationNameInfo ASTRecordReader::readDeclarationNameInfo() { 8640 DeclarationNameInfo NameInfo; 8641 NameInfo.setName(readDeclarationName()); 8642 NameInfo.setLoc(readSourceLocation()); 8643 NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName())); 8644 return NameInfo; 8645 } 8646 8647 void ASTRecordReader::readQualifierInfo(QualifierInfo &Info) { 8648 Info.QualifierLoc = readNestedNameSpecifierLoc(); 8649 unsigned NumTPLists = readInt(); 8650 Info.NumTemplParamLists = NumTPLists; 8651 if (NumTPLists) { 8652 Info.TemplParamLists = 8653 new (getContext()) TemplateParameterList *[NumTPLists]; 8654 for (unsigned i = 0; i != NumTPLists; ++i) 8655 Info.TemplParamLists[i] = readTemplateParameterList(); 8656 } 8657 } 8658 8659 TemplateParameterList * 8660 ASTRecordReader::readTemplateParameterList() { 8661 SourceLocation TemplateLoc = readSourceLocation(); 8662 SourceLocation LAngleLoc = readSourceLocation(); 8663 SourceLocation RAngleLoc = readSourceLocation(); 8664 8665 unsigned NumParams = readInt(); 8666 SmallVector<NamedDecl *, 16> Params; 8667 Params.reserve(NumParams); 8668 while (NumParams--) 8669 Params.push_back(readDeclAs<NamedDecl>()); 8670 8671 bool HasRequiresClause = readBool(); 8672 Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr; 8673 8674 TemplateParameterList *TemplateParams = TemplateParameterList::Create( 8675 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause); 8676 return TemplateParams; 8677 } 8678 8679 void ASTRecordReader::readTemplateArgumentList( 8680 SmallVectorImpl<TemplateArgument> &TemplArgs, 8681 bool Canonicalize) { 8682 unsigned NumTemplateArgs = readInt(); 8683 TemplArgs.reserve(NumTemplateArgs); 8684 while (NumTemplateArgs--) 8685 TemplArgs.push_back(readTemplateArgument(Canonicalize)); 8686 } 8687 8688 /// Read a UnresolvedSet structure. 8689 void ASTRecordReader::readUnresolvedSet(LazyASTUnresolvedSet &Set) { 8690 unsigned NumDecls = readInt(); 8691 Set.reserve(getContext(), NumDecls); 8692 while (NumDecls--) { 8693 DeclID ID = readDeclID(); 8694 AccessSpecifier AS = (AccessSpecifier) readInt(); 8695 Set.addLazyDecl(getContext(), ID, AS); 8696 } 8697 } 8698 8699 CXXBaseSpecifier 8700 ASTRecordReader::readCXXBaseSpecifier() { 8701 bool isVirtual = readBool(); 8702 bool isBaseOfClass = readBool(); 8703 AccessSpecifier AS = static_cast<AccessSpecifier>(readInt()); 8704 bool inheritConstructors = readBool(); 8705 TypeSourceInfo *TInfo = readTypeSourceInfo(); 8706 SourceRange Range = readSourceRange(); 8707 SourceLocation EllipsisLoc = readSourceLocation(); 8708 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 8709 EllipsisLoc); 8710 Result.setInheritConstructors(inheritConstructors); 8711 return Result; 8712 } 8713 8714 CXXCtorInitializer ** 8715 ASTRecordReader::readCXXCtorInitializers() { 8716 ASTContext &Context = getContext(); 8717 unsigned NumInitializers = readInt(); 8718 assert(NumInitializers && "wrote ctor initializers but have no inits"); 8719 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers]; 8720 for (unsigned i = 0; i != NumInitializers; ++i) { 8721 TypeSourceInfo *TInfo = nullptr; 8722 bool IsBaseVirtual = false; 8723 FieldDecl *Member = nullptr; 8724 IndirectFieldDecl *IndirectMember = nullptr; 8725 8726 CtorInitializerType Type = (CtorInitializerType) readInt(); 8727 switch (Type) { 8728 case CTOR_INITIALIZER_BASE: 8729 TInfo = readTypeSourceInfo(); 8730 IsBaseVirtual = readBool(); 8731 break; 8732 8733 case CTOR_INITIALIZER_DELEGATING: 8734 TInfo = readTypeSourceInfo(); 8735 break; 8736 8737 case CTOR_INITIALIZER_MEMBER: 8738 Member = readDeclAs<FieldDecl>(); 8739 break; 8740 8741 case CTOR_INITIALIZER_INDIRECT_MEMBER: 8742 IndirectMember = readDeclAs<IndirectFieldDecl>(); 8743 break; 8744 } 8745 8746 SourceLocation MemberOrEllipsisLoc = readSourceLocation(); 8747 Expr *Init = readExpr(); 8748 SourceLocation LParenLoc = readSourceLocation(); 8749 SourceLocation RParenLoc = readSourceLocation(); 8750 8751 CXXCtorInitializer *BOMInit; 8752 if (Type == CTOR_INITIALIZER_BASE) 8753 BOMInit = new (Context) 8754 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init, 8755 RParenLoc, MemberOrEllipsisLoc); 8756 else if (Type == CTOR_INITIALIZER_DELEGATING) 8757 BOMInit = new (Context) 8758 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc); 8759 else if (Member) 8760 BOMInit = new (Context) 8761 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc, 8762 Init, RParenLoc); 8763 else 8764 BOMInit = new (Context) 8765 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc, 8766 LParenLoc, Init, RParenLoc); 8767 8768 if (/*IsWritten*/readBool()) { 8769 unsigned SourceOrder = readInt(); 8770 BOMInit->setSourceOrder(SourceOrder); 8771 } 8772 8773 CtorInitializers[i] = BOMInit; 8774 } 8775 8776 return CtorInitializers; 8777 } 8778 8779 NestedNameSpecifierLoc 8780 ASTRecordReader::readNestedNameSpecifierLoc() { 8781 ASTContext &Context = getContext(); 8782 unsigned N = readInt(); 8783 NestedNameSpecifierLocBuilder Builder; 8784 for (unsigned I = 0; I != N; ++I) { 8785 auto Kind = readNestedNameSpecifierKind(); 8786 switch (Kind) { 8787 case NestedNameSpecifier::Identifier: { 8788 IdentifierInfo *II = readIdentifier(); 8789 SourceRange Range = readSourceRange(); 8790 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 8791 break; 8792 } 8793 8794 case NestedNameSpecifier::Namespace: { 8795 NamespaceDecl *NS = readDeclAs<NamespaceDecl>(); 8796 SourceRange Range = readSourceRange(); 8797 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 8798 break; 8799 } 8800 8801 case NestedNameSpecifier::NamespaceAlias: { 8802 NamespaceAliasDecl *Alias = readDeclAs<NamespaceAliasDecl>(); 8803 SourceRange Range = readSourceRange(); 8804 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 8805 break; 8806 } 8807 8808 case NestedNameSpecifier::TypeSpec: 8809 case NestedNameSpecifier::TypeSpecWithTemplate: { 8810 bool Template = readBool(); 8811 TypeSourceInfo *T = readTypeSourceInfo(); 8812 if (!T) 8813 return NestedNameSpecifierLoc(); 8814 SourceLocation ColonColonLoc = readSourceLocation(); 8815 8816 // FIXME: 'template' keyword location not saved anywhere, so we fake it. 8817 Builder.Extend(Context, 8818 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 8819 T->getTypeLoc(), ColonColonLoc); 8820 break; 8821 } 8822 8823 case NestedNameSpecifier::Global: { 8824 SourceLocation ColonColonLoc = readSourceLocation(); 8825 Builder.MakeGlobal(Context, ColonColonLoc); 8826 break; 8827 } 8828 8829 case NestedNameSpecifier::Super: { 8830 CXXRecordDecl *RD = readDeclAs<CXXRecordDecl>(); 8831 SourceRange Range = readSourceRange(); 8832 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd()); 8833 break; 8834 } 8835 } 8836 } 8837 8838 return Builder.getWithLocInContext(Context); 8839 } 8840 8841 SourceRange 8842 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 8843 unsigned &Idx) { 8844 SourceLocation beg = ReadSourceLocation(F, Record, Idx); 8845 SourceLocation end = ReadSourceLocation(F, Record, Idx); 8846 return SourceRange(beg, end); 8847 } 8848 8849 static FixedPointSemantics 8850 ReadFixedPointSemantics(const SmallVectorImpl<uint64_t> &Record, 8851 unsigned &Idx) { 8852 unsigned Width = Record[Idx++]; 8853 unsigned Scale = Record[Idx++]; 8854 uint64_t Tmp = Record[Idx++]; 8855 bool IsSigned = Tmp & 0x1; 8856 bool IsSaturated = Tmp & 0x2; 8857 bool HasUnsignedPadding = Tmp & 0x4; 8858 return FixedPointSemantics(Width, Scale, IsSigned, IsSaturated, 8859 HasUnsignedPadding); 8860 } 8861 8862 static const llvm::fltSemantics & 8863 readAPFloatSemantics(ASTRecordReader &reader) { 8864 return llvm::APFloatBase::EnumToSemantics( 8865 static_cast<llvm::APFloatBase::Semantics>(reader.readInt())); 8866 } 8867 8868 APValue ASTRecordReader::readAPValue() { 8869 unsigned Kind = readInt(); 8870 switch ((APValue::ValueKind) Kind) { 8871 case APValue::None: 8872 return APValue(); 8873 case APValue::Indeterminate: 8874 return APValue::IndeterminateValue(); 8875 case APValue::Int: 8876 return APValue(readAPSInt()); 8877 case APValue::Float: { 8878 const llvm::fltSemantics &FloatSema = readAPFloatSemantics(*this); 8879 return APValue(readAPFloat(FloatSema)); 8880 } 8881 case APValue::FixedPoint: { 8882 FixedPointSemantics FPSema = ReadFixedPointSemantics(Record, Idx); 8883 return APValue(APFixedPoint(readAPInt(), FPSema)); 8884 } 8885 case APValue::ComplexInt: { 8886 llvm::APSInt First = readAPSInt(); 8887 return APValue(std::move(First), readAPSInt()); 8888 } 8889 case APValue::ComplexFloat: { 8890 const llvm::fltSemantics &FloatSema1 = readAPFloatSemantics(*this); 8891 llvm::APFloat First = readAPFloat(FloatSema1); 8892 const llvm::fltSemantics &FloatSema2 = readAPFloatSemantics(*this); 8893 return APValue(std::move(First), readAPFloat(FloatSema2)); 8894 } 8895 case APValue::LValue: 8896 case APValue::Vector: 8897 case APValue::Array: 8898 case APValue::Struct: 8899 case APValue::Union: 8900 case APValue::MemberPointer: 8901 case APValue::AddrLabelDiff: 8902 // TODO : Handle all these APValue::ValueKind. 8903 return APValue(); 8904 } 8905 llvm_unreachable("Invalid APValue::ValueKind"); 8906 } 8907 8908 /// Read a floating-point value 8909 llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) { 8910 return llvm::APFloat(Sem, readAPInt()); 8911 } 8912 8913 // Read a string 8914 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 8915 unsigned Len = Record[Idx++]; 8916 std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 8917 Idx += Len; 8918 return Result; 8919 } 8920 8921 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record, 8922 unsigned &Idx) { 8923 std::string Filename = ReadString(Record, Idx); 8924 ResolveImportedPath(F, Filename); 8925 return Filename; 8926 } 8927 8928 std::string ASTReader::ReadPath(StringRef BaseDirectory, 8929 const RecordData &Record, unsigned &Idx) { 8930 std::string Filename = ReadString(Record, Idx); 8931 if (!BaseDirectory.empty()) 8932 ResolveImportedPath(Filename, BaseDirectory); 8933 return Filename; 8934 } 8935 8936 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 8937 unsigned &Idx) { 8938 unsigned Major = Record[Idx++]; 8939 unsigned Minor = Record[Idx++]; 8940 unsigned Subminor = Record[Idx++]; 8941 if (Minor == 0) 8942 return VersionTuple(Major); 8943 if (Subminor == 0) 8944 return VersionTuple(Major, Minor - 1); 8945 return VersionTuple(Major, Minor - 1, Subminor - 1); 8946 } 8947 8948 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 8949 const RecordData &Record, 8950 unsigned &Idx) { 8951 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 8952 return CXXTemporary::Create(getContext(), Decl); 8953 } 8954 8955 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const { 8956 return Diag(CurrentImportLoc, DiagID); 8957 } 8958 8959 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const { 8960 return Diags.Report(Loc, DiagID); 8961 } 8962 8963 /// Retrieve the identifier table associated with the 8964 /// preprocessor. 8965 IdentifierTable &ASTReader::getIdentifierTable() { 8966 return PP.getIdentifierTable(); 8967 } 8968 8969 /// Record that the given ID maps to the given switch-case 8970 /// statement. 8971 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 8972 assert((*CurrSwitchCaseStmts)[ID] == nullptr && 8973 "Already have a SwitchCase with this ID"); 8974 (*CurrSwitchCaseStmts)[ID] = SC; 8975 } 8976 8977 /// Retrieve the switch-case statement with the given ID. 8978 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 8979 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID"); 8980 return (*CurrSwitchCaseStmts)[ID]; 8981 } 8982 8983 void ASTReader::ClearSwitchCaseIDs() { 8984 CurrSwitchCaseStmts->clear(); 8985 } 8986 8987 void ASTReader::ReadComments() { 8988 ASTContext &Context = getContext(); 8989 std::vector<RawComment *> Comments; 8990 for (SmallVectorImpl<std::pair<BitstreamCursor, 8991 serialization::ModuleFile *>>::iterator 8992 I = CommentsCursors.begin(), 8993 E = CommentsCursors.end(); 8994 I != E; ++I) { 8995 Comments.clear(); 8996 BitstreamCursor &Cursor = I->first; 8997 serialization::ModuleFile &F = *I->second; 8998 SavedStreamPosition SavedPosition(Cursor); 8999 9000 RecordData Record; 9001 while (true) { 9002 Expected<llvm::BitstreamEntry> MaybeEntry = 9003 Cursor.advanceSkippingSubblocks( 9004 BitstreamCursor::AF_DontPopBlockAtEnd); 9005 if (!MaybeEntry) { 9006 Error(MaybeEntry.takeError()); 9007 return; 9008 } 9009 llvm::BitstreamEntry Entry = MaybeEntry.get(); 9010 9011 switch (Entry.Kind) { 9012 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 9013 case llvm::BitstreamEntry::Error: 9014 Error("malformed block record in AST file"); 9015 return; 9016 case llvm::BitstreamEntry::EndBlock: 9017 goto NextCursor; 9018 case llvm::BitstreamEntry::Record: 9019 // The interesting case. 9020 break; 9021 } 9022 9023 // Read a record. 9024 Record.clear(); 9025 Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record); 9026 if (!MaybeComment) { 9027 Error(MaybeComment.takeError()); 9028 return; 9029 } 9030 switch ((CommentRecordTypes)MaybeComment.get()) { 9031 case COMMENTS_RAW_COMMENT: { 9032 unsigned Idx = 0; 9033 SourceRange SR = ReadSourceRange(F, Record, Idx); 9034 RawComment::CommentKind Kind = 9035 (RawComment::CommentKind) Record[Idx++]; 9036 bool IsTrailingComment = Record[Idx++]; 9037 bool IsAlmostTrailingComment = Record[Idx++]; 9038 Comments.push_back(new (Context) RawComment( 9039 SR, Kind, IsTrailingComment, IsAlmostTrailingComment)); 9040 break; 9041 } 9042 } 9043 } 9044 NextCursor: 9045 llvm::DenseMap<FileID, std::map<unsigned, RawComment *>> 9046 FileToOffsetToComment; 9047 for (RawComment *C : Comments) { 9048 SourceLocation CommentLoc = C->getBeginLoc(); 9049 if (CommentLoc.isValid()) { 9050 std::pair<FileID, unsigned> Loc = 9051 SourceMgr.getDecomposedLoc(CommentLoc); 9052 if (Loc.first.isValid()) 9053 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C); 9054 } 9055 } 9056 } 9057 } 9058 9059 void ASTReader::visitInputFiles(serialization::ModuleFile &MF, 9060 bool IncludeSystem, bool Complain, 9061 llvm::function_ref<void(const serialization::InputFile &IF, 9062 bool isSystem)> Visitor) { 9063 unsigned NumUserInputs = MF.NumUserInputFiles; 9064 unsigned NumInputs = MF.InputFilesLoaded.size(); 9065 assert(NumUserInputs <= NumInputs); 9066 unsigned N = IncludeSystem ? NumInputs : NumUserInputs; 9067 for (unsigned I = 0; I < N; ++I) { 9068 bool IsSystem = I >= NumUserInputs; 9069 InputFile IF = getInputFile(MF, I+1, Complain); 9070 Visitor(IF, IsSystem); 9071 } 9072 } 9073 9074 void ASTReader::visitTopLevelModuleMaps( 9075 serialization::ModuleFile &MF, 9076 llvm::function_ref<void(const FileEntry *FE)> Visitor) { 9077 unsigned NumInputs = MF.InputFilesLoaded.size(); 9078 for (unsigned I = 0; I < NumInputs; ++I) { 9079 InputFileInfo IFI = readInputFileInfo(MF, I + 1); 9080 if (IFI.TopLevelModuleMap) 9081 // FIXME: This unnecessarily re-reads the InputFileInfo. 9082 if (auto *FE = getInputFile(MF, I + 1).getFile()) 9083 Visitor(FE); 9084 } 9085 } 9086 9087 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) { 9088 // If we know the owning module, use it. 9089 if (Module *M = D->getImportedOwningModule()) 9090 return M->getFullModuleName(); 9091 9092 // Otherwise, use the name of the top-level module the decl is within. 9093 if (ModuleFile *M = getOwningModuleFile(D)) 9094 return M->ModuleName; 9095 9096 // Not from a module. 9097 return {}; 9098 } 9099 9100 void ASTReader::finishPendingActions() { 9101 while (!PendingIdentifierInfos.empty() || !PendingFunctionTypes.empty() || 9102 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() || 9103 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || 9104 !PendingUpdateRecords.empty()) { 9105 // If any identifiers with corresponding top-level declarations have 9106 // been loaded, load those declarations now. 9107 using TopLevelDeclsMap = 9108 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>; 9109 TopLevelDeclsMap TopLevelDecls; 9110 9111 while (!PendingIdentifierInfos.empty()) { 9112 IdentifierInfo *II = PendingIdentifierInfos.back().first; 9113 SmallVector<uint32_t, 4> DeclIDs = 9114 std::move(PendingIdentifierInfos.back().second); 9115 PendingIdentifierInfos.pop_back(); 9116 9117 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 9118 } 9119 9120 // Load each function type that we deferred loading because it was a 9121 // deduced type that might refer to a local type declared within itself. 9122 for (unsigned I = 0; I != PendingFunctionTypes.size(); ++I) { 9123 auto *FD = PendingFunctionTypes[I].first; 9124 FD->setType(GetType(PendingFunctionTypes[I].second)); 9125 9126 // If we gave a function a deduced return type, remember that we need to 9127 // propagate that along the redeclaration chain. 9128 auto *DT = FD->getReturnType()->getContainedDeducedType(); 9129 if (DT && DT->isDeduced()) 9130 PendingDeducedTypeUpdates.insert( 9131 {FD->getCanonicalDecl(), FD->getReturnType()}); 9132 } 9133 PendingFunctionTypes.clear(); 9134 9135 // For each decl chain that we wanted to complete while deserializing, mark 9136 // it as "still needs to be completed". 9137 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) { 9138 markIncompleteDeclChain(PendingIncompleteDeclChains[I]); 9139 } 9140 PendingIncompleteDeclChains.clear(); 9141 9142 // Load pending declaration chains. 9143 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) 9144 loadPendingDeclChain(PendingDeclChains[I].first, 9145 PendingDeclChains[I].second); 9146 PendingDeclChains.clear(); 9147 9148 // Make the most recent of the top-level declarations visible. 9149 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 9150 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 9151 IdentifierInfo *II = TLD->first; 9152 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 9153 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 9154 } 9155 } 9156 9157 // Load any pending macro definitions. 9158 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 9159 IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 9160 SmallVector<PendingMacroInfo, 2> GlobalIDs; 9161 GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 9162 // Initialize the macro history from chained-PCHs ahead of module imports. 9163 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9164 ++IDIdx) { 9165 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9166 if (!Info.M->isModule()) 9167 resolvePendingMacro(II, Info); 9168 } 9169 // Handle module imports. 9170 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9171 ++IDIdx) { 9172 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9173 if (Info.M->isModule()) 9174 resolvePendingMacro(II, Info); 9175 } 9176 } 9177 PendingMacroIDs.clear(); 9178 9179 // Wire up the DeclContexts for Decls that we delayed setting until 9180 // recursive loading is completed. 9181 while (!PendingDeclContextInfos.empty()) { 9182 PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 9183 PendingDeclContextInfos.pop_front(); 9184 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 9185 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 9186 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 9187 } 9188 9189 // Perform any pending declaration updates. 9190 while (!PendingUpdateRecords.empty()) { 9191 auto Update = PendingUpdateRecords.pop_back_val(); 9192 ReadingKindTracker ReadingKind(Read_Decl, *this); 9193 loadDeclUpdateRecords(Update); 9194 } 9195 } 9196 9197 // At this point, all update records for loaded decls are in place, so any 9198 // fake class definitions should have become real. 9199 assert(PendingFakeDefinitionData.empty() && 9200 "faked up a class definition but never saw the real one"); 9201 9202 // If we deserialized any C++ or Objective-C class definitions, any 9203 // Objective-C protocol definitions, or any redeclarable templates, make sure 9204 // that all redeclarations point to the definitions. Note that this can only 9205 // happen now, after the redeclaration chains have been fully wired. 9206 for (Decl *D : PendingDefinitions) { 9207 if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 9208 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) { 9209 // Make sure that the TagType points at the definition. 9210 const_cast<TagType*>(TagT)->decl = TD; 9211 } 9212 9213 if (auto RD = dyn_cast<CXXRecordDecl>(D)) { 9214 for (auto *R = getMostRecentExistingDecl(RD); R; 9215 R = R->getPreviousDecl()) { 9216 assert((R == D) == 9217 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && 9218 "declaration thinks it's the definition but it isn't"); 9219 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData; 9220 } 9221 } 9222 9223 continue; 9224 } 9225 9226 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) { 9227 // Make sure that the ObjCInterfaceType points at the definition. 9228 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 9229 ->Decl = ID; 9230 9231 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl()) 9232 cast<ObjCInterfaceDecl>(R)->Data = ID->Data; 9233 9234 continue; 9235 } 9236 9237 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) { 9238 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl()) 9239 cast<ObjCProtocolDecl>(R)->Data = PD->Data; 9240 9241 continue; 9242 } 9243 9244 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl(); 9245 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl()) 9246 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common; 9247 } 9248 PendingDefinitions.clear(); 9249 9250 // Load the bodies of any functions or methods we've encountered. We do 9251 // this now (delayed) so that we can be sure that the declaration chains 9252 // have been fully wired up (hasBody relies on this). 9253 // FIXME: We shouldn't require complete redeclaration chains here. 9254 for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 9255 PBEnd = PendingBodies.end(); 9256 PB != PBEnd; ++PB) { 9257 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 9258 // For a function defined inline within a class template, force the 9259 // canonical definition to be the one inside the canonical definition of 9260 // the template. This ensures that we instantiate from a correct view 9261 // of the template. 9262 // 9263 // Sadly we can't do this more generally: we can't be sure that all 9264 // copies of an arbitrary class definition will have the same members 9265 // defined (eg, some member functions may not be instantiated, and some 9266 // special members may or may not have been implicitly defined). 9267 if (auto *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalParent())) 9268 if (RD->isDependentContext() && !RD->isThisDeclarationADefinition()) 9269 continue; 9270 9271 // FIXME: Check for =delete/=default? 9272 // FIXME: Complain about ODR violations here? 9273 const FunctionDecl *Defn = nullptr; 9274 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) { 9275 FD->setLazyBody(PB->second); 9276 } else { 9277 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn); 9278 mergeDefinitionVisibility(NonConstDefn, FD); 9279 9280 if (!FD->isLateTemplateParsed() && 9281 !NonConstDefn->isLateTemplateParsed() && 9282 FD->getODRHash() != NonConstDefn->getODRHash()) { 9283 if (!isa<CXXMethodDecl>(FD)) { 9284 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9285 } else if (FD->getLexicalParent()->isFileContext() && 9286 NonConstDefn->getLexicalParent()->isFileContext()) { 9287 // Only diagnose out-of-line method definitions. If they are 9288 // in class definitions, then an error will be generated when 9289 // processing the class bodies. 9290 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9291 } 9292 } 9293 } 9294 continue; 9295 } 9296 9297 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 9298 if (!getContext().getLangOpts().Modules || !MD->hasBody()) 9299 MD->setLazyBody(PB->second); 9300 } 9301 PendingBodies.clear(); 9302 9303 // Do some cleanup. 9304 for (auto *ND : PendingMergedDefinitionsToDeduplicate) 9305 getContext().deduplicateMergedDefinitonsFor(ND); 9306 PendingMergedDefinitionsToDeduplicate.clear(); 9307 } 9308 9309 void ASTReader::diagnoseOdrViolations() { 9310 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() && 9311 PendingFunctionOdrMergeFailures.empty() && 9312 PendingEnumOdrMergeFailures.empty()) 9313 return; 9314 9315 // Trigger the import of the full definition of each class that had any 9316 // odr-merging problems, so we can produce better diagnostics for them. 9317 // These updates may in turn find and diagnose some ODR failures, so take 9318 // ownership of the set first. 9319 auto OdrMergeFailures = std::move(PendingOdrMergeFailures); 9320 PendingOdrMergeFailures.clear(); 9321 for (auto &Merge : OdrMergeFailures) { 9322 Merge.first->buildLookup(); 9323 Merge.first->decls_begin(); 9324 Merge.first->bases_begin(); 9325 Merge.first->vbases_begin(); 9326 for (auto &RecordPair : Merge.second) { 9327 auto *RD = RecordPair.first; 9328 RD->decls_begin(); 9329 RD->bases_begin(); 9330 RD->vbases_begin(); 9331 } 9332 } 9333 9334 // Trigger the import of functions. 9335 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures); 9336 PendingFunctionOdrMergeFailures.clear(); 9337 for (auto &Merge : FunctionOdrMergeFailures) { 9338 Merge.first->buildLookup(); 9339 Merge.first->decls_begin(); 9340 Merge.first->getBody(); 9341 for (auto &FD : Merge.second) { 9342 FD->buildLookup(); 9343 FD->decls_begin(); 9344 FD->getBody(); 9345 } 9346 } 9347 9348 // Trigger the import of enums. 9349 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures); 9350 PendingEnumOdrMergeFailures.clear(); 9351 for (auto &Merge : EnumOdrMergeFailures) { 9352 Merge.first->decls_begin(); 9353 for (auto &Enum : Merge.second) { 9354 Enum->decls_begin(); 9355 } 9356 } 9357 9358 // For each declaration from a merged context, check that the canonical 9359 // definition of that context also contains a declaration of the same 9360 // entity. 9361 // 9362 // Caution: this loop does things that might invalidate iterators into 9363 // PendingOdrMergeChecks. Don't turn this into a range-based for loop! 9364 while (!PendingOdrMergeChecks.empty()) { 9365 NamedDecl *D = PendingOdrMergeChecks.pop_back_val(); 9366 9367 // FIXME: Skip over implicit declarations for now. This matters for things 9368 // like implicitly-declared special member functions. This isn't entirely 9369 // correct; we can end up with multiple unmerged declarations of the same 9370 // implicit entity. 9371 if (D->isImplicit()) 9372 continue; 9373 9374 DeclContext *CanonDef = D->getDeclContext(); 9375 9376 bool Found = false; 9377 const Decl *DCanon = D->getCanonicalDecl(); 9378 9379 for (auto RI : D->redecls()) { 9380 if (RI->getLexicalDeclContext() == CanonDef) { 9381 Found = true; 9382 break; 9383 } 9384 } 9385 if (Found) 9386 continue; 9387 9388 // Quick check failed, time to do the slow thing. Note, we can't just 9389 // look up the name of D in CanonDef here, because the member that is 9390 // in CanonDef might not be found by name lookup (it might have been 9391 // replaced by a more recent declaration in the lookup table), and we 9392 // can't necessarily find it in the redeclaration chain because it might 9393 // be merely mergeable, not redeclarable. 9394 llvm::SmallVector<const NamedDecl*, 4> Candidates; 9395 for (auto *CanonMember : CanonDef->decls()) { 9396 if (CanonMember->getCanonicalDecl() == DCanon) { 9397 // This can happen if the declaration is merely mergeable and not 9398 // actually redeclarable (we looked for redeclarations earlier). 9399 // 9400 // FIXME: We should be able to detect this more efficiently, without 9401 // pulling in all of the members of CanonDef. 9402 Found = true; 9403 break; 9404 } 9405 if (auto *ND = dyn_cast<NamedDecl>(CanonMember)) 9406 if (ND->getDeclName() == D->getDeclName()) 9407 Candidates.push_back(ND); 9408 } 9409 9410 if (!Found) { 9411 // The AST doesn't like TagDecls becoming invalid after they've been 9412 // completed. We only really need to mark FieldDecls as invalid here. 9413 if (!isa<TagDecl>(D)) 9414 D->setInvalidDecl(); 9415 9416 // Ensure we don't accidentally recursively enter deserialization while 9417 // we're producing our diagnostic. 9418 Deserializing RecursionGuard(this); 9419 9420 std::string CanonDefModule = 9421 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef)); 9422 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl) 9423 << D << getOwningModuleNameForDiagnostic(D) 9424 << CanonDef << CanonDefModule.empty() << CanonDefModule; 9425 9426 if (Candidates.empty()) 9427 Diag(cast<Decl>(CanonDef)->getLocation(), 9428 diag::note_module_odr_violation_no_possible_decls) << D; 9429 else { 9430 for (unsigned I = 0, N = Candidates.size(); I != N; ++I) 9431 Diag(Candidates[I]->getLocation(), 9432 diag::note_module_odr_violation_possible_decl) 9433 << Candidates[I]; 9434 } 9435 9436 DiagnosedOdrMergeFailures.insert(CanonDef); 9437 } 9438 } 9439 9440 if (OdrMergeFailures.empty() && FunctionOdrMergeFailures.empty() && 9441 EnumOdrMergeFailures.empty()) 9442 return; 9443 9444 // Ensure we don't accidentally recursively enter deserialization while 9445 // we're producing our diagnostics. 9446 Deserializing RecursionGuard(this); 9447 9448 // Common code for hashing helpers. 9449 ODRHash Hash; 9450 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) { 9451 Hash.clear(); 9452 Hash.AddQualType(Ty); 9453 return Hash.CalculateHash(); 9454 }; 9455 9456 auto ComputeODRHash = [&Hash](const Stmt *S) { 9457 assert(S); 9458 Hash.clear(); 9459 Hash.AddStmt(S); 9460 return Hash.CalculateHash(); 9461 }; 9462 9463 auto ComputeSubDeclODRHash = [&Hash](const Decl *D) { 9464 assert(D); 9465 Hash.clear(); 9466 Hash.AddSubDecl(D); 9467 return Hash.CalculateHash(); 9468 }; 9469 9470 auto ComputeTemplateArgumentODRHash = [&Hash](const TemplateArgument &TA) { 9471 Hash.clear(); 9472 Hash.AddTemplateArgument(TA); 9473 return Hash.CalculateHash(); 9474 }; 9475 9476 auto ComputeTemplateParameterListODRHash = 9477 [&Hash](const TemplateParameterList *TPL) { 9478 assert(TPL); 9479 Hash.clear(); 9480 Hash.AddTemplateParameterList(TPL); 9481 return Hash.CalculateHash(); 9482 }; 9483 9484 // Used with err_module_odr_violation_mismatch_decl and 9485 // note_module_odr_violation_mismatch_decl 9486 // This list should be the same Decl's as in ODRHash::isWhiteListedDecl 9487 enum ODRMismatchDecl { 9488 EndOfClass, 9489 PublicSpecifer, 9490 PrivateSpecifer, 9491 ProtectedSpecifer, 9492 StaticAssert, 9493 Field, 9494 CXXMethod, 9495 TypeAlias, 9496 TypeDef, 9497 Var, 9498 Friend, 9499 FunctionTemplate, 9500 Other 9501 }; 9502 9503 // Used with err_module_odr_violation_mismatch_decl_diff and 9504 // note_module_odr_violation_mismatch_decl_diff 9505 enum ODRMismatchDeclDifference { 9506 StaticAssertCondition, 9507 StaticAssertMessage, 9508 StaticAssertOnlyMessage, 9509 FieldName, 9510 FieldTypeName, 9511 FieldSingleBitField, 9512 FieldDifferentWidthBitField, 9513 FieldSingleMutable, 9514 FieldSingleInitializer, 9515 FieldDifferentInitializers, 9516 MethodName, 9517 MethodDeleted, 9518 MethodDefaulted, 9519 MethodVirtual, 9520 MethodStatic, 9521 MethodVolatile, 9522 MethodConst, 9523 MethodInline, 9524 MethodNumberParameters, 9525 MethodParameterType, 9526 MethodParameterName, 9527 MethodParameterSingleDefaultArgument, 9528 MethodParameterDifferentDefaultArgument, 9529 MethodNoTemplateArguments, 9530 MethodDifferentNumberTemplateArguments, 9531 MethodDifferentTemplateArgument, 9532 MethodSingleBody, 9533 MethodDifferentBody, 9534 TypedefName, 9535 TypedefType, 9536 VarName, 9537 VarType, 9538 VarSingleInitializer, 9539 VarDifferentInitializer, 9540 VarConstexpr, 9541 FriendTypeFunction, 9542 FriendType, 9543 FriendFunction, 9544 FunctionTemplateDifferentNumberParameters, 9545 FunctionTemplateParameterDifferentKind, 9546 FunctionTemplateParameterName, 9547 FunctionTemplateParameterSingleDefaultArgument, 9548 FunctionTemplateParameterDifferentDefaultArgument, 9549 FunctionTemplateParameterDifferentType, 9550 FunctionTemplatePackParameter, 9551 }; 9552 9553 // These lambdas have the common portions of the ODR diagnostics. This 9554 // has the same return as Diag(), so addition parameters can be passed 9555 // in with operator<< 9556 auto ODRDiagDeclError = [this](NamedDecl *FirstRecord, StringRef FirstModule, 9557 SourceLocation Loc, SourceRange Range, 9558 ODRMismatchDeclDifference DiffType) { 9559 return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff) 9560 << FirstRecord << FirstModule.empty() << FirstModule << Range 9561 << DiffType; 9562 }; 9563 auto ODRDiagDeclNote = [this](StringRef SecondModule, SourceLocation Loc, 9564 SourceRange Range, ODRMismatchDeclDifference DiffType) { 9565 return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff) 9566 << SecondModule << Range << DiffType; 9567 }; 9568 9569 auto ODRDiagField = [this, &ODRDiagDeclError, &ODRDiagDeclNote, 9570 &ComputeQualTypeODRHash, &ComputeODRHash]( 9571 NamedDecl *FirstRecord, StringRef FirstModule, 9572 StringRef SecondModule, FieldDecl *FirstField, 9573 FieldDecl *SecondField) { 9574 IdentifierInfo *FirstII = FirstField->getIdentifier(); 9575 IdentifierInfo *SecondII = SecondField->getIdentifier(); 9576 if (FirstII->getName() != SecondII->getName()) { 9577 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9578 FirstField->getSourceRange(), FieldName) 9579 << FirstII; 9580 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9581 SecondField->getSourceRange(), FieldName) 9582 << SecondII; 9583 9584 return true; 9585 } 9586 9587 assert(getContext().hasSameType(FirstField->getType(), 9588 SecondField->getType())); 9589 9590 QualType FirstType = FirstField->getType(); 9591 QualType SecondType = SecondField->getType(); 9592 if (ComputeQualTypeODRHash(FirstType) != 9593 ComputeQualTypeODRHash(SecondType)) { 9594 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9595 FirstField->getSourceRange(), FieldTypeName) 9596 << FirstII << FirstType; 9597 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9598 SecondField->getSourceRange(), FieldTypeName) 9599 << SecondII << SecondType; 9600 9601 return true; 9602 } 9603 9604 const bool IsFirstBitField = FirstField->isBitField(); 9605 const bool IsSecondBitField = SecondField->isBitField(); 9606 if (IsFirstBitField != IsSecondBitField) { 9607 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9608 FirstField->getSourceRange(), FieldSingleBitField) 9609 << FirstII << IsFirstBitField; 9610 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9611 SecondField->getSourceRange(), FieldSingleBitField) 9612 << SecondII << IsSecondBitField; 9613 return true; 9614 } 9615 9616 if (IsFirstBitField && IsSecondBitField) { 9617 unsigned FirstBitWidthHash = 9618 ComputeODRHash(FirstField->getBitWidth()); 9619 unsigned SecondBitWidthHash = 9620 ComputeODRHash(SecondField->getBitWidth()); 9621 if (FirstBitWidthHash != SecondBitWidthHash) { 9622 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9623 FirstField->getSourceRange(), 9624 FieldDifferentWidthBitField) 9625 << FirstII << FirstField->getBitWidth()->getSourceRange(); 9626 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9627 SecondField->getSourceRange(), 9628 FieldDifferentWidthBitField) 9629 << SecondII << SecondField->getBitWidth()->getSourceRange(); 9630 return true; 9631 } 9632 } 9633 9634 if (!PP.getLangOpts().CPlusPlus) 9635 return false; 9636 9637 const bool IsFirstMutable = FirstField->isMutable(); 9638 const bool IsSecondMutable = SecondField->isMutable(); 9639 if (IsFirstMutable != IsSecondMutable) { 9640 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9641 FirstField->getSourceRange(), FieldSingleMutable) 9642 << FirstII << IsFirstMutable; 9643 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9644 SecondField->getSourceRange(), FieldSingleMutable) 9645 << SecondII << IsSecondMutable; 9646 return true; 9647 } 9648 9649 const Expr *FirstInitializer = FirstField->getInClassInitializer(); 9650 const Expr *SecondInitializer = SecondField->getInClassInitializer(); 9651 if ((!FirstInitializer && SecondInitializer) || 9652 (FirstInitializer && !SecondInitializer)) { 9653 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9654 FirstField->getSourceRange(), FieldSingleInitializer) 9655 << FirstII << (FirstInitializer != nullptr); 9656 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9657 SecondField->getSourceRange(), FieldSingleInitializer) 9658 << SecondII << (SecondInitializer != nullptr); 9659 return true; 9660 } 9661 9662 if (FirstInitializer && SecondInitializer) { 9663 unsigned FirstInitHash = ComputeODRHash(FirstInitializer); 9664 unsigned SecondInitHash = ComputeODRHash(SecondInitializer); 9665 if (FirstInitHash != SecondInitHash) { 9666 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9667 FirstField->getSourceRange(), 9668 FieldDifferentInitializers) 9669 << FirstII << FirstInitializer->getSourceRange(); 9670 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9671 SecondField->getSourceRange(), 9672 FieldDifferentInitializers) 9673 << SecondII << SecondInitializer->getSourceRange(); 9674 return true; 9675 } 9676 } 9677 9678 return false; 9679 }; 9680 9681 auto ODRDiagTypeDefOrAlias = 9682 [&ODRDiagDeclError, &ODRDiagDeclNote, &ComputeQualTypeODRHash]( 9683 NamedDecl *FirstRecord, StringRef FirstModule, StringRef SecondModule, 9684 TypedefNameDecl *FirstTD, TypedefNameDecl *SecondTD, 9685 bool IsTypeAlias) { 9686 auto FirstName = FirstTD->getDeclName(); 9687 auto SecondName = SecondTD->getDeclName(); 9688 if (FirstName != SecondName) { 9689 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), 9690 FirstTD->getSourceRange(), TypedefName) 9691 << IsTypeAlias << FirstName; 9692 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), 9693 SecondTD->getSourceRange(), TypedefName) 9694 << IsTypeAlias << SecondName; 9695 return true; 9696 } 9697 9698 QualType FirstType = FirstTD->getUnderlyingType(); 9699 QualType SecondType = SecondTD->getUnderlyingType(); 9700 if (ComputeQualTypeODRHash(FirstType) != 9701 ComputeQualTypeODRHash(SecondType)) { 9702 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), 9703 FirstTD->getSourceRange(), TypedefType) 9704 << IsTypeAlias << FirstName << FirstType; 9705 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), 9706 SecondTD->getSourceRange(), TypedefType) 9707 << IsTypeAlias << SecondName << SecondType; 9708 return true; 9709 } 9710 9711 return false; 9712 }; 9713 9714 auto ODRDiagVar = [&ODRDiagDeclError, &ODRDiagDeclNote, 9715 &ComputeQualTypeODRHash, &ComputeODRHash, 9716 this](NamedDecl *FirstRecord, StringRef FirstModule, 9717 StringRef SecondModule, VarDecl *FirstVD, 9718 VarDecl *SecondVD) { 9719 auto FirstName = FirstVD->getDeclName(); 9720 auto SecondName = SecondVD->getDeclName(); 9721 if (FirstName != SecondName) { 9722 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9723 FirstVD->getSourceRange(), VarName) 9724 << FirstName; 9725 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9726 SecondVD->getSourceRange(), VarName) 9727 << SecondName; 9728 return true; 9729 } 9730 9731 QualType FirstType = FirstVD->getType(); 9732 QualType SecondType = SecondVD->getType(); 9733 if (ComputeQualTypeODRHash(FirstType) != 9734 ComputeQualTypeODRHash(SecondType)) { 9735 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9736 FirstVD->getSourceRange(), VarType) 9737 << FirstName << FirstType; 9738 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9739 SecondVD->getSourceRange(), VarType) 9740 << SecondName << SecondType; 9741 return true; 9742 } 9743 9744 if (!PP.getLangOpts().CPlusPlus) 9745 return false; 9746 9747 const Expr *FirstInit = FirstVD->getInit(); 9748 const Expr *SecondInit = SecondVD->getInit(); 9749 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 9750 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9751 FirstVD->getSourceRange(), VarSingleInitializer) 9752 << FirstName << (FirstInit == nullptr) 9753 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 9754 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9755 SecondVD->getSourceRange(), VarSingleInitializer) 9756 << SecondName << (SecondInit == nullptr) 9757 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 9758 return true; 9759 } 9760 9761 if (FirstInit && SecondInit && 9762 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 9763 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9764 FirstVD->getSourceRange(), VarDifferentInitializer) 9765 << FirstName << FirstInit->getSourceRange(); 9766 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9767 SecondVD->getSourceRange(), VarDifferentInitializer) 9768 << SecondName << SecondInit->getSourceRange(); 9769 return true; 9770 } 9771 9772 const bool FirstIsConstexpr = FirstVD->isConstexpr(); 9773 const bool SecondIsConstexpr = SecondVD->isConstexpr(); 9774 if (FirstIsConstexpr != SecondIsConstexpr) { 9775 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9776 FirstVD->getSourceRange(), VarConstexpr) 9777 << FirstName << FirstIsConstexpr; 9778 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9779 SecondVD->getSourceRange(), VarConstexpr) 9780 << SecondName << SecondIsConstexpr; 9781 return true; 9782 } 9783 return false; 9784 }; 9785 9786 auto DifferenceSelector = [](Decl *D) { 9787 assert(D && "valid Decl required"); 9788 switch (D->getKind()) { 9789 default: 9790 return Other; 9791 case Decl::AccessSpec: 9792 switch (D->getAccess()) { 9793 case AS_public: 9794 return PublicSpecifer; 9795 case AS_private: 9796 return PrivateSpecifer; 9797 case AS_protected: 9798 return ProtectedSpecifer; 9799 case AS_none: 9800 break; 9801 } 9802 llvm_unreachable("Invalid access specifier"); 9803 case Decl::StaticAssert: 9804 return StaticAssert; 9805 case Decl::Field: 9806 return Field; 9807 case Decl::CXXMethod: 9808 case Decl::CXXConstructor: 9809 case Decl::CXXDestructor: 9810 return CXXMethod; 9811 case Decl::TypeAlias: 9812 return TypeAlias; 9813 case Decl::Typedef: 9814 return TypeDef; 9815 case Decl::Var: 9816 return Var; 9817 case Decl::Friend: 9818 return Friend; 9819 case Decl::FunctionTemplate: 9820 return FunctionTemplate; 9821 } 9822 }; 9823 9824 using DeclHashes = llvm::SmallVector<std::pair<Decl *, unsigned>, 4>; 9825 auto PopulateHashes = [&ComputeSubDeclODRHash](DeclHashes &Hashes, 9826 RecordDecl *Record, 9827 const DeclContext *DC) { 9828 for (auto *D : Record->decls()) { 9829 if (!ODRHash::isWhitelistedDecl(D, DC)) 9830 continue; 9831 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 9832 } 9833 }; 9834 9835 struct DiffResult { 9836 Decl *FirstDecl = nullptr, *SecondDecl = nullptr; 9837 ODRMismatchDecl FirstDiffType = Other, SecondDiffType = Other; 9838 }; 9839 9840 // If there is a diagnoseable difference, FirstDiffType and 9841 // SecondDiffType will not be Other and FirstDecl and SecondDecl will be 9842 // filled in if not EndOfClass. 9843 auto FindTypeDiffs = [&DifferenceSelector](DeclHashes &FirstHashes, 9844 DeclHashes &SecondHashes) { 9845 DiffResult DR; 9846 auto FirstIt = FirstHashes.begin(); 9847 auto SecondIt = SecondHashes.begin(); 9848 while (FirstIt != FirstHashes.end() || SecondIt != SecondHashes.end()) { 9849 if (FirstIt != FirstHashes.end() && SecondIt != SecondHashes.end() && 9850 FirstIt->second == SecondIt->second) { 9851 ++FirstIt; 9852 ++SecondIt; 9853 continue; 9854 } 9855 9856 DR.FirstDecl = FirstIt == FirstHashes.end() ? nullptr : FirstIt->first; 9857 DR.SecondDecl = 9858 SecondIt == SecondHashes.end() ? nullptr : SecondIt->first; 9859 9860 DR.FirstDiffType = 9861 DR.FirstDecl ? DifferenceSelector(DR.FirstDecl) : EndOfClass; 9862 DR.SecondDiffType = 9863 DR.SecondDecl ? DifferenceSelector(DR.SecondDecl) : EndOfClass; 9864 return DR; 9865 } 9866 return DR; 9867 }; 9868 9869 // Use this to diagnose that an unexpected Decl was encountered 9870 // or no difference was detected. This causes a generic error 9871 // message to be emitted. 9872 auto DiagnoseODRUnexpected = [this](DiffResult &DR, NamedDecl *FirstRecord, 9873 StringRef FirstModule, 9874 NamedDecl *SecondRecord, 9875 StringRef SecondModule) { 9876 Diag(FirstRecord->getLocation(), 9877 diag::err_module_odr_violation_different_definitions) 9878 << FirstRecord << FirstModule.empty() << FirstModule; 9879 9880 if (DR.FirstDecl) { 9881 Diag(DR.FirstDecl->getLocation(), diag::note_first_module_difference) 9882 << FirstRecord << DR.FirstDecl->getSourceRange(); 9883 } 9884 9885 Diag(SecondRecord->getLocation(), 9886 diag::note_module_odr_violation_different_definitions) 9887 << SecondModule; 9888 9889 if (DR.SecondDecl) { 9890 Diag(DR.SecondDecl->getLocation(), diag::note_second_module_difference) 9891 << DR.SecondDecl->getSourceRange(); 9892 } 9893 }; 9894 9895 auto DiagnoseODRMismatch = 9896 [this](DiffResult &DR, NamedDecl *FirstRecord, StringRef FirstModule, 9897 NamedDecl *SecondRecord, StringRef SecondModule) { 9898 SourceLocation FirstLoc; 9899 SourceRange FirstRange; 9900 auto *FirstTag = dyn_cast<TagDecl>(FirstRecord); 9901 if (DR.FirstDiffType == EndOfClass && FirstTag) { 9902 FirstLoc = FirstTag->getBraceRange().getEnd(); 9903 } else { 9904 FirstLoc = DR.FirstDecl->getLocation(); 9905 FirstRange = DR.FirstDecl->getSourceRange(); 9906 } 9907 Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl) 9908 << FirstRecord << FirstModule.empty() << FirstModule << FirstRange 9909 << DR.FirstDiffType; 9910 9911 SourceLocation SecondLoc; 9912 SourceRange SecondRange; 9913 auto *SecondTag = dyn_cast<TagDecl>(SecondRecord); 9914 if (DR.SecondDiffType == EndOfClass && SecondTag) { 9915 SecondLoc = SecondTag->getBraceRange().getEnd(); 9916 } else { 9917 SecondLoc = DR.SecondDecl->getLocation(); 9918 SecondRange = DR.SecondDecl->getSourceRange(); 9919 } 9920 Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl) 9921 << SecondModule << SecondRange << DR.SecondDiffType; 9922 }; 9923 9924 // Issue any pending ODR-failure diagnostics. 9925 for (auto &Merge : OdrMergeFailures) { 9926 // If we've already pointed out a specific problem with this class, don't 9927 // bother issuing a general "something's different" diagnostic. 9928 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 9929 continue; 9930 9931 bool Diagnosed = false; 9932 CXXRecordDecl *FirstRecord = Merge.first; 9933 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstRecord); 9934 for (auto &RecordPair : Merge.second) { 9935 CXXRecordDecl *SecondRecord = RecordPair.first; 9936 // Multiple different declarations got merged together; tell the user 9937 // where they came from. 9938 if (FirstRecord == SecondRecord) 9939 continue; 9940 9941 std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord); 9942 9943 auto *FirstDD = FirstRecord->DefinitionData; 9944 auto *SecondDD = RecordPair.second; 9945 9946 assert(FirstDD && SecondDD && "Definitions without DefinitionData"); 9947 9948 // Diagnostics from DefinitionData are emitted here. 9949 if (FirstDD != SecondDD) { 9950 enum ODRDefinitionDataDifference { 9951 NumBases, 9952 NumVBases, 9953 BaseType, 9954 BaseVirtual, 9955 BaseAccess, 9956 }; 9957 auto ODRDiagBaseError = [FirstRecord, &FirstModule, 9958 this](SourceLocation Loc, SourceRange Range, 9959 ODRDefinitionDataDifference DiffType) { 9960 return Diag(Loc, diag::err_module_odr_violation_definition_data) 9961 << FirstRecord << FirstModule.empty() << FirstModule << Range 9962 << DiffType; 9963 }; 9964 auto ODRDiagBaseNote = [&SecondModule, 9965 this](SourceLocation Loc, SourceRange Range, 9966 ODRDefinitionDataDifference DiffType) { 9967 return Diag(Loc, diag::note_module_odr_violation_definition_data) 9968 << SecondModule << Range << DiffType; 9969 }; 9970 9971 unsigned FirstNumBases = FirstDD->NumBases; 9972 unsigned FirstNumVBases = FirstDD->NumVBases; 9973 unsigned SecondNumBases = SecondDD->NumBases; 9974 unsigned SecondNumVBases = SecondDD->NumVBases; 9975 9976 auto GetSourceRange = [](struct CXXRecordDecl::DefinitionData *DD) { 9977 unsigned NumBases = DD->NumBases; 9978 if (NumBases == 0) return SourceRange(); 9979 auto bases = DD->bases(); 9980 return SourceRange(bases[0].getBeginLoc(), 9981 bases[NumBases - 1].getEndLoc()); 9982 }; 9983 9984 if (FirstNumBases != SecondNumBases) { 9985 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 9986 NumBases) 9987 << FirstNumBases; 9988 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 9989 NumBases) 9990 << SecondNumBases; 9991 Diagnosed = true; 9992 break; 9993 } 9994 9995 if (FirstNumVBases != SecondNumVBases) { 9996 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 9997 NumVBases) 9998 << FirstNumVBases; 9999 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 10000 NumVBases) 10001 << SecondNumVBases; 10002 Diagnosed = true; 10003 break; 10004 } 10005 10006 auto FirstBases = FirstDD->bases(); 10007 auto SecondBases = SecondDD->bases(); 10008 unsigned i = 0; 10009 for (i = 0; i < FirstNumBases; ++i) { 10010 auto FirstBase = FirstBases[i]; 10011 auto SecondBase = SecondBases[i]; 10012 if (ComputeQualTypeODRHash(FirstBase.getType()) != 10013 ComputeQualTypeODRHash(SecondBase.getType())) { 10014 ODRDiagBaseError(FirstRecord->getLocation(), 10015 FirstBase.getSourceRange(), BaseType) 10016 << (i + 1) << FirstBase.getType(); 10017 ODRDiagBaseNote(SecondRecord->getLocation(), 10018 SecondBase.getSourceRange(), BaseType) 10019 << (i + 1) << SecondBase.getType(); 10020 break; 10021 } 10022 10023 if (FirstBase.isVirtual() != SecondBase.isVirtual()) { 10024 ODRDiagBaseError(FirstRecord->getLocation(), 10025 FirstBase.getSourceRange(), BaseVirtual) 10026 << (i + 1) << FirstBase.isVirtual() << FirstBase.getType(); 10027 ODRDiagBaseNote(SecondRecord->getLocation(), 10028 SecondBase.getSourceRange(), BaseVirtual) 10029 << (i + 1) << SecondBase.isVirtual() << SecondBase.getType(); 10030 break; 10031 } 10032 10033 if (FirstBase.getAccessSpecifierAsWritten() != 10034 SecondBase.getAccessSpecifierAsWritten()) { 10035 ODRDiagBaseError(FirstRecord->getLocation(), 10036 FirstBase.getSourceRange(), BaseAccess) 10037 << (i + 1) << FirstBase.getType() 10038 << (int)FirstBase.getAccessSpecifierAsWritten(); 10039 ODRDiagBaseNote(SecondRecord->getLocation(), 10040 SecondBase.getSourceRange(), BaseAccess) 10041 << (i + 1) << SecondBase.getType() 10042 << (int)SecondBase.getAccessSpecifierAsWritten(); 10043 break; 10044 } 10045 } 10046 10047 if (i != FirstNumBases) { 10048 Diagnosed = true; 10049 break; 10050 } 10051 } 10052 10053 const ClassTemplateDecl *FirstTemplate = 10054 FirstRecord->getDescribedClassTemplate(); 10055 const ClassTemplateDecl *SecondTemplate = 10056 SecondRecord->getDescribedClassTemplate(); 10057 10058 assert(!FirstTemplate == !SecondTemplate && 10059 "Both pointers should be null or non-null"); 10060 10061 enum ODRTemplateDifference { 10062 ParamEmptyName, 10063 ParamName, 10064 ParamSingleDefaultArgument, 10065 ParamDifferentDefaultArgument, 10066 }; 10067 10068 if (FirstTemplate && SecondTemplate) { 10069 DeclHashes FirstTemplateHashes; 10070 DeclHashes SecondTemplateHashes; 10071 10072 auto PopulateTemplateParameterHashs = 10073 [&ComputeSubDeclODRHash](DeclHashes &Hashes, 10074 const ClassTemplateDecl *TD) { 10075 for (auto *D : TD->getTemplateParameters()->asArray()) { 10076 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 10077 } 10078 }; 10079 10080 PopulateTemplateParameterHashs(FirstTemplateHashes, FirstTemplate); 10081 PopulateTemplateParameterHashs(SecondTemplateHashes, SecondTemplate); 10082 10083 assert(FirstTemplateHashes.size() == SecondTemplateHashes.size() && 10084 "Number of template parameters should be equal."); 10085 10086 auto FirstIt = FirstTemplateHashes.begin(); 10087 auto FirstEnd = FirstTemplateHashes.end(); 10088 auto SecondIt = SecondTemplateHashes.begin(); 10089 for (; FirstIt != FirstEnd; ++FirstIt, ++SecondIt) { 10090 if (FirstIt->second == SecondIt->second) 10091 continue; 10092 10093 auto ODRDiagTemplateError = [FirstRecord, &FirstModule, this]( 10094 SourceLocation Loc, SourceRange Range, 10095 ODRTemplateDifference DiffType) { 10096 return Diag(Loc, diag::err_module_odr_violation_template_parameter) 10097 << FirstRecord << FirstModule.empty() << FirstModule << Range 10098 << DiffType; 10099 }; 10100 auto ODRDiagTemplateNote = [&SecondModule, this]( 10101 SourceLocation Loc, SourceRange Range, 10102 ODRTemplateDifference DiffType) { 10103 return Diag(Loc, diag::note_module_odr_violation_template_parameter) 10104 << SecondModule << Range << DiffType; 10105 }; 10106 10107 const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first); 10108 const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first); 10109 10110 assert(FirstDecl->getKind() == SecondDecl->getKind() && 10111 "Parameter Decl's should be the same kind."); 10112 10113 DeclarationName FirstName = FirstDecl->getDeclName(); 10114 DeclarationName SecondName = SecondDecl->getDeclName(); 10115 10116 if (FirstName != SecondName) { 10117 const bool FirstNameEmpty = 10118 FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo(); 10119 const bool SecondNameEmpty = 10120 SecondName.isIdentifier() && !SecondName.getAsIdentifierInfo(); 10121 assert((!FirstNameEmpty || !SecondNameEmpty) && 10122 "Both template parameters cannot be unnamed."); 10123 ODRDiagTemplateError(FirstDecl->getLocation(), 10124 FirstDecl->getSourceRange(), 10125 FirstNameEmpty ? ParamEmptyName : ParamName) 10126 << FirstName; 10127 ODRDiagTemplateNote(SecondDecl->getLocation(), 10128 SecondDecl->getSourceRange(), 10129 SecondNameEmpty ? ParamEmptyName : ParamName) 10130 << SecondName; 10131 break; 10132 } 10133 10134 switch (FirstDecl->getKind()) { 10135 default: 10136 llvm_unreachable("Invalid template parameter type."); 10137 case Decl::TemplateTypeParm: { 10138 const auto *FirstParam = cast<TemplateTypeParmDecl>(FirstDecl); 10139 const auto *SecondParam = cast<TemplateTypeParmDecl>(SecondDecl); 10140 const bool HasFirstDefaultArgument = 10141 FirstParam->hasDefaultArgument() && 10142 !FirstParam->defaultArgumentWasInherited(); 10143 const bool HasSecondDefaultArgument = 10144 SecondParam->hasDefaultArgument() && 10145 !SecondParam->defaultArgumentWasInherited(); 10146 10147 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10148 ODRDiagTemplateError(FirstDecl->getLocation(), 10149 FirstDecl->getSourceRange(), 10150 ParamSingleDefaultArgument) 10151 << HasFirstDefaultArgument; 10152 ODRDiagTemplateNote(SecondDecl->getLocation(), 10153 SecondDecl->getSourceRange(), 10154 ParamSingleDefaultArgument) 10155 << HasSecondDefaultArgument; 10156 break; 10157 } 10158 10159 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10160 "Expecting default arguments."); 10161 10162 ODRDiagTemplateError(FirstDecl->getLocation(), 10163 FirstDecl->getSourceRange(), 10164 ParamDifferentDefaultArgument); 10165 ODRDiagTemplateNote(SecondDecl->getLocation(), 10166 SecondDecl->getSourceRange(), 10167 ParamDifferentDefaultArgument); 10168 10169 break; 10170 } 10171 case Decl::NonTypeTemplateParm: { 10172 const auto *FirstParam = cast<NonTypeTemplateParmDecl>(FirstDecl); 10173 const auto *SecondParam = cast<NonTypeTemplateParmDecl>(SecondDecl); 10174 const bool HasFirstDefaultArgument = 10175 FirstParam->hasDefaultArgument() && 10176 !FirstParam->defaultArgumentWasInherited(); 10177 const bool HasSecondDefaultArgument = 10178 SecondParam->hasDefaultArgument() && 10179 !SecondParam->defaultArgumentWasInherited(); 10180 10181 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10182 ODRDiagTemplateError(FirstDecl->getLocation(), 10183 FirstDecl->getSourceRange(), 10184 ParamSingleDefaultArgument) 10185 << HasFirstDefaultArgument; 10186 ODRDiagTemplateNote(SecondDecl->getLocation(), 10187 SecondDecl->getSourceRange(), 10188 ParamSingleDefaultArgument) 10189 << HasSecondDefaultArgument; 10190 break; 10191 } 10192 10193 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10194 "Expecting default arguments."); 10195 10196 ODRDiagTemplateError(FirstDecl->getLocation(), 10197 FirstDecl->getSourceRange(), 10198 ParamDifferentDefaultArgument); 10199 ODRDiagTemplateNote(SecondDecl->getLocation(), 10200 SecondDecl->getSourceRange(), 10201 ParamDifferentDefaultArgument); 10202 10203 break; 10204 } 10205 case Decl::TemplateTemplateParm: { 10206 const auto *FirstParam = cast<TemplateTemplateParmDecl>(FirstDecl); 10207 const auto *SecondParam = 10208 cast<TemplateTemplateParmDecl>(SecondDecl); 10209 const bool HasFirstDefaultArgument = 10210 FirstParam->hasDefaultArgument() && 10211 !FirstParam->defaultArgumentWasInherited(); 10212 const bool HasSecondDefaultArgument = 10213 SecondParam->hasDefaultArgument() && 10214 !SecondParam->defaultArgumentWasInherited(); 10215 10216 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10217 ODRDiagTemplateError(FirstDecl->getLocation(), 10218 FirstDecl->getSourceRange(), 10219 ParamSingleDefaultArgument) 10220 << HasFirstDefaultArgument; 10221 ODRDiagTemplateNote(SecondDecl->getLocation(), 10222 SecondDecl->getSourceRange(), 10223 ParamSingleDefaultArgument) 10224 << HasSecondDefaultArgument; 10225 break; 10226 } 10227 10228 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10229 "Expecting default arguments."); 10230 10231 ODRDiagTemplateError(FirstDecl->getLocation(), 10232 FirstDecl->getSourceRange(), 10233 ParamDifferentDefaultArgument); 10234 ODRDiagTemplateNote(SecondDecl->getLocation(), 10235 SecondDecl->getSourceRange(), 10236 ParamDifferentDefaultArgument); 10237 10238 break; 10239 } 10240 } 10241 10242 break; 10243 } 10244 10245 if (FirstIt != FirstEnd) { 10246 Diagnosed = true; 10247 break; 10248 } 10249 } 10250 10251 DeclHashes FirstHashes; 10252 DeclHashes SecondHashes; 10253 const DeclContext *DC = FirstRecord; 10254 PopulateHashes(FirstHashes, FirstRecord, DC); 10255 PopulateHashes(SecondHashes, SecondRecord, DC); 10256 10257 auto DR = FindTypeDiffs(FirstHashes, SecondHashes); 10258 ODRMismatchDecl FirstDiffType = DR.FirstDiffType; 10259 ODRMismatchDecl SecondDiffType = DR.SecondDiffType; 10260 Decl *FirstDecl = DR.FirstDecl; 10261 Decl *SecondDecl = DR.SecondDecl; 10262 10263 if (FirstDiffType == Other || SecondDiffType == Other) { 10264 DiagnoseODRUnexpected(DR, FirstRecord, FirstModule, SecondRecord, 10265 SecondModule); 10266 Diagnosed = true; 10267 break; 10268 } 10269 10270 if (FirstDiffType != SecondDiffType) { 10271 DiagnoseODRMismatch(DR, FirstRecord, FirstModule, SecondRecord, 10272 SecondModule); 10273 Diagnosed = true; 10274 break; 10275 } 10276 10277 assert(FirstDiffType == SecondDiffType); 10278 10279 switch (FirstDiffType) { 10280 case Other: 10281 case EndOfClass: 10282 case PublicSpecifer: 10283 case PrivateSpecifer: 10284 case ProtectedSpecifer: 10285 llvm_unreachable("Invalid diff type"); 10286 10287 case StaticAssert: { 10288 StaticAssertDecl *FirstSA = cast<StaticAssertDecl>(FirstDecl); 10289 StaticAssertDecl *SecondSA = cast<StaticAssertDecl>(SecondDecl); 10290 10291 Expr *FirstExpr = FirstSA->getAssertExpr(); 10292 Expr *SecondExpr = SecondSA->getAssertExpr(); 10293 unsigned FirstODRHash = ComputeODRHash(FirstExpr); 10294 unsigned SecondODRHash = ComputeODRHash(SecondExpr); 10295 if (FirstODRHash != SecondODRHash) { 10296 ODRDiagDeclError(FirstRecord, FirstModule, FirstExpr->getBeginLoc(), 10297 FirstExpr->getSourceRange(), StaticAssertCondition); 10298 ODRDiagDeclNote(SecondModule, SecondExpr->getBeginLoc(), 10299 SecondExpr->getSourceRange(), StaticAssertCondition); 10300 Diagnosed = true; 10301 break; 10302 } 10303 10304 StringLiteral *FirstStr = FirstSA->getMessage(); 10305 StringLiteral *SecondStr = SecondSA->getMessage(); 10306 assert((FirstStr || SecondStr) && "Both messages cannot be empty"); 10307 if ((FirstStr && !SecondStr) || (!FirstStr && SecondStr)) { 10308 SourceLocation FirstLoc, SecondLoc; 10309 SourceRange FirstRange, SecondRange; 10310 if (FirstStr) { 10311 FirstLoc = FirstStr->getBeginLoc(); 10312 FirstRange = FirstStr->getSourceRange(); 10313 } else { 10314 FirstLoc = FirstSA->getBeginLoc(); 10315 FirstRange = FirstSA->getSourceRange(); 10316 } 10317 if (SecondStr) { 10318 SecondLoc = SecondStr->getBeginLoc(); 10319 SecondRange = SecondStr->getSourceRange(); 10320 } else { 10321 SecondLoc = SecondSA->getBeginLoc(); 10322 SecondRange = SecondSA->getSourceRange(); 10323 } 10324 ODRDiagDeclError(FirstRecord, FirstModule, FirstLoc, FirstRange, 10325 StaticAssertOnlyMessage) 10326 << (FirstStr == nullptr); 10327 ODRDiagDeclNote(SecondModule, SecondLoc, SecondRange, 10328 StaticAssertOnlyMessage) 10329 << (SecondStr == nullptr); 10330 Diagnosed = true; 10331 break; 10332 } 10333 10334 if (FirstStr && SecondStr && 10335 FirstStr->getString() != SecondStr->getString()) { 10336 ODRDiagDeclError(FirstRecord, FirstModule, FirstStr->getBeginLoc(), 10337 FirstStr->getSourceRange(), StaticAssertMessage); 10338 ODRDiagDeclNote(SecondModule, SecondStr->getBeginLoc(), 10339 SecondStr->getSourceRange(), StaticAssertMessage); 10340 Diagnosed = true; 10341 break; 10342 } 10343 break; 10344 } 10345 case Field: { 10346 Diagnosed = ODRDiagField(FirstRecord, FirstModule, SecondModule, 10347 cast<FieldDecl>(FirstDecl), 10348 cast<FieldDecl>(SecondDecl)); 10349 break; 10350 } 10351 case CXXMethod: { 10352 enum { 10353 DiagMethod, 10354 DiagConstructor, 10355 DiagDestructor, 10356 } FirstMethodType, 10357 SecondMethodType; 10358 auto GetMethodTypeForDiagnostics = [](const CXXMethodDecl* D) { 10359 if (isa<CXXConstructorDecl>(D)) return DiagConstructor; 10360 if (isa<CXXDestructorDecl>(D)) return DiagDestructor; 10361 return DiagMethod; 10362 }; 10363 const CXXMethodDecl *FirstMethod = cast<CXXMethodDecl>(FirstDecl); 10364 const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl); 10365 FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod); 10366 SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod); 10367 auto FirstName = FirstMethod->getDeclName(); 10368 auto SecondName = SecondMethod->getDeclName(); 10369 if (FirstMethodType != SecondMethodType || FirstName != SecondName) { 10370 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10371 FirstMethod->getSourceRange(), MethodName) 10372 << FirstMethodType << FirstName; 10373 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10374 SecondMethod->getSourceRange(), MethodName) 10375 << SecondMethodType << SecondName; 10376 10377 Diagnosed = true; 10378 break; 10379 } 10380 10381 const bool FirstDeleted = FirstMethod->isDeletedAsWritten(); 10382 const bool SecondDeleted = SecondMethod->isDeletedAsWritten(); 10383 if (FirstDeleted != SecondDeleted) { 10384 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10385 FirstMethod->getSourceRange(), MethodDeleted) 10386 << FirstMethodType << FirstName << FirstDeleted; 10387 10388 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10389 SecondMethod->getSourceRange(), MethodDeleted) 10390 << SecondMethodType << SecondName << SecondDeleted; 10391 Diagnosed = true; 10392 break; 10393 } 10394 10395 const bool FirstDefaulted = FirstMethod->isExplicitlyDefaulted(); 10396 const bool SecondDefaulted = SecondMethod->isExplicitlyDefaulted(); 10397 if (FirstDefaulted != SecondDefaulted) { 10398 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10399 FirstMethod->getSourceRange(), MethodDefaulted) 10400 << FirstMethodType << FirstName << FirstDefaulted; 10401 10402 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10403 SecondMethod->getSourceRange(), MethodDefaulted) 10404 << SecondMethodType << SecondName << SecondDefaulted; 10405 Diagnosed = true; 10406 break; 10407 } 10408 10409 const bool FirstVirtual = FirstMethod->isVirtualAsWritten(); 10410 const bool SecondVirtual = SecondMethod->isVirtualAsWritten(); 10411 const bool FirstPure = FirstMethod->isPure(); 10412 const bool SecondPure = SecondMethod->isPure(); 10413 if ((FirstVirtual || SecondVirtual) && 10414 (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) { 10415 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10416 FirstMethod->getSourceRange(), MethodVirtual) 10417 << FirstMethodType << FirstName << FirstPure << FirstVirtual; 10418 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10419 SecondMethod->getSourceRange(), MethodVirtual) 10420 << SecondMethodType << SecondName << SecondPure << SecondVirtual; 10421 Diagnosed = true; 10422 break; 10423 } 10424 10425 // CXXMethodDecl::isStatic uses the canonical Decl. With Decl merging, 10426 // FirstDecl is the canonical Decl of SecondDecl, so the storage 10427 // class needs to be checked instead. 10428 const auto FirstStorage = FirstMethod->getStorageClass(); 10429 const auto SecondStorage = SecondMethod->getStorageClass(); 10430 const bool FirstStatic = FirstStorage == SC_Static; 10431 const bool SecondStatic = SecondStorage == SC_Static; 10432 if (FirstStatic != SecondStatic) { 10433 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10434 FirstMethod->getSourceRange(), MethodStatic) 10435 << FirstMethodType << FirstName << FirstStatic; 10436 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10437 SecondMethod->getSourceRange(), MethodStatic) 10438 << SecondMethodType << SecondName << SecondStatic; 10439 Diagnosed = true; 10440 break; 10441 } 10442 10443 const bool FirstVolatile = FirstMethod->isVolatile(); 10444 const bool SecondVolatile = SecondMethod->isVolatile(); 10445 if (FirstVolatile != SecondVolatile) { 10446 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10447 FirstMethod->getSourceRange(), MethodVolatile) 10448 << FirstMethodType << FirstName << FirstVolatile; 10449 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10450 SecondMethod->getSourceRange(), MethodVolatile) 10451 << SecondMethodType << SecondName << SecondVolatile; 10452 Diagnosed = true; 10453 break; 10454 } 10455 10456 const bool FirstConst = FirstMethod->isConst(); 10457 const bool SecondConst = SecondMethod->isConst(); 10458 if (FirstConst != SecondConst) { 10459 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10460 FirstMethod->getSourceRange(), MethodConst) 10461 << FirstMethodType << FirstName << FirstConst; 10462 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10463 SecondMethod->getSourceRange(), MethodConst) 10464 << SecondMethodType << SecondName << SecondConst; 10465 Diagnosed = true; 10466 break; 10467 } 10468 10469 const bool FirstInline = FirstMethod->isInlineSpecified(); 10470 const bool SecondInline = SecondMethod->isInlineSpecified(); 10471 if (FirstInline != SecondInline) { 10472 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10473 FirstMethod->getSourceRange(), MethodInline) 10474 << FirstMethodType << FirstName << FirstInline; 10475 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10476 SecondMethod->getSourceRange(), MethodInline) 10477 << SecondMethodType << SecondName << SecondInline; 10478 Diagnosed = true; 10479 break; 10480 } 10481 10482 const unsigned FirstNumParameters = FirstMethod->param_size(); 10483 const unsigned SecondNumParameters = SecondMethod->param_size(); 10484 if (FirstNumParameters != SecondNumParameters) { 10485 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10486 FirstMethod->getSourceRange(), 10487 MethodNumberParameters) 10488 << FirstMethodType << FirstName << FirstNumParameters; 10489 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10490 SecondMethod->getSourceRange(), 10491 MethodNumberParameters) 10492 << SecondMethodType << SecondName << SecondNumParameters; 10493 Diagnosed = true; 10494 break; 10495 } 10496 10497 // Need this status boolean to know when break out of the switch. 10498 bool ParameterMismatch = false; 10499 for (unsigned I = 0; I < FirstNumParameters; ++I) { 10500 const ParmVarDecl *FirstParam = FirstMethod->getParamDecl(I); 10501 const ParmVarDecl *SecondParam = SecondMethod->getParamDecl(I); 10502 10503 QualType FirstParamType = FirstParam->getType(); 10504 QualType SecondParamType = SecondParam->getType(); 10505 if (FirstParamType != SecondParamType && 10506 ComputeQualTypeODRHash(FirstParamType) != 10507 ComputeQualTypeODRHash(SecondParamType)) { 10508 if (const DecayedType *ParamDecayedType = 10509 FirstParamType->getAs<DecayedType>()) { 10510 ODRDiagDeclError( 10511 FirstRecord, FirstModule, FirstMethod->getLocation(), 10512 FirstMethod->getSourceRange(), MethodParameterType) 10513 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10514 << true << ParamDecayedType->getOriginalType(); 10515 } else { 10516 ODRDiagDeclError( 10517 FirstRecord, FirstModule, FirstMethod->getLocation(), 10518 FirstMethod->getSourceRange(), MethodParameterType) 10519 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10520 << false; 10521 } 10522 10523 if (const DecayedType *ParamDecayedType = 10524 SecondParamType->getAs<DecayedType>()) { 10525 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10526 SecondMethod->getSourceRange(), 10527 MethodParameterType) 10528 << SecondMethodType << SecondName << (I + 1) 10529 << SecondParamType << true 10530 << ParamDecayedType->getOriginalType(); 10531 } else { 10532 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10533 SecondMethod->getSourceRange(), 10534 MethodParameterType) 10535 << SecondMethodType << SecondName << (I + 1) 10536 << SecondParamType << false; 10537 } 10538 ParameterMismatch = true; 10539 break; 10540 } 10541 10542 DeclarationName FirstParamName = FirstParam->getDeclName(); 10543 DeclarationName SecondParamName = SecondParam->getDeclName(); 10544 if (FirstParamName != SecondParamName) { 10545 ODRDiagDeclError(FirstRecord, FirstModule, 10546 FirstMethod->getLocation(), 10547 FirstMethod->getSourceRange(), MethodParameterName) 10548 << FirstMethodType << FirstName << (I + 1) << FirstParamName; 10549 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10550 SecondMethod->getSourceRange(), MethodParameterName) 10551 << SecondMethodType << SecondName << (I + 1) << SecondParamName; 10552 ParameterMismatch = true; 10553 break; 10554 } 10555 10556 const Expr *FirstInit = FirstParam->getInit(); 10557 const Expr *SecondInit = SecondParam->getInit(); 10558 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 10559 ODRDiagDeclError(FirstRecord, FirstModule, 10560 FirstMethod->getLocation(), 10561 FirstMethod->getSourceRange(), 10562 MethodParameterSingleDefaultArgument) 10563 << FirstMethodType << FirstName << (I + 1) 10564 << (FirstInit == nullptr) 10565 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 10566 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10567 SecondMethod->getSourceRange(), 10568 MethodParameterSingleDefaultArgument) 10569 << SecondMethodType << SecondName << (I + 1) 10570 << (SecondInit == nullptr) 10571 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 10572 ParameterMismatch = true; 10573 break; 10574 } 10575 10576 if (FirstInit && SecondInit && 10577 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 10578 ODRDiagDeclError(FirstRecord, FirstModule, 10579 FirstMethod->getLocation(), 10580 FirstMethod->getSourceRange(), 10581 MethodParameterDifferentDefaultArgument) 10582 << FirstMethodType << FirstName << (I + 1) 10583 << FirstInit->getSourceRange(); 10584 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10585 SecondMethod->getSourceRange(), 10586 MethodParameterDifferentDefaultArgument) 10587 << SecondMethodType << SecondName << (I + 1) 10588 << SecondInit->getSourceRange(); 10589 ParameterMismatch = true; 10590 break; 10591 10592 } 10593 } 10594 10595 if (ParameterMismatch) { 10596 Diagnosed = true; 10597 break; 10598 } 10599 10600 const auto *FirstTemplateArgs = 10601 FirstMethod->getTemplateSpecializationArgs(); 10602 const auto *SecondTemplateArgs = 10603 SecondMethod->getTemplateSpecializationArgs(); 10604 10605 if ((FirstTemplateArgs && !SecondTemplateArgs) || 10606 (!FirstTemplateArgs && SecondTemplateArgs)) { 10607 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10608 FirstMethod->getSourceRange(), 10609 MethodNoTemplateArguments) 10610 << FirstMethodType << FirstName << (FirstTemplateArgs != nullptr); 10611 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10612 SecondMethod->getSourceRange(), 10613 MethodNoTemplateArguments) 10614 << SecondMethodType << SecondName 10615 << (SecondTemplateArgs != nullptr); 10616 10617 Diagnosed = true; 10618 break; 10619 } 10620 10621 if (FirstTemplateArgs && SecondTemplateArgs) { 10622 // Remove pack expansions from argument list. 10623 auto ExpandTemplateArgumentList = 10624 [](const TemplateArgumentList *TAL) { 10625 llvm::SmallVector<const TemplateArgument *, 8> ExpandedList; 10626 for (const TemplateArgument &TA : TAL->asArray()) { 10627 if (TA.getKind() != TemplateArgument::Pack) { 10628 ExpandedList.push_back(&TA); 10629 continue; 10630 } 10631 for (const TemplateArgument &PackTA : TA.getPackAsArray()) { 10632 ExpandedList.push_back(&PackTA); 10633 } 10634 } 10635 return ExpandedList; 10636 }; 10637 llvm::SmallVector<const TemplateArgument *, 8> FirstExpandedList = 10638 ExpandTemplateArgumentList(FirstTemplateArgs); 10639 llvm::SmallVector<const TemplateArgument *, 8> SecondExpandedList = 10640 ExpandTemplateArgumentList(SecondTemplateArgs); 10641 10642 if (FirstExpandedList.size() != SecondExpandedList.size()) { 10643 ODRDiagDeclError(FirstRecord, FirstModule, 10644 FirstMethod->getLocation(), 10645 FirstMethod->getSourceRange(), 10646 MethodDifferentNumberTemplateArguments) 10647 << FirstMethodType << FirstName 10648 << (unsigned)FirstExpandedList.size(); 10649 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10650 SecondMethod->getSourceRange(), 10651 MethodDifferentNumberTemplateArguments) 10652 << SecondMethodType << SecondName 10653 << (unsigned)SecondExpandedList.size(); 10654 10655 Diagnosed = true; 10656 break; 10657 } 10658 10659 bool TemplateArgumentMismatch = false; 10660 for (unsigned i = 0, e = FirstExpandedList.size(); i != e; ++i) { 10661 const TemplateArgument &FirstTA = *FirstExpandedList[i], 10662 &SecondTA = *SecondExpandedList[i]; 10663 if (ComputeTemplateArgumentODRHash(FirstTA) == 10664 ComputeTemplateArgumentODRHash(SecondTA)) { 10665 continue; 10666 } 10667 10668 ODRDiagDeclError( 10669 FirstRecord, FirstModule, FirstMethod->getLocation(), 10670 FirstMethod->getSourceRange(), MethodDifferentTemplateArgument) 10671 << FirstMethodType << FirstName << FirstTA << i + 1; 10672 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10673 SecondMethod->getSourceRange(), 10674 MethodDifferentTemplateArgument) 10675 << SecondMethodType << SecondName << SecondTA << i + 1; 10676 10677 TemplateArgumentMismatch = true; 10678 break; 10679 } 10680 10681 if (TemplateArgumentMismatch) { 10682 Diagnosed = true; 10683 break; 10684 } 10685 } 10686 10687 // Compute the hash of the method as if it has no body. 10688 auto ComputeCXXMethodODRHash = [&Hash](const CXXMethodDecl *D) { 10689 Hash.clear(); 10690 Hash.AddFunctionDecl(D, true /*SkipBody*/); 10691 return Hash.CalculateHash(); 10692 }; 10693 10694 // Compare the hash generated to the hash stored. A difference means 10695 // that a body was present in the original source. Due to merging, 10696 // the stardard way of detecting a body will not work. 10697 const bool HasFirstBody = 10698 ComputeCXXMethodODRHash(FirstMethod) != FirstMethod->getODRHash(); 10699 const bool HasSecondBody = 10700 ComputeCXXMethodODRHash(SecondMethod) != SecondMethod->getODRHash(); 10701 10702 if (HasFirstBody != HasSecondBody) { 10703 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10704 FirstMethod->getSourceRange(), MethodSingleBody) 10705 << FirstMethodType << FirstName << HasFirstBody; 10706 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10707 SecondMethod->getSourceRange(), MethodSingleBody) 10708 << SecondMethodType << SecondName << HasSecondBody; 10709 Diagnosed = true; 10710 break; 10711 } 10712 10713 if (HasFirstBody && HasSecondBody) { 10714 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10715 FirstMethod->getSourceRange(), MethodDifferentBody) 10716 << FirstMethodType << FirstName; 10717 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10718 SecondMethod->getSourceRange(), MethodDifferentBody) 10719 << SecondMethodType << SecondName; 10720 Diagnosed = true; 10721 break; 10722 } 10723 10724 break; 10725 } 10726 case TypeAlias: 10727 case TypeDef: { 10728 Diagnosed = ODRDiagTypeDefOrAlias( 10729 FirstRecord, FirstModule, SecondModule, 10730 cast<TypedefNameDecl>(FirstDecl), cast<TypedefNameDecl>(SecondDecl), 10731 FirstDiffType == TypeAlias); 10732 break; 10733 } 10734 case Var: { 10735 Diagnosed = 10736 ODRDiagVar(FirstRecord, FirstModule, SecondModule, 10737 cast<VarDecl>(FirstDecl), cast<VarDecl>(SecondDecl)); 10738 break; 10739 } 10740 case Friend: { 10741 FriendDecl *FirstFriend = cast<FriendDecl>(FirstDecl); 10742 FriendDecl *SecondFriend = cast<FriendDecl>(SecondDecl); 10743 10744 NamedDecl *FirstND = FirstFriend->getFriendDecl(); 10745 NamedDecl *SecondND = SecondFriend->getFriendDecl(); 10746 10747 TypeSourceInfo *FirstTSI = FirstFriend->getFriendType(); 10748 TypeSourceInfo *SecondTSI = SecondFriend->getFriendType(); 10749 10750 if (FirstND && SecondND) { 10751 ODRDiagDeclError(FirstRecord, FirstModule, 10752 FirstFriend->getFriendLoc(), 10753 FirstFriend->getSourceRange(), FriendFunction) 10754 << FirstND; 10755 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10756 SecondFriend->getSourceRange(), FriendFunction) 10757 << SecondND; 10758 10759 Diagnosed = true; 10760 break; 10761 } 10762 10763 if (FirstTSI && SecondTSI) { 10764 QualType FirstFriendType = FirstTSI->getType(); 10765 QualType SecondFriendType = SecondTSI->getType(); 10766 assert(ComputeQualTypeODRHash(FirstFriendType) != 10767 ComputeQualTypeODRHash(SecondFriendType)); 10768 ODRDiagDeclError(FirstRecord, FirstModule, 10769 FirstFriend->getFriendLoc(), 10770 FirstFriend->getSourceRange(), FriendType) 10771 << FirstFriendType; 10772 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10773 SecondFriend->getSourceRange(), FriendType) 10774 << SecondFriendType; 10775 Diagnosed = true; 10776 break; 10777 } 10778 10779 ODRDiagDeclError(FirstRecord, FirstModule, FirstFriend->getFriendLoc(), 10780 FirstFriend->getSourceRange(), FriendTypeFunction) 10781 << (FirstTSI == nullptr); 10782 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10783 SecondFriend->getSourceRange(), FriendTypeFunction) 10784 << (SecondTSI == nullptr); 10785 10786 Diagnosed = true; 10787 break; 10788 } 10789 case FunctionTemplate: { 10790 FunctionTemplateDecl *FirstTemplate = 10791 cast<FunctionTemplateDecl>(FirstDecl); 10792 FunctionTemplateDecl *SecondTemplate = 10793 cast<FunctionTemplateDecl>(SecondDecl); 10794 10795 TemplateParameterList *FirstTPL = 10796 FirstTemplate->getTemplateParameters(); 10797 TemplateParameterList *SecondTPL = 10798 SecondTemplate->getTemplateParameters(); 10799 10800 if (FirstTPL->size() != SecondTPL->size()) { 10801 ODRDiagDeclError(FirstRecord, FirstModule, 10802 FirstTemplate->getLocation(), 10803 FirstTemplate->getSourceRange(), 10804 FunctionTemplateDifferentNumberParameters) 10805 << FirstTemplate << FirstTPL->size(); 10806 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10807 SecondTemplate->getSourceRange(), 10808 FunctionTemplateDifferentNumberParameters) 10809 << SecondTemplate << SecondTPL->size(); 10810 10811 Diagnosed = true; 10812 break; 10813 } 10814 10815 bool ParameterMismatch = false; 10816 for (unsigned i = 0, e = FirstTPL->size(); i != e; ++i) { 10817 NamedDecl *FirstParam = FirstTPL->getParam(i); 10818 NamedDecl *SecondParam = SecondTPL->getParam(i); 10819 10820 if (FirstParam->getKind() != SecondParam->getKind()) { 10821 enum { 10822 TemplateTypeParameter, 10823 NonTypeTemplateParameter, 10824 TemplateTemplateParameter, 10825 }; 10826 auto GetParamType = [](NamedDecl *D) { 10827 switch (D->getKind()) { 10828 default: 10829 llvm_unreachable("Unexpected template parameter type"); 10830 case Decl::TemplateTypeParm: 10831 return TemplateTypeParameter; 10832 case Decl::NonTypeTemplateParm: 10833 return NonTypeTemplateParameter; 10834 case Decl::TemplateTemplateParm: 10835 return TemplateTemplateParameter; 10836 } 10837 }; 10838 10839 ODRDiagDeclError(FirstRecord, FirstModule, 10840 FirstTemplate->getLocation(), 10841 FirstTemplate->getSourceRange(), 10842 FunctionTemplateParameterDifferentKind) 10843 << FirstTemplate << (i + 1) << GetParamType(FirstParam); 10844 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10845 SecondTemplate->getSourceRange(), 10846 FunctionTemplateParameterDifferentKind) 10847 << SecondTemplate << (i + 1) << GetParamType(SecondParam); 10848 10849 ParameterMismatch = true; 10850 break; 10851 } 10852 10853 if (FirstParam->getName() != SecondParam->getName()) { 10854 ODRDiagDeclError( 10855 FirstRecord, FirstModule, FirstTemplate->getLocation(), 10856 FirstTemplate->getSourceRange(), FunctionTemplateParameterName) 10857 << FirstTemplate << (i + 1) << (bool)FirstParam->getIdentifier() 10858 << FirstParam; 10859 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10860 SecondTemplate->getSourceRange(), 10861 FunctionTemplateParameterName) 10862 << SecondTemplate << (i + 1) 10863 << (bool)SecondParam->getIdentifier() << SecondParam; 10864 ParameterMismatch = true; 10865 break; 10866 } 10867 10868 if (isa<TemplateTypeParmDecl>(FirstParam) && 10869 isa<TemplateTypeParmDecl>(SecondParam)) { 10870 TemplateTypeParmDecl *FirstTTPD = 10871 cast<TemplateTypeParmDecl>(FirstParam); 10872 TemplateTypeParmDecl *SecondTTPD = 10873 cast<TemplateTypeParmDecl>(SecondParam); 10874 bool HasFirstDefaultArgument = 10875 FirstTTPD->hasDefaultArgument() && 10876 !FirstTTPD->defaultArgumentWasInherited(); 10877 bool HasSecondDefaultArgument = 10878 SecondTTPD->hasDefaultArgument() && 10879 !SecondTTPD->defaultArgumentWasInherited(); 10880 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10881 ODRDiagDeclError(FirstRecord, FirstModule, 10882 FirstTemplate->getLocation(), 10883 FirstTemplate->getSourceRange(), 10884 FunctionTemplateParameterSingleDefaultArgument) 10885 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 10886 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10887 SecondTemplate->getSourceRange(), 10888 FunctionTemplateParameterSingleDefaultArgument) 10889 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 10890 ParameterMismatch = true; 10891 break; 10892 } 10893 10894 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 10895 QualType FirstType = FirstTTPD->getDefaultArgument(); 10896 QualType SecondType = SecondTTPD->getDefaultArgument(); 10897 if (ComputeQualTypeODRHash(FirstType) != 10898 ComputeQualTypeODRHash(SecondType)) { 10899 ODRDiagDeclError( 10900 FirstRecord, FirstModule, FirstTemplate->getLocation(), 10901 FirstTemplate->getSourceRange(), 10902 FunctionTemplateParameterDifferentDefaultArgument) 10903 << FirstTemplate << (i + 1) << FirstType; 10904 ODRDiagDeclNote( 10905 SecondModule, SecondTemplate->getLocation(), 10906 SecondTemplate->getSourceRange(), 10907 FunctionTemplateParameterDifferentDefaultArgument) 10908 << SecondTemplate << (i + 1) << SecondType; 10909 ParameterMismatch = true; 10910 break; 10911 } 10912 } 10913 10914 if (FirstTTPD->isParameterPack() != 10915 SecondTTPD->isParameterPack()) { 10916 ODRDiagDeclError(FirstRecord, FirstModule, 10917 FirstTemplate->getLocation(), 10918 FirstTemplate->getSourceRange(), 10919 FunctionTemplatePackParameter) 10920 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 10921 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10922 SecondTemplate->getSourceRange(), 10923 FunctionTemplatePackParameter) 10924 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 10925 ParameterMismatch = true; 10926 break; 10927 } 10928 } 10929 10930 if (isa<TemplateTemplateParmDecl>(FirstParam) && 10931 isa<TemplateTemplateParmDecl>(SecondParam)) { 10932 TemplateTemplateParmDecl *FirstTTPD = 10933 cast<TemplateTemplateParmDecl>(FirstParam); 10934 TemplateTemplateParmDecl *SecondTTPD = 10935 cast<TemplateTemplateParmDecl>(SecondParam); 10936 10937 TemplateParameterList *FirstTPL = 10938 FirstTTPD->getTemplateParameters(); 10939 TemplateParameterList *SecondTPL = 10940 SecondTTPD->getTemplateParameters(); 10941 10942 if (ComputeTemplateParameterListODRHash(FirstTPL) != 10943 ComputeTemplateParameterListODRHash(SecondTPL)) { 10944 ODRDiagDeclError(FirstRecord, FirstModule, 10945 FirstTemplate->getLocation(), 10946 FirstTemplate->getSourceRange(), 10947 FunctionTemplateParameterDifferentType) 10948 << FirstTemplate << (i + 1); 10949 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10950 SecondTemplate->getSourceRange(), 10951 FunctionTemplateParameterDifferentType) 10952 << SecondTemplate << (i + 1); 10953 ParameterMismatch = true; 10954 break; 10955 } 10956 10957 bool HasFirstDefaultArgument = 10958 FirstTTPD->hasDefaultArgument() && 10959 !FirstTTPD->defaultArgumentWasInherited(); 10960 bool HasSecondDefaultArgument = 10961 SecondTTPD->hasDefaultArgument() && 10962 !SecondTTPD->defaultArgumentWasInherited(); 10963 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10964 ODRDiagDeclError(FirstRecord, FirstModule, 10965 FirstTemplate->getLocation(), 10966 FirstTemplate->getSourceRange(), 10967 FunctionTemplateParameterSingleDefaultArgument) 10968 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 10969 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10970 SecondTemplate->getSourceRange(), 10971 FunctionTemplateParameterSingleDefaultArgument) 10972 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 10973 ParameterMismatch = true; 10974 break; 10975 } 10976 10977 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 10978 TemplateArgument FirstTA = 10979 FirstTTPD->getDefaultArgument().getArgument(); 10980 TemplateArgument SecondTA = 10981 SecondTTPD->getDefaultArgument().getArgument(); 10982 if (ComputeTemplateArgumentODRHash(FirstTA) != 10983 ComputeTemplateArgumentODRHash(SecondTA)) { 10984 ODRDiagDeclError( 10985 FirstRecord, FirstModule, FirstTemplate->getLocation(), 10986 FirstTemplate->getSourceRange(), 10987 FunctionTemplateParameterDifferentDefaultArgument) 10988 << FirstTemplate << (i + 1) << FirstTA; 10989 ODRDiagDeclNote( 10990 SecondModule, SecondTemplate->getLocation(), 10991 SecondTemplate->getSourceRange(), 10992 FunctionTemplateParameterDifferentDefaultArgument) 10993 << SecondTemplate << (i + 1) << SecondTA; 10994 ParameterMismatch = true; 10995 break; 10996 } 10997 } 10998 10999 if (FirstTTPD->isParameterPack() != 11000 SecondTTPD->isParameterPack()) { 11001 ODRDiagDeclError(FirstRecord, FirstModule, 11002 FirstTemplate->getLocation(), 11003 FirstTemplate->getSourceRange(), 11004 FunctionTemplatePackParameter) 11005 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 11006 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11007 SecondTemplate->getSourceRange(), 11008 FunctionTemplatePackParameter) 11009 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 11010 ParameterMismatch = true; 11011 break; 11012 } 11013 } 11014 11015 if (isa<NonTypeTemplateParmDecl>(FirstParam) && 11016 isa<NonTypeTemplateParmDecl>(SecondParam)) { 11017 NonTypeTemplateParmDecl *FirstNTTPD = 11018 cast<NonTypeTemplateParmDecl>(FirstParam); 11019 NonTypeTemplateParmDecl *SecondNTTPD = 11020 cast<NonTypeTemplateParmDecl>(SecondParam); 11021 11022 QualType FirstType = FirstNTTPD->getType(); 11023 QualType SecondType = SecondNTTPD->getType(); 11024 if (ComputeQualTypeODRHash(FirstType) != 11025 ComputeQualTypeODRHash(SecondType)) { 11026 ODRDiagDeclError(FirstRecord, FirstModule, 11027 FirstTemplate->getLocation(), 11028 FirstTemplate->getSourceRange(), 11029 FunctionTemplateParameterDifferentType) 11030 << FirstTemplate << (i + 1); 11031 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11032 SecondTemplate->getSourceRange(), 11033 FunctionTemplateParameterDifferentType) 11034 << SecondTemplate << (i + 1); 11035 ParameterMismatch = true; 11036 break; 11037 } 11038 11039 bool HasFirstDefaultArgument = 11040 FirstNTTPD->hasDefaultArgument() && 11041 !FirstNTTPD->defaultArgumentWasInherited(); 11042 bool HasSecondDefaultArgument = 11043 SecondNTTPD->hasDefaultArgument() && 11044 !SecondNTTPD->defaultArgumentWasInherited(); 11045 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 11046 ODRDiagDeclError(FirstRecord, FirstModule, 11047 FirstTemplate->getLocation(), 11048 FirstTemplate->getSourceRange(), 11049 FunctionTemplateParameterSingleDefaultArgument) 11050 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 11051 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11052 SecondTemplate->getSourceRange(), 11053 FunctionTemplateParameterSingleDefaultArgument) 11054 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 11055 ParameterMismatch = true; 11056 break; 11057 } 11058 11059 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 11060 Expr *FirstDefaultArgument = FirstNTTPD->getDefaultArgument(); 11061 Expr *SecondDefaultArgument = SecondNTTPD->getDefaultArgument(); 11062 if (ComputeODRHash(FirstDefaultArgument) != 11063 ComputeODRHash(SecondDefaultArgument)) { 11064 ODRDiagDeclError( 11065 FirstRecord, FirstModule, FirstTemplate->getLocation(), 11066 FirstTemplate->getSourceRange(), 11067 FunctionTemplateParameterDifferentDefaultArgument) 11068 << FirstTemplate << (i + 1) << FirstDefaultArgument; 11069 ODRDiagDeclNote( 11070 SecondModule, SecondTemplate->getLocation(), 11071 SecondTemplate->getSourceRange(), 11072 FunctionTemplateParameterDifferentDefaultArgument) 11073 << SecondTemplate << (i + 1) << SecondDefaultArgument; 11074 ParameterMismatch = true; 11075 break; 11076 } 11077 } 11078 11079 if (FirstNTTPD->isParameterPack() != 11080 SecondNTTPD->isParameterPack()) { 11081 ODRDiagDeclError(FirstRecord, FirstModule, 11082 FirstTemplate->getLocation(), 11083 FirstTemplate->getSourceRange(), 11084 FunctionTemplatePackParameter) 11085 << FirstTemplate << (i + 1) << FirstNTTPD->isParameterPack(); 11086 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11087 SecondTemplate->getSourceRange(), 11088 FunctionTemplatePackParameter) 11089 << SecondTemplate << (i + 1) 11090 << SecondNTTPD->isParameterPack(); 11091 ParameterMismatch = true; 11092 break; 11093 } 11094 } 11095 } 11096 11097 if (ParameterMismatch) { 11098 Diagnosed = true; 11099 break; 11100 } 11101 11102 break; 11103 } 11104 } 11105 11106 if (Diagnosed) 11107 continue; 11108 11109 Diag(FirstDecl->getLocation(), 11110 diag::err_module_odr_violation_mismatch_decl_unknown) 11111 << FirstRecord << FirstModule.empty() << FirstModule << FirstDiffType 11112 << FirstDecl->getSourceRange(); 11113 Diag(SecondDecl->getLocation(), 11114 diag::note_module_odr_violation_mismatch_decl_unknown) 11115 << SecondModule << FirstDiffType << SecondDecl->getSourceRange(); 11116 Diagnosed = true; 11117 } 11118 11119 if (!Diagnosed) { 11120 // All definitions are updates to the same declaration. This happens if a 11121 // module instantiates the declaration of a class template specialization 11122 // and two or more other modules instantiate its definition. 11123 // 11124 // FIXME: Indicate which modules had instantiations of this definition. 11125 // FIXME: How can this even happen? 11126 Diag(Merge.first->getLocation(), 11127 diag::err_module_odr_violation_different_instantiations) 11128 << Merge.first; 11129 } 11130 } 11131 11132 // Issue ODR failures diagnostics for functions. 11133 for (auto &Merge : FunctionOdrMergeFailures) { 11134 enum ODRFunctionDifference { 11135 ReturnType, 11136 ParameterName, 11137 ParameterType, 11138 ParameterSingleDefaultArgument, 11139 ParameterDifferentDefaultArgument, 11140 FunctionBody, 11141 }; 11142 11143 FunctionDecl *FirstFunction = Merge.first; 11144 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstFunction); 11145 11146 bool Diagnosed = false; 11147 for (auto &SecondFunction : Merge.second) { 11148 11149 if (FirstFunction == SecondFunction) 11150 continue; 11151 11152 std::string SecondModule = 11153 getOwningModuleNameForDiagnostic(SecondFunction); 11154 11155 auto ODRDiagError = [FirstFunction, &FirstModule, 11156 this](SourceLocation Loc, SourceRange Range, 11157 ODRFunctionDifference DiffType) { 11158 return Diag(Loc, diag::err_module_odr_violation_function) 11159 << FirstFunction << FirstModule.empty() << FirstModule << Range 11160 << DiffType; 11161 }; 11162 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11163 SourceRange Range, 11164 ODRFunctionDifference DiffType) { 11165 return Diag(Loc, diag::note_module_odr_violation_function) 11166 << SecondModule << Range << DiffType; 11167 }; 11168 11169 if (ComputeQualTypeODRHash(FirstFunction->getReturnType()) != 11170 ComputeQualTypeODRHash(SecondFunction->getReturnType())) { 11171 ODRDiagError(FirstFunction->getReturnTypeSourceRange().getBegin(), 11172 FirstFunction->getReturnTypeSourceRange(), ReturnType) 11173 << FirstFunction->getReturnType(); 11174 ODRDiagNote(SecondFunction->getReturnTypeSourceRange().getBegin(), 11175 SecondFunction->getReturnTypeSourceRange(), ReturnType) 11176 << SecondFunction->getReturnType(); 11177 Diagnosed = true; 11178 break; 11179 } 11180 11181 assert(FirstFunction->param_size() == SecondFunction->param_size() && 11182 "Merged functions with different number of parameters"); 11183 11184 auto ParamSize = FirstFunction->param_size(); 11185 bool ParameterMismatch = false; 11186 for (unsigned I = 0; I < ParamSize; ++I) { 11187 auto *FirstParam = FirstFunction->getParamDecl(I); 11188 auto *SecondParam = SecondFunction->getParamDecl(I); 11189 11190 assert(getContext().hasSameType(FirstParam->getType(), 11191 SecondParam->getType()) && 11192 "Merged function has different parameter types."); 11193 11194 if (FirstParam->getDeclName() != SecondParam->getDeclName()) { 11195 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11196 ParameterName) 11197 << I + 1 << FirstParam->getDeclName(); 11198 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11199 ParameterName) 11200 << I + 1 << SecondParam->getDeclName(); 11201 ParameterMismatch = true; 11202 break; 11203 }; 11204 11205 QualType FirstParamType = FirstParam->getType(); 11206 QualType SecondParamType = SecondParam->getType(); 11207 if (FirstParamType != SecondParamType && 11208 ComputeQualTypeODRHash(FirstParamType) != 11209 ComputeQualTypeODRHash(SecondParamType)) { 11210 if (const DecayedType *ParamDecayedType = 11211 FirstParamType->getAs<DecayedType>()) { 11212 ODRDiagError(FirstParam->getLocation(), 11213 FirstParam->getSourceRange(), ParameterType) 11214 << (I + 1) << FirstParamType << true 11215 << ParamDecayedType->getOriginalType(); 11216 } else { 11217 ODRDiagError(FirstParam->getLocation(), 11218 FirstParam->getSourceRange(), ParameterType) 11219 << (I + 1) << FirstParamType << false; 11220 } 11221 11222 if (const DecayedType *ParamDecayedType = 11223 SecondParamType->getAs<DecayedType>()) { 11224 ODRDiagNote(SecondParam->getLocation(), 11225 SecondParam->getSourceRange(), ParameterType) 11226 << (I + 1) << SecondParamType << true 11227 << ParamDecayedType->getOriginalType(); 11228 } else { 11229 ODRDiagNote(SecondParam->getLocation(), 11230 SecondParam->getSourceRange(), ParameterType) 11231 << (I + 1) << SecondParamType << false; 11232 } 11233 ParameterMismatch = true; 11234 break; 11235 } 11236 11237 const Expr *FirstInit = FirstParam->getInit(); 11238 const Expr *SecondInit = SecondParam->getInit(); 11239 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 11240 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11241 ParameterSingleDefaultArgument) 11242 << (I + 1) << (FirstInit == nullptr) 11243 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 11244 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11245 ParameterSingleDefaultArgument) 11246 << (I + 1) << (SecondInit == nullptr) 11247 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 11248 ParameterMismatch = true; 11249 break; 11250 } 11251 11252 if (FirstInit && SecondInit && 11253 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11254 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11255 ParameterDifferentDefaultArgument) 11256 << (I + 1) << FirstInit->getSourceRange(); 11257 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11258 ParameterDifferentDefaultArgument) 11259 << (I + 1) << SecondInit->getSourceRange(); 11260 ParameterMismatch = true; 11261 break; 11262 } 11263 11264 assert(ComputeSubDeclODRHash(FirstParam) == 11265 ComputeSubDeclODRHash(SecondParam) && 11266 "Undiagnosed parameter difference."); 11267 } 11268 11269 if (ParameterMismatch) { 11270 Diagnosed = true; 11271 break; 11272 } 11273 11274 // If no error has been generated before now, assume the problem is in 11275 // the body and generate a message. 11276 ODRDiagError(FirstFunction->getLocation(), 11277 FirstFunction->getSourceRange(), FunctionBody); 11278 ODRDiagNote(SecondFunction->getLocation(), 11279 SecondFunction->getSourceRange(), FunctionBody); 11280 Diagnosed = true; 11281 break; 11282 } 11283 (void)Diagnosed; 11284 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11285 } 11286 11287 // Issue ODR failures diagnostics for enums. 11288 for (auto &Merge : EnumOdrMergeFailures) { 11289 enum ODREnumDifference { 11290 SingleScopedEnum, 11291 EnumTagKeywordMismatch, 11292 SingleSpecifiedType, 11293 DifferentSpecifiedTypes, 11294 DifferentNumberEnumConstants, 11295 EnumConstantName, 11296 EnumConstantSingleInitilizer, 11297 EnumConstantDifferentInitilizer, 11298 }; 11299 11300 // If we've already pointed out a specific problem with this enum, don't 11301 // bother issuing a general "something's different" diagnostic. 11302 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 11303 continue; 11304 11305 EnumDecl *FirstEnum = Merge.first; 11306 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstEnum); 11307 11308 using DeclHashes = 11309 llvm::SmallVector<std::pair<EnumConstantDecl *, unsigned>, 4>; 11310 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstEnum]( 11311 DeclHashes &Hashes, EnumDecl *Enum) { 11312 for (auto *D : Enum->decls()) { 11313 // Due to decl merging, the first EnumDecl is the parent of 11314 // Decls in both records. 11315 if (!ODRHash::isWhitelistedDecl(D, FirstEnum)) 11316 continue; 11317 assert(isa<EnumConstantDecl>(D) && "Unexpected Decl kind"); 11318 Hashes.emplace_back(cast<EnumConstantDecl>(D), 11319 ComputeSubDeclODRHash(D)); 11320 } 11321 }; 11322 DeclHashes FirstHashes; 11323 PopulateHashes(FirstHashes, FirstEnum); 11324 bool Diagnosed = false; 11325 for (auto &SecondEnum : Merge.second) { 11326 11327 if (FirstEnum == SecondEnum) 11328 continue; 11329 11330 std::string SecondModule = 11331 getOwningModuleNameForDiagnostic(SecondEnum); 11332 11333 auto ODRDiagError = [FirstEnum, &FirstModule, 11334 this](SourceLocation Loc, SourceRange Range, 11335 ODREnumDifference DiffType) { 11336 return Diag(Loc, diag::err_module_odr_violation_enum) 11337 << FirstEnum << FirstModule.empty() << FirstModule << Range 11338 << DiffType; 11339 }; 11340 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11341 SourceRange Range, 11342 ODREnumDifference DiffType) { 11343 return Diag(Loc, diag::note_module_odr_violation_enum) 11344 << SecondModule << Range << DiffType; 11345 }; 11346 11347 if (FirstEnum->isScoped() != SecondEnum->isScoped()) { 11348 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11349 SingleScopedEnum) 11350 << FirstEnum->isScoped(); 11351 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11352 SingleScopedEnum) 11353 << SecondEnum->isScoped(); 11354 Diagnosed = true; 11355 continue; 11356 } 11357 11358 if (FirstEnum->isScoped() && SecondEnum->isScoped()) { 11359 if (FirstEnum->isScopedUsingClassTag() != 11360 SecondEnum->isScopedUsingClassTag()) { 11361 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11362 EnumTagKeywordMismatch) 11363 << FirstEnum->isScopedUsingClassTag(); 11364 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11365 EnumTagKeywordMismatch) 11366 << SecondEnum->isScopedUsingClassTag(); 11367 Diagnosed = true; 11368 continue; 11369 } 11370 } 11371 11372 QualType FirstUnderlyingType = 11373 FirstEnum->getIntegerTypeSourceInfo() 11374 ? FirstEnum->getIntegerTypeSourceInfo()->getType() 11375 : QualType(); 11376 QualType SecondUnderlyingType = 11377 SecondEnum->getIntegerTypeSourceInfo() 11378 ? SecondEnum->getIntegerTypeSourceInfo()->getType() 11379 : QualType(); 11380 if (FirstUnderlyingType.isNull() != SecondUnderlyingType.isNull()) { 11381 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11382 SingleSpecifiedType) 11383 << !FirstUnderlyingType.isNull(); 11384 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11385 SingleSpecifiedType) 11386 << !SecondUnderlyingType.isNull(); 11387 Diagnosed = true; 11388 continue; 11389 } 11390 11391 if (!FirstUnderlyingType.isNull() && !SecondUnderlyingType.isNull()) { 11392 if (ComputeQualTypeODRHash(FirstUnderlyingType) != 11393 ComputeQualTypeODRHash(SecondUnderlyingType)) { 11394 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11395 DifferentSpecifiedTypes) 11396 << FirstUnderlyingType; 11397 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11398 DifferentSpecifiedTypes) 11399 << SecondUnderlyingType; 11400 Diagnosed = true; 11401 continue; 11402 } 11403 } 11404 11405 DeclHashes SecondHashes; 11406 PopulateHashes(SecondHashes, SecondEnum); 11407 11408 if (FirstHashes.size() != SecondHashes.size()) { 11409 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11410 DifferentNumberEnumConstants) 11411 << (int)FirstHashes.size(); 11412 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11413 DifferentNumberEnumConstants) 11414 << (int)SecondHashes.size(); 11415 Diagnosed = true; 11416 continue; 11417 } 11418 11419 for (unsigned I = 0; I < FirstHashes.size(); ++I) { 11420 if (FirstHashes[I].second == SecondHashes[I].second) 11421 continue; 11422 const EnumConstantDecl *FirstEnumConstant = FirstHashes[I].first; 11423 const EnumConstantDecl *SecondEnumConstant = SecondHashes[I].first; 11424 11425 if (FirstEnumConstant->getDeclName() != 11426 SecondEnumConstant->getDeclName()) { 11427 11428 ODRDiagError(FirstEnumConstant->getLocation(), 11429 FirstEnumConstant->getSourceRange(), EnumConstantName) 11430 << I + 1 << FirstEnumConstant; 11431 ODRDiagNote(SecondEnumConstant->getLocation(), 11432 SecondEnumConstant->getSourceRange(), EnumConstantName) 11433 << I + 1 << SecondEnumConstant; 11434 Diagnosed = true; 11435 break; 11436 } 11437 11438 const Expr *FirstInit = FirstEnumConstant->getInitExpr(); 11439 const Expr *SecondInit = SecondEnumConstant->getInitExpr(); 11440 if (!FirstInit && !SecondInit) 11441 continue; 11442 11443 if (!FirstInit || !SecondInit) { 11444 ODRDiagError(FirstEnumConstant->getLocation(), 11445 FirstEnumConstant->getSourceRange(), 11446 EnumConstantSingleInitilizer) 11447 << I + 1 << FirstEnumConstant << (FirstInit != nullptr); 11448 ODRDiagNote(SecondEnumConstant->getLocation(), 11449 SecondEnumConstant->getSourceRange(), 11450 EnumConstantSingleInitilizer) 11451 << I + 1 << SecondEnumConstant << (SecondInit != nullptr); 11452 Diagnosed = true; 11453 break; 11454 } 11455 11456 if (ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11457 ODRDiagError(FirstEnumConstant->getLocation(), 11458 FirstEnumConstant->getSourceRange(), 11459 EnumConstantDifferentInitilizer) 11460 << I + 1 << FirstEnumConstant; 11461 ODRDiagNote(SecondEnumConstant->getLocation(), 11462 SecondEnumConstant->getSourceRange(), 11463 EnumConstantDifferentInitilizer) 11464 << I + 1 << SecondEnumConstant; 11465 Diagnosed = true; 11466 break; 11467 } 11468 } 11469 } 11470 11471 (void)Diagnosed; 11472 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11473 } 11474 } 11475 11476 void ASTReader::StartedDeserializing() { 11477 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get()) 11478 ReadTimer->startTimer(); 11479 } 11480 11481 void ASTReader::FinishedDeserializing() { 11482 assert(NumCurrentElementsDeserializing && 11483 "FinishedDeserializing not paired with StartedDeserializing"); 11484 if (NumCurrentElementsDeserializing == 1) { 11485 // We decrease NumCurrentElementsDeserializing only after pending actions 11486 // are finished, to avoid recursively re-calling finishPendingActions(). 11487 finishPendingActions(); 11488 } 11489 --NumCurrentElementsDeserializing; 11490 11491 if (NumCurrentElementsDeserializing == 0) { 11492 // Propagate exception specification and deduced type updates along 11493 // redeclaration chains. 11494 // 11495 // We do this now rather than in finishPendingActions because we want to 11496 // be able to walk the complete redeclaration chains of the updated decls. 11497 while (!PendingExceptionSpecUpdates.empty() || 11498 !PendingDeducedTypeUpdates.empty()) { 11499 auto ESUpdates = std::move(PendingExceptionSpecUpdates); 11500 PendingExceptionSpecUpdates.clear(); 11501 for (auto Update : ESUpdates) { 11502 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11503 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>(); 11504 auto ESI = FPT->getExtProtoInfo().ExceptionSpec; 11505 if (auto *Listener = getContext().getASTMutationListener()) 11506 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second)); 11507 for (auto *Redecl : Update.second->redecls()) 11508 getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI); 11509 } 11510 11511 auto DTUpdates = std::move(PendingDeducedTypeUpdates); 11512 PendingDeducedTypeUpdates.clear(); 11513 for (auto Update : DTUpdates) { 11514 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11515 // FIXME: If the return type is already deduced, check that it matches. 11516 getContext().adjustDeducedFunctionResultType(Update.first, 11517 Update.second); 11518 } 11519 } 11520 11521 if (ReadTimer) 11522 ReadTimer->stopTimer(); 11523 11524 diagnoseOdrViolations(); 11525 11526 // We are not in recursive loading, so it's safe to pass the "interesting" 11527 // decls to the consumer. 11528 if (Consumer) 11529 PassInterestingDeclsToConsumer(); 11530 } 11531 } 11532 11533 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 11534 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { 11535 // Remove any fake results before adding any real ones. 11536 auto It = PendingFakeLookupResults.find(II); 11537 if (It != PendingFakeLookupResults.end()) { 11538 for (auto *ND : It->second) 11539 SemaObj->IdResolver.RemoveDecl(ND); 11540 // FIXME: this works around module+PCH performance issue. 11541 // Rather than erase the result from the map, which is O(n), just clear 11542 // the vector of NamedDecls. 11543 It->second.clear(); 11544 } 11545 } 11546 11547 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 11548 SemaObj->TUScope->AddDecl(D); 11549 } else if (SemaObj->TUScope) { 11550 // Adding the decl to IdResolver may have failed because it was already in 11551 // (even though it was not added in scope). If it is already in, make sure 11552 // it gets in the scope as well. 11553 if (std::find(SemaObj->IdResolver.begin(Name), 11554 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 11555 SemaObj->TUScope->AddDecl(D); 11556 } 11557 } 11558 11559 ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache, 11560 ASTContext *Context, 11561 const PCHContainerReader &PCHContainerRdr, 11562 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions, 11563 StringRef isysroot, bool DisableValidation, 11564 bool AllowASTWithCompilerErrors, 11565 bool AllowConfigurationMismatch, bool ValidateSystemInputs, 11566 bool ValidateASTInputFilesContent, bool UseGlobalIndex, 11567 std::unique_ptr<llvm::Timer> ReadTimer) 11568 : Listener(DisableValidation 11569 ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP)) 11570 : cast<ASTReaderListener>(new PCHValidator(PP, *this))), 11571 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), 11572 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP), 11573 ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache, 11574 PCHContainerRdr, PP.getHeaderSearchInfo()), 11575 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot), 11576 DisableValidation(DisableValidation), 11577 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 11578 AllowConfigurationMismatch(AllowConfigurationMismatch), 11579 ValidateSystemInputs(ValidateSystemInputs), 11580 ValidateASTInputFilesContent(ValidateASTInputFilesContent), 11581 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) { 11582 SourceMgr.setExternalSLocEntrySource(this); 11583 11584 for (const auto &Ext : Extensions) { 11585 auto BlockName = Ext->getExtensionMetadata().BlockName; 11586 auto Known = ModuleFileExtensions.find(BlockName); 11587 if (Known != ModuleFileExtensions.end()) { 11588 Diags.Report(diag::warn_duplicate_module_file_extension) 11589 << BlockName; 11590 continue; 11591 } 11592 11593 ModuleFileExtensions.insert({BlockName, Ext}); 11594 } 11595 } 11596 11597 ASTReader::~ASTReader() { 11598 if (OwnsDeserializationListener) 11599 delete DeserializationListener; 11600 } 11601 11602 IdentifierResolver &ASTReader::getIdResolver() { 11603 return SemaObj ? SemaObj->IdResolver : DummyIdResolver; 11604 } 11605 11606 Expected<unsigned> ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor, 11607 unsigned AbbrevID) { 11608 Idx = 0; 11609 Record.clear(); 11610 return Cursor.readRecord(AbbrevID, Record); 11611 } 11612 //===----------------------------------------------------------------------===// 11613 //// OMPClauseReader implementation 11614 ////===----------------------------------------------------------------------===// 11615 11616 // This has to be in namespace clang because it's friended by all 11617 // of the OMP clauses. 11618 namespace clang { 11619 11620 class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> { 11621 ASTRecordReader &Record; 11622 ASTContext &Context; 11623 11624 public: 11625 OMPClauseReader(ASTRecordReader &Record) 11626 : Record(Record), Context(Record.getContext()) {} 11627 11628 #define OMP_CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C); 11629 #include "llvm/Frontend/OpenMP/OMPKinds.def" 11630 OMPClause *readClause(); 11631 void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C); 11632 void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C); 11633 }; 11634 11635 } // end namespace clang 11636 11637 OMPClause *ASTRecordReader::readOMPClause() { 11638 return OMPClauseReader(*this).readClause(); 11639 } 11640 11641 OMPClause *OMPClauseReader::readClause() { 11642 OMPClause *C = nullptr; 11643 switch (llvm::omp::Clause(Record.readInt())) { 11644 case llvm::omp::OMPC_if: 11645 C = new (Context) OMPIfClause(); 11646 break; 11647 case llvm::omp::OMPC_final: 11648 C = new (Context) OMPFinalClause(); 11649 break; 11650 case llvm::omp::OMPC_num_threads: 11651 C = new (Context) OMPNumThreadsClause(); 11652 break; 11653 case llvm::omp::OMPC_safelen: 11654 C = new (Context) OMPSafelenClause(); 11655 break; 11656 case llvm::omp::OMPC_simdlen: 11657 C = new (Context) OMPSimdlenClause(); 11658 break; 11659 case llvm::omp::OMPC_allocator: 11660 C = new (Context) OMPAllocatorClause(); 11661 break; 11662 case llvm::omp::OMPC_collapse: 11663 C = new (Context) OMPCollapseClause(); 11664 break; 11665 case llvm::omp::OMPC_default: 11666 C = new (Context) OMPDefaultClause(); 11667 break; 11668 case llvm::omp::OMPC_proc_bind: 11669 C = new (Context) OMPProcBindClause(); 11670 break; 11671 case llvm::omp::OMPC_schedule: 11672 C = new (Context) OMPScheduleClause(); 11673 break; 11674 case llvm::omp::OMPC_ordered: 11675 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt()); 11676 break; 11677 case llvm::omp::OMPC_nowait: 11678 C = new (Context) OMPNowaitClause(); 11679 break; 11680 case llvm::omp::OMPC_untied: 11681 C = new (Context) OMPUntiedClause(); 11682 break; 11683 case llvm::omp::OMPC_mergeable: 11684 C = new (Context) OMPMergeableClause(); 11685 break; 11686 case llvm::omp::OMPC_read: 11687 C = new (Context) OMPReadClause(); 11688 break; 11689 case llvm::omp::OMPC_write: 11690 C = new (Context) OMPWriteClause(); 11691 break; 11692 case llvm::omp::OMPC_update: 11693 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt()); 11694 break; 11695 case llvm::omp::OMPC_capture: 11696 C = new (Context) OMPCaptureClause(); 11697 break; 11698 case llvm::omp::OMPC_seq_cst: 11699 C = new (Context) OMPSeqCstClause(); 11700 break; 11701 case llvm::omp::OMPC_acq_rel: 11702 C = new (Context) OMPAcqRelClause(); 11703 break; 11704 case llvm::omp::OMPC_acquire: 11705 C = new (Context) OMPAcquireClause(); 11706 break; 11707 case llvm::omp::OMPC_release: 11708 C = new (Context) OMPReleaseClause(); 11709 break; 11710 case llvm::omp::OMPC_relaxed: 11711 C = new (Context) OMPRelaxedClause(); 11712 break; 11713 case llvm::omp::OMPC_threads: 11714 C = new (Context) OMPThreadsClause(); 11715 break; 11716 case llvm::omp::OMPC_simd: 11717 C = new (Context) OMPSIMDClause(); 11718 break; 11719 case llvm::omp::OMPC_nogroup: 11720 C = new (Context) OMPNogroupClause(); 11721 break; 11722 case llvm::omp::OMPC_unified_address: 11723 C = new (Context) OMPUnifiedAddressClause(); 11724 break; 11725 case llvm::omp::OMPC_unified_shared_memory: 11726 C = new (Context) OMPUnifiedSharedMemoryClause(); 11727 break; 11728 case llvm::omp::OMPC_reverse_offload: 11729 C = new (Context) OMPReverseOffloadClause(); 11730 break; 11731 case llvm::omp::OMPC_dynamic_allocators: 11732 C = new (Context) OMPDynamicAllocatorsClause(); 11733 break; 11734 case llvm::omp::OMPC_atomic_default_mem_order: 11735 C = new (Context) OMPAtomicDefaultMemOrderClause(); 11736 break; 11737 case llvm::omp::OMPC_private: 11738 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt()); 11739 break; 11740 case llvm::omp::OMPC_firstprivate: 11741 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt()); 11742 break; 11743 case llvm::omp::OMPC_lastprivate: 11744 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt()); 11745 break; 11746 case llvm::omp::OMPC_shared: 11747 C = OMPSharedClause::CreateEmpty(Context, Record.readInt()); 11748 break; 11749 case llvm::omp::OMPC_reduction: 11750 C = OMPReductionClause::CreateEmpty(Context, Record.readInt()); 11751 break; 11752 case llvm::omp::OMPC_task_reduction: 11753 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt()); 11754 break; 11755 case llvm::omp::OMPC_in_reduction: 11756 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt()); 11757 break; 11758 case llvm::omp::OMPC_linear: 11759 C = OMPLinearClause::CreateEmpty(Context, Record.readInt()); 11760 break; 11761 case llvm::omp::OMPC_aligned: 11762 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt()); 11763 break; 11764 case llvm::omp::OMPC_copyin: 11765 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt()); 11766 break; 11767 case llvm::omp::OMPC_copyprivate: 11768 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt()); 11769 break; 11770 case llvm::omp::OMPC_flush: 11771 C = OMPFlushClause::CreateEmpty(Context, Record.readInt()); 11772 break; 11773 case llvm::omp::OMPC_depobj: 11774 C = OMPDepobjClause::CreateEmpty(Context); 11775 break; 11776 case llvm::omp::OMPC_depend: { 11777 unsigned NumVars = Record.readInt(); 11778 unsigned NumLoops = Record.readInt(); 11779 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops); 11780 break; 11781 } 11782 case llvm::omp::OMPC_device: 11783 C = new (Context) OMPDeviceClause(); 11784 break; 11785 case llvm::omp::OMPC_map: { 11786 OMPMappableExprListSizeTy Sizes; 11787 Sizes.NumVars = Record.readInt(); 11788 Sizes.NumUniqueDeclarations = Record.readInt(); 11789 Sizes.NumComponentLists = Record.readInt(); 11790 Sizes.NumComponents = Record.readInt(); 11791 C = OMPMapClause::CreateEmpty(Context, Sizes); 11792 break; 11793 } 11794 case llvm::omp::OMPC_num_teams: 11795 C = new (Context) OMPNumTeamsClause(); 11796 break; 11797 case llvm::omp::OMPC_thread_limit: 11798 C = new (Context) OMPThreadLimitClause(); 11799 break; 11800 case llvm::omp::OMPC_priority: 11801 C = new (Context) OMPPriorityClause(); 11802 break; 11803 case llvm::omp::OMPC_grainsize: 11804 C = new (Context) OMPGrainsizeClause(); 11805 break; 11806 case llvm::omp::OMPC_num_tasks: 11807 C = new (Context) OMPNumTasksClause(); 11808 break; 11809 case llvm::omp::OMPC_hint: 11810 C = new (Context) OMPHintClause(); 11811 break; 11812 case llvm::omp::OMPC_dist_schedule: 11813 C = new (Context) OMPDistScheduleClause(); 11814 break; 11815 case llvm::omp::OMPC_defaultmap: 11816 C = new (Context) OMPDefaultmapClause(); 11817 break; 11818 case llvm::omp::OMPC_to: { 11819 OMPMappableExprListSizeTy Sizes; 11820 Sizes.NumVars = Record.readInt(); 11821 Sizes.NumUniqueDeclarations = Record.readInt(); 11822 Sizes.NumComponentLists = Record.readInt(); 11823 Sizes.NumComponents = Record.readInt(); 11824 C = OMPToClause::CreateEmpty(Context, Sizes); 11825 break; 11826 } 11827 case llvm::omp::OMPC_from: { 11828 OMPMappableExprListSizeTy Sizes; 11829 Sizes.NumVars = Record.readInt(); 11830 Sizes.NumUniqueDeclarations = Record.readInt(); 11831 Sizes.NumComponentLists = Record.readInt(); 11832 Sizes.NumComponents = Record.readInt(); 11833 C = OMPFromClause::CreateEmpty(Context, Sizes); 11834 break; 11835 } 11836 case llvm::omp::OMPC_use_device_ptr: { 11837 OMPMappableExprListSizeTy Sizes; 11838 Sizes.NumVars = Record.readInt(); 11839 Sizes.NumUniqueDeclarations = Record.readInt(); 11840 Sizes.NumComponentLists = Record.readInt(); 11841 Sizes.NumComponents = Record.readInt(); 11842 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes); 11843 break; 11844 } 11845 case llvm::omp::OMPC_is_device_ptr: { 11846 OMPMappableExprListSizeTy Sizes; 11847 Sizes.NumVars = Record.readInt(); 11848 Sizes.NumUniqueDeclarations = Record.readInt(); 11849 Sizes.NumComponentLists = Record.readInt(); 11850 Sizes.NumComponents = Record.readInt(); 11851 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes); 11852 break; 11853 } 11854 case llvm::omp::OMPC_allocate: 11855 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt()); 11856 break; 11857 case llvm::omp::OMPC_nontemporal: 11858 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt()); 11859 break; 11860 case llvm::omp::OMPC_inclusive: 11861 C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt()); 11862 break; 11863 case llvm::omp::OMPC_exclusive: 11864 C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt()); 11865 break; 11866 case llvm::omp::OMPC_order: 11867 C = new (Context) OMPOrderClause(); 11868 break; 11869 case llvm::omp::OMPC_destroy: 11870 C = new (Context) OMPDestroyClause(); 11871 break; 11872 case llvm::omp::OMPC_detach: 11873 C = new (Context) OMPDetachClause(); 11874 break; 11875 #define OMP_CLAUSE_NO_CLASS(Enum, Str) \ 11876 case llvm::omp::Enum: \ 11877 break; 11878 #include "llvm/Frontend/OpenMP/OMPKinds.def" 11879 } 11880 assert(C && "Unknown OMPClause type"); 11881 11882 Visit(C); 11883 C->setLocStart(Record.readSourceLocation()); 11884 C->setLocEnd(Record.readSourceLocation()); 11885 11886 return C; 11887 } 11888 11889 void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) { 11890 C->setPreInitStmt(Record.readSubStmt(), 11891 static_cast<OpenMPDirectiveKind>(Record.readInt())); 11892 } 11893 11894 void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) { 11895 VisitOMPClauseWithPreInit(C); 11896 C->setPostUpdateExpr(Record.readSubExpr()); 11897 } 11898 11899 void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) { 11900 VisitOMPClauseWithPreInit(C); 11901 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt())); 11902 C->setNameModifierLoc(Record.readSourceLocation()); 11903 C->setColonLoc(Record.readSourceLocation()); 11904 C->setCondition(Record.readSubExpr()); 11905 C->setLParenLoc(Record.readSourceLocation()); 11906 } 11907 11908 void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) { 11909 VisitOMPClauseWithPreInit(C); 11910 C->setCondition(Record.readSubExpr()); 11911 C->setLParenLoc(Record.readSourceLocation()); 11912 } 11913 11914 void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) { 11915 VisitOMPClauseWithPreInit(C); 11916 C->setNumThreads(Record.readSubExpr()); 11917 C->setLParenLoc(Record.readSourceLocation()); 11918 } 11919 11920 void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) { 11921 C->setSafelen(Record.readSubExpr()); 11922 C->setLParenLoc(Record.readSourceLocation()); 11923 } 11924 11925 void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) { 11926 C->setSimdlen(Record.readSubExpr()); 11927 C->setLParenLoc(Record.readSourceLocation()); 11928 } 11929 11930 void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) { 11931 C->setAllocator(Record.readExpr()); 11932 C->setLParenLoc(Record.readSourceLocation()); 11933 } 11934 11935 void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) { 11936 C->setNumForLoops(Record.readSubExpr()); 11937 C->setLParenLoc(Record.readSourceLocation()); 11938 } 11939 11940 void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) { 11941 C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt())); 11942 C->setLParenLoc(Record.readSourceLocation()); 11943 C->setDefaultKindKwLoc(Record.readSourceLocation()); 11944 } 11945 11946 void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) { 11947 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt())); 11948 C->setLParenLoc(Record.readSourceLocation()); 11949 C->setProcBindKindKwLoc(Record.readSourceLocation()); 11950 } 11951 11952 void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) { 11953 VisitOMPClauseWithPreInit(C); 11954 C->setScheduleKind( 11955 static_cast<OpenMPScheduleClauseKind>(Record.readInt())); 11956 C->setFirstScheduleModifier( 11957 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 11958 C->setSecondScheduleModifier( 11959 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 11960 C->setChunkSize(Record.readSubExpr()); 11961 C->setLParenLoc(Record.readSourceLocation()); 11962 C->setFirstScheduleModifierLoc(Record.readSourceLocation()); 11963 C->setSecondScheduleModifierLoc(Record.readSourceLocation()); 11964 C->setScheduleKindLoc(Record.readSourceLocation()); 11965 C->setCommaLoc(Record.readSourceLocation()); 11966 } 11967 11968 void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) { 11969 C->setNumForLoops(Record.readSubExpr()); 11970 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 11971 C->setLoopNumIterations(I, Record.readSubExpr()); 11972 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 11973 C->setLoopCounter(I, Record.readSubExpr()); 11974 C->setLParenLoc(Record.readSourceLocation()); 11975 } 11976 11977 void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) { 11978 C->setEventHandler(Record.readSubExpr()); 11979 C->setLParenLoc(Record.readSourceLocation()); 11980 } 11981 11982 void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {} 11983 11984 void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {} 11985 11986 void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {} 11987 11988 void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {} 11989 11990 void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {} 11991 11992 void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) { 11993 if (C->isExtended()) { 11994 C->setLParenLoc(Record.readSourceLocation()); 11995 C->setArgumentLoc(Record.readSourceLocation()); 11996 C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>()); 11997 } 11998 } 11999 12000 void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {} 12001 12002 void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {} 12003 12004 void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {} 12005 12006 void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {} 12007 12008 void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {} 12009 12010 void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {} 12011 12012 void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {} 12013 12014 void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {} 12015 12016 void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {} 12017 12018 void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *) {} 12019 12020 void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {} 12021 12022 void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause( 12023 OMPUnifiedSharedMemoryClause *) {} 12024 12025 void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {} 12026 12027 void 12028 OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) { 12029 } 12030 12031 void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause( 12032 OMPAtomicDefaultMemOrderClause *C) { 12033 C->setAtomicDefaultMemOrderKind( 12034 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt())); 12035 C->setLParenLoc(Record.readSourceLocation()); 12036 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation()); 12037 } 12038 12039 void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) { 12040 C->setLParenLoc(Record.readSourceLocation()); 12041 unsigned NumVars = C->varlist_size(); 12042 SmallVector<Expr *, 16> Vars; 12043 Vars.reserve(NumVars); 12044 for (unsigned i = 0; i != NumVars; ++i) 12045 Vars.push_back(Record.readSubExpr()); 12046 C->setVarRefs(Vars); 12047 Vars.clear(); 12048 for (unsigned i = 0; i != NumVars; ++i) 12049 Vars.push_back(Record.readSubExpr()); 12050 C->setPrivateCopies(Vars); 12051 } 12052 12053 void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) { 12054 VisitOMPClauseWithPreInit(C); 12055 C->setLParenLoc(Record.readSourceLocation()); 12056 unsigned NumVars = C->varlist_size(); 12057 SmallVector<Expr *, 16> Vars; 12058 Vars.reserve(NumVars); 12059 for (unsigned i = 0; i != NumVars; ++i) 12060 Vars.push_back(Record.readSubExpr()); 12061 C->setVarRefs(Vars); 12062 Vars.clear(); 12063 for (unsigned i = 0; i != NumVars; ++i) 12064 Vars.push_back(Record.readSubExpr()); 12065 C->setPrivateCopies(Vars); 12066 Vars.clear(); 12067 for (unsigned i = 0; i != NumVars; ++i) 12068 Vars.push_back(Record.readSubExpr()); 12069 C->setInits(Vars); 12070 } 12071 12072 void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) { 12073 VisitOMPClauseWithPostUpdate(C); 12074 C->setLParenLoc(Record.readSourceLocation()); 12075 C->setKind(Record.readEnum<OpenMPLastprivateModifier>()); 12076 C->setKindLoc(Record.readSourceLocation()); 12077 C->setColonLoc(Record.readSourceLocation()); 12078 unsigned NumVars = C->varlist_size(); 12079 SmallVector<Expr *, 16> Vars; 12080 Vars.reserve(NumVars); 12081 for (unsigned i = 0; i != NumVars; ++i) 12082 Vars.push_back(Record.readSubExpr()); 12083 C->setVarRefs(Vars); 12084 Vars.clear(); 12085 for (unsigned i = 0; i != NumVars; ++i) 12086 Vars.push_back(Record.readSubExpr()); 12087 C->setPrivateCopies(Vars); 12088 Vars.clear(); 12089 for (unsigned i = 0; i != NumVars; ++i) 12090 Vars.push_back(Record.readSubExpr()); 12091 C->setSourceExprs(Vars); 12092 Vars.clear(); 12093 for (unsigned i = 0; i != NumVars; ++i) 12094 Vars.push_back(Record.readSubExpr()); 12095 C->setDestinationExprs(Vars); 12096 Vars.clear(); 12097 for (unsigned i = 0; i != NumVars; ++i) 12098 Vars.push_back(Record.readSubExpr()); 12099 C->setAssignmentOps(Vars); 12100 } 12101 12102 void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) { 12103 C->setLParenLoc(Record.readSourceLocation()); 12104 unsigned NumVars = C->varlist_size(); 12105 SmallVector<Expr *, 16> Vars; 12106 Vars.reserve(NumVars); 12107 for (unsigned i = 0; i != NumVars; ++i) 12108 Vars.push_back(Record.readSubExpr()); 12109 C->setVarRefs(Vars); 12110 } 12111 12112 void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) { 12113 VisitOMPClauseWithPostUpdate(C); 12114 C->setLParenLoc(Record.readSourceLocation()); 12115 C->setModifierLoc(Record.readSourceLocation()); 12116 C->setColonLoc(Record.readSourceLocation()); 12117 C->setModifier(Record.readEnum<OpenMPReductionClauseModifier>()); 12118 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12119 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12120 C->setQualifierLoc(NNSL); 12121 C->setNameInfo(DNI); 12122 12123 unsigned NumVars = C->varlist_size(); 12124 SmallVector<Expr *, 16> Vars; 12125 Vars.reserve(NumVars); 12126 for (unsigned i = 0; i != NumVars; ++i) 12127 Vars.push_back(Record.readSubExpr()); 12128 C->setVarRefs(Vars); 12129 Vars.clear(); 12130 for (unsigned i = 0; i != NumVars; ++i) 12131 Vars.push_back(Record.readSubExpr()); 12132 C->setPrivates(Vars); 12133 Vars.clear(); 12134 for (unsigned i = 0; i != NumVars; ++i) 12135 Vars.push_back(Record.readSubExpr()); 12136 C->setLHSExprs(Vars); 12137 Vars.clear(); 12138 for (unsigned i = 0; i != NumVars; ++i) 12139 Vars.push_back(Record.readSubExpr()); 12140 C->setRHSExprs(Vars); 12141 Vars.clear(); 12142 for (unsigned i = 0; i != NumVars; ++i) 12143 Vars.push_back(Record.readSubExpr()); 12144 C->setReductionOps(Vars); 12145 } 12146 12147 void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) { 12148 VisitOMPClauseWithPostUpdate(C); 12149 C->setLParenLoc(Record.readSourceLocation()); 12150 C->setColonLoc(Record.readSourceLocation()); 12151 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12152 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12153 C->setQualifierLoc(NNSL); 12154 C->setNameInfo(DNI); 12155 12156 unsigned NumVars = C->varlist_size(); 12157 SmallVector<Expr *, 16> Vars; 12158 Vars.reserve(NumVars); 12159 for (unsigned I = 0; I != NumVars; ++I) 12160 Vars.push_back(Record.readSubExpr()); 12161 C->setVarRefs(Vars); 12162 Vars.clear(); 12163 for (unsigned I = 0; I != NumVars; ++I) 12164 Vars.push_back(Record.readSubExpr()); 12165 C->setPrivates(Vars); 12166 Vars.clear(); 12167 for (unsigned I = 0; I != NumVars; ++I) 12168 Vars.push_back(Record.readSubExpr()); 12169 C->setLHSExprs(Vars); 12170 Vars.clear(); 12171 for (unsigned I = 0; I != NumVars; ++I) 12172 Vars.push_back(Record.readSubExpr()); 12173 C->setRHSExprs(Vars); 12174 Vars.clear(); 12175 for (unsigned I = 0; I != NumVars; ++I) 12176 Vars.push_back(Record.readSubExpr()); 12177 C->setReductionOps(Vars); 12178 } 12179 12180 void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) { 12181 VisitOMPClauseWithPostUpdate(C); 12182 C->setLParenLoc(Record.readSourceLocation()); 12183 C->setColonLoc(Record.readSourceLocation()); 12184 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12185 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12186 C->setQualifierLoc(NNSL); 12187 C->setNameInfo(DNI); 12188 12189 unsigned NumVars = C->varlist_size(); 12190 SmallVector<Expr *, 16> Vars; 12191 Vars.reserve(NumVars); 12192 for (unsigned I = 0; I != NumVars; ++I) 12193 Vars.push_back(Record.readSubExpr()); 12194 C->setVarRefs(Vars); 12195 Vars.clear(); 12196 for (unsigned I = 0; I != NumVars; ++I) 12197 Vars.push_back(Record.readSubExpr()); 12198 C->setPrivates(Vars); 12199 Vars.clear(); 12200 for (unsigned I = 0; I != NumVars; ++I) 12201 Vars.push_back(Record.readSubExpr()); 12202 C->setLHSExprs(Vars); 12203 Vars.clear(); 12204 for (unsigned I = 0; I != NumVars; ++I) 12205 Vars.push_back(Record.readSubExpr()); 12206 C->setRHSExprs(Vars); 12207 Vars.clear(); 12208 for (unsigned I = 0; I != NumVars; ++I) 12209 Vars.push_back(Record.readSubExpr()); 12210 C->setReductionOps(Vars); 12211 Vars.clear(); 12212 for (unsigned I = 0; I != NumVars; ++I) 12213 Vars.push_back(Record.readSubExpr()); 12214 C->setTaskgroupDescriptors(Vars); 12215 } 12216 12217 void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) { 12218 VisitOMPClauseWithPostUpdate(C); 12219 C->setLParenLoc(Record.readSourceLocation()); 12220 C->setColonLoc(Record.readSourceLocation()); 12221 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt())); 12222 C->setModifierLoc(Record.readSourceLocation()); 12223 unsigned NumVars = C->varlist_size(); 12224 SmallVector<Expr *, 16> Vars; 12225 Vars.reserve(NumVars); 12226 for (unsigned i = 0; i != NumVars; ++i) 12227 Vars.push_back(Record.readSubExpr()); 12228 C->setVarRefs(Vars); 12229 Vars.clear(); 12230 for (unsigned i = 0; i != NumVars; ++i) 12231 Vars.push_back(Record.readSubExpr()); 12232 C->setPrivates(Vars); 12233 Vars.clear(); 12234 for (unsigned i = 0; i != NumVars; ++i) 12235 Vars.push_back(Record.readSubExpr()); 12236 C->setInits(Vars); 12237 Vars.clear(); 12238 for (unsigned i = 0; i != NumVars; ++i) 12239 Vars.push_back(Record.readSubExpr()); 12240 C->setUpdates(Vars); 12241 Vars.clear(); 12242 for (unsigned i = 0; i != NumVars; ++i) 12243 Vars.push_back(Record.readSubExpr()); 12244 C->setFinals(Vars); 12245 C->setStep(Record.readSubExpr()); 12246 C->setCalcStep(Record.readSubExpr()); 12247 Vars.clear(); 12248 for (unsigned I = 0; I != NumVars + 1; ++I) 12249 Vars.push_back(Record.readSubExpr()); 12250 C->setUsedExprs(Vars); 12251 } 12252 12253 void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) { 12254 C->setLParenLoc(Record.readSourceLocation()); 12255 C->setColonLoc(Record.readSourceLocation()); 12256 unsigned NumVars = C->varlist_size(); 12257 SmallVector<Expr *, 16> Vars; 12258 Vars.reserve(NumVars); 12259 for (unsigned i = 0; i != NumVars; ++i) 12260 Vars.push_back(Record.readSubExpr()); 12261 C->setVarRefs(Vars); 12262 C->setAlignment(Record.readSubExpr()); 12263 } 12264 12265 void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) { 12266 C->setLParenLoc(Record.readSourceLocation()); 12267 unsigned NumVars = C->varlist_size(); 12268 SmallVector<Expr *, 16> Exprs; 12269 Exprs.reserve(NumVars); 12270 for (unsigned i = 0; i != NumVars; ++i) 12271 Exprs.push_back(Record.readSubExpr()); 12272 C->setVarRefs(Exprs); 12273 Exprs.clear(); 12274 for (unsigned i = 0; i != NumVars; ++i) 12275 Exprs.push_back(Record.readSubExpr()); 12276 C->setSourceExprs(Exprs); 12277 Exprs.clear(); 12278 for (unsigned i = 0; i != NumVars; ++i) 12279 Exprs.push_back(Record.readSubExpr()); 12280 C->setDestinationExprs(Exprs); 12281 Exprs.clear(); 12282 for (unsigned i = 0; i != NumVars; ++i) 12283 Exprs.push_back(Record.readSubExpr()); 12284 C->setAssignmentOps(Exprs); 12285 } 12286 12287 void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) { 12288 C->setLParenLoc(Record.readSourceLocation()); 12289 unsigned NumVars = C->varlist_size(); 12290 SmallVector<Expr *, 16> Exprs; 12291 Exprs.reserve(NumVars); 12292 for (unsigned i = 0; i != NumVars; ++i) 12293 Exprs.push_back(Record.readSubExpr()); 12294 C->setVarRefs(Exprs); 12295 Exprs.clear(); 12296 for (unsigned i = 0; i != NumVars; ++i) 12297 Exprs.push_back(Record.readSubExpr()); 12298 C->setSourceExprs(Exprs); 12299 Exprs.clear(); 12300 for (unsigned i = 0; i != NumVars; ++i) 12301 Exprs.push_back(Record.readSubExpr()); 12302 C->setDestinationExprs(Exprs); 12303 Exprs.clear(); 12304 for (unsigned i = 0; i != NumVars; ++i) 12305 Exprs.push_back(Record.readSubExpr()); 12306 C->setAssignmentOps(Exprs); 12307 } 12308 12309 void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) { 12310 C->setLParenLoc(Record.readSourceLocation()); 12311 unsigned NumVars = C->varlist_size(); 12312 SmallVector<Expr *, 16> Vars; 12313 Vars.reserve(NumVars); 12314 for (unsigned i = 0; i != NumVars; ++i) 12315 Vars.push_back(Record.readSubExpr()); 12316 C->setVarRefs(Vars); 12317 } 12318 12319 void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) { 12320 C->setDepobj(Record.readSubExpr()); 12321 C->setLParenLoc(Record.readSourceLocation()); 12322 } 12323 12324 void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) { 12325 C->setLParenLoc(Record.readSourceLocation()); 12326 C->setModifier(Record.readSubExpr()); 12327 C->setDependencyKind( 12328 static_cast<OpenMPDependClauseKind>(Record.readInt())); 12329 C->setDependencyLoc(Record.readSourceLocation()); 12330 C->setColonLoc(Record.readSourceLocation()); 12331 unsigned NumVars = C->varlist_size(); 12332 SmallVector<Expr *, 16> Vars; 12333 Vars.reserve(NumVars); 12334 for (unsigned I = 0; I != NumVars; ++I) 12335 Vars.push_back(Record.readSubExpr()); 12336 C->setVarRefs(Vars); 12337 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I) 12338 C->setLoopData(I, Record.readSubExpr()); 12339 } 12340 12341 void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) { 12342 VisitOMPClauseWithPreInit(C); 12343 C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>()); 12344 C->setDevice(Record.readSubExpr()); 12345 C->setModifierLoc(Record.readSourceLocation()); 12346 C->setLParenLoc(Record.readSourceLocation()); 12347 } 12348 12349 void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) { 12350 C->setLParenLoc(Record.readSourceLocation()); 12351 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) { 12352 C->setMapTypeModifier( 12353 I, static_cast<OpenMPMapModifierKind>(Record.readInt())); 12354 C->setMapTypeModifierLoc(I, Record.readSourceLocation()); 12355 } 12356 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12357 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12358 C->setMapType( 12359 static_cast<OpenMPMapClauseKind>(Record.readInt())); 12360 C->setMapLoc(Record.readSourceLocation()); 12361 C->setColonLoc(Record.readSourceLocation()); 12362 auto NumVars = C->varlist_size(); 12363 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12364 auto TotalLists = C->getTotalComponentListNum(); 12365 auto TotalComponents = C->getTotalComponentsNum(); 12366 12367 SmallVector<Expr *, 16> Vars; 12368 Vars.reserve(NumVars); 12369 for (unsigned i = 0; i != NumVars; ++i) 12370 Vars.push_back(Record.readExpr()); 12371 C->setVarRefs(Vars); 12372 12373 SmallVector<Expr *, 16> UDMappers; 12374 UDMappers.reserve(NumVars); 12375 for (unsigned I = 0; I < NumVars; ++I) 12376 UDMappers.push_back(Record.readExpr()); 12377 C->setUDMapperRefs(UDMappers); 12378 12379 SmallVector<ValueDecl *, 16> Decls; 12380 Decls.reserve(UniqueDecls); 12381 for (unsigned i = 0; i < UniqueDecls; ++i) 12382 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12383 C->setUniqueDecls(Decls); 12384 12385 SmallVector<unsigned, 16> ListsPerDecl; 12386 ListsPerDecl.reserve(UniqueDecls); 12387 for (unsigned i = 0; i < UniqueDecls; ++i) 12388 ListsPerDecl.push_back(Record.readInt()); 12389 C->setDeclNumLists(ListsPerDecl); 12390 12391 SmallVector<unsigned, 32> ListSizes; 12392 ListSizes.reserve(TotalLists); 12393 for (unsigned i = 0; i < TotalLists; ++i) 12394 ListSizes.push_back(Record.readInt()); 12395 C->setComponentListSizes(ListSizes); 12396 12397 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12398 Components.reserve(TotalComponents); 12399 for (unsigned i = 0; i < TotalComponents; ++i) { 12400 Expr *AssociatedExpr = Record.readExpr(); 12401 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12402 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12403 AssociatedExpr, AssociatedDecl)); 12404 } 12405 C->setComponents(Components, ListSizes); 12406 } 12407 12408 void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) { 12409 C->setLParenLoc(Record.readSourceLocation()); 12410 C->setColonLoc(Record.readSourceLocation()); 12411 C->setAllocator(Record.readSubExpr()); 12412 unsigned NumVars = C->varlist_size(); 12413 SmallVector<Expr *, 16> Vars; 12414 Vars.reserve(NumVars); 12415 for (unsigned i = 0; i != NumVars; ++i) 12416 Vars.push_back(Record.readSubExpr()); 12417 C->setVarRefs(Vars); 12418 } 12419 12420 void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) { 12421 VisitOMPClauseWithPreInit(C); 12422 C->setNumTeams(Record.readSubExpr()); 12423 C->setLParenLoc(Record.readSourceLocation()); 12424 } 12425 12426 void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) { 12427 VisitOMPClauseWithPreInit(C); 12428 C->setThreadLimit(Record.readSubExpr()); 12429 C->setLParenLoc(Record.readSourceLocation()); 12430 } 12431 12432 void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) { 12433 VisitOMPClauseWithPreInit(C); 12434 C->setPriority(Record.readSubExpr()); 12435 C->setLParenLoc(Record.readSourceLocation()); 12436 } 12437 12438 void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) { 12439 VisitOMPClauseWithPreInit(C); 12440 C->setGrainsize(Record.readSubExpr()); 12441 C->setLParenLoc(Record.readSourceLocation()); 12442 } 12443 12444 void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) { 12445 VisitOMPClauseWithPreInit(C); 12446 C->setNumTasks(Record.readSubExpr()); 12447 C->setLParenLoc(Record.readSourceLocation()); 12448 } 12449 12450 void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) { 12451 C->setHint(Record.readSubExpr()); 12452 C->setLParenLoc(Record.readSourceLocation()); 12453 } 12454 12455 void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) { 12456 VisitOMPClauseWithPreInit(C); 12457 C->setDistScheduleKind( 12458 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt())); 12459 C->setChunkSize(Record.readSubExpr()); 12460 C->setLParenLoc(Record.readSourceLocation()); 12461 C->setDistScheduleKindLoc(Record.readSourceLocation()); 12462 C->setCommaLoc(Record.readSourceLocation()); 12463 } 12464 12465 void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) { 12466 C->setDefaultmapKind( 12467 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt())); 12468 C->setDefaultmapModifier( 12469 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt())); 12470 C->setLParenLoc(Record.readSourceLocation()); 12471 C->setDefaultmapModifierLoc(Record.readSourceLocation()); 12472 C->setDefaultmapKindLoc(Record.readSourceLocation()); 12473 } 12474 12475 void OMPClauseReader::VisitOMPToClause(OMPToClause *C) { 12476 C->setLParenLoc(Record.readSourceLocation()); 12477 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12478 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12479 auto NumVars = C->varlist_size(); 12480 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12481 auto TotalLists = C->getTotalComponentListNum(); 12482 auto TotalComponents = C->getTotalComponentsNum(); 12483 12484 SmallVector<Expr *, 16> Vars; 12485 Vars.reserve(NumVars); 12486 for (unsigned i = 0; i != NumVars; ++i) 12487 Vars.push_back(Record.readSubExpr()); 12488 C->setVarRefs(Vars); 12489 12490 SmallVector<Expr *, 16> UDMappers; 12491 UDMappers.reserve(NumVars); 12492 for (unsigned I = 0; I < NumVars; ++I) 12493 UDMappers.push_back(Record.readSubExpr()); 12494 C->setUDMapperRefs(UDMappers); 12495 12496 SmallVector<ValueDecl *, 16> Decls; 12497 Decls.reserve(UniqueDecls); 12498 for (unsigned i = 0; i < UniqueDecls; ++i) 12499 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12500 C->setUniqueDecls(Decls); 12501 12502 SmallVector<unsigned, 16> ListsPerDecl; 12503 ListsPerDecl.reserve(UniqueDecls); 12504 for (unsigned i = 0; i < UniqueDecls; ++i) 12505 ListsPerDecl.push_back(Record.readInt()); 12506 C->setDeclNumLists(ListsPerDecl); 12507 12508 SmallVector<unsigned, 32> ListSizes; 12509 ListSizes.reserve(TotalLists); 12510 for (unsigned i = 0; i < TotalLists; ++i) 12511 ListSizes.push_back(Record.readInt()); 12512 C->setComponentListSizes(ListSizes); 12513 12514 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12515 Components.reserve(TotalComponents); 12516 for (unsigned i = 0; i < TotalComponents; ++i) { 12517 Expr *AssociatedExpr = Record.readSubExpr(); 12518 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12519 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12520 AssociatedExpr, AssociatedDecl)); 12521 } 12522 C->setComponents(Components, ListSizes); 12523 } 12524 12525 void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) { 12526 C->setLParenLoc(Record.readSourceLocation()); 12527 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12528 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12529 auto NumVars = C->varlist_size(); 12530 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12531 auto TotalLists = C->getTotalComponentListNum(); 12532 auto TotalComponents = C->getTotalComponentsNum(); 12533 12534 SmallVector<Expr *, 16> Vars; 12535 Vars.reserve(NumVars); 12536 for (unsigned i = 0; i != NumVars; ++i) 12537 Vars.push_back(Record.readSubExpr()); 12538 C->setVarRefs(Vars); 12539 12540 SmallVector<Expr *, 16> UDMappers; 12541 UDMappers.reserve(NumVars); 12542 for (unsigned I = 0; I < NumVars; ++I) 12543 UDMappers.push_back(Record.readSubExpr()); 12544 C->setUDMapperRefs(UDMappers); 12545 12546 SmallVector<ValueDecl *, 16> Decls; 12547 Decls.reserve(UniqueDecls); 12548 for (unsigned i = 0; i < UniqueDecls; ++i) 12549 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12550 C->setUniqueDecls(Decls); 12551 12552 SmallVector<unsigned, 16> ListsPerDecl; 12553 ListsPerDecl.reserve(UniqueDecls); 12554 for (unsigned i = 0; i < UniqueDecls; ++i) 12555 ListsPerDecl.push_back(Record.readInt()); 12556 C->setDeclNumLists(ListsPerDecl); 12557 12558 SmallVector<unsigned, 32> ListSizes; 12559 ListSizes.reserve(TotalLists); 12560 for (unsigned i = 0; i < TotalLists; ++i) 12561 ListSizes.push_back(Record.readInt()); 12562 C->setComponentListSizes(ListSizes); 12563 12564 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12565 Components.reserve(TotalComponents); 12566 for (unsigned i = 0; i < TotalComponents; ++i) { 12567 Expr *AssociatedExpr = Record.readSubExpr(); 12568 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12569 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12570 AssociatedExpr, AssociatedDecl)); 12571 } 12572 C->setComponents(Components, ListSizes); 12573 } 12574 12575 void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) { 12576 C->setLParenLoc(Record.readSourceLocation()); 12577 auto NumVars = C->varlist_size(); 12578 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12579 auto TotalLists = C->getTotalComponentListNum(); 12580 auto TotalComponents = C->getTotalComponentsNum(); 12581 12582 SmallVector<Expr *, 16> Vars; 12583 Vars.reserve(NumVars); 12584 for (unsigned i = 0; i != NumVars; ++i) 12585 Vars.push_back(Record.readSubExpr()); 12586 C->setVarRefs(Vars); 12587 Vars.clear(); 12588 for (unsigned i = 0; i != NumVars; ++i) 12589 Vars.push_back(Record.readSubExpr()); 12590 C->setPrivateCopies(Vars); 12591 Vars.clear(); 12592 for (unsigned i = 0; i != NumVars; ++i) 12593 Vars.push_back(Record.readSubExpr()); 12594 C->setInits(Vars); 12595 12596 SmallVector<ValueDecl *, 16> Decls; 12597 Decls.reserve(UniqueDecls); 12598 for (unsigned i = 0; i < UniqueDecls; ++i) 12599 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12600 C->setUniqueDecls(Decls); 12601 12602 SmallVector<unsigned, 16> ListsPerDecl; 12603 ListsPerDecl.reserve(UniqueDecls); 12604 for (unsigned i = 0; i < UniqueDecls; ++i) 12605 ListsPerDecl.push_back(Record.readInt()); 12606 C->setDeclNumLists(ListsPerDecl); 12607 12608 SmallVector<unsigned, 32> ListSizes; 12609 ListSizes.reserve(TotalLists); 12610 for (unsigned i = 0; i < TotalLists; ++i) 12611 ListSizes.push_back(Record.readInt()); 12612 C->setComponentListSizes(ListSizes); 12613 12614 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12615 Components.reserve(TotalComponents); 12616 for (unsigned i = 0; i < TotalComponents; ++i) { 12617 Expr *AssociatedExpr = Record.readSubExpr(); 12618 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12619 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12620 AssociatedExpr, AssociatedDecl)); 12621 } 12622 C->setComponents(Components, ListSizes); 12623 } 12624 12625 void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 12626 C->setLParenLoc(Record.readSourceLocation()); 12627 auto NumVars = C->varlist_size(); 12628 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12629 auto TotalLists = C->getTotalComponentListNum(); 12630 auto TotalComponents = C->getTotalComponentsNum(); 12631 12632 SmallVector<Expr *, 16> Vars; 12633 Vars.reserve(NumVars); 12634 for (unsigned i = 0; i != NumVars; ++i) 12635 Vars.push_back(Record.readSubExpr()); 12636 C->setVarRefs(Vars); 12637 Vars.clear(); 12638 12639 SmallVector<ValueDecl *, 16> Decls; 12640 Decls.reserve(UniqueDecls); 12641 for (unsigned i = 0; i < UniqueDecls; ++i) 12642 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12643 C->setUniqueDecls(Decls); 12644 12645 SmallVector<unsigned, 16> ListsPerDecl; 12646 ListsPerDecl.reserve(UniqueDecls); 12647 for (unsigned i = 0; i < UniqueDecls; ++i) 12648 ListsPerDecl.push_back(Record.readInt()); 12649 C->setDeclNumLists(ListsPerDecl); 12650 12651 SmallVector<unsigned, 32> ListSizes; 12652 ListSizes.reserve(TotalLists); 12653 for (unsigned i = 0; i < TotalLists; ++i) 12654 ListSizes.push_back(Record.readInt()); 12655 C->setComponentListSizes(ListSizes); 12656 12657 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12658 Components.reserve(TotalComponents); 12659 for (unsigned i = 0; i < TotalComponents; ++i) { 12660 Expr *AssociatedExpr = Record.readSubExpr(); 12661 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12662 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12663 AssociatedExpr, AssociatedDecl)); 12664 } 12665 C->setComponents(Components, ListSizes); 12666 } 12667 12668 void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) { 12669 C->setLParenLoc(Record.readSourceLocation()); 12670 unsigned NumVars = C->varlist_size(); 12671 SmallVector<Expr *, 16> Vars; 12672 Vars.reserve(NumVars); 12673 for (unsigned i = 0; i != NumVars; ++i) 12674 Vars.push_back(Record.readSubExpr()); 12675 C->setVarRefs(Vars); 12676 Vars.clear(); 12677 Vars.reserve(NumVars); 12678 for (unsigned i = 0; i != NumVars; ++i) 12679 Vars.push_back(Record.readSubExpr()); 12680 C->setPrivateRefs(Vars); 12681 } 12682 12683 void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) { 12684 C->setLParenLoc(Record.readSourceLocation()); 12685 unsigned NumVars = C->varlist_size(); 12686 SmallVector<Expr *, 16> Vars; 12687 Vars.reserve(NumVars); 12688 for (unsigned i = 0; i != NumVars; ++i) 12689 Vars.push_back(Record.readSubExpr()); 12690 C->setVarRefs(Vars); 12691 } 12692 12693 void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) { 12694 C->setLParenLoc(Record.readSourceLocation()); 12695 unsigned NumVars = C->varlist_size(); 12696 SmallVector<Expr *, 16> Vars; 12697 Vars.reserve(NumVars); 12698 for (unsigned i = 0; i != NumVars; ++i) 12699 Vars.push_back(Record.readSubExpr()); 12700 C->setVarRefs(Vars); 12701 } 12702 12703 void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) { 12704 C->setKind(Record.readEnum<OpenMPOrderClauseKind>()); 12705 C->setLParenLoc(Record.readSourceLocation()); 12706 C->setKindKwLoc(Record.readSourceLocation()); 12707 } 12708 12709 OMPTraitInfo *ASTRecordReader::readOMPTraitInfo() { 12710 OMPTraitInfo &TI = getContext().getNewOMPTraitInfo(); 12711 TI.Sets.resize(readUInt32()); 12712 for (auto &Set : TI.Sets) { 12713 Set.Kind = readEnum<llvm::omp::TraitSet>(); 12714 Set.Selectors.resize(readUInt32()); 12715 for (auto &Selector : Set.Selectors) { 12716 Selector.Kind = readEnum<llvm::omp::TraitSelector>(); 12717 Selector.ScoreOrCondition = nullptr; 12718 if (readBool()) 12719 Selector.ScoreOrCondition = readExprRef(); 12720 Selector.Properties.resize(readUInt32()); 12721 for (auto &Property : Selector.Properties) 12722 Property.Kind = readEnum<llvm::omp::TraitProperty>(); 12723 } 12724 } 12725 return &TI; 12726 } 12727