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 UnderalignedInt64 *>(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 FLOAT_CONTROL_PRAGMA_OPTIONS: { 3783 if (Record.size() < 3) { 3784 Error("invalid pragma pack record"); 3785 return Failure; 3786 } 3787 FpPragmaCurrentValue = Record[0]; 3788 FpPragmaCurrentLocation = ReadSourceLocation(F, Record[1]); 3789 unsigned NumStackEntries = Record[2]; 3790 unsigned Idx = 3; 3791 // Reset the stack when importing a new module. 3792 FpPragmaStack.clear(); 3793 for (unsigned I = 0; I < NumStackEntries; ++I) { 3794 FpPragmaStackEntry Entry; 3795 Entry.Value = Record[Idx++]; 3796 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3797 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3798 FpPragmaStrings.push_back(ReadString(Record, Idx)); 3799 Entry.SlotLabel = FpPragmaStrings.back(); 3800 FpPragmaStack.push_back(Entry); 3801 } 3802 break; 3803 } 3804 3805 case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS: 3806 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3807 DeclsToCheckForDeferredDiags.push_back(getGlobalDeclID(F, Record[I])); 3808 break; 3809 } 3810 } 3811 } 3812 3813 void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const { 3814 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read"); 3815 3816 // Additional remapping information. 3817 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data(); 3818 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size(); 3819 F.ModuleOffsetMap = StringRef(); 3820 3821 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders. 3822 if (F.SLocRemap.find(0) == F.SLocRemap.end()) { 3823 F.SLocRemap.insert(std::make_pair(0U, 0)); 3824 F.SLocRemap.insert(std::make_pair(2U, 1)); 3825 } 3826 3827 // Continuous range maps we may be updating in our module. 3828 using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder; 3829 RemapBuilder SLocRemap(F.SLocRemap); 3830 RemapBuilder IdentifierRemap(F.IdentifierRemap); 3831 RemapBuilder MacroRemap(F.MacroRemap); 3832 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap); 3833 RemapBuilder SubmoduleRemap(F.SubmoduleRemap); 3834 RemapBuilder SelectorRemap(F.SelectorRemap); 3835 RemapBuilder DeclRemap(F.DeclRemap); 3836 RemapBuilder TypeRemap(F.TypeRemap); 3837 3838 while (Data < DataEnd) { 3839 // FIXME: Looking up dependency modules by filename is horrible. Let's 3840 // start fixing this with prebuilt and explicit modules and see how it 3841 // goes... 3842 using namespace llvm::support; 3843 ModuleKind Kind = static_cast<ModuleKind>( 3844 endian::readNext<uint8_t, little, unaligned>(Data)); 3845 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data); 3846 StringRef Name = StringRef((const char*)Data, Len); 3847 Data += Len; 3848 ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule 3849 ? ModuleMgr.lookupByModuleName(Name) 3850 : ModuleMgr.lookupByFileName(Name)); 3851 if (!OM) { 3852 std::string Msg = 3853 "SourceLocation remap refers to unknown module, cannot find "; 3854 Msg.append(std::string(Name)); 3855 Error(Msg); 3856 return; 3857 } 3858 3859 uint32_t SLocOffset = 3860 endian::readNext<uint32_t, little, unaligned>(Data); 3861 uint32_t IdentifierIDOffset = 3862 endian::readNext<uint32_t, little, unaligned>(Data); 3863 uint32_t MacroIDOffset = 3864 endian::readNext<uint32_t, little, unaligned>(Data); 3865 uint32_t PreprocessedEntityIDOffset = 3866 endian::readNext<uint32_t, little, unaligned>(Data); 3867 uint32_t SubmoduleIDOffset = 3868 endian::readNext<uint32_t, little, unaligned>(Data); 3869 uint32_t SelectorIDOffset = 3870 endian::readNext<uint32_t, little, unaligned>(Data); 3871 uint32_t DeclIDOffset = 3872 endian::readNext<uint32_t, little, unaligned>(Data); 3873 uint32_t TypeIndexOffset = 3874 endian::readNext<uint32_t, little, unaligned>(Data); 3875 3876 uint32_t None = std::numeric_limits<uint32_t>::max(); 3877 3878 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset, 3879 RemapBuilder &Remap) { 3880 if (Offset != None) 3881 Remap.insert(std::make_pair(Offset, 3882 static_cast<int>(BaseOffset - Offset))); 3883 }; 3884 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap); 3885 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap); 3886 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap); 3887 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID, 3888 PreprocessedEntityRemap); 3889 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap); 3890 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap); 3891 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap); 3892 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap); 3893 3894 // Global -> local mappings. 3895 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset; 3896 } 3897 } 3898 3899 ASTReader::ASTReadResult 3900 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F, 3901 const ModuleFile *ImportedBy, 3902 unsigned ClientLoadCapabilities) { 3903 unsigned Idx = 0; 3904 F.ModuleMapPath = ReadPath(F, Record, Idx); 3905 3906 // Try to resolve ModuleName in the current header search context and 3907 // verify that it is found in the same module map file as we saved. If the 3908 // top-level AST file is a main file, skip this check because there is no 3909 // usable header search context. 3910 assert(!F.ModuleName.empty() && 3911 "MODULE_NAME should come before MODULE_MAP_FILE"); 3912 if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) { 3913 // An implicitly-loaded module file should have its module listed in some 3914 // module map file that we've already loaded. 3915 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName); 3916 auto &Map = PP.getHeaderSearchInfo().getModuleMap(); 3917 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr; 3918 // Don't emit module relocation error if we have -fno-validate-pch 3919 if (!PP.getPreprocessorOpts().DisablePCHValidation && !ModMap) { 3920 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) { 3921 if (auto *ASTFE = M ? M->getASTFile() : nullptr) { 3922 // This module was defined by an imported (explicit) module. 3923 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName 3924 << ASTFE->getName(); 3925 } else { 3926 // This module was built with a different module map. 3927 Diag(diag::err_imported_module_not_found) 3928 << F.ModuleName << F.FileName 3929 << (ImportedBy ? ImportedBy->FileName : "") << F.ModuleMapPath 3930 << !ImportedBy; 3931 // In case it was imported by a PCH, there's a chance the user is 3932 // just missing to include the search path to the directory containing 3933 // the modulemap. 3934 if (ImportedBy && ImportedBy->Kind == MK_PCH) 3935 Diag(diag::note_imported_by_pch_module_not_found) 3936 << llvm::sys::path::parent_path(F.ModuleMapPath); 3937 } 3938 } 3939 return OutOfDate; 3940 } 3941 3942 assert(M->Name == F.ModuleName && "found module with different name"); 3943 3944 // Check the primary module map file. 3945 auto StoredModMap = FileMgr.getFile(F.ModuleMapPath); 3946 if (!StoredModMap || *StoredModMap != ModMap) { 3947 assert(ModMap && "found module is missing module map file"); 3948 assert((ImportedBy || F.Kind == MK_ImplicitModule) && 3949 "top-level import should be verified"); 3950 bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy; 3951 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3952 Diag(diag::err_imported_module_modmap_changed) 3953 << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName) 3954 << ModMap->getName() << F.ModuleMapPath << NotImported; 3955 return OutOfDate; 3956 } 3957 3958 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps; 3959 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) { 3960 // FIXME: we should use input files rather than storing names. 3961 std::string Filename = ReadPath(F, Record, Idx); 3962 auto F = FileMgr.getFile(Filename, false, false); 3963 if (!F) { 3964 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3965 Error("could not find file '" + Filename +"' referenced by AST file"); 3966 return OutOfDate; 3967 } 3968 AdditionalStoredMaps.insert(*F); 3969 } 3970 3971 // Check any additional module map files (e.g. module.private.modulemap) 3972 // that are not in the pcm. 3973 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) { 3974 for (const FileEntry *ModMap : *AdditionalModuleMaps) { 3975 // Remove files that match 3976 // Note: SmallPtrSet::erase is really remove 3977 if (!AdditionalStoredMaps.erase(ModMap)) { 3978 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3979 Diag(diag::err_module_different_modmap) 3980 << F.ModuleName << /*new*/0 << ModMap->getName(); 3981 return OutOfDate; 3982 } 3983 } 3984 } 3985 3986 // Check any additional module map files that are in the pcm, but not 3987 // found in header search. Cases that match are already removed. 3988 for (const FileEntry *ModMap : AdditionalStoredMaps) { 3989 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3990 Diag(diag::err_module_different_modmap) 3991 << F.ModuleName << /*not new*/1 << ModMap->getName(); 3992 return OutOfDate; 3993 } 3994 } 3995 3996 if (Listener) 3997 Listener->ReadModuleMapFile(F.ModuleMapPath); 3998 return Success; 3999 } 4000 4001 /// Move the given method to the back of the global list of methods. 4002 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 4003 // Find the entry for this selector in the method pool. 4004 Sema::GlobalMethodPool::iterator Known 4005 = S.MethodPool.find(Method->getSelector()); 4006 if (Known == S.MethodPool.end()) 4007 return; 4008 4009 // Retrieve the appropriate method list. 4010 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 4011 : Known->second.second; 4012 bool Found = false; 4013 for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 4014 if (!Found) { 4015 if (List->getMethod() == Method) { 4016 Found = true; 4017 } else { 4018 // Keep searching. 4019 continue; 4020 } 4021 } 4022 4023 if (List->getNext()) 4024 List->setMethod(List->getNext()->getMethod()); 4025 else 4026 List->setMethod(Method); 4027 } 4028 } 4029 4030 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) { 4031 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?"); 4032 for (Decl *D : Names) { 4033 bool wasHidden = D->isHidden(); 4034 D->setVisibleDespiteOwningModule(); 4035 4036 if (wasHidden && SemaObj) { 4037 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 4038 moveMethodToBackOfGlobalList(*SemaObj, Method); 4039 } 4040 } 4041 } 4042 } 4043 4044 void ASTReader::makeModuleVisible(Module *Mod, 4045 Module::NameVisibilityKind NameVisibility, 4046 SourceLocation ImportLoc) { 4047 llvm::SmallPtrSet<Module *, 4> Visited; 4048 SmallVector<Module *, 4> Stack; 4049 Stack.push_back(Mod); 4050 while (!Stack.empty()) { 4051 Mod = Stack.pop_back_val(); 4052 4053 if (NameVisibility <= Mod->NameVisibility) { 4054 // This module already has this level of visibility (or greater), so 4055 // there is nothing more to do. 4056 continue; 4057 } 4058 4059 if (Mod->isUnimportable()) { 4060 // Modules that aren't importable cannot be made visible. 4061 continue; 4062 } 4063 4064 // Update the module's name visibility. 4065 Mod->NameVisibility = NameVisibility; 4066 4067 // If we've already deserialized any names from this module, 4068 // mark them as visible. 4069 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 4070 if (Hidden != HiddenNamesMap.end()) { 4071 auto HiddenNames = std::move(*Hidden); 4072 HiddenNamesMap.erase(Hidden); 4073 makeNamesVisible(HiddenNames.second, HiddenNames.first); 4074 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && 4075 "making names visible added hidden names"); 4076 } 4077 4078 // Push any exported modules onto the stack to be marked as visible. 4079 SmallVector<Module *, 16> Exports; 4080 Mod->getExportedModules(Exports); 4081 for (SmallVectorImpl<Module *>::iterator 4082 I = Exports.begin(), E = Exports.end(); I != E; ++I) { 4083 Module *Exported = *I; 4084 if (Visited.insert(Exported).second) 4085 Stack.push_back(Exported); 4086 } 4087 } 4088 } 4089 4090 /// We've merged the definition \p MergedDef into the existing definition 4091 /// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made 4092 /// visible. 4093 void ASTReader::mergeDefinitionVisibility(NamedDecl *Def, 4094 NamedDecl *MergedDef) { 4095 if (Def->isHidden()) { 4096 // If MergedDef is visible or becomes visible, make the definition visible. 4097 if (!MergedDef->isHidden()) 4098 Def->setVisibleDespiteOwningModule(); 4099 else { 4100 getContext().mergeDefinitionIntoModule( 4101 Def, MergedDef->getImportedOwningModule(), 4102 /*NotifyListeners*/ false); 4103 PendingMergedDefinitionsToDeduplicate.insert(Def); 4104 } 4105 } 4106 } 4107 4108 bool ASTReader::loadGlobalIndex() { 4109 if (GlobalIndex) 4110 return false; 4111 4112 if (TriedLoadingGlobalIndex || !UseGlobalIndex || 4113 !PP.getLangOpts().Modules) 4114 return true; 4115 4116 // Try to load the global index. 4117 TriedLoadingGlobalIndex = true; 4118 StringRef ModuleCachePath 4119 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 4120 std::pair<GlobalModuleIndex *, llvm::Error> Result = 4121 GlobalModuleIndex::readIndex(ModuleCachePath); 4122 if (llvm::Error Err = std::move(Result.second)) { 4123 assert(!Result.first); 4124 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 4125 return true; 4126 } 4127 4128 GlobalIndex.reset(Result.first); 4129 ModuleMgr.setGlobalIndex(GlobalIndex.get()); 4130 return false; 4131 } 4132 4133 bool ASTReader::isGlobalIndexUnavailable() const { 4134 return PP.getLangOpts().Modules && UseGlobalIndex && 4135 !hasGlobalIndex() && TriedLoadingGlobalIndex; 4136 } 4137 4138 static void updateModuleTimestamp(ModuleFile &MF) { 4139 // Overwrite the timestamp file contents so that file's mtime changes. 4140 std::string TimestampFilename = MF.getTimestampFilename(); 4141 std::error_code EC; 4142 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::OF_Text); 4143 if (EC) 4144 return; 4145 OS << "Timestamp file\n"; 4146 OS.close(); 4147 OS.clear_error(); // Avoid triggering a fatal error. 4148 } 4149 4150 /// Given a cursor at the start of an AST file, scan ahead and drop the 4151 /// cursor into the start of the given block ID, returning false on success and 4152 /// true on failure. 4153 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 4154 while (true) { 4155 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 4156 if (!MaybeEntry) { 4157 // FIXME this drops errors on the floor. 4158 consumeError(MaybeEntry.takeError()); 4159 return true; 4160 } 4161 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4162 4163 switch (Entry.Kind) { 4164 case llvm::BitstreamEntry::Error: 4165 case llvm::BitstreamEntry::EndBlock: 4166 return true; 4167 4168 case llvm::BitstreamEntry::Record: 4169 // Ignore top-level records. 4170 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID)) 4171 break; 4172 else { 4173 // FIXME this drops errors on the floor. 4174 consumeError(Skipped.takeError()); 4175 return true; 4176 } 4177 4178 case llvm::BitstreamEntry::SubBlock: 4179 if (Entry.ID == BlockID) { 4180 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) { 4181 // FIXME this drops the error on the floor. 4182 consumeError(std::move(Err)); 4183 return true; 4184 } 4185 // Found it! 4186 return false; 4187 } 4188 4189 if (llvm::Error Err = Cursor.SkipBlock()) { 4190 // FIXME this drops the error on the floor. 4191 consumeError(std::move(Err)); 4192 return true; 4193 } 4194 } 4195 } 4196 } 4197 4198 ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, 4199 ModuleKind Type, 4200 SourceLocation ImportLoc, 4201 unsigned ClientLoadCapabilities, 4202 SmallVectorImpl<ImportedSubmodule> *Imported) { 4203 llvm::SaveAndRestore<SourceLocation> 4204 SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 4205 4206 // Defer any pending actions until we get to the end of reading the AST file. 4207 Deserializing AnASTFile(this); 4208 4209 // Bump the generation number. 4210 unsigned PreviousGeneration = 0; 4211 if (ContextObj) 4212 PreviousGeneration = incrementGeneration(*ContextObj); 4213 4214 unsigned NumModules = ModuleMgr.size(); 4215 auto removeModulesAndReturn = [&](ASTReadResult ReadResult) { 4216 assert(ReadResult && "expected to return error"); 4217 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, 4218 PP.getLangOpts().Modules 4219 ? &PP.getHeaderSearchInfo().getModuleMap() 4220 : nullptr); 4221 4222 // If we find that any modules are unusable, the global index is going 4223 // to be out-of-date. Just remove it. 4224 GlobalIndex.reset(); 4225 ModuleMgr.setGlobalIndex(nullptr); 4226 return ReadResult; 4227 }; 4228 4229 SmallVector<ImportedModule, 4> Loaded; 4230 switch (ASTReadResult ReadResult = 4231 ReadASTCore(FileName, Type, ImportLoc, 4232 /*ImportedBy=*/nullptr, Loaded, 0, 0, 4233 ASTFileSignature(), ClientLoadCapabilities)) { 4234 case Failure: 4235 case Missing: 4236 case OutOfDate: 4237 case VersionMismatch: 4238 case ConfigurationMismatch: 4239 case HadErrors: 4240 return removeModulesAndReturn(ReadResult); 4241 case Success: 4242 break; 4243 } 4244 4245 // Here comes stuff that we only do once the entire chain is loaded. 4246 4247 // Load the AST blocks of all of the modules that we loaded. We can still 4248 // hit errors parsing the ASTs at this point. 4249 for (ImportedModule &M : Loaded) { 4250 ModuleFile &F = *M.Mod; 4251 4252 // Read the AST block. 4253 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities)) 4254 return removeModulesAndReturn(Result); 4255 4256 // The AST block should always have a definition for the main module. 4257 if (F.isModule() && !F.DidReadTopLevelSubmodule) { 4258 Error(diag::err_module_file_missing_top_level_submodule, F.FileName); 4259 return removeModulesAndReturn(Failure); 4260 } 4261 4262 // Read the extension blocks. 4263 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) { 4264 if (ASTReadResult Result = ReadExtensionBlock(F)) 4265 return removeModulesAndReturn(Result); 4266 } 4267 4268 // Once read, set the ModuleFile bit base offset and update the size in 4269 // bits of all files we've seen. 4270 F.GlobalBitOffset = TotalModulesSizeInBits; 4271 TotalModulesSizeInBits += F.SizeInBits; 4272 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 4273 } 4274 4275 // Preload source locations and interesting indentifiers. 4276 for (ImportedModule &M : Loaded) { 4277 ModuleFile &F = *M.Mod; 4278 4279 // Preload SLocEntries. 4280 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 4281 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 4282 // Load it through the SourceManager and don't call ReadSLocEntry() 4283 // directly because the entry may have already been loaded in which case 4284 // calling ReadSLocEntry() directly would trigger an assertion in 4285 // SourceManager. 4286 SourceMgr.getLoadedSLocEntryByID(Index); 4287 } 4288 4289 // Map the original source file ID into the ID space of the current 4290 // compilation. 4291 if (F.OriginalSourceFileID.isValid()) { 4292 F.OriginalSourceFileID = FileID::get( 4293 F.SLocEntryBaseID + F.OriginalSourceFileID.getOpaqueValue() - 1); 4294 } 4295 4296 // Preload all the pending interesting identifiers by marking them out of 4297 // date. 4298 for (auto Offset : F.PreloadIdentifierOffsets) { 4299 const unsigned char *Data = reinterpret_cast<const unsigned char *>( 4300 F.IdentifierTableData + Offset); 4301 4302 ASTIdentifierLookupTrait Trait(*this, F); 4303 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 4304 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 4305 auto &II = PP.getIdentifierTable().getOwn(Key); 4306 II.setOutOfDate(true); 4307 4308 // Mark this identifier as being from an AST file so that we can track 4309 // whether we need to serialize it. 4310 markIdentifierFromAST(*this, II); 4311 4312 // Associate the ID with the identifier so that the writer can reuse it. 4313 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first); 4314 SetIdentifierInfo(ID, &II); 4315 } 4316 } 4317 4318 // Setup the import locations and notify the module manager that we've 4319 // committed to these module files. 4320 for (ImportedModule &M : Loaded) { 4321 ModuleFile &F = *M.Mod; 4322 4323 ModuleMgr.moduleFileAccepted(&F); 4324 4325 // Set the import location. 4326 F.DirectImportLoc = ImportLoc; 4327 // FIXME: We assume that locations from PCH / preamble do not need 4328 // any translation. 4329 if (!M.ImportedBy) 4330 F.ImportLoc = M.ImportLoc; 4331 else 4332 F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc); 4333 } 4334 4335 if (!PP.getLangOpts().CPlusPlus || 4336 (Type != MK_ImplicitModule && Type != MK_ExplicitModule && 4337 Type != MK_PrebuiltModule)) { 4338 // Mark all of the identifiers in the identifier table as being out of date, 4339 // so that various accessors know to check the loaded modules when the 4340 // identifier is used. 4341 // 4342 // For C++ modules, we don't need information on many identifiers (just 4343 // those that provide macros or are poisoned), so we mark all of 4344 // the interesting ones via PreloadIdentifierOffsets. 4345 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 4346 IdEnd = PP.getIdentifierTable().end(); 4347 Id != IdEnd; ++Id) 4348 Id->second->setOutOfDate(true); 4349 } 4350 // Mark selectors as out of date. 4351 for (auto Sel : SelectorGeneration) 4352 SelectorOutOfDate[Sel.first] = true; 4353 4354 // Resolve any unresolved module exports. 4355 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) { 4356 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I]; 4357 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 4358 Module *ResolvedMod = getSubmodule(GlobalID); 4359 4360 switch (Unresolved.Kind) { 4361 case UnresolvedModuleRef::Conflict: 4362 if (ResolvedMod) { 4363 Module::Conflict Conflict; 4364 Conflict.Other = ResolvedMod; 4365 Conflict.Message = Unresolved.String.str(); 4366 Unresolved.Mod->Conflicts.push_back(Conflict); 4367 } 4368 continue; 4369 4370 case UnresolvedModuleRef::Import: 4371 if (ResolvedMod) 4372 Unresolved.Mod->Imports.insert(ResolvedMod); 4373 continue; 4374 4375 case UnresolvedModuleRef::Export: 4376 if (ResolvedMod || Unresolved.IsWildcard) 4377 Unresolved.Mod->Exports.push_back( 4378 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 4379 continue; 4380 } 4381 } 4382 UnresolvedModuleRefs.clear(); 4383 4384 if (Imported) 4385 Imported->append(ImportedModules.begin(), 4386 ImportedModules.end()); 4387 4388 // FIXME: How do we load the 'use'd modules? They may not be submodules. 4389 // Might be unnecessary as use declarations are only used to build the 4390 // module itself. 4391 4392 if (ContextObj) 4393 InitializeContext(); 4394 4395 if (SemaObj) 4396 UpdateSema(); 4397 4398 if (DeserializationListener) 4399 DeserializationListener->ReaderInitialized(this); 4400 4401 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 4402 if (PrimaryModule.OriginalSourceFileID.isValid()) { 4403 // If this AST file is a precompiled preamble, then set the 4404 // preamble file ID of the source manager to the file source file 4405 // from which the preamble was built. 4406 if (Type == MK_Preamble) { 4407 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 4408 } else if (Type == MK_MainFile) { 4409 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 4410 } 4411 } 4412 4413 // For any Objective-C class definitions we have already loaded, make sure 4414 // that we load any additional categories. 4415 if (ContextObj) { 4416 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 4417 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 4418 ObjCClassesLoaded[I], 4419 PreviousGeneration); 4420 } 4421 } 4422 4423 if (PP.getHeaderSearchInfo() 4424 .getHeaderSearchOpts() 4425 .ModulesValidateOncePerBuildSession) { 4426 // Now we are certain that the module and all modules it depends on are 4427 // up to date. Create or update timestamp files for modules that are 4428 // located in the module cache (not for PCH files that could be anywhere 4429 // in the filesystem). 4430 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) { 4431 ImportedModule &M = Loaded[I]; 4432 if (M.Mod->Kind == MK_ImplicitModule) { 4433 updateModuleTimestamp(*M.Mod); 4434 } 4435 } 4436 } 4437 4438 return Success; 4439 } 4440 4441 static ASTFileSignature readASTFileSignature(StringRef PCH); 4442 4443 /// Whether \p Stream doesn't start with the AST/PCH file magic number 'CPCH'. 4444 static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) { 4445 // FIXME checking magic headers is done in other places such as 4446 // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't 4447 // always done the same. Unify it all with a helper. 4448 if (!Stream.canSkipToPos(4)) 4449 return llvm::createStringError(std::errc::illegal_byte_sequence, 4450 "file too small to contain AST file magic"); 4451 for (unsigned C : {'C', 'P', 'C', 'H'}) 4452 if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) { 4453 if (Res.get() != C) 4454 return llvm::createStringError( 4455 std::errc::illegal_byte_sequence, 4456 "file doesn't start with AST file magic"); 4457 } else 4458 return Res.takeError(); 4459 return llvm::Error::success(); 4460 } 4461 4462 static unsigned moduleKindForDiagnostic(ModuleKind Kind) { 4463 switch (Kind) { 4464 case MK_PCH: 4465 return 0; // PCH 4466 case MK_ImplicitModule: 4467 case MK_ExplicitModule: 4468 case MK_PrebuiltModule: 4469 return 1; // module 4470 case MK_MainFile: 4471 case MK_Preamble: 4472 return 2; // main source file 4473 } 4474 llvm_unreachable("unknown module kind"); 4475 } 4476 4477 ASTReader::ASTReadResult 4478 ASTReader::ReadASTCore(StringRef FileName, 4479 ModuleKind Type, 4480 SourceLocation ImportLoc, 4481 ModuleFile *ImportedBy, 4482 SmallVectorImpl<ImportedModule> &Loaded, 4483 off_t ExpectedSize, time_t ExpectedModTime, 4484 ASTFileSignature ExpectedSignature, 4485 unsigned ClientLoadCapabilities) { 4486 ModuleFile *M; 4487 std::string ErrorStr; 4488 ModuleManager::AddModuleResult AddResult 4489 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy, 4490 getGeneration(), ExpectedSize, ExpectedModTime, 4491 ExpectedSignature, readASTFileSignature, 4492 M, ErrorStr); 4493 4494 switch (AddResult) { 4495 case ModuleManager::AlreadyLoaded: 4496 Diag(diag::remark_module_import) 4497 << M->ModuleName << M->FileName << (ImportedBy ? true : false) 4498 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 4499 return Success; 4500 4501 case ModuleManager::NewlyLoaded: 4502 // Load module file below. 4503 break; 4504 4505 case ModuleManager::Missing: 4506 // The module file was missing; if the client can handle that, return 4507 // it. 4508 if (ClientLoadCapabilities & ARR_Missing) 4509 return Missing; 4510 4511 // Otherwise, return an error. 4512 Diag(diag::err_module_file_not_found) << moduleKindForDiagnostic(Type) 4513 << FileName << !ErrorStr.empty() 4514 << ErrorStr; 4515 return Failure; 4516 4517 case ModuleManager::OutOfDate: 4518 // We couldn't load the module file because it is out-of-date. If the 4519 // client can handle out-of-date, return it. 4520 if (ClientLoadCapabilities & ARR_OutOfDate) 4521 return OutOfDate; 4522 4523 // Otherwise, return an error. 4524 Diag(diag::err_module_file_out_of_date) << moduleKindForDiagnostic(Type) 4525 << FileName << !ErrorStr.empty() 4526 << ErrorStr; 4527 return Failure; 4528 } 4529 4530 assert(M && "Missing module file"); 4531 4532 bool ShouldFinalizePCM = false; 4533 auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() { 4534 auto &MC = getModuleManager().getModuleCache(); 4535 if (ShouldFinalizePCM) 4536 MC.finalizePCM(FileName); 4537 else 4538 MC.tryToDropPCM(FileName); 4539 }); 4540 ModuleFile &F = *M; 4541 BitstreamCursor &Stream = F.Stream; 4542 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer)); 4543 F.SizeInBits = F.Buffer->getBufferSize() * 8; 4544 4545 // Sniff for the signature. 4546 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4547 Diag(diag::err_module_file_invalid) 4548 << moduleKindForDiagnostic(Type) << FileName << std::move(Err); 4549 return Failure; 4550 } 4551 4552 // This is used for compatibility with older PCH formats. 4553 bool HaveReadControlBlock = false; 4554 while (true) { 4555 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4556 if (!MaybeEntry) { 4557 Error(MaybeEntry.takeError()); 4558 return Failure; 4559 } 4560 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4561 4562 switch (Entry.Kind) { 4563 case llvm::BitstreamEntry::Error: 4564 case llvm::BitstreamEntry::Record: 4565 case llvm::BitstreamEntry::EndBlock: 4566 Error("invalid record at top-level of AST file"); 4567 return Failure; 4568 4569 case llvm::BitstreamEntry::SubBlock: 4570 break; 4571 } 4572 4573 switch (Entry.ID) { 4574 case CONTROL_BLOCK_ID: 4575 HaveReadControlBlock = true; 4576 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) { 4577 case Success: 4578 // Check that we didn't try to load a non-module AST file as a module. 4579 // 4580 // FIXME: Should we also perform the converse check? Loading a module as 4581 // a PCH file sort of works, but it's a bit wonky. 4582 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule || 4583 Type == MK_PrebuiltModule) && 4584 F.ModuleName.empty()) { 4585 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure; 4586 if (Result != OutOfDate || 4587 (ClientLoadCapabilities & ARR_OutOfDate) == 0) 4588 Diag(diag::err_module_file_not_module) << FileName; 4589 return Result; 4590 } 4591 break; 4592 4593 case Failure: return Failure; 4594 case Missing: return Missing; 4595 case OutOfDate: return OutOfDate; 4596 case VersionMismatch: return VersionMismatch; 4597 case ConfigurationMismatch: return ConfigurationMismatch; 4598 case HadErrors: return HadErrors; 4599 } 4600 break; 4601 4602 case AST_BLOCK_ID: 4603 if (!HaveReadControlBlock) { 4604 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 4605 Diag(diag::err_pch_version_too_old); 4606 return VersionMismatch; 4607 } 4608 4609 // Record that we've loaded this module. 4610 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 4611 ShouldFinalizePCM = true; 4612 return Success; 4613 4614 case UNHASHED_CONTROL_BLOCK_ID: 4615 // This block is handled using look-ahead during ReadControlBlock. We 4616 // shouldn't get here! 4617 Error("malformed block record in AST file"); 4618 return Failure; 4619 4620 default: 4621 if (llvm::Error Err = Stream.SkipBlock()) { 4622 Error(std::move(Err)); 4623 return Failure; 4624 } 4625 break; 4626 } 4627 } 4628 4629 llvm_unreachable("unexpected break; expected return"); 4630 } 4631 4632 ASTReader::ASTReadResult 4633 ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy, 4634 unsigned ClientLoadCapabilities) { 4635 const HeaderSearchOptions &HSOpts = 4636 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 4637 bool AllowCompatibleConfigurationMismatch = 4638 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 4639 4640 ASTReadResult Result = readUnhashedControlBlockImpl( 4641 &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch, 4642 Listener.get(), 4643 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions); 4644 4645 // If F was directly imported by another module, it's implicitly validated by 4646 // the importing module. 4647 if (DisableValidation || WasImportedBy || 4648 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 4649 return Success; 4650 4651 if (Result == Failure) { 4652 Error("malformed block record in AST file"); 4653 return Failure; 4654 } 4655 4656 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) { 4657 // If this module has already been finalized in the ModuleCache, we're stuck 4658 // with it; we can only load a single version of each module. 4659 // 4660 // This can happen when a module is imported in two contexts: in one, as a 4661 // user module; in another, as a system module (due to an import from 4662 // another module marked with the [system] flag). It usually indicates a 4663 // bug in the module map: this module should also be marked with [system]. 4664 // 4665 // If -Wno-system-headers (the default), and the first import is as a 4666 // system module, then validation will fail during the as-user import, 4667 // since -Werror flags won't have been validated. However, it's reasonable 4668 // to treat this consistently as a system module. 4669 // 4670 // If -Wsystem-headers, the PCM on disk was built with 4671 // -Wno-system-headers, and the first import is as a user module, then 4672 // validation will fail during the as-system import since the PCM on disk 4673 // doesn't guarantee that -Werror was respected. However, the -Werror 4674 // flags were checked during the initial as-user import. 4675 if (getModuleManager().getModuleCache().isPCMFinal(F.FileName)) { 4676 Diag(diag::warn_module_system_bit_conflict) << F.FileName; 4677 return Success; 4678 } 4679 } 4680 4681 return Result; 4682 } 4683 4684 ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl( 4685 ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities, 4686 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener, 4687 bool ValidateDiagnosticOptions) { 4688 // Initialize a stream. 4689 BitstreamCursor Stream(StreamData); 4690 4691 // Sniff for the signature. 4692 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4693 // FIXME this drops the error on the floor. 4694 consumeError(std::move(Err)); 4695 return Failure; 4696 } 4697 4698 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 4699 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 4700 return Failure; 4701 4702 // Read all of the records in the options block. 4703 RecordData Record; 4704 ASTReadResult Result = Success; 4705 while (true) { 4706 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4707 if (!MaybeEntry) { 4708 // FIXME this drops the error on the floor. 4709 consumeError(MaybeEntry.takeError()); 4710 return Failure; 4711 } 4712 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4713 4714 switch (Entry.Kind) { 4715 case llvm::BitstreamEntry::Error: 4716 case llvm::BitstreamEntry::SubBlock: 4717 return Failure; 4718 4719 case llvm::BitstreamEntry::EndBlock: 4720 return Result; 4721 4722 case llvm::BitstreamEntry::Record: 4723 // The interesting case. 4724 break; 4725 } 4726 4727 // Read and process a record. 4728 Record.clear(); 4729 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 4730 if (!MaybeRecordType) { 4731 // FIXME this drops the error. 4732 return Failure; 4733 } 4734 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) { 4735 case SIGNATURE: 4736 if (F) 4737 std::copy(Record.begin(), Record.end(), F->Signature.data()); 4738 break; 4739 case DIAGNOSTIC_OPTIONS: { 4740 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 4741 if (Listener && ValidateDiagnosticOptions && 4742 !AllowCompatibleConfigurationMismatch && 4743 ParseDiagnosticOptions(Record, Complain, *Listener)) 4744 Result = OutOfDate; // Don't return early. Read the signature. 4745 break; 4746 } 4747 case DIAG_PRAGMA_MAPPINGS: 4748 if (!F) 4749 break; 4750 if (F->PragmaDiagMappings.empty()) 4751 F->PragmaDiagMappings.swap(Record); 4752 else 4753 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(), 4754 Record.begin(), Record.end()); 4755 break; 4756 } 4757 } 4758 } 4759 4760 /// Parse a record and blob containing module file extension metadata. 4761 static bool parseModuleFileExtensionMetadata( 4762 const SmallVectorImpl<uint64_t> &Record, 4763 StringRef Blob, 4764 ModuleFileExtensionMetadata &Metadata) { 4765 if (Record.size() < 4) return true; 4766 4767 Metadata.MajorVersion = Record[0]; 4768 Metadata.MinorVersion = Record[1]; 4769 4770 unsigned BlockNameLen = Record[2]; 4771 unsigned UserInfoLen = Record[3]; 4772 4773 if (BlockNameLen + UserInfoLen > Blob.size()) return true; 4774 4775 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen); 4776 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen, 4777 Blob.data() + BlockNameLen + UserInfoLen); 4778 return false; 4779 } 4780 4781 ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) { 4782 BitstreamCursor &Stream = F.Stream; 4783 4784 RecordData Record; 4785 while (true) { 4786 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4787 if (!MaybeEntry) { 4788 Error(MaybeEntry.takeError()); 4789 return Failure; 4790 } 4791 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4792 4793 switch (Entry.Kind) { 4794 case llvm::BitstreamEntry::SubBlock: 4795 if (llvm::Error Err = Stream.SkipBlock()) { 4796 Error(std::move(Err)); 4797 return Failure; 4798 } 4799 continue; 4800 4801 case llvm::BitstreamEntry::EndBlock: 4802 return Success; 4803 4804 case llvm::BitstreamEntry::Error: 4805 return HadErrors; 4806 4807 case llvm::BitstreamEntry::Record: 4808 break; 4809 } 4810 4811 Record.clear(); 4812 StringRef Blob; 4813 Expected<unsigned> MaybeRecCode = 4814 Stream.readRecord(Entry.ID, Record, &Blob); 4815 if (!MaybeRecCode) { 4816 Error(MaybeRecCode.takeError()); 4817 return Failure; 4818 } 4819 switch (MaybeRecCode.get()) { 4820 case EXTENSION_METADATA: { 4821 ModuleFileExtensionMetadata Metadata; 4822 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) { 4823 Error("malformed EXTENSION_METADATA in AST file"); 4824 return Failure; 4825 } 4826 4827 // Find a module file extension with this block name. 4828 auto Known = ModuleFileExtensions.find(Metadata.BlockName); 4829 if (Known == ModuleFileExtensions.end()) break; 4830 4831 // Form a reader. 4832 if (auto Reader = Known->second->createExtensionReader(Metadata, *this, 4833 F, Stream)) { 4834 F.ExtensionReaders.push_back(std::move(Reader)); 4835 } 4836 4837 break; 4838 } 4839 } 4840 } 4841 4842 return Success; 4843 } 4844 4845 void ASTReader::InitializeContext() { 4846 assert(ContextObj && "no context to initialize"); 4847 ASTContext &Context = *ContextObj; 4848 4849 // If there's a listener, notify them that we "read" the translation unit. 4850 if (DeserializationListener) 4851 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 4852 Context.getTranslationUnitDecl()); 4853 4854 // FIXME: Find a better way to deal with collisions between these 4855 // built-in types. Right now, we just ignore the problem. 4856 4857 // Load the special types. 4858 if (SpecialTypes.size() >= NumSpecialTypeIDs) { 4859 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 4860 if (!Context.CFConstantStringTypeDecl) 4861 Context.setCFConstantStringType(GetType(String)); 4862 } 4863 4864 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 4865 QualType FileType = GetType(File); 4866 if (FileType.isNull()) { 4867 Error("FILE type is NULL"); 4868 return; 4869 } 4870 4871 if (!Context.FILEDecl) { 4872 if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 4873 Context.setFILEDecl(Typedef->getDecl()); 4874 else { 4875 const TagType *Tag = FileType->getAs<TagType>(); 4876 if (!Tag) { 4877 Error("Invalid FILE type in AST file"); 4878 return; 4879 } 4880 Context.setFILEDecl(Tag->getDecl()); 4881 } 4882 } 4883 } 4884 4885 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 4886 QualType Jmp_bufType = GetType(Jmp_buf); 4887 if (Jmp_bufType.isNull()) { 4888 Error("jmp_buf type is NULL"); 4889 return; 4890 } 4891 4892 if (!Context.jmp_bufDecl) { 4893 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 4894 Context.setjmp_bufDecl(Typedef->getDecl()); 4895 else { 4896 const TagType *Tag = Jmp_bufType->getAs<TagType>(); 4897 if (!Tag) { 4898 Error("Invalid jmp_buf type in AST file"); 4899 return; 4900 } 4901 Context.setjmp_bufDecl(Tag->getDecl()); 4902 } 4903 } 4904 } 4905 4906 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 4907 QualType Sigjmp_bufType = GetType(Sigjmp_buf); 4908 if (Sigjmp_bufType.isNull()) { 4909 Error("sigjmp_buf type is NULL"); 4910 return; 4911 } 4912 4913 if (!Context.sigjmp_bufDecl) { 4914 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 4915 Context.setsigjmp_bufDecl(Typedef->getDecl()); 4916 else { 4917 const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 4918 assert(Tag && "Invalid sigjmp_buf type in AST file"); 4919 Context.setsigjmp_bufDecl(Tag->getDecl()); 4920 } 4921 } 4922 } 4923 4924 if (unsigned ObjCIdRedef 4925 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 4926 if (Context.ObjCIdRedefinitionType.isNull()) 4927 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 4928 } 4929 4930 if (unsigned ObjCClassRedef 4931 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 4932 if (Context.ObjCClassRedefinitionType.isNull()) 4933 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 4934 } 4935 4936 if (unsigned ObjCSelRedef 4937 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 4938 if (Context.ObjCSelRedefinitionType.isNull()) 4939 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 4940 } 4941 4942 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 4943 QualType Ucontext_tType = GetType(Ucontext_t); 4944 if (Ucontext_tType.isNull()) { 4945 Error("ucontext_t type is NULL"); 4946 return; 4947 } 4948 4949 if (!Context.ucontext_tDecl) { 4950 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 4951 Context.setucontext_tDecl(Typedef->getDecl()); 4952 else { 4953 const TagType *Tag = Ucontext_tType->getAs<TagType>(); 4954 assert(Tag && "Invalid ucontext_t type in AST file"); 4955 Context.setucontext_tDecl(Tag->getDecl()); 4956 } 4957 } 4958 } 4959 } 4960 4961 ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 4962 4963 // If there were any CUDA special declarations, deserialize them. 4964 if (!CUDASpecialDeclRefs.empty()) { 4965 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 4966 Context.setcudaConfigureCallDecl( 4967 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 4968 } 4969 4970 // Re-export any modules that were imported by a non-module AST file. 4971 // FIXME: This does not make macro-only imports visible again. 4972 for (auto &Import : ImportedModules) { 4973 if (Module *Imported = getSubmodule(Import.ID)) { 4974 makeModuleVisible(Imported, Module::AllVisible, 4975 /*ImportLoc=*/Import.ImportLoc); 4976 if (Import.ImportLoc.isValid()) 4977 PP.makeModuleVisible(Imported, Import.ImportLoc); 4978 // FIXME: should we tell Sema to make the module visible too? 4979 } 4980 } 4981 ImportedModules.clear(); 4982 } 4983 4984 void ASTReader::finalizeForWriting() { 4985 // Nothing to do for now. 4986 } 4987 4988 /// Reads and return the signature record from \p PCH's control block, or 4989 /// else returns 0. 4990 static ASTFileSignature readASTFileSignature(StringRef PCH) { 4991 BitstreamCursor Stream(PCH); 4992 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4993 // FIXME this drops the error on the floor. 4994 consumeError(std::move(Err)); 4995 return ASTFileSignature(); 4996 } 4997 4998 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 4999 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 5000 return ASTFileSignature(); 5001 5002 // Scan for SIGNATURE inside the diagnostic options block. 5003 ASTReader::RecordData Record; 5004 while (true) { 5005 Expected<llvm::BitstreamEntry> MaybeEntry = 5006 Stream.advanceSkippingSubblocks(); 5007 if (!MaybeEntry) { 5008 // FIXME this drops the error on the floor. 5009 consumeError(MaybeEntry.takeError()); 5010 return ASTFileSignature(); 5011 } 5012 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5013 5014 if (Entry.Kind != llvm::BitstreamEntry::Record) 5015 return ASTFileSignature(); 5016 5017 Record.clear(); 5018 StringRef Blob; 5019 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5020 if (!MaybeRecord) { 5021 // FIXME this drops the error on the floor. 5022 consumeError(MaybeRecord.takeError()); 5023 return ASTFileSignature(); 5024 } 5025 if (SIGNATURE == MaybeRecord.get()) 5026 return {{{(uint32_t)Record[0], (uint32_t)Record[1], (uint32_t)Record[2], 5027 (uint32_t)Record[3], (uint32_t)Record[4]}}}; 5028 } 5029 } 5030 5031 /// Retrieve the name of the original source file name 5032 /// directly from the AST file, without actually loading the AST 5033 /// file. 5034 std::string ASTReader::getOriginalSourceFile( 5035 const std::string &ASTFileName, FileManager &FileMgr, 5036 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) { 5037 // Open the AST file. 5038 auto Buffer = FileMgr.getBufferForFile(ASTFileName); 5039 if (!Buffer) { 5040 Diags.Report(diag::err_fe_unable_to_read_pch_file) 5041 << ASTFileName << Buffer.getError().message(); 5042 return std::string(); 5043 } 5044 5045 // Initialize the stream 5046 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer)); 5047 5048 // Sniff for the signature. 5049 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5050 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err); 5051 return std::string(); 5052 } 5053 5054 // Scan for the CONTROL_BLOCK_ID block. 5055 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 5056 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5057 return std::string(); 5058 } 5059 5060 // Scan for ORIGINAL_FILE inside the control block. 5061 RecordData Record; 5062 while (true) { 5063 Expected<llvm::BitstreamEntry> MaybeEntry = 5064 Stream.advanceSkippingSubblocks(); 5065 if (!MaybeEntry) { 5066 // FIXME this drops errors on the floor. 5067 consumeError(MaybeEntry.takeError()); 5068 return std::string(); 5069 } 5070 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5071 5072 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 5073 return std::string(); 5074 5075 if (Entry.Kind != llvm::BitstreamEntry::Record) { 5076 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5077 return std::string(); 5078 } 5079 5080 Record.clear(); 5081 StringRef Blob; 5082 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5083 if (!MaybeRecord) { 5084 // FIXME this drops the errors on the floor. 5085 consumeError(MaybeRecord.takeError()); 5086 return std::string(); 5087 } 5088 if (ORIGINAL_FILE == MaybeRecord.get()) 5089 return Blob.str(); 5090 } 5091 } 5092 5093 namespace { 5094 5095 class SimplePCHValidator : public ASTReaderListener { 5096 const LangOptions &ExistingLangOpts; 5097 const TargetOptions &ExistingTargetOpts; 5098 const PreprocessorOptions &ExistingPPOpts; 5099 std::string ExistingModuleCachePath; 5100 FileManager &FileMgr; 5101 5102 public: 5103 SimplePCHValidator(const LangOptions &ExistingLangOpts, 5104 const TargetOptions &ExistingTargetOpts, 5105 const PreprocessorOptions &ExistingPPOpts, 5106 StringRef ExistingModuleCachePath, FileManager &FileMgr) 5107 : ExistingLangOpts(ExistingLangOpts), 5108 ExistingTargetOpts(ExistingTargetOpts), 5109 ExistingPPOpts(ExistingPPOpts), 5110 ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr) {} 5111 5112 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, 5113 bool AllowCompatibleDifferences) override { 5114 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr, 5115 AllowCompatibleDifferences); 5116 } 5117 5118 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, 5119 bool AllowCompatibleDifferences) override { 5120 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr, 5121 AllowCompatibleDifferences); 5122 } 5123 5124 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 5125 StringRef SpecificModuleCachePath, 5126 bool Complain) override { 5127 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5128 ExistingModuleCachePath, 5129 nullptr, ExistingLangOpts); 5130 } 5131 5132 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 5133 bool Complain, 5134 std::string &SuggestedPredefines) override { 5135 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr, 5136 SuggestedPredefines, ExistingLangOpts); 5137 } 5138 }; 5139 5140 } // namespace 5141 5142 bool ASTReader::readASTFileControlBlock( 5143 StringRef Filename, FileManager &FileMgr, 5144 const PCHContainerReader &PCHContainerRdr, 5145 bool FindModuleFileExtensions, 5146 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) { 5147 // Open the AST file. 5148 // FIXME: This allows use of the VFS; we do not allow use of the 5149 // VFS when actually loading a module. 5150 auto Buffer = FileMgr.getBufferForFile(Filename); 5151 if (!Buffer) { 5152 return true; 5153 } 5154 5155 // Initialize the stream 5156 StringRef Bytes = PCHContainerRdr.ExtractPCH(**Buffer); 5157 BitstreamCursor Stream(Bytes); 5158 5159 // Sniff for the signature. 5160 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5161 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 5162 return true; 5163 } 5164 5165 // Scan for the CONTROL_BLOCK_ID block. 5166 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 5167 return true; 5168 5169 bool NeedsInputFiles = Listener.needsInputFileVisitation(); 5170 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation(); 5171 bool NeedsImports = Listener.needsImportVisitation(); 5172 BitstreamCursor InputFilesCursor; 5173 5174 RecordData Record; 5175 std::string ModuleDir; 5176 bool DoneWithControlBlock = false; 5177 while (!DoneWithControlBlock) { 5178 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5179 if (!MaybeEntry) { 5180 // FIXME this drops the error on the floor. 5181 consumeError(MaybeEntry.takeError()); 5182 return true; 5183 } 5184 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5185 5186 switch (Entry.Kind) { 5187 case llvm::BitstreamEntry::SubBlock: { 5188 switch (Entry.ID) { 5189 case OPTIONS_BLOCK_ID: { 5190 std::string IgnoredSuggestedPredefines; 5191 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate, 5192 /*AllowCompatibleConfigurationMismatch*/ false, 5193 Listener, IgnoredSuggestedPredefines) != Success) 5194 return true; 5195 break; 5196 } 5197 5198 case INPUT_FILES_BLOCK_ID: 5199 InputFilesCursor = Stream; 5200 if (llvm::Error Err = Stream.SkipBlock()) { 5201 // FIXME this drops the error on the floor. 5202 consumeError(std::move(Err)); 5203 return true; 5204 } 5205 if (NeedsInputFiles && 5206 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID)) 5207 return true; 5208 break; 5209 5210 default: 5211 if (llvm::Error Err = Stream.SkipBlock()) { 5212 // FIXME this drops the error on the floor. 5213 consumeError(std::move(Err)); 5214 return true; 5215 } 5216 break; 5217 } 5218 5219 continue; 5220 } 5221 5222 case llvm::BitstreamEntry::EndBlock: 5223 DoneWithControlBlock = true; 5224 break; 5225 5226 case llvm::BitstreamEntry::Error: 5227 return true; 5228 5229 case llvm::BitstreamEntry::Record: 5230 break; 5231 } 5232 5233 if (DoneWithControlBlock) break; 5234 5235 Record.clear(); 5236 StringRef Blob; 5237 Expected<unsigned> MaybeRecCode = 5238 Stream.readRecord(Entry.ID, Record, &Blob); 5239 if (!MaybeRecCode) { 5240 // FIXME this drops the error. 5241 return Failure; 5242 } 5243 switch ((ControlRecordTypes)MaybeRecCode.get()) { 5244 case METADATA: 5245 if (Record[0] != VERSION_MAJOR) 5246 return true; 5247 if (Listener.ReadFullVersionInformation(Blob)) 5248 return true; 5249 break; 5250 case MODULE_NAME: 5251 Listener.ReadModuleName(Blob); 5252 break; 5253 case MODULE_DIRECTORY: 5254 ModuleDir = std::string(Blob); 5255 break; 5256 case MODULE_MAP_FILE: { 5257 unsigned Idx = 0; 5258 auto Path = ReadString(Record, Idx); 5259 ResolveImportedPath(Path, ModuleDir); 5260 Listener.ReadModuleMapFile(Path); 5261 break; 5262 } 5263 case INPUT_FILE_OFFSETS: { 5264 if (!NeedsInputFiles) 5265 break; 5266 5267 unsigned NumInputFiles = Record[0]; 5268 unsigned NumUserFiles = Record[1]; 5269 const llvm::support::unaligned_uint64_t *InputFileOffs = 5270 (const llvm::support::unaligned_uint64_t *)Blob.data(); 5271 for (unsigned I = 0; I != NumInputFiles; ++I) { 5272 // Go find this input file. 5273 bool isSystemFile = I >= NumUserFiles; 5274 5275 if (isSystemFile && !NeedsSystemInputFiles) 5276 break; // the rest are system input files 5277 5278 BitstreamCursor &Cursor = InputFilesCursor; 5279 SavedStreamPosition SavedPosition(Cursor); 5280 if (llvm::Error Err = Cursor.JumpToBit(InputFileOffs[I])) { 5281 // FIXME this drops errors on the floor. 5282 consumeError(std::move(Err)); 5283 } 5284 5285 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 5286 if (!MaybeCode) { 5287 // FIXME this drops errors on the floor. 5288 consumeError(MaybeCode.takeError()); 5289 } 5290 unsigned Code = MaybeCode.get(); 5291 5292 RecordData Record; 5293 StringRef Blob; 5294 bool shouldContinue = false; 5295 Expected<unsigned> MaybeRecordType = 5296 Cursor.readRecord(Code, Record, &Blob); 5297 if (!MaybeRecordType) { 5298 // FIXME this drops errors on the floor. 5299 consumeError(MaybeRecordType.takeError()); 5300 } 5301 switch ((InputFileRecordTypes)MaybeRecordType.get()) { 5302 case INPUT_FILE_HASH: 5303 break; 5304 case INPUT_FILE: 5305 bool Overridden = static_cast<bool>(Record[3]); 5306 std::string Filename = std::string(Blob); 5307 ResolveImportedPath(Filename, ModuleDir); 5308 shouldContinue = Listener.visitInputFile( 5309 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false); 5310 break; 5311 } 5312 if (!shouldContinue) 5313 break; 5314 } 5315 break; 5316 } 5317 5318 case IMPORTS: { 5319 if (!NeedsImports) 5320 break; 5321 5322 unsigned Idx = 0, N = Record.size(); 5323 while (Idx < N) { 5324 // Read information about the AST file. 5325 Idx += 1+1+1+1+5; // Kind, ImportLoc, Size, ModTime, Signature 5326 std::string ModuleName = ReadString(Record, Idx); 5327 std::string Filename = ReadString(Record, Idx); 5328 ResolveImportedPath(Filename, ModuleDir); 5329 Listener.visitImport(ModuleName, Filename); 5330 } 5331 break; 5332 } 5333 5334 default: 5335 // No other validation to perform. 5336 break; 5337 } 5338 } 5339 5340 // Look for module file extension blocks, if requested. 5341 if (FindModuleFileExtensions) { 5342 BitstreamCursor SavedStream = Stream; 5343 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) { 5344 bool DoneWithExtensionBlock = false; 5345 while (!DoneWithExtensionBlock) { 5346 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5347 if (!MaybeEntry) { 5348 // FIXME this drops the error. 5349 return true; 5350 } 5351 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5352 5353 switch (Entry.Kind) { 5354 case llvm::BitstreamEntry::SubBlock: 5355 if (llvm::Error Err = Stream.SkipBlock()) { 5356 // FIXME this drops the error on the floor. 5357 consumeError(std::move(Err)); 5358 return true; 5359 } 5360 continue; 5361 5362 case llvm::BitstreamEntry::EndBlock: 5363 DoneWithExtensionBlock = true; 5364 continue; 5365 5366 case llvm::BitstreamEntry::Error: 5367 return true; 5368 5369 case llvm::BitstreamEntry::Record: 5370 break; 5371 } 5372 5373 Record.clear(); 5374 StringRef Blob; 5375 Expected<unsigned> MaybeRecCode = 5376 Stream.readRecord(Entry.ID, Record, &Blob); 5377 if (!MaybeRecCode) { 5378 // FIXME this drops the error. 5379 return true; 5380 } 5381 switch (MaybeRecCode.get()) { 5382 case EXTENSION_METADATA: { 5383 ModuleFileExtensionMetadata Metadata; 5384 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 5385 return true; 5386 5387 Listener.readModuleFileExtension(Metadata); 5388 break; 5389 } 5390 } 5391 } 5392 } 5393 Stream = SavedStream; 5394 } 5395 5396 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 5397 if (readUnhashedControlBlockImpl( 5398 nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate, 5399 /*AllowCompatibleConfigurationMismatch*/ false, &Listener, 5400 ValidateDiagnosticOptions) != Success) 5401 return true; 5402 5403 return false; 5404 } 5405 5406 bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, 5407 const PCHContainerReader &PCHContainerRdr, 5408 const LangOptions &LangOpts, 5409 const TargetOptions &TargetOpts, 5410 const PreprocessorOptions &PPOpts, 5411 StringRef ExistingModuleCachePath) { 5412 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, 5413 ExistingModuleCachePath, FileMgr); 5414 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr, 5415 /*FindModuleFileExtensions=*/false, 5416 validator, 5417 /*ValidateDiagnosticOptions=*/true); 5418 } 5419 5420 ASTReader::ASTReadResult 5421 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 5422 // Enter the submodule block. 5423 if (llvm::Error Err = F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) { 5424 Error(std::move(Err)); 5425 return Failure; 5426 } 5427 5428 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 5429 bool First = true; 5430 Module *CurrentModule = nullptr; 5431 RecordData Record; 5432 while (true) { 5433 Expected<llvm::BitstreamEntry> MaybeEntry = 5434 F.Stream.advanceSkippingSubblocks(); 5435 if (!MaybeEntry) { 5436 Error(MaybeEntry.takeError()); 5437 return Failure; 5438 } 5439 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5440 5441 switch (Entry.Kind) { 5442 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 5443 case llvm::BitstreamEntry::Error: 5444 Error("malformed block record in AST file"); 5445 return Failure; 5446 case llvm::BitstreamEntry::EndBlock: 5447 return Success; 5448 case llvm::BitstreamEntry::Record: 5449 // The interesting case. 5450 break; 5451 } 5452 5453 // Read a record. 5454 StringRef Blob; 5455 Record.clear(); 5456 Expected<unsigned> MaybeKind = F.Stream.readRecord(Entry.ID, Record, &Blob); 5457 if (!MaybeKind) { 5458 Error(MaybeKind.takeError()); 5459 return Failure; 5460 } 5461 unsigned Kind = MaybeKind.get(); 5462 5463 if ((Kind == SUBMODULE_METADATA) != First) { 5464 Error("submodule metadata record should be at beginning of block"); 5465 return Failure; 5466 } 5467 First = false; 5468 5469 // Submodule information is only valid if we have a current module. 5470 // FIXME: Should we error on these cases? 5471 if (!CurrentModule && Kind != SUBMODULE_METADATA && 5472 Kind != SUBMODULE_DEFINITION) 5473 continue; 5474 5475 switch (Kind) { 5476 default: // Default behavior: ignore. 5477 break; 5478 5479 case SUBMODULE_DEFINITION: { 5480 if (Record.size() < 12) { 5481 Error("malformed module definition"); 5482 return Failure; 5483 } 5484 5485 StringRef Name = Blob; 5486 unsigned Idx = 0; 5487 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]); 5488 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]); 5489 Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++]; 5490 bool IsFramework = Record[Idx++]; 5491 bool IsExplicit = Record[Idx++]; 5492 bool IsSystem = Record[Idx++]; 5493 bool IsExternC = Record[Idx++]; 5494 bool InferSubmodules = Record[Idx++]; 5495 bool InferExplicitSubmodules = Record[Idx++]; 5496 bool InferExportWildcard = Record[Idx++]; 5497 bool ConfigMacrosExhaustive = Record[Idx++]; 5498 bool ModuleMapIsPrivate = Record[Idx++]; 5499 5500 Module *ParentModule = nullptr; 5501 if (Parent) 5502 ParentModule = getSubmodule(Parent); 5503 5504 // Retrieve this (sub)module from the module map, creating it if 5505 // necessary. 5506 CurrentModule = 5507 ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit) 5508 .first; 5509 5510 // FIXME: set the definition loc for CurrentModule, or call 5511 // ModMap.setInferredModuleAllowedBy() 5512 5513 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 5514 if (GlobalIndex >= SubmodulesLoaded.size() || 5515 SubmodulesLoaded[GlobalIndex]) { 5516 Error("too many submodules"); 5517 return Failure; 5518 } 5519 5520 if (!ParentModule) { 5521 if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 5522 // Don't emit module relocation error if we have -fno-validate-pch 5523 if (!PP.getPreprocessorOpts().DisablePCHValidation && 5524 CurFile != F.File) { 5525 Error(diag::err_module_file_conflict, 5526 CurrentModule->getTopLevelModuleName(), CurFile->getName(), 5527 F.File->getName()); 5528 return Failure; 5529 } 5530 } 5531 5532 F.DidReadTopLevelSubmodule = true; 5533 CurrentModule->setASTFile(F.File); 5534 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath; 5535 } 5536 5537 CurrentModule->Kind = Kind; 5538 CurrentModule->Signature = F.Signature; 5539 CurrentModule->IsFromModuleFile = true; 5540 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 5541 CurrentModule->IsExternC = IsExternC; 5542 CurrentModule->InferSubmodules = InferSubmodules; 5543 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 5544 CurrentModule->InferExportWildcard = InferExportWildcard; 5545 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive; 5546 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate; 5547 if (DeserializationListener) 5548 DeserializationListener->ModuleRead(GlobalID, CurrentModule); 5549 5550 SubmodulesLoaded[GlobalIndex] = CurrentModule; 5551 5552 // Clear out data that will be replaced by what is in the module file. 5553 CurrentModule->LinkLibraries.clear(); 5554 CurrentModule->ConfigMacros.clear(); 5555 CurrentModule->UnresolvedConflicts.clear(); 5556 CurrentModule->Conflicts.clear(); 5557 5558 // The module is available unless it's missing a requirement; relevant 5559 // requirements will be (re-)added by SUBMODULE_REQUIRES records. 5560 // Missing headers that were present when the module was built do not 5561 // make it unavailable -- if we got this far, this must be an explicitly 5562 // imported module file. 5563 CurrentModule->Requirements.clear(); 5564 CurrentModule->MissingHeaders.clear(); 5565 CurrentModule->IsUnimportable = 5566 ParentModule && ParentModule->IsUnimportable; 5567 CurrentModule->IsAvailable = !CurrentModule->IsUnimportable; 5568 break; 5569 } 5570 5571 case SUBMODULE_UMBRELLA_HEADER: { 5572 std::string Filename = std::string(Blob); 5573 ResolveImportedPath(F, Filename); 5574 if (auto Umbrella = PP.getFileManager().getFile(Filename)) { 5575 if (!CurrentModule->getUmbrellaHeader()) 5576 ModMap.setUmbrellaHeader(CurrentModule, *Umbrella, Blob); 5577 else if (CurrentModule->getUmbrellaHeader().Entry != *Umbrella) { 5578 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 5579 Error("mismatched umbrella headers in submodule"); 5580 return OutOfDate; 5581 } 5582 } 5583 break; 5584 } 5585 5586 case SUBMODULE_HEADER: 5587 case SUBMODULE_EXCLUDED_HEADER: 5588 case SUBMODULE_PRIVATE_HEADER: 5589 // We lazily associate headers with their modules via the HeaderInfo table. 5590 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 5591 // of complete filenames or remove it entirely. 5592 break; 5593 5594 case SUBMODULE_TEXTUAL_HEADER: 5595 case SUBMODULE_PRIVATE_TEXTUAL_HEADER: 5596 // FIXME: Textual headers are not marked in the HeaderInfo table. Load 5597 // them here. 5598 break; 5599 5600 case SUBMODULE_TOPHEADER: 5601 CurrentModule->addTopHeaderFilename(Blob); 5602 break; 5603 5604 case SUBMODULE_UMBRELLA_DIR: { 5605 std::string Dirname = std::string(Blob); 5606 ResolveImportedPath(F, Dirname); 5607 if (auto Umbrella = PP.getFileManager().getDirectory(Dirname)) { 5608 if (!CurrentModule->getUmbrellaDir()) 5609 ModMap.setUmbrellaDir(CurrentModule, *Umbrella, Blob); 5610 else if (CurrentModule->getUmbrellaDir().Entry != *Umbrella) { 5611 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 5612 Error("mismatched umbrella directories in submodule"); 5613 return OutOfDate; 5614 } 5615 } 5616 break; 5617 } 5618 5619 case SUBMODULE_METADATA: { 5620 F.BaseSubmoduleID = getTotalNumSubmodules(); 5621 F.LocalNumSubmodules = Record[0]; 5622 unsigned LocalBaseSubmoduleID = Record[1]; 5623 if (F.LocalNumSubmodules > 0) { 5624 // Introduce the global -> local mapping for submodules within this 5625 // module. 5626 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 5627 5628 // Introduce the local -> global mapping for submodules within this 5629 // module. 5630 F.SubmoduleRemap.insertOrReplace( 5631 std::make_pair(LocalBaseSubmoduleID, 5632 F.BaseSubmoduleID - LocalBaseSubmoduleID)); 5633 5634 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 5635 } 5636 break; 5637 } 5638 5639 case SUBMODULE_IMPORTS: 5640 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 5641 UnresolvedModuleRef Unresolved; 5642 Unresolved.File = &F; 5643 Unresolved.Mod = CurrentModule; 5644 Unresolved.ID = Record[Idx]; 5645 Unresolved.Kind = UnresolvedModuleRef::Import; 5646 Unresolved.IsWildcard = false; 5647 UnresolvedModuleRefs.push_back(Unresolved); 5648 } 5649 break; 5650 5651 case SUBMODULE_EXPORTS: 5652 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 5653 UnresolvedModuleRef Unresolved; 5654 Unresolved.File = &F; 5655 Unresolved.Mod = CurrentModule; 5656 Unresolved.ID = Record[Idx]; 5657 Unresolved.Kind = UnresolvedModuleRef::Export; 5658 Unresolved.IsWildcard = Record[Idx + 1]; 5659 UnresolvedModuleRefs.push_back(Unresolved); 5660 } 5661 5662 // Once we've loaded the set of exports, there's no reason to keep 5663 // the parsed, unresolved exports around. 5664 CurrentModule->UnresolvedExports.clear(); 5665 break; 5666 5667 case SUBMODULE_REQUIRES: 5668 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(), 5669 PP.getTargetInfo()); 5670 break; 5671 5672 case SUBMODULE_LINK_LIBRARY: 5673 ModMap.resolveLinkAsDependencies(CurrentModule); 5674 CurrentModule->LinkLibraries.push_back( 5675 Module::LinkLibrary(std::string(Blob), Record[0])); 5676 break; 5677 5678 case SUBMODULE_CONFIG_MACRO: 5679 CurrentModule->ConfigMacros.push_back(Blob.str()); 5680 break; 5681 5682 case SUBMODULE_CONFLICT: { 5683 UnresolvedModuleRef Unresolved; 5684 Unresolved.File = &F; 5685 Unresolved.Mod = CurrentModule; 5686 Unresolved.ID = Record[0]; 5687 Unresolved.Kind = UnresolvedModuleRef::Conflict; 5688 Unresolved.IsWildcard = false; 5689 Unresolved.String = Blob; 5690 UnresolvedModuleRefs.push_back(Unresolved); 5691 break; 5692 } 5693 5694 case SUBMODULE_INITIALIZERS: { 5695 if (!ContextObj) 5696 break; 5697 SmallVector<uint32_t, 16> Inits; 5698 for (auto &ID : Record) 5699 Inits.push_back(getGlobalDeclID(F, ID)); 5700 ContextObj->addLazyModuleInitializers(CurrentModule, Inits); 5701 break; 5702 } 5703 5704 case SUBMODULE_EXPORT_AS: 5705 CurrentModule->ExportAsModule = Blob.str(); 5706 ModMap.addLinkAsDependency(CurrentModule); 5707 break; 5708 } 5709 } 5710 } 5711 5712 /// Parse the record that corresponds to a LangOptions data 5713 /// structure. 5714 /// 5715 /// This routine parses the language options from the AST file and then gives 5716 /// them to the AST listener if one is set. 5717 /// 5718 /// \returns true if the listener deems the file unacceptable, false otherwise. 5719 bool ASTReader::ParseLanguageOptions(const RecordData &Record, 5720 bool Complain, 5721 ASTReaderListener &Listener, 5722 bool AllowCompatibleDifferences) { 5723 LangOptions LangOpts; 5724 unsigned Idx = 0; 5725 #define LANGOPT(Name, Bits, Default, Description) \ 5726 LangOpts.Name = Record[Idx++]; 5727 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 5728 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 5729 #include "clang/Basic/LangOptions.def" 5730 #define SANITIZER(NAME, ID) \ 5731 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]); 5732 #include "clang/Basic/Sanitizers.def" 5733 5734 for (unsigned N = Record[Idx++]; N; --N) 5735 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx)); 5736 5737 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 5738 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 5739 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 5740 5741 LangOpts.CurrentModule = ReadString(Record, Idx); 5742 5743 // Comment options. 5744 for (unsigned N = Record[Idx++]; N; --N) { 5745 LangOpts.CommentOpts.BlockCommandNames.push_back( 5746 ReadString(Record, Idx)); 5747 } 5748 LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 5749 5750 // OpenMP offloading options. 5751 for (unsigned N = Record[Idx++]; N; --N) { 5752 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx))); 5753 } 5754 5755 LangOpts.OMPHostIRFile = ReadString(Record, Idx); 5756 5757 return Listener.ReadLanguageOptions(LangOpts, Complain, 5758 AllowCompatibleDifferences); 5759 } 5760 5761 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain, 5762 ASTReaderListener &Listener, 5763 bool AllowCompatibleDifferences) { 5764 unsigned Idx = 0; 5765 TargetOptions TargetOpts; 5766 TargetOpts.Triple = ReadString(Record, Idx); 5767 TargetOpts.CPU = ReadString(Record, Idx); 5768 TargetOpts.ABI = ReadString(Record, Idx); 5769 for (unsigned N = Record[Idx++]; N; --N) { 5770 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 5771 } 5772 for (unsigned N = Record[Idx++]; N; --N) { 5773 TargetOpts.Features.push_back(ReadString(Record, Idx)); 5774 } 5775 5776 return Listener.ReadTargetOptions(TargetOpts, Complain, 5777 AllowCompatibleDifferences); 5778 } 5779 5780 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 5781 ASTReaderListener &Listener) { 5782 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); 5783 unsigned Idx = 0; 5784 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++]; 5785 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 5786 DiagOpts->set##Name(static_cast<Type>(Record[Idx++])); 5787 #include "clang/Basic/DiagnosticOptions.def" 5788 5789 for (unsigned N = Record[Idx++]; N; --N) 5790 DiagOpts->Warnings.push_back(ReadString(Record, Idx)); 5791 for (unsigned N = Record[Idx++]; N; --N) 5792 DiagOpts->Remarks.push_back(ReadString(Record, Idx)); 5793 5794 return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 5795 } 5796 5797 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 5798 ASTReaderListener &Listener) { 5799 FileSystemOptions FSOpts; 5800 unsigned Idx = 0; 5801 FSOpts.WorkingDir = ReadString(Record, Idx); 5802 return Listener.ReadFileSystemOptions(FSOpts, Complain); 5803 } 5804 5805 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 5806 bool Complain, 5807 ASTReaderListener &Listener) { 5808 HeaderSearchOptions HSOpts; 5809 unsigned Idx = 0; 5810 HSOpts.Sysroot = ReadString(Record, Idx); 5811 5812 // Include entries. 5813 for (unsigned N = Record[Idx++]; N; --N) { 5814 std::string Path = ReadString(Record, Idx); 5815 frontend::IncludeDirGroup Group 5816 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 5817 bool IsFramework = Record[Idx++]; 5818 bool IgnoreSysRoot = Record[Idx++]; 5819 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework, 5820 IgnoreSysRoot); 5821 } 5822 5823 // System header prefixes. 5824 for (unsigned N = Record[Idx++]; N; --N) { 5825 std::string Prefix = ReadString(Record, Idx); 5826 bool IsSystemHeader = Record[Idx++]; 5827 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader); 5828 } 5829 5830 HSOpts.ResourceDir = ReadString(Record, Idx); 5831 HSOpts.ModuleCachePath = ReadString(Record, Idx); 5832 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx); 5833 HSOpts.DisableModuleHash = Record[Idx++]; 5834 HSOpts.ImplicitModuleMaps = Record[Idx++]; 5835 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++]; 5836 HSOpts.UseBuiltinIncludes = Record[Idx++]; 5837 HSOpts.UseStandardSystemIncludes = Record[Idx++]; 5838 HSOpts.UseStandardCXXIncludes = Record[Idx++]; 5839 HSOpts.UseLibcxx = Record[Idx++]; 5840 std::string SpecificModuleCachePath = ReadString(Record, Idx); 5841 5842 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5843 Complain); 5844 } 5845 5846 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 5847 bool Complain, 5848 ASTReaderListener &Listener, 5849 std::string &SuggestedPredefines) { 5850 PreprocessorOptions PPOpts; 5851 unsigned Idx = 0; 5852 5853 // Macro definitions/undefs 5854 for (unsigned N = Record[Idx++]; N; --N) { 5855 std::string Macro = ReadString(Record, Idx); 5856 bool IsUndef = Record[Idx++]; 5857 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 5858 } 5859 5860 // Includes 5861 for (unsigned N = Record[Idx++]; N; --N) { 5862 PPOpts.Includes.push_back(ReadString(Record, Idx)); 5863 } 5864 5865 // Macro Includes 5866 for (unsigned N = Record[Idx++]; N; --N) { 5867 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 5868 } 5869 5870 PPOpts.UsePredefines = Record[Idx++]; 5871 PPOpts.DetailedRecord = Record[Idx++]; 5872 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 5873 PPOpts.ObjCXXARCStandardLibrary = 5874 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 5875 SuggestedPredefines.clear(); 5876 return Listener.ReadPreprocessorOptions(PPOpts, Complain, 5877 SuggestedPredefines); 5878 } 5879 5880 std::pair<ModuleFile *, unsigned> 5881 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 5882 GlobalPreprocessedEntityMapType::iterator 5883 I = GlobalPreprocessedEntityMap.find(GlobalIndex); 5884 assert(I != GlobalPreprocessedEntityMap.end() && 5885 "Corrupted global preprocessed entity map"); 5886 ModuleFile *M = I->second; 5887 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 5888 return std::make_pair(M, LocalIndex); 5889 } 5890 5891 llvm::iterator_range<PreprocessingRecord::iterator> 5892 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 5893 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 5894 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 5895 Mod.NumPreprocessedEntities); 5896 5897 return llvm::make_range(PreprocessingRecord::iterator(), 5898 PreprocessingRecord::iterator()); 5899 } 5900 5901 llvm::iterator_range<ASTReader::ModuleDeclIterator> 5902 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 5903 return llvm::make_range( 5904 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 5905 ModuleDeclIterator(this, &Mod, 5906 Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 5907 } 5908 5909 SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) { 5910 auto I = GlobalSkippedRangeMap.find(GlobalIndex); 5911 assert(I != GlobalSkippedRangeMap.end() && 5912 "Corrupted global skipped range map"); 5913 ModuleFile *M = I->second; 5914 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID; 5915 assert(LocalIndex < M->NumPreprocessedSkippedRanges); 5916 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex]; 5917 SourceRange Range(TranslateSourceLocation(*M, RawRange.getBegin()), 5918 TranslateSourceLocation(*M, RawRange.getEnd())); 5919 assert(Range.isValid()); 5920 return Range; 5921 } 5922 5923 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 5924 PreprocessedEntityID PPID = Index+1; 5925 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 5926 ModuleFile &M = *PPInfo.first; 5927 unsigned LocalIndex = PPInfo.second; 5928 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 5929 5930 if (!PP.getPreprocessingRecord()) { 5931 Error("no preprocessing record"); 5932 return nullptr; 5933 } 5934 5935 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 5936 if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit( 5937 M.MacroOffsetsBase + PPOffs.BitOffset)) { 5938 Error(std::move(Err)); 5939 return nullptr; 5940 } 5941 5942 Expected<llvm::BitstreamEntry> MaybeEntry = 5943 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 5944 if (!MaybeEntry) { 5945 Error(MaybeEntry.takeError()); 5946 return nullptr; 5947 } 5948 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5949 5950 if (Entry.Kind != llvm::BitstreamEntry::Record) 5951 return nullptr; 5952 5953 // Read the record. 5954 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()), 5955 TranslateSourceLocation(M, PPOffs.getEnd())); 5956 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 5957 StringRef Blob; 5958 RecordData Record; 5959 Expected<unsigned> MaybeRecType = 5960 M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob); 5961 if (!MaybeRecType) { 5962 Error(MaybeRecType.takeError()); 5963 return nullptr; 5964 } 5965 switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) { 5966 case PPD_MACRO_EXPANSION: { 5967 bool isBuiltin = Record[0]; 5968 IdentifierInfo *Name = nullptr; 5969 MacroDefinitionRecord *Def = nullptr; 5970 if (isBuiltin) 5971 Name = getLocalIdentifier(M, Record[1]); 5972 else { 5973 PreprocessedEntityID GlobalID = 5974 getGlobalPreprocessedEntityID(M, Record[1]); 5975 Def = cast<MacroDefinitionRecord>( 5976 PPRec.getLoadedPreprocessedEntity(GlobalID - 1)); 5977 } 5978 5979 MacroExpansion *ME; 5980 if (isBuiltin) 5981 ME = new (PPRec) MacroExpansion(Name, Range); 5982 else 5983 ME = new (PPRec) MacroExpansion(Def, Range); 5984 5985 return ME; 5986 } 5987 5988 case PPD_MACRO_DEFINITION: { 5989 // Decode the identifier info and then check again; if the macro is 5990 // still defined and associated with the identifier, 5991 IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 5992 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range); 5993 5994 if (DeserializationListener) 5995 DeserializationListener->MacroDefinitionRead(PPID, MD); 5996 5997 return MD; 5998 } 5999 6000 case PPD_INCLUSION_DIRECTIVE: { 6001 const char *FullFileNameStart = Blob.data() + Record[0]; 6002 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 6003 const FileEntry *File = nullptr; 6004 if (!FullFileName.empty()) 6005 if (auto FE = PP.getFileManager().getFile(FullFileName)) 6006 File = *FE; 6007 6008 // FIXME: Stable encoding 6009 InclusionDirective::InclusionKind Kind 6010 = static_cast<InclusionDirective::InclusionKind>(Record[2]); 6011 InclusionDirective *ID 6012 = new (PPRec) InclusionDirective(PPRec, Kind, 6013 StringRef(Blob.data(), Record[0]), 6014 Record[1], Record[3], 6015 File, 6016 Range); 6017 return ID; 6018 } 6019 } 6020 6021 llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 6022 } 6023 6024 /// Find the next module that contains entities and return the ID 6025 /// of the first entry. 6026 /// 6027 /// \param SLocMapI points at a chunk of a module that contains no 6028 /// preprocessed entities or the entities it contains are not the ones we are 6029 /// looking for. 6030 PreprocessedEntityID ASTReader::findNextPreprocessedEntity( 6031 GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 6032 ++SLocMapI; 6033 for (GlobalSLocOffsetMapType::const_iterator 6034 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 6035 ModuleFile &M = *SLocMapI->second; 6036 if (M.NumPreprocessedEntities) 6037 return M.BasePreprocessedEntityID; 6038 } 6039 6040 return getTotalNumPreprocessedEntities(); 6041 } 6042 6043 namespace { 6044 6045 struct PPEntityComp { 6046 const ASTReader &Reader; 6047 ModuleFile &M; 6048 6049 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {} 6050 6051 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 6052 SourceLocation LHS = getLoc(L); 6053 SourceLocation RHS = getLoc(R); 6054 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6055 } 6056 6057 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 6058 SourceLocation LHS = getLoc(L); 6059 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6060 } 6061 6062 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 6063 SourceLocation RHS = getLoc(R); 6064 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6065 } 6066 6067 SourceLocation getLoc(const PPEntityOffset &PPE) const { 6068 return Reader.TranslateSourceLocation(M, PPE.getBegin()); 6069 } 6070 }; 6071 6072 } // namespace 6073 6074 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc, 6075 bool EndsAfter) const { 6076 if (SourceMgr.isLocalSourceLocation(Loc)) 6077 return getTotalNumPreprocessedEntities(); 6078 6079 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find( 6080 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1); 6081 assert(SLocMapI != GlobalSLocOffsetMap.end() && 6082 "Corrupted global sloc offset map"); 6083 6084 if (SLocMapI->second->NumPreprocessedEntities == 0) 6085 return findNextPreprocessedEntity(SLocMapI); 6086 6087 ModuleFile &M = *SLocMapI->second; 6088 6089 using pp_iterator = const PPEntityOffset *; 6090 6091 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 6092 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 6093 6094 size_t Count = M.NumPreprocessedEntities; 6095 size_t Half; 6096 pp_iterator First = pp_begin; 6097 pp_iterator PPI; 6098 6099 if (EndsAfter) { 6100 PPI = std::upper_bound(pp_begin, pp_end, Loc, 6101 PPEntityComp(*this, M)); 6102 } else { 6103 // Do a binary search manually instead of using std::lower_bound because 6104 // The end locations of entities may be unordered (when a macro expansion 6105 // is inside another macro argument), but for this case it is not important 6106 // whether we get the first macro expansion or its containing macro. 6107 while (Count > 0) { 6108 Half = Count / 2; 6109 PPI = First; 6110 std::advance(PPI, Half); 6111 if (SourceMgr.isBeforeInTranslationUnit( 6112 TranslateSourceLocation(M, PPI->getEnd()), Loc)) { 6113 First = PPI; 6114 ++First; 6115 Count = Count - Half - 1; 6116 } else 6117 Count = Half; 6118 } 6119 } 6120 6121 if (PPI == pp_end) 6122 return findNextPreprocessedEntity(SLocMapI); 6123 6124 return M.BasePreprocessedEntityID + (PPI - pp_begin); 6125 } 6126 6127 /// Returns a pair of [Begin, End) indices of preallocated 6128 /// preprocessed entities that \arg Range encompasses. 6129 std::pair<unsigned, unsigned> 6130 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 6131 if (Range.isInvalid()) 6132 return std::make_pair(0,0); 6133 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 6134 6135 PreprocessedEntityID BeginID = 6136 findPreprocessedEntity(Range.getBegin(), false); 6137 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true); 6138 return std::make_pair(BeginID, EndID); 6139 } 6140 6141 /// Optionally returns true or false if the preallocated preprocessed 6142 /// entity with index \arg Index came from file \arg FID. 6143 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 6144 FileID FID) { 6145 if (FID.isInvalid()) 6146 return false; 6147 6148 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 6149 ModuleFile &M = *PPInfo.first; 6150 unsigned LocalIndex = PPInfo.second; 6151 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 6152 6153 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin()); 6154 if (Loc.isInvalid()) 6155 return false; 6156 6157 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 6158 return true; 6159 else 6160 return false; 6161 } 6162 6163 namespace { 6164 6165 /// Visitor used to search for information about a header file. 6166 class HeaderFileInfoVisitor { 6167 const FileEntry *FE; 6168 Optional<HeaderFileInfo> HFI; 6169 6170 public: 6171 explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {} 6172 6173 bool operator()(ModuleFile &M) { 6174 HeaderFileInfoLookupTable *Table 6175 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 6176 if (!Table) 6177 return false; 6178 6179 // Look in the on-disk hash table for an entry for this file name. 6180 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE); 6181 if (Pos == Table->end()) 6182 return false; 6183 6184 HFI = *Pos; 6185 return true; 6186 } 6187 6188 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 6189 }; 6190 6191 } // namespace 6192 6193 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 6194 HeaderFileInfoVisitor Visitor(FE); 6195 ModuleMgr.visit(Visitor); 6196 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 6197 return *HFI; 6198 6199 return HeaderFileInfo(); 6200 } 6201 6202 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 6203 using DiagState = DiagnosticsEngine::DiagState; 6204 SmallVector<DiagState *, 32> DiagStates; 6205 6206 for (ModuleFile &F : ModuleMgr) { 6207 unsigned Idx = 0; 6208 auto &Record = F.PragmaDiagMappings; 6209 if (Record.empty()) 6210 continue; 6211 6212 DiagStates.clear(); 6213 6214 auto ReadDiagState = 6215 [&](const DiagState &BasedOn, SourceLocation Loc, 6216 bool IncludeNonPragmaStates) -> DiagnosticsEngine::DiagState * { 6217 unsigned BackrefID = Record[Idx++]; 6218 if (BackrefID != 0) 6219 return DiagStates[BackrefID - 1]; 6220 6221 // A new DiagState was created here. 6222 Diag.DiagStates.push_back(BasedOn); 6223 DiagState *NewState = &Diag.DiagStates.back(); 6224 DiagStates.push_back(NewState); 6225 unsigned Size = Record[Idx++]; 6226 assert(Idx + Size * 2 <= Record.size() && 6227 "Invalid data, not enough diag/map pairs"); 6228 while (Size--) { 6229 unsigned DiagID = Record[Idx++]; 6230 DiagnosticMapping NewMapping = 6231 DiagnosticMapping::deserialize(Record[Idx++]); 6232 if (!NewMapping.isPragma() && !IncludeNonPragmaStates) 6233 continue; 6234 6235 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID); 6236 6237 // If this mapping was specified as a warning but the severity was 6238 // upgraded due to diagnostic settings, simulate the current diagnostic 6239 // settings (and use a warning). 6240 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) { 6241 NewMapping.setSeverity(diag::Severity::Warning); 6242 NewMapping.setUpgradedFromWarning(false); 6243 } 6244 6245 Mapping = NewMapping; 6246 } 6247 return NewState; 6248 }; 6249 6250 // Read the first state. 6251 DiagState *FirstState; 6252 if (F.Kind == MK_ImplicitModule) { 6253 // Implicitly-built modules are reused with different diagnostic 6254 // settings. Use the initial diagnostic state from Diag to simulate this 6255 // compilation's diagnostic settings. 6256 FirstState = Diag.DiagStatesByLoc.FirstDiagState; 6257 DiagStates.push_back(FirstState); 6258 6259 // Skip the initial diagnostic state from the serialized module. 6260 assert(Record[1] == 0 && 6261 "Invalid data, unexpected backref in initial state"); 6262 Idx = 3 + Record[2] * 2; 6263 assert(Idx < Record.size() && 6264 "Invalid data, not enough state change pairs in initial state"); 6265 } else if (F.isModule()) { 6266 // For an explicit module, preserve the flags from the module build 6267 // command line (-w, -Weverything, -Werror, ...) along with any explicit 6268 // -Wblah flags. 6269 unsigned Flags = Record[Idx++]; 6270 DiagState Initial; 6271 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1; 6272 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1; 6273 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1; 6274 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1; 6275 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1; 6276 Initial.ExtBehavior = (diag::Severity)Flags; 6277 FirstState = ReadDiagState(Initial, SourceLocation(), true); 6278 6279 assert(F.OriginalSourceFileID.isValid()); 6280 6281 // Set up the root buffer of the module to start with the initial 6282 // diagnostic state of the module itself, to cover files that contain no 6283 // explicit transitions (for which we did not serialize anything). 6284 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID] 6285 .StateTransitions.push_back({FirstState, 0}); 6286 } else { 6287 // For prefix ASTs, start with whatever the user configured on the 6288 // command line. 6289 Idx++; // Skip flags. 6290 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, 6291 SourceLocation(), false); 6292 } 6293 6294 // Read the state transitions. 6295 unsigned NumLocations = Record[Idx++]; 6296 while (NumLocations--) { 6297 assert(Idx < Record.size() && 6298 "Invalid data, missing pragma diagnostic states"); 6299 SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]); 6300 auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc); 6301 assert(IDAndOffset.first.isValid() && "invalid FileID for transition"); 6302 assert(IDAndOffset.second == 0 && "not a start location for a FileID"); 6303 unsigned Transitions = Record[Idx++]; 6304 6305 // Note that we don't need to set up Parent/ParentOffset here, because 6306 // we won't be changing the diagnostic state within imported FileIDs 6307 // (other than perhaps appending to the main source file, which has no 6308 // parent). 6309 auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first]; 6310 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions); 6311 for (unsigned I = 0; I != Transitions; ++I) { 6312 unsigned Offset = Record[Idx++]; 6313 auto *State = 6314 ReadDiagState(*FirstState, Loc.getLocWithOffset(Offset), false); 6315 F.StateTransitions.push_back({State, Offset}); 6316 } 6317 } 6318 6319 // Read the final state. 6320 assert(Idx < Record.size() && 6321 "Invalid data, missing final pragma diagnostic state"); 6322 SourceLocation CurStateLoc = 6323 ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 6324 auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false); 6325 6326 if (!F.isModule()) { 6327 Diag.DiagStatesByLoc.CurDiagState = CurState; 6328 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc; 6329 6330 // Preserve the property that the imaginary root file describes the 6331 // current state. 6332 FileID NullFile; 6333 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions; 6334 if (T.empty()) 6335 T.push_back({CurState, 0}); 6336 else 6337 T[0].State = CurState; 6338 } 6339 6340 // Don't try to read these mappings again. 6341 Record.clear(); 6342 } 6343 } 6344 6345 /// Get the correct cursor and offset for loading a type. 6346 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 6347 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 6348 assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 6349 ModuleFile *M = I->second; 6350 return RecordLocation( 6351 M, M->TypeOffsets[Index - M->BaseTypeIndex].getBitOffset()); 6352 } 6353 6354 static llvm::Optional<Type::TypeClass> getTypeClassForCode(TypeCode code) { 6355 switch (code) { 6356 #define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \ 6357 case TYPE_##CODE_ID: return Type::CLASS_ID; 6358 #include "clang/Serialization/TypeBitCodes.def" 6359 default: return llvm::None; 6360 } 6361 } 6362 6363 /// Read and return the type with the given index.. 6364 /// 6365 /// The index is the type ID, shifted and minus the number of predefs. This 6366 /// routine actually reads the record corresponding to the type at the given 6367 /// location. It is a helper routine for GetType, which deals with reading type 6368 /// IDs. 6369 QualType ASTReader::readTypeRecord(unsigned Index) { 6370 assert(ContextObj && "reading type with no AST context"); 6371 ASTContext &Context = *ContextObj; 6372 RecordLocation Loc = TypeCursorForIndex(Index); 6373 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 6374 6375 // Keep track of where we are in the stream, then jump back there 6376 // after reading this type. 6377 SavedStreamPosition SavedPosition(DeclsCursor); 6378 6379 ReadingKindTracker ReadingKind(Read_Type, *this); 6380 6381 // Note that we are loading a type record. 6382 Deserializing AType(this); 6383 6384 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) { 6385 Error(std::move(Err)); 6386 return QualType(); 6387 } 6388 Expected<unsigned> RawCode = DeclsCursor.ReadCode(); 6389 if (!RawCode) { 6390 Error(RawCode.takeError()); 6391 return QualType(); 6392 } 6393 6394 ASTRecordReader Record(*this, *Loc.F); 6395 Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get()); 6396 if (!Code) { 6397 Error(Code.takeError()); 6398 return QualType(); 6399 } 6400 if (Code.get() == TYPE_EXT_QUAL) { 6401 QualType baseType = Record.readQualType(); 6402 Qualifiers quals = Record.readQualifiers(); 6403 return Context.getQualifiedType(baseType, quals); 6404 } 6405 6406 auto maybeClass = getTypeClassForCode((TypeCode) Code.get()); 6407 if (!maybeClass) { 6408 Error("Unexpected code for type"); 6409 return QualType(); 6410 } 6411 6412 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record); 6413 return TypeReader.read(*maybeClass); 6414 } 6415 6416 namespace clang { 6417 6418 class TypeLocReader : public TypeLocVisitor<TypeLocReader> { 6419 ASTRecordReader &Reader; 6420 6421 SourceLocation readSourceLocation() { 6422 return Reader.readSourceLocation(); 6423 } 6424 6425 TypeSourceInfo *GetTypeSourceInfo() { 6426 return Reader.readTypeSourceInfo(); 6427 } 6428 6429 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() { 6430 return Reader.readNestedNameSpecifierLoc(); 6431 } 6432 6433 Attr *ReadAttr() { 6434 return Reader.readAttr(); 6435 } 6436 6437 public: 6438 TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {} 6439 6440 // We want compile-time assurance that we've enumerated all of 6441 // these, so unfortunately we have to declare them first, then 6442 // define them out-of-line. 6443 #define ABSTRACT_TYPELOC(CLASS, PARENT) 6444 #define TYPELOC(CLASS, PARENT) \ 6445 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 6446 #include "clang/AST/TypeLocNodes.def" 6447 6448 void VisitFunctionTypeLoc(FunctionTypeLoc); 6449 void VisitArrayTypeLoc(ArrayTypeLoc); 6450 }; 6451 6452 } // namespace clang 6453 6454 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 6455 // nothing to do 6456 } 6457 6458 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 6459 TL.setBuiltinLoc(readSourceLocation()); 6460 if (TL.needsExtraLocalData()) { 6461 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt())); 6462 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Reader.readInt())); 6463 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Reader.readInt())); 6464 TL.setModeAttr(Reader.readInt()); 6465 } 6466 } 6467 6468 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 6469 TL.setNameLoc(readSourceLocation()); 6470 } 6471 6472 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 6473 TL.setStarLoc(readSourceLocation()); 6474 } 6475 6476 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 6477 // nothing to do 6478 } 6479 6480 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 6481 // nothing to do 6482 } 6483 6484 void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) { 6485 TL.setExpansionLoc(readSourceLocation()); 6486 } 6487 6488 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 6489 TL.setCaretLoc(readSourceLocation()); 6490 } 6491 6492 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 6493 TL.setAmpLoc(readSourceLocation()); 6494 } 6495 6496 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 6497 TL.setAmpAmpLoc(readSourceLocation()); 6498 } 6499 6500 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 6501 TL.setStarLoc(readSourceLocation()); 6502 TL.setClassTInfo(GetTypeSourceInfo()); 6503 } 6504 6505 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 6506 TL.setLBracketLoc(readSourceLocation()); 6507 TL.setRBracketLoc(readSourceLocation()); 6508 if (Reader.readBool()) 6509 TL.setSizeExpr(Reader.readExpr()); 6510 else 6511 TL.setSizeExpr(nullptr); 6512 } 6513 6514 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 6515 VisitArrayTypeLoc(TL); 6516 } 6517 6518 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 6519 VisitArrayTypeLoc(TL); 6520 } 6521 6522 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 6523 VisitArrayTypeLoc(TL); 6524 } 6525 6526 void TypeLocReader::VisitDependentSizedArrayTypeLoc( 6527 DependentSizedArrayTypeLoc TL) { 6528 VisitArrayTypeLoc(TL); 6529 } 6530 6531 void TypeLocReader::VisitDependentAddressSpaceTypeLoc( 6532 DependentAddressSpaceTypeLoc TL) { 6533 6534 TL.setAttrNameLoc(readSourceLocation()); 6535 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6536 TL.setAttrExprOperand(Reader.readExpr()); 6537 } 6538 6539 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 6540 DependentSizedExtVectorTypeLoc TL) { 6541 TL.setNameLoc(readSourceLocation()); 6542 } 6543 6544 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 6545 TL.setNameLoc(readSourceLocation()); 6546 } 6547 6548 void TypeLocReader::VisitDependentVectorTypeLoc( 6549 DependentVectorTypeLoc TL) { 6550 TL.setNameLoc(readSourceLocation()); 6551 } 6552 6553 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 6554 TL.setNameLoc(readSourceLocation()); 6555 } 6556 6557 void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) { 6558 TL.setAttrNameLoc(readSourceLocation()); 6559 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6560 TL.setAttrRowOperand(Reader.readExpr()); 6561 TL.setAttrColumnOperand(Reader.readExpr()); 6562 } 6563 6564 void TypeLocReader::VisitDependentSizedMatrixTypeLoc( 6565 DependentSizedMatrixTypeLoc TL) { 6566 TL.setAttrNameLoc(readSourceLocation()); 6567 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6568 TL.setAttrRowOperand(Reader.readExpr()); 6569 TL.setAttrColumnOperand(Reader.readExpr()); 6570 } 6571 6572 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 6573 TL.setLocalRangeBegin(readSourceLocation()); 6574 TL.setLParenLoc(readSourceLocation()); 6575 TL.setRParenLoc(readSourceLocation()); 6576 TL.setExceptionSpecRange(Reader.readSourceRange()); 6577 TL.setLocalRangeEnd(readSourceLocation()); 6578 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) { 6579 TL.setParam(i, Reader.readDeclAs<ParmVarDecl>()); 6580 } 6581 } 6582 6583 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 6584 VisitFunctionTypeLoc(TL); 6585 } 6586 6587 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 6588 VisitFunctionTypeLoc(TL); 6589 } 6590 6591 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 6592 TL.setNameLoc(readSourceLocation()); 6593 } 6594 6595 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 6596 TL.setNameLoc(readSourceLocation()); 6597 } 6598 6599 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 6600 TL.setTypeofLoc(readSourceLocation()); 6601 TL.setLParenLoc(readSourceLocation()); 6602 TL.setRParenLoc(readSourceLocation()); 6603 } 6604 6605 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 6606 TL.setTypeofLoc(readSourceLocation()); 6607 TL.setLParenLoc(readSourceLocation()); 6608 TL.setRParenLoc(readSourceLocation()); 6609 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6610 } 6611 6612 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 6613 TL.setNameLoc(readSourceLocation()); 6614 } 6615 6616 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 6617 TL.setKWLoc(readSourceLocation()); 6618 TL.setLParenLoc(readSourceLocation()); 6619 TL.setRParenLoc(readSourceLocation()); 6620 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6621 } 6622 6623 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 6624 TL.setNameLoc(readSourceLocation()); 6625 if (Reader.readBool()) { 6626 TL.setNestedNameSpecifierLoc(ReadNestedNameSpecifierLoc()); 6627 TL.setTemplateKWLoc(readSourceLocation()); 6628 TL.setConceptNameLoc(readSourceLocation()); 6629 TL.setFoundDecl(Reader.readDeclAs<NamedDecl>()); 6630 TL.setLAngleLoc(readSourceLocation()); 6631 TL.setRAngleLoc(readSourceLocation()); 6632 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6633 TL.setArgLocInfo(i, Reader.readTemplateArgumentLocInfo( 6634 TL.getTypePtr()->getArg(i).getKind())); 6635 } 6636 } 6637 6638 void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc( 6639 DeducedTemplateSpecializationTypeLoc TL) { 6640 TL.setTemplateNameLoc(readSourceLocation()); 6641 } 6642 6643 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 6644 TL.setNameLoc(readSourceLocation()); 6645 } 6646 6647 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 6648 TL.setNameLoc(readSourceLocation()); 6649 } 6650 6651 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 6652 TL.setAttr(ReadAttr()); 6653 } 6654 6655 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 6656 TL.setNameLoc(readSourceLocation()); 6657 } 6658 6659 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 6660 SubstTemplateTypeParmTypeLoc TL) { 6661 TL.setNameLoc(readSourceLocation()); 6662 } 6663 6664 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 6665 SubstTemplateTypeParmPackTypeLoc TL) { 6666 TL.setNameLoc(readSourceLocation()); 6667 } 6668 6669 void TypeLocReader::VisitTemplateSpecializationTypeLoc( 6670 TemplateSpecializationTypeLoc TL) { 6671 TL.setTemplateKeywordLoc(readSourceLocation()); 6672 TL.setTemplateNameLoc(readSourceLocation()); 6673 TL.setLAngleLoc(readSourceLocation()); 6674 TL.setRAngleLoc(readSourceLocation()); 6675 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6676 TL.setArgLocInfo( 6677 i, 6678 Reader.readTemplateArgumentLocInfo( 6679 TL.getTypePtr()->getArg(i).getKind())); 6680 } 6681 6682 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 6683 TL.setLParenLoc(readSourceLocation()); 6684 TL.setRParenLoc(readSourceLocation()); 6685 } 6686 6687 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 6688 TL.setElaboratedKeywordLoc(readSourceLocation()); 6689 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6690 } 6691 6692 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 6693 TL.setNameLoc(readSourceLocation()); 6694 } 6695 6696 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 6697 TL.setElaboratedKeywordLoc(readSourceLocation()); 6698 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6699 TL.setNameLoc(readSourceLocation()); 6700 } 6701 6702 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 6703 DependentTemplateSpecializationTypeLoc TL) { 6704 TL.setElaboratedKeywordLoc(readSourceLocation()); 6705 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6706 TL.setTemplateKeywordLoc(readSourceLocation()); 6707 TL.setTemplateNameLoc(readSourceLocation()); 6708 TL.setLAngleLoc(readSourceLocation()); 6709 TL.setRAngleLoc(readSourceLocation()); 6710 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 6711 TL.setArgLocInfo( 6712 I, 6713 Reader.readTemplateArgumentLocInfo( 6714 TL.getTypePtr()->getArg(I).getKind())); 6715 } 6716 6717 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 6718 TL.setEllipsisLoc(readSourceLocation()); 6719 } 6720 6721 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 6722 TL.setNameLoc(readSourceLocation()); 6723 } 6724 6725 void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) { 6726 if (TL.getNumProtocols()) { 6727 TL.setProtocolLAngleLoc(readSourceLocation()); 6728 TL.setProtocolRAngleLoc(readSourceLocation()); 6729 } 6730 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6731 TL.setProtocolLoc(i, readSourceLocation()); 6732 } 6733 6734 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 6735 TL.setHasBaseTypeAsWritten(Reader.readBool()); 6736 TL.setTypeArgsLAngleLoc(readSourceLocation()); 6737 TL.setTypeArgsRAngleLoc(readSourceLocation()); 6738 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i) 6739 TL.setTypeArgTInfo(i, GetTypeSourceInfo()); 6740 TL.setProtocolLAngleLoc(readSourceLocation()); 6741 TL.setProtocolRAngleLoc(readSourceLocation()); 6742 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6743 TL.setProtocolLoc(i, readSourceLocation()); 6744 } 6745 6746 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 6747 TL.setStarLoc(readSourceLocation()); 6748 } 6749 6750 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 6751 TL.setKWLoc(readSourceLocation()); 6752 TL.setLParenLoc(readSourceLocation()); 6753 TL.setRParenLoc(readSourceLocation()); 6754 } 6755 6756 void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) { 6757 TL.setKWLoc(readSourceLocation()); 6758 } 6759 6760 void TypeLocReader::VisitExtIntTypeLoc(clang::ExtIntTypeLoc TL) { 6761 TL.setNameLoc(readSourceLocation()); 6762 } 6763 void TypeLocReader::VisitDependentExtIntTypeLoc( 6764 clang::DependentExtIntTypeLoc TL) { 6765 TL.setNameLoc(readSourceLocation()); 6766 } 6767 6768 6769 void ASTRecordReader::readTypeLoc(TypeLoc TL) { 6770 TypeLocReader TLR(*this); 6771 for (; !TL.isNull(); TL = TL.getNextTypeLoc()) 6772 TLR.Visit(TL); 6773 } 6774 6775 TypeSourceInfo *ASTRecordReader::readTypeSourceInfo() { 6776 QualType InfoTy = readType(); 6777 if (InfoTy.isNull()) 6778 return nullptr; 6779 6780 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 6781 readTypeLoc(TInfo->getTypeLoc()); 6782 return TInfo; 6783 } 6784 6785 QualType ASTReader::GetType(TypeID ID) { 6786 assert(ContextObj && "reading type with no AST context"); 6787 ASTContext &Context = *ContextObj; 6788 6789 unsigned FastQuals = ID & Qualifiers::FastMask; 6790 unsigned Index = ID >> Qualifiers::FastWidth; 6791 6792 if (Index < NUM_PREDEF_TYPE_IDS) { 6793 QualType T; 6794 switch ((PredefinedTypeIDs)Index) { 6795 case PREDEF_TYPE_NULL_ID: 6796 return QualType(); 6797 case PREDEF_TYPE_VOID_ID: 6798 T = Context.VoidTy; 6799 break; 6800 case PREDEF_TYPE_BOOL_ID: 6801 T = Context.BoolTy; 6802 break; 6803 case PREDEF_TYPE_CHAR_U_ID: 6804 case PREDEF_TYPE_CHAR_S_ID: 6805 // FIXME: Check that the signedness of CharTy is correct! 6806 T = Context.CharTy; 6807 break; 6808 case PREDEF_TYPE_UCHAR_ID: 6809 T = Context.UnsignedCharTy; 6810 break; 6811 case PREDEF_TYPE_USHORT_ID: 6812 T = Context.UnsignedShortTy; 6813 break; 6814 case PREDEF_TYPE_UINT_ID: 6815 T = Context.UnsignedIntTy; 6816 break; 6817 case PREDEF_TYPE_ULONG_ID: 6818 T = Context.UnsignedLongTy; 6819 break; 6820 case PREDEF_TYPE_ULONGLONG_ID: 6821 T = Context.UnsignedLongLongTy; 6822 break; 6823 case PREDEF_TYPE_UINT128_ID: 6824 T = Context.UnsignedInt128Ty; 6825 break; 6826 case PREDEF_TYPE_SCHAR_ID: 6827 T = Context.SignedCharTy; 6828 break; 6829 case PREDEF_TYPE_WCHAR_ID: 6830 T = Context.WCharTy; 6831 break; 6832 case PREDEF_TYPE_SHORT_ID: 6833 T = Context.ShortTy; 6834 break; 6835 case PREDEF_TYPE_INT_ID: 6836 T = Context.IntTy; 6837 break; 6838 case PREDEF_TYPE_LONG_ID: 6839 T = Context.LongTy; 6840 break; 6841 case PREDEF_TYPE_LONGLONG_ID: 6842 T = Context.LongLongTy; 6843 break; 6844 case PREDEF_TYPE_INT128_ID: 6845 T = Context.Int128Ty; 6846 break; 6847 case PREDEF_TYPE_BFLOAT16_ID: 6848 T = Context.BFloat16Ty; 6849 break; 6850 case PREDEF_TYPE_HALF_ID: 6851 T = Context.HalfTy; 6852 break; 6853 case PREDEF_TYPE_FLOAT_ID: 6854 T = Context.FloatTy; 6855 break; 6856 case PREDEF_TYPE_DOUBLE_ID: 6857 T = Context.DoubleTy; 6858 break; 6859 case PREDEF_TYPE_LONGDOUBLE_ID: 6860 T = Context.LongDoubleTy; 6861 break; 6862 case PREDEF_TYPE_SHORT_ACCUM_ID: 6863 T = Context.ShortAccumTy; 6864 break; 6865 case PREDEF_TYPE_ACCUM_ID: 6866 T = Context.AccumTy; 6867 break; 6868 case PREDEF_TYPE_LONG_ACCUM_ID: 6869 T = Context.LongAccumTy; 6870 break; 6871 case PREDEF_TYPE_USHORT_ACCUM_ID: 6872 T = Context.UnsignedShortAccumTy; 6873 break; 6874 case PREDEF_TYPE_UACCUM_ID: 6875 T = Context.UnsignedAccumTy; 6876 break; 6877 case PREDEF_TYPE_ULONG_ACCUM_ID: 6878 T = Context.UnsignedLongAccumTy; 6879 break; 6880 case PREDEF_TYPE_SHORT_FRACT_ID: 6881 T = Context.ShortFractTy; 6882 break; 6883 case PREDEF_TYPE_FRACT_ID: 6884 T = Context.FractTy; 6885 break; 6886 case PREDEF_TYPE_LONG_FRACT_ID: 6887 T = Context.LongFractTy; 6888 break; 6889 case PREDEF_TYPE_USHORT_FRACT_ID: 6890 T = Context.UnsignedShortFractTy; 6891 break; 6892 case PREDEF_TYPE_UFRACT_ID: 6893 T = Context.UnsignedFractTy; 6894 break; 6895 case PREDEF_TYPE_ULONG_FRACT_ID: 6896 T = Context.UnsignedLongFractTy; 6897 break; 6898 case PREDEF_TYPE_SAT_SHORT_ACCUM_ID: 6899 T = Context.SatShortAccumTy; 6900 break; 6901 case PREDEF_TYPE_SAT_ACCUM_ID: 6902 T = Context.SatAccumTy; 6903 break; 6904 case PREDEF_TYPE_SAT_LONG_ACCUM_ID: 6905 T = Context.SatLongAccumTy; 6906 break; 6907 case PREDEF_TYPE_SAT_USHORT_ACCUM_ID: 6908 T = Context.SatUnsignedShortAccumTy; 6909 break; 6910 case PREDEF_TYPE_SAT_UACCUM_ID: 6911 T = Context.SatUnsignedAccumTy; 6912 break; 6913 case PREDEF_TYPE_SAT_ULONG_ACCUM_ID: 6914 T = Context.SatUnsignedLongAccumTy; 6915 break; 6916 case PREDEF_TYPE_SAT_SHORT_FRACT_ID: 6917 T = Context.SatShortFractTy; 6918 break; 6919 case PREDEF_TYPE_SAT_FRACT_ID: 6920 T = Context.SatFractTy; 6921 break; 6922 case PREDEF_TYPE_SAT_LONG_FRACT_ID: 6923 T = Context.SatLongFractTy; 6924 break; 6925 case PREDEF_TYPE_SAT_USHORT_FRACT_ID: 6926 T = Context.SatUnsignedShortFractTy; 6927 break; 6928 case PREDEF_TYPE_SAT_UFRACT_ID: 6929 T = Context.SatUnsignedFractTy; 6930 break; 6931 case PREDEF_TYPE_SAT_ULONG_FRACT_ID: 6932 T = Context.SatUnsignedLongFractTy; 6933 break; 6934 case PREDEF_TYPE_FLOAT16_ID: 6935 T = Context.Float16Ty; 6936 break; 6937 case PREDEF_TYPE_FLOAT128_ID: 6938 T = Context.Float128Ty; 6939 break; 6940 case PREDEF_TYPE_OVERLOAD_ID: 6941 T = Context.OverloadTy; 6942 break; 6943 case PREDEF_TYPE_BOUND_MEMBER: 6944 T = Context.BoundMemberTy; 6945 break; 6946 case PREDEF_TYPE_PSEUDO_OBJECT: 6947 T = Context.PseudoObjectTy; 6948 break; 6949 case PREDEF_TYPE_DEPENDENT_ID: 6950 T = Context.DependentTy; 6951 break; 6952 case PREDEF_TYPE_UNKNOWN_ANY: 6953 T = Context.UnknownAnyTy; 6954 break; 6955 case PREDEF_TYPE_NULLPTR_ID: 6956 T = Context.NullPtrTy; 6957 break; 6958 case PREDEF_TYPE_CHAR8_ID: 6959 T = Context.Char8Ty; 6960 break; 6961 case PREDEF_TYPE_CHAR16_ID: 6962 T = Context.Char16Ty; 6963 break; 6964 case PREDEF_TYPE_CHAR32_ID: 6965 T = Context.Char32Ty; 6966 break; 6967 case PREDEF_TYPE_OBJC_ID: 6968 T = Context.ObjCBuiltinIdTy; 6969 break; 6970 case PREDEF_TYPE_OBJC_CLASS: 6971 T = Context.ObjCBuiltinClassTy; 6972 break; 6973 case PREDEF_TYPE_OBJC_SEL: 6974 T = Context.ObjCBuiltinSelTy; 6975 break; 6976 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 6977 case PREDEF_TYPE_##Id##_ID: \ 6978 T = Context.SingletonId; \ 6979 break; 6980 #include "clang/Basic/OpenCLImageTypes.def" 6981 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 6982 case PREDEF_TYPE_##Id##_ID: \ 6983 T = Context.Id##Ty; \ 6984 break; 6985 #include "clang/Basic/OpenCLExtensionTypes.def" 6986 case PREDEF_TYPE_SAMPLER_ID: 6987 T = Context.OCLSamplerTy; 6988 break; 6989 case PREDEF_TYPE_EVENT_ID: 6990 T = Context.OCLEventTy; 6991 break; 6992 case PREDEF_TYPE_CLK_EVENT_ID: 6993 T = Context.OCLClkEventTy; 6994 break; 6995 case PREDEF_TYPE_QUEUE_ID: 6996 T = Context.OCLQueueTy; 6997 break; 6998 case PREDEF_TYPE_RESERVE_ID_ID: 6999 T = Context.OCLReserveIDTy; 7000 break; 7001 case PREDEF_TYPE_AUTO_DEDUCT: 7002 T = Context.getAutoDeductType(); 7003 break; 7004 case PREDEF_TYPE_AUTO_RREF_DEDUCT: 7005 T = Context.getAutoRRefDeductType(); 7006 break; 7007 case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 7008 T = Context.ARCUnbridgedCastTy; 7009 break; 7010 case PREDEF_TYPE_BUILTIN_FN: 7011 T = Context.BuiltinFnTy; 7012 break; 7013 case PREDEF_TYPE_INCOMPLETE_MATRIX_IDX: 7014 T = Context.IncompleteMatrixIdxTy; 7015 break; 7016 case PREDEF_TYPE_OMP_ARRAY_SECTION: 7017 T = Context.OMPArraySectionTy; 7018 break; 7019 case PREDEF_TYPE_OMP_ARRAY_SHAPING: 7020 T = Context.OMPArraySectionTy; 7021 break; 7022 case PREDEF_TYPE_OMP_ITERATOR: 7023 T = Context.OMPIteratorTy; 7024 break; 7025 #define SVE_TYPE(Name, Id, SingletonId) \ 7026 case PREDEF_TYPE_##Id##_ID: \ 7027 T = Context.SingletonId; \ 7028 break; 7029 #include "clang/Basic/AArch64SVEACLETypes.def" 7030 } 7031 7032 assert(!T.isNull() && "Unknown predefined type"); 7033 return T.withFastQualifiers(FastQuals); 7034 } 7035 7036 Index -= NUM_PREDEF_TYPE_IDS; 7037 assert(Index < TypesLoaded.size() && "Type index out-of-range"); 7038 if (TypesLoaded[Index].isNull()) { 7039 TypesLoaded[Index] = readTypeRecord(Index); 7040 if (TypesLoaded[Index].isNull()) 7041 return QualType(); 7042 7043 TypesLoaded[Index]->setFromAST(); 7044 if (DeserializationListener) 7045 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 7046 TypesLoaded[Index]); 7047 } 7048 7049 return TypesLoaded[Index].withFastQualifiers(FastQuals); 7050 } 7051 7052 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 7053 return GetType(getGlobalTypeID(F, LocalID)); 7054 } 7055 7056 serialization::TypeID 7057 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 7058 unsigned FastQuals = LocalID & Qualifiers::FastMask; 7059 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 7060 7061 if (LocalIndex < NUM_PREDEF_TYPE_IDS) 7062 return LocalID; 7063 7064 if (!F.ModuleOffsetMap.empty()) 7065 ReadModuleOffsetMap(F); 7066 7067 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7068 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 7069 assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 7070 7071 unsigned GlobalIndex = LocalIndex + I->second; 7072 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 7073 } 7074 7075 TemplateArgumentLocInfo 7076 ASTRecordReader::readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind) { 7077 switch (Kind) { 7078 case TemplateArgument::Expression: 7079 return readExpr(); 7080 case TemplateArgument::Type: 7081 return readTypeSourceInfo(); 7082 case TemplateArgument::Template: { 7083 NestedNameSpecifierLoc QualifierLoc = 7084 readNestedNameSpecifierLoc(); 7085 SourceLocation TemplateNameLoc = readSourceLocation(); 7086 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 7087 SourceLocation()); 7088 } 7089 case TemplateArgument::TemplateExpansion: { 7090 NestedNameSpecifierLoc QualifierLoc = readNestedNameSpecifierLoc(); 7091 SourceLocation TemplateNameLoc = readSourceLocation(); 7092 SourceLocation EllipsisLoc = readSourceLocation(); 7093 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 7094 EllipsisLoc); 7095 } 7096 case TemplateArgument::Null: 7097 case TemplateArgument::Integral: 7098 case TemplateArgument::Declaration: 7099 case TemplateArgument::NullPtr: 7100 case TemplateArgument::Pack: 7101 // FIXME: Is this right? 7102 return TemplateArgumentLocInfo(); 7103 } 7104 llvm_unreachable("unexpected template argument loc"); 7105 } 7106 7107 TemplateArgumentLoc ASTRecordReader::readTemplateArgumentLoc() { 7108 TemplateArgument Arg = readTemplateArgument(); 7109 7110 if (Arg.getKind() == TemplateArgument::Expression) { 7111 if (readBool()) // bool InfoHasSameExpr. 7112 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 7113 } 7114 return TemplateArgumentLoc(Arg, readTemplateArgumentLocInfo(Arg.getKind())); 7115 } 7116 7117 const ASTTemplateArgumentListInfo * 7118 ASTRecordReader::readASTTemplateArgumentListInfo() { 7119 SourceLocation LAngleLoc = readSourceLocation(); 7120 SourceLocation RAngleLoc = readSourceLocation(); 7121 unsigned NumArgsAsWritten = readInt(); 7122 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 7123 for (unsigned i = 0; i != NumArgsAsWritten; ++i) 7124 TemplArgsInfo.addArgument(readTemplateArgumentLoc()); 7125 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 7126 } 7127 7128 Decl *ASTReader::GetExternalDecl(uint32_t ID) { 7129 return GetDecl(ID); 7130 } 7131 7132 void ASTReader::CompleteRedeclChain(const Decl *D) { 7133 if (NumCurrentElementsDeserializing) { 7134 // We arrange to not care about the complete redeclaration chain while we're 7135 // deserializing. Just remember that the AST has marked this one as complete 7136 // but that it's not actually complete yet, so we know we still need to 7137 // complete it later. 7138 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D)); 7139 return; 7140 } 7141 7142 const DeclContext *DC = D->getDeclContext()->getRedeclContext(); 7143 7144 // If this is a named declaration, complete it by looking it up 7145 // within its context. 7146 // 7147 // FIXME: Merging a function definition should merge 7148 // all mergeable entities within it. 7149 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) || 7150 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) { 7151 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) { 7152 if (!getContext().getLangOpts().CPlusPlus && 7153 isa<TranslationUnitDecl>(DC)) { 7154 // Outside of C++, we don't have a lookup table for the TU, so update 7155 // the identifier instead. (For C++ modules, we don't store decls 7156 // in the serialized identifier table, so we do the lookup in the TU.) 7157 auto *II = Name.getAsIdentifierInfo(); 7158 assert(II && "non-identifier name in C?"); 7159 if (II->isOutOfDate()) 7160 updateOutOfDateIdentifier(*II); 7161 } else 7162 DC->lookup(Name); 7163 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) { 7164 // Find all declarations of this kind from the relevant context. 7165 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) { 7166 auto *DC = cast<DeclContext>(DCDecl); 7167 SmallVector<Decl*, 8> Decls; 7168 FindExternalLexicalDecls( 7169 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls); 7170 } 7171 } 7172 } 7173 7174 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) 7175 CTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7176 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) 7177 VTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7178 if (auto *FD = dyn_cast<FunctionDecl>(D)) { 7179 if (auto *Template = FD->getPrimaryTemplate()) 7180 Template->LoadLazySpecializations(); 7181 } 7182 } 7183 7184 CXXCtorInitializer ** 7185 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) { 7186 RecordLocation Loc = getLocalBitOffset(Offset); 7187 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7188 SavedStreamPosition SavedPosition(Cursor); 7189 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7190 Error(std::move(Err)); 7191 return nullptr; 7192 } 7193 ReadingKindTracker ReadingKind(Read_Decl, *this); 7194 7195 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7196 if (!MaybeCode) { 7197 Error(MaybeCode.takeError()); 7198 return nullptr; 7199 } 7200 unsigned Code = MaybeCode.get(); 7201 7202 ASTRecordReader Record(*this, *Loc.F); 7203 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7204 if (!MaybeRecCode) { 7205 Error(MaybeRecCode.takeError()); 7206 return nullptr; 7207 } 7208 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) { 7209 Error("malformed AST file: missing C++ ctor initializers"); 7210 return nullptr; 7211 } 7212 7213 return Record.readCXXCtorInitializers(); 7214 } 7215 7216 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 7217 assert(ContextObj && "reading base specifiers with no AST context"); 7218 ASTContext &Context = *ContextObj; 7219 7220 RecordLocation Loc = getLocalBitOffset(Offset); 7221 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7222 SavedStreamPosition SavedPosition(Cursor); 7223 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7224 Error(std::move(Err)); 7225 return nullptr; 7226 } 7227 ReadingKindTracker ReadingKind(Read_Decl, *this); 7228 7229 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7230 if (!MaybeCode) { 7231 Error(MaybeCode.takeError()); 7232 return nullptr; 7233 } 7234 unsigned Code = MaybeCode.get(); 7235 7236 ASTRecordReader Record(*this, *Loc.F); 7237 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7238 if (!MaybeRecCode) { 7239 Error(MaybeCode.takeError()); 7240 return nullptr; 7241 } 7242 unsigned RecCode = MaybeRecCode.get(); 7243 7244 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 7245 Error("malformed AST file: missing C++ base specifiers"); 7246 return nullptr; 7247 } 7248 7249 unsigned NumBases = Record.readInt(); 7250 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 7251 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 7252 for (unsigned I = 0; I != NumBases; ++I) 7253 Bases[I] = Record.readCXXBaseSpecifier(); 7254 return Bases; 7255 } 7256 7257 serialization::DeclID 7258 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 7259 if (LocalID < NUM_PREDEF_DECL_IDS) 7260 return LocalID; 7261 7262 if (!F.ModuleOffsetMap.empty()) 7263 ReadModuleOffsetMap(F); 7264 7265 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7266 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 7267 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 7268 7269 return LocalID + I->second; 7270 } 7271 7272 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 7273 ModuleFile &M) const { 7274 // Predefined decls aren't from any module. 7275 if (ID < NUM_PREDEF_DECL_IDS) 7276 return false; 7277 7278 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID && 7279 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls; 7280 } 7281 7282 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 7283 if (!D->isFromASTFile()) 7284 return nullptr; 7285 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 7286 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7287 return I->second; 7288 } 7289 7290 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 7291 if (ID < NUM_PREDEF_DECL_IDS) 7292 return SourceLocation(); 7293 7294 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7295 7296 if (Index > DeclsLoaded.size()) { 7297 Error("declaration ID out-of-range for AST file"); 7298 return SourceLocation(); 7299 } 7300 7301 if (Decl *D = DeclsLoaded[Index]) 7302 return D->getLocation(); 7303 7304 SourceLocation Loc; 7305 DeclCursorForID(ID, Loc); 7306 return Loc; 7307 } 7308 7309 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) { 7310 switch (ID) { 7311 case PREDEF_DECL_NULL_ID: 7312 return nullptr; 7313 7314 case PREDEF_DECL_TRANSLATION_UNIT_ID: 7315 return Context.getTranslationUnitDecl(); 7316 7317 case PREDEF_DECL_OBJC_ID_ID: 7318 return Context.getObjCIdDecl(); 7319 7320 case PREDEF_DECL_OBJC_SEL_ID: 7321 return Context.getObjCSelDecl(); 7322 7323 case PREDEF_DECL_OBJC_CLASS_ID: 7324 return Context.getObjCClassDecl(); 7325 7326 case PREDEF_DECL_OBJC_PROTOCOL_ID: 7327 return Context.getObjCProtocolDecl(); 7328 7329 case PREDEF_DECL_INT_128_ID: 7330 return Context.getInt128Decl(); 7331 7332 case PREDEF_DECL_UNSIGNED_INT_128_ID: 7333 return Context.getUInt128Decl(); 7334 7335 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 7336 return Context.getObjCInstanceTypeDecl(); 7337 7338 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 7339 return Context.getBuiltinVaListDecl(); 7340 7341 case PREDEF_DECL_VA_LIST_TAG: 7342 return Context.getVaListTagDecl(); 7343 7344 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID: 7345 return Context.getBuiltinMSVaListDecl(); 7346 7347 case PREDEF_DECL_BUILTIN_MS_GUID_ID: 7348 return Context.getMSGuidTagDecl(); 7349 7350 case PREDEF_DECL_EXTERN_C_CONTEXT_ID: 7351 return Context.getExternCContextDecl(); 7352 7353 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID: 7354 return Context.getMakeIntegerSeqDecl(); 7355 7356 case PREDEF_DECL_CF_CONSTANT_STRING_ID: 7357 return Context.getCFConstantStringDecl(); 7358 7359 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID: 7360 return Context.getCFConstantStringTagDecl(); 7361 7362 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID: 7363 return Context.getTypePackElementDecl(); 7364 } 7365 llvm_unreachable("PredefinedDeclIDs unknown enum value"); 7366 } 7367 7368 Decl *ASTReader::GetExistingDecl(DeclID ID) { 7369 assert(ContextObj && "reading decl with no AST context"); 7370 if (ID < NUM_PREDEF_DECL_IDS) { 7371 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID); 7372 if (D) { 7373 // Track that we have merged the declaration with ID \p ID into the 7374 // pre-existing predefined declaration \p D. 7375 auto &Merged = KeyDecls[D->getCanonicalDecl()]; 7376 if (Merged.empty()) 7377 Merged.push_back(ID); 7378 } 7379 return D; 7380 } 7381 7382 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7383 7384 if (Index >= DeclsLoaded.size()) { 7385 assert(0 && "declaration ID out-of-range for AST file"); 7386 Error("declaration ID out-of-range for AST file"); 7387 return nullptr; 7388 } 7389 7390 return DeclsLoaded[Index]; 7391 } 7392 7393 Decl *ASTReader::GetDecl(DeclID ID) { 7394 if (ID < NUM_PREDEF_DECL_IDS) 7395 return GetExistingDecl(ID); 7396 7397 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7398 7399 if (Index >= DeclsLoaded.size()) { 7400 assert(0 && "declaration ID out-of-range for AST file"); 7401 Error("declaration ID out-of-range for AST file"); 7402 return nullptr; 7403 } 7404 7405 if (!DeclsLoaded[Index]) { 7406 ReadDeclRecord(ID); 7407 if (DeserializationListener) 7408 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 7409 } 7410 7411 return DeclsLoaded[Index]; 7412 } 7413 7414 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 7415 DeclID GlobalID) { 7416 if (GlobalID < NUM_PREDEF_DECL_IDS) 7417 return GlobalID; 7418 7419 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 7420 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7421 ModuleFile *Owner = I->second; 7422 7423 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 7424 = M.GlobalToLocalDeclIDs.find(Owner); 7425 if (Pos == M.GlobalToLocalDeclIDs.end()) 7426 return 0; 7427 7428 return GlobalID - Owner->BaseDeclID + Pos->second; 7429 } 7430 7431 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 7432 const RecordData &Record, 7433 unsigned &Idx) { 7434 if (Idx >= Record.size()) { 7435 Error("Corrupted AST file"); 7436 return 0; 7437 } 7438 7439 return getGlobalDeclID(F, Record[Idx++]); 7440 } 7441 7442 /// Resolve the offset of a statement into a statement. 7443 /// 7444 /// This operation will read a new statement from the external 7445 /// source each time it is called, and is meant to be used via a 7446 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 7447 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 7448 // Switch case IDs are per Decl. 7449 ClearSwitchCaseIDs(); 7450 7451 // Offset here is a global offset across the entire chain. 7452 RecordLocation Loc = getLocalBitOffset(Offset); 7453 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) { 7454 Error(std::move(Err)); 7455 return nullptr; 7456 } 7457 assert(NumCurrentElementsDeserializing == 0 && 7458 "should not be called while already deserializing"); 7459 Deserializing D(this); 7460 return ReadStmtFromStream(*Loc.F); 7461 } 7462 7463 void ASTReader::FindExternalLexicalDecls( 7464 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 7465 SmallVectorImpl<Decl *> &Decls) { 7466 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {}; 7467 7468 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) { 7469 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries"); 7470 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) { 7471 auto K = (Decl::Kind)+LexicalDecls[I]; 7472 if (!IsKindWeWant(K)) 7473 continue; 7474 7475 auto ID = (serialization::DeclID)+LexicalDecls[I + 1]; 7476 7477 // Don't add predefined declarations to the lexical context more 7478 // than once. 7479 if (ID < NUM_PREDEF_DECL_IDS) { 7480 if (PredefsVisited[ID]) 7481 continue; 7482 7483 PredefsVisited[ID] = true; 7484 } 7485 7486 if (Decl *D = GetLocalDecl(*M, ID)) { 7487 assert(D->getKind() == K && "wrong kind for lexical decl"); 7488 if (!DC->isDeclInLexicalTraversal(D)) 7489 Decls.push_back(D); 7490 } 7491 } 7492 }; 7493 7494 if (isa<TranslationUnitDecl>(DC)) { 7495 for (auto Lexical : TULexicalDecls) 7496 Visit(Lexical.first, Lexical.second); 7497 } else { 7498 auto I = LexicalDecls.find(DC); 7499 if (I != LexicalDecls.end()) 7500 Visit(I->second.first, I->second.second); 7501 } 7502 7503 ++NumLexicalDeclContextsRead; 7504 } 7505 7506 namespace { 7507 7508 class DeclIDComp { 7509 ASTReader &Reader; 7510 ModuleFile &Mod; 7511 7512 public: 7513 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 7514 7515 bool operator()(LocalDeclID L, LocalDeclID R) const { 7516 SourceLocation LHS = getLocation(L); 7517 SourceLocation RHS = getLocation(R); 7518 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7519 } 7520 7521 bool operator()(SourceLocation LHS, LocalDeclID R) const { 7522 SourceLocation RHS = getLocation(R); 7523 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7524 } 7525 7526 bool operator()(LocalDeclID L, SourceLocation RHS) const { 7527 SourceLocation LHS = getLocation(L); 7528 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7529 } 7530 7531 SourceLocation getLocation(LocalDeclID ID) const { 7532 return Reader.getSourceManager().getFileLoc( 7533 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 7534 } 7535 }; 7536 7537 } // namespace 7538 7539 void ASTReader::FindFileRegionDecls(FileID File, 7540 unsigned Offset, unsigned Length, 7541 SmallVectorImpl<Decl *> &Decls) { 7542 SourceManager &SM = getSourceManager(); 7543 7544 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 7545 if (I == FileDeclIDs.end()) 7546 return; 7547 7548 FileDeclsInfo &DInfo = I->second; 7549 if (DInfo.Decls.empty()) 7550 return; 7551 7552 SourceLocation 7553 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 7554 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 7555 7556 DeclIDComp DIDComp(*this, *DInfo.Mod); 7557 ArrayRef<serialization::LocalDeclID>::iterator BeginIt = 7558 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp); 7559 if (BeginIt != DInfo.Decls.begin()) 7560 --BeginIt; 7561 7562 // If we are pointing at a top-level decl inside an objc container, we need 7563 // to backtrack until we find it otherwise we will fail to report that the 7564 // region overlaps with an objc container. 7565 while (BeginIt != DInfo.Decls.begin() && 7566 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 7567 ->isTopLevelDeclInObjCContainer()) 7568 --BeginIt; 7569 7570 ArrayRef<serialization::LocalDeclID>::iterator EndIt = 7571 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp); 7572 if (EndIt != DInfo.Decls.end()) 7573 ++EndIt; 7574 7575 for (ArrayRef<serialization::LocalDeclID>::iterator 7576 DIt = BeginIt; DIt != EndIt; ++DIt) 7577 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 7578 } 7579 7580 bool 7581 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 7582 DeclarationName Name) { 7583 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && 7584 "DeclContext has no visible decls in storage"); 7585 if (!Name) 7586 return false; 7587 7588 auto It = Lookups.find(DC); 7589 if (It == Lookups.end()) 7590 return false; 7591 7592 Deserializing LookupResults(this); 7593 7594 // Load the list of declarations. 7595 SmallVector<NamedDecl *, 64> Decls; 7596 for (DeclID ID : It->second.Table.find(Name)) { 7597 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7598 if (ND->getDeclName() == Name) 7599 Decls.push_back(ND); 7600 } 7601 7602 ++NumVisibleDeclContextsRead; 7603 SetExternalVisibleDeclsForName(DC, Name, Decls); 7604 return !Decls.empty(); 7605 } 7606 7607 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 7608 if (!DC->hasExternalVisibleStorage()) 7609 return; 7610 7611 auto It = Lookups.find(DC); 7612 assert(It != Lookups.end() && 7613 "have external visible storage but no lookup tables"); 7614 7615 DeclsMap Decls; 7616 7617 for (DeclID ID : It->second.Table.findAll()) { 7618 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7619 Decls[ND->getDeclName()].push_back(ND); 7620 } 7621 7622 ++NumVisibleDeclContextsRead; 7623 7624 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 7625 SetExternalVisibleDeclsForName(DC, I->first, I->second); 7626 } 7627 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 7628 } 7629 7630 const serialization::reader::DeclContextLookupTable * 7631 ASTReader::getLoadedLookupTables(DeclContext *Primary) const { 7632 auto I = Lookups.find(Primary); 7633 return I == Lookups.end() ? nullptr : &I->second; 7634 } 7635 7636 /// Under non-PCH compilation the consumer receives the objc methods 7637 /// before receiving the implementation, and codegen depends on this. 7638 /// We simulate this by deserializing and passing to consumer the methods of the 7639 /// implementation before passing the deserialized implementation decl. 7640 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 7641 ASTConsumer *Consumer) { 7642 assert(ImplD && Consumer); 7643 7644 for (auto *I : ImplD->methods()) 7645 Consumer->HandleInterestingDecl(DeclGroupRef(I)); 7646 7647 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 7648 } 7649 7650 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 7651 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 7652 PassObjCImplDeclToConsumer(ImplD, Consumer); 7653 else 7654 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 7655 } 7656 7657 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 7658 this->Consumer = Consumer; 7659 7660 if (Consumer) 7661 PassInterestingDeclsToConsumer(); 7662 7663 if (DeserializationListener) 7664 DeserializationListener->ReaderInitialized(this); 7665 } 7666 7667 void ASTReader::PrintStats() { 7668 std::fprintf(stderr, "*** AST File Statistics:\n"); 7669 7670 unsigned NumTypesLoaded 7671 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 7672 QualType()); 7673 unsigned NumDeclsLoaded 7674 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 7675 (Decl *)nullptr); 7676 unsigned NumIdentifiersLoaded 7677 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 7678 IdentifiersLoaded.end(), 7679 (IdentifierInfo *)nullptr); 7680 unsigned NumMacrosLoaded 7681 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 7682 MacrosLoaded.end(), 7683 (MacroInfo *)nullptr); 7684 unsigned NumSelectorsLoaded 7685 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 7686 SelectorsLoaded.end(), 7687 Selector()); 7688 7689 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 7690 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 7691 NumSLocEntriesRead, TotalNumSLocEntries, 7692 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 7693 if (!TypesLoaded.empty()) 7694 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 7695 NumTypesLoaded, (unsigned)TypesLoaded.size(), 7696 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 7697 if (!DeclsLoaded.empty()) 7698 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 7699 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 7700 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 7701 if (!IdentifiersLoaded.empty()) 7702 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 7703 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 7704 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 7705 if (!MacrosLoaded.empty()) 7706 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7707 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 7708 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 7709 if (!SelectorsLoaded.empty()) 7710 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 7711 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 7712 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 7713 if (TotalNumStatements) 7714 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 7715 NumStatementsRead, TotalNumStatements, 7716 ((float)NumStatementsRead/TotalNumStatements * 100)); 7717 if (TotalNumMacros) 7718 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7719 NumMacrosRead, TotalNumMacros, 7720 ((float)NumMacrosRead/TotalNumMacros * 100)); 7721 if (TotalLexicalDeclContexts) 7722 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 7723 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 7724 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 7725 * 100)); 7726 if (TotalVisibleDeclContexts) 7727 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 7728 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 7729 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 7730 * 100)); 7731 if (TotalNumMethodPoolEntries) 7732 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 7733 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 7734 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 7735 * 100)); 7736 if (NumMethodPoolLookups) 7737 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 7738 NumMethodPoolHits, NumMethodPoolLookups, 7739 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 7740 if (NumMethodPoolTableLookups) 7741 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 7742 NumMethodPoolTableHits, NumMethodPoolTableLookups, 7743 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 7744 * 100.0)); 7745 if (NumIdentifierLookupHits) 7746 std::fprintf(stderr, 7747 " %u / %u identifier table lookups succeeded (%f%%)\n", 7748 NumIdentifierLookupHits, NumIdentifierLookups, 7749 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 7750 7751 if (GlobalIndex) { 7752 std::fprintf(stderr, "\n"); 7753 GlobalIndex->printStats(); 7754 } 7755 7756 std::fprintf(stderr, "\n"); 7757 dump(); 7758 std::fprintf(stderr, "\n"); 7759 } 7760 7761 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 7762 LLVM_DUMP_METHOD static void 7763 dumpModuleIDMap(StringRef Name, 7764 const ContinuousRangeMap<Key, ModuleFile *, 7765 InitialCapacity> &Map) { 7766 if (Map.begin() == Map.end()) 7767 return; 7768 7769 using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>; 7770 7771 llvm::errs() << Name << ":\n"; 7772 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 7773 I != IEnd; ++I) { 7774 llvm::errs() << " " << I->first << " -> " << I->second->FileName 7775 << "\n"; 7776 } 7777 } 7778 7779 LLVM_DUMP_METHOD void ASTReader::dump() { 7780 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 7781 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 7782 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 7783 dumpModuleIDMap("Global type map", GlobalTypeMap); 7784 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 7785 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 7786 dumpModuleIDMap("Global macro map", GlobalMacroMap); 7787 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 7788 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 7789 dumpModuleIDMap("Global preprocessed entity map", 7790 GlobalPreprocessedEntityMap); 7791 7792 llvm::errs() << "\n*** PCH/Modules Loaded:"; 7793 for (ModuleFile &M : ModuleMgr) 7794 M.dump(); 7795 } 7796 7797 /// Return the amount of memory used by memory buffers, breaking down 7798 /// by heap-backed versus mmap'ed memory. 7799 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 7800 for (ModuleFile &I : ModuleMgr) { 7801 if (llvm::MemoryBuffer *buf = I.Buffer) { 7802 size_t bytes = buf->getBufferSize(); 7803 switch (buf->getBufferKind()) { 7804 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 7805 sizes.malloc_bytes += bytes; 7806 break; 7807 case llvm::MemoryBuffer::MemoryBuffer_MMap: 7808 sizes.mmap_bytes += bytes; 7809 break; 7810 } 7811 } 7812 } 7813 } 7814 7815 void ASTReader::InitializeSema(Sema &S) { 7816 SemaObj = &S; 7817 S.addExternalSource(this); 7818 7819 // Makes sure any declarations that were deserialized "too early" 7820 // still get added to the identifier's declaration chains. 7821 for (uint64_t ID : PreloadedDeclIDs) { 7822 NamedDecl *D = cast<NamedDecl>(GetDecl(ID)); 7823 pushExternalDeclIntoScope(D, D->getDeclName()); 7824 } 7825 PreloadedDeclIDs.clear(); 7826 7827 // FIXME: What happens if these are changed by a module import? 7828 if (!FPPragmaOptions.empty()) { 7829 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 7830 SemaObj->CurFPFeatures = FPOptions(FPPragmaOptions[0]); 7831 } 7832 7833 SemaObj->OpenCLFeatures.copy(OpenCLExtensions); 7834 SemaObj->OpenCLTypeExtMap = OpenCLTypeExtMap; 7835 SemaObj->OpenCLDeclExtMap = OpenCLDeclExtMap; 7836 7837 UpdateSema(); 7838 } 7839 7840 void ASTReader::UpdateSema() { 7841 assert(SemaObj && "no Sema to update"); 7842 7843 // Load the offsets of the declarations that Sema references. 7844 // They will be lazily deserialized when needed. 7845 if (!SemaDeclRefs.empty()) { 7846 assert(SemaDeclRefs.size() % 3 == 0); 7847 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) { 7848 if (!SemaObj->StdNamespace) 7849 SemaObj->StdNamespace = SemaDeclRefs[I]; 7850 if (!SemaObj->StdBadAlloc) 7851 SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 7852 if (!SemaObj->StdAlignValT) 7853 SemaObj->StdAlignValT = SemaDeclRefs[I+2]; 7854 } 7855 SemaDeclRefs.clear(); 7856 } 7857 7858 // Update the state of pragmas. Use the same API as if we had encountered the 7859 // pragma in the source. 7860 if(OptimizeOffPragmaLocation.isValid()) 7861 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation); 7862 if (PragmaMSStructState != -1) 7863 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState); 7864 if (PointersToMembersPragmaLocation.isValid()) { 7865 SemaObj->ActOnPragmaMSPointersToMembers( 7866 (LangOptions::PragmaMSPointersToMembersKind) 7867 PragmaMSPointersToMembersState, 7868 PointersToMembersPragmaLocation); 7869 } 7870 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth; 7871 7872 if (PragmaPackCurrentValue) { 7873 // The bottom of the stack might have a default value. It must be adjusted 7874 // to the current value to ensure that the packing state is preserved after 7875 // popping entries that were included/imported from a PCH/module. 7876 bool DropFirst = false; 7877 if (!PragmaPackStack.empty() && 7878 PragmaPackStack.front().Location.isInvalid()) { 7879 assert(PragmaPackStack.front().Value == SemaObj->PackStack.DefaultValue && 7880 "Expected a default alignment value"); 7881 SemaObj->PackStack.Stack.emplace_back( 7882 PragmaPackStack.front().SlotLabel, SemaObj->PackStack.CurrentValue, 7883 SemaObj->PackStack.CurrentPragmaLocation, 7884 PragmaPackStack.front().PushLocation); 7885 DropFirst = true; 7886 } 7887 for (const auto &Entry : 7888 llvm::makeArrayRef(PragmaPackStack).drop_front(DropFirst ? 1 : 0)) 7889 SemaObj->PackStack.Stack.emplace_back(Entry.SlotLabel, Entry.Value, 7890 Entry.Location, Entry.PushLocation); 7891 if (PragmaPackCurrentLocation.isInvalid()) { 7892 assert(*PragmaPackCurrentValue == SemaObj->PackStack.DefaultValue && 7893 "Expected a default alignment value"); 7894 // Keep the current values. 7895 } else { 7896 SemaObj->PackStack.CurrentValue = *PragmaPackCurrentValue; 7897 SemaObj->PackStack.CurrentPragmaLocation = PragmaPackCurrentLocation; 7898 } 7899 } 7900 if (FpPragmaCurrentValue) { 7901 // The bottom of the stack might have a default value. It must be adjusted 7902 // to the current value to ensure that fp-pragma state is preserved after 7903 // popping entries that were included/imported from a PCH/module. 7904 bool DropFirst = false; 7905 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) { 7906 assert(FpPragmaStack.front().Value == 7907 SemaObj->FpPragmaStack.DefaultValue && 7908 "Expected a default pragma float_control value"); 7909 SemaObj->FpPragmaStack.Stack.emplace_back( 7910 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue, 7911 SemaObj->FpPragmaStack.CurrentPragmaLocation, 7912 FpPragmaStack.front().PushLocation); 7913 DropFirst = true; 7914 } 7915 for (const auto &Entry : 7916 llvm::makeArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0)) 7917 SemaObj->FpPragmaStack.Stack.emplace_back( 7918 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation); 7919 if (FpPragmaCurrentLocation.isInvalid()) { 7920 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue && 7921 "Expected a default pragma float_control value"); 7922 // Keep the current values. 7923 } else { 7924 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue; 7925 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation; 7926 } 7927 } 7928 } 7929 7930 IdentifierInfo *ASTReader::get(StringRef Name) { 7931 // Note that we are loading an identifier. 7932 Deserializing AnIdentifier(this); 7933 7934 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 7935 NumIdentifierLookups, 7936 NumIdentifierLookupHits); 7937 7938 // We don't need to do identifier table lookups in C++ modules (we preload 7939 // all interesting declarations, and don't need to use the scope for name 7940 // lookups). Perform the lookup in PCH files, though, since we don't build 7941 // a complete initial identifier table if we're carrying on from a PCH. 7942 if (PP.getLangOpts().CPlusPlus) { 7943 for (auto F : ModuleMgr.pch_modules()) 7944 if (Visitor(*F)) 7945 break; 7946 } else { 7947 // If there is a global index, look there first to determine which modules 7948 // provably do not have any results for this identifier. 7949 GlobalModuleIndex::HitSet Hits; 7950 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 7951 if (!loadGlobalIndex()) { 7952 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 7953 HitsPtr = &Hits; 7954 } 7955 } 7956 7957 ModuleMgr.visit(Visitor, HitsPtr); 7958 } 7959 7960 IdentifierInfo *II = Visitor.getIdentifierInfo(); 7961 markIdentifierUpToDate(II); 7962 return II; 7963 } 7964 7965 namespace clang { 7966 7967 /// An identifier-lookup iterator that enumerates all of the 7968 /// identifiers stored within a set of AST files. 7969 class ASTIdentifierIterator : public IdentifierIterator { 7970 /// The AST reader whose identifiers are being enumerated. 7971 const ASTReader &Reader; 7972 7973 /// The current index into the chain of AST files stored in 7974 /// the AST reader. 7975 unsigned Index; 7976 7977 /// The current position within the identifier lookup table 7978 /// of the current AST file. 7979 ASTIdentifierLookupTable::key_iterator Current; 7980 7981 /// The end position within the identifier lookup table of 7982 /// the current AST file. 7983 ASTIdentifierLookupTable::key_iterator End; 7984 7985 /// Whether to skip any modules in the ASTReader. 7986 bool SkipModules; 7987 7988 public: 7989 explicit ASTIdentifierIterator(const ASTReader &Reader, 7990 bool SkipModules = false); 7991 7992 StringRef Next() override; 7993 }; 7994 7995 } // namespace clang 7996 7997 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader, 7998 bool SkipModules) 7999 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) { 8000 } 8001 8002 StringRef ASTIdentifierIterator::Next() { 8003 while (Current == End) { 8004 // If we have exhausted all of our AST files, we're done. 8005 if (Index == 0) 8006 return StringRef(); 8007 8008 --Index; 8009 ModuleFile &F = Reader.ModuleMgr[Index]; 8010 if (SkipModules && F.isModule()) 8011 continue; 8012 8013 ASTIdentifierLookupTable *IdTable = 8014 (ASTIdentifierLookupTable *)F.IdentifierLookupTable; 8015 Current = IdTable->key_begin(); 8016 End = IdTable->key_end(); 8017 } 8018 8019 // We have any identifiers remaining in the current AST file; return 8020 // the next one. 8021 StringRef Result = *Current; 8022 ++Current; 8023 return Result; 8024 } 8025 8026 namespace { 8027 8028 /// A utility for appending two IdentifierIterators. 8029 class ChainedIdentifierIterator : public IdentifierIterator { 8030 std::unique_ptr<IdentifierIterator> Current; 8031 std::unique_ptr<IdentifierIterator> Queued; 8032 8033 public: 8034 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First, 8035 std::unique_ptr<IdentifierIterator> Second) 8036 : Current(std::move(First)), Queued(std::move(Second)) {} 8037 8038 StringRef Next() override { 8039 if (!Current) 8040 return StringRef(); 8041 8042 StringRef result = Current->Next(); 8043 if (!result.empty()) 8044 return result; 8045 8046 // Try the queued iterator, which may itself be empty. 8047 Current.reset(); 8048 std::swap(Current, Queued); 8049 return Next(); 8050 } 8051 }; 8052 8053 } // namespace 8054 8055 IdentifierIterator *ASTReader::getIdentifiers() { 8056 if (!loadGlobalIndex()) { 8057 std::unique_ptr<IdentifierIterator> ReaderIter( 8058 new ASTIdentifierIterator(*this, /*SkipModules=*/true)); 8059 std::unique_ptr<IdentifierIterator> ModulesIter( 8060 GlobalIndex->createIdentifierIterator()); 8061 return new ChainedIdentifierIterator(std::move(ReaderIter), 8062 std::move(ModulesIter)); 8063 } 8064 8065 return new ASTIdentifierIterator(*this); 8066 } 8067 8068 namespace clang { 8069 namespace serialization { 8070 8071 class ReadMethodPoolVisitor { 8072 ASTReader &Reader; 8073 Selector Sel; 8074 unsigned PriorGeneration; 8075 unsigned InstanceBits = 0; 8076 unsigned FactoryBits = 0; 8077 bool InstanceHasMoreThanOneDecl = false; 8078 bool FactoryHasMoreThanOneDecl = false; 8079 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 8080 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 8081 8082 public: 8083 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 8084 unsigned PriorGeneration) 8085 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {} 8086 8087 bool operator()(ModuleFile &M) { 8088 if (!M.SelectorLookupTable) 8089 return false; 8090 8091 // If we've already searched this module file, skip it now. 8092 if (M.Generation <= PriorGeneration) 8093 return true; 8094 8095 ++Reader.NumMethodPoolTableLookups; 8096 ASTSelectorLookupTable *PoolTable 8097 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 8098 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel); 8099 if (Pos == PoolTable->end()) 8100 return false; 8101 8102 ++Reader.NumMethodPoolTableHits; 8103 ++Reader.NumSelectorsRead; 8104 // FIXME: Not quite happy with the statistics here. We probably should 8105 // disable this tracking when called via LoadSelector. 8106 // Also, should entries without methods count as misses? 8107 ++Reader.NumMethodPoolEntriesRead; 8108 ASTSelectorLookupTrait::data_type Data = *Pos; 8109 if (Reader.DeserializationListener) 8110 Reader.DeserializationListener->SelectorRead(Data.ID, Sel); 8111 8112 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 8113 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 8114 InstanceBits = Data.InstanceBits; 8115 FactoryBits = Data.FactoryBits; 8116 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl; 8117 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl; 8118 return true; 8119 } 8120 8121 /// Retrieve the instance methods found by this visitor. 8122 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 8123 return InstanceMethods; 8124 } 8125 8126 /// Retrieve the instance methods found by this visitor. 8127 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 8128 return FactoryMethods; 8129 } 8130 8131 unsigned getInstanceBits() const { return InstanceBits; } 8132 unsigned getFactoryBits() const { return FactoryBits; } 8133 8134 bool instanceHasMoreThanOneDecl() const { 8135 return InstanceHasMoreThanOneDecl; 8136 } 8137 8138 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; } 8139 }; 8140 8141 } // namespace serialization 8142 } // namespace clang 8143 8144 /// Add the given set of methods to the method list. 8145 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 8146 ObjCMethodList &List) { 8147 for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 8148 S.addMethodToGlobalList(&List, Methods[I]); 8149 } 8150 } 8151 8152 void ASTReader::ReadMethodPool(Selector Sel) { 8153 // Get the selector generation and update it to the current generation. 8154 unsigned &Generation = SelectorGeneration[Sel]; 8155 unsigned PriorGeneration = Generation; 8156 Generation = getGeneration(); 8157 SelectorOutOfDate[Sel] = false; 8158 8159 // Search for methods defined with this selector. 8160 ++NumMethodPoolLookups; 8161 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 8162 ModuleMgr.visit(Visitor); 8163 8164 if (Visitor.getInstanceMethods().empty() && 8165 Visitor.getFactoryMethods().empty()) 8166 return; 8167 8168 ++NumMethodPoolHits; 8169 8170 if (!getSema()) 8171 return; 8172 8173 Sema &S = *getSema(); 8174 Sema::GlobalMethodPool::iterator Pos 8175 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first; 8176 8177 Pos->second.first.setBits(Visitor.getInstanceBits()); 8178 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl()); 8179 Pos->second.second.setBits(Visitor.getFactoryBits()); 8180 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl()); 8181 8182 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since 8183 // when building a module we keep every method individually and may need to 8184 // update hasMoreThanOneDecl as we add the methods. 8185 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 8186 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 8187 } 8188 8189 void ASTReader::updateOutOfDateSelector(Selector Sel) { 8190 if (SelectorOutOfDate[Sel]) 8191 ReadMethodPool(Sel); 8192 } 8193 8194 void ASTReader::ReadKnownNamespaces( 8195 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 8196 Namespaces.clear(); 8197 8198 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 8199 if (NamespaceDecl *Namespace 8200 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 8201 Namespaces.push_back(Namespace); 8202 } 8203 } 8204 8205 void ASTReader::ReadUndefinedButUsed( 8206 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) { 8207 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 8208 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 8209 SourceLocation Loc = 8210 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 8211 Undefined.insert(std::make_pair(D, Loc)); 8212 } 8213 } 8214 8215 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector< 8216 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> & 8217 Exprs) { 8218 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) { 8219 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++])); 8220 uint64_t Count = DelayedDeleteExprs[Idx++]; 8221 for (uint64_t C = 0; C < Count; ++C) { 8222 SourceLocation DeleteLoc = 8223 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]); 8224 const bool IsArrayForm = DelayedDeleteExprs[Idx++]; 8225 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm)); 8226 } 8227 } 8228 } 8229 8230 void ASTReader::ReadTentativeDefinitions( 8231 SmallVectorImpl<VarDecl *> &TentativeDefs) { 8232 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 8233 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 8234 if (Var) 8235 TentativeDefs.push_back(Var); 8236 } 8237 TentativeDefinitions.clear(); 8238 } 8239 8240 void ASTReader::ReadUnusedFileScopedDecls( 8241 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 8242 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 8243 DeclaratorDecl *D 8244 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 8245 if (D) 8246 Decls.push_back(D); 8247 } 8248 UnusedFileScopedDecls.clear(); 8249 } 8250 8251 void ASTReader::ReadDelegatingConstructors( 8252 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 8253 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 8254 CXXConstructorDecl *D 8255 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 8256 if (D) 8257 Decls.push_back(D); 8258 } 8259 DelegatingCtorDecls.clear(); 8260 } 8261 8262 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 8263 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 8264 TypedefNameDecl *D 8265 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 8266 if (D) 8267 Decls.push_back(D); 8268 } 8269 ExtVectorDecls.clear(); 8270 } 8271 8272 void ASTReader::ReadUnusedLocalTypedefNameCandidates( 8273 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 8274 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N; 8275 ++I) { 8276 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>( 8277 GetDecl(UnusedLocalTypedefNameCandidates[I])); 8278 if (D) 8279 Decls.insert(D); 8280 } 8281 UnusedLocalTypedefNameCandidates.clear(); 8282 } 8283 8284 void ASTReader::ReadDeclsToCheckForDeferredDiags( 8285 llvm::SmallVector<Decl *, 4> &Decls) { 8286 for (unsigned I = 0, N = DeclsToCheckForDeferredDiags.size(); I != N; 8287 ++I) { 8288 auto *D = dyn_cast_or_null<Decl>( 8289 GetDecl(DeclsToCheckForDeferredDiags[I])); 8290 if (D) 8291 Decls.push_back(D); 8292 } 8293 DeclsToCheckForDeferredDiags.clear(); 8294 } 8295 8296 8297 void ASTReader::ReadReferencedSelectors( 8298 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) { 8299 if (ReferencedSelectorsData.empty()) 8300 return; 8301 8302 // If there are @selector references added them to its pool. This is for 8303 // implementation of -Wselector. 8304 unsigned int DataSize = ReferencedSelectorsData.size()-1; 8305 unsigned I = 0; 8306 while (I < DataSize) { 8307 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 8308 SourceLocation SelLoc 8309 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 8310 Sels.push_back(std::make_pair(Sel, SelLoc)); 8311 } 8312 ReferencedSelectorsData.clear(); 8313 } 8314 8315 void ASTReader::ReadWeakUndeclaredIdentifiers( 8316 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) { 8317 if (WeakUndeclaredIdentifiers.empty()) 8318 return; 8319 8320 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 8321 IdentifierInfo *WeakId 8322 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8323 IdentifierInfo *AliasId 8324 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8325 SourceLocation Loc 8326 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 8327 bool Used = WeakUndeclaredIdentifiers[I++]; 8328 WeakInfo WI(AliasId, Loc); 8329 WI.setUsed(Used); 8330 WeakIDs.push_back(std::make_pair(WeakId, WI)); 8331 } 8332 WeakUndeclaredIdentifiers.clear(); 8333 } 8334 8335 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 8336 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 8337 ExternalVTableUse VT; 8338 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 8339 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 8340 VT.DefinitionRequired = VTableUses[Idx++]; 8341 VTables.push_back(VT); 8342 } 8343 8344 VTableUses.clear(); 8345 } 8346 8347 void ASTReader::ReadPendingInstantiations( 8348 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) { 8349 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 8350 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 8351 SourceLocation Loc 8352 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 8353 8354 Pending.push_back(std::make_pair(D, Loc)); 8355 } 8356 PendingInstantiations.clear(); 8357 } 8358 8359 void ASTReader::ReadLateParsedTemplates( 8360 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>> 8361 &LPTMap) { 8362 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N; 8363 /* In loop */) { 8364 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++])); 8365 8366 auto LT = std::make_unique<LateParsedTemplate>(); 8367 LT->D = GetDecl(LateParsedTemplates[Idx++]); 8368 8369 ModuleFile *F = getOwningModuleFile(LT->D); 8370 assert(F && "No module"); 8371 8372 unsigned TokN = LateParsedTemplates[Idx++]; 8373 LT->Toks.reserve(TokN); 8374 for (unsigned T = 0; T < TokN; ++T) 8375 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx)); 8376 8377 LPTMap.insert(std::make_pair(FD, std::move(LT))); 8378 } 8379 8380 LateParsedTemplates.clear(); 8381 } 8382 8383 void ASTReader::LoadSelector(Selector Sel) { 8384 // It would be complicated to avoid reading the methods anyway. So don't. 8385 ReadMethodPool(Sel); 8386 } 8387 8388 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 8389 assert(ID && "Non-zero identifier ID required"); 8390 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 8391 IdentifiersLoaded[ID - 1] = II; 8392 if (DeserializationListener) 8393 DeserializationListener->IdentifierRead(ID, II); 8394 } 8395 8396 /// Set the globally-visible declarations associated with the given 8397 /// identifier. 8398 /// 8399 /// If the AST reader is currently in a state where the given declaration IDs 8400 /// cannot safely be resolved, they are queued until it is safe to resolve 8401 /// them. 8402 /// 8403 /// \param II an IdentifierInfo that refers to one or more globally-visible 8404 /// declarations. 8405 /// 8406 /// \param DeclIDs the set of declaration IDs with the name @p II that are 8407 /// visible at global scope. 8408 /// 8409 /// \param Decls if non-null, this vector will be populated with the set of 8410 /// deserialized declarations. These declarations will not be pushed into 8411 /// scope. 8412 void 8413 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 8414 const SmallVectorImpl<uint32_t> &DeclIDs, 8415 SmallVectorImpl<Decl *> *Decls) { 8416 if (NumCurrentElementsDeserializing && !Decls) { 8417 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 8418 return; 8419 } 8420 8421 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 8422 if (!SemaObj) { 8423 // Queue this declaration so that it will be added to the 8424 // translation unit scope and identifier's declaration chain 8425 // once a Sema object is known. 8426 PreloadedDeclIDs.push_back(DeclIDs[I]); 8427 continue; 8428 } 8429 8430 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 8431 8432 // If we're simply supposed to record the declarations, do so now. 8433 if (Decls) { 8434 Decls->push_back(D); 8435 continue; 8436 } 8437 8438 // Introduce this declaration into the translation-unit scope 8439 // and add it to the declaration chain for this identifier, so 8440 // that (unqualified) name lookup will find it. 8441 pushExternalDeclIntoScope(D, II); 8442 } 8443 } 8444 8445 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 8446 if (ID == 0) 8447 return nullptr; 8448 8449 if (IdentifiersLoaded.empty()) { 8450 Error("no identifier table in AST file"); 8451 return nullptr; 8452 } 8453 8454 ID -= 1; 8455 if (!IdentifiersLoaded[ID]) { 8456 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 8457 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 8458 ModuleFile *M = I->second; 8459 unsigned Index = ID - M->BaseIdentifierID; 8460 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index]; 8461 8462 // All of the strings in the AST file are preceded by a 16-bit length. 8463 // Extract that 16-bit length to avoid having to execute strlen(). 8464 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as 8465 // unsigned integers. This is important to avoid integer overflow when 8466 // we cast them to 'unsigned'. 8467 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2; 8468 unsigned StrLen = (((unsigned) StrLenPtr[0]) 8469 | (((unsigned) StrLenPtr[1]) << 8)) - 1; 8470 auto &II = PP.getIdentifierTable().get(StringRef(Str, StrLen)); 8471 IdentifiersLoaded[ID] = &II; 8472 markIdentifierFromAST(*this, II); 8473 if (DeserializationListener) 8474 DeserializationListener->IdentifierRead(ID + 1, &II); 8475 } 8476 8477 return IdentifiersLoaded[ID]; 8478 } 8479 8480 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 8481 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 8482 } 8483 8484 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 8485 if (LocalID < NUM_PREDEF_IDENT_IDS) 8486 return LocalID; 8487 8488 if (!M.ModuleOffsetMap.empty()) 8489 ReadModuleOffsetMap(M); 8490 8491 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8492 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 8493 assert(I != M.IdentifierRemap.end() 8494 && "Invalid index into identifier index remap"); 8495 8496 return LocalID + I->second; 8497 } 8498 8499 MacroInfo *ASTReader::getMacro(MacroID ID) { 8500 if (ID == 0) 8501 return nullptr; 8502 8503 if (MacrosLoaded.empty()) { 8504 Error("no macro table in AST file"); 8505 return nullptr; 8506 } 8507 8508 ID -= NUM_PREDEF_MACRO_IDS; 8509 if (!MacrosLoaded[ID]) { 8510 GlobalMacroMapType::iterator I 8511 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 8512 assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 8513 ModuleFile *M = I->second; 8514 unsigned Index = ID - M->BaseMacroID; 8515 MacrosLoaded[ID] = 8516 ReadMacroRecord(*M, M->MacroOffsetsBase + M->MacroOffsets[Index]); 8517 8518 if (DeserializationListener) 8519 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 8520 MacrosLoaded[ID]); 8521 } 8522 8523 return MacrosLoaded[ID]; 8524 } 8525 8526 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 8527 if (LocalID < NUM_PREDEF_MACRO_IDS) 8528 return LocalID; 8529 8530 if (!M.ModuleOffsetMap.empty()) 8531 ReadModuleOffsetMap(M); 8532 8533 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8534 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 8535 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 8536 8537 return LocalID + I->second; 8538 } 8539 8540 serialization::SubmoduleID 8541 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 8542 if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 8543 return LocalID; 8544 8545 if (!M.ModuleOffsetMap.empty()) 8546 ReadModuleOffsetMap(M); 8547 8548 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8549 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 8550 assert(I != M.SubmoduleRemap.end() 8551 && "Invalid index into submodule index remap"); 8552 8553 return LocalID + I->second; 8554 } 8555 8556 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) { 8557 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 8558 assert(GlobalID == 0 && "Unhandled global submodule ID"); 8559 return nullptr; 8560 } 8561 8562 if (GlobalID > SubmodulesLoaded.size()) { 8563 Error("submodule ID out of range in AST file"); 8564 return nullptr; 8565 } 8566 8567 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 8568 } 8569 8570 Module *ASTReader::getModule(unsigned ID) { 8571 return getSubmodule(ID); 8572 } 8573 8574 bool ASTReader::DeclIsFromPCHWithObjectFile(const Decl *D) { 8575 ModuleFile *MF = getOwningModuleFile(D); 8576 return MF && MF->PCHHasObjectFile; 8577 } 8578 8579 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) { 8580 if (ID & 1) { 8581 // It's a module, look it up by submodule ID. 8582 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1)); 8583 return I == GlobalSubmoduleMap.end() ? nullptr : I->second; 8584 } else { 8585 // It's a prefix (preamble, PCH, ...). Look it up by index. 8586 unsigned IndexFromEnd = ID >> 1; 8587 assert(IndexFromEnd && "got reference to unknown module file"); 8588 return getModuleManager().pch_modules().end()[-IndexFromEnd]; 8589 } 8590 } 8591 8592 unsigned ASTReader::getModuleFileID(ModuleFile *F) { 8593 if (!F) 8594 return 1; 8595 8596 // For a file representing a module, use the submodule ID of the top-level 8597 // module as the file ID. For any other kind of file, the number of such 8598 // files loaded beforehand will be the same on reload. 8599 // FIXME: Is this true even if we have an explicit module file and a PCH? 8600 if (F->isModule()) 8601 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1; 8602 8603 auto PCHModules = getModuleManager().pch_modules(); 8604 auto I = llvm::find(PCHModules, F); 8605 assert(I != PCHModules.end() && "emitting reference to unknown file"); 8606 return (I - PCHModules.end()) << 1; 8607 } 8608 8609 llvm::Optional<ASTSourceDescriptor> 8610 ASTReader::getSourceDescriptor(unsigned ID) { 8611 if (Module *M = getSubmodule(ID)) 8612 return ASTSourceDescriptor(*M); 8613 8614 // If there is only a single PCH, return it instead. 8615 // Chained PCH are not supported. 8616 const auto &PCHChain = ModuleMgr.pch_modules(); 8617 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) { 8618 ModuleFile &MF = ModuleMgr.getPrimaryModule(); 8619 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName); 8620 StringRef FileName = llvm::sys::path::filename(MF.FileName); 8621 return ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName, 8622 MF.Signature); 8623 } 8624 return None; 8625 } 8626 8627 ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) { 8628 auto I = DefinitionSource.find(FD); 8629 if (I == DefinitionSource.end()) 8630 return EK_ReplyHazy; 8631 return I->second ? EK_Never : EK_Always; 8632 } 8633 8634 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 8635 return DecodeSelector(getGlobalSelectorID(M, LocalID)); 8636 } 8637 8638 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { 8639 if (ID == 0) 8640 return Selector(); 8641 8642 if (ID > SelectorsLoaded.size()) { 8643 Error("selector ID out of range in AST file"); 8644 return Selector(); 8645 } 8646 8647 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) { 8648 // Load this selector from the selector table. 8649 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 8650 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 8651 ModuleFile &M = *I->second; 8652 ASTSelectorLookupTrait Trait(*this, M); 8653 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 8654 SelectorsLoaded[ID - 1] = 8655 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 8656 if (DeserializationListener) 8657 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 8658 } 8659 8660 return SelectorsLoaded[ID - 1]; 8661 } 8662 8663 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 8664 return DecodeSelector(ID); 8665 } 8666 8667 uint32_t ASTReader::GetNumExternalSelectors() { 8668 // ID 0 (the null selector) is considered an external selector. 8669 return getTotalNumSelectors() + 1; 8670 } 8671 8672 serialization::SelectorID 8673 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 8674 if (LocalID < NUM_PREDEF_SELECTOR_IDS) 8675 return LocalID; 8676 8677 if (!M.ModuleOffsetMap.empty()) 8678 ReadModuleOffsetMap(M); 8679 8680 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8681 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 8682 assert(I != M.SelectorRemap.end() 8683 && "Invalid index into selector index remap"); 8684 8685 return LocalID + I->second; 8686 } 8687 8688 DeclarationNameLoc 8689 ASTRecordReader::readDeclarationNameLoc(DeclarationName Name) { 8690 DeclarationNameLoc DNLoc; 8691 switch (Name.getNameKind()) { 8692 case DeclarationName::CXXConstructorName: 8693 case DeclarationName::CXXDestructorName: 8694 case DeclarationName::CXXConversionFunctionName: 8695 DNLoc.NamedType.TInfo = readTypeSourceInfo(); 8696 break; 8697 8698 case DeclarationName::CXXOperatorName: 8699 DNLoc.CXXOperatorName.BeginOpNameLoc 8700 = readSourceLocation().getRawEncoding(); 8701 DNLoc.CXXOperatorName.EndOpNameLoc 8702 = readSourceLocation().getRawEncoding(); 8703 break; 8704 8705 case DeclarationName::CXXLiteralOperatorName: 8706 DNLoc.CXXLiteralOperatorName.OpNameLoc 8707 = readSourceLocation().getRawEncoding(); 8708 break; 8709 8710 case DeclarationName::Identifier: 8711 case DeclarationName::ObjCZeroArgSelector: 8712 case DeclarationName::ObjCOneArgSelector: 8713 case DeclarationName::ObjCMultiArgSelector: 8714 case DeclarationName::CXXUsingDirective: 8715 case DeclarationName::CXXDeductionGuideName: 8716 break; 8717 } 8718 return DNLoc; 8719 } 8720 8721 DeclarationNameInfo ASTRecordReader::readDeclarationNameInfo() { 8722 DeclarationNameInfo NameInfo; 8723 NameInfo.setName(readDeclarationName()); 8724 NameInfo.setLoc(readSourceLocation()); 8725 NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName())); 8726 return NameInfo; 8727 } 8728 8729 void ASTRecordReader::readQualifierInfo(QualifierInfo &Info) { 8730 Info.QualifierLoc = readNestedNameSpecifierLoc(); 8731 unsigned NumTPLists = readInt(); 8732 Info.NumTemplParamLists = NumTPLists; 8733 if (NumTPLists) { 8734 Info.TemplParamLists = 8735 new (getContext()) TemplateParameterList *[NumTPLists]; 8736 for (unsigned i = 0; i != NumTPLists; ++i) 8737 Info.TemplParamLists[i] = readTemplateParameterList(); 8738 } 8739 } 8740 8741 TemplateParameterList * 8742 ASTRecordReader::readTemplateParameterList() { 8743 SourceLocation TemplateLoc = readSourceLocation(); 8744 SourceLocation LAngleLoc = readSourceLocation(); 8745 SourceLocation RAngleLoc = readSourceLocation(); 8746 8747 unsigned NumParams = readInt(); 8748 SmallVector<NamedDecl *, 16> Params; 8749 Params.reserve(NumParams); 8750 while (NumParams--) 8751 Params.push_back(readDeclAs<NamedDecl>()); 8752 8753 bool HasRequiresClause = readBool(); 8754 Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr; 8755 8756 TemplateParameterList *TemplateParams = TemplateParameterList::Create( 8757 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause); 8758 return TemplateParams; 8759 } 8760 8761 void ASTRecordReader::readTemplateArgumentList( 8762 SmallVectorImpl<TemplateArgument> &TemplArgs, 8763 bool Canonicalize) { 8764 unsigned NumTemplateArgs = readInt(); 8765 TemplArgs.reserve(NumTemplateArgs); 8766 while (NumTemplateArgs--) 8767 TemplArgs.push_back(readTemplateArgument(Canonicalize)); 8768 } 8769 8770 /// Read a UnresolvedSet structure. 8771 void ASTRecordReader::readUnresolvedSet(LazyASTUnresolvedSet &Set) { 8772 unsigned NumDecls = readInt(); 8773 Set.reserve(getContext(), NumDecls); 8774 while (NumDecls--) { 8775 DeclID ID = readDeclID(); 8776 AccessSpecifier AS = (AccessSpecifier) readInt(); 8777 Set.addLazyDecl(getContext(), ID, AS); 8778 } 8779 } 8780 8781 CXXBaseSpecifier 8782 ASTRecordReader::readCXXBaseSpecifier() { 8783 bool isVirtual = readBool(); 8784 bool isBaseOfClass = readBool(); 8785 AccessSpecifier AS = static_cast<AccessSpecifier>(readInt()); 8786 bool inheritConstructors = readBool(); 8787 TypeSourceInfo *TInfo = readTypeSourceInfo(); 8788 SourceRange Range = readSourceRange(); 8789 SourceLocation EllipsisLoc = readSourceLocation(); 8790 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 8791 EllipsisLoc); 8792 Result.setInheritConstructors(inheritConstructors); 8793 return Result; 8794 } 8795 8796 CXXCtorInitializer ** 8797 ASTRecordReader::readCXXCtorInitializers() { 8798 ASTContext &Context = getContext(); 8799 unsigned NumInitializers = readInt(); 8800 assert(NumInitializers && "wrote ctor initializers but have no inits"); 8801 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers]; 8802 for (unsigned i = 0; i != NumInitializers; ++i) { 8803 TypeSourceInfo *TInfo = nullptr; 8804 bool IsBaseVirtual = false; 8805 FieldDecl *Member = nullptr; 8806 IndirectFieldDecl *IndirectMember = nullptr; 8807 8808 CtorInitializerType Type = (CtorInitializerType) readInt(); 8809 switch (Type) { 8810 case CTOR_INITIALIZER_BASE: 8811 TInfo = readTypeSourceInfo(); 8812 IsBaseVirtual = readBool(); 8813 break; 8814 8815 case CTOR_INITIALIZER_DELEGATING: 8816 TInfo = readTypeSourceInfo(); 8817 break; 8818 8819 case CTOR_INITIALIZER_MEMBER: 8820 Member = readDeclAs<FieldDecl>(); 8821 break; 8822 8823 case CTOR_INITIALIZER_INDIRECT_MEMBER: 8824 IndirectMember = readDeclAs<IndirectFieldDecl>(); 8825 break; 8826 } 8827 8828 SourceLocation MemberOrEllipsisLoc = readSourceLocation(); 8829 Expr *Init = readExpr(); 8830 SourceLocation LParenLoc = readSourceLocation(); 8831 SourceLocation RParenLoc = readSourceLocation(); 8832 8833 CXXCtorInitializer *BOMInit; 8834 if (Type == CTOR_INITIALIZER_BASE) 8835 BOMInit = new (Context) 8836 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init, 8837 RParenLoc, MemberOrEllipsisLoc); 8838 else if (Type == CTOR_INITIALIZER_DELEGATING) 8839 BOMInit = new (Context) 8840 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc); 8841 else if (Member) 8842 BOMInit = new (Context) 8843 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc, 8844 Init, RParenLoc); 8845 else 8846 BOMInit = new (Context) 8847 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc, 8848 LParenLoc, Init, RParenLoc); 8849 8850 if (/*IsWritten*/readBool()) { 8851 unsigned SourceOrder = readInt(); 8852 BOMInit->setSourceOrder(SourceOrder); 8853 } 8854 8855 CtorInitializers[i] = BOMInit; 8856 } 8857 8858 return CtorInitializers; 8859 } 8860 8861 NestedNameSpecifierLoc 8862 ASTRecordReader::readNestedNameSpecifierLoc() { 8863 ASTContext &Context = getContext(); 8864 unsigned N = readInt(); 8865 NestedNameSpecifierLocBuilder Builder; 8866 for (unsigned I = 0; I != N; ++I) { 8867 auto Kind = readNestedNameSpecifierKind(); 8868 switch (Kind) { 8869 case NestedNameSpecifier::Identifier: { 8870 IdentifierInfo *II = readIdentifier(); 8871 SourceRange Range = readSourceRange(); 8872 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 8873 break; 8874 } 8875 8876 case NestedNameSpecifier::Namespace: { 8877 NamespaceDecl *NS = readDeclAs<NamespaceDecl>(); 8878 SourceRange Range = readSourceRange(); 8879 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 8880 break; 8881 } 8882 8883 case NestedNameSpecifier::NamespaceAlias: { 8884 NamespaceAliasDecl *Alias = readDeclAs<NamespaceAliasDecl>(); 8885 SourceRange Range = readSourceRange(); 8886 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 8887 break; 8888 } 8889 8890 case NestedNameSpecifier::TypeSpec: 8891 case NestedNameSpecifier::TypeSpecWithTemplate: { 8892 bool Template = readBool(); 8893 TypeSourceInfo *T = readTypeSourceInfo(); 8894 if (!T) 8895 return NestedNameSpecifierLoc(); 8896 SourceLocation ColonColonLoc = readSourceLocation(); 8897 8898 // FIXME: 'template' keyword location not saved anywhere, so we fake it. 8899 Builder.Extend(Context, 8900 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 8901 T->getTypeLoc(), ColonColonLoc); 8902 break; 8903 } 8904 8905 case NestedNameSpecifier::Global: { 8906 SourceLocation ColonColonLoc = readSourceLocation(); 8907 Builder.MakeGlobal(Context, ColonColonLoc); 8908 break; 8909 } 8910 8911 case NestedNameSpecifier::Super: { 8912 CXXRecordDecl *RD = readDeclAs<CXXRecordDecl>(); 8913 SourceRange Range = readSourceRange(); 8914 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd()); 8915 break; 8916 } 8917 } 8918 } 8919 8920 return Builder.getWithLocInContext(Context); 8921 } 8922 8923 SourceRange 8924 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 8925 unsigned &Idx) { 8926 SourceLocation beg = ReadSourceLocation(F, Record, Idx); 8927 SourceLocation end = ReadSourceLocation(F, Record, Idx); 8928 return SourceRange(beg, end); 8929 } 8930 8931 static FixedPointSemantics 8932 ReadFixedPointSemantics(const SmallVectorImpl<uint64_t> &Record, 8933 unsigned &Idx) { 8934 unsigned Width = Record[Idx++]; 8935 unsigned Scale = Record[Idx++]; 8936 uint64_t Tmp = Record[Idx++]; 8937 bool IsSigned = Tmp & 0x1; 8938 bool IsSaturated = Tmp & 0x2; 8939 bool HasUnsignedPadding = Tmp & 0x4; 8940 return FixedPointSemantics(Width, Scale, IsSigned, IsSaturated, 8941 HasUnsignedPadding); 8942 } 8943 8944 static const llvm::fltSemantics & 8945 readAPFloatSemantics(ASTRecordReader &reader) { 8946 return llvm::APFloatBase::EnumToSemantics( 8947 static_cast<llvm::APFloatBase::Semantics>(reader.readInt())); 8948 } 8949 8950 APValue ASTRecordReader::readAPValue() { 8951 unsigned Kind = readInt(); 8952 switch ((APValue::ValueKind) Kind) { 8953 case APValue::None: 8954 return APValue(); 8955 case APValue::Indeterminate: 8956 return APValue::IndeterminateValue(); 8957 case APValue::Int: 8958 return APValue(readAPSInt()); 8959 case APValue::Float: { 8960 const llvm::fltSemantics &FloatSema = readAPFloatSemantics(*this); 8961 return APValue(readAPFloat(FloatSema)); 8962 } 8963 case APValue::FixedPoint: { 8964 FixedPointSemantics FPSema = ReadFixedPointSemantics(Record, Idx); 8965 return APValue(APFixedPoint(readAPInt(), FPSema)); 8966 } 8967 case APValue::ComplexInt: { 8968 llvm::APSInt First = readAPSInt(); 8969 return APValue(std::move(First), readAPSInt()); 8970 } 8971 case APValue::ComplexFloat: { 8972 const llvm::fltSemantics &FloatSema1 = readAPFloatSemantics(*this); 8973 llvm::APFloat First = readAPFloat(FloatSema1); 8974 const llvm::fltSemantics &FloatSema2 = readAPFloatSemantics(*this); 8975 return APValue(std::move(First), readAPFloat(FloatSema2)); 8976 } 8977 case APValue::LValue: 8978 case APValue::Vector: 8979 case APValue::Array: 8980 case APValue::Struct: 8981 case APValue::Union: 8982 case APValue::MemberPointer: 8983 case APValue::AddrLabelDiff: 8984 // TODO : Handle all these APValue::ValueKind. 8985 return APValue(); 8986 } 8987 llvm_unreachable("Invalid APValue::ValueKind"); 8988 } 8989 8990 /// Read a floating-point value 8991 llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) { 8992 return llvm::APFloat(Sem, readAPInt()); 8993 } 8994 8995 // Read a string 8996 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 8997 unsigned Len = Record[Idx++]; 8998 std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 8999 Idx += Len; 9000 return Result; 9001 } 9002 9003 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record, 9004 unsigned &Idx) { 9005 std::string Filename = ReadString(Record, Idx); 9006 ResolveImportedPath(F, Filename); 9007 return Filename; 9008 } 9009 9010 std::string ASTReader::ReadPath(StringRef BaseDirectory, 9011 const RecordData &Record, unsigned &Idx) { 9012 std::string Filename = ReadString(Record, Idx); 9013 if (!BaseDirectory.empty()) 9014 ResolveImportedPath(Filename, BaseDirectory); 9015 return Filename; 9016 } 9017 9018 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 9019 unsigned &Idx) { 9020 unsigned Major = Record[Idx++]; 9021 unsigned Minor = Record[Idx++]; 9022 unsigned Subminor = Record[Idx++]; 9023 if (Minor == 0) 9024 return VersionTuple(Major); 9025 if (Subminor == 0) 9026 return VersionTuple(Major, Minor - 1); 9027 return VersionTuple(Major, Minor - 1, Subminor - 1); 9028 } 9029 9030 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 9031 const RecordData &Record, 9032 unsigned &Idx) { 9033 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 9034 return CXXTemporary::Create(getContext(), Decl); 9035 } 9036 9037 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const { 9038 return Diag(CurrentImportLoc, DiagID); 9039 } 9040 9041 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const { 9042 return Diags.Report(Loc, DiagID); 9043 } 9044 9045 /// Retrieve the identifier table associated with the 9046 /// preprocessor. 9047 IdentifierTable &ASTReader::getIdentifierTable() { 9048 return PP.getIdentifierTable(); 9049 } 9050 9051 /// Record that the given ID maps to the given switch-case 9052 /// statement. 9053 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 9054 assert((*CurrSwitchCaseStmts)[ID] == nullptr && 9055 "Already have a SwitchCase with this ID"); 9056 (*CurrSwitchCaseStmts)[ID] = SC; 9057 } 9058 9059 /// Retrieve the switch-case statement with the given ID. 9060 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 9061 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID"); 9062 return (*CurrSwitchCaseStmts)[ID]; 9063 } 9064 9065 void ASTReader::ClearSwitchCaseIDs() { 9066 CurrSwitchCaseStmts->clear(); 9067 } 9068 9069 void ASTReader::ReadComments() { 9070 ASTContext &Context = getContext(); 9071 std::vector<RawComment *> Comments; 9072 for (SmallVectorImpl<std::pair<BitstreamCursor, 9073 serialization::ModuleFile *>>::iterator 9074 I = CommentsCursors.begin(), 9075 E = CommentsCursors.end(); 9076 I != E; ++I) { 9077 Comments.clear(); 9078 BitstreamCursor &Cursor = I->first; 9079 serialization::ModuleFile &F = *I->second; 9080 SavedStreamPosition SavedPosition(Cursor); 9081 9082 RecordData Record; 9083 while (true) { 9084 Expected<llvm::BitstreamEntry> MaybeEntry = 9085 Cursor.advanceSkippingSubblocks( 9086 BitstreamCursor::AF_DontPopBlockAtEnd); 9087 if (!MaybeEntry) { 9088 Error(MaybeEntry.takeError()); 9089 return; 9090 } 9091 llvm::BitstreamEntry Entry = MaybeEntry.get(); 9092 9093 switch (Entry.Kind) { 9094 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 9095 case llvm::BitstreamEntry::Error: 9096 Error("malformed block record in AST file"); 9097 return; 9098 case llvm::BitstreamEntry::EndBlock: 9099 goto NextCursor; 9100 case llvm::BitstreamEntry::Record: 9101 // The interesting case. 9102 break; 9103 } 9104 9105 // Read a record. 9106 Record.clear(); 9107 Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record); 9108 if (!MaybeComment) { 9109 Error(MaybeComment.takeError()); 9110 return; 9111 } 9112 switch ((CommentRecordTypes)MaybeComment.get()) { 9113 case COMMENTS_RAW_COMMENT: { 9114 unsigned Idx = 0; 9115 SourceRange SR = ReadSourceRange(F, Record, Idx); 9116 RawComment::CommentKind Kind = 9117 (RawComment::CommentKind) Record[Idx++]; 9118 bool IsTrailingComment = Record[Idx++]; 9119 bool IsAlmostTrailingComment = Record[Idx++]; 9120 Comments.push_back(new (Context) RawComment( 9121 SR, Kind, IsTrailingComment, IsAlmostTrailingComment)); 9122 break; 9123 } 9124 } 9125 } 9126 NextCursor: 9127 llvm::DenseMap<FileID, std::map<unsigned, RawComment *>> 9128 FileToOffsetToComment; 9129 for (RawComment *C : Comments) { 9130 SourceLocation CommentLoc = C->getBeginLoc(); 9131 if (CommentLoc.isValid()) { 9132 std::pair<FileID, unsigned> Loc = 9133 SourceMgr.getDecomposedLoc(CommentLoc); 9134 if (Loc.first.isValid()) 9135 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C); 9136 } 9137 } 9138 } 9139 } 9140 9141 void ASTReader::visitInputFiles(serialization::ModuleFile &MF, 9142 bool IncludeSystem, bool Complain, 9143 llvm::function_ref<void(const serialization::InputFile &IF, 9144 bool isSystem)> Visitor) { 9145 unsigned NumUserInputs = MF.NumUserInputFiles; 9146 unsigned NumInputs = MF.InputFilesLoaded.size(); 9147 assert(NumUserInputs <= NumInputs); 9148 unsigned N = IncludeSystem ? NumInputs : NumUserInputs; 9149 for (unsigned I = 0; I < N; ++I) { 9150 bool IsSystem = I >= NumUserInputs; 9151 InputFile IF = getInputFile(MF, I+1, Complain); 9152 Visitor(IF, IsSystem); 9153 } 9154 } 9155 9156 void ASTReader::visitTopLevelModuleMaps( 9157 serialization::ModuleFile &MF, 9158 llvm::function_ref<void(const FileEntry *FE)> Visitor) { 9159 unsigned NumInputs = MF.InputFilesLoaded.size(); 9160 for (unsigned I = 0; I < NumInputs; ++I) { 9161 InputFileInfo IFI = readInputFileInfo(MF, I + 1); 9162 if (IFI.TopLevelModuleMap) 9163 // FIXME: This unnecessarily re-reads the InputFileInfo. 9164 if (auto *FE = getInputFile(MF, I + 1).getFile()) 9165 Visitor(FE); 9166 } 9167 } 9168 9169 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) { 9170 // If we know the owning module, use it. 9171 if (Module *M = D->getImportedOwningModule()) 9172 return M->getFullModuleName(); 9173 9174 // Otherwise, use the name of the top-level module the decl is within. 9175 if (ModuleFile *M = getOwningModuleFile(D)) 9176 return M->ModuleName; 9177 9178 // Not from a module. 9179 return {}; 9180 } 9181 9182 void ASTReader::finishPendingActions() { 9183 while (!PendingIdentifierInfos.empty() || !PendingFunctionTypes.empty() || 9184 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() || 9185 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || 9186 !PendingUpdateRecords.empty()) { 9187 // If any identifiers with corresponding top-level declarations have 9188 // been loaded, load those declarations now. 9189 using TopLevelDeclsMap = 9190 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>; 9191 TopLevelDeclsMap TopLevelDecls; 9192 9193 while (!PendingIdentifierInfos.empty()) { 9194 IdentifierInfo *II = PendingIdentifierInfos.back().first; 9195 SmallVector<uint32_t, 4> DeclIDs = 9196 std::move(PendingIdentifierInfos.back().second); 9197 PendingIdentifierInfos.pop_back(); 9198 9199 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 9200 } 9201 9202 // Load each function type that we deferred loading because it was a 9203 // deduced type that might refer to a local type declared within itself. 9204 for (unsigned I = 0; I != PendingFunctionTypes.size(); ++I) { 9205 auto *FD = PendingFunctionTypes[I].first; 9206 FD->setType(GetType(PendingFunctionTypes[I].second)); 9207 9208 // If we gave a function a deduced return type, remember that we need to 9209 // propagate that along the redeclaration chain. 9210 auto *DT = FD->getReturnType()->getContainedDeducedType(); 9211 if (DT && DT->isDeduced()) 9212 PendingDeducedTypeUpdates.insert( 9213 {FD->getCanonicalDecl(), FD->getReturnType()}); 9214 } 9215 PendingFunctionTypes.clear(); 9216 9217 // For each decl chain that we wanted to complete while deserializing, mark 9218 // it as "still needs to be completed". 9219 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) { 9220 markIncompleteDeclChain(PendingIncompleteDeclChains[I]); 9221 } 9222 PendingIncompleteDeclChains.clear(); 9223 9224 // Load pending declaration chains. 9225 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) 9226 loadPendingDeclChain(PendingDeclChains[I].first, 9227 PendingDeclChains[I].second); 9228 PendingDeclChains.clear(); 9229 9230 // Make the most recent of the top-level declarations visible. 9231 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 9232 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 9233 IdentifierInfo *II = TLD->first; 9234 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 9235 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 9236 } 9237 } 9238 9239 // Load any pending macro definitions. 9240 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 9241 IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 9242 SmallVector<PendingMacroInfo, 2> GlobalIDs; 9243 GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 9244 // Initialize the macro history from chained-PCHs ahead of module imports. 9245 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9246 ++IDIdx) { 9247 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9248 if (!Info.M->isModule()) 9249 resolvePendingMacro(II, Info); 9250 } 9251 // Handle module imports. 9252 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9253 ++IDIdx) { 9254 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9255 if (Info.M->isModule()) 9256 resolvePendingMacro(II, Info); 9257 } 9258 } 9259 PendingMacroIDs.clear(); 9260 9261 // Wire up the DeclContexts for Decls that we delayed setting until 9262 // recursive loading is completed. 9263 while (!PendingDeclContextInfos.empty()) { 9264 PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 9265 PendingDeclContextInfos.pop_front(); 9266 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 9267 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 9268 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 9269 } 9270 9271 // Perform any pending declaration updates. 9272 while (!PendingUpdateRecords.empty()) { 9273 auto Update = PendingUpdateRecords.pop_back_val(); 9274 ReadingKindTracker ReadingKind(Read_Decl, *this); 9275 loadDeclUpdateRecords(Update); 9276 } 9277 } 9278 9279 // At this point, all update records for loaded decls are in place, so any 9280 // fake class definitions should have become real. 9281 assert(PendingFakeDefinitionData.empty() && 9282 "faked up a class definition but never saw the real one"); 9283 9284 // If we deserialized any C++ or Objective-C class definitions, any 9285 // Objective-C protocol definitions, or any redeclarable templates, make sure 9286 // that all redeclarations point to the definitions. Note that this can only 9287 // happen now, after the redeclaration chains have been fully wired. 9288 for (Decl *D : PendingDefinitions) { 9289 if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 9290 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) { 9291 // Make sure that the TagType points at the definition. 9292 const_cast<TagType*>(TagT)->decl = TD; 9293 } 9294 9295 if (auto RD = dyn_cast<CXXRecordDecl>(D)) { 9296 for (auto *R = getMostRecentExistingDecl(RD); R; 9297 R = R->getPreviousDecl()) { 9298 assert((R == D) == 9299 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && 9300 "declaration thinks it's the definition but it isn't"); 9301 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData; 9302 } 9303 } 9304 9305 continue; 9306 } 9307 9308 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) { 9309 // Make sure that the ObjCInterfaceType points at the definition. 9310 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 9311 ->Decl = ID; 9312 9313 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl()) 9314 cast<ObjCInterfaceDecl>(R)->Data = ID->Data; 9315 9316 continue; 9317 } 9318 9319 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) { 9320 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl()) 9321 cast<ObjCProtocolDecl>(R)->Data = PD->Data; 9322 9323 continue; 9324 } 9325 9326 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl(); 9327 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl()) 9328 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common; 9329 } 9330 PendingDefinitions.clear(); 9331 9332 // Load the bodies of any functions or methods we've encountered. We do 9333 // this now (delayed) so that we can be sure that the declaration chains 9334 // have been fully wired up (hasBody relies on this). 9335 // FIXME: We shouldn't require complete redeclaration chains here. 9336 for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 9337 PBEnd = PendingBodies.end(); 9338 PB != PBEnd; ++PB) { 9339 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 9340 // For a function defined inline within a class template, force the 9341 // canonical definition to be the one inside the canonical definition of 9342 // the template. This ensures that we instantiate from a correct view 9343 // of the template. 9344 // 9345 // Sadly we can't do this more generally: we can't be sure that all 9346 // copies of an arbitrary class definition will have the same members 9347 // defined (eg, some member functions may not be instantiated, and some 9348 // special members may or may not have been implicitly defined). 9349 if (auto *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalParent())) 9350 if (RD->isDependentContext() && !RD->isThisDeclarationADefinition()) 9351 continue; 9352 9353 // FIXME: Check for =delete/=default? 9354 // FIXME: Complain about ODR violations here? 9355 const FunctionDecl *Defn = nullptr; 9356 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) { 9357 FD->setLazyBody(PB->second); 9358 } else { 9359 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn); 9360 mergeDefinitionVisibility(NonConstDefn, FD); 9361 9362 if (!FD->isLateTemplateParsed() && 9363 !NonConstDefn->isLateTemplateParsed() && 9364 FD->getODRHash() != NonConstDefn->getODRHash()) { 9365 if (!isa<CXXMethodDecl>(FD)) { 9366 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9367 } else if (FD->getLexicalParent()->isFileContext() && 9368 NonConstDefn->getLexicalParent()->isFileContext()) { 9369 // Only diagnose out-of-line method definitions. If they are 9370 // in class definitions, then an error will be generated when 9371 // processing the class bodies. 9372 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9373 } 9374 } 9375 } 9376 continue; 9377 } 9378 9379 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 9380 if (!getContext().getLangOpts().Modules || !MD->hasBody()) 9381 MD->setLazyBody(PB->second); 9382 } 9383 PendingBodies.clear(); 9384 9385 // Do some cleanup. 9386 for (auto *ND : PendingMergedDefinitionsToDeduplicate) 9387 getContext().deduplicateMergedDefinitonsFor(ND); 9388 PendingMergedDefinitionsToDeduplicate.clear(); 9389 } 9390 9391 void ASTReader::diagnoseOdrViolations() { 9392 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() && 9393 PendingFunctionOdrMergeFailures.empty() && 9394 PendingEnumOdrMergeFailures.empty()) 9395 return; 9396 9397 // Trigger the import of the full definition of each class that had any 9398 // odr-merging problems, so we can produce better diagnostics for them. 9399 // These updates may in turn find and diagnose some ODR failures, so take 9400 // ownership of the set first. 9401 auto OdrMergeFailures = std::move(PendingOdrMergeFailures); 9402 PendingOdrMergeFailures.clear(); 9403 for (auto &Merge : OdrMergeFailures) { 9404 Merge.first->buildLookup(); 9405 Merge.first->decls_begin(); 9406 Merge.first->bases_begin(); 9407 Merge.first->vbases_begin(); 9408 for (auto &RecordPair : Merge.second) { 9409 auto *RD = RecordPair.first; 9410 RD->decls_begin(); 9411 RD->bases_begin(); 9412 RD->vbases_begin(); 9413 } 9414 } 9415 9416 // Trigger the import of functions. 9417 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures); 9418 PendingFunctionOdrMergeFailures.clear(); 9419 for (auto &Merge : FunctionOdrMergeFailures) { 9420 Merge.first->buildLookup(); 9421 Merge.first->decls_begin(); 9422 Merge.first->getBody(); 9423 for (auto &FD : Merge.second) { 9424 FD->buildLookup(); 9425 FD->decls_begin(); 9426 FD->getBody(); 9427 } 9428 } 9429 9430 // Trigger the import of enums. 9431 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures); 9432 PendingEnumOdrMergeFailures.clear(); 9433 for (auto &Merge : EnumOdrMergeFailures) { 9434 Merge.first->decls_begin(); 9435 for (auto &Enum : Merge.second) { 9436 Enum->decls_begin(); 9437 } 9438 } 9439 9440 // For each declaration from a merged context, check that the canonical 9441 // definition of that context also contains a declaration of the same 9442 // entity. 9443 // 9444 // Caution: this loop does things that might invalidate iterators into 9445 // PendingOdrMergeChecks. Don't turn this into a range-based for loop! 9446 while (!PendingOdrMergeChecks.empty()) { 9447 NamedDecl *D = PendingOdrMergeChecks.pop_back_val(); 9448 9449 // FIXME: Skip over implicit declarations for now. This matters for things 9450 // like implicitly-declared special member functions. This isn't entirely 9451 // correct; we can end up with multiple unmerged declarations of the same 9452 // implicit entity. 9453 if (D->isImplicit()) 9454 continue; 9455 9456 DeclContext *CanonDef = D->getDeclContext(); 9457 9458 bool Found = false; 9459 const Decl *DCanon = D->getCanonicalDecl(); 9460 9461 for (auto RI : D->redecls()) { 9462 if (RI->getLexicalDeclContext() == CanonDef) { 9463 Found = true; 9464 break; 9465 } 9466 } 9467 if (Found) 9468 continue; 9469 9470 // Quick check failed, time to do the slow thing. Note, we can't just 9471 // look up the name of D in CanonDef here, because the member that is 9472 // in CanonDef might not be found by name lookup (it might have been 9473 // replaced by a more recent declaration in the lookup table), and we 9474 // can't necessarily find it in the redeclaration chain because it might 9475 // be merely mergeable, not redeclarable. 9476 llvm::SmallVector<const NamedDecl*, 4> Candidates; 9477 for (auto *CanonMember : CanonDef->decls()) { 9478 if (CanonMember->getCanonicalDecl() == DCanon) { 9479 // This can happen if the declaration is merely mergeable and not 9480 // actually redeclarable (we looked for redeclarations earlier). 9481 // 9482 // FIXME: We should be able to detect this more efficiently, without 9483 // pulling in all of the members of CanonDef. 9484 Found = true; 9485 break; 9486 } 9487 if (auto *ND = dyn_cast<NamedDecl>(CanonMember)) 9488 if (ND->getDeclName() == D->getDeclName()) 9489 Candidates.push_back(ND); 9490 } 9491 9492 if (!Found) { 9493 // The AST doesn't like TagDecls becoming invalid after they've been 9494 // completed. We only really need to mark FieldDecls as invalid here. 9495 if (!isa<TagDecl>(D)) 9496 D->setInvalidDecl(); 9497 9498 // Ensure we don't accidentally recursively enter deserialization while 9499 // we're producing our diagnostic. 9500 Deserializing RecursionGuard(this); 9501 9502 std::string CanonDefModule = 9503 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef)); 9504 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl) 9505 << D << getOwningModuleNameForDiagnostic(D) 9506 << CanonDef << CanonDefModule.empty() << CanonDefModule; 9507 9508 if (Candidates.empty()) 9509 Diag(cast<Decl>(CanonDef)->getLocation(), 9510 diag::note_module_odr_violation_no_possible_decls) << D; 9511 else { 9512 for (unsigned I = 0, N = Candidates.size(); I != N; ++I) 9513 Diag(Candidates[I]->getLocation(), 9514 diag::note_module_odr_violation_possible_decl) 9515 << Candidates[I]; 9516 } 9517 9518 DiagnosedOdrMergeFailures.insert(CanonDef); 9519 } 9520 } 9521 9522 if (OdrMergeFailures.empty() && FunctionOdrMergeFailures.empty() && 9523 EnumOdrMergeFailures.empty()) 9524 return; 9525 9526 // Ensure we don't accidentally recursively enter deserialization while 9527 // we're producing our diagnostics. 9528 Deserializing RecursionGuard(this); 9529 9530 // Common code for hashing helpers. 9531 ODRHash Hash; 9532 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) { 9533 Hash.clear(); 9534 Hash.AddQualType(Ty); 9535 return Hash.CalculateHash(); 9536 }; 9537 9538 auto ComputeODRHash = [&Hash](const Stmt *S) { 9539 assert(S); 9540 Hash.clear(); 9541 Hash.AddStmt(S); 9542 return Hash.CalculateHash(); 9543 }; 9544 9545 auto ComputeSubDeclODRHash = [&Hash](const Decl *D) { 9546 assert(D); 9547 Hash.clear(); 9548 Hash.AddSubDecl(D); 9549 return Hash.CalculateHash(); 9550 }; 9551 9552 auto ComputeTemplateArgumentODRHash = [&Hash](const TemplateArgument &TA) { 9553 Hash.clear(); 9554 Hash.AddTemplateArgument(TA); 9555 return Hash.CalculateHash(); 9556 }; 9557 9558 auto ComputeTemplateParameterListODRHash = 9559 [&Hash](const TemplateParameterList *TPL) { 9560 assert(TPL); 9561 Hash.clear(); 9562 Hash.AddTemplateParameterList(TPL); 9563 return Hash.CalculateHash(); 9564 }; 9565 9566 // Used with err_module_odr_violation_mismatch_decl and 9567 // note_module_odr_violation_mismatch_decl 9568 // This list should be the same Decl's as in ODRHash::isWhiteListedDecl 9569 enum ODRMismatchDecl { 9570 EndOfClass, 9571 PublicSpecifer, 9572 PrivateSpecifer, 9573 ProtectedSpecifer, 9574 StaticAssert, 9575 Field, 9576 CXXMethod, 9577 TypeAlias, 9578 TypeDef, 9579 Var, 9580 Friend, 9581 FunctionTemplate, 9582 Other 9583 }; 9584 9585 // Used with err_module_odr_violation_mismatch_decl_diff and 9586 // note_module_odr_violation_mismatch_decl_diff 9587 enum ODRMismatchDeclDifference { 9588 StaticAssertCondition, 9589 StaticAssertMessage, 9590 StaticAssertOnlyMessage, 9591 FieldName, 9592 FieldTypeName, 9593 FieldSingleBitField, 9594 FieldDifferentWidthBitField, 9595 FieldSingleMutable, 9596 FieldSingleInitializer, 9597 FieldDifferentInitializers, 9598 MethodName, 9599 MethodDeleted, 9600 MethodDefaulted, 9601 MethodVirtual, 9602 MethodStatic, 9603 MethodVolatile, 9604 MethodConst, 9605 MethodInline, 9606 MethodNumberParameters, 9607 MethodParameterType, 9608 MethodParameterName, 9609 MethodParameterSingleDefaultArgument, 9610 MethodParameterDifferentDefaultArgument, 9611 MethodNoTemplateArguments, 9612 MethodDifferentNumberTemplateArguments, 9613 MethodDifferentTemplateArgument, 9614 MethodSingleBody, 9615 MethodDifferentBody, 9616 TypedefName, 9617 TypedefType, 9618 VarName, 9619 VarType, 9620 VarSingleInitializer, 9621 VarDifferentInitializer, 9622 VarConstexpr, 9623 FriendTypeFunction, 9624 FriendType, 9625 FriendFunction, 9626 FunctionTemplateDifferentNumberParameters, 9627 FunctionTemplateParameterDifferentKind, 9628 FunctionTemplateParameterName, 9629 FunctionTemplateParameterSingleDefaultArgument, 9630 FunctionTemplateParameterDifferentDefaultArgument, 9631 FunctionTemplateParameterDifferentType, 9632 FunctionTemplatePackParameter, 9633 }; 9634 9635 // These lambdas have the common portions of the ODR diagnostics. This 9636 // has the same return as Diag(), so addition parameters can be passed 9637 // in with operator<< 9638 auto ODRDiagDeclError = [this](NamedDecl *FirstRecord, StringRef FirstModule, 9639 SourceLocation Loc, SourceRange Range, 9640 ODRMismatchDeclDifference DiffType) { 9641 return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff) 9642 << FirstRecord << FirstModule.empty() << FirstModule << Range 9643 << DiffType; 9644 }; 9645 auto ODRDiagDeclNote = [this](StringRef SecondModule, SourceLocation Loc, 9646 SourceRange Range, ODRMismatchDeclDifference DiffType) { 9647 return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff) 9648 << SecondModule << Range << DiffType; 9649 }; 9650 9651 auto ODRDiagField = [this, &ODRDiagDeclError, &ODRDiagDeclNote, 9652 &ComputeQualTypeODRHash, &ComputeODRHash]( 9653 NamedDecl *FirstRecord, StringRef FirstModule, 9654 StringRef SecondModule, FieldDecl *FirstField, 9655 FieldDecl *SecondField) { 9656 IdentifierInfo *FirstII = FirstField->getIdentifier(); 9657 IdentifierInfo *SecondII = SecondField->getIdentifier(); 9658 if (FirstII->getName() != SecondII->getName()) { 9659 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9660 FirstField->getSourceRange(), FieldName) 9661 << FirstII; 9662 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9663 SecondField->getSourceRange(), FieldName) 9664 << SecondII; 9665 9666 return true; 9667 } 9668 9669 assert(getContext().hasSameType(FirstField->getType(), 9670 SecondField->getType())); 9671 9672 QualType FirstType = FirstField->getType(); 9673 QualType SecondType = SecondField->getType(); 9674 if (ComputeQualTypeODRHash(FirstType) != 9675 ComputeQualTypeODRHash(SecondType)) { 9676 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9677 FirstField->getSourceRange(), FieldTypeName) 9678 << FirstII << FirstType; 9679 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9680 SecondField->getSourceRange(), FieldTypeName) 9681 << SecondII << SecondType; 9682 9683 return true; 9684 } 9685 9686 const bool IsFirstBitField = FirstField->isBitField(); 9687 const bool IsSecondBitField = SecondField->isBitField(); 9688 if (IsFirstBitField != IsSecondBitField) { 9689 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9690 FirstField->getSourceRange(), FieldSingleBitField) 9691 << FirstII << IsFirstBitField; 9692 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9693 SecondField->getSourceRange(), FieldSingleBitField) 9694 << SecondII << IsSecondBitField; 9695 return true; 9696 } 9697 9698 if (IsFirstBitField && IsSecondBitField) { 9699 unsigned FirstBitWidthHash = 9700 ComputeODRHash(FirstField->getBitWidth()); 9701 unsigned SecondBitWidthHash = 9702 ComputeODRHash(SecondField->getBitWidth()); 9703 if (FirstBitWidthHash != SecondBitWidthHash) { 9704 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9705 FirstField->getSourceRange(), 9706 FieldDifferentWidthBitField) 9707 << FirstII << FirstField->getBitWidth()->getSourceRange(); 9708 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9709 SecondField->getSourceRange(), 9710 FieldDifferentWidthBitField) 9711 << SecondII << SecondField->getBitWidth()->getSourceRange(); 9712 return true; 9713 } 9714 } 9715 9716 if (!PP.getLangOpts().CPlusPlus) 9717 return false; 9718 9719 const bool IsFirstMutable = FirstField->isMutable(); 9720 const bool IsSecondMutable = SecondField->isMutable(); 9721 if (IsFirstMutable != IsSecondMutable) { 9722 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9723 FirstField->getSourceRange(), FieldSingleMutable) 9724 << FirstII << IsFirstMutable; 9725 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9726 SecondField->getSourceRange(), FieldSingleMutable) 9727 << SecondII << IsSecondMutable; 9728 return true; 9729 } 9730 9731 const Expr *FirstInitializer = FirstField->getInClassInitializer(); 9732 const Expr *SecondInitializer = SecondField->getInClassInitializer(); 9733 if ((!FirstInitializer && SecondInitializer) || 9734 (FirstInitializer && !SecondInitializer)) { 9735 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9736 FirstField->getSourceRange(), FieldSingleInitializer) 9737 << FirstII << (FirstInitializer != nullptr); 9738 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9739 SecondField->getSourceRange(), FieldSingleInitializer) 9740 << SecondII << (SecondInitializer != nullptr); 9741 return true; 9742 } 9743 9744 if (FirstInitializer && SecondInitializer) { 9745 unsigned FirstInitHash = ComputeODRHash(FirstInitializer); 9746 unsigned SecondInitHash = ComputeODRHash(SecondInitializer); 9747 if (FirstInitHash != SecondInitHash) { 9748 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9749 FirstField->getSourceRange(), 9750 FieldDifferentInitializers) 9751 << FirstII << FirstInitializer->getSourceRange(); 9752 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9753 SecondField->getSourceRange(), 9754 FieldDifferentInitializers) 9755 << SecondII << SecondInitializer->getSourceRange(); 9756 return true; 9757 } 9758 } 9759 9760 return false; 9761 }; 9762 9763 auto ODRDiagTypeDefOrAlias = 9764 [&ODRDiagDeclError, &ODRDiagDeclNote, &ComputeQualTypeODRHash]( 9765 NamedDecl *FirstRecord, StringRef FirstModule, StringRef SecondModule, 9766 TypedefNameDecl *FirstTD, TypedefNameDecl *SecondTD, 9767 bool IsTypeAlias) { 9768 auto FirstName = FirstTD->getDeclName(); 9769 auto SecondName = SecondTD->getDeclName(); 9770 if (FirstName != SecondName) { 9771 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), 9772 FirstTD->getSourceRange(), TypedefName) 9773 << IsTypeAlias << FirstName; 9774 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), 9775 SecondTD->getSourceRange(), TypedefName) 9776 << IsTypeAlias << SecondName; 9777 return true; 9778 } 9779 9780 QualType FirstType = FirstTD->getUnderlyingType(); 9781 QualType SecondType = SecondTD->getUnderlyingType(); 9782 if (ComputeQualTypeODRHash(FirstType) != 9783 ComputeQualTypeODRHash(SecondType)) { 9784 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), 9785 FirstTD->getSourceRange(), TypedefType) 9786 << IsTypeAlias << FirstName << FirstType; 9787 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), 9788 SecondTD->getSourceRange(), TypedefType) 9789 << IsTypeAlias << SecondName << SecondType; 9790 return true; 9791 } 9792 9793 return false; 9794 }; 9795 9796 auto ODRDiagVar = [&ODRDiagDeclError, &ODRDiagDeclNote, 9797 &ComputeQualTypeODRHash, &ComputeODRHash, 9798 this](NamedDecl *FirstRecord, StringRef FirstModule, 9799 StringRef SecondModule, VarDecl *FirstVD, 9800 VarDecl *SecondVD) { 9801 auto FirstName = FirstVD->getDeclName(); 9802 auto SecondName = SecondVD->getDeclName(); 9803 if (FirstName != SecondName) { 9804 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9805 FirstVD->getSourceRange(), VarName) 9806 << FirstName; 9807 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9808 SecondVD->getSourceRange(), VarName) 9809 << SecondName; 9810 return true; 9811 } 9812 9813 QualType FirstType = FirstVD->getType(); 9814 QualType SecondType = SecondVD->getType(); 9815 if (ComputeQualTypeODRHash(FirstType) != 9816 ComputeQualTypeODRHash(SecondType)) { 9817 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9818 FirstVD->getSourceRange(), VarType) 9819 << FirstName << FirstType; 9820 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9821 SecondVD->getSourceRange(), VarType) 9822 << SecondName << SecondType; 9823 return true; 9824 } 9825 9826 if (!PP.getLangOpts().CPlusPlus) 9827 return false; 9828 9829 const Expr *FirstInit = FirstVD->getInit(); 9830 const Expr *SecondInit = SecondVD->getInit(); 9831 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 9832 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9833 FirstVD->getSourceRange(), VarSingleInitializer) 9834 << FirstName << (FirstInit == nullptr) 9835 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 9836 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9837 SecondVD->getSourceRange(), VarSingleInitializer) 9838 << SecondName << (SecondInit == nullptr) 9839 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 9840 return true; 9841 } 9842 9843 if (FirstInit && SecondInit && 9844 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 9845 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9846 FirstVD->getSourceRange(), VarDifferentInitializer) 9847 << FirstName << FirstInit->getSourceRange(); 9848 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9849 SecondVD->getSourceRange(), VarDifferentInitializer) 9850 << SecondName << SecondInit->getSourceRange(); 9851 return true; 9852 } 9853 9854 const bool FirstIsConstexpr = FirstVD->isConstexpr(); 9855 const bool SecondIsConstexpr = SecondVD->isConstexpr(); 9856 if (FirstIsConstexpr != SecondIsConstexpr) { 9857 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9858 FirstVD->getSourceRange(), VarConstexpr) 9859 << FirstName << FirstIsConstexpr; 9860 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9861 SecondVD->getSourceRange(), VarConstexpr) 9862 << SecondName << SecondIsConstexpr; 9863 return true; 9864 } 9865 return false; 9866 }; 9867 9868 auto DifferenceSelector = [](Decl *D) { 9869 assert(D && "valid Decl required"); 9870 switch (D->getKind()) { 9871 default: 9872 return Other; 9873 case Decl::AccessSpec: 9874 switch (D->getAccess()) { 9875 case AS_public: 9876 return PublicSpecifer; 9877 case AS_private: 9878 return PrivateSpecifer; 9879 case AS_protected: 9880 return ProtectedSpecifer; 9881 case AS_none: 9882 break; 9883 } 9884 llvm_unreachable("Invalid access specifier"); 9885 case Decl::StaticAssert: 9886 return StaticAssert; 9887 case Decl::Field: 9888 return Field; 9889 case Decl::CXXMethod: 9890 case Decl::CXXConstructor: 9891 case Decl::CXXDestructor: 9892 return CXXMethod; 9893 case Decl::TypeAlias: 9894 return TypeAlias; 9895 case Decl::Typedef: 9896 return TypeDef; 9897 case Decl::Var: 9898 return Var; 9899 case Decl::Friend: 9900 return Friend; 9901 case Decl::FunctionTemplate: 9902 return FunctionTemplate; 9903 } 9904 }; 9905 9906 using DeclHashes = llvm::SmallVector<std::pair<Decl *, unsigned>, 4>; 9907 auto PopulateHashes = [&ComputeSubDeclODRHash](DeclHashes &Hashes, 9908 RecordDecl *Record, 9909 const DeclContext *DC) { 9910 for (auto *D : Record->decls()) { 9911 if (!ODRHash::isWhitelistedDecl(D, DC)) 9912 continue; 9913 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 9914 } 9915 }; 9916 9917 struct DiffResult { 9918 Decl *FirstDecl = nullptr, *SecondDecl = nullptr; 9919 ODRMismatchDecl FirstDiffType = Other, SecondDiffType = Other; 9920 }; 9921 9922 // If there is a diagnoseable difference, FirstDiffType and 9923 // SecondDiffType will not be Other and FirstDecl and SecondDecl will be 9924 // filled in if not EndOfClass. 9925 auto FindTypeDiffs = [&DifferenceSelector](DeclHashes &FirstHashes, 9926 DeclHashes &SecondHashes) { 9927 DiffResult DR; 9928 auto FirstIt = FirstHashes.begin(); 9929 auto SecondIt = SecondHashes.begin(); 9930 while (FirstIt != FirstHashes.end() || SecondIt != SecondHashes.end()) { 9931 if (FirstIt != FirstHashes.end() && SecondIt != SecondHashes.end() && 9932 FirstIt->second == SecondIt->second) { 9933 ++FirstIt; 9934 ++SecondIt; 9935 continue; 9936 } 9937 9938 DR.FirstDecl = FirstIt == FirstHashes.end() ? nullptr : FirstIt->first; 9939 DR.SecondDecl = 9940 SecondIt == SecondHashes.end() ? nullptr : SecondIt->first; 9941 9942 DR.FirstDiffType = 9943 DR.FirstDecl ? DifferenceSelector(DR.FirstDecl) : EndOfClass; 9944 DR.SecondDiffType = 9945 DR.SecondDecl ? DifferenceSelector(DR.SecondDecl) : EndOfClass; 9946 return DR; 9947 } 9948 return DR; 9949 }; 9950 9951 // Use this to diagnose that an unexpected Decl was encountered 9952 // or no difference was detected. This causes a generic error 9953 // message to be emitted. 9954 auto DiagnoseODRUnexpected = [this](DiffResult &DR, NamedDecl *FirstRecord, 9955 StringRef FirstModule, 9956 NamedDecl *SecondRecord, 9957 StringRef SecondModule) { 9958 Diag(FirstRecord->getLocation(), 9959 diag::err_module_odr_violation_different_definitions) 9960 << FirstRecord << FirstModule.empty() << FirstModule; 9961 9962 if (DR.FirstDecl) { 9963 Diag(DR.FirstDecl->getLocation(), diag::note_first_module_difference) 9964 << FirstRecord << DR.FirstDecl->getSourceRange(); 9965 } 9966 9967 Diag(SecondRecord->getLocation(), 9968 diag::note_module_odr_violation_different_definitions) 9969 << SecondModule; 9970 9971 if (DR.SecondDecl) { 9972 Diag(DR.SecondDecl->getLocation(), diag::note_second_module_difference) 9973 << DR.SecondDecl->getSourceRange(); 9974 } 9975 }; 9976 9977 auto DiagnoseODRMismatch = 9978 [this](DiffResult &DR, NamedDecl *FirstRecord, StringRef FirstModule, 9979 NamedDecl *SecondRecord, StringRef SecondModule) { 9980 SourceLocation FirstLoc; 9981 SourceRange FirstRange; 9982 auto *FirstTag = dyn_cast<TagDecl>(FirstRecord); 9983 if (DR.FirstDiffType == EndOfClass && FirstTag) { 9984 FirstLoc = FirstTag->getBraceRange().getEnd(); 9985 } else { 9986 FirstLoc = DR.FirstDecl->getLocation(); 9987 FirstRange = DR.FirstDecl->getSourceRange(); 9988 } 9989 Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl) 9990 << FirstRecord << FirstModule.empty() << FirstModule << FirstRange 9991 << DR.FirstDiffType; 9992 9993 SourceLocation SecondLoc; 9994 SourceRange SecondRange; 9995 auto *SecondTag = dyn_cast<TagDecl>(SecondRecord); 9996 if (DR.SecondDiffType == EndOfClass && SecondTag) { 9997 SecondLoc = SecondTag->getBraceRange().getEnd(); 9998 } else { 9999 SecondLoc = DR.SecondDecl->getLocation(); 10000 SecondRange = DR.SecondDecl->getSourceRange(); 10001 } 10002 Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl) 10003 << SecondModule << SecondRange << DR.SecondDiffType; 10004 }; 10005 10006 // Issue any pending ODR-failure diagnostics. 10007 for (auto &Merge : OdrMergeFailures) { 10008 // If we've already pointed out a specific problem with this class, don't 10009 // bother issuing a general "something's different" diagnostic. 10010 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 10011 continue; 10012 10013 bool Diagnosed = false; 10014 CXXRecordDecl *FirstRecord = Merge.first; 10015 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstRecord); 10016 for (auto &RecordPair : Merge.second) { 10017 CXXRecordDecl *SecondRecord = RecordPair.first; 10018 // Multiple different declarations got merged together; tell the user 10019 // where they came from. 10020 if (FirstRecord == SecondRecord) 10021 continue; 10022 10023 std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord); 10024 10025 auto *FirstDD = FirstRecord->DefinitionData; 10026 auto *SecondDD = RecordPair.second; 10027 10028 assert(FirstDD && SecondDD && "Definitions without DefinitionData"); 10029 10030 // Diagnostics from DefinitionData are emitted here. 10031 if (FirstDD != SecondDD) { 10032 enum ODRDefinitionDataDifference { 10033 NumBases, 10034 NumVBases, 10035 BaseType, 10036 BaseVirtual, 10037 BaseAccess, 10038 }; 10039 auto ODRDiagBaseError = [FirstRecord, &FirstModule, 10040 this](SourceLocation Loc, SourceRange Range, 10041 ODRDefinitionDataDifference DiffType) { 10042 return Diag(Loc, diag::err_module_odr_violation_definition_data) 10043 << FirstRecord << FirstModule.empty() << FirstModule << Range 10044 << DiffType; 10045 }; 10046 auto ODRDiagBaseNote = [&SecondModule, 10047 this](SourceLocation Loc, SourceRange Range, 10048 ODRDefinitionDataDifference DiffType) { 10049 return Diag(Loc, diag::note_module_odr_violation_definition_data) 10050 << SecondModule << Range << DiffType; 10051 }; 10052 10053 unsigned FirstNumBases = FirstDD->NumBases; 10054 unsigned FirstNumVBases = FirstDD->NumVBases; 10055 unsigned SecondNumBases = SecondDD->NumBases; 10056 unsigned SecondNumVBases = SecondDD->NumVBases; 10057 10058 auto GetSourceRange = [](struct CXXRecordDecl::DefinitionData *DD) { 10059 unsigned NumBases = DD->NumBases; 10060 if (NumBases == 0) return SourceRange(); 10061 auto bases = DD->bases(); 10062 return SourceRange(bases[0].getBeginLoc(), 10063 bases[NumBases - 1].getEndLoc()); 10064 }; 10065 10066 if (FirstNumBases != SecondNumBases) { 10067 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 10068 NumBases) 10069 << FirstNumBases; 10070 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 10071 NumBases) 10072 << SecondNumBases; 10073 Diagnosed = true; 10074 break; 10075 } 10076 10077 if (FirstNumVBases != SecondNumVBases) { 10078 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 10079 NumVBases) 10080 << FirstNumVBases; 10081 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 10082 NumVBases) 10083 << SecondNumVBases; 10084 Diagnosed = true; 10085 break; 10086 } 10087 10088 auto FirstBases = FirstDD->bases(); 10089 auto SecondBases = SecondDD->bases(); 10090 unsigned i = 0; 10091 for (i = 0; i < FirstNumBases; ++i) { 10092 auto FirstBase = FirstBases[i]; 10093 auto SecondBase = SecondBases[i]; 10094 if (ComputeQualTypeODRHash(FirstBase.getType()) != 10095 ComputeQualTypeODRHash(SecondBase.getType())) { 10096 ODRDiagBaseError(FirstRecord->getLocation(), 10097 FirstBase.getSourceRange(), BaseType) 10098 << (i + 1) << FirstBase.getType(); 10099 ODRDiagBaseNote(SecondRecord->getLocation(), 10100 SecondBase.getSourceRange(), BaseType) 10101 << (i + 1) << SecondBase.getType(); 10102 break; 10103 } 10104 10105 if (FirstBase.isVirtual() != SecondBase.isVirtual()) { 10106 ODRDiagBaseError(FirstRecord->getLocation(), 10107 FirstBase.getSourceRange(), BaseVirtual) 10108 << (i + 1) << FirstBase.isVirtual() << FirstBase.getType(); 10109 ODRDiagBaseNote(SecondRecord->getLocation(), 10110 SecondBase.getSourceRange(), BaseVirtual) 10111 << (i + 1) << SecondBase.isVirtual() << SecondBase.getType(); 10112 break; 10113 } 10114 10115 if (FirstBase.getAccessSpecifierAsWritten() != 10116 SecondBase.getAccessSpecifierAsWritten()) { 10117 ODRDiagBaseError(FirstRecord->getLocation(), 10118 FirstBase.getSourceRange(), BaseAccess) 10119 << (i + 1) << FirstBase.getType() 10120 << (int)FirstBase.getAccessSpecifierAsWritten(); 10121 ODRDiagBaseNote(SecondRecord->getLocation(), 10122 SecondBase.getSourceRange(), BaseAccess) 10123 << (i + 1) << SecondBase.getType() 10124 << (int)SecondBase.getAccessSpecifierAsWritten(); 10125 break; 10126 } 10127 } 10128 10129 if (i != FirstNumBases) { 10130 Diagnosed = true; 10131 break; 10132 } 10133 } 10134 10135 const ClassTemplateDecl *FirstTemplate = 10136 FirstRecord->getDescribedClassTemplate(); 10137 const ClassTemplateDecl *SecondTemplate = 10138 SecondRecord->getDescribedClassTemplate(); 10139 10140 assert(!FirstTemplate == !SecondTemplate && 10141 "Both pointers should be null or non-null"); 10142 10143 enum ODRTemplateDifference { 10144 ParamEmptyName, 10145 ParamName, 10146 ParamSingleDefaultArgument, 10147 ParamDifferentDefaultArgument, 10148 }; 10149 10150 if (FirstTemplate && SecondTemplate) { 10151 DeclHashes FirstTemplateHashes; 10152 DeclHashes SecondTemplateHashes; 10153 10154 auto PopulateTemplateParameterHashs = 10155 [&ComputeSubDeclODRHash](DeclHashes &Hashes, 10156 const ClassTemplateDecl *TD) { 10157 for (auto *D : TD->getTemplateParameters()->asArray()) { 10158 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 10159 } 10160 }; 10161 10162 PopulateTemplateParameterHashs(FirstTemplateHashes, FirstTemplate); 10163 PopulateTemplateParameterHashs(SecondTemplateHashes, SecondTemplate); 10164 10165 assert(FirstTemplateHashes.size() == SecondTemplateHashes.size() && 10166 "Number of template parameters should be equal."); 10167 10168 auto FirstIt = FirstTemplateHashes.begin(); 10169 auto FirstEnd = FirstTemplateHashes.end(); 10170 auto SecondIt = SecondTemplateHashes.begin(); 10171 for (; FirstIt != FirstEnd; ++FirstIt, ++SecondIt) { 10172 if (FirstIt->second == SecondIt->second) 10173 continue; 10174 10175 auto ODRDiagTemplateError = [FirstRecord, &FirstModule, this]( 10176 SourceLocation Loc, SourceRange Range, 10177 ODRTemplateDifference DiffType) { 10178 return Diag(Loc, diag::err_module_odr_violation_template_parameter) 10179 << FirstRecord << FirstModule.empty() << FirstModule << Range 10180 << DiffType; 10181 }; 10182 auto ODRDiagTemplateNote = [&SecondModule, this]( 10183 SourceLocation Loc, SourceRange Range, 10184 ODRTemplateDifference DiffType) { 10185 return Diag(Loc, diag::note_module_odr_violation_template_parameter) 10186 << SecondModule << Range << DiffType; 10187 }; 10188 10189 const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first); 10190 const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first); 10191 10192 assert(FirstDecl->getKind() == SecondDecl->getKind() && 10193 "Parameter Decl's should be the same kind."); 10194 10195 DeclarationName FirstName = FirstDecl->getDeclName(); 10196 DeclarationName SecondName = SecondDecl->getDeclName(); 10197 10198 if (FirstName != SecondName) { 10199 const bool FirstNameEmpty = 10200 FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo(); 10201 const bool SecondNameEmpty = 10202 SecondName.isIdentifier() && !SecondName.getAsIdentifierInfo(); 10203 assert((!FirstNameEmpty || !SecondNameEmpty) && 10204 "Both template parameters cannot be unnamed."); 10205 ODRDiagTemplateError(FirstDecl->getLocation(), 10206 FirstDecl->getSourceRange(), 10207 FirstNameEmpty ? ParamEmptyName : ParamName) 10208 << FirstName; 10209 ODRDiagTemplateNote(SecondDecl->getLocation(), 10210 SecondDecl->getSourceRange(), 10211 SecondNameEmpty ? ParamEmptyName : ParamName) 10212 << SecondName; 10213 break; 10214 } 10215 10216 switch (FirstDecl->getKind()) { 10217 default: 10218 llvm_unreachable("Invalid template parameter type."); 10219 case Decl::TemplateTypeParm: { 10220 const auto *FirstParam = cast<TemplateTypeParmDecl>(FirstDecl); 10221 const auto *SecondParam = cast<TemplateTypeParmDecl>(SecondDecl); 10222 const bool HasFirstDefaultArgument = 10223 FirstParam->hasDefaultArgument() && 10224 !FirstParam->defaultArgumentWasInherited(); 10225 const bool HasSecondDefaultArgument = 10226 SecondParam->hasDefaultArgument() && 10227 !SecondParam->defaultArgumentWasInherited(); 10228 10229 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10230 ODRDiagTemplateError(FirstDecl->getLocation(), 10231 FirstDecl->getSourceRange(), 10232 ParamSingleDefaultArgument) 10233 << HasFirstDefaultArgument; 10234 ODRDiagTemplateNote(SecondDecl->getLocation(), 10235 SecondDecl->getSourceRange(), 10236 ParamSingleDefaultArgument) 10237 << HasSecondDefaultArgument; 10238 break; 10239 } 10240 10241 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10242 "Expecting default arguments."); 10243 10244 ODRDiagTemplateError(FirstDecl->getLocation(), 10245 FirstDecl->getSourceRange(), 10246 ParamDifferentDefaultArgument); 10247 ODRDiagTemplateNote(SecondDecl->getLocation(), 10248 SecondDecl->getSourceRange(), 10249 ParamDifferentDefaultArgument); 10250 10251 break; 10252 } 10253 case Decl::NonTypeTemplateParm: { 10254 const auto *FirstParam = cast<NonTypeTemplateParmDecl>(FirstDecl); 10255 const auto *SecondParam = cast<NonTypeTemplateParmDecl>(SecondDecl); 10256 const bool HasFirstDefaultArgument = 10257 FirstParam->hasDefaultArgument() && 10258 !FirstParam->defaultArgumentWasInherited(); 10259 const bool HasSecondDefaultArgument = 10260 SecondParam->hasDefaultArgument() && 10261 !SecondParam->defaultArgumentWasInherited(); 10262 10263 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10264 ODRDiagTemplateError(FirstDecl->getLocation(), 10265 FirstDecl->getSourceRange(), 10266 ParamSingleDefaultArgument) 10267 << HasFirstDefaultArgument; 10268 ODRDiagTemplateNote(SecondDecl->getLocation(), 10269 SecondDecl->getSourceRange(), 10270 ParamSingleDefaultArgument) 10271 << HasSecondDefaultArgument; 10272 break; 10273 } 10274 10275 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10276 "Expecting default arguments."); 10277 10278 ODRDiagTemplateError(FirstDecl->getLocation(), 10279 FirstDecl->getSourceRange(), 10280 ParamDifferentDefaultArgument); 10281 ODRDiagTemplateNote(SecondDecl->getLocation(), 10282 SecondDecl->getSourceRange(), 10283 ParamDifferentDefaultArgument); 10284 10285 break; 10286 } 10287 case Decl::TemplateTemplateParm: { 10288 const auto *FirstParam = cast<TemplateTemplateParmDecl>(FirstDecl); 10289 const auto *SecondParam = 10290 cast<TemplateTemplateParmDecl>(SecondDecl); 10291 const bool HasFirstDefaultArgument = 10292 FirstParam->hasDefaultArgument() && 10293 !FirstParam->defaultArgumentWasInherited(); 10294 const bool HasSecondDefaultArgument = 10295 SecondParam->hasDefaultArgument() && 10296 !SecondParam->defaultArgumentWasInherited(); 10297 10298 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10299 ODRDiagTemplateError(FirstDecl->getLocation(), 10300 FirstDecl->getSourceRange(), 10301 ParamSingleDefaultArgument) 10302 << HasFirstDefaultArgument; 10303 ODRDiagTemplateNote(SecondDecl->getLocation(), 10304 SecondDecl->getSourceRange(), 10305 ParamSingleDefaultArgument) 10306 << HasSecondDefaultArgument; 10307 break; 10308 } 10309 10310 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10311 "Expecting default arguments."); 10312 10313 ODRDiagTemplateError(FirstDecl->getLocation(), 10314 FirstDecl->getSourceRange(), 10315 ParamDifferentDefaultArgument); 10316 ODRDiagTemplateNote(SecondDecl->getLocation(), 10317 SecondDecl->getSourceRange(), 10318 ParamDifferentDefaultArgument); 10319 10320 break; 10321 } 10322 } 10323 10324 break; 10325 } 10326 10327 if (FirstIt != FirstEnd) { 10328 Diagnosed = true; 10329 break; 10330 } 10331 } 10332 10333 DeclHashes FirstHashes; 10334 DeclHashes SecondHashes; 10335 const DeclContext *DC = FirstRecord; 10336 PopulateHashes(FirstHashes, FirstRecord, DC); 10337 PopulateHashes(SecondHashes, SecondRecord, DC); 10338 10339 auto DR = FindTypeDiffs(FirstHashes, SecondHashes); 10340 ODRMismatchDecl FirstDiffType = DR.FirstDiffType; 10341 ODRMismatchDecl SecondDiffType = DR.SecondDiffType; 10342 Decl *FirstDecl = DR.FirstDecl; 10343 Decl *SecondDecl = DR.SecondDecl; 10344 10345 if (FirstDiffType == Other || SecondDiffType == Other) { 10346 DiagnoseODRUnexpected(DR, FirstRecord, FirstModule, SecondRecord, 10347 SecondModule); 10348 Diagnosed = true; 10349 break; 10350 } 10351 10352 if (FirstDiffType != SecondDiffType) { 10353 DiagnoseODRMismatch(DR, FirstRecord, FirstModule, SecondRecord, 10354 SecondModule); 10355 Diagnosed = true; 10356 break; 10357 } 10358 10359 assert(FirstDiffType == SecondDiffType); 10360 10361 switch (FirstDiffType) { 10362 case Other: 10363 case EndOfClass: 10364 case PublicSpecifer: 10365 case PrivateSpecifer: 10366 case ProtectedSpecifer: 10367 llvm_unreachable("Invalid diff type"); 10368 10369 case StaticAssert: { 10370 StaticAssertDecl *FirstSA = cast<StaticAssertDecl>(FirstDecl); 10371 StaticAssertDecl *SecondSA = cast<StaticAssertDecl>(SecondDecl); 10372 10373 Expr *FirstExpr = FirstSA->getAssertExpr(); 10374 Expr *SecondExpr = SecondSA->getAssertExpr(); 10375 unsigned FirstODRHash = ComputeODRHash(FirstExpr); 10376 unsigned SecondODRHash = ComputeODRHash(SecondExpr); 10377 if (FirstODRHash != SecondODRHash) { 10378 ODRDiagDeclError(FirstRecord, FirstModule, FirstExpr->getBeginLoc(), 10379 FirstExpr->getSourceRange(), StaticAssertCondition); 10380 ODRDiagDeclNote(SecondModule, SecondExpr->getBeginLoc(), 10381 SecondExpr->getSourceRange(), StaticAssertCondition); 10382 Diagnosed = true; 10383 break; 10384 } 10385 10386 StringLiteral *FirstStr = FirstSA->getMessage(); 10387 StringLiteral *SecondStr = SecondSA->getMessage(); 10388 assert((FirstStr || SecondStr) && "Both messages cannot be empty"); 10389 if ((FirstStr && !SecondStr) || (!FirstStr && SecondStr)) { 10390 SourceLocation FirstLoc, SecondLoc; 10391 SourceRange FirstRange, SecondRange; 10392 if (FirstStr) { 10393 FirstLoc = FirstStr->getBeginLoc(); 10394 FirstRange = FirstStr->getSourceRange(); 10395 } else { 10396 FirstLoc = FirstSA->getBeginLoc(); 10397 FirstRange = FirstSA->getSourceRange(); 10398 } 10399 if (SecondStr) { 10400 SecondLoc = SecondStr->getBeginLoc(); 10401 SecondRange = SecondStr->getSourceRange(); 10402 } else { 10403 SecondLoc = SecondSA->getBeginLoc(); 10404 SecondRange = SecondSA->getSourceRange(); 10405 } 10406 ODRDiagDeclError(FirstRecord, FirstModule, FirstLoc, FirstRange, 10407 StaticAssertOnlyMessage) 10408 << (FirstStr == nullptr); 10409 ODRDiagDeclNote(SecondModule, SecondLoc, SecondRange, 10410 StaticAssertOnlyMessage) 10411 << (SecondStr == nullptr); 10412 Diagnosed = true; 10413 break; 10414 } 10415 10416 if (FirstStr && SecondStr && 10417 FirstStr->getString() != SecondStr->getString()) { 10418 ODRDiagDeclError(FirstRecord, FirstModule, FirstStr->getBeginLoc(), 10419 FirstStr->getSourceRange(), StaticAssertMessage); 10420 ODRDiagDeclNote(SecondModule, SecondStr->getBeginLoc(), 10421 SecondStr->getSourceRange(), StaticAssertMessage); 10422 Diagnosed = true; 10423 break; 10424 } 10425 break; 10426 } 10427 case Field: { 10428 Diagnosed = ODRDiagField(FirstRecord, FirstModule, SecondModule, 10429 cast<FieldDecl>(FirstDecl), 10430 cast<FieldDecl>(SecondDecl)); 10431 break; 10432 } 10433 case CXXMethod: { 10434 enum { 10435 DiagMethod, 10436 DiagConstructor, 10437 DiagDestructor, 10438 } FirstMethodType, 10439 SecondMethodType; 10440 auto GetMethodTypeForDiagnostics = [](const CXXMethodDecl* D) { 10441 if (isa<CXXConstructorDecl>(D)) return DiagConstructor; 10442 if (isa<CXXDestructorDecl>(D)) return DiagDestructor; 10443 return DiagMethod; 10444 }; 10445 const CXXMethodDecl *FirstMethod = cast<CXXMethodDecl>(FirstDecl); 10446 const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl); 10447 FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod); 10448 SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod); 10449 auto FirstName = FirstMethod->getDeclName(); 10450 auto SecondName = SecondMethod->getDeclName(); 10451 if (FirstMethodType != SecondMethodType || FirstName != SecondName) { 10452 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10453 FirstMethod->getSourceRange(), MethodName) 10454 << FirstMethodType << FirstName; 10455 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10456 SecondMethod->getSourceRange(), MethodName) 10457 << SecondMethodType << SecondName; 10458 10459 Diagnosed = true; 10460 break; 10461 } 10462 10463 const bool FirstDeleted = FirstMethod->isDeletedAsWritten(); 10464 const bool SecondDeleted = SecondMethod->isDeletedAsWritten(); 10465 if (FirstDeleted != SecondDeleted) { 10466 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10467 FirstMethod->getSourceRange(), MethodDeleted) 10468 << FirstMethodType << FirstName << FirstDeleted; 10469 10470 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10471 SecondMethod->getSourceRange(), MethodDeleted) 10472 << SecondMethodType << SecondName << SecondDeleted; 10473 Diagnosed = true; 10474 break; 10475 } 10476 10477 const bool FirstDefaulted = FirstMethod->isExplicitlyDefaulted(); 10478 const bool SecondDefaulted = SecondMethod->isExplicitlyDefaulted(); 10479 if (FirstDefaulted != SecondDefaulted) { 10480 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10481 FirstMethod->getSourceRange(), MethodDefaulted) 10482 << FirstMethodType << FirstName << FirstDefaulted; 10483 10484 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10485 SecondMethod->getSourceRange(), MethodDefaulted) 10486 << SecondMethodType << SecondName << SecondDefaulted; 10487 Diagnosed = true; 10488 break; 10489 } 10490 10491 const bool FirstVirtual = FirstMethod->isVirtualAsWritten(); 10492 const bool SecondVirtual = SecondMethod->isVirtualAsWritten(); 10493 const bool FirstPure = FirstMethod->isPure(); 10494 const bool SecondPure = SecondMethod->isPure(); 10495 if ((FirstVirtual || SecondVirtual) && 10496 (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) { 10497 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10498 FirstMethod->getSourceRange(), MethodVirtual) 10499 << FirstMethodType << FirstName << FirstPure << FirstVirtual; 10500 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10501 SecondMethod->getSourceRange(), MethodVirtual) 10502 << SecondMethodType << SecondName << SecondPure << SecondVirtual; 10503 Diagnosed = true; 10504 break; 10505 } 10506 10507 // CXXMethodDecl::isStatic uses the canonical Decl. With Decl merging, 10508 // FirstDecl is the canonical Decl of SecondDecl, so the storage 10509 // class needs to be checked instead. 10510 const auto FirstStorage = FirstMethod->getStorageClass(); 10511 const auto SecondStorage = SecondMethod->getStorageClass(); 10512 const bool FirstStatic = FirstStorage == SC_Static; 10513 const bool SecondStatic = SecondStorage == SC_Static; 10514 if (FirstStatic != SecondStatic) { 10515 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10516 FirstMethod->getSourceRange(), MethodStatic) 10517 << FirstMethodType << FirstName << FirstStatic; 10518 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10519 SecondMethod->getSourceRange(), MethodStatic) 10520 << SecondMethodType << SecondName << SecondStatic; 10521 Diagnosed = true; 10522 break; 10523 } 10524 10525 const bool FirstVolatile = FirstMethod->isVolatile(); 10526 const bool SecondVolatile = SecondMethod->isVolatile(); 10527 if (FirstVolatile != SecondVolatile) { 10528 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10529 FirstMethod->getSourceRange(), MethodVolatile) 10530 << FirstMethodType << FirstName << FirstVolatile; 10531 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10532 SecondMethod->getSourceRange(), MethodVolatile) 10533 << SecondMethodType << SecondName << SecondVolatile; 10534 Diagnosed = true; 10535 break; 10536 } 10537 10538 const bool FirstConst = FirstMethod->isConst(); 10539 const bool SecondConst = SecondMethod->isConst(); 10540 if (FirstConst != SecondConst) { 10541 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10542 FirstMethod->getSourceRange(), MethodConst) 10543 << FirstMethodType << FirstName << FirstConst; 10544 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10545 SecondMethod->getSourceRange(), MethodConst) 10546 << SecondMethodType << SecondName << SecondConst; 10547 Diagnosed = true; 10548 break; 10549 } 10550 10551 const bool FirstInline = FirstMethod->isInlineSpecified(); 10552 const bool SecondInline = SecondMethod->isInlineSpecified(); 10553 if (FirstInline != SecondInline) { 10554 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10555 FirstMethod->getSourceRange(), MethodInline) 10556 << FirstMethodType << FirstName << FirstInline; 10557 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10558 SecondMethod->getSourceRange(), MethodInline) 10559 << SecondMethodType << SecondName << SecondInline; 10560 Diagnosed = true; 10561 break; 10562 } 10563 10564 const unsigned FirstNumParameters = FirstMethod->param_size(); 10565 const unsigned SecondNumParameters = SecondMethod->param_size(); 10566 if (FirstNumParameters != SecondNumParameters) { 10567 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10568 FirstMethod->getSourceRange(), 10569 MethodNumberParameters) 10570 << FirstMethodType << FirstName << FirstNumParameters; 10571 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10572 SecondMethod->getSourceRange(), 10573 MethodNumberParameters) 10574 << SecondMethodType << SecondName << SecondNumParameters; 10575 Diagnosed = true; 10576 break; 10577 } 10578 10579 // Need this status boolean to know when break out of the switch. 10580 bool ParameterMismatch = false; 10581 for (unsigned I = 0; I < FirstNumParameters; ++I) { 10582 const ParmVarDecl *FirstParam = FirstMethod->getParamDecl(I); 10583 const ParmVarDecl *SecondParam = SecondMethod->getParamDecl(I); 10584 10585 QualType FirstParamType = FirstParam->getType(); 10586 QualType SecondParamType = SecondParam->getType(); 10587 if (FirstParamType != SecondParamType && 10588 ComputeQualTypeODRHash(FirstParamType) != 10589 ComputeQualTypeODRHash(SecondParamType)) { 10590 if (const DecayedType *ParamDecayedType = 10591 FirstParamType->getAs<DecayedType>()) { 10592 ODRDiagDeclError( 10593 FirstRecord, FirstModule, FirstMethod->getLocation(), 10594 FirstMethod->getSourceRange(), MethodParameterType) 10595 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10596 << true << ParamDecayedType->getOriginalType(); 10597 } else { 10598 ODRDiagDeclError( 10599 FirstRecord, FirstModule, FirstMethod->getLocation(), 10600 FirstMethod->getSourceRange(), MethodParameterType) 10601 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10602 << false; 10603 } 10604 10605 if (const DecayedType *ParamDecayedType = 10606 SecondParamType->getAs<DecayedType>()) { 10607 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10608 SecondMethod->getSourceRange(), 10609 MethodParameterType) 10610 << SecondMethodType << SecondName << (I + 1) 10611 << SecondParamType << true 10612 << ParamDecayedType->getOriginalType(); 10613 } else { 10614 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10615 SecondMethod->getSourceRange(), 10616 MethodParameterType) 10617 << SecondMethodType << SecondName << (I + 1) 10618 << SecondParamType << false; 10619 } 10620 ParameterMismatch = true; 10621 break; 10622 } 10623 10624 DeclarationName FirstParamName = FirstParam->getDeclName(); 10625 DeclarationName SecondParamName = SecondParam->getDeclName(); 10626 if (FirstParamName != SecondParamName) { 10627 ODRDiagDeclError(FirstRecord, FirstModule, 10628 FirstMethod->getLocation(), 10629 FirstMethod->getSourceRange(), MethodParameterName) 10630 << FirstMethodType << FirstName << (I + 1) << FirstParamName; 10631 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10632 SecondMethod->getSourceRange(), MethodParameterName) 10633 << SecondMethodType << SecondName << (I + 1) << SecondParamName; 10634 ParameterMismatch = true; 10635 break; 10636 } 10637 10638 const Expr *FirstInit = FirstParam->getInit(); 10639 const Expr *SecondInit = SecondParam->getInit(); 10640 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 10641 ODRDiagDeclError(FirstRecord, FirstModule, 10642 FirstMethod->getLocation(), 10643 FirstMethod->getSourceRange(), 10644 MethodParameterSingleDefaultArgument) 10645 << FirstMethodType << FirstName << (I + 1) 10646 << (FirstInit == nullptr) 10647 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 10648 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10649 SecondMethod->getSourceRange(), 10650 MethodParameterSingleDefaultArgument) 10651 << SecondMethodType << SecondName << (I + 1) 10652 << (SecondInit == nullptr) 10653 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 10654 ParameterMismatch = true; 10655 break; 10656 } 10657 10658 if (FirstInit && SecondInit && 10659 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 10660 ODRDiagDeclError(FirstRecord, FirstModule, 10661 FirstMethod->getLocation(), 10662 FirstMethod->getSourceRange(), 10663 MethodParameterDifferentDefaultArgument) 10664 << FirstMethodType << FirstName << (I + 1) 10665 << FirstInit->getSourceRange(); 10666 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10667 SecondMethod->getSourceRange(), 10668 MethodParameterDifferentDefaultArgument) 10669 << SecondMethodType << SecondName << (I + 1) 10670 << SecondInit->getSourceRange(); 10671 ParameterMismatch = true; 10672 break; 10673 10674 } 10675 } 10676 10677 if (ParameterMismatch) { 10678 Diagnosed = true; 10679 break; 10680 } 10681 10682 const auto *FirstTemplateArgs = 10683 FirstMethod->getTemplateSpecializationArgs(); 10684 const auto *SecondTemplateArgs = 10685 SecondMethod->getTemplateSpecializationArgs(); 10686 10687 if ((FirstTemplateArgs && !SecondTemplateArgs) || 10688 (!FirstTemplateArgs && SecondTemplateArgs)) { 10689 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10690 FirstMethod->getSourceRange(), 10691 MethodNoTemplateArguments) 10692 << FirstMethodType << FirstName << (FirstTemplateArgs != nullptr); 10693 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10694 SecondMethod->getSourceRange(), 10695 MethodNoTemplateArguments) 10696 << SecondMethodType << SecondName 10697 << (SecondTemplateArgs != nullptr); 10698 10699 Diagnosed = true; 10700 break; 10701 } 10702 10703 if (FirstTemplateArgs && SecondTemplateArgs) { 10704 // Remove pack expansions from argument list. 10705 auto ExpandTemplateArgumentList = 10706 [](const TemplateArgumentList *TAL) { 10707 llvm::SmallVector<const TemplateArgument *, 8> ExpandedList; 10708 for (const TemplateArgument &TA : TAL->asArray()) { 10709 if (TA.getKind() != TemplateArgument::Pack) { 10710 ExpandedList.push_back(&TA); 10711 continue; 10712 } 10713 for (const TemplateArgument &PackTA : TA.getPackAsArray()) { 10714 ExpandedList.push_back(&PackTA); 10715 } 10716 } 10717 return ExpandedList; 10718 }; 10719 llvm::SmallVector<const TemplateArgument *, 8> FirstExpandedList = 10720 ExpandTemplateArgumentList(FirstTemplateArgs); 10721 llvm::SmallVector<const TemplateArgument *, 8> SecondExpandedList = 10722 ExpandTemplateArgumentList(SecondTemplateArgs); 10723 10724 if (FirstExpandedList.size() != SecondExpandedList.size()) { 10725 ODRDiagDeclError(FirstRecord, FirstModule, 10726 FirstMethod->getLocation(), 10727 FirstMethod->getSourceRange(), 10728 MethodDifferentNumberTemplateArguments) 10729 << FirstMethodType << FirstName 10730 << (unsigned)FirstExpandedList.size(); 10731 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10732 SecondMethod->getSourceRange(), 10733 MethodDifferentNumberTemplateArguments) 10734 << SecondMethodType << SecondName 10735 << (unsigned)SecondExpandedList.size(); 10736 10737 Diagnosed = true; 10738 break; 10739 } 10740 10741 bool TemplateArgumentMismatch = false; 10742 for (unsigned i = 0, e = FirstExpandedList.size(); i != e; ++i) { 10743 const TemplateArgument &FirstTA = *FirstExpandedList[i], 10744 &SecondTA = *SecondExpandedList[i]; 10745 if (ComputeTemplateArgumentODRHash(FirstTA) == 10746 ComputeTemplateArgumentODRHash(SecondTA)) { 10747 continue; 10748 } 10749 10750 ODRDiagDeclError( 10751 FirstRecord, FirstModule, FirstMethod->getLocation(), 10752 FirstMethod->getSourceRange(), MethodDifferentTemplateArgument) 10753 << FirstMethodType << FirstName << FirstTA << i + 1; 10754 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10755 SecondMethod->getSourceRange(), 10756 MethodDifferentTemplateArgument) 10757 << SecondMethodType << SecondName << SecondTA << i + 1; 10758 10759 TemplateArgumentMismatch = true; 10760 break; 10761 } 10762 10763 if (TemplateArgumentMismatch) { 10764 Diagnosed = true; 10765 break; 10766 } 10767 } 10768 10769 // Compute the hash of the method as if it has no body. 10770 auto ComputeCXXMethodODRHash = [&Hash](const CXXMethodDecl *D) { 10771 Hash.clear(); 10772 Hash.AddFunctionDecl(D, true /*SkipBody*/); 10773 return Hash.CalculateHash(); 10774 }; 10775 10776 // Compare the hash generated to the hash stored. A difference means 10777 // that a body was present in the original source. Due to merging, 10778 // the stardard way of detecting a body will not work. 10779 const bool HasFirstBody = 10780 ComputeCXXMethodODRHash(FirstMethod) != FirstMethod->getODRHash(); 10781 const bool HasSecondBody = 10782 ComputeCXXMethodODRHash(SecondMethod) != SecondMethod->getODRHash(); 10783 10784 if (HasFirstBody != HasSecondBody) { 10785 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10786 FirstMethod->getSourceRange(), MethodSingleBody) 10787 << FirstMethodType << FirstName << HasFirstBody; 10788 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10789 SecondMethod->getSourceRange(), MethodSingleBody) 10790 << SecondMethodType << SecondName << HasSecondBody; 10791 Diagnosed = true; 10792 break; 10793 } 10794 10795 if (HasFirstBody && HasSecondBody) { 10796 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10797 FirstMethod->getSourceRange(), MethodDifferentBody) 10798 << FirstMethodType << FirstName; 10799 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10800 SecondMethod->getSourceRange(), MethodDifferentBody) 10801 << SecondMethodType << SecondName; 10802 Diagnosed = true; 10803 break; 10804 } 10805 10806 break; 10807 } 10808 case TypeAlias: 10809 case TypeDef: { 10810 Diagnosed = ODRDiagTypeDefOrAlias( 10811 FirstRecord, FirstModule, SecondModule, 10812 cast<TypedefNameDecl>(FirstDecl), cast<TypedefNameDecl>(SecondDecl), 10813 FirstDiffType == TypeAlias); 10814 break; 10815 } 10816 case Var: { 10817 Diagnosed = 10818 ODRDiagVar(FirstRecord, FirstModule, SecondModule, 10819 cast<VarDecl>(FirstDecl), cast<VarDecl>(SecondDecl)); 10820 break; 10821 } 10822 case Friend: { 10823 FriendDecl *FirstFriend = cast<FriendDecl>(FirstDecl); 10824 FriendDecl *SecondFriend = cast<FriendDecl>(SecondDecl); 10825 10826 NamedDecl *FirstND = FirstFriend->getFriendDecl(); 10827 NamedDecl *SecondND = SecondFriend->getFriendDecl(); 10828 10829 TypeSourceInfo *FirstTSI = FirstFriend->getFriendType(); 10830 TypeSourceInfo *SecondTSI = SecondFriend->getFriendType(); 10831 10832 if (FirstND && SecondND) { 10833 ODRDiagDeclError(FirstRecord, FirstModule, 10834 FirstFriend->getFriendLoc(), 10835 FirstFriend->getSourceRange(), FriendFunction) 10836 << FirstND; 10837 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10838 SecondFriend->getSourceRange(), FriendFunction) 10839 << SecondND; 10840 10841 Diagnosed = true; 10842 break; 10843 } 10844 10845 if (FirstTSI && SecondTSI) { 10846 QualType FirstFriendType = FirstTSI->getType(); 10847 QualType SecondFriendType = SecondTSI->getType(); 10848 assert(ComputeQualTypeODRHash(FirstFriendType) != 10849 ComputeQualTypeODRHash(SecondFriendType)); 10850 ODRDiagDeclError(FirstRecord, FirstModule, 10851 FirstFriend->getFriendLoc(), 10852 FirstFriend->getSourceRange(), FriendType) 10853 << FirstFriendType; 10854 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10855 SecondFriend->getSourceRange(), FriendType) 10856 << SecondFriendType; 10857 Diagnosed = true; 10858 break; 10859 } 10860 10861 ODRDiagDeclError(FirstRecord, FirstModule, FirstFriend->getFriendLoc(), 10862 FirstFriend->getSourceRange(), FriendTypeFunction) 10863 << (FirstTSI == nullptr); 10864 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10865 SecondFriend->getSourceRange(), FriendTypeFunction) 10866 << (SecondTSI == nullptr); 10867 10868 Diagnosed = true; 10869 break; 10870 } 10871 case FunctionTemplate: { 10872 FunctionTemplateDecl *FirstTemplate = 10873 cast<FunctionTemplateDecl>(FirstDecl); 10874 FunctionTemplateDecl *SecondTemplate = 10875 cast<FunctionTemplateDecl>(SecondDecl); 10876 10877 TemplateParameterList *FirstTPL = 10878 FirstTemplate->getTemplateParameters(); 10879 TemplateParameterList *SecondTPL = 10880 SecondTemplate->getTemplateParameters(); 10881 10882 if (FirstTPL->size() != SecondTPL->size()) { 10883 ODRDiagDeclError(FirstRecord, FirstModule, 10884 FirstTemplate->getLocation(), 10885 FirstTemplate->getSourceRange(), 10886 FunctionTemplateDifferentNumberParameters) 10887 << FirstTemplate << FirstTPL->size(); 10888 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10889 SecondTemplate->getSourceRange(), 10890 FunctionTemplateDifferentNumberParameters) 10891 << SecondTemplate << SecondTPL->size(); 10892 10893 Diagnosed = true; 10894 break; 10895 } 10896 10897 bool ParameterMismatch = false; 10898 for (unsigned i = 0, e = FirstTPL->size(); i != e; ++i) { 10899 NamedDecl *FirstParam = FirstTPL->getParam(i); 10900 NamedDecl *SecondParam = SecondTPL->getParam(i); 10901 10902 if (FirstParam->getKind() != SecondParam->getKind()) { 10903 enum { 10904 TemplateTypeParameter, 10905 NonTypeTemplateParameter, 10906 TemplateTemplateParameter, 10907 }; 10908 auto GetParamType = [](NamedDecl *D) { 10909 switch (D->getKind()) { 10910 default: 10911 llvm_unreachable("Unexpected template parameter type"); 10912 case Decl::TemplateTypeParm: 10913 return TemplateTypeParameter; 10914 case Decl::NonTypeTemplateParm: 10915 return NonTypeTemplateParameter; 10916 case Decl::TemplateTemplateParm: 10917 return TemplateTemplateParameter; 10918 } 10919 }; 10920 10921 ODRDiagDeclError(FirstRecord, FirstModule, 10922 FirstTemplate->getLocation(), 10923 FirstTemplate->getSourceRange(), 10924 FunctionTemplateParameterDifferentKind) 10925 << FirstTemplate << (i + 1) << GetParamType(FirstParam); 10926 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10927 SecondTemplate->getSourceRange(), 10928 FunctionTemplateParameterDifferentKind) 10929 << SecondTemplate << (i + 1) << GetParamType(SecondParam); 10930 10931 ParameterMismatch = true; 10932 break; 10933 } 10934 10935 if (FirstParam->getName() != SecondParam->getName()) { 10936 ODRDiagDeclError( 10937 FirstRecord, FirstModule, FirstTemplate->getLocation(), 10938 FirstTemplate->getSourceRange(), FunctionTemplateParameterName) 10939 << FirstTemplate << (i + 1) << (bool)FirstParam->getIdentifier() 10940 << FirstParam; 10941 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10942 SecondTemplate->getSourceRange(), 10943 FunctionTemplateParameterName) 10944 << SecondTemplate << (i + 1) 10945 << (bool)SecondParam->getIdentifier() << SecondParam; 10946 ParameterMismatch = true; 10947 break; 10948 } 10949 10950 if (isa<TemplateTypeParmDecl>(FirstParam) && 10951 isa<TemplateTypeParmDecl>(SecondParam)) { 10952 TemplateTypeParmDecl *FirstTTPD = 10953 cast<TemplateTypeParmDecl>(FirstParam); 10954 TemplateTypeParmDecl *SecondTTPD = 10955 cast<TemplateTypeParmDecl>(SecondParam); 10956 bool HasFirstDefaultArgument = 10957 FirstTTPD->hasDefaultArgument() && 10958 !FirstTTPD->defaultArgumentWasInherited(); 10959 bool HasSecondDefaultArgument = 10960 SecondTTPD->hasDefaultArgument() && 10961 !SecondTTPD->defaultArgumentWasInherited(); 10962 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10963 ODRDiagDeclError(FirstRecord, FirstModule, 10964 FirstTemplate->getLocation(), 10965 FirstTemplate->getSourceRange(), 10966 FunctionTemplateParameterSingleDefaultArgument) 10967 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 10968 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10969 SecondTemplate->getSourceRange(), 10970 FunctionTemplateParameterSingleDefaultArgument) 10971 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 10972 ParameterMismatch = true; 10973 break; 10974 } 10975 10976 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 10977 QualType FirstType = FirstTTPD->getDefaultArgument(); 10978 QualType SecondType = SecondTTPD->getDefaultArgument(); 10979 if (ComputeQualTypeODRHash(FirstType) != 10980 ComputeQualTypeODRHash(SecondType)) { 10981 ODRDiagDeclError( 10982 FirstRecord, FirstModule, FirstTemplate->getLocation(), 10983 FirstTemplate->getSourceRange(), 10984 FunctionTemplateParameterDifferentDefaultArgument) 10985 << FirstTemplate << (i + 1) << FirstType; 10986 ODRDiagDeclNote( 10987 SecondModule, SecondTemplate->getLocation(), 10988 SecondTemplate->getSourceRange(), 10989 FunctionTemplateParameterDifferentDefaultArgument) 10990 << SecondTemplate << (i + 1) << SecondType; 10991 ParameterMismatch = true; 10992 break; 10993 } 10994 } 10995 10996 if (FirstTTPD->isParameterPack() != 10997 SecondTTPD->isParameterPack()) { 10998 ODRDiagDeclError(FirstRecord, FirstModule, 10999 FirstTemplate->getLocation(), 11000 FirstTemplate->getSourceRange(), 11001 FunctionTemplatePackParameter) 11002 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 11003 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11004 SecondTemplate->getSourceRange(), 11005 FunctionTemplatePackParameter) 11006 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 11007 ParameterMismatch = true; 11008 break; 11009 } 11010 } 11011 11012 if (isa<TemplateTemplateParmDecl>(FirstParam) && 11013 isa<TemplateTemplateParmDecl>(SecondParam)) { 11014 TemplateTemplateParmDecl *FirstTTPD = 11015 cast<TemplateTemplateParmDecl>(FirstParam); 11016 TemplateTemplateParmDecl *SecondTTPD = 11017 cast<TemplateTemplateParmDecl>(SecondParam); 11018 11019 TemplateParameterList *FirstTPL = 11020 FirstTTPD->getTemplateParameters(); 11021 TemplateParameterList *SecondTPL = 11022 SecondTTPD->getTemplateParameters(); 11023 11024 if (ComputeTemplateParameterListODRHash(FirstTPL) != 11025 ComputeTemplateParameterListODRHash(SecondTPL)) { 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 FirstTTPD->hasDefaultArgument() && 11041 !FirstTTPD->defaultArgumentWasInherited(); 11042 bool HasSecondDefaultArgument = 11043 SecondTTPD->hasDefaultArgument() && 11044 !SecondTTPD->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 TemplateArgument FirstTA = 11061 FirstTTPD->getDefaultArgument().getArgument(); 11062 TemplateArgument SecondTA = 11063 SecondTTPD->getDefaultArgument().getArgument(); 11064 if (ComputeTemplateArgumentODRHash(FirstTA) != 11065 ComputeTemplateArgumentODRHash(SecondTA)) { 11066 ODRDiagDeclError( 11067 FirstRecord, FirstModule, FirstTemplate->getLocation(), 11068 FirstTemplate->getSourceRange(), 11069 FunctionTemplateParameterDifferentDefaultArgument) 11070 << FirstTemplate << (i + 1) << FirstTA; 11071 ODRDiagDeclNote( 11072 SecondModule, SecondTemplate->getLocation(), 11073 SecondTemplate->getSourceRange(), 11074 FunctionTemplateParameterDifferentDefaultArgument) 11075 << SecondTemplate << (i + 1) << SecondTA; 11076 ParameterMismatch = true; 11077 break; 11078 } 11079 } 11080 11081 if (FirstTTPD->isParameterPack() != 11082 SecondTTPD->isParameterPack()) { 11083 ODRDiagDeclError(FirstRecord, FirstModule, 11084 FirstTemplate->getLocation(), 11085 FirstTemplate->getSourceRange(), 11086 FunctionTemplatePackParameter) 11087 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 11088 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11089 SecondTemplate->getSourceRange(), 11090 FunctionTemplatePackParameter) 11091 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 11092 ParameterMismatch = true; 11093 break; 11094 } 11095 } 11096 11097 if (isa<NonTypeTemplateParmDecl>(FirstParam) && 11098 isa<NonTypeTemplateParmDecl>(SecondParam)) { 11099 NonTypeTemplateParmDecl *FirstNTTPD = 11100 cast<NonTypeTemplateParmDecl>(FirstParam); 11101 NonTypeTemplateParmDecl *SecondNTTPD = 11102 cast<NonTypeTemplateParmDecl>(SecondParam); 11103 11104 QualType FirstType = FirstNTTPD->getType(); 11105 QualType SecondType = SecondNTTPD->getType(); 11106 if (ComputeQualTypeODRHash(FirstType) != 11107 ComputeQualTypeODRHash(SecondType)) { 11108 ODRDiagDeclError(FirstRecord, FirstModule, 11109 FirstTemplate->getLocation(), 11110 FirstTemplate->getSourceRange(), 11111 FunctionTemplateParameterDifferentType) 11112 << FirstTemplate << (i + 1); 11113 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11114 SecondTemplate->getSourceRange(), 11115 FunctionTemplateParameterDifferentType) 11116 << SecondTemplate << (i + 1); 11117 ParameterMismatch = true; 11118 break; 11119 } 11120 11121 bool HasFirstDefaultArgument = 11122 FirstNTTPD->hasDefaultArgument() && 11123 !FirstNTTPD->defaultArgumentWasInherited(); 11124 bool HasSecondDefaultArgument = 11125 SecondNTTPD->hasDefaultArgument() && 11126 !SecondNTTPD->defaultArgumentWasInherited(); 11127 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 11128 ODRDiagDeclError(FirstRecord, FirstModule, 11129 FirstTemplate->getLocation(), 11130 FirstTemplate->getSourceRange(), 11131 FunctionTemplateParameterSingleDefaultArgument) 11132 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 11133 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11134 SecondTemplate->getSourceRange(), 11135 FunctionTemplateParameterSingleDefaultArgument) 11136 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 11137 ParameterMismatch = true; 11138 break; 11139 } 11140 11141 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 11142 Expr *FirstDefaultArgument = FirstNTTPD->getDefaultArgument(); 11143 Expr *SecondDefaultArgument = SecondNTTPD->getDefaultArgument(); 11144 if (ComputeODRHash(FirstDefaultArgument) != 11145 ComputeODRHash(SecondDefaultArgument)) { 11146 ODRDiagDeclError( 11147 FirstRecord, FirstModule, FirstTemplate->getLocation(), 11148 FirstTemplate->getSourceRange(), 11149 FunctionTemplateParameterDifferentDefaultArgument) 11150 << FirstTemplate << (i + 1) << FirstDefaultArgument; 11151 ODRDiagDeclNote( 11152 SecondModule, SecondTemplate->getLocation(), 11153 SecondTemplate->getSourceRange(), 11154 FunctionTemplateParameterDifferentDefaultArgument) 11155 << SecondTemplate << (i + 1) << SecondDefaultArgument; 11156 ParameterMismatch = true; 11157 break; 11158 } 11159 } 11160 11161 if (FirstNTTPD->isParameterPack() != 11162 SecondNTTPD->isParameterPack()) { 11163 ODRDiagDeclError(FirstRecord, FirstModule, 11164 FirstTemplate->getLocation(), 11165 FirstTemplate->getSourceRange(), 11166 FunctionTemplatePackParameter) 11167 << FirstTemplate << (i + 1) << FirstNTTPD->isParameterPack(); 11168 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11169 SecondTemplate->getSourceRange(), 11170 FunctionTemplatePackParameter) 11171 << SecondTemplate << (i + 1) 11172 << SecondNTTPD->isParameterPack(); 11173 ParameterMismatch = true; 11174 break; 11175 } 11176 } 11177 } 11178 11179 if (ParameterMismatch) { 11180 Diagnosed = true; 11181 break; 11182 } 11183 11184 break; 11185 } 11186 } 11187 11188 if (Diagnosed) 11189 continue; 11190 11191 Diag(FirstDecl->getLocation(), 11192 diag::err_module_odr_violation_mismatch_decl_unknown) 11193 << FirstRecord << FirstModule.empty() << FirstModule << FirstDiffType 11194 << FirstDecl->getSourceRange(); 11195 Diag(SecondDecl->getLocation(), 11196 diag::note_module_odr_violation_mismatch_decl_unknown) 11197 << SecondModule << FirstDiffType << SecondDecl->getSourceRange(); 11198 Diagnosed = true; 11199 } 11200 11201 if (!Diagnosed) { 11202 // All definitions are updates to the same declaration. This happens if a 11203 // module instantiates the declaration of a class template specialization 11204 // and two or more other modules instantiate its definition. 11205 // 11206 // FIXME: Indicate which modules had instantiations of this definition. 11207 // FIXME: How can this even happen? 11208 Diag(Merge.first->getLocation(), 11209 diag::err_module_odr_violation_different_instantiations) 11210 << Merge.first; 11211 } 11212 } 11213 11214 // Issue ODR failures diagnostics for functions. 11215 for (auto &Merge : FunctionOdrMergeFailures) { 11216 enum ODRFunctionDifference { 11217 ReturnType, 11218 ParameterName, 11219 ParameterType, 11220 ParameterSingleDefaultArgument, 11221 ParameterDifferentDefaultArgument, 11222 FunctionBody, 11223 }; 11224 11225 FunctionDecl *FirstFunction = Merge.first; 11226 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstFunction); 11227 11228 bool Diagnosed = false; 11229 for (auto &SecondFunction : Merge.second) { 11230 11231 if (FirstFunction == SecondFunction) 11232 continue; 11233 11234 std::string SecondModule = 11235 getOwningModuleNameForDiagnostic(SecondFunction); 11236 11237 auto ODRDiagError = [FirstFunction, &FirstModule, 11238 this](SourceLocation Loc, SourceRange Range, 11239 ODRFunctionDifference DiffType) { 11240 return Diag(Loc, diag::err_module_odr_violation_function) 11241 << FirstFunction << FirstModule.empty() << FirstModule << Range 11242 << DiffType; 11243 }; 11244 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11245 SourceRange Range, 11246 ODRFunctionDifference DiffType) { 11247 return Diag(Loc, diag::note_module_odr_violation_function) 11248 << SecondModule << Range << DiffType; 11249 }; 11250 11251 if (ComputeQualTypeODRHash(FirstFunction->getReturnType()) != 11252 ComputeQualTypeODRHash(SecondFunction->getReturnType())) { 11253 ODRDiagError(FirstFunction->getReturnTypeSourceRange().getBegin(), 11254 FirstFunction->getReturnTypeSourceRange(), ReturnType) 11255 << FirstFunction->getReturnType(); 11256 ODRDiagNote(SecondFunction->getReturnTypeSourceRange().getBegin(), 11257 SecondFunction->getReturnTypeSourceRange(), ReturnType) 11258 << SecondFunction->getReturnType(); 11259 Diagnosed = true; 11260 break; 11261 } 11262 11263 assert(FirstFunction->param_size() == SecondFunction->param_size() && 11264 "Merged functions with different number of parameters"); 11265 11266 auto ParamSize = FirstFunction->param_size(); 11267 bool ParameterMismatch = false; 11268 for (unsigned I = 0; I < ParamSize; ++I) { 11269 auto *FirstParam = FirstFunction->getParamDecl(I); 11270 auto *SecondParam = SecondFunction->getParamDecl(I); 11271 11272 assert(getContext().hasSameType(FirstParam->getType(), 11273 SecondParam->getType()) && 11274 "Merged function has different parameter types."); 11275 11276 if (FirstParam->getDeclName() != SecondParam->getDeclName()) { 11277 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11278 ParameterName) 11279 << I + 1 << FirstParam->getDeclName(); 11280 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11281 ParameterName) 11282 << I + 1 << SecondParam->getDeclName(); 11283 ParameterMismatch = true; 11284 break; 11285 }; 11286 11287 QualType FirstParamType = FirstParam->getType(); 11288 QualType SecondParamType = SecondParam->getType(); 11289 if (FirstParamType != SecondParamType && 11290 ComputeQualTypeODRHash(FirstParamType) != 11291 ComputeQualTypeODRHash(SecondParamType)) { 11292 if (const DecayedType *ParamDecayedType = 11293 FirstParamType->getAs<DecayedType>()) { 11294 ODRDiagError(FirstParam->getLocation(), 11295 FirstParam->getSourceRange(), ParameterType) 11296 << (I + 1) << FirstParamType << true 11297 << ParamDecayedType->getOriginalType(); 11298 } else { 11299 ODRDiagError(FirstParam->getLocation(), 11300 FirstParam->getSourceRange(), ParameterType) 11301 << (I + 1) << FirstParamType << false; 11302 } 11303 11304 if (const DecayedType *ParamDecayedType = 11305 SecondParamType->getAs<DecayedType>()) { 11306 ODRDiagNote(SecondParam->getLocation(), 11307 SecondParam->getSourceRange(), ParameterType) 11308 << (I + 1) << SecondParamType << true 11309 << ParamDecayedType->getOriginalType(); 11310 } else { 11311 ODRDiagNote(SecondParam->getLocation(), 11312 SecondParam->getSourceRange(), ParameterType) 11313 << (I + 1) << SecondParamType << false; 11314 } 11315 ParameterMismatch = true; 11316 break; 11317 } 11318 11319 const Expr *FirstInit = FirstParam->getInit(); 11320 const Expr *SecondInit = SecondParam->getInit(); 11321 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 11322 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11323 ParameterSingleDefaultArgument) 11324 << (I + 1) << (FirstInit == nullptr) 11325 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 11326 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11327 ParameterSingleDefaultArgument) 11328 << (I + 1) << (SecondInit == nullptr) 11329 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 11330 ParameterMismatch = true; 11331 break; 11332 } 11333 11334 if (FirstInit && SecondInit && 11335 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11336 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11337 ParameterDifferentDefaultArgument) 11338 << (I + 1) << FirstInit->getSourceRange(); 11339 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11340 ParameterDifferentDefaultArgument) 11341 << (I + 1) << SecondInit->getSourceRange(); 11342 ParameterMismatch = true; 11343 break; 11344 } 11345 11346 assert(ComputeSubDeclODRHash(FirstParam) == 11347 ComputeSubDeclODRHash(SecondParam) && 11348 "Undiagnosed parameter difference."); 11349 } 11350 11351 if (ParameterMismatch) { 11352 Diagnosed = true; 11353 break; 11354 } 11355 11356 // If no error has been generated before now, assume the problem is in 11357 // the body and generate a message. 11358 ODRDiagError(FirstFunction->getLocation(), 11359 FirstFunction->getSourceRange(), FunctionBody); 11360 ODRDiagNote(SecondFunction->getLocation(), 11361 SecondFunction->getSourceRange(), FunctionBody); 11362 Diagnosed = true; 11363 break; 11364 } 11365 (void)Diagnosed; 11366 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11367 } 11368 11369 // Issue ODR failures diagnostics for enums. 11370 for (auto &Merge : EnumOdrMergeFailures) { 11371 enum ODREnumDifference { 11372 SingleScopedEnum, 11373 EnumTagKeywordMismatch, 11374 SingleSpecifiedType, 11375 DifferentSpecifiedTypes, 11376 DifferentNumberEnumConstants, 11377 EnumConstantName, 11378 EnumConstantSingleInitilizer, 11379 EnumConstantDifferentInitilizer, 11380 }; 11381 11382 // If we've already pointed out a specific problem with this enum, don't 11383 // bother issuing a general "something's different" diagnostic. 11384 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 11385 continue; 11386 11387 EnumDecl *FirstEnum = Merge.first; 11388 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstEnum); 11389 11390 using DeclHashes = 11391 llvm::SmallVector<std::pair<EnumConstantDecl *, unsigned>, 4>; 11392 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstEnum]( 11393 DeclHashes &Hashes, EnumDecl *Enum) { 11394 for (auto *D : Enum->decls()) { 11395 // Due to decl merging, the first EnumDecl is the parent of 11396 // Decls in both records. 11397 if (!ODRHash::isWhitelistedDecl(D, FirstEnum)) 11398 continue; 11399 assert(isa<EnumConstantDecl>(D) && "Unexpected Decl kind"); 11400 Hashes.emplace_back(cast<EnumConstantDecl>(D), 11401 ComputeSubDeclODRHash(D)); 11402 } 11403 }; 11404 DeclHashes FirstHashes; 11405 PopulateHashes(FirstHashes, FirstEnum); 11406 bool Diagnosed = false; 11407 for (auto &SecondEnum : Merge.second) { 11408 11409 if (FirstEnum == SecondEnum) 11410 continue; 11411 11412 std::string SecondModule = 11413 getOwningModuleNameForDiagnostic(SecondEnum); 11414 11415 auto ODRDiagError = [FirstEnum, &FirstModule, 11416 this](SourceLocation Loc, SourceRange Range, 11417 ODREnumDifference DiffType) { 11418 return Diag(Loc, diag::err_module_odr_violation_enum) 11419 << FirstEnum << FirstModule.empty() << FirstModule << Range 11420 << DiffType; 11421 }; 11422 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11423 SourceRange Range, 11424 ODREnumDifference DiffType) { 11425 return Diag(Loc, diag::note_module_odr_violation_enum) 11426 << SecondModule << Range << DiffType; 11427 }; 11428 11429 if (FirstEnum->isScoped() != SecondEnum->isScoped()) { 11430 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11431 SingleScopedEnum) 11432 << FirstEnum->isScoped(); 11433 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11434 SingleScopedEnum) 11435 << SecondEnum->isScoped(); 11436 Diagnosed = true; 11437 continue; 11438 } 11439 11440 if (FirstEnum->isScoped() && SecondEnum->isScoped()) { 11441 if (FirstEnum->isScopedUsingClassTag() != 11442 SecondEnum->isScopedUsingClassTag()) { 11443 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11444 EnumTagKeywordMismatch) 11445 << FirstEnum->isScopedUsingClassTag(); 11446 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11447 EnumTagKeywordMismatch) 11448 << SecondEnum->isScopedUsingClassTag(); 11449 Diagnosed = true; 11450 continue; 11451 } 11452 } 11453 11454 QualType FirstUnderlyingType = 11455 FirstEnum->getIntegerTypeSourceInfo() 11456 ? FirstEnum->getIntegerTypeSourceInfo()->getType() 11457 : QualType(); 11458 QualType SecondUnderlyingType = 11459 SecondEnum->getIntegerTypeSourceInfo() 11460 ? SecondEnum->getIntegerTypeSourceInfo()->getType() 11461 : QualType(); 11462 if (FirstUnderlyingType.isNull() != SecondUnderlyingType.isNull()) { 11463 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11464 SingleSpecifiedType) 11465 << !FirstUnderlyingType.isNull(); 11466 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11467 SingleSpecifiedType) 11468 << !SecondUnderlyingType.isNull(); 11469 Diagnosed = true; 11470 continue; 11471 } 11472 11473 if (!FirstUnderlyingType.isNull() && !SecondUnderlyingType.isNull()) { 11474 if (ComputeQualTypeODRHash(FirstUnderlyingType) != 11475 ComputeQualTypeODRHash(SecondUnderlyingType)) { 11476 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11477 DifferentSpecifiedTypes) 11478 << FirstUnderlyingType; 11479 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11480 DifferentSpecifiedTypes) 11481 << SecondUnderlyingType; 11482 Diagnosed = true; 11483 continue; 11484 } 11485 } 11486 11487 DeclHashes SecondHashes; 11488 PopulateHashes(SecondHashes, SecondEnum); 11489 11490 if (FirstHashes.size() != SecondHashes.size()) { 11491 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11492 DifferentNumberEnumConstants) 11493 << (int)FirstHashes.size(); 11494 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11495 DifferentNumberEnumConstants) 11496 << (int)SecondHashes.size(); 11497 Diagnosed = true; 11498 continue; 11499 } 11500 11501 for (unsigned I = 0; I < FirstHashes.size(); ++I) { 11502 if (FirstHashes[I].second == SecondHashes[I].second) 11503 continue; 11504 const EnumConstantDecl *FirstEnumConstant = FirstHashes[I].first; 11505 const EnumConstantDecl *SecondEnumConstant = SecondHashes[I].first; 11506 11507 if (FirstEnumConstant->getDeclName() != 11508 SecondEnumConstant->getDeclName()) { 11509 11510 ODRDiagError(FirstEnumConstant->getLocation(), 11511 FirstEnumConstant->getSourceRange(), EnumConstantName) 11512 << I + 1 << FirstEnumConstant; 11513 ODRDiagNote(SecondEnumConstant->getLocation(), 11514 SecondEnumConstant->getSourceRange(), EnumConstantName) 11515 << I + 1 << SecondEnumConstant; 11516 Diagnosed = true; 11517 break; 11518 } 11519 11520 const Expr *FirstInit = FirstEnumConstant->getInitExpr(); 11521 const Expr *SecondInit = SecondEnumConstant->getInitExpr(); 11522 if (!FirstInit && !SecondInit) 11523 continue; 11524 11525 if (!FirstInit || !SecondInit) { 11526 ODRDiagError(FirstEnumConstant->getLocation(), 11527 FirstEnumConstant->getSourceRange(), 11528 EnumConstantSingleInitilizer) 11529 << I + 1 << FirstEnumConstant << (FirstInit != nullptr); 11530 ODRDiagNote(SecondEnumConstant->getLocation(), 11531 SecondEnumConstant->getSourceRange(), 11532 EnumConstantSingleInitilizer) 11533 << I + 1 << SecondEnumConstant << (SecondInit != nullptr); 11534 Diagnosed = true; 11535 break; 11536 } 11537 11538 if (ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11539 ODRDiagError(FirstEnumConstant->getLocation(), 11540 FirstEnumConstant->getSourceRange(), 11541 EnumConstantDifferentInitilizer) 11542 << I + 1 << FirstEnumConstant; 11543 ODRDiagNote(SecondEnumConstant->getLocation(), 11544 SecondEnumConstant->getSourceRange(), 11545 EnumConstantDifferentInitilizer) 11546 << I + 1 << SecondEnumConstant; 11547 Diagnosed = true; 11548 break; 11549 } 11550 } 11551 } 11552 11553 (void)Diagnosed; 11554 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11555 } 11556 } 11557 11558 void ASTReader::StartedDeserializing() { 11559 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get()) 11560 ReadTimer->startTimer(); 11561 } 11562 11563 void ASTReader::FinishedDeserializing() { 11564 assert(NumCurrentElementsDeserializing && 11565 "FinishedDeserializing not paired with StartedDeserializing"); 11566 if (NumCurrentElementsDeserializing == 1) { 11567 // We decrease NumCurrentElementsDeserializing only after pending actions 11568 // are finished, to avoid recursively re-calling finishPendingActions(). 11569 finishPendingActions(); 11570 } 11571 --NumCurrentElementsDeserializing; 11572 11573 if (NumCurrentElementsDeserializing == 0) { 11574 // Propagate exception specification and deduced type updates along 11575 // redeclaration chains. 11576 // 11577 // We do this now rather than in finishPendingActions because we want to 11578 // be able to walk the complete redeclaration chains of the updated decls. 11579 while (!PendingExceptionSpecUpdates.empty() || 11580 !PendingDeducedTypeUpdates.empty()) { 11581 auto ESUpdates = std::move(PendingExceptionSpecUpdates); 11582 PendingExceptionSpecUpdates.clear(); 11583 for (auto Update : ESUpdates) { 11584 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11585 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>(); 11586 auto ESI = FPT->getExtProtoInfo().ExceptionSpec; 11587 if (auto *Listener = getContext().getASTMutationListener()) 11588 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second)); 11589 for (auto *Redecl : Update.second->redecls()) 11590 getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI); 11591 } 11592 11593 auto DTUpdates = std::move(PendingDeducedTypeUpdates); 11594 PendingDeducedTypeUpdates.clear(); 11595 for (auto Update : DTUpdates) { 11596 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11597 // FIXME: If the return type is already deduced, check that it matches. 11598 getContext().adjustDeducedFunctionResultType(Update.first, 11599 Update.second); 11600 } 11601 } 11602 11603 if (ReadTimer) 11604 ReadTimer->stopTimer(); 11605 11606 diagnoseOdrViolations(); 11607 11608 // We are not in recursive loading, so it's safe to pass the "interesting" 11609 // decls to the consumer. 11610 if (Consumer) 11611 PassInterestingDeclsToConsumer(); 11612 } 11613 } 11614 11615 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 11616 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { 11617 // Remove any fake results before adding any real ones. 11618 auto It = PendingFakeLookupResults.find(II); 11619 if (It != PendingFakeLookupResults.end()) { 11620 for (auto *ND : It->second) 11621 SemaObj->IdResolver.RemoveDecl(ND); 11622 // FIXME: this works around module+PCH performance issue. 11623 // Rather than erase the result from the map, which is O(n), just clear 11624 // the vector of NamedDecls. 11625 It->second.clear(); 11626 } 11627 } 11628 11629 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 11630 SemaObj->TUScope->AddDecl(D); 11631 } else if (SemaObj->TUScope) { 11632 // Adding the decl to IdResolver may have failed because it was already in 11633 // (even though it was not added in scope). If it is already in, make sure 11634 // it gets in the scope as well. 11635 if (std::find(SemaObj->IdResolver.begin(Name), 11636 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 11637 SemaObj->TUScope->AddDecl(D); 11638 } 11639 } 11640 11641 ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache, 11642 ASTContext *Context, 11643 const PCHContainerReader &PCHContainerRdr, 11644 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions, 11645 StringRef isysroot, bool DisableValidation, 11646 bool AllowASTWithCompilerErrors, 11647 bool AllowConfigurationMismatch, bool ValidateSystemInputs, 11648 bool ValidateASTInputFilesContent, bool UseGlobalIndex, 11649 std::unique_ptr<llvm::Timer> ReadTimer) 11650 : Listener(DisableValidation 11651 ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP)) 11652 : cast<ASTReaderListener>(new PCHValidator(PP, *this))), 11653 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), 11654 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP), 11655 ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache, 11656 PCHContainerRdr, PP.getHeaderSearchInfo()), 11657 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot), 11658 DisableValidation(DisableValidation), 11659 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 11660 AllowConfigurationMismatch(AllowConfigurationMismatch), 11661 ValidateSystemInputs(ValidateSystemInputs), 11662 ValidateASTInputFilesContent(ValidateASTInputFilesContent), 11663 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) { 11664 SourceMgr.setExternalSLocEntrySource(this); 11665 11666 for (const auto &Ext : Extensions) { 11667 auto BlockName = Ext->getExtensionMetadata().BlockName; 11668 auto Known = ModuleFileExtensions.find(BlockName); 11669 if (Known != ModuleFileExtensions.end()) { 11670 Diags.Report(diag::warn_duplicate_module_file_extension) 11671 << BlockName; 11672 continue; 11673 } 11674 11675 ModuleFileExtensions.insert({BlockName, Ext}); 11676 } 11677 } 11678 11679 ASTReader::~ASTReader() { 11680 if (OwnsDeserializationListener) 11681 delete DeserializationListener; 11682 } 11683 11684 IdentifierResolver &ASTReader::getIdResolver() { 11685 return SemaObj ? SemaObj->IdResolver : DummyIdResolver; 11686 } 11687 11688 Expected<unsigned> ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor, 11689 unsigned AbbrevID) { 11690 Idx = 0; 11691 Record.clear(); 11692 return Cursor.readRecord(AbbrevID, Record); 11693 } 11694 //===----------------------------------------------------------------------===// 11695 //// OMPClauseReader implementation 11696 ////===----------------------------------------------------------------------===// 11697 11698 // This has to be in namespace clang because it's friended by all 11699 // of the OMP clauses. 11700 namespace clang { 11701 11702 class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> { 11703 ASTRecordReader &Record; 11704 ASTContext &Context; 11705 11706 public: 11707 OMPClauseReader(ASTRecordReader &Record) 11708 : Record(Record), Context(Record.getContext()) {} 11709 11710 #define OMP_CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C); 11711 #include "llvm/Frontend/OpenMP/OMPKinds.def" 11712 OMPClause *readClause(); 11713 void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C); 11714 void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C); 11715 }; 11716 11717 } // end namespace clang 11718 11719 OMPClause *ASTRecordReader::readOMPClause() { 11720 return OMPClauseReader(*this).readClause(); 11721 } 11722 11723 OMPClause *OMPClauseReader::readClause() { 11724 OMPClause *C = nullptr; 11725 switch (llvm::omp::Clause(Record.readInt())) { 11726 case llvm::omp::OMPC_if: 11727 C = new (Context) OMPIfClause(); 11728 break; 11729 case llvm::omp::OMPC_final: 11730 C = new (Context) OMPFinalClause(); 11731 break; 11732 case llvm::omp::OMPC_num_threads: 11733 C = new (Context) OMPNumThreadsClause(); 11734 break; 11735 case llvm::omp::OMPC_safelen: 11736 C = new (Context) OMPSafelenClause(); 11737 break; 11738 case llvm::omp::OMPC_simdlen: 11739 C = new (Context) OMPSimdlenClause(); 11740 break; 11741 case llvm::omp::OMPC_allocator: 11742 C = new (Context) OMPAllocatorClause(); 11743 break; 11744 case llvm::omp::OMPC_collapse: 11745 C = new (Context) OMPCollapseClause(); 11746 break; 11747 case llvm::omp::OMPC_default: 11748 C = new (Context) OMPDefaultClause(); 11749 break; 11750 case llvm::omp::OMPC_proc_bind: 11751 C = new (Context) OMPProcBindClause(); 11752 break; 11753 case llvm::omp::OMPC_schedule: 11754 C = new (Context) OMPScheduleClause(); 11755 break; 11756 case llvm::omp::OMPC_ordered: 11757 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt()); 11758 break; 11759 case llvm::omp::OMPC_nowait: 11760 C = new (Context) OMPNowaitClause(); 11761 break; 11762 case llvm::omp::OMPC_untied: 11763 C = new (Context) OMPUntiedClause(); 11764 break; 11765 case llvm::omp::OMPC_mergeable: 11766 C = new (Context) OMPMergeableClause(); 11767 break; 11768 case llvm::omp::OMPC_read: 11769 C = new (Context) OMPReadClause(); 11770 break; 11771 case llvm::omp::OMPC_write: 11772 C = new (Context) OMPWriteClause(); 11773 break; 11774 case llvm::omp::OMPC_update: 11775 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt()); 11776 break; 11777 case llvm::omp::OMPC_capture: 11778 C = new (Context) OMPCaptureClause(); 11779 break; 11780 case llvm::omp::OMPC_seq_cst: 11781 C = new (Context) OMPSeqCstClause(); 11782 break; 11783 case llvm::omp::OMPC_acq_rel: 11784 C = new (Context) OMPAcqRelClause(); 11785 break; 11786 case llvm::omp::OMPC_acquire: 11787 C = new (Context) OMPAcquireClause(); 11788 break; 11789 case llvm::omp::OMPC_release: 11790 C = new (Context) OMPReleaseClause(); 11791 break; 11792 case llvm::omp::OMPC_relaxed: 11793 C = new (Context) OMPRelaxedClause(); 11794 break; 11795 case llvm::omp::OMPC_threads: 11796 C = new (Context) OMPThreadsClause(); 11797 break; 11798 case llvm::omp::OMPC_simd: 11799 C = new (Context) OMPSIMDClause(); 11800 break; 11801 case llvm::omp::OMPC_nogroup: 11802 C = new (Context) OMPNogroupClause(); 11803 break; 11804 case llvm::omp::OMPC_unified_address: 11805 C = new (Context) OMPUnifiedAddressClause(); 11806 break; 11807 case llvm::omp::OMPC_unified_shared_memory: 11808 C = new (Context) OMPUnifiedSharedMemoryClause(); 11809 break; 11810 case llvm::omp::OMPC_reverse_offload: 11811 C = new (Context) OMPReverseOffloadClause(); 11812 break; 11813 case llvm::omp::OMPC_dynamic_allocators: 11814 C = new (Context) OMPDynamicAllocatorsClause(); 11815 break; 11816 case llvm::omp::OMPC_atomic_default_mem_order: 11817 C = new (Context) OMPAtomicDefaultMemOrderClause(); 11818 break; 11819 case llvm::omp::OMPC_private: 11820 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt()); 11821 break; 11822 case llvm::omp::OMPC_firstprivate: 11823 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt()); 11824 break; 11825 case llvm::omp::OMPC_lastprivate: 11826 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt()); 11827 break; 11828 case llvm::omp::OMPC_shared: 11829 C = OMPSharedClause::CreateEmpty(Context, Record.readInt()); 11830 break; 11831 case llvm::omp::OMPC_reduction: { 11832 unsigned N = Record.readInt(); 11833 auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>(); 11834 C = OMPReductionClause::CreateEmpty(Context, N, Modifier); 11835 break; 11836 } 11837 case llvm::omp::OMPC_task_reduction: 11838 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt()); 11839 break; 11840 case llvm::omp::OMPC_in_reduction: 11841 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt()); 11842 break; 11843 case llvm::omp::OMPC_linear: 11844 C = OMPLinearClause::CreateEmpty(Context, Record.readInt()); 11845 break; 11846 case llvm::omp::OMPC_aligned: 11847 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt()); 11848 break; 11849 case llvm::omp::OMPC_copyin: 11850 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt()); 11851 break; 11852 case llvm::omp::OMPC_copyprivate: 11853 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt()); 11854 break; 11855 case llvm::omp::OMPC_flush: 11856 C = OMPFlushClause::CreateEmpty(Context, Record.readInt()); 11857 break; 11858 case llvm::omp::OMPC_depobj: 11859 C = OMPDepobjClause::CreateEmpty(Context); 11860 break; 11861 case llvm::omp::OMPC_depend: { 11862 unsigned NumVars = Record.readInt(); 11863 unsigned NumLoops = Record.readInt(); 11864 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops); 11865 break; 11866 } 11867 case llvm::omp::OMPC_device: 11868 C = new (Context) OMPDeviceClause(); 11869 break; 11870 case llvm::omp::OMPC_map: { 11871 OMPMappableExprListSizeTy Sizes; 11872 Sizes.NumVars = Record.readInt(); 11873 Sizes.NumUniqueDeclarations = Record.readInt(); 11874 Sizes.NumComponentLists = Record.readInt(); 11875 Sizes.NumComponents = Record.readInt(); 11876 C = OMPMapClause::CreateEmpty(Context, Sizes); 11877 break; 11878 } 11879 case llvm::omp::OMPC_num_teams: 11880 C = new (Context) OMPNumTeamsClause(); 11881 break; 11882 case llvm::omp::OMPC_thread_limit: 11883 C = new (Context) OMPThreadLimitClause(); 11884 break; 11885 case llvm::omp::OMPC_priority: 11886 C = new (Context) OMPPriorityClause(); 11887 break; 11888 case llvm::omp::OMPC_grainsize: 11889 C = new (Context) OMPGrainsizeClause(); 11890 break; 11891 case llvm::omp::OMPC_num_tasks: 11892 C = new (Context) OMPNumTasksClause(); 11893 break; 11894 case llvm::omp::OMPC_hint: 11895 C = new (Context) OMPHintClause(); 11896 break; 11897 case llvm::omp::OMPC_dist_schedule: 11898 C = new (Context) OMPDistScheduleClause(); 11899 break; 11900 case llvm::omp::OMPC_defaultmap: 11901 C = new (Context) OMPDefaultmapClause(); 11902 break; 11903 case llvm::omp::OMPC_to: { 11904 OMPMappableExprListSizeTy Sizes; 11905 Sizes.NumVars = Record.readInt(); 11906 Sizes.NumUniqueDeclarations = Record.readInt(); 11907 Sizes.NumComponentLists = Record.readInt(); 11908 Sizes.NumComponents = Record.readInt(); 11909 C = OMPToClause::CreateEmpty(Context, Sizes); 11910 break; 11911 } 11912 case llvm::omp::OMPC_from: { 11913 OMPMappableExprListSizeTy Sizes; 11914 Sizes.NumVars = Record.readInt(); 11915 Sizes.NumUniqueDeclarations = Record.readInt(); 11916 Sizes.NumComponentLists = Record.readInt(); 11917 Sizes.NumComponents = Record.readInt(); 11918 C = OMPFromClause::CreateEmpty(Context, Sizes); 11919 break; 11920 } 11921 case llvm::omp::OMPC_use_device_ptr: { 11922 OMPMappableExprListSizeTy Sizes; 11923 Sizes.NumVars = Record.readInt(); 11924 Sizes.NumUniqueDeclarations = Record.readInt(); 11925 Sizes.NumComponentLists = Record.readInt(); 11926 Sizes.NumComponents = Record.readInt(); 11927 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes); 11928 break; 11929 } 11930 case llvm::omp::OMPC_use_device_addr: { 11931 OMPMappableExprListSizeTy Sizes; 11932 Sizes.NumVars = Record.readInt(); 11933 Sizes.NumUniqueDeclarations = Record.readInt(); 11934 Sizes.NumComponentLists = Record.readInt(); 11935 Sizes.NumComponents = Record.readInt(); 11936 C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes); 11937 break; 11938 } 11939 case llvm::omp::OMPC_is_device_ptr: { 11940 OMPMappableExprListSizeTy Sizes; 11941 Sizes.NumVars = Record.readInt(); 11942 Sizes.NumUniqueDeclarations = Record.readInt(); 11943 Sizes.NumComponentLists = Record.readInt(); 11944 Sizes.NumComponents = Record.readInt(); 11945 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes); 11946 break; 11947 } 11948 case llvm::omp::OMPC_allocate: 11949 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt()); 11950 break; 11951 case llvm::omp::OMPC_nontemporal: 11952 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt()); 11953 break; 11954 case llvm::omp::OMPC_inclusive: 11955 C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt()); 11956 break; 11957 case llvm::omp::OMPC_exclusive: 11958 C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt()); 11959 break; 11960 case llvm::omp::OMPC_order: 11961 C = new (Context) OMPOrderClause(); 11962 break; 11963 case llvm::omp::OMPC_destroy: 11964 C = new (Context) OMPDestroyClause(); 11965 break; 11966 case llvm::omp::OMPC_detach: 11967 C = new (Context) OMPDetachClause(); 11968 break; 11969 case llvm::omp::OMPC_uses_allocators: 11970 C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt()); 11971 break; 11972 case llvm::omp::OMPC_affinity: 11973 C = OMPAffinityClause::CreateEmpty(Context, Record.readInt()); 11974 break; 11975 #define OMP_CLAUSE_NO_CLASS(Enum, Str) \ 11976 case llvm::omp::Enum: \ 11977 break; 11978 #include "llvm/Frontend/OpenMP/OMPKinds.def" 11979 } 11980 assert(C && "Unknown OMPClause type"); 11981 11982 Visit(C); 11983 C->setLocStart(Record.readSourceLocation()); 11984 C->setLocEnd(Record.readSourceLocation()); 11985 11986 return C; 11987 } 11988 11989 void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) { 11990 C->setPreInitStmt(Record.readSubStmt(), 11991 static_cast<OpenMPDirectiveKind>(Record.readInt())); 11992 } 11993 11994 void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) { 11995 VisitOMPClauseWithPreInit(C); 11996 C->setPostUpdateExpr(Record.readSubExpr()); 11997 } 11998 11999 void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) { 12000 VisitOMPClauseWithPreInit(C); 12001 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt())); 12002 C->setNameModifierLoc(Record.readSourceLocation()); 12003 C->setColonLoc(Record.readSourceLocation()); 12004 C->setCondition(Record.readSubExpr()); 12005 C->setLParenLoc(Record.readSourceLocation()); 12006 } 12007 12008 void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) { 12009 VisitOMPClauseWithPreInit(C); 12010 C->setCondition(Record.readSubExpr()); 12011 C->setLParenLoc(Record.readSourceLocation()); 12012 } 12013 12014 void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) { 12015 VisitOMPClauseWithPreInit(C); 12016 C->setNumThreads(Record.readSubExpr()); 12017 C->setLParenLoc(Record.readSourceLocation()); 12018 } 12019 12020 void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) { 12021 C->setSafelen(Record.readSubExpr()); 12022 C->setLParenLoc(Record.readSourceLocation()); 12023 } 12024 12025 void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) { 12026 C->setSimdlen(Record.readSubExpr()); 12027 C->setLParenLoc(Record.readSourceLocation()); 12028 } 12029 12030 void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) { 12031 C->setAllocator(Record.readExpr()); 12032 C->setLParenLoc(Record.readSourceLocation()); 12033 } 12034 12035 void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) { 12036 C->setNumForLoops(Record.readSubExpr()); 12037 C->setLParenLoc(Record.readSourceLocation()); 12038 } 12039 12040 void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) { 12041 C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt())); 12042 C->setLParenLoc(Record.readSourceLocation()); 12043 C->setDefaultKindKwLoc(Record.readSourceLocation()); 12044 } 12045 12046 void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) { 12047 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt())); 12048 C->setLParenLoc(Record.readSourceLocation()); 12049 C->setProcBindKindKwLoc(Record.readSourceLocation()); 12050 } 12051 12052 void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) { 12053 VisitOMPClauseWithPreInit(C); 12054 C->setScheduleKind( 12055 static_cast<OpenMPScheduleClauseKind>(Record.readInt())); 12056 C->setFirstScheduleModifier( 12057 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 12058 C->setSecondScheduleModifier( 12059 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 12060 C->setChunkSize(Record.readSubExpr()); 12061 C->setLParenLoc(Record.readSourceLocation()); 12062 C->setFirstScheduleModifierLoc(Record.readSourceLocation()); 12063 C->setSecondScheduleModifierLoc(Record.readSourceLocation()); 12064 C->setScheduleKindLoc(Record.readSourceLocation()); 12065 C->setCommaLoc(Record.readSourceLocation()); 12066 } 12067 12068 void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) { 12069 C->setNumForLoops(Record.readSubExpr()); 12070 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 12071 C->setLoopNumIterations(I, Record.readSubExpr()); 12072 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 12073 C->setLoopCounter(I, Record.readSubExpr()); 12074 C->setLParenLoc(Record.readSourceLocation()); 12075 } 12076 12077 void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) { 12078 C->setEventHandler(Record.readSubExpr()); 12079 C->setLParenLoc(Record.readSourceLocation()); 12080 } 12081 12082 void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {} 12083 12084 void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {} 12085 12086 void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {} 12087 12088 void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {} 12089 12090 void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {} 12091 12092 void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) { 12093 if (C->isExtended()) { 12094 C->setLParenLoc(Record.readSourceLocation()); 12095 C->setArgumentLoc(Record.readSourceLocation()); 12096 C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>()); 12097 } 12098 } 12099 12100 void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {} 12101 12102 void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {} 12103 12104 void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {} 12105 12106 void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {} 12107 12108 void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {} 12109 12110 void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {} 12111 12112 void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {} 12113 12114 void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {} 12115 12116 void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {} 12117 12118 void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *) {} 12119 12120 void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {} 12121 12122 void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause( 12123 OMPUnifiedSharedMemoryClause *) {} 12124 12125 void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {} 12126 12127 void 12128 OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) { 12129 } 12130 12131 void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause( 12132 OMPAtomicDefaultMemOrderClause *C) { 12133 C->setAtomicDefaultMemOrderKind( 12134 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt())); 12135 C->setLParenLoc(Record.readSourceLocation()); 12136 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation()); 12137 } 12138 12139 void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) { 12140 C->setLParenLoc(Record.readSourceLocation()); 12141 unsigned NumVars = C->varlist_size(); 12142 SmallVector<Expr *, 16> Vars; 12143 Vars.reserve(NumVars); 12144 for (unsigned i = 0; i != NumVars; ++i) 12145 Vars.push_back(Record.readSubExpr()); 12146 C->setVarRefs(Vars); 12147 Vars.clear(); 12148 for (unsigned i = 0; i != NumVars; ++i) 12149 Vars.push_back(Record.readSubExpr()); 12150 C->setPrivateCopies(Vars); 12151 } 12152 12153 void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) { 12154 VisitOMPClauseWithPreInit(C); 12155 C->setLParenLoc(Record.readSourceLocation()); 12156 unsigned NumVars = C->varlist_size(); 12157 SmallVector<Expr *, 16> Vars; 12158 Vars.reserve(NumVars); 12159 for (unsigned i = 0; i != NumVars; ++i) 12160 Vars.push_back(Record.readSubExpr()); 12161 C->setVarRefs(Vars); 12162 Vars.clear(); 12163 for (unsigned i = 0; i != NumVars; ++i) 12164 Vars.push_back(Record.readSubExpr()); 12165 C->setPrivateCopies(Vars); 12166 Vars.clear(); 12167 for (unsigned i = 0; i != NumVars; ++i) 12168 Vars.push_back(Record.readSubExpr()); 12169 C->setInits(Vars); 12170 } 12171 12172 void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) { 12173 VisitOMPClauseWithPostUpdate(C); 12174 C->setLParenLoc(Record.readSourceLocation()); 12175 C->setKind(Record.readEnum<OpenMPLastprivateModifier>()); 12176 C->setKindLoc(Record.readSourceLocation()); 12177 C->setColonLoc(Record.readSourceLocation()); 12178 unsigned NumVars = C->varlist_size(); 12179 SmallVector<Expr *, 16> Vars; 12180 Vars.reserve(NumVars); 12181 for (unsigned i = 0; i != NumVars; ++i) 12182 Vars.push_back(Record.readSubExpr()); 12183 C->setVarRefs(Vars); 12184 Vars.clear(); 12185 for (unsigned i = 0; i != NumVars; ++i) 12186 Vars.push_back(Record.readSubExpr()); 12187 C->setPrivateCopies(Vars); 12188 Vars.clear(); 12189 for (unsigned i = 0; i != NumVars; ++i) 12190 Vars.push_back(Record.readSubExpr()); 12191 C->setSourceExprs(Vars); 12192 Vars.clear(); 12193 for (unsigned i = 0; i != NumVars; ++i) 12194 Vars.push_back(Record.readSubExpr()); 12195 C->setDestinationExprs(Vars); 12196 Vars.clear(); 12197 for (unsigned i = 0; i != NumVars; ++i) 12198 Vars.push_back(Record.readSubExpr()); 12199 C->setAssignmentOps(Vars); 12200 } 12201 12202 void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) { 12203 C->setLParenLoc(Record.readSourceLocation()); 12204 unsigned NumVars = C->varlist_size(); 12205 SmallVector<Expr *, 16> Vars; 12206 Vars.reserve(NumVars); 12207 for (unsigned i = 0; i != NumVars; ++i) 12208 Vars.push_back(Record.readSubExpr()); 12209 C->setVarRefs(Vars); 12210 } 12211 12212 void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) { 12213 VisitOMPClauseWithPostUpdate(C); 12214 C->setLParenLoc(Record.readSourceLocation()); 12215 C->setModifierLoc(Record.readSourceLocation()); 12216 C->setColonLoc(Record.readSourceLocation()); 12217 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12218 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12219 C->setQualifierLoc(NNSL); 12220 C->setNameInfo(DNI); 12221 12222 unsigned NumVars = C->varlist_size(); 12223 SmallVector<Expr *, 16> Vars; 12224 Vars.reserve(NumVars); 12225 for (unsigned i = 0; i != NumVars; ++i) 12226 Vars.push_back(Record.readSubExpr()); 12227 C->setVarRefs(Vars); 12228 Vars.clear(); 12229 for (unsigned i = 0; i != NumVars; ++i) 12230 Vars.push_back(Record.readSubExpr()); 12231 C->setPrivates(Vars); 12232 Vars.clear(); 12233 for (unsigned i = 0; i != NumVars; ++i) 12234 Vars.push_back(Record.readSubExpr()); 12235 C->setLHSExprs(Vars); 12236 Vars.clear(); 12237 for (unsigned i = 0; i != NumVars; ++i) 12238 Vars.push_back(Record.readSubExpr()); 12239 C->setRHSExprs(Vars); 12240 Vars.clear(); 12241 for (unsigned i = 0; i != NumVars; ++i) 12242 Vars.push_back(Record.readSubExpr()); 12243 C->setReductionOps(Vars); 12244 if (C->getModifier() == OMPC_REDUCTION_inscan) { 12245 Vars.clear(); 12246 for (unsigned i = 0; i != NumVars; ++i) 12247 Vars.push_back(Record.readSubExpr()); 12248 C->setInscanCopyOps(Vars); 12249 Vars.clear(); 12250 for (unsigned i = 0; i != NumVars; ++i) 12251 Vars.push_back(Record.readSubExpr()); 12252 C->setInscanCopyArrayTemps(Vars); 12253 Vars.clear(); 12254 for (unsigned i = 0; i != NumVars; ++i) 12255 Vars.push_back(Record.readSubExpr()); 12256 C->setInscanCopyArrayElems(Vars); 12257 } 12258 } 12259 12260 void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) { 12261 VisitOMPClauseWithPostUpdate(C); 12262 C->setLParenLoc(Record.readSourceLocation()); 12263 C->setColonLoc(Record.readSourceLocation()); 12264 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12265 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12266 C->setQualifierLoc(NNSL); 12267 C->setNameInfo(DNI); 12268 12269 unsigned NumVars = C->varlist_size(); 12270 SmallVector<Expr *, 16> Vars; 12271 Vars.reserve(NumVars); 12272 for (unsigned I = 0; I != NumVars; ++I) 12273 Vars.push_back(Record.readSubExpr()); 12274 C->setVarRefs(Vars); 12275 Vars.clear(); 12276 for (unsigned I = 0; I != NumVars; ++I) 12277 Vars.push_back(Record.readSubExpr()); 12278 C->setPrivates(Vars); 12279 Vars.clear(); 12280 for (unsigned I = 0; I != NumVars; ++I) 12281 Vars.push_back(Record.readSubExpr()); 12282 C->setLHSExprs(Vars); 12283 Vars.clear(); 12284 for (unsigned I = 0; I != NumVars; ++I) 12285 Vars.push_back(Record.readSubExpr()); 12286 C->setRHSExprs(Vars); 12287 Vars.clear(); 12288 for (unsigned I = 0; I != NumVars; ++I) 12289 Vars.push_back(Record.readSubExpr()); 12290 C->setReductionOps(Vars); 12291 } 12292 12293 void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) { 12294 VisitOMPClauseWithPostUpdate(C); 12295 C->setLParenLoc(Record.readSourceLocation()); 12296 C->setColonLoc(Record.readSourceLocation()); 12297 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12298 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12299 C->setQualifierLoc(NNSL); 12300 C->setNameInfo(DNI); 12301 12302 unsigned NumVars = C->varlist_size(); 12303 SmallVector<Expr *, 16> Vars; 12304 Vars.reserve(NumVars); 12305 for (unsigned I = 0; I != NumVars; ++I) 12306 Vars.push_back(Record.readSubExpr()); 12307 C->setVarRefs(Vars); 12308 Vars.clear(); 12309 for (unsigned I = 0; I != NumVars; ++I) 12310 Vars.push_back(Record.readSubExpr()); 12311 C->setPrivates(Vars); 12312 Vars.clear(); 12313 for (unsigned I = 0; I != NumVars; ++I) 12314 Vars.push_back(Record.readSubExpr()); 12315 C->setLHSExprs(Vars); 12316 Vars.clear(); 12317 for (unsigned I = 0; I != NumVars; ++I) 12318 Vars.push_back(Record.readSubExpr()); 12319 C->setRHSExprs(Vars); 12320 Vars.clear(); 12321 for (unsigned I = 0; I != NumVars; ++I) 12322 Vars.push_back(Record.readSubExpr()); 12323 C->setReductionOps(Vars); 12324 Vars.clear(); 12325 for (unsigned I = 0; I != NumVars; ++I) 12326 Vars.push_back(Record.readSubExpr()); 12327 C->setTaskgroupDescriptors(Vars); 12328 } 12329 12330 void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) { 12331 VisitOMPClauseWithPostUpdate(C); 12332 C->setLParenLoc(Record.readSourceLocation()); 12333 C->setColonLoc(Record.readSourceLocation()); 12334 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt())); 12335 C->setModifierLoc(Record.readSourceLocation()); 12336 unsigned NumVars = C->varlist_size(); 12337 SmallVector<Expr *, 16> Vars; 12338 Vars.reserve(NumVars); 12339 for (unsigned i = 0; i != NumVars; ++i) 12340 Vars.push_back(Record.readSubExpr()); 12341 C->setVarRefs(Vars); 12342 Vars.clear(); 12343 for (unsigned i = 0; i != NumVars; ++i) 12344 Vars.push_back(Record.readSubExpr()); 12345 C->setPrivates(Vars); 12346 Vars.clear(); 12347 for (unsigned i = 0; i != NumVars; ++i) 12348 Vars.push_back(Record.readSubExpr()); 12349 C->setInits(Vars); 12350 Vars.clear(); 12351 for (unsigned i = 0; i != NumVars; ++i) 12352 Vars.push_back(Record.readSubExpr()); 12353 C->setUpdates(Vars); 12354 Vars.clear(); 12355 for (unsigned i = 0; i != NumVars; ++i) 12356 Vars.push_back(Record.readSubExpr()); 12357 C->setFinals(Vars); 12358 C->setStep(Record.readSubExpr()); 12359 C->setCalcStep(Record.readSubExpr()); 12360 Vars.clear(); 12361 for (unsigned I = 0; I != NumVars + 1; ++I) 12362 Vars.push_back(Record.readSubExpr()); 12363 C->setUsedExprs(Vars); 12364 } 12365 12366 void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) { 12367 C->setLParenLoc(Record.readSourceLocation()); 12368 C->setColonLoc(Record.readSourceLocation()); 12369 unsigned NumVars = C->varlist_size(); 12370 SmallVector<Expr *, 16> Vars; 12371 Vars.reserve(NumVars); 12372 for (unsigned i = 0; i != NumVars; ++i) 12373 Vars.push_back(Record.readSubExpr()); 12374 C->setVarRefs(Vars); 12375 C->setAlignment(Record.readSubExpr()); 12376 } 12377 12378 void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) { 12379 C->setLParenLoc(Record.readSourceLocation()); 12380 unsigned NumVars = C->varlist_size(); 12381 SmallVector<Expr *, 16> Exprs; 12382 Exprs.reserve(NumVars); 12383 for (unsigned i = 0; i != NumVars; ++i) 12384 Exprs.push_back(Record.readSubExpr()); 12385 C->setVarRefs(Exprs); 12386 Exprs.clear(); 12387 for (unsigned i = 0; i != NumVars; ++i) 12388 Exprs.push_back(Record.readSubExpr()); 12389 C->setSourceExprs(Exprs); 12390 Exprs.clear(); 12391 for (unsigned i = 0; i != NumVars; ++i) 12392 Exprs.push_back(Record.readSubExpr()); 12393 C->setDestinationExprs(Exprs); 12394 Exprs.clear(); 12395 for (unsigned i = 0; i != NumVars; ++i) 12396 Exprs.push_back(Record.readSubExpr()); 12397 C->setAssignmentOps(Exprs); 12398 } 12399 12400 void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) { 12401 C->setLParenLoc(Record.readSourceLocation()); 12402 unsigned NumVars = C->varlist_size(); 12403 SmallVector<Expr *, 16> Exprs; 12404 Exprs.reserve(NumVars); 12405 for (unsigned i = 0; i != NumVars; ++i) 12406 Exprs.push_back(Record.readSubExpr()); 12407 C->setVarRefs(Exprs); 12408 Exprs.clear(); 12409 for (unsigned i = 0; i != NumVars; ++i) 12410 Exprs.push_back(Record.readSubExpr()); 12411 C->setSourceExprs(Exprs); 12412 Exprs.clear(); 12413 for (unsigned i = 0; i != NumVars; ++i) 12414 Exprs.push_back(Record.readSubExpr()); 12415 C->setDestinationExprs(Exprs); 12416 Exprs.clear(); 12417 for (unsigned i = 0; i != NumVars; ++i) 12418 Exprs.push_back(Record.readSubExpr()); 12419 C->setAssignmentOps(Exprs); 12420 } 12421 12422 void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) { 12423 C->setLParenLoc(Record.readSourceLocation()); 12424 unsigned NumVars = C->varlist_size(); 12425 SmallVector<Expr *, 16> Vars; 12426 Vars.reserve(NumVars); 12427 for (unsigned i = 0; i != NumVars; ++i) 12428 Vars.push_back(Record.readSubExpr()); 12429 C->setVarRefs(Vars); 12430 } 12431 12432 void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) { 12433 C->setDepobj(Record.readSubExpr()); 12434 C->setLParenLoc(Record.readSourceLocation()); 12435 } 12436 12437 void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) { 12438 C->setLParenLoc(Record.readSourceLocation()); 12439 C->setModifier(Record.readSubExpr()); 12440 C->setDependencyKind( 12441 static_cast<OpenMPDependClauseKind>(Record.readInt())); 12442 C->setDependencyLoc(Record.readSourceLocation()); 12443 C->setColonLoc(Record.readSourceLocation()); 12444 unsigned NumVars = C->varlist_size(); 12445 SmallVector<Expr *, 16> Vars; 12446 Vars.reserve(NumVars); 12447 for (unsigned I = 0; I != NumVars; ++I) 12448 Vars.push_back(Record.readSubExpr()); 12449 C->setVarRefs(Vars); 12450 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I) 12451 C->setLoopData(I, Record.readSubExpr()); 12452 } 12453 12454 void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) { 12455 VisitOMPClauseWithPreInit(C); 12456 C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>()); 12457 C->setDevice(Record.readSubExpr()); 12458 C->setModifierLoc(Record.readSourceLocation()); 12459 C->setLParenLoc(Record.readSourceLocation()); 12460 } 12461 12462 void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) { 12463 C->setLParenLoc(Record.readSourceLocation()); 12464 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) { 12465 C->setMapTypeModifier( 12466 I, static_cast<OpenMPMapModifierKind>(Record.readInt())); 12467 C->setMapTypeModifierLoc(I, Record.readSourceLocation()); 12468 } 12469 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12470 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12471 C->setMapType( 12472 static_cast<OpenMPMapClauseKind>(Record.readInt())); 12473 C->setMapLoc(Record.readSourceLocation()); 12474 C->setColonLoc(Record.readSourceLocation()); 12475 auto NumVars = C->varlist_size(); 12476 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12477 auto TotalLists = C->getTotalComponentListNum(); 12478 auto TotalComponents = C->getTotalComponentsNum(); 12479 12480 SmallVector<Expr *, 16> Vars; 12481 Vars.reserve(NumVars); 12482 for (unsigned i = 0; i != NumVars; ++i) 12483 Vars.push_back(Record.readExpr()); 12484 C->setVarRefs(Vars); 12485 12486 SmallVector<Expr *, 16> UDMappers; 12487 UDMappers.reserve(NumVars); 12488 for (unsigned I = 0; I < NumVars; ++I) 12489 UDMappers.push_back(Record.readExpr()); 12490 C->setUDMapperRefs(UDMappers); 12491 12492 SmallVector<ValueDecl *, 16> Decls; 12493 Decls.reserve(UniqueDecls); 12494 for (unsigned i = 0; i < UniqueDecls; ++i) 12495 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12496 C->setUniqueDecls(Decls); 12497 12498 SmallVector<unsigned, 16> ListsPerDecl; 12499 ListsPerDecl.reserve(UniqueDecls); 12500 for (unsigned i = 0; i < UniqueDecls; ++i) 12501 ListsPerDecl.push_back(Record.readInt()); 12502 C->setDeclNumLists(ListsPerDecl); 12503 12504 SmallVector<unsigned, 32> ListSizes; 12505 ListSizes.reserve(TotalLists); 12506 for (unsigned i = 0; i < TotalLists; ++i) 12507 ListSizes.push_back(Record.readInt()); 12508 C->setComponentListSizes(ListSizes); 12509 12510 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12511 Components.reserve(TotalComponents); 12512 for (unsigned i = 0; i < TotalComponents; ++i) { 12513 Expr *AssociatedExpr = Record.readExpr(); 12514 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12515 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12516 AssociatedExpr, AssociatedDecl)); 12517 } 12518 C->setComponents(Components, ListSizes); 12519 } 12520 12521 void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) { 12522 C->setLParenLoc(Record.readSourceLocation()); 12523 C->setColonLoc(Record.readSourceLocation()); 12524 C->setAllocator(Record.readSubExpr()); 12525 unsigned NumVars = C->varlist_size(); 12526 SmallVector<Expr *, 16> Vars; 12527 Vars.reserve(NumVars); 12528 for (unsigned i = 0; i != NumVars; ++i) 12529 Vars.push_back(Record.readSubExpr()); 12530 C->setVarRefs(Vars); 12531 } 12532 12533 void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) { 12534 VisitOMPClauseWithPreInit(C); 12535 C->setNumTeams(Record.readSubExpr()); 12536 C->setLParenLoc(Record.readSourceLocation()); 12537 } 12538 12539 void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) { 12540 VisitOMPClauseWithPreInit(C); 12541 C->setThreadLimit(Record.readSubExpr()); 12542 C->setLParenLoc(Record.readSourceLocation()); 12543 } 12544 12545 void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) { 12546 VisitOMPClauseWithPreInit(C); 12547 C->setPriority(Record.readSubExpr()); 12548 C->setLParenLoc(Record.readSourceLocation()); 12549 } 12550 12551 void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) { 12552 VisitOMPClauseWithPreInit(C); 12553 C->setGrainsize(Record.readSubExpr()); 12554 C->setLParenLoc(Record.readSourceLocation()); 12555 } 12556 12557 void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) { 12558 VisitOMPClauseWithPreInit(C); 12559 C->setNumTasks(Record.readSubExpr()); 12560 C->setLParenLoc(Record.readSourceLocation()); 12561 } 12562 12563 void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) { 12564 C->setHint(Record.readSubExpr()); 12565 C->setLParenLoc(Record.readSourceLocation()); 12566 } 12567 12568 void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) { 12569 VisitOMPClauseWithPreInit(C); 12570 C->setDistScheduleKind( 12571 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt())); 12572 C->setChunkSize(Record.readSubExpr()); 12573 C->setLParenLoc(Record.readSourceLocation()); 12574 C->setDistScheduleKindLoc(Record.readSourceLocation()); 12575 C->setCommaLoc(Record.readSourceLocation()); 12576 } 12577 12578 void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) { 12579 C->setDefaultmapKind( 12580 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt())); 12581 C->setDefaultmapModifier( 12582 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt())); 12583 C->setLParenLoc(Record.readSourceLocation()); 12584 C->setDefaultmapModifierLoc(Record.readSourceLocation()); 12585 C->setDefaultmapKindLoc(Record.readSourceLocation()); 12586 } 12587 12588 void OMPClauseReader::VisitOMPToClause(OMPToClause *C) { 12589 C->setLParenLoc(Record.readSourceLocation()); 12590 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12591 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12592 auto NumVars = C->varlist_size(); 12593 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12594 auto TotalLists = C->getTotalComponentListNum(); 12595 auto TotalComponents = C->getTotalComponentsNum(); 12596 12597 SmallVector<Expr *, 16> Vars; 12598 Vars.reserve(NumVars); 12599 for (unsigned i = 0; i != NumVars; ++i) 12600 Vars.push_back(Record.readSubExpr()); 12601 C->setVarRefs(Vars); 12602 12603 SmallVector<Expr *, 16> UDMappers; 12604 UDMappers.reserve(NumVars); 12605 for (unsigned I = 0; I < NumVars; ++I) 12606 UDMappers.push_back(Record.readSubExpr()); 12607 C->setUDMapperRefs(UDMappers); 12608 12609 SmallVector<ValueDecl *, 16> Decls; 12610 Decls.reserve(UniqueDecls); 12611 for (unsigned i = 0; i < UniqueDecls; ++i) 12612 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12613 C->setUniqueDecls(Decls); 12614 12615 SmallVector<unsigned, 16> ListsPerDecl; 12616 ListsPerDecl.reserve(UniqueDecls); 12617 for (unsigned i = 0; i < UniqueDecls; ++i) 12618 ListsPerDecl.push_back(Record.readInt()); 12619 C->setDeclNumLists(ListsPerDecl); 12620 12621 SmallVector<unsigned, 32> ListSizes; 12622 ListSizes.reserve(TotalLists); 12623 for (unsigned i = 0; i < TotalLists; ++i) 12624 ListSizes.push_back(Record.readInt()); 12625 C->setComponentListSizes(ListSizes); 12626 12627 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12628 Components.reserve(TotalComponents); 12629 for (unsigned i = 0; i < TotalComponents; ++i) { 12630 Expr *AssociatedExpr = Record.readSubExpr(); 12631 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12632 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12633 AssociatedExpr, AssociatedDecl)); 12634 } 12635 C->setComponents(Components, ListSizes); 12636 } 12637 12638 void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) { 12639 C->setLParenLoc(Record.readSourceLocation()); 12640 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12641 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12642 auto NumVars = C->varlist_size(); 12643 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12644 auto TotalLists = C->getTotalComponentListNum(); 12645 auto TotalComponents = C->getTotalComponentsNum(); 12646 12647 SmallVector<Expr *, 16> Vars; 12648 Vars.reserve(NumVars); 12649 for (unsigned i = 0; i != NumVars; ++i) 12650 Vars.push_back(Record.readSubExpr()); 12651 C->setVarRefs(Vars); 12652 12653 SmallVector<Expr *, 16> UDMappers; 12654 UDMappers.reserve(NumVars); 12655 for (unsigned I = 0; I < NumVars; ++I) 12656 UDMappers.push_back(Record.readSubExpr()); 12657 C->setUDMapperRefs(UDMappers); 12658 12659 SmallVector<ValueDecl *, 16> Decls; 12660 Decls.reserve(UniqueDecls); 12661 for (unsigned i = 0; i < UniqueDecls; ++i) 12662 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12663 C->setUniqueDecls(Decls); 12664 12665 SmallVector<unsigned, 16> ListsPerDecl; 12666 ListsPerDecl.reserve(UniqueDecls); 12667 for (unsigned i = 0; i < UniqueDecls; ++i) 12668 ListsPerDecl.push_back(Record.readInt()); 12669 C->setDeclNumLists(ListsPerDecl); 12670 12671 SmallVector<unsigned, 32> ListSizes; 12672 ListSizes.reserve(TotalLists); 12673 for (unsigned i = 0; i < TotalLists; ++i) 12674 ListSizes.push_back(Record.readInt()); 12675 C->setComponentListSizes(ListSizes); 12676 12677 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12678 Components.reserve(TotalComponents); 12679 for (unsigned i = 0; i < TotalComponents; ++i) { 12680 Expr *AssociatedExpr = Record.readSubExpr(); 12681 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12682 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12683 AssociatedExpr, AssociatedDecl)); 12684 } 12685 C->setComponents(Components, ListSizes); 12686 } 12687 12688 void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) { 12689 C->setLParenLoc(Record.readSourceLocation()); 12690 auto NumVars = C->varlist_size(); 12691 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12692 auto TotalLists = C->getTotalComponentListNum(); 12693 auto TotalComponents = C->getTotalComponentsNum(); 12694 12695 SmallVector<Expr *, 16> Vars; 12696 Vars.reserve(NumVars); 12697 for (unsigned i = 0; i != NumVars; ++i) 12698 Vars.push_back(Record.readSubExpr()); 12699 C->setVarRefs(Vars); 12700 Vars.clear(); 12701 for (unsigned i = 0; i != NumVars; ++i) 12702 Vars.push_back(Record.readSubExpr()); 12703 C->setPrivateCopies(Vars); 12704 Vars.clear(); 12705 for (unsigned i = 0; i != NumVars; ++i) 12706 Vars.push_back(Record.readSubExpr()); 12707 C->setInits(Vars); 12708 12709 SmallVector<ValueDecl *, 16> Decls; 12710 Decls.reserve(UniqueDecls); 12711 for (unsigned i = 0; i < UniqueDecls; ++i) 12712 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12713 C->setUniqueDecls(Decls); 12714 12715 SmallVector<unsigned, 16> ListsPerDecl; 12716 ListsPerDecl.reserve(UniqueDecls); 12717 for (unsigned i = 0; i < UniqueDecls; ++i) 12718 ListsPerDecl.push_back(Record.readInt()); 12719 C->setDeclNumLists(ListsPerDecl); 12720 12721 SmallVector<unsigned, 32> ListSizes; 12722 ListSizes.reserve(TotalLists); 12723 for (unsigned i = 0; i < TotalLists; ++i) 12724 ListSizes.push_back(Record.readInt()); 12725 C->setComponentListSizes(ListSizes); 12726 12727 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12728 Components.reserve(TotalComponents); 12729 for (unsigned i = 0; i < TotalComponents; ++i) { 12730 Expr *AssociatedExpr = Record.readSubExpr(); 12731 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12732 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12733 AssociatedExpr, AssociatedDecl)); 12734 } 12735 C->setComponents(Components, ListSizes); 12736 } 12737 12738 void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) { 12739 C->setLParenLoc(Record.readSourceLocation()); 12740 auto NumVars = C->varlist_size(); 12741 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12742 auto TotalLists = C->getTotalComponentListNum(); 12743 auto TotalComponents = C->getTotalComponentsNum(); 12744 12745 SmallVector<Expr *, 16> Vars; 12746 Vars.reserve(NumVars); 12747 for (unsigned i = 0; i != NumVars; ++i) 12748 Vars.push_back(Record.readSubExpr()); 12749 C->setVarRefs(Vars); 12750 12751 SmallVector<ValueDecl *, 16> Decls; 12752 Decls.reserve(UniqueDecls); 12753 for (unsigned i = 0; i < UniqueDecls; ++i) 12754 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12755 C->setUniqueDecls(Decls); 12756 12757 SmallVector<unsigned, 16> ListsPerDecl; 12758 ListsPerDecl.reserve(UniqueDecls); 12759 for (unsigned i = 0; i < UniqueDecls; ++i) 12760 ListsPerDecl.push_back(Record.readInt()); 12761 C->setDeclNumLists(ListsPerDecl); 12762 12763 SmallVector<unsigned, 32> ListSizes; 12764 ListSizes.reserve(TotalLists); 12765 for (unsigned i = 0; i < TotalLists; ++i) 12766 ListSizes.push_back(Record.readInt()); 12767 C->setComponentListSizes(ListSizes); 12768 12769 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12770 Components.reserve(TotalComponents); 12771 for (unsigned i = 0; i < TotalComponents; ++i) { 12772 Expr *AssociatedExpr = Record.readSubExpr(); 12773 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12774 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12775 AssociatedExpr, AssociatedDecl)); 12776 } 12777 C->setComponents(Components, ListSizes); 12778 } 12779 12780 void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 12781 C->setLParenLoc(Record.readSourceLocation()); 12782 auto NumVars = C->varlist_size(); 12783 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12784 auto TotalLists = C->getTotalComponentListNum(); 12785 auto TotalComponents = C->getTotalComponentsNum(); 12786 12787 SmallVector<Expr *, 16> Vars; 12788 Vars.reserve(NumVars); 12789 for (unsigned i = 0; i != NumVars; ++i) 12790 Vars.push_back(Record.readSubExpr()); 12791 C->setVarRefs(Vars); 12792 Vars.clear(); 12793 12794 SmallVector<ValueDecl *, 16> Decls; 12795 Decls.reserve(UniqueDecls); 12796 for (unsigned i = 0; i < UniqueDecls; ++i) 12797 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12798 C->setUniqueDecls(Decls); 12799 12800 SmallVector<unsigned, 16> ListsPerDecl; 12801 ListsPerDecl.reserve(UniqueDecls); 12802 for (unsigned i = 0; i < UniqueDecls; ++i) 12803 ListsPerDecl.push_back(Record.readInt()); 12804 C->setDeclNumLists(ListsPerDecl); 12805 12806 SmallVector<unsigned, 32> ListSizes; 12807 ListSizes.reserve(TotalLists); 12808 for (unsigned i = 0; i < TotalLists; ++i) 12809 ListSizes.push_back(Record.readInt()); 12810 C->setComponentListSizes(ListSizes); 12811 12812 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12813 Components.reserve(TotalComponents); 12814 for (unsigned i = 0; i < TotalComponents; ++i) { 12815 Expr *AssociatedExpr = Record.readSubExpr(); 12816 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12817 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12818 AssociatedExpr, AssociatedDecl)); 12819 } 12820 C->setComponents(Components, ListSizes); 12821 } 12822 12823 void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) { 12824 C->setLParenLoc(Record.readSourceLocation()); 12825 unsigned NumVars = C->varlist_size(); 12826 SmallVector<Expr *, 16> Vars; 12827 Vars.reserve(NumVars); 12828 for (unsigned i = 0; i != NumVars; ++i) 12829 Vars.push_back(Record.readSubExpr()); 12830 C->setVarRefs(Vars); 12831 Vars.clear(); 12832 Vars.reserve(NumVars); 12833 for (unsigned i = 0; i != NumVars; ++i) 12834 Vars.push_back(Record.readSubExpr()); 12835 C->setPrivateRefs(Vars); 12836 } 12837 12838 void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) { 12839 C->setLParenLoc(Record.readSourceLocation()); 12840 unsigned NumVars = C->varlist_size(); 12841 SmallVector<Expr *, 16> Vars; 12842 Vars.reserve(NumVars); 12843 for (unsigned i = 0; i != NumVars; ++i) 12844 Vars.push_back(Record.readSubExpr()); 12845 C->setVarRefs(Vars); 12846 } 12847 12848 void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) { 12849 C->setLParenLoc(Record.readSourceLocation()); 12850 unsigned NumVars = C->varlist_size(); 12851 SmallVector<Expr *, 16> Vars; 12852 Vars.reserve(NumVars); 12853 for (unsigned i = 0; i != NumVars; ++i) 12854 Vars.push_back(Record.readSubExpr()); 12855 C->setVarRefs(Vars); 12856 } 12857 12858 void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) { 12859 C->setLParenLoc(Record.readSourceLocation()); 12860 unsigned NumOfAllocators = C->getNumberOfAllocators(); 12861 SmallVector<OMPUsesAllocatorsClause::Data, 4> Data; 12862 Data.reserve(NumOfAllocators); 12863 for (unsigned I = 0; I != NumOfAllocators; ++I) { 12864 OMPUsesAllocatorsClause::Data &D = Data.emplace_back(); 12865 D.Allocator = Record.readSubExpr(); 12866 D.AllocatorTraits = Record.readSubExpr(); 12867 D.LParenLoc = Record.readSourceLocation(); 12868 D.RParenLoc = Record.readSourceLocation(); 12869 } 12870 C->setAllocatorsData(Data); 12871 } 12872 12873 void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) { 12874 C->setLParenLoc(Record.readSourceLocation()); 12875 C->setModifier(Record.readSubExpr()); 12876 C->setColonLoc(Record.readSourceLocation()); 12877 unsigned NumOfLocators = C->varlist_size(); 12878 SmallVector<Expr *, 4> Locators; 12879 Locators.reserve(NumOfLocators); 12880 for (unsigned I = 0; I != NumOfLocators; ++I) 12881 Locators.push_back(Record.readSubExpr()); 12882 C->setVarRefs(Locators); 12883 } 12884 12885 void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) { 12886 C->setKind(Record.readEnum<OpenMPOrderClauseKind>()); 12887 C->setLParenLoc(Record.readSourceLocation()); 12888 C->setKindKwLoc(Record.readSourceLocation()); 12889 } 12890 12891 OMPTraitInfo *ASTRecordReader::readOMPTraitInfo() { 12892 OMPTraitInfo &TI = getContext().getNewOMPTraitInfo(); 12893 TI.Sets.resize(readUInt32()); 12894 for (auto &Set : TI.Sets) { 12895 Set.Kind = readEnum<llvm::omp::TraitSet>(); 12896 Set.Selectors.resize(readUInt32()); 12897 for (auto &Selector : Set.Selectors) { 12898 Selector.Kind = readEnum<llvm::omp::TraitSelector>(); 12899 Selector.ScoreOrCondition = nullptr; 12900 if (readBool()) 12901 Selector.ScoreOrCondition = readExprRef(); 12902 Selector.Properties.resize(readUInt32()); 12903 for (auto &Property : Selector.Properties) 12904 Property.Kind = readEnum<llvm::omp::TraitProperty>(); 12905 } 12906 } 12907 return &TI; 12908 } 12909