1 //===- ASTReader.cpp - AST File Reader ------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the ASTReader class, which reads AST files. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "clang/Serialization/ASTReader.h" 15 #include "ASTCommon.h" 16 #include "ASTReaderInternals.h" 17 #include "clang/AST/ASTConsumer.h" 18 #include "clang/AST/ASTContext.h" 19 #include "clang/AST/ASTMutationListener.h" 20 #include "clang/AST/ASTUnresolvedSet.h" 21 #include "clang/AST/Decl.h" 22 #include "clang/AST/DeclBase.h" 23 #include "clang/AST/DeclCXX.h" 24 #include "clang/AST/DeclFriend.h" 25 #include "clang/AST/DeclGroup.h" 26 #include "clang/AST/DeclObjC.h" 27 #include "clang/AST/DeclTemplate.h" 28 #include "clang/AST/DeclarationName.h" 29 #include "clang/AST/Expr.h" 30 #include "clang/AST/ExprCXX.h" 31 #include "clang/AST/ExternalASTSource.h" 32 #include "clang/AST/NestedNameSpecifier.h" 33 #include "clang/AST/ODRHash.h" 34 #include "clang/AST/RawCommentList.h" 35 #include "clang/AST/TemplateBase.h" 36 #include "clang/AST/TemplateName.h" 37 #include "clang/AST/Type.h" 38 #include "clang/AST/TypeLoc.h" 39 #include "clang/AST/TypeLocVisitor.h" 40 #include "clang/AST/UnresolvedSet.h" 41 #include "clang/Basic/CommentOptions.h" 42 #include "clang/Basic/Diagnostic.h" 43 #include "clang/Basic/DiagnosticOptions.h" 44 #include "clang/Basic/ExceptionSpecificationType.h" 45 #include "clang/Basic/FileManager.h" 46 #include "clang/Basic/FileSystemOptions.h" 47 #include "clang/Basic/IdentifierTable.h" 48 #include "clang/Basic/LLVM.h" 49 #include "clang/Basic/LangOptions.h" 50 #include "clang/Basic/MemoryBufferCache.h" 51 #include "clang/Basic/Module.h" 52 #include "clang/Basic/ObjCRuntime.h" 53 #include "clang/Basic/OperatorKinds.h" 54 #include "clang/Basic/PragmaKinds.h" 55 #include "clang/Basic/Sanitizers.h" 56 #include "clang/Basic/SourceLocation.h" 57 #include "clang/Basic/SourceManager.h" 58 #include "clang/Basic/SourceManagerInternals.h" 59 #include "clang/Basic/Specifiers.h" 60 #include "clang/Basic/TargetInfo.h" 61 #include "clang/Basic/TargetOptions.h" 62 #include "clang/Basic/TokenKinds.h" 63 #include "clang/Basic/Version.h" 64 #include "clang/Basic/VersionTuple.h" 65 #include "clang/Frontend/PCHContainerOperations.h" 66 #include "clang/Lex/HeaderSearch.h" 67 #include "clang/Lex/HeaderSearchOptions.h" 68 #include "clang/Lex/MacroInfo.h" 69 #include "clang/Lex/ModuleMap.h" 70 #include "clang/Lex/PreprocessingRecord.h" 71 #include "clang/Lex/Preprocessor.h" 72 #include "clang/Lex/PreprocessorOptions.h" 73 #include "clang/Lex/Token.h" 74 #include "clang/Sema/ObjCMethodList.h" 75 #include "clang/Sema/Scope.h" 76 #include "clang/Sema/Sema.h" 77 #include "clang/Sema/Weak.h" 78 #include "clang/Serialization/ASTBitCodes.h" 79 #include "clang/Serialization/ASTDeserializationListener.h" 80 #include "clang/Serialization/ContinuousRangeMap.h" 81 #include "clang/Serialization/GlobalModuleIndex.h" 82 #include "clang/Serialization/Module.h" 83 #include "clang/Serialization/ModuleFileExtension.h" 84 #include "clang/Serialization/ModuleManager.h" 85 #include "clang/Serialization/SerializationDiagnostic.h" 86 #include "llvm/ADT/APFloat.h" 87 #include "llvm/ADT/APInt.h" 88 #include "llvm/ADT/APSInt.h" 89 #include "llvm/ADT/ArrayRef.h" 90 #include "llvm/ADT/DenseMap.h" 91 #include "llvm/ADT/FoldingSet.h" 92 #include "llvm/ADT/Hashing.h" 93 #include "llvm/ADT/IntrusiveRefCntPtr.h" 94 #include "llvm/ADT/None.h" 95 #include "llvm/ADT/Optional.h" 96 #include "llvm/ADT/STLExtras.h" 97 #include "llvm/ADT/SmallPtrSet.h" 98 #include "llvm/ADT/SmallString.h" 99 #include "llvm/ADT/SmallVector.h" 100 #include "llvm/ADT/StringExtras.h" 101 #include "llvm/ADT/StringMap.h" 102 #include "llvm/ADT/StringRef.h" 103 #include "llvm/ADT/Triple.h" 104 #include "llvm/ADT/iterator_range.h" 105 #include "llvm/Bitcode/BitstreamReader.h" 106 #include "llvm/Support/Casting.h" 107 #include "llvm/Support/Compression.h" 108 #include "llvm/Support/Compiler.h" 109 #include "llvm/Support/DJB.h" 110 #include "llvm/Support/Endian.h" 111 #include "llvm/Support/Error.h" 112 #include "llvm/Support/ErrorHandling.h" 113 #include "llvm/Support/FileSystem.h" 114 #include "llvm/Support/MemoryBuffer.h" 115 #include "llvm/Support/Path.h" 116 #include "llvm/Support/SaveAndRestore.h" 117 #include "llvm/Support/Timer.h" 118 #include "llvm/Support/raw_ostream.h" 119 #include <algorithm> 120 #include <cassert> 121 #include <cstddef> 122 #include <cstdint> 123 #include <cstdio> 124 #include <ctime> 125 #include <iterator> 126 #include <limits> 127 #include <map> 128 #include <memory> 129 #include <string> 130 #include <system_error> 131 #include <tuple> 132 #include <utility> 133 #include <vector> 134 135 using namespace clang; 136 using namespace clang::serialization; 137 using namespace clang::serialization::reader; 138 using llvm::BitstreamCursor; 139 140 //===----------------------------------------------------------------------===// 141 // ChainedASTReaderListener implementation 142 //===----------------------------------------------------------------------===// 143 144 bool 145 ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) { 146 return First->ReadFullVersionInformation(FullVersion) || 147 Second->ReadFullVersionInformation(FullVersion); 148 } 149 150 void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) { 151 First->ReadModuleName(ModuleName); 152 Second->ReadModuleName(ModuleName); 153 } 154 155 void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) { 156 First->ReadModuleMapFile(ModuleMapPath); 157 Second->ReadModuleMapFile(ModuleMapPath); 158 } 159 160 bool 161 ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts, 162 bool Complain, 163 bool AllowCompatibleDifferences) { 164 return First->ReadLanguageOptions(LangOpts, Complain, 165 AllowCompatibleDifferences) || 166 Second->ReadLanguageOptions(LangOpts, Complain, 167 AllowCompatibleDifferences); 168 } 169 170 bool ChainedASTReaderListener::ReadTargetOptions( 171 const TargetOptions &TargetOpts, bool Complain, 172 bool AllowCompatibleDifferences) { 173 return First->ReadTargetOptions(TargetOpts, Complain, 174 AllowCompatibleDifferences) || 175 Second->ReadTargetOptions(TargetOpts, Complain, 176 AllowCompatibleDifferences); 177 } 178 179 bool ChainedASTReaderListener::ReadDiagnosticOptions( 180 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 181 return First->ReadDiagnosticOptions(DiagOpts, Complain) || 182 Second->ReadDiagnosticOptions(DiagOpts, Complain); 183 } 184 185 bool 186 ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts, 187 bool Complain) { 188 return First->ReadFileSystemOptions(FSOpts, Complain) || 189 Second->ReadFileSystemOptions(FSOpts, Complain); 190 } 191 192 bool ChainedASTReaderListener::ReadHeaderSearchOptions( 193 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath, 194 bool Complain) { 195 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 196 Complain) || 197 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 198 Complain); 199 } 200 201 bool ChainedASTReaderListener::ReadPreprocessorOptions( 202 const PreprocessorOptions &PPOpts, bool Complain, 203 std::string &SuggestedPredefines) { 204 return First->ReadPreprocessorOptions(PPOpts, Complain, 205 SuggestedPredefines) || 206 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines); 207 } 208 209 void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M, 210 unsigned Value) { 211 First->ReadCounter(M, Value); 212 Second->ReadCounter(M, Value); 213 } 214 215 bool ChainedASTReaderListener::needsInputFileVisitation() { 216 return First->needsInputFileVisitation() || 217 Second->needsInputFileVisitation(); 218 } 219 220 bool ChainedASTReaderListener::needsSystemInputFileVisitation() { 221 return First->needsSystemInputFileVisitation() || 222 Second->needsSystemInputFileVisitation(); 223 } 224 225 void ChainedASTReaderListener::visitModuleFile(StringRef Filename, 226 ModuleKind Kind) { 227 First->visitModuleFile(Filename, Kind); 228 Second->visitModuleFile(Filename, Kind); 229 } 230 231 bool ChainedASTReaderListener::visitInputFile(StringRef Filename, 232 bool isSystem, 233 bool isOverridden, 234 bool isExplicitModule) { 235 bool Continue = false; 236 if (First->needsInputFileVisitation() && 237 (!isSystem || First->needsSystemInputFileVisitation())) 238 Continue |= First->visitInputFile(Filename, isSystem, isOverridden, 239 isExplicitModule); 240 if (Second->needsInputFileVisitation() && 241 (!isSystem || Second->needsSystemInputFileVisitation())) 242 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden, 243 isExplicitModule); 244 return Continue; 245 } 246 247 void ChainedASTReaderListener::readModuleFileExtension( 248 const ModuleFileExtensionMetadata &Metadata) { 249 First->readModuleFileExtension(Metadata); 250 Second->readModuleFileExtension(Metadata); 251 } 252 253 //===----------------------------------------------------------------------===// 254 // PCH validator implementation 255 //===----------------------------------------------------------------------===// 256 257 ASTReaderListener::~ASTReaderListener() = default; 258 259 /// \brief Compare the given set of language options against an existing set of 260 /// language options. 261 /// 262 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 263 /// \param AllowCompatibleDifferences If true, differences between compatible 264 /// language options will be permitted. 265 /// 266 /// \returns true if the languagae options mis-match, false otherwise. 267 static bool checkLanguageOptions(const LangOptions &LangOpts, 268 const LangOptions &ExistingLangOpts, 269 DiagnosticsEngine *Diags, 270 bool AllowCompatibleDifferences = true) { 271 #define LANGOPT(Name, Bits, Default, Description) \ 272 if (ExistingLangOpts.Name != LangOpts.Name) { \ 273 if (Diags) \ 274 Diags->Report(diag::err_pch_langopt_mismatch) \ 275 << Description << LangOpts.Name << ExistingLangOpts.Name; \ 276 return true; \ 277 } 278 279 #define VALUE_LANGOPT(Name, Bits, Default, Description) \ 280 if (ExistingLangOpts.Name != LangOpts.Name) { \ 281 if (Diags) \ 282 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 283 << Description; \ 284 return true; \ 285 } 286 287 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 288 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ 289 if (Diags) \ 290 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 291 << Description; \ 292 return true; \ 293 } 294 295 #define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \ 296 if (!AllowCompatibleDifferences) \ 297 LANGOPT(Name, Bits, Default, Description) 298 299 #define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \ 300 if (!AllowCompatibleDifferences) \ 301 ENUM_LANGOPT(Name, Bits, Default, Description) 302 303 #define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \ 304 if (!AllowCompatibleDifferences) \ 305 VALUE_LANGOPT(Name, Bits, Default, Description) 306 307 #define BENIGN_LANGOPT(Name, Bits, Default, Description) 308 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) 309 #define BENIGN_VALUE_LANGOPT(Name, Type, Bits, Default, Description) 310 #include "clang/Basic/LangOptions.def" 311 312 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) { 313 if (Diags) 314 Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features"; 315 return true; 316 } 317 318 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) { 319 if (Diags) 320 Diags->Report(diag::err_pch_langopt_value_mismatch) 321 << "target Objective-C runtime"; 322 return true; 323 } 324 325 if (ExistingLangOpts.CommentOpts.BlockCommandNames != 326 LangOpts.CommentOpts.BlockCommandNames) { 327 if (Diags) 328 Diags->Report(diag::err_pch_langopt_value_mismatch) 329 << "block command names"; 330 return true; 331 } 332 333 // Sanitizer feature mismatches are treated as compatible differences. If 334 // compatible differences aren't allowed, we still only want to check for 335 // mismatches of non-modular sanitizers (the only ones which can affect AST 336 // generation). 337 if (!AllowCompatibleDifferences) { 338 SanitizerMask ModularSanitizers = getPPTransparentSanitizers(); 339 SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize; 340 SanitizerSet ImportedSanitizers = LangOpts.Sanitize; 341 ExistingSanitizers.clear(ModularSanitizers); 342 ImportedSanitizers.clear(ModularSanitizers); 343 if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) { 344 const std::string Flag = "-fsanitize="; 345 if (Diags) { 346 #define SANITIZER(NAME, ID) \ 347 { \ 348 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \ 349 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \ 350 if (InExistingModule != InImportedModule) \ 351 Diags->Report(diag::err_pch_targetopt_feature_mismatch) \ 352 << InExistingModule << (Flag + NAME); \ 353 } 354 #include "clang/Basic/Sanitizers.def" 355 } 356 return true; 357 } 358 } 359 360 return false; 361 } 362 363 /// \brief Compare the given set of target options against an existing set of 364 /// target options. 365 /// 366 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 367 /// 368 /// \returns true if the target options mis-match, false otherwise. 369 static bool checkTargetOptions(const TargetOptions &TargetOpts, 370 const TargetOptions &ExistingTargetOpts, 371 DiagnosticsEngine *Diags, 372 bool AllowCompatibleDifferences = true) { 373 #define CHECK_TARGET_OPT(Field, Name) \ 374 if (TargetOpts.Field != ExistingTargetOpts.Field) { \ 375 if (Diags) \ 376 Diags->Report(diag::err_pch_targetopt_mismatch) \ 377 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \ 378 return true; \ 379 } 380 381 // The triple and ABI must match exactly. 382 CHECK_TARGET_OPT(Triple, "target"); 383 CHECK_TARGET_OPT(ABI, "target ABI"); 384 385 // We can tolerate different CPUs in many cases, notably when one CPU 386 // supports a strict superset of another. When allowing compatible 387 // differences skip this check. 388 if (!AllowCompatibleDifferences) 389 CHECK_TARGET_OPT(CPU, "target CPU"); 390 391 #undef CHECK_TARGET_OPT 392 393 // Compare feature sets. 394 SmallVector<StringRef, 4> ExistingFeatures( 395 ExistingTargetOpts.FeaturesAsWritten.begin(), 396 ExistingTargetOpts.FeaturesAsWritten.end()); 397 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(), 398 TargetOpts.FeaturesAsWritten.end()); 399 llvm::sort(ExistingFeatures.begin(), ExistingFeatures.end()); 400 llvm::sort(ReadFeatures.begin(), ReadFeatures.end()); 401 402 // We compute the set difference in both directions explicitly so that we can 403 // diagnose the differences differently. 404 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures; 405 std::set_difference( 406 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(), 407 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures)); 408 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(), 409 ExistingFeatures.begin(), ExistingFeatures.end(), 410 std::back_inserter(UnmatchedReadFeatures)); 411 412 // If we are allowing compatible differences and the read feature set is 413 // a strict subset of the existing feature set, there is nothing to diagnose. 414 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty()) 415 return false; 416 417 if (Diags) { 418 for (StringRef Feature : UnmatchedReadFeatures) 419 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 420 << /* is-existing-feature */ false << Feature; 421 for (StringRef Feature : UnmatchedExistingFeatures) 422 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 423 << /* is-existing-feature */ true << Feature; 424 } 425 426 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty(); 427 } 428 429 bool 430 PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts, 431 bool Complain, 432 bool AllowCompatibleDifferences) { 433 const LangOptions &ExistingLangOpts = PP.getLangOpts(); 434 return checkLanguageOptions(LangOpts, ExistingLangOpts, 435 Complain ? &Reader.Diags : nullptr, 436 AllowCompatibleDifferences); 437 } 438 439 bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts, 440 bool Complain, 441 bool AllowCompatibleDifferences) { 442 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts(); 443 return checkTargetOptions(TargetOpts, ExistingTargetOpts, 444 Complain ? &Reader.Diags : nullptr, 445 AllowCompatibleDifferences); 446 } 447 448 namespace { 449 450 using MacroDefinitionsMap = 451 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>; 452 using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>; 453 454 } // namespace 455 456 static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, 457 DiagnosticsEngine &Diags, 458 bool Complain) { 459 using Level = DiagnosticsEngine::Level; 460 461 // Check current mappings for new -Werror mappings, and the stored mappings 462 // for cases that were explicitly mapped to *not* be errors that are now 463 // errors because of options like -Werror. 464 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags }; 465 466 for (DiagnosticsEngine *MappingSource : MappingSources) { 467 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) { 468 diag::kind DiagID = DiagIDMappingPair.first; 469 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation()); 470 if (CurLevel < DiagnosticsEngine::Error) 471 continue; // not significant 472 Level StoredLevel = 473 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation()); 474 if (StoredLevel < DiagnosticsEngine::Error) { 475 if (Complain) 476 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" + 477 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str(); 478 return true; 479 } 480 } 481 } 482 483 return false; 484 } 485 486 static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) { 487 diag::Severity Ext = Diags.getExtensionHandlingBehavior(); 488 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors()) 489 return true; 490 return Ext >= diag::Severity::Error; 491 } 492 493 static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, 494 DiagnosticsEngine &Diags, 495 bool IsSystem, bool Complain) { 496 // Top-level options 497 if (IsSystem) { 498 if (Diags.getSuppressSystemWarnings()) 499 return false; 500 // If -Wsystem-headers was not enabled before, be conservative 501 if (StoredDiags.getSuppressSystemWarnings()) { 502 if (Complain) 503 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers"; 504 return true; 505 } 506 } 507 508 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) { 509 if (Complain) 510 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror"; 511 return true; 512 } 513 514 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() && 515 !StoredDiags.getEnableAllWarnings()) { 516 if (Complain) 517 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror"; 518 return true; 519 } 520 521 if (isExtHandlingFromDiagsError(Diags) && 522 !isExtHandlingFromDiagsError(StoredDiags)) { 523 if (Complain) 524 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors"; 525 return true; 526 } 527 528 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain); 529 } 530 531 /// Return the top import module if it is implicit, nullptr otherwise. 532 static Module *getTopImportImplicitModule(ModuleManager &ModuleMgr, 533 Preprocessor &PP) { 534 // If the original import came from a file explicitly generated by the user, 535 // don't check the diagnostic mappings. 536 // FIXME: currently this is approximated by checking whether this is not a 537 // module import of an implicitly-loaded module file. 538 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in 539 // the transitive closure of its imports, since unrelated modules cannot be 540 // imported until after this module finishes validation. 541 ModuleFile *TopImport = &*ModuleMgr.rbegin(); 542 while (!TopImport->ImportedBy.empty()) 543 TopImport = TopImport->ImportedBy[0]; 544 if (TopImport->Kind != MK_ImplicitModule) 545 return nullptr; 546 547 StringRef ModuleName = TopImport->ModuleName; 548 assert(!ModuleName.empty() && "diagnostic options read before module name"); 549 550 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName); 551 assert(M && "missing module"); 552 return M; 553 } 554 555 bool PCHValidator::ReadDiagnosticOptions( 556 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 557 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics(); 558 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs()); 559 IntrusiveRefCntPtr<DiagnosticsEngine> Diags( 560 new DiagnosticsEngine(DiagIDs, DiagOpts.get())); 561 // This should never fail, because we would have processed these options 562 // before writing them to an ASTFile. 563 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false); 564 565 ModuleManager &ModuleMgr = Reader.getModuleManager(); 566 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then"); 567 568 Module *TopM = getTopImportImplicitModule(ModuleMgr, PP); 569 if (!TopM) 570 return false; 571 572 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that 573 // contains the union of their flags. 574 return checkDiagnosticMappings(*Diags, ExistingDiags, TopM->IsSystem, 575 Complain); 576 } 577 578 /// \brief Collect the macro definitions provided by the given preprocessor 579 /// options. 580 static void 581 collectMacroDefinitions(const PreprocessorOptions &PPOpts, 582 MacroDefinitionsMap &Macros, 583 SmallVectorImpl<StringRef> *MacroNames = nullptr) { 584 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) { 585 StringRef Macro = PPOpts.Macros[I].first; 586 bool IsUndef = PPOpts.Macros[I].second; 587 588 std::pair<StringRef, StringRef> MacroPair = Macro.split('='); 589 StringRef MacroName = MacroPair.first; 590 StringRef MacroBody = MacroPair.second; 591 592 // For an #undef'd macro, we only care about the name. 593 if (IsUndef) { 594 if (MacroNames && !Macros.count(MacroName)) 595 MacroNames->push_back(MacroName); 596 597 Macros[MacroName] = std::make_pair("", true); 598 continue; 599 } 600 601 // For a #define'd macro, figure out the actual definition. 602 if (MacroName.size() == Macro.size()) 603 MacroBody = "1"; 604 else { 605 // Note: GCC drops anything following an end-of-line character. 606 StringRef::size_type End = MacroBody.find_first_of("\n\r"); 607 MacroBody = MacroBody.substr(0, End); 608 } 609 610 if (MacroNames && !Macros.count(MacroName)) 611 MacroNames->push_back(MacroName); 612 Macros[MacroName] = std::make_pair(MacroBody, false); 613 } 614 } 615 616 /// \brief Check the preprocessor options deserialized from the control block 617 /// against the preprocessor options in an existing preprocessor. 618 /// 619 /// \param Diags If non-null, produce diagnostics for any mismatches incurred. 620 /// \param Validate If true, validate preprocessor options. If false, allow 621 /// macros defined by \p ExistingPPOpts to override those defined by 622 /// \p PPOpts in SuggestedPredefines. 623 static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, 624 const PreprocessorOptions &ExistingPPOpts, 625 DiagnosticsEngine *Diags, 626 FileManager &FileMgr, 627 std::string &SuggestedPredefines, 628 const LangOptions &LangOpts, 629 bool Validate = true) { 630 // Check macro definitions. 631 MacroDefinitionsMap ASTFileMacros; 632 collectMacroDefinitions(PPOpts, ASTFileMacros); 633 MacroDefinitionsMap ExistingMacros; 634 SmallVector<StringRef, 4> ExistingMacroNames; 635 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames); 636 637 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) { 638 // Dig out the macro definition in the existing preprocessor options. 639 StringRef MacroName = ExistingMacroNames[I]; 640 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName]; 641 642 // Check whether we know anything about this macro name or not. 643 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known = 644 ASTFileMacros.find(MacroName); 645 if (!Validate || Known == ASTFileMacros.end()) { 646 // FIXME: Check whether this identifier was referenced anywhere in the 647 // AST file. If so, we should reject the AST file. Unfortunately, this 648 // information isn't in the control block. What shall we do about it? 649 650 if (Existing.second) { 651 SuggestedPredefines += "#undef "; 652 SuggestedPredefines += MacroName.str(); 653 SuggestedPredefines += '\n'; 654 } else { 655 SuggestedPredefines += "#define "; 656 SuggestedPredefines += MacroName.str(); 657 SuggestedPredefines += ' '; 658 SuggestedPredefines += Existing.first.str(); 659 SuggestedPredefines += '\n'; 660 } 661 continue; 662 } 663 664 // If the macro was defined in one but undef'd in the other, we have a 665 // conflict. 666 if (Existing.second != Known->second.second) { 667 if (Diags) { 668 Diags->Report(diag::err_pch_macro_def_undef) 669 << MacroName << Known->second.second; 670 } 671 return true; 672 } 673 674 // If the macro was #undef'd in both, or if the macro bodies are identical, 675 // it's fine. 676 if (Existing.second || Existing.first == Known->second.first) 677 continue; 678 679 // The macro bodies differ; complain. 680 if (Diags) { 681 Diags->Report(diag::err_pch_macro_def_conflict) 682 << MacroName << Known->second.first << Existing.first; 683 } 684 return true; 685 } 686 687 // Check whether we're using predefines. 688 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines && Validate) { 689 if (Diags) { 690 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines; 691 } 692 return true; 693 } 694 695 // Detailed record is important since it is used for the module cache hash. 696 if (LangOpts.Modules && 697 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord && Validate) { 698 if (Diags) { 699 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord; 700 } 701 return true; 702 } 703 704 // Compute the #include and #include_macros lines we need. 705 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) { 706 StringRef File = ExistingPPOpts.Includes[I]; 707 if (File == ExistingPPOpts.ImplicitPCHInclude) 708 continue; 709 710 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File) 711 != PPOpts.Includes.end()) 712 continue; 713 714 SuggestedPredefines += "#include \""; 715 SuggestedPredefines += File; 716 SuggestedPredefines += "\"\n"; 717 } 718 719 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) { 720 StringRef File = ExistingPPOpts.MacroIncludes[I]; 721 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(), 722 File) 723 != PPOpts.MacroIncludes.end()) 724 continue; 725 726 SuggestedPredefines += "#__include_macros \""; 727 SuggestedPredefines += File; 728 SuggestedPredefines += "\"\n##\n"; 729 } 730 731 return false; 732 } 733 734 bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 735 bool Complain, 736 std::string &SuggestedPredefines) { 737 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts(); 738 739 return checkPreprocessorOptions(PPOpts, ExistingPPOpts, 740 Complain? &Reader.Diags : nullptr, 741 PP.getFileManager(), 742 SuggestedPredefines, 743 PP.getLangOpts()); 744 } 745 746 bool SimpleASTReaderListener::ReadPreprocessorOptions( 747 const PreprocessorOptions &PPOpts, 748 bool Complain, 749 std::string &SuggestedPredefines) { 750 return checkPreprocessorOptions(PPOpts, 751 PP.getPreprocessorOpts(), 752 nullptr, 753 PP.getFileManager(), 754 SuggestedPredefines, 755 PP.getLangOpts(), 756 false); 757 } 758 759 /// Check the header search options deserialized from the control block 760 /// against the header search options in an existing preprocessor. 761 /// 762 /// \param Diags If non-null, produce diagnostics for any mismatches incurred. 763 static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 764 StringRef SpecificModuleCachePath, 765 StringRef ExistingModuleCachePath, 766 DiagnosticsEngine *Diags, 767 const LangOptions &LangOpts) { 768 if (LangOpts.Modules) { 769 if (SpecificModuleCachePath != ExistingModuleCachePath) { 770 if (Diags) 771 Diags->Report(diag::err_pch_modulecache_mismatch) 772 << SpecificModuleCachePath << ExistingModuleCachePath; 773 return true; 774 } 775 } 776 777 return false; 778 } 779 780 bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 781 StringRef SpecificModuleCachePath, 782 bool Complain) { 783 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 784 PP.getHeaderSearchInfo().getModuleCachePath(), 785 Complain ? &Reader.Diags : nullptr, 786 PP.getLangOpts()); 787 } 788 789 void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) { 790 PP.setCounterValue(Value); 791 } 792 793 //===----------------------------------------------------------------------===// 794 // AST reader implementation 795 //===----------------------------------------------------------------------===// 796 797 void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener, 798 bool TakeOwnership) { 799 DeserializationListener = Listener; 800 OwnsDeserializationListener = TakeOwnership; 801 } 802 803 unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) { 804 return serialization::ComputeHash(Sel); 805 } 806 807 std::pair<unsigned, unsigned> 808 ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) { 809 using namespace llvm::support; 810 811 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d); 812 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d); 813 return std::make_pair(KeyLen, DataLen); 814 } 815 816 ASTSelectorLookupTrait::internal_key_type 817 ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) { 818 using namespace llvm::support; 819 820 SelectorTable &SelTable = Reader.getContext().Selectors; 821 unsigned N = endian::readNext<uint16_t, little, unaligned>(d); 822 IdentifierInfo *FirstII = Reader.getLocalIdentifier( 823 F, endian::readNext<uint32_t, little, unaligned>(d)); 824 if (N == 0) 825 return SelTable.getNullarySelector(FirstII); 826 else if (N == 1) 827 return SelTable.getUnarySelector(FirstII); 828 829 SmallVector<IdentifierInfo *, 16> Args; 830 Args.push_back(FirstII); 831 for (unsigned I = 1; I != N; ++I) 832 Args.push_back(Reader.getLocalIdentifier( 833 F, endian::readNext<uint32_t, little, unaligned>(d))); 834 835 return SelTable.getSelector(N, Args.data()); 836 } 837 838 ASTSelectorLookupTrait::data_type 839 ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d, 840 unsigned DataLen) { 841 using namespace llvm::support; 842 843 data_type Result; 844 845 Result.ID = Reader.getGlobalSelectorID( 846 F, endian::readNext<uint32_t, little, unaligned>(d)); 847 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d); 848 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d); 849 Result.InstanceBits = FullInstanceBits & 0x3; 850 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1; 851 Result.FactoryBits = FullFactoryBits & 0x3; 852 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1; 853 unsigned NumInstanceMethods = FullInstanceBits >> 3; 854 unsigned NumFactoryMethods = FullFactoryBits >> 3; 855 856 // Load instance methods 857 for (unsigned I = 0; I != NumInstanceMethods; ++I) { 858 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 859 F, endian::readNext<uint32_t, little, unaligned>(d))) 860 Result.Instance.push_back(Method); 861 } 862 863 // Load factory methods 864 for (unsigned I = 0; I != NumFactoryMethods; ++I) { 865 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 866 F, endian::readNext<uint32_t, little, unaligned>(d))) 867 Result.Factory.push_back(Method); 868 } 869 870 return Result; 871 } 872 873 unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) { 874 return llvm::djbHash(a); 875 } 876 877 std::pair<unsigned, unsigned> 878 ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) { 879 using namespace llvm::support; 880 881 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d); 882 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d); 883 return std::make_pair(KeyLen, DataLen); 884 } 885 886 ASTIdentifierLookupTraitBase::internal_key_type 887 ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) { 888 assert(n >= 2 && d[n-1] == '\0'); 889 return StringRef((const char*) d, n-1); 890 } 891 892 /// \brief Whether the given identifier is "interesting". 893 static bool isInterestingIdentifier(ASTReader &Reader, IdentifierInfo &II, 894 bool IsModule) { 895 return II.hadMacroDefinition() || 896 II.isPoisoned() || 897 (IsModule ? II.hasRevertedBuiltin() : II.getObjCOrBuiltinID()) || 898 II.hasRevertedTokenIDToIdentifier() || 899 (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) && 900 II.getFETokenInfo<void>()); 901 } 902 903 static bool readBit(unsigned &Bits) { 904 bool Value = Bits & 0x1; 905 Bits >>= 1; 906 return Value; 907 } 908 909 IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) { 910 using namespace llvm::support; 911 912 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 913 return Reader.getGlobalIdentifierID(F, RawID >> 1); 914 } 915 916 static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II) { 917 if (!II.isFromAST()) { 918 II.setIsFromAST(); 919 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr; 920 if (isInterestingIdentifier(Reader, II, IsModule)) 921 II.setChangedSinceDeserialization(); 922 } 923 } 924 925 IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, 926 const unsigned char* d, 927 unsigned DataLen) { 928 using namespace llvm::support; 929 930 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 931 bool IsInteresting = RawID & 0x01; 932 933 // Wipe out the "is interesting" bit. 934 RawID = RawID >> 1; 935 936 // Build the IdentifierInfo and link the identifier ID with it. 937 IdentifierInfo *II = KnownII; 938 if (!II) { 939 II = &Reader.getIdentifierTable().getOwn(k); 940 KnownII = II; 941 } 942 markIdentifierFromAST(Reader, *II); 943 Reader.markIdentifierUpToDate(II); 944 945 IdentID ID = Reader.getGlobalIdentifierID(F, RawID); 946 if (!IsInteresting) { 947 // For uninteresting identifiers, there's nothing else to do. Just notify 948 // the reader that we've finished loading this identifier. 949 Reader.SetIdentifierInfo(ID, II); 950 return II; 951 } 952 953 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d); 954 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d); 955 bool CPlusPlusOperatorKeyword = readBit(Bits); 956 bool HasRevertedTokenIDToIdentifier = readBit(Bits); 957 bool HasRevertedBuiltin = readBit(Bits); 958 bool Poisoned = readBit(Bits); 959 bool ExtensionToken = readBit(Bits); 960 bool HadMacroDefinition = readBit(Bits); 961 962 assert(Bits == 0 && "Extra bits in the identifier?"); 963 DataLen -= 8; 964 965 // Set or check the various bits in the IdentifierInfo structure. 966 // Token IDs are read-only. 967 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier) 968 II->revertTokenIDToIdentifier(); 969 if (!F.isModule()) 970 II->setObjCOrBuiltinID(ObjCOrBuiltinID); 971 else if (HasRevertedBuiltin && II->getBuiltinID()) { 972 II->revertBuiltin(); 973 assert((II->hasRevertedBuiltin() || 974 II->getObjCOrBuiltinID() == ObjCOrBuiltinID) && 975 "Incorrect ObjC keyword or builtin ID"); 976 } 977 assert(II->isExtensionToken() == ExtensionToken && 978 "Incorrect extension token flag"); 979 (void)ExtensionToken; 980 if (Poisoned) 981 II->setIsPoisoned(true); 982 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword && 983 "Incorrect C++ operator keyword flag"); 984 (void)CPlusPlusOperatorKeyword; 985 986 // If this identifier is a macro, deserialize the macro 987 // definition. 988 if (HadMacroDefinition) { 989 uint32_t MacroDirectivesOffset = 990 endian::readNext<uint32_t, little, unaligned>(d); 991 DataLen -= 4; 992 993 Reader.addPendingMacro(II, &F, MacroDirectivesOffset); 994 } 995 996 Reader.SetIdentifierInfo(ID, II); 997 998 // Read all of the declarations visible at global scope with this 999 // name. 1000 if (DataLen > 0) { 1001 SmallVector<uint32_t, 4> DeclIDs; 1002 for (; DataLen > 0; DataLen -= 4) 1003 DeclIDs.push_back(Reader.getGlobalDeclID( 1004 F, endian::readNext<uint32_t, little, unaligned>(d))); 1005 Reader.SetGloballyVisibleDecls(II, DeclIDs); 1006 } 1007 1008 return II; 1009 } 1010 1011 DeclarationNameKey::DeclarationNameKey(DeclarationName Name) 1012 : Kind(Name.getNameKind()) { 1013 switch (Kind) { 1014 case DeclarationName::Identifier: 1015 Data = (uint64_t)Name.getAsIdentifierInfo(); 1016 break; 1017 case DeclarationName::ObjCZeroArgSelector: 1018 case DeclarationName::ObjCOneArgSelector: 1019 case DeclarationName::ObjCMultiArgSelector: 1020 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr(); 1021 break; 1022 case DeclarationName::CXXOperatorName: 1023 Data = Name.getCXXOverloadedOperator(); 1024 break; 1025 case DeclarationName::CXXLiteralOperatorName: 1026 Data = (uint64_t)Name.getCXXLiteralIdentifier(); 1027 break; 1028 case DeclarationName::CXXDeductionGuideName: 1029 Data = (uint64_t)Name.getCXXDeductionGuideTemplate() 1030 ->getDeclName().getAsIdentifierInfo(); 1031 break; 1032 case DeclarationName::CXXConstructorName: 1033 case DeclarationName::CXXDestructorName: 1034 case DeclarationName::CXXConversionFunctionName: 1035 case DeclarationName::CXXUsingDirective: 1036 Data = 0; 1037 break; 1038 } 1039 } 1040 1041 unsigned DeclarationNameKey::getHash() const { 1042 llvm::FoldingSetNodeID ID; 1043 ID.AddInteger(Kind); 1044 1045 switch (Kind) { 1046 case DeclarationName::Identifier: 1047 case DeclarationName::CXXLiteralOperatorName: 1048 case DeclarationName::CXXDeductionGuideName: 1049 ID.AddString(((IdentifierInfo*)Data)->getName()); 1050 break; 1051 case DeclarationName::ObjCZeroArgSelector: 1052 case DeclarationName::ObjCOneArgSelector: 1053 case DeclarationName::ObjCMultiArgSelector: 1054 ID.AddInteger(serialization::ComputeHash(Selector(Data))); 1055 break; 1056 case DeclarationName::CXXOperatorName: 1057 ID.AddInteger((OverloadedOperatorKind)Data); 1058 break; 1059 case DeclarationName::CXXConstructorName: 1060 case DeclarationName::CXXDestructorName: 1061 case DeclarationName::CXXConversionFunctionName: 1062 case DeclarationName::CXXUsingDirective: 1063 break; 1064 } 1065 1066 return ID.ComputeHash(); 1067 } 1068 1069 ModuleFile * 1070 ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) { 1071 using namespace llvm::support; 1072 1073 uint32_t ModuleFileID = endian::readNext<uint32_t, little, unaligned>(d); 1074 return Reader.getLocalModuleFile(F, ModuleFileID); 1075 } 1076 1077 std::pair<unsigned, unsigned> 1078 ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) { 1079 using namespace llvm::support; 1080 1081 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d); 1082 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d); 1083 return std::make_pair(KeyLen, DataLen); 1084 } 1085 1086 ASTDeclContextNameLookupTrait::internal_key_type 1087 ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) { 1088 using namespace llvm::support; 1089 1090 auto Kind = (DeclarationName::NameKind)*d++; 1091 uint64_t Data; 1092 switch (Kind) { 1093 case DeclarationName::Identifier: 1094 case DeclarationName::CXXLiteralOperatorName: 1095 case DeclarationName::CXXDeductionGuideName: 1096 Data = (uint64_t)Reader.getLocalIdentifier( 1097 F, endian::readNext<uint32_t, little, unaligned>(d)); 1098 break; 1099 case DeclarationName::ObjCZeroArgSelector: 1100 case DeclarationName::ObjCOneArgSelector: 1101 case DeclarationName::ObjCMultiArgSelector: 1102 Data = 1103 (uint64_t)Reader.getLocalSelector( 1104 F, endian::readNext<uint32_t, little, unaligned>( 1105 d)).getAsOpaquePtr(); 1106 break; 1107 case DeclarationName::CXXOperatorName: 1108 Data = *d++; // OverloadedOperatorKind 1109 break; 1110 case DeclarationName::CXXConstructorName: 1111 case DeclarationName::CXXDestructorName: 1112 case DeclarationName::CXXConversionFunctionName: 1113 case DeclarationName::CXXUsingDirective: 1114 Data = 0; 1115 break; 1116 } 1117 1118 return DeclarationNameKey(Kind, Data); 1119 } 1120 1121 void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type, 1122 const unsigned char *d, 1123 unsigned DataLen, 1124 data_type_builder &Val) { 1125 using namespace llvm::support; 1126 1127 for (unsigned NumDecls = DataLen / 4; NumDecls; --NumDecls) { 1128 uint32_t LocalID = endian::readNext<uint32_t, little, unaligned>(d); 1129 Val.insert(Reader.getGlobalDeclID(F, LocalID)); 1130 } 1131 } 1132 1133 bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M, 1134 BitstreamCursor &Cursor, 1135 uint64_t Offset, 1136 DeclContext *DC) { 1137 assert(Offset != 0); 1138 1139 SavedStreamPosition SavedPosition(Cursor); 1140 Cursor.JumpToBit(Offset); 1141 1142 RecordData Record; 1143 StringRef Blob; 1144 unsigned Code = Cursor.ReadCode(); 1145 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob); 1146 if (RecCode != DECL_CONTEXT_LEXICAL) { 1147 Error("Expected lexical block"); 1148 return true; 1149 } 1150 1151 assert(!isa<TranslationUnitDecl>(DC) && 1152 "expected a TU_UPDATE_LEXICAL record for TU"); 1153 // If we are handling a C++ class template instantiation, we can see multiple 1154 // lexical updates for the same record. It's important that we select only one 1155 // of them, so that field numbering works properly. Just pick the first one we 1156 // see. 1157 auto &Lex = LexicalDecls[DC]; 1158 if (!Lex.first) { 1159 Lex = std::make_pair( 1160 &M, llvm::makeArrayRef( 1161 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 1162 Blob.data()), 1163 Blob.size() / 4)); 1164 } 1165 DC->setHasExternalLexicalStorage(true); 1166 return false; 1167 } 1168 1169 bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M, 1170 BitstreamCursor &Cursor, 1171 uint64_t Offset, 1172 DeclID ID) { 1173 assert(Offset != 0); 1174 1175 SavedStreamPosition SavedPosition(Cursor); 1176 Cursor.JumpToBit(Offset); 1177 1178 RecordData Record; 1179 StringRef Blob; 1180 unsigned Code = Cursor.ReadCode(); 1181 unsigned RecCode = Cursor.readRecord(Code, Record, &Blob); 1182 if (RecCode != DECL_CONTEXT_VISIBLE) { 1183 Error("Expected visible lookup table block"); 1184 return true; 1185 } 1186 1187 // We can't safely determine the primary context yet, so delay attaching the 1188 // lookup table until we're done with recursive deserialization. 1189 auto *Data = (const unsigned char*)Blob.data(); 1190 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data}); 1191 return false; 1192 } 1193 1194 void ASTReader::Error(StringRef Msg) const { 1195 Error(diag::err_fe_pch_malformed, Msg); 1196 if (PP.getLangOpts().Modules && !Diags.isDiagnosticInFlight() && 1197 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) { 1198 Diag(diag::note_module_cache_path) 1199 << PP.getHeaderSearchInfo().getModuleCachePath(); 1200 } 1201 } 1202 1203 void ASTReader::Error(unsigned DiagID, 1204 StringRef Arg1, StringRef Arg2) const { 1205 if (Diags.isDiagnosticInFlight()) 1206 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2); 1207 else 1208 Diag(DiagID) << Arg1 << Arg2; 1209 } 1210 1211 //===----------------------------------------------------------------------===// 1212 // Source Manager Deserialization 1213 //===----------------------------------------------------------------------===// 1214 1215 /// \brief Read the line table in the source manager block. 1216 /// \returns true if there was an error. 1217 bool ASTReader::ParseLineTable(ModuleFile &F, 1218 const RecordData &Record) { 1219 unsigned Idx = 0; 1220 LineTableInfo &LineTable = SourceMgr.getLineTable(); 1221 1222 // Parse the file names 1223 std::map<int, int> FileIDs; 1224 FileIDs[-1] = -1; // For unspecified filenames. 1225 for (unsigned I = 0; Record[Idx]; ++I) { 1226 // Extract the file name 1227 auto Filename = ReadPath(F, Record, Idx); 1228 FileIDs[I] = LineTable.getLineTableFilenameID(Filename); 1229 } 1230 ++Idx; 1231 1232 // Parse the line entries 1233 std::vector<LineEntry> Entries; 1234 while (Idx < Record.size()) { 1235 int FID = Record[Idx++]; 1236 assert(FID >= 0 && "Serialized line entries for non-local file."); 1237 // Remap FileID from 1-based old view. 1238 FID += F.SLocEntryBaseID - 1; 1239 1240 // Extract the line entries 1241 unsigned NumEntries = Record[Idx++]; 1242 assert(NumEntries && "no line entries for file ID"); 1243 Entries.clear(); 1244 Entries.reserve(NumEntries); 1245 for (unsigned I = 0; I != NumEntries; ++I) { 1246 unsigned FileOffset = Record[Idx++]; 1247 unsigned LineNo = Record[Idx++]; 1248 int FilenameID = FileIDs[Record[Idx++]]; 1249 SrcMgr::CharacteristicKind FileKind 1250 = (SrcMgr::CharacteristicKind)Record[Idx++]; 1251 unsigned IncludeOffset = Record[Idx++]; 1252 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID, 1253 FileKind, IncludeOffset)); 1254 } 1255 LineTable.AddEntry(FileID::get(FID), Entries); 1256 } 1257 1258 return false; 1259 } 1260 1261 /// \brief Read a source manager block 1262 bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) { 1263 using namespace SrcMgr; 1264 1265 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor; 1266 1267 // Set the source-location entry cursor to the current position in 1268 // the stream. This cursor will be used to read the contents of the 1269 // source manager block initially, and then lazily read 1270 // source-location entries as needed. 1271 SLocEntryCursor = F.Stream; 1272 1273 // The stream itself is going to skip over the source manager block. 1274 if (F.Stream.SkipBlock()) { 1275 Error("malformed block record in AST file"); 1276 return true; 1277 } 1278 1279 // Enter the source manager block. 1280 if (SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) { 1281 Error("malformed source manager block record in AST file"); 1282 return true; 1283 } 1284 1285 RecordData Record; 1286 while (true) { 1287 llvm::BitstreamEntry E = SLocEntryCursor.advanceSkippingSubblocks(); 1288 1289 switch (E.Kind) { 1290 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1291 case llvm::BitstreamEntry::Error: 1292 Error("malformed block record in AST file"); 1293 return true; 1294 case llvm::BitstreamEntry::EndBlock: 1295 return false; 1296 case llvm::BitstreamEntry::Record: 1297 // The interesting case. 1298 break; 1299 } 1300 1301 // Read a record. 1302 Record.clear(); 1303 StringRef Blob; 1304 switch (SLocEntryCursor.readRecord(E.ID, Record, &Blob)) { 1305 default: // Default behavior: ignore. 1306 break; 1307 1308 case SM_SLOC_FILE_ENTRY: 1309 case SM_SLOC_BUFFER_ENTRY: 1310 case SM_SLOC_EXPANSION_ENTRY: 1311 // Once we hit one of the source location entries, we're done. 1312 return false; 1313 } 1314 } 1315 } 1316 1317 /// \brief If a header file is not found at the path that we expect it to be 1318 /// and the PCH file was moved from its original location, try to resolve the 1319 /// file by assuming that header+PCH were moved together and the header is in 1320 /// the same place relative to the PCH. 1321 static std::string 1322 resolveFileRelativeToOriginalDir(const std::string &Filename, 1323 const std::string &OriginalDir, 1324 const std::string &CurrDir) { 1325 assert(OriginalDir != CurrDir && 1326 "No point trying to resolve the file if the PCH dir didn't change"); 1327 1328 using namespace llvm::sys; 1329 1330 SmallString<128> filePath(Filename); 1331 fs::make_absolute(filePath); 1332 assert(path::is_absolute(OriginalDir)); 1333 SmallString<128> currPCHPath(CurrDir); 1334 1335 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)), 1336 fileDirE = path::end(path::parent_path(filePath)); 1337 path::const_iterator origDirI = path::begin(OriginalDir), 1338 origDirE = path::end(OriginalDir); 1339 // Skip the common path components from filePath and OriginalDir. 1340 while (fileDirI != fileDirE && origDirI != origDirE && 1341 *fileDirI == *origDirI) { 1342 ++fileDirI; 1343 ++origDirI; 1344 } 1345 for (; origDirI != origDirE; ++origDirI) 1346 path::append(currPCHPath, ".."); 1347 path::append(currPCHPath, fileDirI, fileDirE); 1348 path::append(currPCHPath, path::filename(Filename)); 1349 return currPCHPath.str(); 1350 } 1351 1352 bool ASTReader::ReadSLocEntry(int ID) { 1353 if (ID == 0) 1354 return false; 1355 1356 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1357 Error("source location entry ID out-of-range for AST file"); 1358 return true; 1359 } 1360 1361 // Local helper to read the (possibly-compressed) buffer data following the 1362 // entry record. 1363 auto ReadBuffer = [this]( 1364 BitstreamCursor &SLocEntryCursor, 1365 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> { 1366 RecordData Record; 1367 StringRef Blob; 1368 unsigned Code = SLocEntryCursor.ReadCode(); 1369 unsigned RecCode = SLocEntryCursor.readRecord(Code, Record, &Blob); 1370 1371 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) { 1372 if (!llvm::zlib::isAvailable()) { 1373 Error("zlib is not available"); 1374 return nullptr; 1375 } 1376 SmallString<0> Uncompressed; 1377 if (llvm::Error E = 1378 llvm::zlib::uncompress(Blob, Uncompressed, Record[0])) { 1379 Error("could not decompress embedded file contents: " + 1380 llvm::toString(std::move(E))); 1381 return nullptr; 1382 } 1383 return llvm::MemoryBuffer::getMemBufferCopy(Uncompressed, Name); 1384 } else if (RecCode == SM_SLOC_BUFFER_BLOB) { 1385 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true); 1386 } else { 1387 Error("AST record has invalid code"); 1388 return nullptr; 1389 } 1390 }; 1391 1392 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second; 1393 F->SLocEntryCursor.JumpToBit(F->SLocEntryOffsets[ID - F->SLocEntryBaseID]); 1394 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor; 1395 unsigned BaseOffset = F->SLocEntryBaseOffset; 1396 1397 ++NumSLocEntriesRead; 1398 llvm::BitstreamEntry Entry = SLocEntryCursor.advance(); 1399 if (Entry.Kind != llvm::BitstreamEntry::Record) { 1400 Error("incorrectly-formatted source location entry in AST file"); 1401 return true; 1402 } 1403 1404 RecordData Record; 1405 StringRef Blob; 1406 switch (SLocEntryCursor.readRecord(Entry.ID, Record, &Blob)) { 1407 default: 1408 Error("incorrectly-formatted source location entry in AST file"); 1409 return true; 1410 1411 case SM_SLOC_FILE_ENTRY: { 1412 // We will detect whether a file changed and return 'Failure' for it, but 1413 // we will also try to fail gracefully by setting up the SLocEntry. 1414 unsigned InputID = Record[4]; 1415 InputFile IF = getInputFile(*F, InputID); 1416 const FileEntry *File = IF.getFile(); 1417 bool OverriddenBuffer = IF.isOverridden(); 1418 1419 // Note that we only check if a File was returned. If it was out-of-date 1420 // we have complained but we will continue creating a FileID to recover 1421 // gracefully. 1422 if (!File) 1423 return true; 1424 1425 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1426 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) { 1427 // This is the module's main file. 1428 IncludeLoc = getImportLocation(F); 1429 } 1430 SrcMgr::CharacteristicKind 1431 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1432 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter, 1433 ID, BaseOffset + Record[0]); 1434 SrcMgr::FileInfo &FileInfo = 1435 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile()); 1436 FileInfo.NumCreatedFIDs = Record[5]; 1437 if (Record[3]) 1438 FileInfo.setHasLineDirectives(); 1439 1440 const DeclID *FirstDecl = F->FileSortedDecls + Record[6]; 1441 unsigned NumFileDecls = Record[7]; 1442 if (NumFileDecls && ContextObj) { 1443 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?"); 1444 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl, 1445 NumFileDecls)); 1446 } 1447 1448 const SrcMgr::ContentCache *ContentCache 1449 = SourceMgr.getOrCreateContentCache(File, isSystem(FileCharacter)); 1450 if (OverriddenBuffer && !ContentCache->BufferOverridden && 1451 ContentCache->ContentsEntry == ContentCache->OrigEntry && 1452 !ContentCache->getRawBuffer()) { 1453 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName()); 1454 if (!Buffer) 1455 return true; 1456 SourceMgr.overrideFileContents(File, std::move(Buffer)); 1457 } 1458 1459 break; 1460 } 1461 1462 case SM_SLOC_BUFFER_ENTRY: { 1463 const char *Name = Blob.data(); 1464 unsigned Offset = Record[0]; 1465 SrcMgr::CharacteristicKind 1466 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1467 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1468 if (IncludeLoc.isInvalid() && F->isModule()) { 1469 IncludeLoc = getImportLocation(F); 1470 } 1471 1472 auto Buffer = ReadBuffer(SLocEntryCursor, Name); 1473 if (!Buffer) 1474 return true; 1475 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID, 1476 BaseOffset + Offset, IncludeLoc); 1477 break; 1478 } 1479 1480 case SM_SLOC_EXPANSION_ENTRY: { 1481 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]); 1482 SourceMgr.createExpansionLoc(SpellingLoc, 1483 ReadSourceLocation(*F, Record[2]), 1484 ReadSourceLocation(*F, Record[3]), 1485 Record[5], 1486 Record[4], 1487 ID, 1488 BaseOffset + Record[0]); 1489 break; 1490 } 1491 } 1492 1493 return false; 1494 } 1495 1496 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) { 1497 if (ID == 0) 1498 return std::make_pair(SourceLocation(), ""); 1499 1500 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1501 Error("source location entry ID out-of-range for AST file"); 1502 return std::make_pair(SourceLocation(), ""); 1503 } 1504 1505 // Find which module file this entry lands in. 1506 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second; 1507 if (!M->isModule()) 1508 return std::make_pair(SourceLocation(), ""); 1509 1510 // FIXME: Can we map this down to a particular submodule? That would be 1511 // ideal. 1512 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName)); 1513 } 1514 1515 /// \brief Find the location where the module F is imported. 1516 SourceLocation ASTReader::getImportLocation(ModuleFile *F) { 1517 if (F->ImportLoc.isValid()) 1518 return F->ImportLoc; 1519 1520 // Otherwise we have a PCH. It's considered to be "imported" at the first 1521 // location of its includer. 1522 if (F->ImportedBy.empty() || !F->ImportedBy[0]) { 1523 // Main file is the importer. 1524 assert(SourceMgr.getMainFileID().isValid() && "missing main file"); 1525 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID()); 1526 } 1527 return F->ImportedBy[0]->FirstLoc; 1528 } 1529 1530 /// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the 1531 /// specified cursor. Read the abbreviations that are at the top of the block 1532 /// and then leave the cursor pointing into the block. 1533 bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) { 1534 if (Cursor.EnterSubBlock(BlockID)) 1535 return true; 1536 1537 while (true) { 1538 uint64_t Offset = Cursor.GetCurrentBitNo(); 1539 unsigned Code = Cursor.ReadCode(); 1540 1541 // We expect all abbrevs to be at the start of the block. 1542 if (Code != llvm::bitc::DEFINE_ABBREV) { 1543 Cursor.JumpToBit(Offset); 1544 return false; 1545 } 1546 Cursor.ReadAbbrevRecord(); 1547 } 1548 } 1549 1550 Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record, 1551 unsigned &Idx) { 1552 Token Tok; 1553 Tok.startToken(); 1554 Tok.setLocation(ReadSourceLocation(F, Record, Idx)); 1555 Tok.setLength(Record[Idx++]); 1556 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++])) 1557 Tok.setIdentifierInfo(II); 1558 Tok.setKind((tok::TokenKind)Record[Idx++]); 1559 Tok.setFlag((Token::TokenFlags)Record[Idx++]); 1560 return Tok; 1561 } 1562 1563 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { 1564 BitstreamCursor &Stream = F.MacroCursor; 1565 1566 // Keep track of where we are in the stream, then jump back there 1567 // after reading this macro. 1568 SavedStreamPosition SavedPosition(Stream); 1569 1570 Stream.JumpToBit(Offset); 1571 RecordData Record; 1572 SmallVector<IdentifierInfo*, 16> MacroParams; 1573 MacroInfo *Macro = nullptr; 1574 1575 while (true) { 1576 // Advance to the next record, but if we get to the end of the block, don't 1577 // pop it (removing all the abbreviations from the cursor) since we want to 1578 // be able to reseek within the block and read entries. 1579 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd; 1580 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(Flags); 1581 1582 switch (Entry.Kind) { 1583 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1584 case llvm::BitstreamEntry::Error: 1585 Error("malformed block record in AST file"); 1586 return Macro; 1587 case llvm::BitstreamEntry::EndBlock: 1588 return Macro; 1589 case llvm::BitstreamEntry::Record: 1590 // The interesting case. 1591 break; 1592 } 1593 1594 // Read a record. 1595 Record.clear(); 1596 PreprocessorRecordTypes RecType = 1597 (PreprocessorRecordTypes)Stream.readRecord(Entry.ID, Record); 1598 switch (RecType) { 1599 case PP_MODULE_MACRO: 1600 case PP_MACRO_DIRECTIVE_HISTORY: 1601 return Macro; 1602 1603 case PP_MACRO_OBJECT_LIKE: 1604 case PP_MACRO_FUNCTION_LIKE: { 1605 // If we already have a macro, that means that we've hit the end 1606 // of the definition of the macro we were looking for. We're 1607 // done. 1608 if (Macro) 1609 return Macro; 1610 1611 unsigned NextIndex = 1; // Skip identifier ID. 1612 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex); 1613 MacroInfo *MI = PP.AllocateMacroInfo(Loc); 1614 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex)); 1615 MI->setIsUsed(Record[NextIndex++]); 1616 MI->setUsedForHeaderGuard(Record[NextIndex++]); 1617 1618 if (RecType == PP_MACRO_FUNCTION_LIKE) { 1619 // Decode function-like macro info. 1620 bool isC99VarArgs = Record[NextIndex++]; 1621 bool isGNUVarArgs = Record[NextIndex++]; 1622 bool hasCommaPasting = Record[NextIndex++]; 1623 MacroParams.clear(); 1624 unsigned NumArgs = Record[NextIndex++]; 1625 for (unsigned i = 0; i != NumArgs; ++i) 1626 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++])); 1627 1628 // Install function-like macro info. 1629 MI->setIsFunctionLike(); 1630 if (isC99VarArgs) MI->setIsC99Varargs(); 1631 if (isGNUVarArgs) MI->setIsGNUVarargs(); 1632 if (hasCommaPasting) MI->setHasCommaPasting(); 1633 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator()); 1634 } 1635 1636 // Remember that we saw this macro last so that we add the tokens that 1637 // form its body to it. 1638 Macro = MI; 1639 1640 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() && 1641 Record[NextIndex]) { 1642 // We have a macro definition. Register the association 1643 PreprocessedEntityID 1644 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]); 1645 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 1646 PreprocessingRecord::PPEntityID PPID = 1647 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true); 1648 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>( 1649 PPRec.getPreprocessedEntity(PPID)); 1650 if (PPDef) 1651 PPRec.RegisterMacroDefinition(Macro, PPDef); 1652 } 1653 1654 ++NumMacrosRead; 1655 break; 1656 } 1657 1658 case PP_TOKEN: { 1659 // If we see a TOKEN before a PP_MACRO_*, then the file is 1660 // erroneous, just pretend we didn't see this. 1661 if (!Macro) break; 1662 1663 unsigned Idx = 0; 1664 Token Tok = ReadToken(F, Record, Idx); 1665 Macro->AddTokenToBody(Tok); 1666 break; 1667 } 1668 } 1669 } 1670 } 1671 1672 PreprocessedEntityID 1673 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, 1674 unsigned LocalID) const { 1675 if (!M.ModuleOffsetMap.empty()) 1676 ReadModuleOffsetMap(M); 1677 1678 ContinuousRangeMap<uint32_t, int, 2>::const_iterator 1679 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS); 1680 assert(I != M.PreprocessedEntityRemap.end() 1681 && "Invalid index into preprocessed entity index remap"); 1682 1683 return LocalID + I->second; 1684 } 1685 1686 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) { 1687 return llvm::hash_combine(ikey.Size, ikey.ModTime); 1688 } 1689 1690 HeaderFileInfoTrait::internal_key_type 1691 HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) { 1692 internal_key_type ikey = {FE->getSize(), 1693 M.HasTimestamps ? FE->getModificationTime() : 0, 1694 FE->getName(), /*Imported*/ false}; 1695 return ikey; 1696 } 1697 1698 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) { 1699 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime)) 1700 return false; 1701 1702 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename) 1703 return true; 1704 1705 // Determine whether the actual files are equivalent. 1706 FileManager &FileMgr = Reader.getFileManager(); 1707 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* { 1708 if (!Key.Imported) 1709 return FileMgr.getFile(Key.Filename); 1710 1711 std::string Resolved = Key.Filename; 1712 Reader.ResolveImportedPath(M, Resolved); 1713 return FileMgr.getFile(Resolved); 1714 }; 1715 1716 const FileEntry *FEA = GetFile(a); 1717 const FileEntry *FEB = GetFile(b); 1718 return FEA && FEA == FEB; 1719 } 1720 1721 std::pair<unsigned, unsigned> 1722 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) { 1723 using namespace llvm::support; 1724 1725 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d); 1726 unsigned DataLen = (unsigned) *d++; 1727 return std::make_pair(KeyLen, DataLen); 1728 } 1729 1730 HeaderFileInfoTrait::internal_key_type 1731 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) { 1732 using namespace llvm::support; 1733 1734 internal_key_type ikey; 1735 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d)); 1736 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d)); 1737 ikey.Filename = (const char *)d; 1738 ikey.Imported = true; 1739 return ikey; 1740 } 1741 1742 HeaderFileInfoTrait::data_type 1743 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d, 1744 unsigned DataLen) { 1745 using namespace llvm::support; 1746 1747 const unsigned char *End = d + DataLen; 1748 HeaderFileInfo HFI; 1749 unsigned Flags = *d++; 1750 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp. 1751 HFI.isImport |= (Flags >> 5) & 0x01; 1752 HFI.isPragmaOnce |= (Flags >> 4) & 0x01; 1753 HFI.DirInfo = (Flags >> 1) & 0x07; 1754 HFI.IndexHeaderMapHeader = Flags & 0x01; 1755 // FIXME: Find a better way to handle this. Maybe just store a 1756 // "has been included" flag? 1757 HFI.NumIncludes = std::max(endian::readNext<uint16_t, little, unaligned>(d), 1758 HFI.NumIncludes); 1759 HFI.ControllingMacroID = Reader.getGlobalIdentifierID( 1760 M, endian::readNext<uint32_t, little, unaligned>(d)); 1761 if (unsigned FrameworkOffset = 1762 endian::readNext<uint32_t, little, unaligned>(d)) { 1763 // The framework offset is 1 greater than the actual offset, 1764 // since 0 is used as an indicator for "no framework name". 1765 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1); 1766 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName); 1767 } 1768 1769 assert((End - d) % 4 == 0 && 1770 "Wrong data length in HeaderFileInfo deserialization"); 1771 while (d != End) { 1772 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d); 1773 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3); 1774 LocalSMID >>= 2; 1775 1776 // This header is part of a module. Associate it with the module to enable 1777 // implicit module import. 1778 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID); 1779 Module *Mod = Reader.getSubmodule(GlobalSMID); 1780 FileManager &FileMgr = Reader.getFileManager(); 1781 ModuleMap &ModMap = 1782 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap(); 1783 1784 std::string Filename = key.Filename; 1785 if (key.Imported) 1786 Reader.ResolveImportedPath(M, Filename); 1787 // FIXME: This is not always the right filename-as-written, but we're not 1788 // going to use this information to rebuild the module, so it doesn't make 1789 // a lot of difference. 1790 Module::Header H = { key.Filename, FileMgr.getFile(Filename) }; 1791 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true); 1792 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader); 1793 } 1794 1795 // This HeaderFileInfo was externally loaded. 1796 HFI.External = true; 1797 HFI.IsValid = true; 1798 return HFI; 1799 } 1800 1801 void ASTReader::addPendingMacro(IdentifierInfo *II, 1802 ModuleFile *M, 1803 uint64_t MacroDirectivesOffset) { 1804 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"); 1805 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset)); 1806 } 1807 1808 void ASTReader::ReadDefinedMacros() { 1809 // Note that we are loading defined macros. 1810 Deserializing Macros(this); 1811 1812 for (ModuleFile &I : llvm::reverse(ModuleMgr)) { 1813 BitstreamCursor &MacroCursor = I.MacroCursor; 1814 1815 // If there was no preprocessor block, skip this file. 1816 if (MacroCursor.getBitcodeBytes().empty()) 1817 continue; 1818 1819 BitstreamCursor Cursor = MacroCursor; 1820 Cursor.JumpToBit(I.MacroStartOffset); 1821 1822 RecordData Record; 1823 while (true) { 1824 llvm::BitstreamEntry E = Cursor.advanceSkippingSubblocks(); 1825 1826 switch (E.Kind) { 1827 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1828 case llvm::BitstreamEntry::Error: 1829 Error("malformed block record in AST file"); 1830 return; 1831 case llvm::BitstreamEntry::EndBlock: 1832 goto NextCursor; 1833 1834 case llvm::BitstreamEntry::Record: 1835 Record.clear(); 1836 switch (Cursor.readRecord(E.ID, Record)) { 1837 default: // Default behavior: ignore. 1838 break; 1839 1840 case PP_MACRO_OBJECT_LIKE: 1841 case PP_MACRO_FUNCTION_LIKE: { 1842 IdentifierInfo *II = getLocalIdentifier(I, Record[0]); 1843 if (II->isOutOfDate()) 1844 updateOutOfDateIdentifier(*II); 1845 break; 1846 } 1847 1848 case PP_TOKEN: 1849 // Ignore tokens. 1850 break; 1851 } 1852 break; 1853 } 1854 } 1855 NextCursor: ; 1856 } 1857 } 1858 1859 namespace { 1860 1861 /// \brief Visitor class used to look up identifirs in an AST file. 1862 class IdentifierLookupVisitor { 1863 StringRef Name; 1864 unsigned NameHash; 1865 unsigned PriorGeneration; 1866 unsigned &NumIdentifierLookups; 1867 unsigned &NumIdentifierLookupHits; 1868 IdentifierInfo *Found = nullptr; 1869 1870 public: 1871 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration, 1872 unsigned &NumIdentifierLookups, 1873 unsigned &NumIdentifierLookupHits) 1874 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)), 1875 PriorGeneration(PriorGeneration), 1876 NumIdentifierLookups(NumIdentifierLookups), 1877 NumIdentifierLookupHits(NumIdentifierLookupHits) {} 1878 1879 bool operator()(ModuleFile &M) { 1880 // If we've already searched this module file, skip it now. 1881 if (M.Generation <= PriorGeneration) 1882 return true; 1883 1884 ASTIdentifierLookupTable *IdTable 1885 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable; 1886 if (!IdTable) 1887 return false; 1888 1889 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M, 1890 Found); 1891 ++NumIdentifierLookups; 1892 ASTIdentifierLookupTable::iterator Pos = 1893 IdTable->find_hashed(Name, NameHash, &Trait); 1894 if (Pos == IdTable->end()) 1895 return false; 1896 1897 // Dereferencing the iterator has the effect of building the 1898 // IdentifierInfo node and populating it with the various 1899 // declarations it needs. 1900 ++NumIdentifierLookupHits; 1901 Found = *Pos; 1902 return true; 1903 } 1904 1905 // \brief Retrieve the identifier info found within the module 1906 // files. 1907 IdentifierInfo *getIdentifierInfo() const { return Found; } 1908 }; 1909 1910 } // namespace 1911 1912 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) { 1913 // Note that we are loading an identifier. 1914 Deserializing AnIdentifier(this); 1915 1916 unsigned PriorGeneration = 0; 1917 if (getContext().getLangOpts().Modules) 1918 PriorGeneration = IdentifierGeneration[&II]; 1919 1920 // If there is a global index, look there first to determine which modules 1921 // provably do not have any results for this identifier. 1922 GlobalModuleIndex::HitSet Hits; 1923 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 1924 if (!loadGlobalIndex()) { 1925 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) { 1926 HitsPtr = &Hits; 1927 } 1928 } 1929 1930 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration, 1931 NumIdentifierLookups, 1932 NumIdentifierLookupHits); 1933 ModuleMgr.visit(Visitor, HitsPtr); 1934 markIdentifierUpToDate(&II); 1935 } 1936 1937 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) { 1938 if (!II) 1939 return; 1940 1941 II->setOutOfDate(false); 1942 1943 // Update the generation for this identifier. 1944 if (getContext().getLangOpts().Modules) 1945 IdentifierGeneration[II] = getGeneration(); 1946 } 1947 1948 void ASTReader::resolvePendingMacro(IdentifierInfo *II, 1949 const PendingMacroInfo &PMInfo) { 1950 ModuleFile &M = *PMInfo.M; 1951 1952 BitstreamCursor &Cursor = M.MacroCursor; 1953 SavedStreamPosition SavedPosition(Cursor); 1954 Cursor.JumpToBit(PMInfo.MacroDirectivesOffset); 1955 1956 struct ModuleMacroRecord { 1957 SubmoduleID SubModID; 1958 MacroInfo *MI; 1959 SmallVector<SubmoduleID, 8> Overrides; 1960 }; 1961 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros; 1962 1963 // We expect to see a sequence of PP_MODULE_MACRO records listing exported 1964 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete 1965 // macro histroy. 1966 RecordData Record; 1967 while (true) { 1968 llvm::BitstreamEntry Entry = 1969 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 1970 if (Entry.Kind != llvm::BitstreamEntry::Record) { 1971 Error("malformed block record in AST file"); 1972 return; 1973 } 1974 1975 Record.clear(); 1976 switch ((PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record)) { 1977 case PP_MACRO_DIRECTIVE_HISTORY: 1978 break; 1979 1980 case PP_MODULE_MACRO: { 1981 ModuleMacros.push_back(ModuleMacroRecord()); 1982 auto &Info = ModuleMacros.back(); 1983 Info.SubModID = getGlobalSubmoduleID(M, Record[0]); 1984 Info.MI = getMacro(getGlobalMacroID(M, Record[1])); 1985 for (int I = 2, N = Record.size(); I != N; ++I) 1986 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I])); 1987 continue; 1988 } 1989 1990 default: 1991 Error("malformed block record in AST file"); 1992 return; 1993 } 1994 1995 // We found the macro directive history; that's the last record 1996 // for this macro. 1997 break; 1998 } 1999 2000 // Module macros are listed in reverse dependency order. 2001 { 2002 std::reverse(ModuleMacros.begin(), ModuleMacros.end()); 2003 llvm::SmallVector<ModuleMacro*, 8> Overrides; 2004 for (auto &MMR : ModuleMacros) { 2005 Overrides.clear(); 2006 for (unsigned ModID : MMR.Overrides) { 2007 Module *Mod = getSubmodule(ModID); 2008 auto *Macro = PP.getModuleMacro(Mod, II); 2009 assert(Macro && "missing definition for overridden macro"); 2010 Overrides.push_back(Macro); 2011 } 2012 2013 bool Inserted = false; 2014 Module *Owner = getSubmodule(MMR.SubModID); 2015 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted); 2016 } 2017 } 2018 2019 // Don't read the directive history for a module; we don't have anywhere 2020 // to put it. 2021 if (M.isModule()) 2022 return; 2023 2024 // Deserialize the macro directives history in reverse source-order. 2025 MacroDirective *Latest = nullptr, *Earliest = nullptr; 2026 unsigned Idx = 0, N = Record.size(); 2027 while (Idx < N) { 2028 MacroDirective *MD = nullptr; 2029 SourceLocation Loc = ReadSourceLocation(M, Record, Idx); 2030 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++]; 2031 switch (K) { 2032 case MacroDirective::MD_Define: { 2033 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++])); 2034 MD = PP.AllocateDefMacroDirective(MI, Loc); 2035 break; 2036 } 2037 case MacroDirective::MD_Undefine: 2038 MD = PP.AllocateUndefMacroDirective(Loc); 2039 break; 2040 case MacroDirective::MD_Visibility: 2041 bool isPublic = Record[Idx++]; 2042 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic); 2043 break; 2044 } 2045 2046 if (!Latest) 2047 Latest = MD; 2048 if (Earliest) 2049 Earliest->setPrevious(MD); 2050 Earliest = MD; 2051 } 2052 2053 if (Latest) 2054 PP.setLoadedMacroDirective(II, Earliest, Latest); 2055 } 2056 2057 ASTReader::InputFileInfo 2058 ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) { 2059 // Go find this input file. 2060 BitstreamCursor &Cursor = F.InputFilesCursor; 2061 SavedStreamPosition SavedPosition(Cursor); 2062 Cursor.JumpToBit(F.InputFileOffsets[ID-1]); 2063 2064 unsigned Code = Cursor.ReadCode(); 2065 RecordData Record; 2066 StringRef Blob; 2067 2068 unsigned Result = Cursor.readRecord(Code, Record, &Blob); 2069 assert(static_cast<InputFileRecordTypes>(Result) == INPUT_FILE && 2070 "invalid record type for input file"); 2071 (void)Result; 2072 2073 assert(Record[0] == ID && "Bogus stored ID or offset"); 2074 InputFileInfo R; 2075 R.StoredSize = static_cast<off_t>(Record[1]); 2076 R.StoredTime = static_cast<time_t>(Record[2]); 2077 R.Overridden = static_cast<bool>(Record[3]); 2078 R.Transient = static_cast<bool>(Record[4]); 2079 R.TopLevelModuleMap = static_cast<bool>(Record[5]); 2080 R.Filename = Blob; 2081 ResolveImportedPath(F, R.Filename); 2082 return R; 2083 } 2084 2085 static unsigned moduleKindForDiagnostic(ModuleKind Kind); 2086 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { 2087 // If this ID is bogus, just return an empty input file. 2088 if (ID == 0 || ID > F.InputFilesLoaded.size()) 2089 return InputFile(); 2090 2091 // If we've already loaded this input file, return it. 2092 if (F.InputFilesLoaded[ID-1].getFile()) 2093 return F.InputFilesLoaded[ID-1]; 2094 2095 if (F.InputFilesLoaded[ID-1].isNotFound()) 2096 return InputFile(); 2097 2098 // Go find this input file. 2099 BitstreamCursor &Cursor = F.InputFilesCursor; 2100 SavedStreamPosition SavedPosition(Cursor); 2101 Cursor.JumpToBit(F.InputFileOffsets[ID-1]); 2102 2103 InputFileInfo FI = readInputFileInfo(F, ID); 2104 off_t StoredSize = FI.StoredSize; 2105 time_t StoredTime = FI.StoredTime; 2106 bool Overridden = FI.Overridden; 2107 bool Transient = FI.Transient; 2108 StringRef Filename = FI.Filename; 2109 2110 const FileEntry *File = FileMgr.getFile(Filename, /*OpenFile=*/false); 2111 // If we didn't find the file, resolve it relative to the 2112 // original directory from which this AST file was created. 2113 if (File == nullptr && !F.OriginalDir.empty() && !F.BaseDirectory.empty() && 2114 F.OriginalDir != F.BaseDirectory) { 2115 std::string Resolved = resolveFileRelativeToOriginalDir( 2116 Filename, F.OriginalDir, F.BaseDirectory); 2117 if (!Resolved.empty()) 2118 File = FileMgr.getFile(Resolved); 2119 } 2120 2121 // For an overridden file, create a virtual file with the stored 2122 // size/timestamp. 2123 if ((Overridden || Transient) && File == nullptr) 2124 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime); 2125 2126 if (File == nullptr) { 2127 if (Complain) { 2128 std::string ErrorStr = "could not find file '"; 2129 ErrorStr += Filename; 2130 ErrorStr += "' referenced by AST file '"; 2131 ErrorStr += F.FileName; 2132 ErrorStr += "'"; 2133 Error(ErrorStr); 2134 } 2135 // Record that we didn't find the file. 2136 F.InputFilesLoaded[ID-1] = InputFile::getNotFound(); 2137 return InputFile(); 2138 } 2139 2140 // Check if there was a request to override the contents of the file 2141 // that was part of the precompiled header. Overriding such a file 2142 // can lead to problems when lexing using the source locations from the 2143 // PCH. 2144 SourceManager &SM = getSourceManager(); 2145 // FIXME: Reject if the overrides are different. 2146 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) { 2147 if (Complain) 2148 Error(diag::err_fe_pch_file_overridden, Filename); 2149 // After emitting the diagnostic, recover by disabling the override so 2150 // that the original file will be used. 2151 // 2152 // FIXME: This recovery is just as broken as the original state; there may 2153 // be another precompiled module that's using the overridden contents, or 2154 // we might be half way through parsing it. Instead, we should treat the 2155 // overridden contents as belonging to a separate FileEntry. 2156 SM.disableFileContentsOverride(File); 2157 // The FileEntry is a virtual file entry with the size of the contents 2158 // that would override the original contents. Set it to the original's 2159 // size/time. 2160 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File), 2161 StoredSize, StoredTime); 2162 } 2163 2164 bool IsOutOfDate = false; 2165 2166 // For an overridden file, there is nothing to validate. 2167 if (!Overridden && // 2168 (StoredSize != File->getSize() || 2169 (StoredTime && StoredTime != File->getModificationTime() && 2170 !DisableValidation) 2171 )) { 2172 if (Complain) { 2173 // Build a list of the PCH imports that got us here (in reverse). 2174 SmallVector<ModuleFile *, 4> ImportStack(1, &F); 2175 while (!ImportStack.back()->ImportedBy.empty()) 2176 ImportStack.push_back(ImportStack.back()->ImportedBy[0]); 2177 2178 // The top-level PCH is stale. 2179 StringRef TopLevelPCHName(ImportStack.back()->FileName); 2180 unsigned DiagnosticKind = moduleKindForDiagnostic(ImportStack.back()->Kind); 2181 if (DiagnosticKind == 0) 2182 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName); 2183 else if (DiagnosticKind == 1) 2184 Error(diag::err_fe_module_file_modified, Filename, TopLevelPCHName); 2185 else 2186 Error(diag::err_fe_ast_file_modified, Filename, TopLevelPCHName); 2187 2188 // Print the import stack. 2189 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) { 2190 Diag(diag::note_pch_required_by) 2191 << Filename << ImportStack[0]->FileName; 2192 for (unsigned I = 1; I < ImportStack.size(); ++I) 2193 Diag(diag::note_pch_required_by) 2194 << ImportStack[I-1]->FileName << ImportStack[I]->FileName; 2195 } 2196 2197 if (!Diags.isDiagnosticInFlight()) 2198 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName; 2199 } 2200 2201 IsOutOfDate = true; 2202 } 2203 // FIXME: If the file is overridden and we've already opened it, 2204 // issue an error (or split it into a separate FileEntry). 2205 2206 InputFile IF = InputFile(File, Overridden || Transient, IsOutOfDate); 2207 2208 // Note that we've loaded this input file. 2209 F.InputFilesLoaded[ID-1] = IF; 2210 return IF; 2211 } 2212 2213 /// \brief If we are loading a relocatable PCH or module file, and the filename 2214 /// is not an absolute path, add the system or module root to the beginning of 2215 /// the file name. 2216 void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) { 2217 // Resolve relative to the base directory, if we have one. 2218 if (!M.BaseDirectory.empty()) 2219 return ResolveImportedPath(Filename, M.BaseDirectory); 2220 } 2221 2222 void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) { 2223 if (Filename.empty() || llvm::sys::path::is_absolute(Filename)) 2224 return; 2225 2226 SmallString<128> Buffer; 2227 llvm::sys::path::append(Buffer, Prefix, Filename); 2228 Filename.assign(Buffer.begin(), Buffer.end()); 2229 } 2230 2231 static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) { 2232 switch (ARR) { 2233 case ASTReader::Failure: return true; 2234 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing); 2235 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate); 2236 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch); 2237 case ASTReader::ConfigurationMismatch: 2238 return !(Caps & ASTReader::ARR_ConfigurationMismatch); 2239 case ASTReader::HadErrors: return true; 2240 case ASTReader::Success: return false; 2241 } 2242 2243 llvm_unreachable("unknown ASTReadResult"); 2244 } 2245 2246 ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( 2247 BitstreamCursor &Stream, unsigned ClientLoadCapabilities, 2248 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener, 2249 std::string &SuggestedPredefines) { 2250 if (Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) 2251 return Failure; 2252 2253 // Read all of the records in the options block. 2254 RecordData Record; 2255 ASTReadResult Result = Success; 2256 while (true) { 2257 llvm::BitstreamEntry Entry = Stream.advance(); 2258 2259 switch (Entry.Kind) { 2260 case llvm::BitstreamEntry::Error: 2261 case llvm::BitstreamEntry::SubBlock: 2262 return Failure; 2263 2264 case llvm::BitstreamEntry::EndBlock: 2265 return Result; 2266 2267 case llvm::BitstreamEntry::Record: 2268 // The interesting case. 2269 break; 2270 } 2271 2272 // Read and process a record. 2273 Record.clear(); 2274 switch ((OptionsRecordTypes)Stream.readRecord(Entry.ID, Record)) { 2275 case LANGUAGE_OPTIONS: { 2276 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2277 if (ParseLanguageOptions(Record, Complain, Listener, 2278 AllowCompatibleConfigurationMismatch)) 2279 Result = ConfigurationMismatch; 2280 break; 2281 } 2282 2283 case TARGET_OPTIONS: { 2284 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2285 if (ParseTargetOptions(Record, Complain, Listener, 2286 AllowCompatibleConfigurationMismatch)) 2287 Result = ConfigurationMismatch; 2288 break; 2289 } 2290 2291 case FILE_SYSTEM_OPTIONS: { 2292 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2293 if (!AllowCompatibleConfigurationMismatch && 2294 ParseFileSystemOptions(Record, Complain, Listener)) 2295 Result = ConfigurationMismatch; 2296 break; 2297 } 2298 2299 case HEADER_SEARCH_OPTIONS: { 2300 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2301 if (!AllowCompatibleConfigurationMismatch && 2302 ParseHeaderSearchOptions(Record, Complain, Listener)) 2303 Result = ConfigurationMismatch; 2304 break; 2305 } 2306 2307 case PREPROCESSOR_OPTIONS: 2308 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2309 if (!AllowCompatibleConfigurationMismatch && 2310 ParsePreprocessorOptions(Record, Complain, Listener, 2311 SuggestedPredefines)) 2312 Result = ConfigurationMismatch; 2313 break; 2314 } 2315 } 2316 } 2317 2318 ASTReader::ASTReadResult 2319 ASTReader::ReadControlBlock(ModuleFile &F, 2320 SmallVectorImpl<ImportedModule> &Loaded, 2321 const ModuleFile *ImportedBy, 2322 unsigned ClientLoadCapabilities) { 2323 BitstreamCursor &Stream = F.Stream; 2324 ASTReadResult Result = Success; 2325 2326 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) { 2327 Error("malformed block record in AST file"); 2328 return Failure; 2329 } 2330 2331 // Lambda to read the unhashed control block the first time it's called. 2332 // 2333 // For PCM files, the unhashed control block cannot be read until after the 2334 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still 2335 // need to look ahead before reading the IMPORTS record. For consistency, 2336 // this block is always read somehow (see BitstreamEntry::EndBlock). 2337 bool HasReadUnhashedControlBlock = false; 2338 auto readUnhashedControlBlockOnce = [&]() { 2339 if (!HasReadUnhashedControlBlock) { 2340 HasReadUnhashedControlBlock = true; 2341 if (ASTReadResult Result = 2342 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities)) 2343 return Result; 2344 } 2345 return Success; 2346 }; 2347 2348 // Read all of the records and blocks in the control block. 2349 RecordData Record; 2350 unsigned NumInputs = 0; 2351 unsigned NumUserInputs = 0; 2352 while (true) { 2353 llvm::BitstreamEntry Entry = Stream.advance(); 2354 2355 switch (Entry.Kind) { 2356 case llvm::BitstreamEntry::Error: 2357 Error("malformed block record in AST file"); 2358 return Failure; 2359 case llvm::BitstreamEntry::EndBlock: { 2360 // Validate the module before returning. This call catches an AST with 2361 // no module name and no imports. 2362 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2363 return Result; 2364 2365 // Validate input files. 2366 const HeaderSearchOptions &HSOpts = 2367 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 2368 2369 // All user input files reside at the index range [0, NumUserInputs), and 2370 // system input files reside at [NumUserInputs, NumInputs). For explicitly 2371 // loaded module files, ignore missing inputs. 2372 if (!DisableValidation && F.Kind != MK_ExplicitModule && 2373 F.Kind != MK_PrebuiltModule) { 2374 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 2375 2376 // If we are reading a module, we will create a verification timestamp, 2377 // so we verify all input files. Otherwise, verify only user input 2378 // files. 2379 2380 unsigned N = NumUserInputs; 2381 if (ValidateSystemInputs || 2382 (HSOpts.ModulesValidateOncePerBuildSession && 2383 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp && 2384 F.Kind == MK_ImplicitModule)) 2385 N = NumInputs; 2386 2387 for (unsigned I = 0; I < N; ++I) { 2388 InputFile IF = getInputFile(F, I+1, Complain); 2389 if (!IF.getFile() || IF.isOutOfDate()) 2390 return OutOfDate; 2391 } 2392 } 2393 2394 if (Listener) 2395 Listener->visitModuleFile(F.FileName, F.Kind); 2396 2397 if (Listener && Listener->needsInputFileVisitation()) { 2398 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs 2399 : NumUserInputs; 2400 for (unsigned I = 0; I < N; ++I) { 2401 bool IsSystem = I >= NumUserInputs; 2402 InputFileInfo FI = readInputFileInfo(F, I+1); 2403 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden, 2404 F.Kind == MK_ExplicitModule || 2405 F.Kind == MK_PrebuiltModule); 2406 } 2407 } 2408 2409 return Result; 2410 } 2411 2412 case llvm::BitstreamEntry::SubBlock: 2413 switch (Entry.ID) { 2414 case INPUT_FILES_BLOCK_ID: 2415 F.InputFilesCursor = Stream; 2416 if (Stream.SkipBlock() || // Skip with the main cursor 2417 // Read the abbreviations 2418 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) { 2419 Error("malformed block record in AST file"); 2420 return Failure; 2421 } 2422 continue; 2423 2424 case OPTIONS_BLOCK_ID: 2425 // If we're reading the first module for this group, check its options 2426 // are compatible with ours. For modules it imports, no further checking 2427 // is required, because we checked them when we built it. 2428 if (Listener && !ImportedBy) { 2429 // Should we allow the configuration of the module file to differ from 2430 // the configuration of the current translation unit in a compatible 2431 // way? 2432 // 2433 // FIXME: Allow this for files explicitly specified with -include-pch. 2434 bool AllowCompatibleConfigurationMismatch = 2435 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 2436 2437 Result = ReadOptionsBlock(Stream, ClientLoadCapabilities, 2438 AllowCompatibleConfigurationMismatch, 2439 *Listener, SuggestedPredefines); 2440 if (Result == Failure) { 2441 Error("malformed block record in AST file"); 2442 return Result; 2443 } 2444 2445 if (DisableValidation || 2446 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 2447 Result = Success; 2448 2449 // If we can't load the module, exit early since we likely 2450 // will rebuild the module anyway. The stream may be in the 2451 // middle of a block. 2452 if (Result != Success) 2453 return Result; 2454 } else if (Stream.SkipBlock()) { 2455 Error("malformed block record in AST file"); 2456 return Failure; 2457 } 2458 continue; 2459 2460 default: 2461 if (Stream.SkipBlock()) { 2462 Error("malformed block record in AST file"); 2463 return Failure; 2464 } 2465 continue; 2466 } 2467 2468 case llvm::BitstreamEntry::Record: 2469 // The interesting case. 2470 break; 2471 } 2472 2473 // Read and process a record. 2474 Record.clear(); 2475 StringRef Blob; 2476 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) { 2477 case METADATA: { 2478 if (Record[0] != VERSION_MAJOR && !DisableValidation) { 2479 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2480 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old 2481 : diag::err_pch_version_too_new); 2482 return VersionMismatch; 2483 } 2484 2485 bool hasErrors = Record[6]; 2486 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) { 2487 Diag(diag::err_pch_with_compiler_errors); 2488 return HadErrors; 2489 } 2490 if (hasErrors) { 2491 Diags.ErrorOccurred = true; 2492 Diags.UncompilableErrorOccurred = true; 2493 Diags.UnrecoverableErrorOccurred = true; 2494 } 2495 2496 F.RelocatablePCH = Record[4]; 2497 // Relative paths in a relocatable PCH are relative to our sysroot. 2498 if (F.RelocatablePCH) 2499 F.BaseDirectory = isysroot.empty() ? "/" : isysroot; 2500 2501 F.HasTimestamps = Record[5]; 2502 2503 const std::string &CurBranch = getClangFullRepositoryVersion(); 2504 StringRef ASTBranch = Blob; 2505 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) { 2506 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2507 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch; 2508 return VersionMismatch; 2509 } 2510 break; 2511 } 2512 2513 case IMPORTS: { 2514 // Validate the AST before processing any imports (otherwise, untangling 2515 // them can be error-prone and expensive). A module will have a name and 2516 // will already have been validated, but this catches the PCH case. 2517 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2518 return Result; 2519 2520 // Load each of the imported PCH files. 2521 unsigned Idx = 0, N = Record.size(); 2522 while (Idx < N) { 2523 // Read information about the AST file. 2524 ModuleKind ImportedKind = (ModuleKind)Record[Idx++]; 2525 // The import location will be the local one for now; we will adjust 2526 // all import locations of module imports after the global source 2527 // location info are setup, in ReadAST. 2528 SourceLocation ImportLoc = 2529 ReadUntranslatedSourceLocation(Record[Idx++]); 2530 off_t StoredSize = (off_t)Record[Idx++]; 2531 time_t StoredModTime = (time_t)Record[Idx++]; 2532 ASTFileSignature StoredSignature = { 2533 {{(uint32_t)Record[Idx++], (uint32_t)Record[Idx++], 2534 (uint32_t)Record[Idx++], (uint32_t)Record[Idx++], 2535 (uint32_t)Record[Idx++]}}}; 2536 2537 std::string ImportedName = ReadString(Record, Idx); 2538 std::string ImportedFile; 2539 2540 // For prebuilt and explicit modules first consult the file map for 2541 // an override. Note that here we don't search prebuilt module 2542 // directories, only the explicit name to file mappings. Also, we will 2543 // still verify the size/signature making sure it is essentially the 2544 // same file but perhaps in a different location. 2545 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule) 2546 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName( 2547 ImportedName, /*FileMapOnly*/ true); 2548 2549 if (ImportedFile.empty()) 2550 ImportedFile = ReadPath(F, Record, Idx); 2551 else 2552 SkipPath(Record, Idx); 2553 2554 // If our client can't cope with us being out of date, we can't cope with 2555 // our dependency being missing. 2556 unsigned Capabilities = ClientLoadCapabilities; 2557 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2558 Capabilities &= ~ARR_Missing; 2559 2560 // Load the AST file. 2561 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, 2562 Loaded, StoredSize, StoredModTime, 2563 StoredSignature, Capabilities); 2564 2565 // If we diagnosed a problem, produce a backtrace. 2566 if (isDiagnosedResult(Result, Capabilities)) 2567 Diag(diag::note_module_file_imported_by) 2568 << F.FileName << !F.ModuleName.empty() << F.ModuleName; 2569 2570 switch (Result) { 2571 case Failure: return Failure; 2572 // If we have to ignore the dependency, we'll have to ignore this too. 2573 case Missing: 2574 case OutOfDate: return OutOfDate; 2575 case VersionMismatch: return VersionMismatch; 2576 case ConfigurationMismatch: return ConfigurationMismatch; 2577 case HadErrors: return HadErrors; 2578 case Success: break; 2579 } 2580 } 2581 break; 2582 } 2583 2584 case ORIGINAL_FILE: 2585 F.OriginalSourceFileID = FileID::get(Record[0]); 2586 F.ActualOriginalSourceFileName = Blob; 2587 F.OriginalSourceFileName = F.ActualOriginalSourceFileName; 2588 ResolveImportedPath(F, F.OriginalSourceFileName); 2589 break; 2590 2591 case ORIGINAL_FILE_ID: 2592 F.OriginalSourceFileID = FileID::get(Record[0]); 2593 break; 2594 2595 case ORIGINAL_PCH_DIR: 2596 F.OriginalDir = Blob; 2597 break; 2598 2599 case MODULE_NAME: 2600 F.ModuleName = Blob; 2601 if (Listener) 2602 Listener->ReadModuleName(F.ModuleName); 2603 2604 // Validate the AST as soon as we have a name so we can exit early on 2605 // failure. 2606 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2607 return Result; 2608 2609 break; 2610 2611 case MODULE_DIRECTORY: { 2612 assert(!F.ModuleName.empty() && 2613 "MODULE_DIRECTORY found before MODULE_NAME"); 2614 // If we've already loaded a module map file covering this module, we may 2615 // have a better path for it (relative to the current build). 2616 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName); 2617 if (M && M->Directory) { 2618 // If we're implicitly loading a module, the base directory can't 2619 // change between the build and use. 2620 if (F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) { 2621 const DirectoryEntry *BuildDir = 2622 PP.getFileManager().getDirectory(Blob); 2623 if (!BuildDir || BuildDir != M->Directory) { 2624 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2625 Diag(diag::err_imported_module_relocated) 2626 << F.ModuleName << Blob << M->Directory->getName(); 2627 return OutOfDate; 2628 } 2629 } 2630 F.BaseDirectory = M->Directory->getName(); 2631 } else { 2632 F.BaseDirectory = Blob; 2633 } 2634 break; 2635 } 2636 2637 case MODULE_MAP_FILE: 2638 if (ASTReadResult Result = 2639 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities)) 2640 return Result; 2641 break; 2642 2643 case INPUT_FILE_OFFSETS: 2644 NumInputs = Record[0]; 2645 NumUserInputs = Record[1]; 2646 F.InputFileOffsets = 2647 (const llvm::support::unaligned_uint64_t *)Blob.data(); 2648 F.InputFilesLoaded.resize(NumInputs); 2649 F.NumUserInputFiles = NumUserInputs; 2650 break; 2651 } 2652 } 2653 } 2654 2655 ASTReader::ASTReadResult 2656 ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 2657 BitstreamCursor &Stream = F.Stream; 2658 2659 if (Stream.EnterSubBlock(AST_BLOCK_ID)) { 2660 Error("malformed block record in AST file"); 2661 return Failure; 2662 } 2663 2664 // Read all of the records and blocks for the AST file. 2665 RecordData Record; 2666 while (true) { 2667 llvm::BitstreamEntry Entry = Stream.advance(); 2668 2669 switch (Entry.Kind) { 2670 case llvm::BitstreamEntry::Error: 2671 Error("error at end of module block in AST file"); 2672 return Failure; 2673 case llvm::BitstreamEntry::EndBlock: 2674 // Outside of C++, we do not store a lookup map for the translation unit. 2675 // Instead, mark it as needing a lookup map to be built if this module 2676 // contains any declarations lexically within it (which it always does!). 2677 // This usually has no cost, since we very rarely need the lookup map for 2678 // the translation unit outside C++. 2679 if (ASTContext *Ctx = ContextObj) { 2680 DeclContext *DC = Ctx->getTranslationUnitDecl(); 2681 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus) 2682 DC->setMustBuildLookupTable(); 2683 } 2684 2685 return Success; 2686 case llvm::BitstreamEntry::SubBlock: 2687 switch (Entry.ID) { 2688 case DECLTYPES_BLOCK_ID: 2689 // We lazily load the decls block, but we want to set up the 2690 // DeclsCursor cursor to point into it. Clone our current bitcode 2691 // cursor to it, enter the block and read the abbrevs in that block. 2692 // With the main cursor, we just skip over it. 2693 F.DeclsCursor = Stream; 2694 if (Stream.SkipBlock() || // Skip with the main cursor. 2695 // Read the abbrevs. 2696 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) { 2697 Error("malformed block record in AST file"); 2698 return Failure; 2699 } 2700 break; 2701 2702 case PREPROCESSOR_BLOCK_ID: 2703 F.MacroCursor = Stream; 2704 if (!PP.getExternalSource()) 2705 PP.setExternalSource(this); 2706 2707 if (Stream.SkipBlock() || 2708 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) { 2709 Error("malformed block record in AST file"); 2710 return Failure; 2711 } 2712 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo(); 2713 break; 2714 2715 case PREPROCESSOR_DETAIL_BLOCK_ID: 2716 F.PreprocessorDetailCursor = Stream; 2717 if (Stream.SkipBlock() || 2718 ReadBlockAbbrevs(F.PreprocessorDetailCursor, 2719 PREPROCESSOR_DETAIL_BLOCK_ID)) { 2720 Error("malformed preprocessor detail record in AST file"); 2721 return Failure; 2722 } 2723 F.PreprocessorDetailStartOffset 2724 = F.PreprocessorDetailCursor.GetCurrentBitNo(); 2725 2726 if (!PP.getPreprocessingRecord()) 2727 PP.createPreprocessingRecord(); 2728 if (!PP.getPreprocessingRecord()->getExternalSource()) 2729 PP.getPreprocessingRecord()->SetExternalSource(*this); 2730 break; 2731 2732 case SOURCE_MANAGER_BLOCK_ID: 2733 if (ReadSourceManagerBlock(F)) 2734 return Failure; 2735 break; 2736 2737 case SUBMODULE_BLOCK_ID: 2738 if (ASTReadResult Result = 2739 ReadSubmoduleBlock(F, ClientLoadCapabilities)) 2740 return Result; 2741 break; 2742 2743 case COMMENTS_BLOCK_ID: { 2744 BitstreamCursor C = Stream; 2745 if (Stream.SkipBlock() || 2746 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) { 2747 Error("malformed comments block in AST file"); 2748 return Failure; 2749 } 2750 CommentsCursors.push_back(std::make_pair(C, &F)); 2751 break; 2752 } 2753 2754 default: 2755 if (Stream.SkipBlock()) { 2756 Error("malformed block record in AST file"); 2757 return Failure; 2758 } 2759 break; 2760 } 2761 continue; 2762 2763 case llvm::BitstreamEntry::Record: 2764 // The interesting case. 2765 break; 2766 } 2767 2768 // Read and process a record. 2769 Record.clear(); 2770 StringRef Blob; 2771 auto RecordType = 2772 (ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob); 2773 2774 // If we're not loading an AST context, we don't care about most records. 2775 if (!ContextObj) { 2776 switch (RecordType) { 2777 case IDENTIFIER_TABLE: 2778 case IDENTIFIER_OFFSET: 2779 case INTERESTING_IDENTIFIERS: 2780 case STATISTICS: 2781 case PP_CONDITIONAL_STACK: 2782 case PP_COUNTER_VALUE: 2783 case SOURCE_LOCATION_OFFSETS: 2784 case MODULE_OFFSET_MAP: 2785 case SOURCE_MANAGER_LINE_TABLE: 2786 case SOURCE_LOCATION_PRELOADS: 2787 case PPD_ENTITIES_OFFSETS: 2788 case HEADER_SEARCH_TABLE: 2789 case IMPORTED_MODULES: 2790 case MACRO_OFFSET: 2791 break; 2792 default: 2793 continue; 2794 } 2795 } 2796 2797 switch (RecordType) { 2798 default: // Default behavior: ignore. 2799 break; 2800 2801 case TYPE_OFFSET: { 2802 if (F.LocalNumTypes != 0) { 2803 Error("duplicate TYPE_OFFSET record in AST file"); 2804 return Failure; 2805 } 2806 F.TypeOffsets = (const uint32_t *)Blob.data(); 2807 F.LocalNumTypes = Record[0]; 2808 unsigned LocalBaseTypeIndex = Record[1]; 2809 F.BaseTypeIndex = getTotalNumTypes(); 2810 2811 if (F.LocalNumTypes > 0) { 2812 // Introduce the global -> local mapping for types within this module. 2813 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F)); 2814 2815 // Introduce the local -> global mapping for types within this module. 2816 F.TypeRemap.insertOrReplace( 2817 std::make_pair(LocalBaseTypeIndex, 2818 F.BaseTypeIndex - LocalBaseTypeIndex)); 2819 2820 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes); 2821 } 2822 break; 2823 } 2824 2825 case DECL_OFFSET: { 2826 if (F.LocalNumDecls != 0) { 2827 Error("duplicate DECL_OFFSET record in AST file"); 2828 return Failure; 2829 } 2830 F.DeclOffsets = (const DeclOffset *)Blob.data(); 2831 F.LocalNumDecls = Record[0]; 2832 unsigned LocalBaseDeclID = Record[1]; 2833 F.BaseDeclID = getTotalNumDecls(); 2834 2835 if (F.LocalNumDecls > 0) { 2836 // Introduce the global -> local mapping for declarations within this 2837 // module. 2838 GlobalDeclMap.insert( 2839 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F)); 2840 2841 // Introduce the local -> global mapping for declarations within this 2842 // module. 2843 F.DeclRemap.insertOrReplace( 2844 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID)); 2845 2846 // Introduce the global -> local mapping for declarations within this 2847 // module. 2848 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID; 2849 2850 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls); 2851 } 2852 break; 2853 } 2854 2855 case TU_UPDATE_LEXICAL: { 2856 DeclContext *TU = ContextObj->getTranslationUnitDecl(); 2857 LexicalContents Contents( 2858 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 2859 Blob.data()), 2860 static_cast<unsigned int>(Blob.size() / 4)); 2861 TULexicalDecls.push_back(std::make_pair(&F, Contents)); 2862 TU->setHasExternalLexicalStorage(true); 2863 break; 2864 } 2865 2866 case UPDATE_VISIBLE: { 2867 unsigned Idx = 0; 2868 serialization::DeclID ID = ReadDeclID(F, Record, Idx); 2869 auto *Data = (const unsigned char*)Blob.data(); 2870 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data}); 2871 // If we've already loaded the decl, perform the updates when we finish 2872 // loading this block. 2873 if (Decl *D = GetExistingDecl(ID)) 2874 PendingUpdateRecords.push_back( 2875 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 2876 break; 2877 } 2878 2879 case IDENTIFIER_TABLE: 2880 F.IdentifierTableData = Blob.data(); 2881 if (Record[0]) { 2882 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create( 2883 (const unsigned char *)F.IdentifierTableData + Record[0], 2884 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t), 2885 (const unsigned char *)F.IdentifierTableData, 2886 ASTIdentifierLookupTrait(*this, F)); 2887 2888 PP.getIdentifierTable().setExternalIdentifierLookup(this); 2889 } 2890 break; 2891 2892 case IDENTIFIER_OFFSET: { 2893 if (F.LocalNumIdentifiers != 0) { 2894 Error("duplicate IDENTIFIER_OFFSET record in AST file"); 2895 return Failure; 2896 } 2897 F.IdentifierOffsets = (const uint32_t *)Blob.data(); 2898 F.LocalNumIdentifiers = Record[0]; 2899 unsigned LocalBaseIdentifierID = Record[1]; 2900 F.BaseIdentifierID = getTotalNumIdentifiers(); 2901 2902 if (F.LocalNumIdentifiers > 0) { 2903 // Introduce the global -> local mapping for identifiers within this 2904 // module. 2905 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1, 2906 &F)); 2907 2908 // Introduce the local -> global mapping for identifiers within this 2909 // module. 2910 F.IdentifierRemap.insertOrReplace( 2911 std::make_pair(LocalBaseIdentifierID, 2912 F.BaseIdentifierID - LocalBaseIdentifierID)); 2913 2914 IdentifiersLoaded.resize(IdentifiersLoaded.size() 2915 + F.LocalNumIdentifiers); 2916 } 2917 break; 2918 } 2919 2920 case INTERESTING_IDENTIFIERS: 2921 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end()); 2922 break; 2923 2924 case EAGERLY_DESERIALIZED_DECLS: 2925 // FIXME: Skip reading this record if our ASTConsumer doesn't care 2926 // about "interesting" decls (for instance, if we're building a module). 2927 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2928 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 2929 break; 2930 2931 case MODULAR_CODEGEN_DECLS: 2932 // FIXME: Skip reading this record if our ASTConsumer doesn't care about 2933 // them (ie: if we're not codegenerating this module). 2934 if (F.Kind == MK_MainFile) 2935 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2936 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 2937 break; 2938 2939 case SPECIAL_TYPES: 2940 if (SpecialTypes.empty()) { 2941 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2942 SpecialTypes.push_back(getGlobalTypeID(F, Record[I])); 2943 break; 2944 } 2945 2946 if (SpecialTypes.size() != Record.size()) { 2947 Error("invalid special-types record"); 2948 return Failure; 2949 } 2950 2951 for (unsigned I = 0, N = Record.size(); I != N; ++I) { 2952 serialization::TypeID ID = getGlobalTypeID(F, Record[I]); 2953 if (!SpecialTypes[I]) 2954 SpecialTypes[I] = ID; 2955 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate 2956 // merge step? 2957 } 2958 break; 2959 2960 case STATISTICS: 2961 TotalNumStatements += Record[0]; 2962 TotalNumMacros += Record[1]; 2963 TotalLexicalDeclContexts += Record[2]; 2964 TotalVisibleDeclContexts += Record[3]; 2965 break; 2966 2967 case UNUSED_FILESCOPED_DECLS: 2968 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2969 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I])); 2970 break; 2971 2972 case DELEGATING_CTORS: 2973 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2974 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I])); 2975 break; 2976 2977 case WEAK_UNDECLARED_IDENTIFIERS: 2978 if (Record.size() % 4 != 0) { 2979 Error("invalid weak identifiers record"); 2980 return Failure; 2981 } 2982 2983 // FIXME: Ignore weak undeclared identifiers from non-original PCH 2984 // files. This isn't the way to do it :) 2985 WeakUndeclaredIdentifiers.clear(); 2986 2987 // Translate the weak, undeclared identifiers into global IDs. 2988 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) { 2989 WeakUndeclaredIdentifiers.push_back( 2990 getGlobalIdentifierID(F, Record[I++])); 2991 WeakUndeclaredIdentifiers.push_back( 2992 getGlobalIdentifierID(F, Record[I++])); 2993 WeakUndeclaredIdentifiers.push_back( 2994 ReadSourceLocation(F, Record, I).getRawEncoding()); 2995 WeakUndeclaredIdentifiers.push_back(Record[I++]); 2996 } 2997 break; 2998 2999 case SELECTOR_OFFSETS: { 3000 F.SelectorOffsets = (const uint32_t *)Blob.data(); 3001 F.LocalNumSelectors = Record[0]; 3002 unsigned LocalBaseSelectorID = Record[1]; 3003 F.BaseSelectorID = getTotalNumSelectors(); 3004 3005 if (F.LocalNumSelectors > 0) { 3006 // Introduce the global -> local mapping for selectors within this 3007 // module. 3008 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F)); 3009 3010 // Introduce the local -> global mapping for selectors within this 3011 // module. 3012 F.SelectorRemap.insertOrReplace( 3013 std::make_pair(LocalBaseSelectorID, 3014 F.BaseSelectorID - LocalBaseSelectorID)); 3015 3016 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors); 3017 } 3018 break; 3019 } 3020 3021 case METHOD_POOL: 3022 F.SelectorLookupTableData = (const unsigned char *)Blob.data(); 3023 if (Record[0]) 3024 F.SelectorLookupTable 3025 = ASTSelectorLookupTable::Create( 3026 F.SelectorLookupTableData + Record[0], 3027 F.SelectorLookupTableData, 3028 ASTSelectorLookupTrait(*this, F)); 3029 TotalNumMethodPoolEntries += Record[1]; 3030 break; 3031 3032 case REFERENCED_SELECTOR_POOL: 3033 if (!Record.empty()) { 3034 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) { 3035 ReferencedSelectorsData.push_back(getGlobalSelectorID(F, 3036 Record[Idx++])); 3037 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx). 3038 getRawEncoding()); 3039 } 3040 } 3041 break; 3042 3043 case PP_CONDITIONAL_STACK: 3044 if (!Record.empty()) { 3045 unsigned Idx = 0, End = Record.size() - 1; 3046 bool ReachedEOFWhileSkipping = Record[Idx++]; 3047 llvm::Optional<Preprocessor::PreambleSkipInfo> SkipInfo; 3048 if (ReachedEOFWhileSkipping) { 3049 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx); 3050 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx); 3051 bool FoundNonSkipPortion = Record[Idx++]; 3052 bool FoundElse = Record[Idx++]; 3053 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx); 3054 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion, 3055 FoundElse, ElseLoc); 3056 } 3057 SmallVector<PPConditionalInfo, 4> ConditionalStack; 3058 while (Idx < End) { 3059 auto Loc = ReadSourceLocation(F, Record, Idx); 3060 bool WasSkipping = Record[Idx++]; 3061 bool FoundNonSkip = Record[Idx++]; 3062 bool FoundElse = Record[Idx++]; 3063 ConditionalStack.push_back( 3064 {Loc, WasSkipping, FoundNonSkip, FoundElse}); 3065 } 3066 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo); 3067 } 3068 break; 3069 3070 case PP_COUNTER_VALUE: 3071 if (!Record.empty() && Listener) 3072 Listener->ReadCounter(F, Record[0]); 3073 break; 3074 3075 case FILE_SORTED_DECLS: 3076 F.FileSortedDecls = (const DeclID *)Blob.data(); 3077 F.NumFileSortedDecls = Record[0]; 3078 break; 3079 3080 case SOURCE_LOCATION_OFFSETS: { 3081 F.SLocEntryOffsets = (const uint32_t *)Blob.data(); 3082 F.LocalNumSLocEntries = Record[0]; 3083 unsigned SLocSpaceSize = Record[1]; 3084 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) = 3085 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries, 3086 SLocSpaceSize); 3087 if (!F.SLocEntryBaseID) { 3088 Error("ran out of source locations"); 3089 break; 3090 } 3091 // Make our entry in the range map. BaseID is negative and growing, so 3092 // we invert it. Because we invert it, though, we need the other end of 3093 // the range. 3094 unsigned RangeStart = 3095 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1; 3096 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F)); 3097 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset); 3098 3099 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing. 3100 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0); 3101 GlobalSLocOffsetMap.insert( 3102 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset 3103 - SLocSpaceSize,&F)); 3104 3105 // Initialize the remapping table. 3106 // Invalid stays invalid. 3107 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0)); 3108 // This module. Base was 2 when being compiled. 3109 F.SLocRemap.insertOrReplace(std::make_pair(2U, 3110 static_cast<int>(F.SLocEntryBaseOffset - 2))); 3111 3112 TotalNumSLocEntries += F.LocalNumSLocEntries; 3113 break; 3114 } 3115 3116 case MODULE_OFFSET_MAP: 3117 F.ModuleOffsetMap = Blob; 3118 break; 3119 3120 case SOURCE_MANAGER_LINE_TABLE: 3121 if (ParseLineTable(F, Record)) 3122 return Failure; 3123 break; 3124 3125 case SOURCE_LOCATION_PRELOADS: { 3126 // Need to transform from the local view (1-based IDs) to the global view, 3127 // which is based off F.SLocEntryBaseID. 3128 if (!F.PreloadSLocEntries.empty()) { 3129 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file"); 3130 return Failure; 3131 } 3132 3133 F.PreloadSLocEntries.swap(Record); 3134 break; 3135 } 3136 3137 case EXT_VECTOR_DECLS: 3138 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3139 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I])); 3140 break; 3141 3142 case VTABLE_USES: 3143 if (Record.size() % 3 != 0) { 3144 Error("Invalid VTABLE_USES record"); 3145 return Failure; 3146 } 3147 3148 // Later tables overwrite earlier ones. 3149 // FIXME: Modules will have some trouble with this. This is clearly not 3150 // the right way to do this. 3151 VTableUses.clear(); 3152 3153 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) { 3154 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++])); 3155 VTableUses.push_back( 3156 ReadSourceLocation(F, Record, Idx).getRawEncoding()); 3157 VTableUses.push_back(Record[Idx++]); 3158 } 3159 break; 3160 3161 case PENDING_IMPLICIT_INSTANTIATIONS: 3162 if (PendingInstantiations.size() % 2 != 0) { 3163 Error("Invalid existing PendingInstantiations"); 3164 return Failure; 3165 } 3166 3167 if (Record.size() % 2 != 0) { 3168 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block"); 3169 return Failure; 3170 } 3171 3172 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3173 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++])); 3174 PendingInstantiations.push_back( 3175 ReadSourceLocation(F, Record, I).getRawEncoding()); 3176 } 3177 break; 3178 3179 case SEMA_DECL_REFS: 3180 if (Record.size() != 3) { 3181 Error("Invalid SEMA_DECL_REFS block"); 3182 return Failure; 3183 } 3184 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3185 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3186 break; 3187 3188 case PPD_ENTITIES_OFFSETS: { 3189 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data(); 3190 assert(Blob.size() % sizeof(PPEntityOffset) == 0); 3191 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset); 3192 3193 unsigned LocalBasePreprocessedEntityID = Record[0]; 3194 3195 unsigned StartingID; 3196 if (!PP.getPreprocessingRecord()) 3197 PP.createPreprocessingRecord(); 3198 if (!PP.getPreprocessingRecord()->getExternalSource()) 3199 PP.getPreprocessingRecord()->SetExternalSource(*this); 3200 StartingID 3201 = PP.getPreprocessingRecord() 3202 ->allocateLoadedEntities(F.NumPreprocessedEntities); 3203 F.BasePreprocessedEntityID = StartingID; 3204 3205 if (F.NumPreprocessedEntities > 0) { 3206 // Introduce the global -> local mapping for preprocessed entities in 3207 // this module. 3208 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F)); 3209 3210 // Introduce the local -> global mapping for preprocessed entities in 3211 // this module. 3212 F.PreprocessedEntityRemap.insertOrReplace( 3213 std::make_pair(LocalBasePreprocessedEntityID, 3214 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID)); 3215 } 3216 3217 break; 3218 } 3219 3220 case PPD_SKIPPED_RANGES: { 3221 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data(); 3222 assert(Blob.size() % sizeof(PPSkippedRange) == 0); 3223 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange); 3224 3225 if (!PP.getPreprocessingRecord()) 3226 PP.createPreprocessingRecord(); 3227 if (!PP.getPreprocessingRecord()->getExternalSource()) 3228 PP.getPreprocessingRecord()->SetExternalSource(*this); 3229 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord() 3230 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges); 3231 3232 if (F.NumPreprocessedSkippedRanges > 0) 3233 GlobalSkippedRangeMap.insert( 3234 std::make_pair(F.BasePreprocessedSkippedRangeID, &F)); 3235 break; 3236 } 3237 3238 case DECL_UPDATE_OFFSETS: 3239 if (Record.size() % 2 != 0) { 3240 Error("invalid DECL_UPDATE_OFFSETS block in AST file"); 3241 return Failure; 3242 } 3243 for (unsigned I = 0, N = Record.size(); I != N; I += 2) { 3244 GlobalDeclID ID = getGlobalDeclID(F, Record[I]); 3245 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1])); 3246 3247 // If we've already loaded the decl, perform the updates when we finish 3248 // loading this block. 3249 if (Decl *D = GetExistingDecl(ID)) 3250 PendingUpdateRecords.push_back( 3251 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3252 } 3253 break; 3254 3255 case OBJC_CATEGORIES_MAP: 3256 if (F.LocalNumObjCCategoriesInMap != 0) { 3257 Error("duplicate OBJC_CATEGORIES_MAP record in AST file"); 3258 return Failure; 3259 } 3260 3261 F.LocalNumObjCCategoriesInMap = Record[0]; 3262 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data(); 3263 break; 3264 3265 case OBJC_CATEGORIES: 3266 F.ObjCCategories.swap(Record); 3267 break; 3268 3269 case CUDA_SPECIAL_DECL_REFS: 3270 // Later tables overwrite earlier ones. 3271 // FIXME: Modules will have trouble with this. 3272 CUDASpecialDeclRefs.clear(); 3273 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3274 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3275 break; 3276 3277 case HEADER_SEARCH_TABLE: 3278 F.HeaderFileInfoTableData = Blob.data(); 3279 F.LocalNumHeaderFileInfos = Record[1]; 3280 if (Record[0]) { 3281 F.HeaderFileInfoTable 3282 = HeaderFileInfoLookupTable::Create( 3283 (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 3284 (const unsigned char *)F.HeaderFileInfoTableData, 3285 HeaderFileInfoTrait(*this, F, 3286 &PP.getHeaderSearchInfo(), 3287 Blob.data() + Record[2])); 3288 3289 PP.getHeaderSearchInfo().SetExternalSource(this); 3290 if (!PP.getHeaderSearchInfo().getExternalLookup()) 3291 PP.getHeaderSearchInfo().SetExternalLookup(this); 3292 } 3293 break; 3294 3295 case FP_PRAGMA_OPTIONS: 3296 // Later tables overwrite earlier ones. 3297 FPPragmaOptions.swap(Record); 3298 break; 3299 3300 case OPENCL_EXTENSIONS: 3301 for (unsigned I = 0, E = Record.size(); I != E; ) { 3302 auto Name = ReadString(Record, I); 3303 auto &Opt = OpenCLExtensions.OptMap[Name]; 3304 Opt.Supported = Record[I++] != 0; 3305 Opt.Enabled = Record[I++] != 0; 3306 Opt.Avail = Record[I++]; 3307 Opt.Core = Record[I++]; 3308 } 3309 break; 3310 3311 case OPENCL_EXTENSION_TYPES: 3312 for (unsigned I = 0, E = Record.size(); I != E;) { 3313 auto TypeID = static_cast<::TypeID>(Record[I++]); 3314 auto *Type = GetType(TypeID).getTypePtr(); 3315 auto NumExt = static_cast<unsigned>(Record[I++]); 3316 for (unsigned II = 0; II != NumExt; ++II) { 3317 auto Ext = ReadString(Record, I); 3318 OpenCLTypeExtMap[Type].insert(Ext); 3319 } 3320 } 3321 break; 3322 3323 case OPENCL_EXTENSION_DECLS: 3324 for (unsigned I = 0, E = Record.size(); I != E;) { 3325 auto DeclID = static_cast<::DeclID>(Record[I++]); 3326 auto *Decl = GetDecl(DeclID); 3327 auto NumExt = static_cast<unsigned>(Record[I++]); 3328 for (unsigned II = 0; II != NumExt; ++II) { 3329 auto Ext = ReadString(Record, I); 3330 OpenCLDeclExtMap[Decl].insert(Ext); 3331 } 3332 } 3333 break; 3334 3335 case TENTATIVE_DEFINITIONS: 3336 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3337 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 3338 break; 3339 3340 case KNOWN_NAMESPACES: 3341 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3342 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 3343 break; 3344 3345 case UNDEFINED_BUT_USED: 3346 if (UndefinedButUsed.size() % 2 != 0) { 3347 Error("Invalid existing UndefinedButUsed"); 3348 return Failure; 3349 } 3350 3351 if (Record.size() % 2 != 0) { 3352 Error("invalid undefined-but-used record"); 3353 return Failure; 3354 } 3355 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3356 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 3357 UndefinedButUsed.push_back( 3358 ReadSourceLocation(F, Record, I).getRawEncoding()); 3359 } 3360 break; 3361 3362 case DELETE_EXPRS_TO_ANALYZE: 3363 for (unsigned I = 0, N = Record.size(); I != N;) { 3364 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++])); 3365 const uint64_t Count = Record[I++]; 3366 DelayedDeleteExprs.push_back(Count); 3367 for (uint64_t C = 0; C < Count; ++C) { 3368 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding()); 3369 bool IsArrayForm = Record[I++] == 1; 3370 DelayedDeleteExprs.push_back(IsArrayForm); 3371 } 3372 } 3373 break; 3374 3375 case IMPORTED_MODULES: 3376 if (!F.isModule()) { 3377 // If we aren't loading a module (which has its own exports), make 3378 // all of the imported modules visible. 3379 // FIXME: Deal with macros-only imports. 3380 for (unsigned I = 0, N = Record.size(); I != N; /**/) { 3381 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]); 3382 SourceLocation Loc = ReadSourceLocation(F, Record, I); 3383 if (GlobalID) { 3384 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc)); 3385 if (DeserializationListener) 3386 DeserializationListener->ModuleImportRead(GlobalID, Loc); 3387 } 3388 } 3389 } 3390 break; 3391 3392 case MACRO_OFFSET: { 3393 if (F.LocalNumMacros != 0) { 3394 Error("duplicate MACRO_OFFSET record in AST file"); 3395 return Failure; 3396 } 3397 F.MacroOffsets = (const uint32_t *)Blob.data(); 3398 F.LocalNumMacros = Record[0]; 3399 unsigned LocalBaseMacroID = Record[1]; 3400 F.BaseMacroID = getTotalNumMacros(); 3401 3402 if (F.LocalNumMacros > 0) { 3403 // Introduce the global -> local mapping for macros within this module. 3404 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 3405 3406 // Introduce the local -> global mapping for macros within this module. 3407 F.MacroRemap.insertOrReplace( 3408 std::make_pair(LocalBaseMacroID, 3409 F.BaseMacroID - LocalBaseMacroID)); 3410 3411 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 3412 } 3413 break; 3414 } 3415 3416 case LATE_PARSED_TEMPLATE: 3417 LateParsedTemplates.append(Record.begin(), Record.end()); 3418 break; 3419 3420 case OPTIMIZE_PRAGMA_OPTIONS: 3421 if (Record.size() != 1) { 3422 Error("invalid pragma optimize record"); 3423 return Failure; 3424 } 3425 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]); 3426 break; 3427 3428 case MSSTRUCT_PRAGMA_OPTIONS: 3429 if (Record.size() != 1) { 3430 Error("invalid pragma ms_struct record"); 3431 return Failure; 3432 } 3433 PragmaMSStructState = Record[0]; 3434 break; 3435 3436 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS: 3437 if (Record.size() != 2) { 3438 Error("invalid pragma ms_struct record"); 3439 return Failure; 3440 } 3441 PragmaMSPointersToMembersState = Record[0]; 3442 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]); 3443 break; 3444 3445 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES: 3446 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3447 UnusedLocalTypedefNameCandidates.push_back( 3448 getGlobalDeclID(F, Record[I])); 3449 break; 3450 3451 case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH: 3452 if (Record.size() != 1) { 3453 Error("invalid cuda pragma options record"); 3454 return Failure; 3455 } 3456 ForceCUDAHostDeviceDepth = Record[0]; 3457 break; 3458 3459 case PACK_PRAGMA_OPTIONS: { 3460 if (Record.size() < 3) { 3461 Error("invalid pragma pack record"); 3462 return Failure; 3463 } 3464 PragmaPackCurrentValue = Record[0]; 3465 PragmaPackCurrentLocation = ReadSourceLocation(F, Record[1]); 3466 unsigned NumStackEntries = Record[2]; 3467 unsigned Idx = 3; 3468 // Reset the stack when importing a new module. 3469 PragmaPackStack.clear(); 3470 for (unsigned I = 0; I < NumStackEntries; ++I) { 3471 PragmaPackStackEntry Entry; 3472 Entry.Value = Record[Idx++]; 3473 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3474 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3475 PragmaPackStrings.push_back(ReadString(Record, Idx)); 3476 Entry.SlotLabel = PragmaPackStrings.back(); 3477 PragmaPackStack.push_back(Entry); 3478 } 3479 break; 3480 } 3481 } 3482 } 3483 } 3484 3485 void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const { 3486 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read"); 3487 3488 // Additional remapping information. 3489 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data(); 3490 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size(); 3491 F.ModuleOffsetMap = StringRef(); 3492 3493 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders. 3494 if (F.SLocRemap.find(0) == F.SLocRemap.end()) { 3495 F.SLocRemap.insert(std::make_pair(0U, 0)); 3496 F.SLocRemap.insert(std::make_pair(2U, 1)); 3497 } 3498 3499 // Continuous range maps we may be updating in our module. 3500 using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder; 3501 RemapBuilder SLocRemap(F.SLocRemap); 3502 RemapBuilder IdentifierRemap(F.IdentifierRemap); 3503 RemapBuilder MacroRemap(F.MacroRemap); 3504 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap); 3505 RemapBuilder SubmoduleRemap(F.SubmoduleRemap); 3506 RemapBuilder SelectorRemap(F.SelectorRemap); 3507 RemapBuilder DeclRemap(F.DeclRemap); 3508 RemapBuilder TypeRemap(F.TypeRemap); 3509 3510 while (Data < DataEnd) { 3511 // FIXME: Looking up dependency modules by filename is horrible. Let's 3512 // start fixing this with prebuilt and explicit modules and see how it 3513 // goes... 3514 using namespace llvm::support; 3515 ModuleKind Kind = static_cast<ModuleKind>( 3516 endian::readNext<uint8_t, little, unaligned>(Data)); 3517 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data); 3518 StringRef Name = StringRef((const char*)Data, Len); 3519 Data += Len; 3520 ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule 3521 ? ModuleMgr.lookupByModuleName(Name) 3522 : ModuleMgr.lookupByFileName(Name)); 3523 if (!OM) { 3524 std::string Msg = 3525 "SourceLocation remap refers to unknown module, cannot find "; 3526 Msg.append(Name); 3527 Error(Msg); 3528 return; 3529 } 3530 3531 uint32_t SLocOffset = 3532 endian::readNext<uint32_t, little, unaligned>(Data); 3533 uint32_t IdentifierIDOffset = 3534 endian::readNext<uint32_t, little, unaligned>(Data); 3535 uint32_t MacroIDOffset = 3536 endian::readNext<uint32_t, little, unaligned>(Data); 3537 uint32_t PreprocessedEntityIDOffset = 3538 endian::readNext<uint32_t, little, unaligned>(Data); 3539 uint32_t SubmoduleIDOffset = 3540 endian::readNext<uint32_t, little, unaligned>(Data); 3541 uint32_t SelectorIDOffset = 3542 endian::readNext<uint32_t, little, unaligned>(Data); 3543 uint32_t DeclIDOffset = 3544 endian::readNext<uint32_t, little, unaligned>(Data); 3545 uint32_t TypeIndexOffset = 3546 endian::readNext<uint32_t, little, unaligned>(Data); 3547 3548 uint32_t None = std::numeric_limits<uint32_t>::max(); 3549 3550 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset, 3551 RemapBuilder &Remap) { 3552 if (Offset != None) 3553 Remap.insert(std::make_pair(Offset, 3554 static_cast<int>(BaseOffset - Offset))); 3555 }; 3556 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap); 3557 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap); 3558 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap); 3559 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID, 3560 PreprocessedEntityRemap); 3561 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap); 3562 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap); 3563 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap); 3564 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap); 3565 3566 // Global -> local mappings. 3567 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset; 3568 } 3569 } 3570 3571 ASTReader::ASTReadResult 3572 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F, 3573 const ModuleFile *ImportedBy, 3574 unsigned ClientLoadCapabilities) { 3575 unsigned Idx = 0; 3576 F.ModuleMapPath = ReadPath(F, Record, Idx); 3577 3578 // Try to resolve ModuleName in the current header search context and 3579 // verify that it is found in the same module map file as we saved. If the 3580 // top-level AST file is a main file, skip this check because there is no 3581 // usable header search context. 3582 assert(!F.ModuleName.empty() && 3583 "MODULE_NAME should come before MODULE_MAP_FILE"); 3584 if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) { 3585 // An implicitly-loaded module file should have its module listed in some 3586 // module map file that we've already loaded. 3587 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName); 3588 auto &Map = PP.getHeaderSearchInfo().getModuleMap(); 3589 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr; 3590 if (!ModMap) { 3591 assert(ImportedBy && "top-level import should be verified"); 3592 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) { 3593 if (auto *ASTFE = M ? M->getASTFile() : nullptr) { 3594 // This module was defined by an imported (explicit) module. 3595 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName 3596 << ASTFE->getName(); 3597 } else { 3598 // This module was built with a different module map. 3599 Diag(diag::err_imported_module_not_found) 3600 << F.ModuleName << F.FileName << ImportedBy->FileName 3601 << F.ModuleMapPath; 3602 // In case it was imported by a PCH, there's a chance the user is 3603 // just missing to include the search path to the directory containing 3604 // the modulemap. 3605 if (ImportedBy->Kind == MK_PCH) 3606 Diag(diag::note_imported_by_pch_module_not_found) 3607 << llvm::sys::path::parent_path(F.ModuleMapPath); 3608 } 3609 } 3610 return OutOfDate; 3611 } 3612 3613 assert(M->Name == F.ModuleName && "found module with different name"); 3614 3615 // Check the primary module map file. 3616 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath); 3617 if (StoredModMap == nullptr || StoredModMap != ModMap) { 3618 assert(ModMap && "found module is missing module map file"); 3619 assert(ImportedBy && "top-level import should be verified"); 3620 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3621 Diag(diag::err_imported_module_modmap_changed) 3622 << F.ModuleName << ImportedBy->FileName 3623 << ModMap->getName() << F.ModuleMapPath; 3624 return OutOfDate; 3625 } 3626 3627 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps; 3628 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) { 3629 // FIXME: we should use input files rather than storing names. 3630 std::string Filename = ReadPath(F, Record, Idx); 3631 const FileEntry *F = 3632 FileMgr.getFile(Filename, false, false); 3633 if (F == nullptr) { 3634 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3635 Error("could not find file '" + Filename +"' referenced by AST file"); 3636 return OutOfDate; 3637 } 3638 AdditionalStoredMaps.insert(F); 3639 } 3640 3641 // Check any additional module map files (e.g. module.private.modulemap) 3642 // that are not in the pcm. 3643 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) { 3644 for (const FileEntry *ModMap : *AdditionalModuleMaps) { 3645 // Remove files that match 3646 // Note: SmallPtrSet::erase is really remove 3647 if (!AdditionalStoredMaps.erase(ModMap)) { 3648 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3649 Diag(diag::err_module_different_modmap) 3650 << F.ModuleName << /*new*/0 << ModMap->getName(); 3651 return OutOfDate; 3652 } 3653 } 3654 } 3655 3656 // Check any additional module map files that are in the pcm, but not 3657 // found in header search. Cases that match are already removed. 3658 for (const FileEntry *ModMap : AdditionalStoredMaps) { 3659 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3660 Diag(diag::err_module_different_modmap) 3661 << F.ModuleName << /*not new*/1 << ModMap->getName(); 3662 return OutOfDate; 3663 } 3664 } 3665 3666 if (Listener) 3667 Listener->ReadModuleMapFile(F.ModuleMapPath); 3668 return Success; 3669 } 3670 3671 /// \brief Move the given method to the back of the global list of methods. 3672 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 3673 // Find the entry for this selector in the method pool. 3674 Sema::GlobalMethodPool::iterator Known 3675 = S.MethodPool.find(Method->getSelector()); 3676 if (Known == S.MethodPool.end()) 3677 return; 3678 3679 // Retrieve the appropriate method list. 3680 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 3681 : Known->second.second; 3682 bool Found = false; 3683 for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 3684 if (!Found) { 3685 if (List->getMethod() == Method) { 3686 Found = true; 3687 } else { 3688 // Keep searching. 3689 continue; 3690 } 3691 } 3692 3693 if (List->getNext()) 3694 List->setMethod(List->getNext()->getMethod()); 3695 else 3696 List->setMethod(Method); 3697 } 3698 } 3699 3700 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) { 3701 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?"); 3702 for (Decl *D : Names) { 3703 bool wasHidden = D->isHidden(); 3704 D->setVisibleDespiteOwningModule(); 3705 3706 if (wasHidden && SemaObj) { 3707 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 3708 moveMethodToBackOfGlobalList(*SemaObj, Method); 3709 } 3710 } 3711 } 3712 } 3713 3714 void ASTReader::makeModuleVisible(Module *Mod, 3715 Module::NameVisibilityKind NameVisibility, 3716 SourceLocation ImportLoc) { 3717 llvm::SmallPtrSet<Module *, 4> Visited; 3718 SmallVector<Module *, 4> Stack; 3719 Stack.push_back(Mod); 3720 while (!Stack.empty()) { 3721 Mod = Stack.pop_back_val(); 3722 3723 if (NameVisibility <= Mod->NameVisibility) { 3724 // This module already has this level of visibility (or greater), so 3725 // there is nothing more to do. 3726 continue; 3727 } 3728 3729 if (!Mod->isAvailable()) { 3730 // Modules that aren't available cannot be made visible. 3731 continue; 3732 } 3733 3734 // Update the module's name visibility. 3735 Mod->NameVisibility = NameVisibility; 3736 3737 // If we've already deserialized any names from this module, 3738 // mark them as visible. 3739 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 3740 if (Hidden != HiddenNamesMap.end()) { 3741 auto HiddenNames = std::move(*Hidden); 3742 HiddenNamesMap.erase(Hidden); 3743 makeNamesVisible(HiddenNames.second, HiddenNames.first); 3744 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && 3745 "making names visible added hidden names"); 3746 } 3747 3748 // Push any exported modules onto the stack to be marked as visible. 3749 SmallVector<Module *, 16> Exports; 3750 Mod->getExportedModules(Exports); 3751 for (SmallVectorImpl<Module *>::iterator 3752 I = Exports.begin(), E = Exports.end(); I != E; ++I) { 3753 Module *Exported = *I; 3754 if (Visited.insert(Exported).second) 3755 Stack.push_back(Exported); 3756 } 3757 } 3758 } 3759 3760 /// We've merged the definition \p MergedDef into the existing definition 3761 /// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made 3762 /// visible. 3763 void ASTReader::mergeDefinitionVisibility(NamedDecl *Def, 3764 NamedDecl *MergedDef) { 3765 // FIXME: This doesn't correctly handle the case where MergedDef is visible 3766 // in modules other than its owning module. We should instead give the 3767 // ASTContext a list of merged definitions for Def. 3768 if (Def->isHidden()) { 3769 // If MergedDef is visible or becomes visible, make the definition visible. 3770 if (!MergedDef->isHidden()) 3771 Def->setVisibleDespiteOwningModule(); 3772 else if (getContext().getLangOpts().ModulesLocalVisibility) { 3773 getContext().mergeDefinitionIntoModule( 3774 Def, MergedDef->getImportedOwningModule(), 3775 /*NotifyListeners*/ false); 3776 PendingMergedDefinitionsToDeduplicate.insert(Def); 3777 } else { 3778 auto SubmoduleID = MergedDef->getOwningModuleID(); 3779 assert(SubmoduleID && "hidden definition in no module"); 3780 HiddenNamesMap[getSubmodule(SubmoduleID)].push_back(Def); 3781 } 3782 } 3783 } 3784 3785 bool ASTReader::loadGlobalIndex() { 3786 if (GlobalIndex) 3787 return false; 3788 3789 if (TriedLoadingGlobalIndex || !UseGlobalIndex || 3790 !PP.getLangOpts().Modules) 3791 return true; 3792 3793 // Try to load the global index. 3794 TriedLoadingGlobalIndex = true; 3795 StringRef ModuleCachePath 3796 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 3797 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result 3798 = GlobalModuleIndex::readIndex(ModuleCachePath); 3799 if (!Result.first) 3800 return true; 3801 3802 GlobalIndex.reset(Result.first); 3803 ModuleMgr.setGlobalIndex(GlobalIndex.get()); 3804 return false; 3805 } 3806 3807 bool ASTReader::isGlobalIndexUnavailable() const { 3808 return PP.getLangOpts().Modules && UseGlobalIndex && 3809 !hasGlobalIndex() && TriedLoadingGlobalIndex; 3810 } 3811 3812 static void updateModuleTimestamp(ModuleFile &MF) { 3813 // Overwrite the timestamp file contents so that file's mtime changes. 3814 std::string TimestampFilename = MF.getTimestampFilename(); 3815 std::error_code EC; 3816 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text); 3817 if (EC) 3818 return; 3819 OS << "Timestamp file\n"; 3820 OS.close(); 3821 OS.clear_error(); // Avoid triggering a fatal error. 3822 } 3823 3824 /// \brief Given a cursor at the start of an AST file, scan ahead and drop the 3825 /// cursor into the start of the given block ID, returning false on success and 3826 /// true on failure. 3827 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 3828 while (true) { 3829 llvm::BitstreamEntry Entry = Cursor.advance(); 3830 switch (Entry.Kind) { 3831 case llvm::BitstreamEntry::Error: 3832 case llvm::BitstreamEntry::EndBlock: 3833 return true; 3834 3835 case llvm::BitstreamEntry::Record: 3836 // Ignore top-level records. 3837 Cursor.skipRecord(Entry.ID); 3838 break; 3839 3840 case llvm::BitstreamEntry::SubBlock: 3841 if (Entry.ID == BlockID) { 3842 if (Cursor.EnterSubBlock(BlockID)) 3843 return true; 3844 // Found it! 3845 return false; 3846 } 3847 3848 if (Cursor.SkipBlock()) 3849 return true; 3850 } 3851 } 3852 } 3853 3854 ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, 3855 ModuleKind Type, 3856 SourceLocation ImportLoc, 3857 unsigned ClientLoadCapabilities, 3858 SmallVectorImpl<ImportedSubmodule> *Imported) { 3859 llvm::SaveAndRestore<SourceLocation> 3860 SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 3861 3862 // Defer any pending actions until we get to the end of reading the AST file. 3863 Deserializing AnASTFile(this); 3864 3865 // Bump the generation number. 3866 unsigned PreviousGeneration = 0; 3867 if (ContextObj) 3868 PreviousGeneration = incrementGeneration(*ContextObj); 3869 3870 unsigned NumModules = ModuleMgr.size(); 3871 SmallVector<ImportedModule, 4> Loaded; 3872 switch (ASTReadResult ReadResult = 3873 ReadASTCore(FileName, Type, ImportLoc, 3874 /*ImportedBy=*/nullptr, Loaded, 0, 0, 3875 ASTFileSignature(), ClientLoadCapabilities)) { 3876 case Failure: 3877 case Missing: 3878 case OutOfDate: 3879 case VersionMismatch: 3880 case ConfigurationMismatch: 3881 case HadErrors: { 3882 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet; 3883 for (const ImportedModule &IM : Loaded) 3884 LoadedSet.insert(IM.Mod); 3885 3886 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, LoadedSet, 3887 PP.getLangOpts().Modules 3888 ? &PP.getHeaderSearchInfo().getModuleMap() 3889 : nullptr); 3890 3891 // If we find that any modules are unusable, the global index is going 3892 // to be out-of-date. Just remove it. 3893 GlobalIndex.reset(); 3894 ModuleMgr.setGlobalIndex(nullptr); 3895 return ReadResult; 3896 } 3897 case Success: 3898 break; 3899 } 3900 3901 // Here comes stuff that we only do once the entire chain is loaded. 3902 3903 // Load the AST blocks of all of the modules that we loaded. 3904 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), 3905 MEnd = Loaded.end(); 3906 M != MEnd; ++M) { 3907 ModuleFile &F = *M->Mod; 3908 3909 // Read the AST block. 3910 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities)) 3911 return Result; 3912 3913 // Read the extension blocks. 3914 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) { 3915 if (ASTReadResult Result = ReadExtensionBlock(F)) 3916 return Result; 3917 } 3918 3919 // Once read, set the ModuleFile bit base offset and update the size in 3920 // bits of all files we've seen. 3921 F.GlobalBitOffset = TotalModulesSizeInBits; 3922 TotalModulesSizeInBits += F.SizeInBits; 3923 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 3924 3925 // Preload SLocEntries. 3926 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 3927 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 3928 // Load it through the SourceManager and don't call ReadSLocEntry() 3929 // directly because the entry may have already been loaded in which case 3930 // calling ReadSLocEntry() directly would trigger an assertion in 3931 // SourceManager. 3932 SourceMgr.getLoadedSLocEntryByID(Index); 3933 } 3934 3935 // Map the original source file ID into the ID space of the current 3936 // compilation. 3937 if (F.OriginalSourceFileID.isValid()) { 3938 F.OriginalSourceFileID = FileID::get( 3939 F.SLocEntryBaseID + F.OriginalSourceFileID.getOpaqueValue() - 1); 3940 } 3941 3942 // Preload all the pending interesting identifiers by marking them out of 3943 // date. 3944 for (auto Offset : F.PreloadIdentifierOffsets) { 3945 const unsigned char *Data = reinterpret_cast<const unsigned char *>( 3946 F.IdentifierTableData + Offset); 3947 3948 ASTIdentifierLookupTrait Trait(*this, F); 3949 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 3950 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 3951 auto &II = PP.getIdentifierTable().getOwn(Key); 3952 II.setOutOfDate(true); 3953 3954 // Mark this identifier as being from an AST file so that we can track 3955 // whether we need to serialize it. 3956 markIdentifierFromAST(*this, II); 3957 3958 // Associate the ID with the identifier so that the writer can reuse it. 3959 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first); 3960 SetIdentifierInfo(ID, &II); 3961 } 3962 } 3963 3964 // Setup the import locations and notify the module manager that we've 3965 // committed to these module files. 3966 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), 3967 MEnd = Loaded.end(); 3968 M != MEnd; ++M) { 3969 ModuleFile &F = *M->Mod; 3970 3971 ModuleMgr.moduleFileAccepted(&F); 3972 3973 // Set the import location. 3974 F.DirectImportLoc = ImportLoc; 3975 // FIXME: We assume that locations from PCH / preamble do not need 3976 // any translation. 3977 if (!M->ImportedBy) 3978 F.ImportLoc = M->ImportLoc; 3979 else 3980 F.ImportLoc = TranslateSourceLocation(*M->ImportedBy, M->ImportLoc); 3981 } 3982 3983 if (!PP.getLangOpts().CPlusPlus || 3984 (Type != MK_ImplicitModule && Type != MK_ExplicitModule && 3985 Type != MK_PrebuiltModule)) { 3986 // Mark all of the identifiers in the identifier table as being out of date, 3987 // so that various accessors know to check the loaded modules when the 3988 // identifier is used. 3989 // 3990 // For C++ modules, we don't need information on many identifiers (just 3991 // those that provide macros or are poisoned), so we mark all of 3992 // the interesting ones via PreloadIdentifierOffsets. 3993 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 3994 IdEnd = PP.getIdentifierTable().end(); 3995 Id != IdEnd; ++Id) 3996 Id->second->setOutOfDate(true); 3997 } 3998 // Mark selectors as out of date. 3999 for (auto Sel : SelectorGeneration) 4000 SelectorOutOfDate[Sel.first] = true; 4001 4002 // Resolve any unresolved module exports. 4003 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) { 4004 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I]; 4005 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 4006 Module *ResolvedMod = getSubmodule(GlobalID); 4007 4008 switch (Unresolved.Kind) { 4009 case UnresolvedModuleRef::Conflict: 4010 if (ResolvedMod) { 4011 Module::Conflict Conflict; 4012 Conflict.Other = ResolvedMod; 4013 Conflict.Message = Unresolved.String.str(); 4014 Unresolved.Mod->Conflicts.push_back(Conflict); 4015 } 4016 continue; 4017 4018 case UnresolvedModuleRef::Import: 4019 if (ResolvedMod) 4020 Unresolved.Mod->Imports.insert(ResolvedMod); 4021 continue; 4022 4023 case UnresolvedModuleRef::Export: 4024 if (ResolvedMod || Unresolved.IsWildcard) 4025 Unresolved.Mod->Exports.push_back( 4026 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 4027 continue; 4028 } 4029 } 4030 UnresolvedModuleRefs.clear(); 4031 4032 if (Imported) 4033 Imported->append(ImportedModules.begin(), 4034 ImportedModules.end()); 4035 4036 // FIXME: How do we load the 'use'd modules? They may not be submodules. 4037 // Might be unnecessary as use declarations are only used to build the 4038 // module itself. 4039 4040 if (ContextObj) 4041 InitializeContext(); 4042 4043 if (SemaObj) 4044 UpdateSema(); 4045 4046 if (DeserializationListener) 4047 DeserializationListener->ReaderInitialized(this); 4048 4049 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 4050 if (PrimaryModule.OriginalSourceFileID.isValid()) { 4051 // If this AST file is a precompiled preamble, then set the 4052 // preamble file ID of the source manager to the file source file 4053 // from which the preamble was built. 4054 if (Type == MK_Preamble) { 4055 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 4056 } else if (Type == MK_MainFile) { 4057 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 4058 } 4059 } 4060 4061 // For any Objective-C class definitions we have already loaded, make sure 4062 // that we load any additional categories. 4063 if (ContextObj) { 4064 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 4065 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 4066 ObjCClassesLoaded[I], 4067 PreviousGeneration); 4068 } 4069 } 4070 4071 if (PP.getHeaderSearchInfo() 4072 .getHeaderSearchOpts() 4073 .ModulesValidateOncePerBuildSession) { 4074 // Now we are certain that the module and all modules it depends on are 4075 // up to date. Create or update timestamp files for modules that are 4076 // located in the module cache (not for PCH files that could be anywhere 4077 // in the filesystem). 4078 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) { 4079 ImportedModule &M = Loaded[I]; 4080 if (M.Mod->Kind == MK_ImplicitModule) { 4081 updateModuleTimestamp(*M.Mod); 4082 } 4083 } 4084 } 4085 4086 return Success; 4087 } 4088 4089 static ASTFileSignature readASTFileSignature(StringRef PCH); 4090 4091 /// \brief Whether \p Stream starts with the AST/PCH file magic number 'CPCH'. 4092 static bool startsWithASTFileMagic(BitstreamCursor &Stream) { 4093 return Stream.canSkipToPos(4) && 4094 Stream.Read(8) == 'C' && 4095 Stream.Read(8) == 'P' && 4096 Stream.Read(8) == 'C' && 4097 Stream.Read(8) == 'H'; 4098 } 4099 4100 static unsigned moduleKindForDiagnostic(ModuleKind Kind) { 4101 switch (Kind) { 4102 case MK_PCH: 4103 return 0; // PCH 4104 case MK_ImplicitModule: 4105 case MK_ExplicitModule: 4106 case MK_PrebuiltModule: 4107 return 1; // module 4108 case MK_MainFile: 4109 case MK_Preamble: 4110 return 2; // main source file 4111 } 4112 llvm_unreachable("unknown module kind"); 4113 } 4114 4115 ASTReader::ASTReadResult 4116 ASTReader::ReadASTCore(StringRef FileName, 4117 ModuleKind Type, 4118 SourceLocation ImportLoc, 4119 ModuleFile *ImportedBy, 4120 SmallVectorImpl<ImportedModule> &Loaded, 4121 off_t ExpectedSize, time_t ExpectedModTime, 4122 ASTFileSignature ExpectedSignature, 4123 unsigned ClientLoadCapabilities) { 4124 ModuleFile *M; 4125 std::string ErrorStr; 4126 ModuleManager::AddModuleResult AddResult 4127 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy, 4128 getGeneration(), ExpectedSize, ExpectedModTime, 4129 ExpectedSignature, readASTFileSignature, 4130 M, ErrorStr); 4131 4132 switch (AddResult) { 4133 case ModuleManager::AlreadyLoaded: 4134 return Success; 4135 4136 case ModuleManager::NewlyLoaded: 4137 // Load module file below. 4138 break; 4139 4140 case ModuleManager::Missing: 4141 // The module file was missing; if the client can handle that, return 4142 // it. 4143 if (ClientLoadCapabilities & ARR_Missing) 4144 return Missing; 4145 4146 // Otherwise, return an error. 4147 Diag(diag::err_module_file_not_found) << moduleKindForDiagnostic(Type) 4148 << FileName << !ErrorStr.empty() 4149 << ErrorStr; 4150 return Failure; 4151 4152 case ModuleManager::OutOfDate: 4153 // We couldn't load the module file because it is out-of-date. If the 4154 // client can handle out-of-date, return it. 4155 if (ClientLoadCapabilities & ARR_OutOfDate) 4156 return OutOfDate; 4157 4158 // Otherwise, return an error. 4159 Diag(diag::err_module_file_out_of_date) << moduleKindForDiagnostic(Type) 4160 << FileName << !ErrorStr.empty() 4161 << ErrorStr; 4162 return Failure; 4163 } 4164 4165 assert(M && "Missing module file"); 4166 4167 ModuleFile &F = *M; 4168 BitstreamCursor &Stream = F.Stream; 4169 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer)); 4170 F.SizeInBits = F.Buffer->getBufferSize() * 8; 4171 4172 // Sniff for the signature. 4173 if (!startsWithASTFileMagic(Stream)) { 4174 Diag(diag::err_module_file_invalid) << moduleKindForDiagnostic(Type) 4175 << FileName; 4176 return Failure; 4177 } 4178 4179 // This is used for compatibility with older PCH formats. 4180 bool HaveReadControlBlock = false; 4181 while (true) { 4182 llvm::BitstreamEntry Entry = Stream.advance(); 4183 4184 switch (Entry.Kind) { 4185 case llvm::BitstreamEntry::Error: 4186 case llvm::BitstreamEntry::Record: 4187 case llvm::BitstreamEntry::EndBlock: 4188 Error("invalid record at top-level of AST file"); 4189 return Failure; 4190 4191 case llvm::BitstreamEntry::SubBlock: 4192 break; 4193 } 4194 4195 switch (Entry.ID) { 4196 case CONTROL_BLOCK_ID: 4197 HaveReadControlBlock = true; 4198 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) { 4199 case Success: 4200 // Check that we didn't try to load a non-module AST file as a module. 4201 // 4202 // FIXME: Should we also perform the converse check? Loading a module as 4203 // a PCH file sort of works, but it's a bit wonky. 4204 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule || 4205 Type == MK_PrebuiltModule) && 4206 F.ModuleName.empty()) { 4207 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure; 4208 if (Result != OutOfDate || 4209 (ClientLoadCapabilities & ARR_OutOfDate) == 0) 4210 Diag(diag::err_module_file_not_module) << FileName; 4211 return Result; 4212 } 4213 break; 4214 4215 case Failure: return Failure; 4216 case Missing: return Missing; 4217 case OutOfDate: return OutOfDate; 4218 case VersionMismatch: return VersionMismatch; 4219 case ConfigurationMismatch: return ConfigurationMismatch; 4220 case HadErrors: return HadErrors; 4221 } 4222 break; 4223 4224 case AST_BLOCK_ID: 4225 if (!HaveReadControlBlock) { 4226 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 4227 Diag(diag::err_pch_version_too_old); 4228 return VersionMismatch; 4229 } 4230 4231 // Record that we've loaded this module. 4232 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 4233 return Success; 4234 4235 case UNHASHED_CONTROL_BLOCK_ID: 4236 // This block is handled using look-ahead during ReadControlBlock. We 4237 // shouldn't get here! 4238 Error("malformed block record in AST file"); 4239 return Failure; 4240 4241 default: 4242 if (Stream.SkipBlock()) { 4243 Error("malformed block record in AST file"); 4244 return Failure; 4245 } 4246 break; 4247 } 4248 } 4249 4250 return Success; 4251 } 4252 4253 ASTReader::ASTReadResult 4254 ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy, 4255 unsigned ClientLoadCapabilities) { 4256 const HeaderSearchOptions &HSOpts = 4257 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 4258 bool AllowCompatibleConfigurationMismatch = 4259 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 4260 4261 ASTReadResult Result = readUnhashedControlBlockImpl( 4262 &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch, 4263 Listener.get(), 4264 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions); 4265 4266 // If F was directly imported by another module, it's implicitly validated by 4267 // the importing module. 4268 if (DisableValidation || WasImportedBy || 4269 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 4270 return Success; 4271 4272 if (Result == Failure) { 4273 Error("malformed block record in AST file"); 4274 return Failure; 4275 } 4276 4277 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) { 4278 // If this module has already been finalized in the PCMCache, we're stuck 4279 // with it; we can only load a single version of each module. 4280 // 4281 // This can happen when a module is imported in two contexts: in one, as a 4282 // user module; in another, as a system module (due to an import from 4283 // another module marked with the [system] flag). It usually indicates a 4284 // bug in the module map: this module should also be marked with [system]. 4285 // 4286 // If -Wno-system-headers (the default), and the first import is as a 4287 // system module, then validation will fail during the as-user import, 4288 // since -Werror flags won't have been validated. However, it's reasonable 4289 // to treat this consistently as a system module. 4290 // 4291 // If -Wsystem-headers, the PCM on disk was built with 4292 // -Wno-system-headers, and the first import is as a user module, then 4293 // validation will fail during the as-system import since the PCM on disk 4294 // doesn't guarantee that -Werror was respected. However, the -Werror 4295 // flags were checked during the initial as-user import. 4296 if (PCMCache.isBufferFinal(F.FileName)) { 4297 Diag(diag::warn_module_system_bit_conflict) << F.FileName; 4298 return Success; 4299 } 4300 } 4301 4302 return Result; 4303 } 4304 4305 ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl( 4306 ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities, 4307 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener, 4308 bool ValidateDiagnosticOptions) { 4309 // Initialize a stream. 4310 BitstreamCursor Stream(StreamData); 4311 4312 // Sniff for the signature. 4313 if (!startsWithASTFileMagic(Stream)) 4314 return Failure; 4315 4316 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 4317 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 4318 return Failure; 4319 4320 // Read all of the records in the options block. 4321 RecordData Record; 4322 ASTReadResult Result = Success; 4323 while (true) { 4324 llvm::BitstreamEntry Entry = Stream.advance(); 4325 4326 switch (Entry.Kind) { 4327 case llvm::BitstreamEntry::Error: 4328 case llvm::BitstreamEntry::SubBlock: 4329 return Failure; 4330 4331 case llvm::BitstreamEntry::EndBlock: 4332 return Result; 4333 4334 case llvm::BitstreamEntry::Record: 4335 // The interesting case. 4336 break; 4337 } 4338 4339 // Read and process a record. 4340 Record.clear(); 4341 switch ( 4342 (UnhashedControlBlockRecordTypes)Stream.readRecord(Entry.ID, Record)) { 4343 case SIGNATURE: 4344 if (F) 4345 std::copy(Record.begin(), Record.end(), F->Signature.data()); 4346 break; 4347 case DIAGNOSTIC_OPTIONS: { 4348 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 4349 if (Listener && ValidateDiagnosticOptions && 4350 !AllowCompatibleConfigurationMismatch && 4351 ParseDiagnosticOptions(Record, Complain, *Listener)) 4352 Result = OutOfDate; // Don't return early. Read the signature. 4353 break; 4354 } 4355 case DIAG_PRAGMA_MAPPINGS: 4356 if (!F) 4357 break; 4358 if (F->PragmaDiagMappings.empty()) 4359 F->PragmaDiagMappings.swap(Record); 4360 else 4361 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(), 4362 Record.begin(), Record.end()); 4363 break; 4364 } 4365 } 4366 } 4367 4368 /// Parse a record and blob containing module file extension metadata. 4369 static bool parseModuleFileExtensionMetadata( 4370 const SmallVectorImpl<uint64_t> &Record, 4371 StringRef Blob, 4372 ModuleFileExtensionMetadata &Metadata) { 4373 if (Record.size() < 4) return true; 4374 4375 Metadata.MajorVersion = Record[0]; 4376 Metadata.MinorVersion = Record[1]; 4377 4378 unsigned BlockNameLen = Record[2]; 4379 unsigned UserInfoLen = Record[3]; 4380 4381 if (BlockNameLen + UserInfoLen > Blob.size()) return true; 4382 4383 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen); 4384 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen, 4385 Blob.data() + BlockNameLen + UserInfoLen); 4386 return false; 4387 } 4388 4389 ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) { 4390 BitstreamCursor &Stream = F.Stream; 4391 4392 RecordData Record; 4393 while (true) { 4394 llvm::BitstreamEntry Entry = Stream.advance(); 4395 switch (Entry.Kind) { 4396 case llvm::BitstreamEntry::SubBlock: 4397 if (Stream.SkipBlock()) 4398 return Failure; 4399 4400 continue; 4401 4402 case llvm::BitstreamEntry::EndBlock: 4403 return Success; 4404 4405 case llvm::BitstreamEntry::Error: 4406 return HadErrors; 4407 4408 case llvm::BitstreamEntry::Record: 4409 break; 4410 } 4411 4412 Record.clear(); 4413 StringRef Blob; 4414 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob); 4415 switch (RecCode) { 4416 case EXTENSION_METADATA: { 4417 ModuleFileExtensionMetadata Metadata; 4418 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 4419 return Failure; 4420 4421 // Find a module file extension with this block name. 4422 auto Known = ModuleFileExtensions.find(Metadata.BlockName); 4423 if (Known == ModuleFileExtensions.end()) break; 4424 4425 // Form a reader. 4426 if (auto Reader = Known->second->createExtensionReader(Metadata, *this, 4427 F, Stream)) { 4428 F.ExtensionReaders.push_back(std::move(Reader)); 4429 } 4430 4431 break; 4432 } 4433 } 4434 } 4435 4436 return Success; 4437 } 4438 4439 void ASTReader::InitializeContext() { 4440 assert(ContextObj && "no context to initialize"); 4441 ASTContext &Context = *ContextObj; 4442 4443 // If there's a listener, notify them that we "read" the translation unit. 4444 if (DeserializationListener) 4445 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 4446 Context.getTranslationUnitDecl()); 4447 4448 // FIXME: Find a better way to deal with collisions between these 4449 // built-in types. Right now, we just ignore the problem. 4450 4451 // Load the special types. 4452 if (SpecialTypes.size() >= NumSpecialTypeIDs) { 4453 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 4454 if (!Context.CFConstantStringTypeDecl) 4455 Context.setCFConstantStringType(GetType(String)); 4456 } 4457 4458 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 4459 QualType FileType = GetType(File); 4460 if (FileType.isNull()) { 4461 Error("FILE type is NULL"); 4462 return; 4463 } 4464 4465 if (!Context.FILEDecl) { 4466 if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 4467 Context.setFILEDecl(Typedef->getDecl()); 4468 else { 4469 const TagType *Tag = FileType->getAs<TagType>(); 4470 if (!Tag) { 4471 Error("Invalid FILE type in AST file"); 4472 return; 4473 } 4474 Context.setFILEDecl(Tag->getDecl()); 4475 } 4476 } 4477 } 4478 4479 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 4480 QualType Jmp_bufType = GetType(Jmp_buf); 4481 if (Jmp_bufType.isNull()) { 4482 Error("jmp_buf type is NULL"); 4483 return; 4484 } 4485 4486 if (!Context.jmp_bufDecl) { 4487 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 4488 Context.setjmp_bufDecl(Typedef->getDecl()); 4489 else { 4490 const TagType *Tag = Jmp_bufType->getAs<TagType>(); 4491 if (!Tag) { 4492 Error("Invalid jmp_buf type in AST file"); 4493 return; 4494 } 4495 Context.setjmp_bufDecl(Tag->getDecl()); 4496 } 4497 } 4498 } 4499 4500 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 4501 QualType Sigjmp_bufType = GetType(Sigjmp_buf); 4502 if (Sigjmp_bufType.isNull()) { 4503 Error("sigjmp_buf type is NULL"); 4504 return; 4505 } 4506 4507 if (!Context.sigjmp_bufDecl) { 4508 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 4509 Context.setsigjmp_bufDecl(Typedef->getDecl()); 4510 else { 4511 const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 4512 assert(Tag && "Invalid sigjmp_buf type in AST file"); 4513 Context.setsigjmp_bufDecl(Tag->getDecl()); 4514 } 4515 } 4516 } 4517 4518 if (unsigned ObjCIdRedef 4519 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 4520 if (Context.ObjCIdRedefinitionType.isNull()) 4521 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 4522 } 4523 4524 if (unsigned ObjCClassRedef 4525 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 4526 if (Context.ObjCClassRedefinitionType.isNull()) 4527 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 4528 } 4529 4530 if (unsigned ObjCSelRedef 4531 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 4532 if (Context.ObjCSelRedefinitionType.isNull()) 4533 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 4534 } 4535 4536 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 4537 QualType Ucontext_tType = GetType(Ucontext_t); 4538 if (Ucontext_tType.isNull()) { 4539 Error("ucontext_t type is NULL"); 4540 return; 4541 } 4542 4543 if (!Context.ucontext_tDecl) { 4544 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 4545 Context.setucontext_tDecl(Typedef->getDecl()); 4546 else { 4547 const TagType *Tag = Ucontext_tType->getAs<TagType>(); 4548 assert(Tag && "Invalid ucontext_t type in AST file"); 4549 Context.setucontext_tDecl(Tag->getDecl()); 4550 } 4551 } 4552 } 4553 } 4554 4555 ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 4556 4557 // If there were any CUDA special declarations, deserialize them. 4558 if (!CUDASpecialDeclRefs.empty()) { 4559 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 4560 Context.setcudaConfigureCallDecl( 4561 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 4562 } 4563 4564 // Re-export any modules that were imported by a non-module AST file. 4565 // FIXME: This does not make macro-only imports visible again. 4566 for (auto &Import : ImportedModules) { 4567 if (Module *Imported = getSubmodule(Import.ID)) { 4568 makeModuleVisible(Imported, Module::AllVisible, 4569 /*ImportLoc=*/Import.ImportLoc); 4570 if (Import.ImportLoc.isValid()) 4571 PP.makeModuleVisible(Imported, Import.ImportLoc); 4572 // FIXME: should we tell Sema to make the module visible too? 4573 } 4574 } 4575 ImportedModules.clear(); 4576 } 4577 4578 void ASTReader::finalizeForWriting() { 4579 // Nothing to do for now. 4580 } 4581 4582 /// \brief Reads and return the signature record from \p PCH's control block, or 4583 /// else returns 0. 4584 static ASTFileSignature readASTFileSignature(StringRef PCH) { 4585 BitstreamCursor Stream(PCH); 4586 if (!startsWithASTFileMagic(Stream)) 4587 return ASTFileSignature(); 4588 4589 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 4590 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 4591 return ASTFileSignature(); 4592 4593 // Scan for SIGNATURE inside the diagnostic options block. 4594 ASTReader::RecordData Record; 4595 while (true) { 4596 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 4597 if (Entry.Kind != llvm::BitstreamEntry::Record) 4598 return ASTFileSignature(); 4599 4600 Record.clear(); 4601 StringRef Blob; 4602 if (SIGNATURE == Stream.readRecord(Entry.ID, Record, &Blob)) 4603 return {{{(uint32_t)Record[0], (uint32_t)Record[1], (uint32_t)Record[2], 4604 (uint32_t)Record[3], (uint32_t)Record[4]}}}; 4605 } 4606 } 4607 4608 /// \brief Retrieve the name of the original source file name 4609 /// directly from the AST file, without actually loading the AST 4610 /// file. 4611 std::string ASTReader::getOriginalSourceFile( 4612 const std::string &ASTFileName, FileManager &FileMgr, 4613 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) { 4614 // Open the AST file. 4615 auto Buffer = FileMgr.getBufferForFile(ASTFileName); 4616 if (!Buffer) { 4617 Diags.Report(diag::err_fe_unable_to_read_pch_file) 4618 << ASTFileName << Buffer.getError().message(); 4619 return std::string(); 4620 } 4621 4622 // Initialize the stream 4623 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer)); 4624 4625 // Sniff for the signature. 4626 if (!startsWithASTFileMagic(Stream)) { 4627 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName; 4628 return std::string(); 4629 } 4630 4631 // Scan for the CONTROL_BLOCK_ID block. 4632 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 4633 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 4634 return std::string(); 4635 } 4636 4637 // Scan for ORIGINAL_FILE inside the control block. 4638 RecordData Record; 4639 while (true) { 4640 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 4641 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 4642 return std::string(); 4643 4644 if (Entry.Kind != llvm::BitstreamEntry::Record) { 4645 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 4646 return std::string(); 4647 } 4648 4649 Record.clear(); 4650 StringRef Blob; 4651 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE) 4652 return Blob.str(); 4653 } 4654 } 4655 4656 namespace { 4657 4658 class SimplePCHValidator : public ASTReaderListener { 4659 const LangOptions &ExistingLangOpts; 4660 const TargetOptions &ExistingTargetOpts; 4661 const PreprocessorOptions &ExistingPPOpts; 4662 std::string ExistingModuleCachePath; 4663 FileManager &FileMgr; 4664 4665 public: 4666 SimplePCHValidator(const LangOptions &ExistingLangOpts, 4667 const TargetOptions &ExistingTargetOpts, 4668 const PreprocessorOptions &ExistingPPOpts, 4669 StringRef ExistingModuleCachePath, 4670 FileManager &FileMgr) 4671 : ExistingLangOpts(ExistingLangOpts), 4672 ExistingTargetOpts(ExistingTargetOpts), 4673 ExistingPPOpts(ExistingPPOpts), 4674 ExistingModuleCachePath(ExistingModuleCachePath), 4675 FileMgr(FileMgr) {} 4676 4677 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, 4678 bool AllowCompatibleDifferences) override { 4679 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr, 4680 AllowCompatibleDifferences); 4681 } 4682 4683 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, 4684 bool AllowCompatibleDifferences) override { 4685 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr, 4686 AllowCompatibleDifferences); 4687 } 4688 4689 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 4690 StringRef SpecificModuleCachePath, 4691 bool Complain) override { 4692 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 4693 ExistingModuleCachePath, 4694 nullptr, ExistingLangOpts); 4695 } 4696 4697 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 4698 bool Complain, 4699 std::string &SuggestedPredefines) override { 4700 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr, 4701 SuggestedPredefines, ExistingLangOpts); 4702 } 4703 }; 4704 4705 } // namespace 4706 4707 bool ASTReader::readASTFileControlBlock( 4708 StringRef Filename, FileManager &FileMgr, 4709 const PCHContainerReader &PCHContainerRdr, 4710 bool FindModuleFileExtensions, 4711 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) { 4712 // Open the AST file. 4713 // FIXME: This allows use of the VFS; we do not allow use of the 4714 // VFS when actually loading a module. 4715 auto Buffer = FileMgr.getBufferForFile(Filename); 4716 if (!Buffer) { 4717 return true; 4718 } 4719 4720 // Initialize the stream 4721 StringRef Bytes = PCHContainerRdr.ExtractPCH(**Buffer); 4722 BitstreamCursor Stream(Bytes); 4723 4724 // Sniff for the signature. 4725 if (!startsWithASTFileMagic(Stream)) 4726 return true; 4727 4728 // Scan for the CONTROL_BLOCK_ID block. 4729 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 4730 return true; 4731 4732 bool NeedsInputFiles = Listener.needsInputFileVisitation(); 4733 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation(); 4734 bool NeedsImports = Listener.needsImportVisitation(); 4735 BitstreamCursor InputFilesCursor; 4736 4737 RecordData Record; 4738 std::string ModuleDir; 4739 bool DoneWithControlBlock = false; 4740 while (!DoneWithControlBlock) { 4741 llvm::BitstreamEntry Entry = Stream.advance(); 4742 4743 switch (Entry.Kind) { 4744 case llvm::BitstreamEntry::SubBlock: { 4745 switch (Entry.ID) { 4746 case OPTIONS_BLOCK_ID: { 4747 std::string IgnoredSuggestedPredefines; 4748 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate, 4749 /*AllowCompatibleConfigurationMismatch*/ false, 4750 Listener, IgnoredSuggestedPredefines) != Success) 4751 return true; 4752 break; 4753 } 4754 4755 case INPUT_FILES_BLOCK_ID: 4756 InputFilesCursor = Stream; 4757 if (Stream.SkipBlock() || 4758 (NeedsInputFiles && 4759 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID))) 4760 return true; 4761 break; 4762 4763 default: 4764 if (Stream.SkipBlock()) 4765 return true; 4766 break; 4767 } 4768 4769 continue; 4770 } 4771 4772 case llvm::BitstreamEntry::EndBlock: 4773 DoneWithControlBlock = true; 4774 break; 4775 4776 case llvm::BitstreamEntry::Error: 4777 return true; 4778 4779 case llvm::BitstreamEntry::Record: 4780 break; 4781 } 4782 4783 if (DoneWithControlBlock) break; 4784 4785 Record.clear(); 4786 StringRef Blob; 4787 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob); 4788 switch ((ControlRecordTypes)RecCode) { 4789 case METADATA: 4790 if (Record[0] != VERSION_MAJOR) 4791 return true; 4792 if (Listener.ReadFullVersionInformation(Blob)) 4793 return true; 4794 break; 4795 case MODULE_NAME: 4796 Listener.ReadModuleName(Blob); 4797 break; 4798 case MODULE_DIRECTORY: 4799 ModuleDir = Blob; 4800 break; 4801 case MODULE_MAP_FILE: { 4802 unsigned Idx = 0; 4803 auto Path = ReadString(Record, Idx); 4804 ResolveImportedPath(Path, ModuleDir); 4805 Listener.ReadModuleMapFile(Path); 4806 break; 4807 } 4808 case INPUT_FILE_OFFSETS: { 4809 if (!NeedsInputFiles) 4810 break; 4811 4812 unsigned NumInputFiles = Record[0]; 4813 unsigned NumUserFiles = Record[1]; 4814 const uint64_t *InputFileOffs = (const uint64_t *)Blob.data(); 4815 for (unsigned I = 0; I != NumInputFiles; ++I) { 4816 // Go find this input file. 4817 bool isSystemFile = I >= NumUserFiles; 4818 4819 if (isSystemFile && !NeedsSystemInputFiles) 4820 break; // the rest are system input files 4821 4822 BitstreamCursor &Cursor = InputFilesCursor; 4823 SavedStreamPosition SavedPosition(Cursor); 4824 Cursor.JumpToBit(InputFileOffs[I]); 4825 4826 unsigned Code = Cursor.ReadCode(); 4827 RecordData Record; 4828 StringRef Blob; 4829 bool shouldContinue = false; 4830 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) { 4831 case INPUT_FILE: 4832 bool Overridden = static_cast<bool>(Record[3]); 4833 std::string Filename = Blob; 4834 ResolveImportedPath(Filename, ModuleDir); 4835 shouldContinue = Listener.visitInputFile( 4836 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false); 4837 break; 4838 } 4839 if (!shouldContinue) 4840 break; 4841 } 4842 break; 4843 } 4844 4845 case IMPORTS: { 4846 if (!NeedsImports) 4847 break; 4848 4849 unsigned Idx = 0, N = Record.size(); 4850 while (Idx < N) { 4851 // Read information about the AST file. 4852 Idx += 5; // ImportLoc, Size, ModTime, Signature 4853 SkipString(Record, Idx); // Module name; FIXME: pass to listener? 4854 std::string Filename = ReadString(Record, Idx); 4855 ResolveImportedPath(Filename, ModuleDir); 4856 Listener.visitImport(Filename); 4857 } 4858 break; 4859 } 4860 4861 default: 4862 // No other validation to perform. 4863 break; 4864 } 4865 } 4866 4867 // Look for module file extension blocks, if requested. 4868 if (FindModuleFileExtensions) { 4869 BitstreamCursor SavedStream = Stream; 4870 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) { 4871 bool DoneWithExtensionBlock = false; 4872 while (!DoneWithExtensionBlock) { 4873 llvm::BitstreamEntry Entry = Stream.advance(); 4874 4875 switch (Entry.Kind) { 4876 case llvm::BitstreamEntry::SubBlock: 4877 if (Stream.SkipBlock()) 4878 return true; 4879 4880 continue; 4881 4882 case llvm::BitstreamEntry::EndBlock: 4883 DoneWithExtensionBlock = true; 4884 continue; 4885 4886 case llvm::BitstreamEntry::Error: 4887 return true; 4888 4889 case llvm::BitstreamEntry::Record: 4890 break; 4891 } 4892 4893 Record.clear(); 4894 StringRef Blob; 4895 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob); 4896 switch (RecCode) { 4897 case EXTENSION_METADATA: { 4898 ModuleFileExtensionMetadata Metadata; 4899 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 4900 return true; 4901 4902 Listener.readModuleFileExtension(Metadata); 4903 break; 4904 } 4905 } 4906 } 4907 } 4908 Stream = SavedStream; 4909 } 4910 4911 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 4912 if (readUnhashedControlBlockImpl( 4913 nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate, 4914 /*AllowCompatibleConfigurationMismatch*/ false, &Listener, 4915 ValidateDiagnosticOptions) != Success) 4916 return true; 4917 4918 return false; 4919 } 4920 4921 bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, 4922 const PCHContainerReader &PCHContainerRdr, 4923 const LangOptions &LangOpts, 4924 const TargetOptions &TargetOpts, 4925 const PreprocessorOptions &PPOpts, 4926 StringRef ExistingModuleCachePath) { 4927 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, 4928 ExistingModuleCachePath, FileMgr); 4929 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr, 4930 /*FindModuleFileExtensions=*/false, 4931 validator, 4932 /*ValidateDiagnosticOptions=*/true); 4933 } 4934 4935 ASTReader::ASTReadResult 4936 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 4937 // Enter the submodule block. 4938 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) { 4939 Error("malformed submodule block record in AST file"); 4940 return Failure; 4941 } 4942 4943 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 4944 bool First = true; 4945 Module *CurrentModule = nullptr; 4946 RecordData Record; 4947 while (true) { 4948 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks(); 4949 4950 switch (Entry.Kind) { 4951 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 4952 case llvm::BitstreamEntry::Error: 4953 Error("malformed block record in AST file"); 4954 return Failure; 4955 case llvm::BitstreamEntry::EndBlock: 4956 return Success; 4957 case llvm::BitstreamEntry::Record: 4958 // The interesting case. 4959 break; 4960 } 4961 4962 // Read a record. 4963 StringRef Blob; 4964 Record.clear(); 4965 auto Kind = F.Stream.readRecord(Entry.ID, Record, &Blob); 4966 4967 if ((Kind == SUBMODULE_METADATA) != First) { 4968 Error("submodule metadata record should be at beginning of block"); 4969 return Failure; 4970 } 4971 First = false; 4972 4973 // Submodule information is only valid if we have a current module. 4974 // FIXME: Should we error on these cases? 4975 if (!CurrentModule && Kind != SUBMODULE_METADATA && 4976 Kind != SUBMODULE_DEFINITION) 4977 continue; 4978 4979 switch (Kind) { 4980 default: // Default behavior: ignore. 4981 break; 4982 4983 case SUBMODULE_DEFINITION: { 4984 if (Record.size() < 12) { 4985 Error("malformed module definition"); 4986 return Failure; 4987 } 4988 4989 StringRef Name = Blob; 4990 unsigned Idx = 0; 4991 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]); 4992 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]); 4993 Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++]; 4994 bool IsFramework = Record[Idx++]; 4995 bool IsExplicit = Record[Idx++]; 4996 bool IsSystem = Record[Idx++]; 4997 bool IsExternC = Record[Idx++]; 4998 bool InferSubmodules = Record[Idx++]; 4999 bool InferExplicitSubmodules = Record[Idx++]; 5000 bool InferExportWildcard = Record[Idx++]; 5001 bool ConfigMacrosExhaustive = Record[Idx++]; 5002 bool ModuleMapIsPrivate = Record[Idx++]; 5003 5004 Module *ParentModule = nullptr; 5005 if (Parent) 5006 ParentModule = getSubmodule(Parent); 5007 5008 // Retrieve this (sub)module from the module map, creating it if 5009 // necessary. 5010 CurrentModule = 5011 ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit) 5012 .first; 5013 5014 // FIXME: set the definition loc for CurrentModule, or call 5015 // ModMap.setInferredModuleAllowedBy() 5016 5017 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 5018 if (GlobalIndex >= SubmodulesLoaded.size() || 5019 SubmodulesLoaded[GlobalIndex]) { 5020 Error("too many submodules"); 5021 return Failure; 5022 } 5023 5024 if (!ParentModule) { 5025 if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 5026 if (CurFile != F.File) { 5027 if (!Diags.isDiagnosticInFlight()) { 5028 Diag(diag::err_module_file_conflict) 5029 << CurrentModule->getTopLevelModuleName() 5030 << CurFile->getName() 5031 << F.File->getName(); 5032 } 5033 return Failure; 5034 } 5035 } 5036 5037 CurrentModule->setASTFile(F.File); 5038 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath; 5039 } 5040 5041 CurrentModule->Kind = Kind; 5042 CurrentModule->Signature = F.Signature; 5043 CurrentModule->IsFromModuleFile = true; 5044 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 5045 CurrentModule->IsExternC = IsExternC; 5046 CurrentModule->InferSubmodules = InferSubmodules; 5047 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 5048 CurrentModule->InferExportWildcard = InferExportWildcard; 5049 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive; 5050 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate; 5051 if (DeserializationListener) 5052 DeserializationListener->ModuleRead(GlobalID, CurrentModule); 5053 5054 SubmodulesLoaded[GlobalIndex] = CurrentModule; 5055 5056 // Clear out data that will be replaced by what is in the module file. 5057 CurrentModule->LinkLibraries.clear(); 5058 CurrentModule->ConfigMacros.clear(); 5059 CurrentModule->UnresolvedConflicts.clear(); 5060 CurrentModule->Conflicts.clear(); 5061 5062 // The module is available unless it's missing a requirement; relevant 5063 // requirements will be (re-)added by SUBMODULE_REQUIRES records. 5064 // Missing headers that were present when the module was built do not 5065 // make it unavailable -- if we got this far, this must be an explicitly 5066 // imported module file. 5067 CurrentModule->Requirements.clear(); 5068 CurrentModule->MissingHeaders.clear(); 5069 CurrentModule->IsMissingRequirement = 5070 ParentModule && ParentModule->IsMissingRequirement; 5071 CurrentModule->IsAvailable = !CurrentModule->IsMissingRequirement; 5072 break; 5073 } 5074 5075 case SUBMODULE_UMBRELLA_HEADER: { 5076 std::string Filename = Blob; 5077 ResolveImportedPath(F, Filename); 5078 if (auto *Umbrella = PP.getFileManager().getFile(Filename)) { 5079 if (!CurrentModule->getUmbrellaHeader()) 5080 ModMap.setUmbrellaHeader(CurrentModule, Umbrella, Blob); 5081 else if (CurrentModule->getUmbrellaHeader().Entry != Umbrella) { 5082 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 5083 Error("mismatched umbrella headers in submodule"); 5084 return OutOfDate; 5085 } 5086 } 5087 break; 5088 } 5089 5090 case SUBMODULE_HEADER: 5091 case SUBMODULE_EXCLUDED_HEADER: 5092 case SUBMODULE_PRIVATE_HEADER: 5093 // We lazily associate headers with their modules via the HeaderInfo table. 5094 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 5095 // of complete filenames or remove it entirely. 5096 break; 5097 5098 case SUBMODULE_TEXTUAL_HEADER: 5099 case SUBMODULE_PRIVATE_TEXTUAL_HEADER: 5100 // FIXME: Textual headers are not marked in the HeaderInfo table. Load 5101 // them here. 5102 break; 5103 5104 case SUBMODULE_TOPHEADER: 5105 CurrentModule->addTopHeaderFilename(Blob); 5106 break; 5107 5108 case SUBMODULE_UMBRELLA_DIR: { 5109 std::string Dirname = Blob; 5110 ResolveImportedPath(F, Dirname); 5111 if (auto *Umbrella = PP.getFileManager().getDirectory(Dirname)) { 5112 if (!CurrentModule->getUmbrellaDir()) 5113 ModMap.setUmbrellaDir(CurrentModule, Umbrella, Blob); 5114 else if (CurrentModule->getUmbrellaDir().Entry != Umbrella) { 5115 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 5116 Error("mismatched umbrella directories in submodule"); 5117 return OutOfDate; 5118 } 5119 } 5120 break; 5121 } 5122 5123 case SUBMODULE_METADATA: { 5124 F.BaseSubmoduleID = getTotalNumSubmodules(); 5125 F.LocalNumSubmodules = Record[0]; 5126 unsigned LocalBaseSubmoduleID = Record[1]; 5127 if (F.LocalNumSubmodules > 0) { 5128 // Introduce the global -> local mapping for submodules within this 5129 // module. 5130 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 5131 5132 // Introduce the local -> global mapping for submodules within this 5133 // module. 5134 F.SubmoduleRemap.insertOrReplace( 5135 std::make_pair(LocalBaseSubmoduleID, 5136 F.BaseSubmoduleID - LocalBaseSubmoduleID)); 5137 5138 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 5139 } 5140 break; 5141 } 5142 5143 case SUBMODULE_IMPORTS: 5144 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 5145 UnresolvedModuleRef Unresolved; 5146 Unresolved.File = &F; 5147 Unresolved.Mod = CurrentModule; 5148 Unresolved.ID = Record[Idx]; 5149 Unresolved.Kind = UnresolvedModuleRef::Import; 5150 Unresolved.IsWildcard = false; 5151 UnresolvedModuleRefs.push_back(Unresolved); 5152 } 5153 break; 5154 5155 case SUBMODULE_EXPORTS: 5156 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 5157 UnresolvedModuleRef Unresolved; 5158 Unresolved.File = &F; 5159 Unresolved.Mod = CurrentModule; 5160 Unresolved.ID = Record[Idx]; 5161 Unresolved.Kind = UnresolvedModuleRef::Export; 5162 Unresolved.IsWildcard = Record[Idx + 1]; 5163 UnresolvedModuleRefs.push_back(Unresolved); 5164 } 5165 5166 // Once we've loaded the set of exports, there's no reason to keep 5167 // the parsed, unresolved exports around. 5168 CurrentModule->UnresolvedExports.clear(); 5169 break; 5170 5171 case SUBMODULE_REQUIRES: 5172 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(), 5173 PP.getTargetInfo()); 5174 break; 5175 5176 case SUBMODULE_LINK_LIBRARY: 5177 ModMap.resolveLinkAsDependencies(CurrentModule); 5178 CurrentModule->LinkLibraries.push_back( 5179 Module::LinkLibrary(Blob, Record[0])); 5180 break; 5181 5182 case SUBMODULE_CONFIG_MACRO: 5183 CurrentModule->ConfigMacros.push_back(Blob.str()); 5184 break; 5185 5186 case SUBMODULE_CONFLICT: { 5187 UnresolvedModuleRef Unresolved; 5188 Unresolved.File = &F; 5189 Unresolved.Mod = CurrentModule; 5190 Unresolved.ID = Record[0]; 5191 Unresolved.Kind = UnresolvedModuleRef::Conflict; 5192 Unresolved.IsWildcard = false; 5193 Unresolved.String = Blob; 5194 UnresolvedModuleRefs.push_back(Unresolved); 5195 break; 5196 } 5197 5198 case SUBMODULE_INITIALIZERS: { 5199 if (!ContextObj) 5200 break; 5201 SmallVector<uint32_t, 16> Inits; 5202 for (auto &ID : Record) 5203 Inits.push_back(getGlobalDeclID(F, ID)); 5204 ContextObj->addLazyModuleInitializers(CurrentModule, Inits); 5205 break; 5206 } 5207 5208 case SUBMODULE_EXPORT_AS: 5209 CurrentModule->ExportAsModule = Blob.str(); 5210 ModMap.addLinkAsDependency(CurrentModule); 5211 break; 5212 } 5213 } 5214 } 5215 5216 /// \brief Parse the record that corresponds to a LangOptions data 5217 /// structure. 5218 /// 5219 /// This routine parses the language options from the AST file and then gives 5220 /// them to the AST listener if one is set. 5221 /// 5222 /// \returns true if the listener deems the file unacceptable, false otherwise. 5223 bool ASTReader::ParseLanguageOptions(const RecordData &Record, 5224 bool Complain, 5225 ASTReaderListener &Listener, 5226 bool AllowCompatibleDifferences) { 5227 LangOptions LangOpts; 5228 unsigned Idx = 0; 5229 #define LANGOPT(Name, Bits, Default, Description) \ 5230 LangOpts.Name = Record[Idx++]; 5231 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 5232 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 5233 #include "clang/Basic/LangOptions.def" 5234 #define SANITIZER(NAME, ID) \ 5235 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]); 5236 #include "clang/Basic/Sanitizers.def" 5237 5238 for (unsigned N = Record[Idx++]; N; --N) 5239 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx)); 5240 5241 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 5242 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 5243 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 5244 5245 LangOpts.CurrentModule = ReadString(Record, Idx); 5246 5247 // Comment options. 5248 for (unsigned N = Record[Idx++]; N; --N) { 5249 LangOpts.CommentOpts.BlockCommandNames.push_back( 5250 ReadString(Record, Idx)); 5251 } 5252 LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 5253 5254 // OpenMP offloading options. 5255 for (unsigned N = Record[Idx++]; N; --N) { 5256 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx))); 5257 } 5258 5259 LangOpts.OMPHostIRFile = ReadString(Record, Idx); 5260 5261 return Listener.ReadLanguageOptions(LangOpts, Complain, 5262 AllowCompatibleDifferences); 5263 } 5264 5265 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain, 5266 ASTReaderListener &Listener, 5267 bool AllowCompatibleDifferences) { 5268 unsigned Idx = 0; 5269 TargetOptions TargetOpts; 5270 TargetOpts.Triple = ReadString(Record, Idx); 5271 TargetOpts.CPU = ReadString(Record, Idx); 5272 TargetOpts.ABI = ReadString(Record, Idx); 5273 for (unsigned N = Record[Idx++]; N; --N) { 5274 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 5275 } 5276 for (unsigned N = Record[Idx++]; N; --N) { 5277 TargetOpts.Features.push_back(ReadString(Record, Idx)); 5278 } 5279 5280 return Listener.ReadTargetOptions(TargetOpts, Complain, 5281 AllowCompatibleDifferences); 5282 } 5283 5284 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 5285 ASTReaderListener &Listener) { 5286 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); 5287 unsigned Idx = 0; 5288 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++]; 5289 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 5290 DiagOpts->set##Name(static_cast<Type>(Record[Idx++])); 5291 #include "clang/Basic/DiagnosticOptions.def" 5292 5293 for (unsigned N = Record[Idx++]; N; --N) 5294 DiagOpts->Warnings.push_back(ReadString(Record, Idx)); 5295 for (unsigned N = Record[Idx++]; N; --N) 5296 DiagOpts->Remarks.push_back(ReadString(Record, Idx)); 5297 5298 return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 5299 } 5300 5301 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 5302 ASTReaderListener &Listener) { 5303 FileSystemOptions FSOpts; 5304 unsigned Idx = 0; 5305 FSOpts.WorkingDir = ReadString(Record, Idx); 5306 return Listener.ReadFileSystemOptions(FSOpts, Complain); 5307 } 5308 5309 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 5310 bool Complain, 5311 ASTReaderListener &Listener) { 5312 HeaderSearchOptions HSOpts; 5313 unsigned Idx = 0; 5314 HSOpts.Sysroot = ReadString(Record, Idx); 5315 5316 // Include entries. 5317 for (unsigned N = Record[Idx++]; N; --N) { 5318 std::string Path = ReadString(Record, Idx); 5319 frontend::IncludeDirGroup Group 5320 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 5321 bool IsFramework = Record[Idx++]; 5322 bool IgnoreSysRoot = Record[Idx++]; 5323 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework, 5324 IgnoreSysRoot); 5325 } 5326 5327 // System header prefixes. 5328 for (unsigned N = Record[Idx++]; N; --N) { 5329 std::string Prefix = ReadString(Record, Idx); 5330 bool IsSystemHeader = Record[Idx++]; 5331 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader); 5332 } 5333 5334 HSOpts.ResourceDir = ReadString(Record, Idx); 5335 HSOpts.ModuleCachePath = ReadString(Record, Idx); 5336 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx); 5337 HSOpts.DisableModuleHash = Record[Idx++]; 5338 HSOpts.ImplicitModuleMaps = Record[Idx++]; 5339 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++]; 5340 HSOpts.UseBuiltinIncludes = Record[Idx++]; 5341 HSOpts.UseStandardSystemIncludes = Record[Idx++]; 5342 HSOpts.UseStandardCXXIncludes = Record[Idx++]; 5343 HSOpts.UseLibcxx = Record[Idx++]; 5344 std::string SpecificModuleCachePath = ReadString(Record, Idx); 5345 5346 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5347 Complain); 5348 } 5349 5350 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 5351 bool Complain, 5352 ASTReaderListener &Listener, 5353 std::string &SuggestedPredefines) { 5354 PreprocessorOptions PPOpts; 5355 unsigned Idx = 0; 5356 5357 // Macro definitions/undefs 5358 for (unsigned N = Record[Idx++]; N; --N) { 5359 std::string Macro = ReadString(Record, Idx); 5360 bool IsUndef = Record[Idx++]; 5361 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 5362 } 5363 5364 // Includes 5365 for (unsigned N = Record[Idx++]; N; --N) { 5366 PPOpts.Includes.push_back(ReadString(Record, Idx)); 5367 } 5368 5369 // Macro Includes 5370 for (unsigned N = Record[Idx++]; N; --N) { 5371 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 5372 } 5373 5374 PPOpts.UsePredefines = Record[Idx++]; 5375 PPOpts.DetailedRecord = Record[Idx++]; 5376 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 5377 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx); 5378 PPOpts.ObjCXXARCStandardLibrary = 5379 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 5380 SuggestedPredefines.clear(); 5381 return Listener.ReadPreprocessorOptions(PPOpts, Complain, 5382 SuggestedPredefines); 5383 } 5384 5385 std::pair<ModuleFile *, unsigned> 5386 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 5387 GlobalPreprocessedEntityMapType::iterator 5388 I = GlobalPreprocessedEntityMap.find(GlobalIndex); 5389 assert(I != GlobalPreprocessedEntityMap.end() && 5390 "Corrupted global preprocessed entity map"); 5391 ModuleFile *M = I->second; 5392 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 5393 return std::make_pair(M, LocalIndex); 5394 } 5395 5396 llvm::iterator_range<PreprocessingRecord::iterator> 5397 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 5398 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 5399 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 5400 Mod.NumPreprocessedEntities); 5401 5402 return llvm::make_range(PreprocessingRecord::iterator(), 5403 PreprocessingRecord::iterator()); 5404 } 5405 5406 llvm::iterator_range<ASTReader::ModuleDeclIterator> 5407 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 5408 return llvm::make_range( 5409 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 5410 ModuleDeclIterator(this, &Mod, 5411 Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 5412 } 5413 5414 SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) { 5415 auto I = GlobalSkippedRangeMap.find(GlobalIndex); 5416 assert(I != GlobalSkippedRangeMap.end() && 5417 "Corrupted global skipped range map"); 5418 ModuleFile *M = I->second; 5419 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID; 5420 assert(LocalIndex < M->NumPreprocessedSkippedRanges); 5421 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex]; 5422 SourceRange Range(TranslateSourceLocation(*M, RawRange.getBegin()), 5423 TranslateSourceLocation(*M, RawRange.getEnd())); 5424 assert(Range.isValid()); 5425 return Range; 5426 } 5427 5428 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 5429 PreprocessedEntityID PPID = Index+1; 5430 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 5431 ModuleFile &M = *PPInfo.first; 5432 unsigned LocalIndex = PPInfo.second; 5433 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 5434 5435 if (!PP.getPreprocessingRecord()) { 5436 Error("no preprocessing record"); 5437 return nullptr; 5438 } 5439 5440 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 5441 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset); 5442 5443 llvm::BitstreamEntry Entry = 5444 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 5445 if (Entry.Kind != llvm::BitstreamEntry::Record) 5446 return nullptr; 5447 5448 // Read the record. 5449 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()), 5450 TranslateSourceLocation(M, PPOffs.getEnd())); 5451 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 5452 StringRef Blob; 5453 RecordData Record; 5454 PreprocessorDetailRecordTypes RecType = 5455 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord( 5456 Entry.ID, Record, &Blob); 5457 switch (RecType) { 5458 case PPD_MACRO_EXPANSION: { 5459 bool isBuiltin = Record[0]; 5460 IdentifierInfo *Name = nullptr; 5461 MacroDefinitionRecord *Def = nullptr; 5462 if (isBuiltin) 5463 Name = getLocalIdentifier(M, Record[1]); 5464 else { 5465 PreprocessedEntityID GlobalID = 5466 getGlobalPreprocessedEntityID(M, Record[1]); 5467 Def = cast<MacroDefinitionRecord>( 5468 PPRec.getLoadedPreprocessedEntity(GlobalID - 1)); 5469 } 5470 5471 MacroExpansion *ME; 5472 if (isBuiltin) 5473 ME = new (PPRec) MacroExpansion(Name, Range); 5474 else 5475 ME = new (PPRec) MacroExpansion(Def, Range); 5476 5477 return ME; 5478 } 5479 5480 case PPD_MACRO_DEFINITION: { 5481 // Decode the identifier info and then check again; if the macro is 5482 // still defined and associated with the identifier, 5483 IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 5484 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range); 5485 5486 if (DeserializationListener) 5487 DeserializationListener->MacroDefinitionRead(PPID, MD); 5488 5489 return MD; 5490 } 5491 5492 case PPD_INCLUSION_DIRECTIVE: { 5493 const char *FullFileNameStart = Blob.data() + Record[0]; 5494 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 5495 const FileEntry *File = nullptr; 5496 if (!FullFileName.empty()) 5497 File = PP.getFileManager().getFile(FullFileName); 5498 5499 // FIXME: Stable encoding 5500 InclusionDirective::InclusionKind Kind 5501 = static_cast<InclusionDirective::InclusionKind>(Record[2]); 5502 InclusionDirective *ID 5503 = new (PPRec) InclusionDirective(PPRec, Kind, 5504 StringRef(Blob.data(), Record[0]), 5505 Record[1], Record[3], 5506 File, 5507 Range); 5508 return ID; 5509 } 5510 } 5511 5512 llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 5513 } 5514 5515 /// \brief Find the next module that contains entities and return the ID 5516 /// of the first entry. 5517 /// 5518 /// \param SLocMapI points at a chunk of a module that contains no 5519 /// preprocessed entities or the entities it contains are not the ones we are 5520 /// looking for. 5521 PreprocessedEntityID ASTReader::findNextPreprocessedEntity( 5522 GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 5523 ++SLocMapI; 5524 for (GlobalSLocOffsetMapType::const_iterator 5525 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 5526 ModuleFile &M = *SLocMapI->second; 5527 if (M.NumPreprocessedEntities) 5528 return M.BasePreprocessedEntityID; 5529 } 5530 5531 return getTotalNumPreprocessedEntities(); 5532 } 5533 5534 namespace { 5535 5536 struct PPEntityComp { 5537 const ASTReader &Reader; 5538 ModuleFile &M; 5539 5540 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {} 5541 5542 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 5543 SourceLocation LHS = getLoc(L); 5544 SourceLocation RHS = getLoc(R); 5545 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5546 } 5547 5548 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 5549 SourceLocation LHS = getLoc(L); 5550 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5551 } 5552 5553 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 5554 SourceLocation RHS = getLoc(R); 5555 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5556 } 5557 5558 SourceLocation getLoc(const PPEntityOffset &PPE) const { 5559 return Reader.TranslateSourceLocation(M, PPE.getBegin()); 5560 } 5561 }; 5562 5563 } // namespace 5564 5565 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc, 5566 bool EndsAfter) const { 5567 if (SourceMgr.isLocalSourceLocation(Loc)) 5568 return getTotalNumPreprocessedEntities(); 5569 5570 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find( 5571 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1); 5572 assert(SLocMapI != GlobalSLocOffsetMap.end() && 5573 "Corrupted global sloc offset map"); 5574 5575 if (SLocMapI->second->NumPreprocessedEntities == 0) 5576 return findNextPreprocessedEntity(SLocMapI); 5577 5578 ModuleFile &M = *SLocMapI->second; 5579 5580 using pp_iterator = const PPEntityOffset *; 5581 5582 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 5583 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 5584 5585 size_t Count = M.NumPreprocessedEntities; 5586 size_t Half; 5587 pp_iterator First = pp_begin; 5588 pp_iterator PPI; 5589 5590 if (EndsAfter) { 5591 PPI = std::upper_bound(pp_begin, pp_end, Loc, 5592 PPEntityComp(*this, M)); 5593 } else { 5594 // Do a binary search manually instead of using std::lower_bound because 5595 // The end locations of entities may be unordered (when a macro expansion 5596 // is inside another macro argument), but for this case it is not important 5597 // whether we get the first macro expansion or its containing macro. 5598 while (Count > 0) { 5599 Half = Count / 2; 5600 PPI = First; 5601 std::advance(PPI, Half); 5602 if (SourceMgr.isBeforeInTranslationUnit( 5603 TranslateSourceLocation(M, PPI->getEnd()), Loc)) { 5604 First = PPI; 5605 ++First; 5606 Count = Count - Half - 1; 5607 } else 5608 Count = Half; 5609 } 5610 } 5611 5612 if (PPI == pp_end) 5613 return findNextPreprocessedEntity(SLocMapI); 5614 5615 return M.BasePreprocessedEntityID + (PPI - pp_begin); 5616 } 5617 5618 /// \brief Returns a pair of [Begin, End) indices of preallocated 5619 /// preprocessed entities that \arg Range encompasses. 5620 std::pair<unsigned, unsigned> 5621 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 5622 if (Range.isInvalid()) 5623 return std::make_pair(0,0); 5624 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 5625 5626 PreprocessedEntityID BeginID = 5627 findPreprocessedEntity(Range.getBegin(), false); 5628 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true); 5629 return std::make_pair(BeginID, EndID); 5630 } 5631 5632 /// \brief Optionally returns true or false if the preallocated preprocessed 5633 /// entity with index \arg Index came from file \arg FID. 5634 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 5635 FileID FID) { 5636 if (FID.isInvalid()) 5637 return false; 5638 5639 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 5640 ModuleFile &M = *PPInfo.first; 5641 unsigned LocalIndex = PPInfo.second; 5642 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 5643 5644 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin()); 5645 if (Loc.isInvalid()) 5646 return false; 5647 5648 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 5649 return true; 5650 else 5651 return false; 5652 } 5653 5654 namespace { 5655 5656 /// \brief Visitor used to search for information about a header file. 5657 class HeaderFileInfoVisitor { 5658 const FileEntry *FE; 5659 Optional<HeaderFileInfo> HFI; 5660 5661 public: 5662 explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {} 5663 5664 bool operator()(ModuleFile &M) { 5665 HeaderFileInfoLookupTable *Table 5666 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 5667 if (!Table) 5668 return false; 5669 5670 // Look in the on-disk hash table for an entry for this file name. 5671 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE); 5672 if (Pos == Table->end()) 5673 return false; 5674 5675 HFI = *Pos; 5676 return true; 5677 } 5678 5679 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 5680 }; 5681 5682 } // namespace 5683 5684 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 5685 HeaderFileInfoVisitor Visitor(FE); 5686 ModuleMgr.visit(Visitor); 5687 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 5688 return *HFI; 5689 5690 return HeaderFileInfo(); 5691 } 5692 5693 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 5694 using DiagState = DiagnosticsEngine::DiagState; 5695 SmallVector<DiagState *, 32> DiagStates; 5696 5697 for (ModuleFile &F : ModuleMgr) { 5698 unsigned Idx = 0; 5699 auto &Record = F.PragmaDiagMappings; 5700 if (Record.empty()) 5701 continue; 5702 5703 DiagStates.clear(); 5704 5705 auto ReadDiagState = 5706 [&](const DiagState &BasedOn, SourceLocation Loc, 5707 bool IncludeNonPragmaStates) -> DiagnosticsEngine::DiagState * { 5708 unsigned BackrefID = Record[Idx++]; 5709 if (BackrefID != 0) 5710 return DiagStates[BackrefID - 1]; 5711 5712 // A new DiagState was created here. 5713 Diag.DiagStates.push_back(BasedOn); 5714 DiagState *NewState = &Diag.DiagStates.back(); 5715 DiagStates.push_back(NewState); 5716 unsigned Size = Record[Idx++]; 5717 assert(Idx + Size * 2 <= Record.size() && 5718 "Invalid data, not enough diag/map pairs"); 5719 while (Size--) { 5720 unsigned DiagID = Record[Idx++]; 5721 DiagnosticMapping NewMapping = 5722 DiagnosticMapping::deserialize(Record[Idx++]); 5723 if (!NewMapping.isPragma() && !IncludeNonPragmaStates) 5724 continue; 5725 5726 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID); 5727 5728 // If this mapping was specified as a warning but the severity was 5729 // upgraded due to diagnostic settings, simulate the current diagnostic 5730 // settings (and use a warning). 5731 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) { 5732 NewMapping.setSeverity(diag::Severity::Warning); 5733 NewMapping.setUpgradedFromWarning(false); 5734 } 5735 5736 Mapping = NewMapping; 5737 } 5738 return NewState; 5739 }; 5740 5741 // Read the first state. 5742 DiagState *FirstState; 5743 if (F.Kind == MK_ImplicitModule) { 5744 // Implicitly-built modules are reused with different diagnostic 5745 // settings. Use the initial diagnostic state from Diag to simulate this 5746 // compilation's diagnostic settings. 5747 FirstState = Diag.DiagStatesByLoc.FirstDiagState; 5748 DiagStates.push_back(FirstState); 5749 5750 // Skip the initial diagnostic state from the serialized module. 5751 assert(Record[1] == 0 && 5752 "Invalid data, unexpected backref in initial state"); 5753 Idx = 3 + Record[2] * 2; 5754 assert(Idx < Record.size() && 5755 "Invalid data, not enough state change pairs in initial state"); 5756 } else if (F.isModule()) { 5757 // For an explicit module, preserve the flags from the module build 5758 // command line (-w, -Weverything, -Werror, ...) along with any explicit 5759 // -Wblah flags. 5760 unsigned Flags = Record[Idx++]; 5761 DiagState Initial; 5762 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1; 5763 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1; 5764 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1; 5765 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1; 5766 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1; 5767 Initial.ExtBehavior = (diag::Severity)Flags; 5768 FirstState = ReadDiagState(Initial, SourceLocation(), true); 5769 5770 assert(F.OriginalSourceFileID.isValid()); 5771 5772 // Set up the root buffer of the module to start with the initial 5773 // diagnostic state of the module itself, to cover files that contain no 5774 // explicit transitions (for which we did not serialize anything). 5775 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID] 5776 .StateTransitions.push_back({FirstState, 0}); 5777 } else { 5778 // For prefix ASTs, start with whatever the user configured on the 5779 // command line. 5780 Idx++; // Skip flags. 5781 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, 5782 SourceLocation(), false); 5783 } 5784 5785 // Read the state transitions. 5786 unsigned NumLocations = Record[Idx++]; 5787 while (NumLocations--) { 5788 assert(Idx < Record.size() && 5789 "Invalid data, missing pragma diagnostic states"); 5790 SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]); 5791 auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc); 5792 assert(IDAndOffset.first.isValid() && "invalid FileID for transition"); 5793 assert(IDAndOffset.second == 0 && "not a start location for a FileID"); 5794 unsigned Transitions = Record[Idx++]; 5795 5796 // Note that we don't need to set up Parent/ParentOffset here, because 5797 // we won't be changing the diagnostic state within imported FileIDs 5798 // (other than perhaps appending to the main source file, which has no 5799 // parent). 5800 auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first]; 5801 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions); 5802 for (unsigned I = 0; I != Transitions; ++I) { 5803 unsigned Offset = Record[Idx++]; 5804 auto *State = 5805 ReadDiagState(*FirstState, Loc.getLocWithOffset(Offset), false); 5806 F.StateTransitions.push_back({State, Offset}); 5807 } 5808 } 5809 5810 // Read the final state. 5811 assert(Idx < Record.size() && 5812 "Invalid data, missing final pragma diagnostic state"); 5813 SourceLocation CurStateLoc = 5814 ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 5815 auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false); 5816 5817 if (!F.isModule()) { 5818 Diag.DiagStatesByLoc.CurDiagState = CurState; 5819 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc; 5820 5821 // Preserve the property that the imaginary root file describes the 5822 // current state. 5823 FileID NullFile; 5824 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions; 5825 if (T.empty()) 5826 T.push_back({CurState, 0}); 5827 else 5828 T[0].State = CurState; 5829 } 5830 5831 // Don't try to read these mappings again. 5832 Record.clear(); 5833 } 5834 } 5835 5836 /// \brief Get the correct cursor and offset for loading a type. 5837 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 5838 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 5839 assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 5840 ModuleFile *M = I->second; 5841 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]); 5842 } 5843 5844 /// \brief Read and return the type with the given index.. 5845 /// 5846 /// The index is the type ID, shifted and minus the number of predefs. This 5847 /// routine actually reads the record corresponding to the type at the given 5848 /// location. It is a helper routine for GetType, which deals with reading type 5849 /// IDs. 5850 QualType ASTReader::readTypeRecord(unsigned Index) { 5851 assert(ContextObj && "reading type with no AST context"); 5852 ASTContext &Context = *ContextObj; 5853 RecordLocation Loc = TypeCursorForIndex(Index); 5854 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 5855 5856 // Keep track of where we are in the stream, then jump back there 5857 // after reading this type. 5858 SavedStreamPosition SavedPosition(DeclsCursor); 5859 5860 ReadingKindTracker ReadingKind(Read_Type, *this); 5861 5862 // Note that we are loading a type record. 5863 Deserializing AType(this); 5864 5865 unsigned Idx = 0; 5866 DeclsCursor.JumpToBit(Loc.Offset); 5867 RecordData Record; 5868 unsigned Code = DeclsCursor.ReadCode(); 5869 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) { 5870 case TYPE_EXT_QUAL: { 5871 if (Record.size() != 2) { 5872 Error("Incorrect encoding of extended qualifier type"); 5873 return QualType(); 5874 } 5875 QualType Base = readType(*Loc.F, Record, Idx); 5876 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]); 5877 return Context.getQualifiedType(Base, Quals); 5878 } 5879 5880 case TYPE_COMPLEX: { 5881 if (Record.size() != 1) { 5882 Error("Incorrect encoding of complex type"); 5883 return QualType(); 5884 } 5885 QualType ElemType = readType(*Loc.F, Record, Idx); 5886 return Context.getComplexType(ElemType); 5887 } 5888 5889 case TYPE_POINTER: { 5890 if (Record.size() != 1) { 5891 Error("Incorrect encoding of pointer type"); 5892 return QualType(); 5893 } 5894 QualType PointeeType = readType(*Loc.F, Record, Idx); 5895 return Context.getPointerType(PointeeType); 5896 } 5897 5898 case TYPE_DECAYED: { 5899 if (Record.size() != 1) { 5900 Error("Incorrect encoding of decayed type"); 5901 return QualType(); 5902 } 5903 QualType OriginalType = readType(*Loc.F, Record, Idx); 5904 QualType DT = Context.getAdjustedParameterType(OriginalType); 5905 if (!isa<DecayedType>(DT)) 5906 Error("Decayed type does not decay"); 5907 return DT; 5908 } 5909 5910 case TYPE_ADJUSTED: { 5911 if (Record.size() != 2) { 5912 Error("Incorrect encoding of adjusted type"); 5913 return QualType(); 5914 } 5915 QualType OriginalTy = readType(*Loc.F, Record, Idx); 5916 QualType AdjustedTy = readType(*Loc.F, Record, Idx); 5917 return Context.getAdjustedType(OriginalTy, AdjustedTy); 5918 } 5919 5920 case TYPE_BLOCK_POINTER: { 5921 if (Record.size() != 1) { 5922 Error("Incorrect encoding of block pointer type"); 5923 return QualType(); 5924 } 5925 QualType PointeeType = readType(*Loc.F, Record, Idx); 5926 return Context.getBlockPointerType(PointeeType); 5927 } 5928 5929 case TYPE_LVALUE_REFERENCE: { 5930 if (Record.size() != 2) { 5931 Error("Incorrect encoding of lvalue reference type"); 5932 return QualType(); 5933 } 5934 QualType PointeeType = readType(*Loc.F, Record, Idx); 5935 return Context.getLValueReferenceType(PointeeType, Record[1]); 5936 } 5937 5938 case TYPE_RVALUE_REFERENCE: { 5939 if (Record.size() != 1) { 5940 Error("Incorrect encoding of rvalue reference type"); 5941 return QualType(); 5942 } 5943 QualType PointeeType = readType(*Loc.F, Record, Idx); 5944 return Context.getRValueReferenceType(PointeeType); 5945 } 5946 5947 case TYPE_MEMBER_POINTER: { 5948 if (Record.size() != 2) { 5949 Error("Incorrect encoding of member pointer type"); 5950 return QualType(); 5951 } 5952 QualType PointeeType = readType(*Loc.F, Record, Idx); 5953 QualType ClassType = readType(*Loc.F, Record, Idx); 5954 if (PointeeType.isNull() || ClassType.isNull()) 5955 return QualType(); 5956 5957 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr()); 5958 } 5959 5960 case TYPE_CONSTANT_ARRAY: { 5961 QualType ElementType = readType(*Loc.F, Record, Idx); 5962 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 5963 unsigned IndexTypeQuals = Record[2]; 5964 unsigned Idx = 3; 5965 llvm::APInt Size = ReadAPInt(Record, Idx); 5966 return Context.getConstantArrayType(ElementType, Size, 5967 ASM, IndexTypeQuals); 5968 } 5969 5970 case TYPE_INCOMPLETE_ARRAY: { 5971 QualType ElementType = readType(*Loc.F, Record, Idx); 5972 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 5973 unsigned IndexTypeQuals = Record[2]; 5974 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals); 5975 } 5976 5977 case TYPE_VARIABLE_ARRAY: { 5978 QualType ElementType = readType(*Loc.F, Record, Idx); 5979 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 5980 unsigned IndexTypeQuals = Record[2]; 5981 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]); 5982 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]); 5983 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F), 5984 ASM, IndexTypeQuals, 5985 SourceRange(LBLoc, RBLoc)); 5986 } 5987 5988 case TYPE_VECTOR: { 5989 if (Record.size() != 3) { 5990 Error("incorrect encoding of vector type in AST file"); 5991 return QualType(); 5992 } 5993 5994 QualType ElementType = readType(*Loc.F, Record, Idx); 5995 unsigned NumElements = Record[1]; 5996 unsigned VecKind = Record[2]; 5997 return Context.getVectorType(ElementType, NumElements, 5998 (VectorType::VectorKind)VecKind); 5999 } 6000 6001 case TYPE_EXT_VECTOR: { 6002 if (Record.size() != 3) { 6003 Error("incorrect encoding of extended vector type in AST file"); 6004 return QualType(); 6005 } 6006 6007 QualType ElementType = readType(*Loc.F, Record, Idx); 6008 unsigned NumElements = Record[1]; 6009 return Context.getExtVectorType(ElementType, NumElements); 6010 } 6011 6012 case TYPE_FUNCTION_NO_PROTO: { 6013 if (Record.size() != 8) { 6014 Error("incorrect encoding of no-proto function type"); 6015 return QualType(); 6016 } 6017 QualType ResultType = readType(*Loc.F, Record, Idx); 6018 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3], 6019 (CallingConv)Record[4], Record[5], Record[6], 6020 Record[7]); 6021 return Context.getFunctionNoProtoType(ResultType, Info); 6022 } 6023 6024 case TYPE_FUNCTION_PROTO: { 6025 QualType ResultType = readType(*Loc.F, Record, Idx); 6026 6027 FunctionProtoType::ExtProtoInfo EPI; 6028 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1], 6029 /*hasregparm*/ Record[2], 6030 /*regparm*/ Record[3], 6031 static_cast<CallingConv>(Record[4]), 6032 /*produces*/ Record[5], 6033 /*nocallersavedregs*/ Record[6], 6034 /*nocfcheck*/ Record[7]); 6035 6036 unsigned Idx = 8; 6037 6038 EPI.Variadic = Record[Idx++]; 6039 EPI.HasTrailingReturn = Record[Idx++]; 6040 EPI.TypeQuals = Record[Idx++]; 6041 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]); 6042 SmallVector<QualType, 8> ExceptionStorage; 6043 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx); 6044 6045 unsigned NumParams = Record[Idx++]; 6046 SmallVector<QualType, 16> ParamTypes; 6047 for (unsigned I = 0; I != NumParams; ++I) 6048 ParamTypes.push_back(readType(*Loc.F, Record, Idx)); 6049 6050 SmallVector<FunctionProtoType::ExtParameterInfo, 4> ExtParameterInfos; 6051 if (Idx != Record.size()) { 6052 for (unsigned I = 0; I != NumParams; ++I) 6053 ExtParameterInfos.push_back( 6054 FunctionProtoType::ExtParameterInfo 6055 ::getFromOpaqueValue(Record[Idx++])); 6056 EPI.ExtParameterInfos = ExtParameterInfos.data(); 6057 } 6058 6059 assert(Idx == Record.size()); 6060 6061 return Context.getFunctionType(ResultType, ParamTypes, EPI); 6062 } 6063 6064 case TYPE_UNRESOLVED_USING: { 6065 unsigned Idx = 0; 6066 return Context.getTypeDeclType( 6067 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx)); 6068 } 6069 6070 case TYPE_TYPEDEF: { 6071 if (Record.size() != 2) { 6072 Error("incorrect encoding of typedef type"); 6073 return QualType(); 6074 } 6075 unsigned Idx = 0; 6076 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx); 6077 QualType Canonical = readType(*Loc.F, Record, Idx); 6078 if (!Canonical.isNull()) 6079 Canonical = Context.getCanonicalType(Canonical); 6080 return Context.getTypedefType(Decl, Canonical); 6081 } 6082 6083 case TYPE_TYPEOF_EXPR: 6084 return Context.getTypeOfExprType(ReadExpr(*Loc.F)); 6085 6086 case TYPE_TYPEOF: { 6087 if (Record.size() != 1) { 6088 Error("incorrect encoding of typeof(type) in AST file"); 6089 return QualType(); 6090 } 6091 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 6092 return Context.getTypeOfType(UnderlyingType); 6093 } 6094 6095 case TYPE_DECLTYPE: { 6096 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 6097 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType); 6098 } 6099 6100 case TYPE_UNARY_TRANSFORM: { 6101 QualType BaseType = readType(*Loc.F, Record, Idx); 6102 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 6103 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2]; 6104 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind); 6105 } 6106 6107 case TYPE_AUTO: { 6108 QualType Deduced = readType(*Loc.F, Record, Idx); 6109 AutoTypeKeyword Keyword = (AutoTypeKeyword)Record[Idx++]; 6110 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false; 6111 return Context.getAutoType(Deduced, Keyword, IsDependent); 6112 } 6113 6114 case TYPE_DEDUCED_TEMPLATE_SPECIALIZATION: { 6115 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx); 6116 QualType Deduced = readType(*Loc.F, Record, Idx); 6117 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false; 6118 return Context.getDeducedTemplateSpecializationType(Name, Deduced, 6119 IsDependent); 6120 } 6121 6122 case TYPE_RECORD: { 6123 if (Record.size() != 2) { 6124 Error("incorrect encoding of record type"); 6125 return QualType(); 6126 } 6127 unsigned Idx = 0; 6128 bool IsDependent = Record[Idx++]; 6129 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx); 6130 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl()); 6131 QualType T = Context.getRecordType(RD); 6132 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 6133 return T; 6134 } 6135 6136 case TYPE_ENUM: { 6137 if (Record.size() != 2) { 6138 Error("incorrect encoding of enum type"); 6139 return QualType(); 6140 } 6141 unsigned Idx = 0; 6142 bool IsDependent = Record[Idx++]; 6143 QualType T 6144 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx)); 6145 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 6146 return T; 6147 } 6148 6149 case TYPE_ATTRIBUTED: { 6150 if (Record.size() != 3) { 6151 Error("incorrect encoding of attributed type"); 6152 return QualType(); 6153 } 6154 QualType modifiedType = readType(*Loc.F, Record, Idx); 6155 QualType equivalentType = readType(*Loc.F, Record, Idx); 6156 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]); 6157 return Context.getAttributedType(kind, modifiedType, equivalentType); 6158 } 6159 6160 case TYPE_PAREN: { 6161 if (Record.size() != 1) { 6162 Error("incorrect encoding of paren type"); 6163 return QualType(); 6164 } 6165 QualType InnerType = readType(*Loc.F, Record, Idx); 6166 return Context.getParenType(InnerType); 6167 } 6168 6169 case TYPE_PACK_EXPANSION: { 6170 if (Record.size() != 2) { 6171 Error("incorrect encoding of pack expansion type"); 6172 return QualType(); 6173 } 6174 QualType Pattern = readType(*Loc.F, Record, Idx); 6175 if (Pattern.isNull()) 6176 return QualType(); 6177 Optional<unsigned> NumExpansions; 6178 if (Record[1]) 6179 NumExpansions = Record[1] - 1; 6180 return Context.getPackExpansionType(Pattern, NumExpansions); 6181 } 6182 6183 case TYPE_ELABORATED: { 6184 unsigned Idx = 0; 6185 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 6186 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 6187 QualType NamedType = readType(*Loc.F, Record, Idx); 6188 return Context.getElaboratedType(Keyword, NNS, NamedType); 6189 } 6190 6191 case TYPE_OBJC_INTERFACE: { 6192 unsigned Idx = 0; 6193 ObjCInterfaceDecl *ItfD 6194 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx); 6195 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl()); 6196 } 6197 6198 case TYPE_OBJC_TYPE_PARAM: { 6199 unsigned Idx = 0; 6200 ObjCTypeParamDecl *Decl 6201 = ReadDeclAs<ObjCTypeParamDecl>(*Loc.F, Record, Idx); 6202 unsigned NumProtos = Record[Idx++]; 6203 SmallVector<ObjCProtocolDecl*, 4> Protos; 6204 for (unsigned I = 0; I != NumProtos; ++I) 6205 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx)); 6206 return Context.getObjCTypeParamType(Decl, Protos); 6207 } 6208 6209 case TYPE_OBJC_OBJECT: { 6210 unsigned Idx = 0; 6211 QualType Base = readType(*Loc.F, Record, Idx); 6212 unsigned NumTypeArgs = Record[Idx++]; 6213 SmallVector<QualType, 4> TypeArgs; 6214 for (unsigned I = 0; I != NumTypeArgs; ++I) 6215 TypeArgs.push_back(readType(*Loc.F, Record, Idx)); 6216 unsigned NumProtos = Record[Idx++]; 6217 SmallVector<ObjCProtocolDecl*, 4> Protos; 6218 for (unsigned I = 0; I != NumProtos; ++I) 6219 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx)); 6220 bool IsKindOf = Record[Idx++]; 6221 return Context.getObjCObjectType(Base, TypeArgs, Protos, IsKindOf); 6222 } 6223 6224 case TYPE_OBJC_OBJECT_POINTER: { 6225 unsigned Idx = 0; 6226 QualType Pointee = readType(*Loc.F, Record, Idx); 6227 return Context.getObjCObjectPointerType(Pointee); 6228 } 6229 6230 case TYPE_SUBST_TEMPLATE_TYPE_PARM: { 6231 unsigned Idx = 0; 6232 QualType Parm = readType(*Loc.F, Record, Idx); 6233 QualType Replacement = readType(*Loc.F, Record, Idx); 6234 return Context.getSubstTemplateTypeParmType( 6235 cast<TemplateTypeParmType>(Parm), 6236 Context.getCanonicalType(Replacement)); 6237 } 6238 6239 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: { 6240 unsigned Idx = 0; 6241 QualType Parm = readType(*Loc.F, Record, Idx); 6242 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx); 6243 return Context.getSubstTemplateTypeParmPackType( 6244 cast<TemplateTypeParmType>(Parm), 6245 ArgPack); 6246 } 6247 6248 case TYPE_INJECTED_CLASS_NAME: { 6249 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx); 6250 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable 6251 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable 6252 // for AST reading, too much interdependencies. 6253 const Type *T = nullptr; 6254 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) { 6255 if (const Type *Existing = DI->getTypeForDecl()) { 6256 T = Existing; 6257 break; 6258 } 6259 } 6260 if (!T) { 6261 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST); 6262 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) 6263 DI->setTypeForDecl(T); 6264 } 6265 return QualType(T, 0); 6266 } 6267 6268 case TYPE_TEMPLATE_TYPE_PARM: { 6269 unsigned Idx = 0; 6270 unsigned Depth = Record[Idx++]; 6271 unsigned Index = Record[Idx++]; 6272 bool Pack = Record[Idx++]; 6273 TemplateTypeParmDecl *D 6274 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx); 6275 return Context.getTemplateTypeParmType(Depth, Index, Pack, D); 6276 } 6277 6278 case TYPE_DEPENDENT_NAME: { 6279 unsigned Idx = 0; 6280 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 6281 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 6282 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx); 6283 QualType Canon = readType(*Loc.F, Record, Idx); 6284 if (!Canon.isNull()) 6285 Canon = Context.getCanonicalType(Canon); 6286 return Context.getDependentNameType(Keyword, NNS, Name, Canon); 6287 } 6288 6289 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: { 6290 unsigned Idx = 0; 6291 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 6292 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 6293 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx); 6294 unsigned NumArgs = Record[Idx++]; 6295 SmallVector<TemplateArgument, 8> Args; 6296 Args.reserve(NumArgs); 6297 while (NumArgs--) 6298 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx)); 6299 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name, 6300 Args); 6301 } 6302 6303 case TYPE_DEPENDENT_SIZED_ARRAY: { 6304 unsigned Idx = 0; 6305 6306 // ArrayType 6307 QualType ElementType = readType(*Loc.F, Record, Idx); 6308 ArrayType::ArraySizeModifier ASM 6309 = (ArrayType::ArraySizeModifier)Record[Idx++]; 6310 unsigned IndexTypeQuals = Record[Idx++]; 6311 6312 // DependentSizedArrayType 6313 Expr *NumElts = ReadExpr(*Loc.F); 6314 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx); 6315 6316 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM, 6317 IndexTypeQuals, Brackets); 6318 } 6319 6320 case TYPE_TEMPLATE_SPECIALIZATION: { 6321 unsigned Idx = 0; 6322 bool IsDependent = Record[Idx++]; 6323 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx); 6324 SmallVector<TemplateArgument, 8> Args; 6325 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx); 6326 QualType Underlying = readType(*Loc.F, Record, Idx); 6327 QualType T; 6328 if (Underlying.isNull()) 6329 T = Context.getCanonicalTemplateSpecializationType(Name, Args); 6330 else 6331 T = Context.getTemplateSpecializationType(Name, Args, Underlying); 6332 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 6333 return T; 6334 } 6335 6336 case TYPE_ATOMIC: { 6337 if (Record.size() != 1) { 6338 Error("Incorrect encoding of atomic type"); 6339 return QualType(); 6340 } 6341 QualType ValueType = readType(*Loc.F, Record, Idx); 6342 return Context.getAtomicType(ValueType); 6343 } 6344 6345 case TYPE_PIPE: { 6346 if (Record.size() != 2) { 6347 Error("Incorrect encoding of pipe type"); 6348 return QualType(); 6349 } 6350 6351 // Reading the pipe element type. 6352 QualType ElementType = readType(*Loc.F, Record, Idx); 6353 unsigned ReadOnly = Record[1]; 6354 return Context.getPipeType(ElementType, ReadOnly); 6355 } 6356 6357 case TYPE_DEPENDENT_SIZED_EXT_VECTOR: { 6358 unsigned Idx = 0; 6359 6360 // DependentSizedExtVectorType 6361 QualType ElementType = readType(*Loc.F, Record, Idx); 6362 Expr *SizeExpr = ReadExpr(*Loc.F); 6363 SourceLocation AttrLoc = ReadSourceLocation(*Loc.F, Record, Idx); 6364 6365 return Context.getDependentSizedExtVectorType(ElementType, SizeExpr, 6366 AttrLoc); 6367 } 6368 6369 case TYPE_DEPENDENT_ADDRESS_SPACE: { 6370 unsigned Idx = 0; 6371 6372 // DependentAddressSpaceType 6373 QualType PointeeType = readType(*Loc.F, Record, Idx); 6374 Expr *AddrSpaceExpr = ReadExpr(*Loc.F); 6375 SourceLocation AttrLoc = ReadSourceLocation(*Loc.F, Record, Idx); 6376 6377 return Context.getDependentAddressSpaceType(PointeeType, AddrSpaceExpr, 6378 AttrLoc); 6379 } 6380 } 6381 llvm_unreachable("Invalid TypeCode!"); 6382 } 6383 6384 void ASTReader::readExceptionSpec(ModuleFile &ModuleFile, 6385 SmallVectorImpl<QualType> &Exceptions, 6386 FunctionProtoType::ExceptionSpecInfo &ESI, 6387 const RecordData &Record, unsigned &Idx) { 6388 ExceptionSpecificationType EST = 6389 static_cast<ExceptionSpecificationType>(Record[Idx++]); 6390 ESI.Type = EST; 6391 if (EST == EST_Dynamic) { 6392 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I) 6393 Exceptions.push_back(readType(ModuleFile, Record, Idx)); 6394 ESI.Exceptions = Exceptions; 6395 } else if (EST == EST_ComputedNoexcept) { 6396 ESI.NoexceptExpr = ReadExpr(ModuleFile); 6397 } else if (EST == EST_Uninstantiated) { 6398 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx); 6399 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx); 6400 } else if (EST == EST_Unevaluated) { 6401 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx); 6402 } 6403 } 6404 6405 namespace clang { 6406 6407 class TypeLocReader : public TypeLocVisitor<TypeLocReader> { 6408 ModuleFile *F; 6409 ASTReader *Reader; 6410 const ASTReader::RecordData &Record; 6411 unsigned &Idx; 6412 6413 SourceLocation ReadSourceLocation() { 6414 return Reader->ReadSourceLocation(*F, Record, Idx); 6415 } 6416 6417 TypeSourceInfo *GetTypeSourceInfo() { 6418 return Reader->GetTypeSourceInfo(*F, Record, Idx); 6419 } 6420 6421 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() { 6422 return Reader->ReadNestedNameSpecifierLoc(*F, Record, Idx); 6423 } 6424 6425 public: 6426 TypeLocReader(ModuleFile &F, ASTReader &Reader, 6427 const ASTReader::RecordData &Record, unsigned &Idx) 6428 : F(&F), Reader(&Reader), Record(Record), Idx(Idx) {} 6429 6430 // We want compile-time assurance that we've enumerated all of 6431 // these, so unfortunately we have to declare them first, then 6432 // define them out-of-line. 6433 #define ABSTRACT_TYPELOC(CLASS, PARENT) 6434 #define TYPELOC(CLASS, PARENT) \ 6435 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 6436 #include "clang/AST/TypeLocNodes.def" 6437 6438 void VisitFunctionTypeLoc(FunctionTypeLoc); 6439 void VisitArrayTypeLoc(ArrayTypeLoc); 6440 }; 6441 6442 } // namespace clang 6443 6444 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 6445 // nothing to do 6446 } 6447 6448 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 6449 TL.setBuiltinLoc(ReadSourceLocation()); 6450 if (TL.needsExtraLocalData()) { 6451 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++])); 6452 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++])); 6453 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++])); 6454 TL.setModeAttr(Record[Idx++]); 6455 } 6456 } 6457 6458 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 6459 TL.setNameLoc(ReadSourceLocation()); 6460 } 6461 6462 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 6463 TL.setStarLoc(ReadSourceLocation()); 6464 } 6465 6466 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 6467 // nothing to do 6468 } 6469 6470 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 6471 // nothing to do 6472 } 6473 6474 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 6475 TL.setCaretLoc(ReadSourceLocation()); 6476 } 6477 6478 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 6479 TL.setAmpLoc(ReadSourceLocation()); 6480 } 6481 6482 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 6483 TL.setAmpAmpLoc(ReadSourceLocation()); 6484 } 6485 6486 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 6487 TL.setStarLoc(ReadSourceLocation()); 6488 TL.setClassTInfo(GetTypeSourceInfo()); 6489 } 6490 6491 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 6492 TL.setLBracketLoc(ReadSourceLocation()); 6493 TL.setRBracketLoc(ReadSourceLocation()); 6494 if (Record[Idx++]) 6495 TL.setSizeExpr(Reader->ReadExpr(*F)); 6496 else 6497 TL.setSizeExpr(nullptr); 6498 } 6499 6500 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 6501 VisitArrayTypeLoc(TL); 6502 } 6503 6504 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 6505 VisitArrayTypeLoc(TL); 6506 } 6507 6508 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 6509 VisitArrayTypeLoc(TL); 6510 } 6511 6512 void TypeLocReader::VisitDependentSizedArrayTypeLoc( 6513 DependentSizedArrayTypeLoc TL) { 6514 VisitArrayTypeLoc(TL); 6515 } 6516 6517 void TypeLocReader::VisitDependentAddressSpaceTypeLoc( 6518 DependentAddressSpaceTypeLoc TL) { 6519 6520 TL.setAttrNameLoc(ReadSourceLocation()); 6521 SourceRange range; 6522 range.setBegin(ReadSourceLocation()); 6523 range.setEnd(ReadSourceLocation()); 6524 TL.setAttrOperandParensRange(range); 6525 TL.setAttrExprOperand(Reader->ReadExpr(*F)); 6526 } 6527 6528 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 6529 DependentSizedExtVectorTypeLoc TL) { 6530 TL.setNameLoc(ReadSourceLocation()); 6531 } 6532 6533 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 6534 TL.setNameLoc(ReadSourceLocation()); 6535 } 6536 6537 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 6538 TL.setNameLoc(ReadSourceLocation()); 6539 } 6540 6541 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 6542 TL.setLocalRangeBegin(ReadSourceLocation()); 6543 TL.setLParenLoc(ReadSourceLocation()); 6544 TL.setRParenLoc(ReadSourceLocation()); 6545 TL.setExceptionSpecRange(SourceRange(Reader->ReadSourceLocation(*F, Record, Idx), 6546 Reader->ReadSourceLocation(*F, Record, Idx))); 6547 TL.setLocalRangeEnd(ReadSourceLocation()); 6548 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) { 6549 TL.setParam(i, Reader->ReadDeclAs<ParmVarDecl>(*F, Record, Idx)); 6550 } 6551 } 6552 6553 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 6554 VisitFunctionTypeLoc(TL); 6555 } 6556 6557 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 6558 VisitFunctionTypeLoc(TL); 6559 } 6560 6561 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 6562 TL.setNameLoc(ReadSourceLocation()); 6563 } 6564 6565 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 6566 TL.setNameLoc(ReadSourceLocation()); 6567 } 6568 6569 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 6570 TL.setTypeofLoc(ReadSourceLocation()); 6571 TL.setLParenLoc(ReadSourceLocation()); 6572 TL.setRParenLoc(ReadSourceLocation()); 6573 } 6574 6575 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 6576 TL.setTypeofLoc(ReadSourceLocation()); 6577 TL.setLParenLoc(ReadSourceLocation()); 6578 TL.setRParenLoc(ReadSourceLocation()); 6579 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6580 } 6581 6582 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 6583 TL.setNameLoc(ReadSourceLocation()); 6584 } 6585 6586 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 6587 TL.setKWLoc(ReadSourceLocation()); 6588 TL.setLParenLoc(ReadSourceLocation()); 6589 TL.setRParenLoc(ReadSourceLocation()); 6590 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6591 } 6592 6593 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 6594 TL.setNameLoc(ReadSourceLocation()); 6595 } 6596 6597 void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc( 6598 DeducedTemplateSpecializationTypeLoc TL) { 6599 TL.setTemplateNameLoc(ReadSourceLocation()); 6600 } 6601 6602 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 6603 TL.setNameLoc(ReadSourceLocation()); 6604 } 6605 6606 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 6607 TL.setNameLoc(ReadSourceLocation()); 6608 } 6609 6610 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 6611 TL.setAttrNameLoc(ReadSourceLocation()); 6612 if (TL.hasAttrOperand()) { 6613 SourceRange range; 6614 range.setBegin(ReadSourceLocation()); 6615 range.setEnd(ReadSourceLocation()); 6616 TL.setAttrOperandParensRange(range); 6617 } 6618 if (TL.hasAttrExprOperand()) { 6619 if (Record[Idx++]) 6620 TL.setAttrExprOperand(Reader->ReadExpr(*F)); 6621 else 6622 TL.setAttrExprOperand(nullptr); 6623 } else if (TL.hasAttrEnumOperand()) 6624 TL.setAttrEnumOperandLoc(ReadSourceLocation()); 6625 } 6626 6627 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 6628 TL.setNameLoc(ReadSourceLocation()); 6629 } 6630 6631 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 6632 SubstTemplateTypeParmTypeLoc TL) { 6633 TL.setNameLoc(ReadSourceLocation()); 6634 } 6635 6636 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 6637 SubstTemplateTypeParmPackTypeLoc TL) { 6638 TL.setNameLoc(ReadSourceLocation()); 6639 } 6640 6641 void TypeLocReader::VisitTemplateSpecializationTypeLoc( 6642 TemplateSpecializationTypeLoc TL) { 6643 TL.setTemplateKeywordLoc(ReadSourceLocation()); 6644 TL.setTemplateNameLoc(ReadSourceLocation()); 6645 TL.setLAngleLoc(ReadSourceLocation()); 6646 TL.setRAngleLoc(ReadSourceLocation()); 6647 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6648 TL.setArgLocInfo( 6649 i, 6650 Reader->GetTemplateArgumentLocInfo( 6651 *F, TL.getTypePtr()->getArg(i).getKind(), Record, Idx)); 6652 } 6653 6654 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 6655 TL.setLParenLoc(ReadSourceLocation()); 6656 TL.setRParenLoc(ReadSourceLocation()); 6657 } 6658 6659 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 6660 TL.setElaboratedKeywordLoc(ReadSourceLocation()); 6661 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6662 } 6663 6664 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 6665 TL.setNameLoc(ReadSourceLocation()); 6666 } 6667 6668 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 6669 TL.setElaboratedKeywordLoc(ReadSourceLocation()); 6670 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6671 TL.setNameLoc(ReadSourceLocation()); 6672 } 6673 6674 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 6675 DependentTemplateSpecializationTypeLoc TL) { 6676 TL.setElaboratedKeywordLoc(ReadSourceLocation()); 6677 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6678 TL.setTemplateKeywordLoc(ReadSourceLocation()); 6679 TL.setTemplateNameLoc(ReadSourceLocation()); 6680 TL.setLAngleLoc(ReadSourceLocation()); 6681 TL.setRAngleLoc(ReadSourceLocation()); 6682 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 6683 TL.setArgLocInfo( 6684 I, 6685 Reader->GetTemplateArgumentLocInfo( 6686 *F, TL.getTypePtr()->getArg(I).getKind(), Record, Idx)); 6687 } 6688 6689 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 6690 TL.setEllipsisLoc(ReadSourceLocation()); 6691 } 6692 6693 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 6694 TL.setNameLoc(ReadSourceLocation()); 6695 } 6696 6697 void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) { 6698 if (TL.getNumProtocols()) { 6699 TL.setProtocolLAngleLoc(ReadSourceLocation()); 6700 TL.setProtocolRAngleLoc(ReadSourceLocation()); 6701 } 6702 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6703 TL.setProtocolLoc(i, ReadSourceLocation()); 6704 } 6705 6706 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 6707 TL.setHasBaseTypeAsWritten(Record[Idx++]); 6708 TL.setTypeArgsLAngleLoc(ReadSourceLocation()); 6709 TL.setTypeArgsRAngleLoc(ReadSourceLocation()); 6710 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i) 6711 TL.setTypeArgTInfo(i, GetTypeSourceInfo()); 6712 TL.setProtocolLAngleLoc(ReadSourceLocation()); 6713 TL.setProtocolRAngleLoc(ReadSourceLocation()); 6714 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6715 TL.setProtocolLoc(i, ReadSourceLocation()); 6716 } 6717 6718 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 6719 TL.setStarLoc(ReadSourceLocation()); 6720 } 6721 6722 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 6723 TL.setKWLoc(ReadSourceLocation()); 6724 TL.setLParenLoc(ReadSourceLocation()); 6725 TL.setRParenLoc(ReadSourceLocation()); 6726 } 6727 6728 void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) { 6729 TL.setKWLoc(ReadSourceLocation()); 6730 } 6731 6732 TypeSourceInfo * 6733 ASTReader::GetTypeSourceInfo(ModuleFile &F, const ASTReader::RecordData &Record, 6734 unsigned &Idx) { 6735 QualType InfoTy = readType(F, Record, Idx); 6736 if (InfoTy.isNull()) 6737 return nullptr; 6738 6739 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 6740 TypeLocReader TLR(F, *this, Record, Idx); 6741 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc()) 6742 TLR.Visit(TL); 6743 return TInfo; 6744 } 6745 6746 QualType ASTReader::GetType(TypeID ID) { 6747 assert(ContextObj && "reading type with no AST context"); 6748 ASTContext &Context = *ContextObj; 6749 6750 unsigned FastQuals = ID & Qualifiers::FastMask; 6751 unsigned Index = ID >> Qualifiers::FastWidth; 6752 6753 if (Index < NUM_PREDEF_TYPE_IDS) { 6754 QualType T; 6755 switch ((PredefinedTypeIDs)Index) { 6756 case PREDEF_TYPE_NULL_ID: 6757 return QualType(); 6758 case PREDEF_TYPE_VOID_ID: 6759 T = Context.VoidTy; 6760 break; 6761 case PREDEF_TYPE_BOOL_ID: 6762 T = Context.BoolTy; 6763 break; 6764 case PREDEF_TYPE_CHAR_U_ID: 6765 case PREDEF_TYPE_CHAR_S_ID: 6766 // FIXME: Check that the signedness of CharTy is correct! 6767 T = Context.CharTy; 6768 break; 6769 case PREDEF_TYPE_UCHAR_ID: 6770 T = Context.UnsignedCharTy; 6771 break; 6772 case PREDEF_TYPE_USHORT_ID: 6773 T = Context.UnsignedShortTy; 6774 break; 6775 case PREDEF_TYPE_UINT_ID: 6776 T = Context.UnsignedIntTy; 6777 break; 6778 case PREDEF_TYPE_ULONG_ID: 6779 T = Context.UnsignedLongTy; 6780 break; 6781 case PREDEF_TYPE_ULONGLONG_ID: 6782 T = Context.UnsignedLongLongTy; 6783 break; 6784 case PREDEF_TYPE_UINT128_ID: 6785 T = Context.UnsignedInt128Ty; 6786 break; 6787 case PREDEF_TYPE_SCHAR_ID: 6788 T = Context.SignedCharTy; 6789 break; 6790 case PREDEF_TYPE_WCHAR_ID: 6791 T = Context.WCharTy; 6792 break; 6793 case PREDEF_TYPE_SHORT_ID: 6794 T = Context.ShortTy; 6795 break; 6796 case PREDEF_TYPE_INT_ID: 6797 T = Context.IntTy; 6798 break; 6799 case PREDEF_TYPE_LONG_ID: 6800 T = Context.LongTy; 6801 break; 6802 case PREDEF_TYPE_LONGLONG_ID: 6803 T = Context.LongLongTy; 6804 break; 6805 case PREDEF_TYPE_INT128_ID: 6806 T = Context.Int128Ty; 6807 break; 6808 case PREDEF_TYPE_HALF_ID: 6809 T = Context.HalfTy; 6810 break; 6811 case PREDEF_TYPE_FLOAT_ID: 6812 T = Context.FloatTy; 6813 break; 6814 case PREDEF_TYPE_DOUBLE_ID: 6815 T = Context.DoubleTy; 6816 break; 6817 case PREDEF_TYPE_LONGDOUBLE_ID: 6818 T = Context.LongDoubleTy; 6819 break; 6820 case PREDEF_TYPE_FLOAT16_ID: 6821 T = Context.Float16Ty; 6822 break; 6823 case PREDEF_TYPE_FLOAT128_ID: 6824 T = Context.Float128Ty; 6825 break; 6826 case PREDEF_TYPE_OVERLOAD_ID: 6827 T = Context.OverloadTy; 6828 break; 6829 case PREDEF_TYPE_BOUND_MEMBER: 6830 T = Context.BoundMemberTy; 6831 break; 6832 case PREDEF_TYPE_PSEUDO_OBJECT: 6833 T = Context.PseudoObjectTy; 6834 break; 6835 case PREDEF_TYPE_DEPENDENT_ID: 6836 T = Context.DependentTy; 6837 break; 6838 case PREDEF_TYPE_UNKNOWN_ANY: 6839 T = Context.UnknownAnyTy; 6840 break; 6841 case PREDEF_TYPE_NULLPTR_ID: 6842 T = Context.NullPtrTy; 6843 break; 6844 case PREDEF_TYPE_CHAR16_ID: 6845 T = Context.Char16Ty; 6846 break; 6847 case PREDEF_TYPE_CHAR32_ID: 6848 T = Context.Char32Ty; 6849 break; 6850 case PREDEF_TYPE_OBJC_ID: 6851 T = Context.ObjCBuiltinIdTy; 6852 break; 6853 case PREDEF_TYPE_OBJC_CLASS: 6854 T = Context.ObjCBuiltinClassTy; 6855 break; 6856 case PREDEF_TYPE_OBJC_SEL: 6857 T = Context.ObjCBuiltinSelTy; 6858 break; 6859 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 6860 case PREDEF_TYPE_##Id##_ID: \ 6861 T = Context.SingletonId; \ 6862 break; 6863 #include "clang/Basic/OpenCLImageTypes.def" 6864 case PREDEF_TYPE_SAMPLER_ID: 6865 T = Context.OCLSamplerTy; 6866 break; 6867 case PREDEF_TYPE_EVENT_ID: 6868 T = Context.OCLEventTy; 6869 break; 6870 case PREDEF_TYPE_CLK_EVENT_ID: 6871 T = Context.OCLClkEventTy; 6872 break; 6873 case PREDEF_TYPE_QUEUE_ID: 6874 T = Context.OCLQueueTy; 6875 break; 6876 case PREDEF_TYPE_RESERVE_ID_ID: 6877 T = Context.OCLReserveIDTy; 6878 break; 6879 case PREDEF_TYPE_AUTO_DEDUCT: 6880 T = Context.getAutoDeductType(); 6881 break; 6882 case PREDEF_TYPE_AUTO_RREF_DEDUCT: 6883 T = Context.getAutoRRefDeductType(); 6884 break; 6885 case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 6886 T = Context.ARCUnbridgedCastTy; 6887 break; 6888 case PREDEF_TYPE_BUILTIN_FN: 6889 T = Context.BuiltinFnTy; 6890 break; 6891 case PREDEF_TYPE_OMP_ARRAY_SECTION: 6892 T = Context.OMPArraySectionTy; 6893 break; 6894 } 6895 6896 assert(!T.isNull() && "Unknown predefined type"); 6897 return T.withFastQualifiers(FastQuals); 6898 } 6899 6900 Index -= NUM_PREDEF_TYPE_IDS; 6901 assert(Index < TypesLoaded.size() && "Type index out-of-range"); 6902 if (TypesLoaded[Index].isNull()) { 6903 TypesLoaded[Index] = readTypeRecord(Index); 6904 if (TypesLoaded[Index].isNull()) 6905 return QualType(); 6906 6907 TypesLoaded[Index]->setFromAST(); 6908 if (DeserializationListener) 6909 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 6910 TypesLoaded[Index]); 6911 } 6912 6913 return TypesLoaded[Index].withFastQualifiers(FastQuals); 6914 } 6915 6916 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 6917 return GetType(getGlobalTypeID(F, LocalID)); 6918 } 6919 6920 serialization::TypeID 6921 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 6922 unsigned FastQuals = LocalID & Qualifiers::FastMask; 6923 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 6924 6925 if (LocalIndex < NUM_PREDEF_TYPE_IDS) 6926 return LocalID; 6927 6928 if (!F.ModuleOffsetMap.empty()) 6929 ReadModuleOffsetMap(F); 6930 6931 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6932 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 6933 assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 6934 6935 unsigned GlobalIndex = LocalIndex + I->second; 6936 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 6937 } 6938 6939 TemplateArgumentLocInfo 6940 ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F, 6941 TemplateArgument::ArgKind Kind, 6942 const RecordData &Record, 6943 unsigned &Index) { 6944 switch (Kind) { 6945 case TemplateArgument::Expression: 6946 return ReadExpr(F); 6947 case TemplateArgument::Type: 6948 return GetTypeSourceInfo(F, Record, Index); 6949 case TemplateArgument::Template: { 6950 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 6951 Index); 6952 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 6953 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 6954 SourceLocation()); 6955 } 6956 case TemplateArgument::TemplateExpansion: { 6957 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 6958 Index); 6959 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 6960 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index); 6961 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 6962 EllipsisLoc); 6963 } 6964 case TemplateArgument::Null: 6965 case TemplateArgument::Integral: 6966 case TemplateArgument::Declaration: 6967 case TemplateArgument::NullPtr: 6968 case TemplateArgument::Pack: 6969 // FIXME: Is this right? 6970 return TemplateArgumentLocInfo(); 6971 } 6972 llvm_unreachable("unexpected template argument loc"); 6973 } 6974 6975 TemplateArgumentLoc 6976 ASTReader::ReadTemplateArgumentLoc(ModuleFile &F, 6977 const RecordData &Record, unsigned &Index) { 6978 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index); 6979 6980 if (Arg.getKind() == TemplateArgument::Expression) { 6981 if (Record[Index++]) // bool InfoHasSameExpr. 6982 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 6983 } 6984 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(), 6985 Record, Index)); 6986 } 6987 6988 const ASTTemplateArgumentListInfo* 6989 ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F, 6990 const RecordData &Record, 6991 unsigned &Index) { 6992 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index); 6993 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index); 6994 unsigned NumArgsAsWritten = Record[Index++]; 6995 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 6996 for (unsigned i = 0; i != NumArgsAsWritten; ++i) 6997 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index)); 6998 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 6999 } 7000 7001 Decl *ASTReader::GetExternalDecl(uint32_t ID) { 7002 return GetDecl(ID); 7003 } 7004 7005 void ASTReader::CompleteRedeclChain(const Decl *D) { 7006 if (NumCurrentElementsDeserializing) { 7007 // We arrange to not care about the complete redeclaration chain while we're 7008 // deserializing. Just remember that the AST has marked this one as complete 7009 // but that it's not actually complete yet, so we know we still need to 7010 // complete it later. 7011 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D)); 7012 return; 7013 } 7014 7015 const DeclContext *DC = D->getDeclContext()->getRedeclContext(); 7016 7017 // If this is a named declaration, complete it by looking it up 7018 // within its context. 7019 // 7020 // FIXME: Merging a function definition should merge 7021 // all mergeable entities within it. 7022 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) || 7023 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) { 7024 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) { 7025 if (!getContext().getLangOpts().CPlusPlus && 7026 isa<TranslationUnitDecl>(DC)) { 7027 // Outside of C++, we don't have a lookup table for the TU, so update 7028 // the identifier instead. (For C++ modules, we don't store decls 7029 // in the serialized identifier table, so we do the lookup in the TU.) 7030 auto *II = Name.getAsIdentifierInfo(); 7031 assert(II && "non-identifier name in C?"); 7032 if (II->isOutOfDate()) 7033 updateOutOfDateIdentifier(*II); 7034 } else 7035 DC->lookup(Name); 7036 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) { 7037 // Find all declarations of this kind from the relevant context. 7038 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) { 7039 auto *DC = cast<DeclContext>(DCDecl); 7040 SmallVector<Decl*, 8> Decls; 7041 FindExternalLexicalDecls( 7042 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls); 7043 } 7044 } 7045 } 7046 7047 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) 7048 CTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7049 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) 7050 VTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7051 if (auto *FD = dyn_cast<FunctionDecl>(D)) { 7052 if (auto *Template = FD->getPrimaryTemplate()) 7053 Template->LoadLazySpecializations(); 7054 } 7055 } 7056 7057 CXXCtorInitializer ** 7058 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) { 7059 RecordLocation Loc = getLocalBitOffset(Offset); 7060 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7061 SavedStreamPosition SavedPosition(Cursor); 7062 Cursor.JumpToBit(Loc.Offset); 7063 ReadingKindTracker ReadingKind(Read_Decl, *this); 7064 7065 RecordData Record; 7066 unsigned Code = Cursor.ReadCode(); 7067 unsigned RecCode = Cursor.readRecord(Code, Record); 7068 if (RecCode != DECL_CXX_CTOR_INITIALIZERS) { 7069 Error("malformed AST file: missing C++ ctor initializers"); 7070 return nullptr; 7071 } 7072 7073 unsigned Idx = 0; 7074 return ReadCXXCtorInitializers(*Loc.F, Record, Idx); 7075 } 7076 7077 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 7078 assert(ContextObj && "reading base specifiers with no AST context"); 7079 ASTContext &Context = *ContextObj; 7080 7081 RecordLocation Loc = getLocalBitOffset(Offset); 7082 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7083 SavedStreamPosition SavedPosition(Cursor); 7084 Cursor.JumpToBit(Loc.Offset); 7085 ReadingKindTracker ReadingKind(Read_Decl, *this); 7086 RecordData Record; 7087 unsigned Code = Cursor.ReadCode(); 7088 unsigned RecCode = Cursor.readRecord(Code, Record); 7089 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 7090 Error("malformed AST file: missing C++ base specifiers"); 7091 return nullptr; 7092 } 7093 7094 unsigned Idx = 0; 7095 unsigned NumBases = Record[Idx++]; 7096 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 7097 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 7098 for (unsigned I = 0; I != NumBases; ++I) 7099 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx); 7100 return Bases; 7101 } 7102 7103 serialization::DeclID 7104 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 7105 if (LocalID < NUM_PREDEF_DECL_IDS) 7106 return LocalID; 7107 7108 if (!F.ModuleOffsetMap.empty()) 7109 ReadModuleOffsetMap(F); 7110 7111 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7112 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 7113 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 7114 7115 return LocalID + I->second; 7116 } 7117 7118 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 7119 ModuleFile &M) const { 7120 // Predefined decls aren't from any module. 7121 if (ID < NUM_PREDEF_DECL_IDS) 7122 return false; 7123 7124 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID && 7125 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls; 7126 } 7127 7128 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 7129 if (!D->isFromASTFile()) 7130 return nullptr; 7131 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 7132 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7133 return I->second; 7134 } 7135 7136 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 7137 if (ID < NUM_PREDEF_DECL_IDS) 7138 return SourceLocation(); 7139 7140 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7141 7142 if (Index > DeclsLoaded.size()) { 7143 Error("declaration ID out-of-range for AST file"); 7144 return SourceLocation(); 7145 } 7146 7147 if (Decl *D = DeclsLoaded[Index]) 7148 return D->getLocation(); 7149 7150 SourceLocation Loc; 7151 DeclCursorForID(ID, Loc); 7152 return Loc; 7153 } 7154 7155 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) { 7156 switch (ID) { 7157 case PREDEF_DECL_NULL_ID: 7158 return nullptr; 7159 7160 case PREDEF_DECL_TRANSLATION_UNIT_ID: 7161 return Context.getTranslationUnitDecl(); 7162 7163 case PREDEF_DECL_OBJC_ID_ID: 7164 return Context.getObjCIdDecl(); 7165 7166 case PREDEF_DECL_OBJC_SEL_ID: 7167 return Context.getObjCSelDecl(); 7168 7169 case PREDEF_DECL_OBJC_CLASS_ID: 7170 return Context.getObjCClassDecl(); 7171 7172 case PREDEF_DECL_OBJC_PROTOCOL_ID: 7173 return Context.getObjCProtocolDecl(); 7174 7175 case PREDEF_DECL_INT_128_ID: 7176 return Context.getInt128Decl(); 7177 7178 case PREDEF_DECL_UNSIGNED_INT_128_ID: 7179 return Context.getUInt128Decl(); 7180 7181 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 7182 return Context.getObjCInstanceTypeDecl(); 7183 7184 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 7185 return Context.getBuiltinVaListDecl(); 7186 7187 case PREDEF_DECL_VA_LIST_TAG: 7188 return Context.getVaListTagDecl(); 7189 7190 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID: 7191 return Context.getBuiltinMSVaListDecl(); 7192 7193 case PREDEF_DECL_EXTERN_C_CONTEXT_ID: 7194 return Context.getExternCContextDecl(); 7195 7196 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID: 7197 return Context.getMakeIntegerSeqDecl(); 7198 7199 case PREDEF_DECL_CF_CONSTANT_STRING_ID: 7200 return Context.getCFConstantStringDecl(); 7201 7202 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID: 7203 return Context.getCFConstantStringTagDecl(); 7204 7205 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID: 7206 return Context.getTypePackElementDecl(); 7207 } 7208 llvm_unreachable("PredefinedDeclIDs unknown enum value"); 7209 } 7210 7211 Decl *ASTReader::GetExistingDecl(DeclID ID) { 7212 assert(ContextObj && "reading decl with no AST context"); 7213 if (ID < NUM_PREDEF_DECL_IDS) { 7214 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID); 7215 if (D) { 7216 // Track that we have merged the declaration with ID \p ID into the 7217 // pre-existing predefined declaration \p D. 7218 auto &Merged = KeyDecls[D->getCanonicalDecl()]; 7219 if (Merged.empty()) 7220 Merged.push_back(ID); 7221 } 7222 return D; 7223 } 7224 7225 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7226 7227 if (Index >= DeclsLoaded.size()) { 7228 assert(0 && "declaration ID out-of-range for AST file"); 7229 Error("declaration ID out-of-range for AST file"); 7230 return nullptr; 7231 } 7232 7233 return DeclsLoaded[Index]; 7234 } 7235 7236 Decl *ASTReader::GetDecl(DeclID ID) { 7237 if (ID < NUM_PREDEF_DECL_IDS) 7238 return GetExistingDecl(ID); 7239 7240 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7241 7242 if (Index >= DeclsLoaded.size()) { 7243 assert(0 && "declaration ID out-of-range for AST file"); 7244 Error("declaration ID out-of-range for AST file"); 7245 return nullptr; 7246 } 7247 7248 if (!DeclsLoaded[Index]) { 7249 ReadDeclRecord(ID); 7250 if (DeserializationListener) 7251 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 7252 } 7253 7254 return DeclsLoaded[Index]; 7255 } 7256 7257 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 7258 DeclID GlobalID) { 7259 if (GlobalID < NUM_PREDEF_DECL_IDS) 7260 return GlobalID; 7261 7262 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 7263 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7264 ModuleFile *Owner = I->second; 7265 7266 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 7267 = M.GlobalToLocalDeclIDs.find(Owner); 7268 if (Pos == M.GlobalToLocalDeclIDs.end()) 7269 return 0; 7270 7271 return GlobalID - Owner->BaseDeclID + Pos->second; 7272 } 7273 7274 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 7275 const RecordData &Record, 7276 unsigned &Idx) { 7277 if (Idx >= Record.size()) { 7278 Error("Corrupted AST file"); 7279 return 0; 7280 } 7281 7282 return getGlobalDeclID(F, Record[Idx++]); 7283 } 7284 7285 /// \brief Resolve the offset of a statement into a statement. 7286 /// 7287 /// This operation will read a new statement from the external 7288 /// source each time it is called, and is meant to be used via a 7289 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 7290 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 7291 // Switch case IDs are per Decl. 7292 ClearSwitchCaseIDs(); 7293 7294 // Offset here is a global offset across the entire chain. 7295 RecordLocation Loc = getLocalBitOffset(Offset); 7296 Loc.F->DeclsCursor.JumpToBit(Loc.Offset); 7297 assert(NumCurrentElementsDeserializing == 0 && 7298 "should not be called while already deserializing"); 7299 Deserializing D(this); 7300 return ReadStmtFromStream(*Loc.F); 7301 } 7302 7303 void ASTReader::FindExternalLexicalDecls( 7304 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 7305 SmallVectorImpl<Decl *> &Decls) { 7306 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {}; 7307 7308 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) { 7309 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries"); 7310 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) { 7311 auto K = (Decl::Kind)+LexicalDecls[I]; 7312 if (!IsKindWeWant(K)) 7313 continue; 7314 7315 auto ID = (serialization::DeclID)+LexicalDecls[I + 1]; 7316 7317 // Don't add predefined declarations to the lexical context more 7318 // than once. 7319 if (ID < NUM_PREDEF_DECL_IDS) { 7320 if (PredefsVisited[ID]) 7321 continue; 7322 7323 PredefsVisited[ID] = true; 7324 } 7325 7326 if (Decl *D = GetLocalDecl(*M, ID)) { 7327 assert(D->getKind() == K && "wrong kind for lexical decl"); 7328 if (!DC->isDeclInLexicalTraversal(D)) 7329 Decls.push_back(D); 7330 } 7331 } 7332 }; 7333 7334 if (isa<TranslationUnitDecl>(DC)) { 7335 for (auto Lexical : TULexicalDecls) 7336 Visit(Lexical.first, Lexical.second); 7337 } else { 7338 auto I = LexicalDecls.find(DC); 7339 if (I != LexicalDecls.end()) 7340 Visit(I->second.first, I->second.second); 7341 } 7342 7343 ++NumLexicalDeclContextsRead; 7344 } 7345 7346 namespace { 7347 7348 class DeclIDComp { 7349 ASTReader &Reader; 7350 ModuleFile &Mod; 7351 7352 public: 7353 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 7354 7355 bool operator()(LocalDeclID L, LocalDeclID R) const { 7356 SourceLocation LHS = getLocation(L); 7357 SourceLocation RHS = getLocation(R); 7358 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7359 } 7360 7361 bool operator()(SourceLocation LHS, LocalDeclID R) const { 7362 SourceLocation RHS = getLocation(R); 7363 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7364 } 7365 7366 bool operator()(LocalDeclID L, SourceLocation RHS) const { 7367 SourceLocation LHS = getLocation(L); 7368 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7369 } 7370 7371 SourceLocation getLocation(LocalDeclID ID) const { 7372 return Reader.getSourceManager().getFileLoc( 7373 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 7374 } 7375 }; 7376 7377 } // namespace 7378 7379 void ASTReader::FindFileRegionDecls(FileID File, 7380 unsigned Offset, unsigned Length, 7381 SmallVectorImpl<Decl *> &Decls) { 7382 SourceManager &SM = getSourceManager(); 7383 7384 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 7385 if (I == FileDeclIDs.end()) 7386 return; 7387 7388 FileDeclsInfo &DInfo = I->second; 7389 if (DInfo.Decls.empty()) 7390 return; 7391 7392 SourceLocation 7393 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 7394 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 7395 7396 DeclIDComp DIDComp(*this, *DInfo.Mod); 7397 ArrayRef<serialization::LocalDeclID>::iterator 7398 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 7399 BeginLoc, DIDComp); 7400 if (BeginIt != DInfo.Decls.begin()) 7401 --BeginIt; 7402 7403 // If we are pointing at a top-level decl inside an objc container, we need 7404 // to backtrack until we find it otherwise we will fail to report that the 7405 // region overlaps with an objc container. 7406 while (BeginIt != DInfo.Decls.begin() && 7407 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 7408 ->isTopLevelDeclInObjCContainer()) 7409 --BeginIt; 7410 7411 ArrayRef<serialization::LocalDeclID>::iterator 7412 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 7413 EndLoc, DIDComp); 7414 if (EndIt != DInfo.Decls.end()) 7415 ++EndIt; 7416 7417 for (ArrayRef<serialization::LocalDeclID>::iterator 7418 DIt = BeginIt; DIt != EndIt; ++DIt) 7419 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 7420 } 7421 7422 bool 7423 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 7424 DeclarationName Name) { 7425 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && 7426 "DeclContext has no visible decls in storage"); 7427 if (!Name) 7428 return false; 7429 7430 auto It = Lookups.find(DC); 7431 if (It == Lookups.end()) 7432 return false; 7433 7434 Deserializing LookupResults(this); 7435 7436 // Load the list of declarations. 7437 SmallVector<NamedDecl *, 64> Decls; 7438 for (DeclID ID : It->second.Table.find(Name)) { 7439 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7440 if (ND->getDeclName() == Name) 7441 Decls.push_back(ND); 7442 } 7443 7444 ++NumVisibleDeclContextsRead; 7445 SetExternalVisibleDeclsForName(DC, Name, Decls); 7446 return !Decls.empty(); 7447 } 7448 7449 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 7450 if (!DC->hasExternalVisibleStorage()) 7451 return; 7452 7453 auto It = Lookups.find(DC); 7454 assert(It != Lookups.end() && 7455 "have external visible storage but no lookup tables"); 7456 7457 DeclsMap Decls; 7458 7459 for (DeclID ID : It->second.Table.findAll()) { 7460 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7461 Decls[ND->getDeclName()].push_back(ND); 7462 } 7463 7464 ++NumVisibleDeclContextsRead; 7465 7466 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 7467 SetExternalVisibleDeclsForName(DC, I->first, I->second); 7468 } 7469 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 7470 } 7471 7472 const serialization::reader::DeclContextLookupTable * 7473 ASTReader::getLoadedLookupTables(DeclContext *Primary) const { 7474 auto I = Lookups.find(Primary); 7475 return I == Lookups.end() ? nullptr : &I->second; 7476 } 7477 7478 /// \brief Under non-PCH compilation the consumer receives the objc methods 7479 /// before receiving the implementation, and codegen depends on this. 7480 /// We simulate this by deserializing and passing to consumer the methods of the 7481 /// implementation before passing the deserialized implementation decl. 7482 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 7483 ASTConsumer *Consumer) { 7484 assert(ImplD && Consumer); 7485 7486 for (auto *I : ImplD->methods()) 7487 Consumer->HandleInterestingDecl(DeclGroupRef(I)); 7488 7489 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 7490 } 7491 7492 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 7493 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 7494 PassObjCImplDeclToConsumer(ImplD, Consumer); 7495 else 7496 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 7497 } 7498 7499 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 7500 this->Consumer = Consumer; 7501 7502 if (Consumer) 7503 PassInterestingDeclsToConsumer(); 7504 7505 if (DeserializationListener) 7506 DeserializationListener->ReaderInitialized(this); 7507 } 7508 7509 void ASTReader::PrintStats() { 7510 std::fprintf(stderr, "*** AST File Statistics:\n"); 7511 7512 unsigned NumTypesLoaded 7513 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 7514 QualType()); 7515 unsigned NumDeclsLoaded 7516 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 7517 (Decl *)nullptr); 7518 unsigned NumIdentifiersLoaded 7519 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 7520 IdentifiersLoaded.end(), 7521 (IdentifierInfo *)nullptr); 7522 unsigned NumMacrosLoaded 7523 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 7524 MacrosLoaded.end(), 7525 (MacroInfo *)nullptr); 7526 unsigned NumSelectorsLoaded 7527 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 7528 SelectorsLoaded.end(), 7529 Selector()); 7530 7531 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 7532 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 7533 NumSLocEntriesRead, TotalNumSLocEntries, 7534 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 7535 if (!TypesLoaded.empty()) 7536 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 7537 NumTypesLoaded, (unsigned)TypesLoaded.size(), 7538 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 7539 if (!DeclsLoaded.empty()) 7540 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 7541 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 7542 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 7543 if (!IdentifiersLoaded.empty()) 7544 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 7545 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 7546 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 7547 if (!MacrosLoaded.empty()) 7548 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7549 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 7550 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 7551 if (!SelectorsLoaded.empty()) 7552 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 7553 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 7554 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 7555 if (TotalNumStatements) 7556 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 7557 NumStatementsRead, TotalNumStatements, 7558 ((float)NumStatementsRead/TotalNumStatements * 100)); 7559 if (TotalNumMacros) 7560 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7561 NumMacrosRead, TotalNumMacros, 7562 ((float)NumMacrosRead/TotalNumMacros * 100)); 7563 if (TotalLexicalDeclContexts) 7564 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 7565 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 7566 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 7567 * 100)); 7568 if (TotalVisibleDeclContexts) 7569 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 7570 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 7571 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 7572 * 100)); 7573 if (TotalNumMethodPoolEntries) 7574 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 7575 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 7576 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 7577 * 100)); 7578 if (NumMethodPoolLookups) 7579 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 7580 NumMethodPoolHits, NumMethodPoolLookups, 7581 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 7582 if (NumMethodPoolTableLookups) 7583 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 7584 NumMethodPoolTableHits, NumMethodPoolTableLookups, 7585 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 7586 * 100.0)); 7587 if (NumIdentifierLookupHits) 7588 std::fprintf(stderr, 7589 " %u / %u identifier table lookups succeeded (%f%%)\n", 7590 NumIdentifierLookupHits, NumIdentifierLookups, 7591 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 7592 7593 if (GlobalIndex) { 7594 std::fprintf(stderr, "\n"); 7595 GlobalIndex->printStats(); 7596 } 7597 7598 std::fprintf(stderr, "\n"); 7599 dump(); 7600 std::fprintf(stderr, "\n"); 7601 } 7602 7603 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 7604 LLVM_DUMP_METHOD static void 7605 dumpModuleIDMap(StringRef Name, 7606 const ContinuousRangeMap<Key, ModuleFile *, 7607 InitialCapacity> &Map) { 7608 if (Map.begin() == Map.end()) 7609 return; 7610 7611 using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>; 7612 7613 llvm::errs() << Name << ":\n"; 7614 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 7615 I != IEnd; ++I) { 7616 llvm::errs() << " " << I->first << " -> " << I->second->FileName 7617 << "\n"; 7618 } 7619 } 7620 7621 LLVM_DUMP_METHOD void ASTReader::dump() { 7622 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 7623 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 7624 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 7625 dumpModuleIDMap("Global type map", GlobalTypeMap); 7626 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 7627 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 7628 dumpModuleIDMap("Global macro map", GlobalMacroMap); 7629 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 7630 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 7631 dumpModuleIDMap("Global preprocessed entity map", 7632 GlobalPreprocessedEntityMap); 7633 7634 llvm::errs() << "\n*** PCH/Modules Loaded:"; 7635 for (ModuleFile &M : ModuleMgr) 7636 M.dump(); 7637 } 7638 7639 /// Return the amount of memory used by memory buffers, breaking down 7640 /// by heap-backed versus mmap'ed memory. 7641 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 7642 for (ModuleFile &I : ModuleMgr) { 7643 if (llvm::MemoryBuffer *buf = I.Buffer) { 7644 size_t bytes = buf->getBufferSize(); 7645 switch (buf->getBufferKind()) { 7646 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 7647 sizes.malloc_bytes += bytes; 7648 break; 7649 case llvm::MemoryBuffer::MemoryBuffer_MMap: 7650 sizes.mmap_bytes += bytes; 7651 break; 7652 } 7653 } 7654 } 7655 } 7656 7657 void ASTReader::InitializeSema(Sema &S) { 7658 SemaObj = &S; 7659 S.addExternalSource(this); 7660 7661 // Makes sure any declarations that were deserialized "too early" 7662 // still get added to the identifier's declaration chains. 7663 for (uint64_t ID : PreloadedDeclIDs) { 7664 NamedDecl *D = cast<NamedDecl>(GetDecl(ID)); 7665 pushExternalDeclIntoScope(D, D->getDeclName()); 7666 } 7667 PreloadedDeclIDs.clear(); 7668 7669 // FIXME: What happens if these are changed by a module import? 7670 if (!FPPragmaOptions.empty()) { 7671 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 7672 SemaObj->FPFeatures = FPOptions(FPPragmaOptions[0]); 7673 } 7674 7675 SemaObj->OpenCLFeatures.copy(OpenCLExtensions); 7676 SemaObj->OpenCLTypeExtMap = OpenCLTypeExtMap; 7677 SemaObj->OpenCLDeclExtMap = OpenCLDeclExtMap; 7678 7679 UpdateSema(); 7680 } 7681 7682 void ASTReader::UpdateSema() { 7683 assert(SemaObj && "no Sema to update"); 7684 7685 // Load the offsets of the declarations that Sema references. 7686 // They will be lazily deserialized when needed. 7687 if (!SemaDeclRefs.empty()) { 7688 assert(SemaDeclRefs.size() % 3 == 0); 7689 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) { 7690 if (!SemaObj->StdNamespace) 7691 SemaObj->StdNamespace = SemaDeclRefs[I]; 7692 if (!SemaObj->StdBadAlloc) 7693 SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 7694 if (!SemaObj->StdAlignValT) 7695 SemaObj->StdAlignValT = SemaDeclRefs[I+2]; 7696 } 7697 SemaDeclRefs.clear(); 7698 } 7699 7700 // Update the state of pragmas. Use the same API as if we had encountered the 7701 // pragma in the source. 7702 if(OptimizeOffPragmaLocation.isValid()) 7703 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation); 7704 if (PragmaMSStructState != -1) 7705 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState); 7706 if (PointersToMembersPragmaLocation.isValid()) { 7707 SemaObj->ActOnPragmaMSPointersToMembers( 7708 (LangOptions::PragmaMSPointersToMembersKind) 7709 PragmaMSPointersToMembersState, 7710 PointersToMembersPragmaLocation); 7711 } 7712 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth; 7713 7714 if (PragmaPackCurrentValue) { 7715 // The bottom of the stack might have a default value. It must be adjusted 7716 // to the current value to ensure that the packing state is preserved after 7717 // popping entries that were included/imported from a PCH/module. 7718 bool DropFirst = false; 7719 if (!PragmaPackStack.empty() && 7720 PragmaPackStack.front().Location.isInvalid()) { 7721 assert(PragmaPackStack.front().Value == SemaObj->PackStack.DefaultValue && 7722 "Expected a default alignment value"); 7723 SemaObj->PackStack.Stack.emplace_back( 7724 PragmaPackStack.front().SlotLabel, SemaObj->PackStack.CurrentValue, 7725 SemaObj->PackStack.CurrentPragmaLocation, 7726 PragmaPackStack.front().PushLocation); 7727 DropFirst = true; 7728 } 7729 for (const auto &Entry : 7730 llvm::makeArrayRef(PragmaPackStack).drop_front(DropFirst ? 1 : 0)) 7731 SemaObj->PackStack.Stack.emplace_back(Entry.SlotLabel, Entry.Value, 7732 Entry.Location, Entry.PushLocation); 7733 if (PragmaPackCurrentLocation.isInvalid()) { 7734 assert(*PragmaPackCurrentValue == SemaObj->PackStack.DefaultValue && 7735 "Expected a default alignment value"); 7736 // Keep the current values. 7737 } else { 7738 SemaObj->PackStack.CurrentValue = *PragmaPackCurrentValue; 7739 SemaObj->PackStack.CurrentPragmaLocation = PragmaPackCurrentLocation; 7740 } 7741 } 7742 } 7743 7744 IdentifierInfo *ASTReader::get(StringRef Name) { 7745 // Note that we are loading an identifier. 7746 Deserializing AnIdentifier(this); 7747 7748 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 7749 NumIdentifierLookups, 7750 NumIdentifierLookupHits); 7751 7752 // We don't need to do identifier table lookups in C++ modules (we preload 7753 // all interesting declarations, and don't need to use the scope for name 7754 // lookups). Perform the lookup in PCH files, though, since we don't build 7755 // a complete initial identifier table if we're carrying on from a PCH. 7756 if (PP.getLangOpts().CPlusPlus) { 7757 for (auto F : ModuleMgr.pch_modules()) 7758 if (Visitor(*F)) 7759 break; 7760 } else { 7761 // If there is a global index, look there first to determine which modules 7762 // provably do not have any results for this identifier. 7763 GlobalModuleIndex::HitSet Hits; 7764 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 7765 if (!loadGlobalIndex()) { 7766 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 7767 HitsPtr = &Hits; 7768 } 7769 } 7770 7771 ModuleMgr.visit(Visitor, HitsPtr); 7772 } 7773 7774 IdentifierInfo *II = Visitor.getIdentifierInfo(); 7775 markIdentifierUpToDate(II); 7776 return II; 7777 } 7778 7779 namespace clang { 7780 7781 /// \brief An identifier-lookup iterator that enumerates all of the 7782 /// identifiers stored within a set of AST files. 7783 class ASTIdentifierIterator : public IdentifierIterator { 7784 /// \brief The AST reader whose identifiers are being enumerated. 7785 const ASTReader &Reader; 7786 7787 /// \brief The current index into the chain of AST files stored in 7788 /// the AST reader. 7789 unsigned Index; 7790 7791 /// \brief The current position within the identifier lookup table 7792 /// of the current AST file. 7793 ASTIdentifierLookupTable::key_iterator Current; 7794 7795 /// \brief The end position within the identifier lookup table of 7796 /// the current AST file. 7797 ASTIdentifierLookupTable::key_iterator End; 7798 7799 /// \brief Whether to skip any modules in the ASTReader. 7800 bool SkipModules; 7801 7802 public: 7803 explicit ASTIdentifierIterator(const ASTReader &Reader, 7804 bool SkipModules = false); 7805 7806 StringRef Next() override; 7807 }; 7808 7809 } // namespace clang 7810 7811 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader, 7812 bool SkipModules) 7813 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) { 7814 } 7815 7816 StringRef ASTIdentifierIterator::Next() { 7817 while (Current == End) { 7818 // If we have exhausted all of our AST files, we're done. 7819 if (Index == 0) 7820 return StringRef(); 7821 7822 --Index; 7823 ModuleFile &F = Reader.ModuleMgr[Index]; 7824 if (SkipModules && F.isModule()) 7825 continue; 7826 7827 ASTIdentifierLookupTable *IdTable = 7828 (ASTIdentifierLookupTable *)F.IdentifierLookupTable; 7829 Current = IdTable->key_begin(); 7830 End = IdTable->key_end(); 7831 } 7832 7833 // We have any identifiers remaining in the current AST file; return 7834 // the next one. 7835 StringRef Result = *Current; 7836 ++Current; 7837 return Result; 7838 } 7839 7840 namespace { 7841 7842 /// A utility for appending two IdentifierIterators. 7843 class ChainedIdentifierIterator : public IdentifierIterator { 7844 std::unique_ptr<IdentifierIterator> Current; 7845 std::unique_ptr<IdentifierIterator> Queued; 7846 7847 public: 7848 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First, 7849 std::unique_ptr<IdentifierIterator> Second) 7850 : Current(std::move(First)), Queued(std::move(Second)) {} 7851 7852 StringRef Next() override { 7853 if (!Current) 7854 return StringRef(); 7855 7856 StringRef result = Current->Next(); 7857 if (!result.empty()) 7858 return result; 7859 7860 // Try the queued iterator, which may itself be empty. 7861 Current.reset(); 7862 std::swap(Current, Queued); 7863 return Next(); 7864 } 7865 }; 7866 7867 } // namespace 7868 7869 IdentifierIterator *ASTReader::getIdentifiers() { 7870 if (!loadGlobalIndex()) { 7871 std::unique_ptr<IdentifierIterator> ReaderIter( 7872 new ASTIdentifierIterator(*this, /*SkipModules=*/true)); 7873 std::unique_ptr<IdentifierIterator> ModulesIter( 7874 GlobalIndex->createIdentifierIterator()); 7875 return new ChainedIdentifierIterator(std::move(ReaderIter), 7876 std::move(ModulesIter)); 7877 } 7878 7879 return new ASTIdentifierIterator(*this); 7880 } 7881 7882 namespace clang { 7883 namespace serialization { 7884 7885 class ReadMethodPoolVisitor { 7886 ASTReader &Reader; 7887 Selector Sel; 7888 unsigned PriorGeneration; 7889 unsigned InstanceBits = 0; 7890 unsigned FactoryBits = 0; 7891 bool InstanceHasMoreThanOneDecl = false; 7892 bool FactoryHasMoreThanOneDecl = false; 7893 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 7894 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 7895 7896 public: 7897 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 7898 unsigned PriorGeneration) 7899 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {} 7900 7901 bool operator()(ModuleFile &M) { 7902 if (!M.SelectorLookupTable) 7903 return false; 7904 7905 // If we've already searched this module file, skip it now. 7906 if (M.Generation <= PriorGeneration) 7907 return true; 7908 7909 ++Reader.NumMethodPoolTableLookups; 7910 ASTSelectorLookupTable *PoolTable 7911 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 7912 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel); 7913 if (Pos == PoolTable->end()) 7914 return false; 7915 7916 ++Reader.NumMethodPoolTableHits; 7917 ++Reader.NumSelectorsRead; 7918 // FIXME: Not quite happy with the statistics here. We probably should 7919 // disable this tracking when called via LoadSelector. 7920 // Also, should entries without methods count as misses? 7921 ++Reader.NumMethodPoolEntriesRead; 7922 ASTSelectorLookupTrait::data_type Data = *Pos; 7923 if (Reader.DeserializationListener) 7924 Reader.DeserializationListener->SelectorRead(Data.ID, Sel); 7925 7926 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 7927 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 7928 InstanceBits = Data.InstanceBits; 7929 FactoryBits = Data.FactoryBits; 7930 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl; 7931 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl; 7932 return true; 7933 } 7934 7935 /// \brief Retrieve the instance methods found by this visitor. 7936 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 7937 return InstanceMethods; 7938 } 7939 7940 /// \brief Retrieve the instance methods found by this visitor. 7941 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 7942 return FactoryMethods; 7943 } 7944 7945 unsigned getInstanceBits() const { return InstanceBits; } 7946 unsigned getFactoryBits() const { return FactoryBits; } 7947 7948 bool instanceHasMoreThanOneDecl() const { 7949 return InstanceHasMoreThanOneDecl; 7950 } 7951 7952 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; } 7953 }; 7954 7955 } // namespace serialization 7956 } // namespace clang 7957 7958 /// \brief Add the given set of methods to the method list. 7959 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 7960 ObjCMethodList &List) { 7961 for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 7962 S.addMethodToGlobalList(&List, Methods[I]); 7963 } 7964 } 7965 7966 void ASTReader::ReadMethodPool(Selector Sel) { 7967 // Get the selector generation and update it to the current generation. 7968 unsigned &Generation = SelectorGeneration[Sel]; 7969 unsigned PriorGeneration = Generation; 7970 Generation = getGeneration(); 7971 SelectorOutOfDate[Sel] = false; 7972 7973 // Search for methods defined with this selector. 7974 ++NumMethodPoolLookups; 7975 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 7976 ModuleMgr.visit(Visitor); 7977 7978 if (Visitor.getInstanceMethods().empty() && 7979 Visitor.getFactoryMethods().empty()) 7980 return; 7981 7982 ++NumMethodPoolHits; 7983 7984 if (!getSema()) 7985 return; 7986 7987 Sema &S = *getSema(); 7988 Sema::GlobalMethodPool::iterator Pos 7989 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first; 7990 7991 Pos->second.first.setBits(Visitor.getInstanceBits()); 7992 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl()); 7993 Pos->second.second.setBits(Visitor.getFactoryBits()); 7994 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl()); 7995 7996 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since 7997 // when building a module we keep every method individually and may need to 7998 // update hasMoreThanOneDecl as we add the methods. 7999 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 8000 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 8001 } 8002 8003 void ASTReader::updateOutOfDateSelector(Selector Sel) { 8004 if (SelectorOutOfDate[Sel]) 8005 ReadMethodPool(Sel); 8006 } 8007 8008 void ASTReader::ReadKnownNamespaces( 8009 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 8010 Namespaces.clear(); 8011 8012 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 8013 if (NamespaceDecl *Namespace 8014 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 8015 Namespaces.push_back(Namespace); 8016 } 8017 } 8018 8019 void ASTReader::ReadUndefinedButUsed( 8020 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) { 8021 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 8022 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 8023 SourceLocation Loc = 8024 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 8025 Undefined.insert(std::make_pair(D, Loc)); 8026 } 8027 } 8028 8029 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector< 8030 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> & 8031 Exprs) { 8032 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) { 8033 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++])); 8034 uint64_t Count = DelayedDeleteExprs[Idx++]; 8035 for (uint64_t C = 0; C < Count; ++C) { 8036 SourceLocation DeleteLoc = 8037 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]); 8038 const bool IsArrayForm = DelayedDeleteExprs[Idx++]; 8039 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm)); 8040 } 8041 } 8042 } 8043 8044 void ASTReader::ReadTentativeDefinitions( 8045 SmallVectorImpl<VarDecl *> &TentativeDefs) { 8046 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 8047 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 8048 if (Var) 8049 TentativeDefs.push_back(Var); 8050 } 8051 TentativeDefinitions.clear(); 8052 } 8053 8054 void ASTReader::ReadUnusedFileScopedDecls( 8055 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 8056 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 8057 DeclaratorDecl *D 8058 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 8059 if (D) 8060 Decls.push_back(D); 8061 } 8062 UnusedFileScopedDecls.clear(); 8063 } 8064 8065 void ASTReader::ReadDelegatingConstructors( 8066 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 8067 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 8068 CXXConstructorDecl *D 8069 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 8070 if (D) 8071 Decls.push_back(D); 8072 } 8073 DelegatingCtorDecls.clear(); 8074 } 8075 8076 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 8077 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 8078 TypedefNameDecl *D 8079 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 8080 if (D) 8081 Decls.push_back(D); 8082 } 8083 ExtVectorDecls.clear(); 8084 } 8085 8086 void ASTReader::ReadUnusedLocalTypedefNameCandidates( 8087 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 8088 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N; 8089 ++I) { 8090 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>( 8091 GetDecl(UnusedLocalTypedefNameCandidates[I])); 8092 if (D) 8093 Decls.insert(D); 8094 } 8095 UnusedLocalTypedefNameCandidates.clear(); 8096 } 8097 8098 void ASTReader::ReadReferencedSelectors( 8099 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) { 8100 if (ReferencedSelectorsData.empty()) 8101 return; 8102 8103 // If there are @selector references added them to its pool. This is for 8104 // implementation of -Wselector. 8105 unsigned int DataSize = ReferencedSelectorsData.size()-1; 8106 unsigned I = 0; 8107 while (I < DataSize) { 8108 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 8109 SourceLocation SelLoc 8110 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 8111 Sels.push_back(std::make_pair(Sel, SelLoc)); 8112 } 8113 ReferencedSelectorsData.clear(); 8114 } 8115 8116 void ASTReader::ReadWeakUndeclaredIdentifiers( 8117 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) { 8118 if (WeakUndeclaredIdentifiers.empty()) 8119 return; 8120 8121 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 8122 IdentifierInfo *WeakId 8123 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8124 IdentifierInfo *AliasId 8125 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8126 SourceLocation Loc 8127 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 8128 bool Used = WeakUndeclaredIdentifiers[I++]; 8129 WeakInfo WI(AliasId, Loc); 8130 WI.setUsed(Used); 8131 WeakIDs.push_back(std::make_pair(WeakId, WI)); 8132 } 8133 WeakUndeclaredIdentifiers.clear(); 8134 } 8135 8136 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 8137 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 8138 ExternalVTableUse VT; 8139 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 8140 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 8141 VT.DefinitionRequired = VTableUses[Idx++]; 8142 VTables.push_back(VT); 8143 } 8144 8145 VTableUses.clear(); 8146 } 8147 8148 void ASTReader::ReadPendingInstantiations( 8149 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) { 8150 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 8151 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 8152 SourceLocation Loc 8153 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 8154 8155 Pending.push_back(std::make_pair(D, Loc)); 8156 } 8157 PendingInstantiations.clear(); 8158 } 8159 8160 void ASTReader::ReadLateParsedTemplates( 8161 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>> 8162 &LPTMap) { 8163 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N; 8164 /* In loop */) { 8165 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++])); 8166 8167 auto LT = llvm::make_unique<LateParsedTemplate>(); 8168 LT->D = GetDecl(LateParsedTemplates[Idx++]); 8169 8170 ModuleFile *F = getOwningModuleFile(LT->D); 8171 assert(F && "No module"); 8172 8173 unsigned TokN = LateParsedTemplates[Idx++]; 8174 LT->Toks.reserve(TokN); 8175 for (unsigned T = 0; T < TokN; ++T) 8176 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx)); 8177 8178 LPTMap.insert(std::make_pair(FD, std::move(LT))); 8179 } 8180 8181 LateParsedTemplates.clear(); 8182 } 8183 8184 void ASTReader::LoadSelector(Selector Sel) { 8185 // It would be complicated to avoid reading the methods anyway. So don't. 8186 ReadMethodPool(Sel); 8187 } 8188 8189 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 8190 assert(ID && "Non-zero identifier ID required"); 8191 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 8192 IdentifiersLoaded[ID - 1] = II; 8193 if (DeserializationListener) 8194 DeserializationListener->IdentifierRead(ID, II); 8195 } 8196 8197 /// \brief Set the globally-visible declarations associated with the given 8198 /// identifier. 8199 /// 8200 /// If the AST reader is currently in a state where the given declaration IDs 8201 /// cannot safely be resolved, they are queued until it is safe to resolve 8202 /// them. 8203 /// 8204 /// \param II an IdentifierInfo that refers to one or more globally-visible 8205 /// declarations. 8206 /// 8207 /// \param DeclIDs the set of declaration IDs with the name @p II that are 8208 /// visible at global scope. 8209 /// 8210 /// \param Decls if non-null, this vector will be populated with the set of 8211 /// deserialized declarations. These declarations will not be pushed into 8212 /// scope. 8213 void 8214 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 8215 const SmallVectorImpl<uint32_t> &DeclIDs, 8216 SmallVectorImpl<Decl *> *Decls) { 8217 if (NumCurrentElementsDeserializing && !Decls) { 8218 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 8219 return; 8220 } 8221 8222 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 8223 if (!SemaObj) { 8224 // Queue this declaration so that it will be added to the 8225 // translation unit scope and identifier's declaration chain 8226 // once a Sema object is known. 8227 PreloadedDeclIDs.push_back(DeclIDs[I]); 8228 continue; 8229 } 8230 8231 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 8232 8233 // If we're simply supposed to record the declarations, do so now. 8234 if (Decls) { 8235 Decls->push_back(D); 8236 continue; 8237 } 8238 8239 // Introduce this declaration into the translation-unit scope 8240 // and add it to the declaration chain for this identifier, so 8241 // that (unqualified) name lookup will find it. 8242 pushExternalDeclIntoScope(D, II); 8243 } 8244 } 8245 8246 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 8247 if (ID == 0) 8248 return nullptr; 8249 8250 if (IdentifiersLoaded.empty()) { 8251 Error("no identifier table in AST file"); 8252 return nullptr; 8253 } 8254 8255 ID -= 1; 8256 if (!IdentifiersLoaded[ID]) { 8257 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 8258 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 8259 ModuleFile *M = I->second; 8260 unsigned Index = ID - M->BaseIdentifierID; 8261 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index]; 8262 8263 // All of the strings in the AST file are preceded by a 16-bit length. 8264 // Extract that 16-bit length to avoid having to execute strlen(). 8265 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as 8266 // unsigned integers. This is important to avoid integer overflow when 8267 // we cast them to 'unsigned'. 8268 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2; 8269 unsigned StrLen = (((unsigned) StrLenPtr[0]) 8270 | (((unsigned) StrLenPtr[1]) << 8)) - 1; 8271 auto &II = PP.getIdentifierTable().get(StringRef(Str, StrLen)); 8272 IdentifiersLoaded[ID] = &II; 8273 markIdentifierFromAST(*this, II); 8274 if (DeserializationListener) 8275 DeserializationListener->IdentifierRead(ID + 1, &II); 8276 } 8277 8278 return IdentifiersLoaded[ID]; 8279 } 8280 8281 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 8282 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 8283 } 8284 8285 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 8286 if (LocalID < NUM_PREDEF_IDENT_IDS) 8287 return LocalID; 8288 8289 if (!M.ModuleOffsetMap.empty()) 8290 ReadModuleOffsetMap(M); 8291 8292 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8293 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 8294 assert(I != M.IdentifierRemap.end() 8295 && "Invalid index into identifier index remap"); 8296 8297 return LocalID + I->second; 8298 } 8299 8300 MacroInfo *ASTReader::getMacro(MacroID ID) { 8301 if (ID == 0) 8302 return nullptr; 8303 8304 if (MacrosLoaded.empty()) { 8305 Error("no macro table in AST file"); 8306 return nullptr; 8307 } 8308 8309 ID -= NUM_PREDEF_MACRO_IDS; 8310 if (!MacrosLoaded[ID]) { 8311 GlobalMacroMapType::iterator I 8312 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 8313 assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 8314 ModuleFile *M = I->second; 8315 unsigned Index = ID - M->BaseMacroID; 8316 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]); 8317 8318 if (DeserializationListener) 8319 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 8320 MacrosLoaded[ID]); 8321 } 8322 8323 return MacrosLoaded[ID]; 8324 } 8325 8326 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 8327 if (LocalID < NUM_PREDEF_MACRO_IDS) 8328 return LocalID; 8329 8330 if (!M.ModuleOffsetMap.empty()) 8331 ReadModuleOffsetMap(M); 8332 8333 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8334 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 8335 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 8336 8337 return LocalID + I->second; 8338 } 8339 8340 serialization::SubmoduleID 8341 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 8342 if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 8343 return LocalID; 8344 8345 if (!M.ModuleOffsetMap.empty()) 8346 ReadModuleOffsetMap(M); 8347 8348 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8349 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 8350 assert(I != M.SubmoduleRemap.end() 8351 && "Invalid index into submodule index remap"); 8352 8353 return LocalID + I->second; 8354 } 8355 8356 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) { 8357 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 8358 assert(GlobalID == 0 && "Unhandled global submodule ID"); 8359 return nullptr; 8360 } 8361 8362 if (GlobalID > SubmodulesLoaded.size()) { 8363 Error("submodule ID out of range in AST file"); 8364 return nullptr; 8365 } 8366 8367 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 8368 } 8369 8370 Module *ASTReader::getModule(unsigned ID) { 8371 return getSubmodule(ID); 8372 } 8373 8374 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) { 8375 if (ID & 1) { 8376 // It's a module, look it up by submodule ID. 8377 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1)); 8378 return I == GlobalSubmoduleMap.end() ? nullptr : I->second; 8379 } else { 8380 // It's a prefix (preamble, PCH, ...). Look it up by index. 8381 unsigned IndexFromEnd = ID >> 1; 8382 assert(IndexFromEnd && "got reference to unknown module file"); 8383 return getModuleManager().pch_modules().end()[-IndexFromEnd]; 8384 } 8385 } 8386 8387 unsigned ASTReader::getModuleFileID(ModuleFile *F) { 8388 if (!F) 8389 return 1; 8390 8391 // For a file representing a module, use the submodule ID of the top-level 8392 // module as the file ID. For any other kind of file, the number of such 8393 // files loaded beforehand will be the same on reload. 8394 // FIXME: Is this true even if we have an explicit module file and a PCH? 8395 if (F->isModule()) 8396 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1; 8397 8398 auto PCHModules = getModuleManager().pch_modules(); 8399 auto I = std::find(PCHModules.begin(), PCHModules.end(), F); 8400 assert(I != PCHModules.end() && "emitting reference to unknown file"); 8401 return (I - PCHModules.end()) << 1; 8402 } 8403 8404 llvm::Optional<ExternalASTSource::ASTSourceDescriptor> 8405 ASTReader::getSourceDescriptor(unsigned ID) { 8406 if (const Module *M = getSubmodule(ID)) 8407 return ExternalASTSource::ASTSourceDescriptor(*M); 8408 8409 // If there is only a single PCH, return it instead. 8410 // Chained PCH are not supported. 8411 const auto &PCHChain = ModuleMgr.pch_modules(); 8412 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) { 8413 ModuleFile &MF = ModuleMgr.getPrimaryModule(); 8414 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName); 8415 StringRef FileName = llvm::sys::path::filename(MF.FileName); 8416 return ASTReader::ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName, 8417 MF.Signature); 8418 } 8419 return None; 8420 } 8421 8422 ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) { 8423 auto I = DefinitionSource.find(FD); 8424 if (I == DefinitionSource.end()) 8425 return EK_ReplyHazy; 8426 return I->second ? EK_Never : EK_Always; 8427 } 8428 8429 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 8430 return DecodeSelector(getGlobalSelectorID(M, LocalID)); 8431 } 8432 8433 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { 8434 if (ID == 0) 8435 return Selector(); 8436 8437 if (ID > SelectorsLoaded.size()) { 8438 Error("selector ID out of range in AST file"); 8439 return Selector(); 8440 } 8441 8442 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) { 8443 // Load this selector from the selector table. 8444 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 8445 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 8446 ModuleFile &M = *I->second; 8447 ASTSelectorLookupTrait Trait(*this, M); 8448 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 8449 SelectorsLoaded[ID - 1] = 8450 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 8451 if (DeserializationListener) 8452 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 8453 } 8454 8455 return SelectorsLoaded[ID - 1]; 8456 } 8457 8458 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 8459 return DecodeSelector(ID); 8460 } 8461 8462 uint32_t ASTReader::GetNumExternalSelectors() { 8463 // ID 0 (the null selector) is considered an external selector. 8464 return getTotalNumSelectors() + 1; 8465 } 8466 8467 serialization::SelectorID 8468 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 8469 if (LocalID < NUM_PREDEF_SELECTOR_IDS) 8470 return LocalID; 8471 8472 if (!M.ModuleOffsetMap.empty()) 8473 ReadModuleOffsetMap(M); 8474 8475 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8476 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 8477 assert(I != M.SelectorRemap.end() 8478 && "Invalid index into selector index remap"); 8479 8480 return LocalID + I->second; 8481 } 8482 8483 DeclarationName 8484 ASTReader::ReadDeclarationName(ModuleFile &F, 8485 const RecordData &Record, unsigned &Idx) { 8486 ASTContext &Context = getContext(); 8487 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++]; 8488 switch (Kind) { 8489 case DeclarationName::Identifier: 8490 return DeclarationName(GetIdentifierInfo(F, Record, Idx)); 8491 8492 case DeclarationName::ObjCZeroArgSelector: 8493 case DeclarationName::ObjCOneArgSelector: 8494 case DeclarationName::ObjCMultiArgSelector: 8495 return DeclarationName(ReadSelector(F, Record, Idx)); 8496 8497 case DeclarationName::CXXConstructorName: 8498 return Context.DeclarationNames.getCXXConstructorName( 8499 Context.getCanonicalType(readType(F, Record, Idx))); 8500 8501 case DeclarationName::CXXDestructorName: 8502 return Context.DeclarationNames.getCXXDestructorName( 8503 Context.getCanonicalType(readType(F, Record, Idx))); 8504 8505 case DeclarationName::CXXDeductionGuideName: 8506 return Context.DeclarationNames.getCXXDeductionGuideName( 8507 ReadDeclAs<TemplateDecl>(F, Record, Idx)); 8508 8509 case DeclarationName::CXXConversionFunctionName: 8510 return Context.DeclarationNames.getCXXConversionFunctionName( 8511 Context.getCanonicalType(readType(F, Record, Idx))); 8512 8513 case DeclarationName::CXXOperatorName: 8514 return Context.DeclarationNames.getCXXOperatorName( 8515 (OverloadedOperatorKind)Record[Idx++]); 8516 8517 case DeclarationName::CXXLiteralOperatorName: 8518 return Context.DeclarationNames.getCXXLiteralOperatorName( 8519 GetIdentifierInfo(F, Record, Idx)); 8520 8521 case DeclarationName::CXXUsingDirective: 8522 return DeclarationName::getUsingDirectiveName(); 8523 } 8524 8525 llvm_unreachable("Invalid NameKind!"); 8526 } 8527 8528 void ASTReader::ReadDeclarationNameLoc(ModuleFile &F, 8529 DeclarationNameLoc &DNLoc, 8530 DeclarationName Name, 8531 const RecordData &Record, unsigned &Idx) { 8532 switch (Name.getNameKind()) { 8533 case DeclarationName::CXXConstructorName: 8534 case DeclarationName::CXXDestructorName: 8535 case DeclarationName::CXXConversionFunctionName: 8536 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx); 8537 break; 8538 8539 case DeclarationName::CXXOperatorName: 8540 DNLoc.CXXOperatorName.BeginOpNameLoc 8541 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 8542 DNLoc.CXXOperatorName.EndOpNameLoc 8543 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 8544 break; 8545 8546 case DeclarationName::CXXLiteralOperatorName: 8547 DNLoc.CXXLiteralOperatorName.OpNameLoc 8548 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 8549 break; 8550 8551 case DeclarationName::Identifier: 8552 case DeclarationName::ObjCZeroArgSelector: 8553 case DeclarationName::ObjCOneArgSelector: 8554 case DeclarationName::ObjCMultiArgSelector: 8555 case DeclarationName::CXXUsingDirective: 8556 case DeclarationName::CXXDeductionGuideName: 8557 break; 8558 } 8559 } 8560 8561 void ASTReader::ReadDeclarationNameInfo(ModuleFile &F, 8562 DeclarationNameInfo &NameInfo, 8563 const RecordData &Record, unsigned &Idx) { 8564 NameInfo.setName(ReadDeclarationName(F, Record, Idx)); 8565 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx)); 8566 DeclarationNameLoc DNLoc; 8567 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx); 8568 NameInfo.setInfo(DNLoc); 8569 } 8570 8571 void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info, 8572 const RecordData &Record, unsigned &Idx) { 8573 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx); 8574 unsigned NumTPLists = Record[Idx++]; 8575 Info.NumTemplParamLists = NumTPLists; 8576 if (NumTPLists) { 8577 Info.TemplParamLists = 8578 new (getContext()) TemplateParameterList *[NumTPLists]; 8579 for (unsigned i = 0; i != NumTPLists; ++i) 8580 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx); 8581 } 8582 } 8583 8584 TemplateName 8585 ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record, 8586 unsigned &Idx) { 8587 ASTContext &Context = getContext(); 8588 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++]; 8589 switch (Kind) { 8590 case TemplateName::Template: 8591 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx)); 8592 8593 case TemplateName::OverloadedTemplate: { 8594 unsigned size = Record[Idx++]; 8595 UnresolvedSet<8> Decls; 8596 while (size--) 8597 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx)); 8598 8599 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end()); 8600 } 8601 8602 case TemplateName::QualifiedTemplate: { 8603 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 8604 bool hasTemplKeyword = Record[Idx++]; 8605 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx); 8606 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template); 8607 } 8608 8609 case TemplateName::DependentTemplate: { 8610 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 8611 if (Record[Idx++]) // isIdentifier 8612 return Context.getDependentTemplateName(NNS, 8613 GetIdentifierInfo(F, Record, 8614 Idx)); 8615 return Context.getDependentTemplateName(NNS, 8616 (OverloadedOperatorKind)Record[Idx++]); 8617 } 8618 8619 case TemplateName::SubstTemplateTemplateParm: { 8620 TemplateTemplateParmDecl *param 8621 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 8622 if (!param) return TemplateName(); 8623 TemplateName replacement = ReadTemplateName(F, Record, Idx); 8624 return Context.getSubstTemplateTemplateParm(param, replacement); 8625 } 8626 8627 case TemplateName::SubstTemplateTemplateParmPack: { 8628 TemplateTemplateParmDecl *Param 8629 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 8630 if (!Param) 8631 return TemplateName(); 8632 8633 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx); 8634 if (ArgPack.getKind() != TemplateArgument::Pack) 8635 return TemplateName(); 8636 8637 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 8638 } 8639 } 8640 8641 llvm_unreachable("Unhandled template name kind!"); 8642 } 8643 8644 TemplateArgument ASTReader::ReadTemplateArgument(ModuleFile &F, 8645 const RecordData &Record, 8646 unsigned &Idx, 8647 bool Canonicalize) { 8648 ASTContext &Context = getContext(); 8649 if (Canonicalize) { 8650 // The caller wants a canonical template argument. Sometimes the AST only 8651 // wants template arguments in canonical form (particularly as the template 8652 // argument lists of template specializations) so ensure we preserve that 8653 // canonical form across serialization. 8654 TemplateArgument Arg = ReadTemplateArgument(F, Record, Idx, false); 8655 return Context.getCanonicalTemplateArgument(Arg); 8656 } 8657 8658 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++]; 8659 switch (Kind) { 8660 case TemplateArgument::Null: 8661 return TemplateArgument(); 8662 case TemplateArgument::Type: 8663 return TemplateArgument(readType(F, Record, Idx)); 8664 case TemplateArgument::Declaration: { 8665 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx); 8666 return TemplateArgument(D, readType(F, Record, Idx)); 8667 } 8668 case TemplateArgument::NullPtr: 8669 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true); 8670 case TemplateArgument::Integral: { 8671 llvm::APSInt Value = ReadAPSInt(Record, Idx); 8672 QualType T = readType(F, Record, Idx); 8673 return TemplateArgument(Context, Value, T); 8674 } 8675 case TemplateArgument::Template: 8676 return TemplateArgument(ReadTemplateName(F, Record, Idx)); 8677 case TemplateArgument::TemplateExpansion: { 8678 TemplateName Name = ReadTemplateName(F, Record, Idx); 8679 Optional<unsigned> NumTemplateExpansions; 8680 if (unsigned NumExpansions = Record[Idx++]) 8681 NumTemplateExpansions = NumExpansions - 1; 8682 return TemplateArgument(Name, NumTemplateExpansions); 8683 } 8684 case TemplateArgument::Expression: 8685 return TemplateArgument(ReadExpr(F)); 8686 case TemplateArgument::Pack: { 8687 unsigned NumArgs = Record[Idx++]; 8688 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs]; 8689 for (unsigned I = 0; I != NumArgs; ++I) 8690 Args[I] = ReadTemplateArgument(F, Record, Idx); 8691 return TemplateArgument(llvm::makeArrayRef(Args, NumArgs)); 8692 } 8693 } 8694 8695 llvm_unreachable("Unhandled template argument kind!"); 8696 } 8697 8698 TemplateParameterList * 8699 ASTReader::ReadTemplateParameterList(ModuleFile &F, 8700 const RecordData &Record, unsigned &Idx) { 8701 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx); 8702 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx); 8703 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx); 8704 8705 unsigned NumParams = Record[Idx++]; 8706 SmallVector<NamedDecl *, 16> Params; 8707 Params.reserve(NumParams); 8708 while (NumParams--) 8709 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx)); 8710 8711 // TODO: Concepts 8712 TemplateParameterList *TemplateParams = TemplateParameterList::Create( 8713 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, nullptr); 8714 return TemplateParams; 8715 } 8716 8717 void 8718 ASTReader:: 8719 ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs, 8720 ModuleFile &F, const RecordData &Record, 8721 unsigned &Idx, bool Canonicalize) { 8722 unsigned NumTemplateArgs = Record[Idx++]; 8723 TemplArgs.reserve(NumTemplateArgs); 8724 while (NumTemplateArgs--) 8725 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx, Canonicalize)); 8726 } 8727 8728 /// \brief Read a UnresolvedSet structure. 8729 void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set, 8730 const RecordData &Record, unsigned &Idx) { 8731 unsigned NumDecls = Record[Idx++]; 8732 Set.reserve(getContext(), NumDecls); 8733 while (NumDecls--) { 8734 DeclID ID = ReadDeclID(F, Record, Idx); 8735 AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 8736 Set.addLazyDecl(getContext(), ID, AS); 8737 } 8738 } 8739 8740 CXXBaseSpecifier 8741 ASTReader::ReadCXXBaseSpecifier(ModuleFile &F, 8742 const RecordData &Record, unsigned &Idx) { 8743 bool isVirtual = static_cast<bool>(Record[Idx++]); 8744 bool isBaseOfClass = static_cast<bool>(Record[Idx++]); 8745 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]); 8746 bool inheritConstructors = static_cast<bool>(Record[Idx++]); 8747 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx); 8748 SourceRange Range = ReadSourceRange(F, Record, Idx); 8749 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx); 8750 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 8751 EllipsisLoc); 8752 Result.setInheritConstructors(inheritConstructors); 8753 return Result; 8754 } 8755 8756 CXXCtorInitializer ** 8757 ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record, 8758 unsigned &Idx) { 8759 ASTContext &Context = getContext(); 8760 unsigned NumInitializers = Record[Idx++]; 8761 assert(NumInitializers && "wrote ctor initializers but have no inits"); 8762 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers]; 8763 for (unsigned i = 0; i != NumInitializers; ++i) { 8764 TypeSourceInfo *TInfo = nullptr; 8765 bool IsBaseVirtual = false; 8766 FieldDecl *Member = nullptr; 8767 IndirectFieldDecl *IndirectMember = nullptr; 8768 8769 CtorInitializerType Type = (CtorInitializerType)Record[Idx++]; 8770 switch (Type) { 8771 case CTOR_INITIALIZER_BASE: 8772 TInfo = GetTypeSourceInfo(F, Record, Idx); 8773 IsBaseVirtual = Record[Idx++]; 8774 break; 8775 8776 case CTOR_INITIALIZER_DELEGATING: 8777 TInfo = GetTypeSourceInfo(F, Record, Idx); 8778 break; 8779 8780 case CTOR_INITIALIZER_MEMBER: 8781 Member = ReadDeclAs<FieldDecl>(F, Record, Idx); 8782 break; 8783 8784 case CTOR_INITIALIZER_INDIRECT_MEMBER: 8785 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx); 8786 break; 8787 } 8788 8789 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx); 8790 Expr *Init = ReadExpr(F); 8791 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx); 8792 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx); 8793 8794 CXXCtorInitializer *BOMInit; 8795 if (Type == CTOR_INITIALIZER_BASE) 8796 BOMInit = new (Context) 8797 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init, 8798 RParenLoc, MemberOrEllipsisLoc); 8799 else if (Type == CTOR_INITIALIZER_DELEGATING) 8800 BOMInit = new (Context) 8801 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc); 8802 else if (Member) 8803 BOMInit = new (Context) 8804 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc, 8805 Init, RParenLoc); 8806 else 8807 BOMInit = new (Context) 8808 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc, 8809 LParenLoc, Init, RParenLoc); 8810 8811 if (/*IsWritten*/Record[Idx++]) { 8812 unsigned SourceOrder = Record[Idx++]; 8813 BOMInit->setSourceOrder(SourceOrder); 8814 } 8815 8816 CtorInitializers[i] = BOMInit; 8817 } 8818 8819 return CtorInitializers; 8820 } 8821 8822 NestedNameSpecifier * 8823 ASTReader::ReadNestedNameSpecifier(ModuleFile &F, 8824 const RecordData &Record, unsigned &Idx) { 8825 ASTContext &Context = getContext(); 8826 unsigned N = Record[Idx++]; 8827 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr; 8828 for (unsigned I = 0; I != N; ++I) { 8829 NestedNameSpecifier::SpecifierKind Kind 8830 = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 8831 switch (Kind) { 8832 case NestedNameSpecifier::Identifier: { 8833 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 8834 NNS = NestedNameSpecifier::Create(Context, Prev, II); 8835 break; 8836 } 8837 8838 case NestedNameSpecifier::Namespace: { 8839 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 8840 NNS = NestedNameSpecifier::Create(Context, Prev, NS); 8841 break; 8842 } 8843 8844 case NestedNameSpecifier::NamespaceAlias: { 8845 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 8846 NNS = NestedNameSpecifier::Create(Context, Prev, Alias); 8847 break; 8848 } 8849 8850 case NestedNameSpecifier::TypeSpec: 8851 case NestedNameSpecifier::TypeSpecWithTemplate: { 8852 const Type *T = readType(F, Record, Idx).getTypePtrOrNull(); 8853 if (!T) 8854 return nullptr; 8855 8856 bool Template = Record[Idx++]; 8857 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T); 8858 break; 8859 } 8860 8861 case NestedNameSpecifier::Global: 8862 NNS = NestedNameSpecifier::GlobalSpecifier(Context); 8863 // No associated value, and there can't be a prefix. 8864 break; 8865 8866 case NestedNameSpecifier::Super: { 8867 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx); 8868 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD); 8869 break; 8870 } 8871 } 8872 Prev = NNS; 8873 } 8874 return NNS; 8875 } 8876 8877 NestedNameSpecifierLoc 8878 ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record, 8879 unsigned &Idx) { 8880 ASTContext &Context = getContext(); 8881 unsigned N = Record[Idx++]; 8882 NestedNameSpecifierLocBuilder Builder; 8883 for (unsigned I = 0; I != N; ++I) { 8884 NestedNameSpecifier::SpecifierKind Kind 8885 = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 8886 switch (Kind) { 8887 case NestedNameSpecifier::Identifier: { 8888 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 8889 SourceRange Range = ReadSourceRange(F, Record, Idx); 8890 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 8891 break; 8892 } 8893 8894 case NestedNameSpecifier::Namespace: { 8895 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 8896 SourceRange Range = ReadSourceRange(F, Record, Idx); 8897 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 8898 break; 8899 } 8900 8901 case NestedNameSpecifier::NamespaceAlias: { 8902 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 8903 SourceRange Range = ReadSourceRange(F, Record, Idx); 8904 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 8905 break; 8906 } 8907 8908 case NestedNameSpecifier::TypeSpec: 8909 case NestedNameSpecifier::TypeSpecWithTemplate: { 8910 bool Template = Record[Idx++]; 8911 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx); 8912 if (!T) 8913 return NestedNameSpecifierLoc(); 8914 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 8915 8916 // FIXME: 'template' keyword location not saved anywhere, so we fake it. 8917 Builder.Extend(Context, 8918 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 8919 T->getTypeLoc(), ColonColonLoc); 8920 break; 8921 } 8922 8923 case NestedNameSpecifier::Global: { 8924 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 8925 Builder.MakeGlobal(Context, ColonColonLoc); 8926 break; 8927 } 8928 8929 case NestedNameSpecifier::Super: { 8930 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx); 8931 SourceRange Range = ReadSourceRange(F, Record, Idx); 8932 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd()); 8933 break; 8934 } 8935 } 8936 } 8937 8938 return Builder.getWithLocInContext(Context); 8939 } 8940 8941 SourceRange 8942 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 8943 unsigned &Idx) { 8944 SourceLocation beg = ReadSourceLocation(F, Record, Idx); 8945 SourceLocation end = ReadSourceLocation(F, Record, Idx); 8946 return SourceRange(beg, end); 8947 } 8948 8949 /// \brief Read an integral value 8950 llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) { 8951 unsigned BitWidth = Record[Idx++]; 8952 unsigned NumWords = llvm::APInt::getNumWords(BitWidth); 8953 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]); 8954 Idx += NumWords; 8955 return Result; 8956 } 8957 8958 /// \brief Read a signed integral value 8959 llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) { 8960 bool isUnsigned = Record[Idx++]; 8961 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned); 8962 } 8963 8964 /// \brief Read a floating-point value 8965 llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record, 8966 const llvm::fltSemantics &Sem, 8967 unsigned &Idx) { 8968 return llvm::APFloat(Sem, ReadAPInt(Record, Idx)); 8969 } 8970 8971 // \brief Read a string 8972 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 8973 unsigned Len = Record[Idx++]; 8974 std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 8975 Idx += Len; 8976 return Result; 8977 } 8978 8979 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record, 8980 unsigned &Idx) { 8981 std::string Filename = ReadString(Record, Idx); 8982 ResolveImportedPath(F, Filename); 8983 return Filename; 8984 } 8985 8986 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 8987 unsigned &Idx) { 8988 unsigned Major = Record[Idx++]; 8989 unsigned Minor = Record[Idx++]; 8990 unsigned Subminor = Record[Idx++]; 8991 if (Minor == 0) 8992 return VersionTuple(Major); 8993 if (Subminor == 0) 8994 return VersionTuple(Major, Minor - 1); 8995 return VersionTuple(Major, Minor - 1, Subminor - 1); 8996 } 8997 8998 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 8999 const RecordData &Record, 9000 unsigned &Idx) { 9001 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 9002 return CXXTemporary::Create(getContext(), Decl); 9003 } 9004 9005 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const { 9006 return Diag(CurrentImportLoc, DiagID); 9007 } 9008 9009 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const { 9010 return Diags.Report(Loc, DiagID); 9011 } 9012 9013 /// \brief Retrieve the identifier table associated with the 9014 /// preprocessor. 9015 IdentifierTable &ASTReader::getIdentifierTable() { 9016 return PP.getIdentifierTable(); 9017 } 9018 9019 /// \brief Record that the given ID maps to the given switch-case 9020 /// statement. 9021 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 9022 assert((*CurrSwitchCaseStmts)[ID] == nullptr && 9023 "Already have a SwitchCase with this ID"); 9024 (*CurrSwitchCaseStmts)[ID] = SC; 9025 } 9026 9027 /// \brief Retrieve the switch-case statement with the given ID. 9028 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 9029 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID"); 9030 return (*CurrSwitchCaseStmts)[ID]; 9031 } 9032 9033 void ASTReader::ClearSwitchCaseIDs() { 9034 CurrSwitchCaseStmts->clear(); 9035 } 9036 9037 void ASTReader::ReadComments() { 9038 ASTContext &Context = getContext(); 9039 std::vector<RawComment *> Comments; 9040 for (SmallVectorImpl<std::pair<BitstreamCursor, 9041 serialization::ModuleFile *>>::iterator 9042 I = CommentsCursors.begin(), 9043 E = CommentsCursors.end(); 9044 I != E; ++I) { 9045 Comments.clear(); 9046 BitstreamCursor &Cursor = I->first; 9047 serialization::ModuleFile &F = *I->second; 9048 SavedStreamPosition SavedPosition(Cursor); 9049 9050 RecordData Record; 9051 while (true) { 9052 llvm::BitstreamEntry Entry = 9053 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd); 9054 9055 switch (Entry.Kind) { 9056 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 9057 case llvm::BitstreamEntry::Error: 9058 Error("malformed block record in AST file"); 9059 return; 9060 case llvm::BitstreamEntry::EndBlock: 9061 goto NextCursor; 9062 case llvm::BitstreamEntry::Record: 9063 // The interesting case. 9064 break; 9065 } 9066 9067 // Read a record. 9068 Record.clear(); 9069 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) { 9070 case COMMENTS_RAW_COMMENT: { 9071 unsigned Idx = 0; 9072 SourceRange SR = ReadSourceRange(F, Record, Idx); 9073 RawComment::CommentKind Kind = 9074 (RawComment::CommentKind) Record[Idx++]; 9075 bool IsTrailingComment = Record[Idx++]; 9076 bool IsAlmostTrailingComment = Record[Idx++]; 9077 Comments.push_back(new (Context) RawComment( 9078 SR, Kind, IsTrailingComment, IsAlmostTrailingComment)); 9079 break; 9080 } 9081 } 9082 } 9083 NextCursor: 9084 // De-serialized SourceLocations get negative FileIDs for other modules, 9085 // potentially invalidating the original order. Sort it again. 9086 llvm::sort(Comments.begin(), Comments.end(), 9087 BeforeThanCompare<RawComment>(SourceMgr)); 9088 Context.Comments.addDeserializedComments(Comments); 9089 } 9090 } 9091 9092 void ASTReader::visitInputFiles(serialization::ModuleFile &MF, 9093 bool IncludeSystem, bool Complain, 9094 llvm::function_ref<void(const serialization::InputFile &IF, 9095 bool isSystem)> Visitor) { 9096 unsigned NumUserInputs = MF.NumUserInputFiles; 9097 unsigned NumInputs = MF.InputFilesLoaded.size(); 9098 assert(NumUserInputs <= NumInputs); 9099 unsigned N = IncludeSystem ? NumInputs : NumUserInputs; 9100 for (unsigned I = 0; I < N; ++I) { 9101 bool IsSystem = I >= NumUserInputs; 9102 InputFile IF = getInputFile(MF, I+1, Complain); 9103 Visitor(IF, IsSystem); 9104 } 9105 } 9106 9107 void ASTReader::visitTopLevelModuleMaps( 9108 serialization::ModuleFile &MF, 9109 llvm::function_ref<void(const FileEntry *FE)> Visitor) { 9110 unsigned NumInputs = MF.InputFilesLoaded.size(); 9111 for (unsigned I = 0; I < NumInputs; ++I) { 9112 InputFileInfo IFI = readInputFileInfo(MF, I + 1); 9113 if (IFI.TopLevelModuleMap) 9114 // FIXME: This unnecessarily re-reads the InputFileInfo. 9115 if (auto *FE = getInputFile(MF, I + 1).getFile()) 9116 Visitor(FE); 9117 } 9118 } 9119 9120 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) { 9121 // If we know the owning module, use it. 9122 if (Module *M = D->getImportedOwningModule()) 9123 return M->getFullModuleName(); 9124 9125 // Otherwise, use the name of the top-level module the decl is within. 9126 if (ModuleFile *M = getOwningModuleFile(D)) 9127 return M->ModuleName; 9128 9129 // Not from a module. 9130 return {}; 9131 } 9132 9133 void ASTReader::finishPendingActions() { 9134 while (!PendingIdentifierInfos.empty() || 9135 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() || 9136 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || 9137 !PendingUpdateRecords.empty()) { 9138 // If any identifiers with corresponding top-level declarations have 9139 // been loaded, load those declarations now. 9140 using TopLevelDeclsMap = 9141 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>; 9142 TopLevelDeclsMap TopLevelDecls; 9143 9144 while (!PendingIdentifierInfos.empty()) { 9145 IdentifierInfo *II = PendingIdentifierInfos.back().first; 9146 SmallVector<uint32_t, 4> DeclIDs = 9147 std::move(PendingIdentifierInfos.back().second); 9148 PendingIdentifierInfos.pop_back(); 9149 9150 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 9151 } 9152 9153 // For each decl chain that we wanted to complete while deserializing, mark 9154 // it as "still needs to be completed". 9155 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) { 9156 markIncompleteDeclChain(PendingIncompleteDeclChains[I]); 9157 } 9158 PendingIncompleteDeclChains.clear(); 9159 9160 // Load pending declaration chains. 9161 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) 9162 loadPendingDeclChain(PendingDeclChains[I].first, PendingDeclChains[I].second); 9163 PendingDeclChains.clear(); 9164 9165 // Make the most recent of the top-level declarations visible. 9166 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 9167 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 9168 IdentifierInfo *II = TLD->first; 9169 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 9170 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 9171 } 9172 } 9173 9174 // Load any pending macro definitions. 9175 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 9176 IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 9177 SmallVector<PendingMacroInfo, 2> GlobalIDs; 9178 GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 9179 // Initialize the macro history from chained-PCHs ahead of module imports. 9180 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9181 ++IDIdx) { 9182 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9183 if (!Info.M->isModule()) 9184 resolvePendingMacro(II, Info); 9185 } 9186 // Handle module imports. 9187 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9188 ++IDIdx) { 9189 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9190 if (Info.M->isModule()) 9191 resolvePendingMacro(II, Info); 9192 } 9193 } 9194 PendingMacroIDs.clear(); 9195 9196 // Wire up the DeclContexts for Decls that we delayed setting until 9197 // recursive loading is completed. 9198 while (!PendingDeclContextInfos.empty()) { 9199 PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 9200 PendingDeclContextInfos.pop_front(); 9201 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 9202 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 9203 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 9204 } 9205 9206 // Perform any pending declaration updates. 9207 while (!PendingUpdateRecords.empty()) { 9208 auto Update = PendingUpdateRecords.pop_back_val(); 9209 ReadingKindTracker ReadingKind(Read_Decl, *this); 9210 loadDeclUpdateRecords(Update); 9211 } 9212 } 9213 9214 // At this point, all update records for loaded decls are in place, so any 9215 // fake class definitions should have become real. 9216 assert(PendingFakeDefinitionData.empty() && 9217 "faked up a class definition but never saw the real one"); 9218 9219 // If we deserialized any C++ or Objective-C class definitions, any 9220 // Objective-C protocol definitions, or any redeclarable templates, make sure 9221 // that all redeclarations point to the definitions. Note that this can only 9222 // happen now, after the redeclaration chains have been fully wired. 9223 for (Decl *D : PendingDefinitions) { 9224 if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 9225 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) { 9226 // Make sure that the TagType points at the definition. 9227 const_cast<TagType*>(TagT)->decl = TD; 9228 } 9229 9230 if (auto RD = dyn_cast<CXXRecordDecl>(D)) { 9231 for (auto *R = getMostRecentExistingDecl(RD); R; 9232 R = R->getPreviousDecl()) { 9233 assert((R == D) == 9234 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && 9235 "declaration thinks it's the definition but it isn't"); 9236 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData; 9237 } 9238 } 9239 9240 continue; 9241 } 9242 9243 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) { 9244 // Make sure that the ObjCInterfaceType points at the definition. 9245 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 9246 ->Decl = ID; 9247 9248 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl()) 9249 cast<ObjCInterfaceDecl>(R)->Data = ID->Data; 9250 9251 continue; 9252 } 9253 9254 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) { 9255 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl()) 9256 cast<ObjCProtocolDecl>(R)->Data = PD->Data; 9257 9258 continue; 9259 } 9260 9261 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl(); 9262 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl()) 9263 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common; 9264 } 9265 PendingDefinitions.clear(); 9266 9267 // Load the bodies of any functions or methods we've encountered. We do 9268 // this now (delayed) so that we can be sure that the declaration chains 9269 // have been fully wired up (hasBody relies on this). 9270 // FIXME: We shouldn't require complete redeclaration chains here. 9271 for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 9272 PBEnd = PendingBodies.end(); 9273 PB != PBEnd; ++PB) { 9274 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 9275 // FIXME: Check for =delete/=default? 9276 // FIXME: Complain about ODR violations here? 9277 const FunctionDecl *Defn = nullptr; 9278 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) { 9279 FD->setLazyBody(PB->second); 9280 } else { 9281 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn); 9282 mergeDefinitionVisibility(NonConstDefn, FD); 9283 9284 if (!FD->isLateTemplateParsed() && 9285 !NonConstDefn->isLateTemplateParsed() && 9286 FD->getODRHash() != NonConstDefn->getODRHash()) { 9287 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9288 } 9289 } 9290 continue; 9291 } 9292 9293 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 9294 if (!getContext().getLangOpts().Modules || !MD->hasBody()) 9295 MD->setLazyBody(PB->second); 9296 } 9297 PendingBodies.clear(); 9298 9299 // Do some cleanup. 9300 for (auto *ND : PendingMergedDefinitionsToDeduplicate) 9301 getContext().deduplicateMergedDefinitonsFor(ND); 9302 PendingMergedDefinitionsToDeduplicate.clear(); 9303 } 9304 9305 void ASTReader::diagnoseOdrViolations() { 9306 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() && 9307 PendingFunctionOdrMergeFailures.empty()) 9308 return; 9309 9310 // Trigger the import of the full definition of each class that had any 9311 // odr-merging problems, so we can produce better diagnostics for them. 9312 // These updates may in turn find and diagnose some ODR failures, so take 9313 // ownership of the set first. 9314 auto OdrMergeFailures = std::move(PendingOdrMergeFailures); 9315 PendingOdrMergeFailures.clear(); 9316 for (auto &Merge : OdrMergeFailures) { 9317 Merge.first->buildLookup(); 9318 Merge.first->decls_begin(); 9319 Merge.first->bases_begin(); 9320 Merge.first->vbases_begin(); 9321 for (auto &RecordPair : Merge.second) { 9322 auto *RD = RecordPair.first; 9323 RD->decls_begin(); 9324 RD->bases_begin(); 9325 RD->vbases_begin(); 9326 } 9327 } 9328 9329 // Trigger the import of functions. 9330 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures); 9331 PendingFunctionOdrMergeFailures.clear(); 9332 for (auto &Merge : FunctionOdrMergeFailures) { 9333 Merge.first->buildLookup(); 9334 Merge.first->decls_begin(); 9335 Merge.first->getBody(); 9336 for (auto &FD : Merge.second) { 9337 FD->buildLookup(); 9338 FD->decls_begin(); 9339 FD->getBody(); 9340 } 9341 } 9342 9343 // For each declaration from a merged context, check that the canonical 9344 // definition of that context also contains a declaration of the same 9345 // entity. 9346 // 9347 // Caution: this loop does things that might invalidate iterators into 9348 // PendingOdrMergeChecks. Don't turn this into a range-based for loop! 9349 while (!PendingOdrMergeChecks.empty()) { 9350 NamedDecl *D = PendingOdrMergeChecks.pop_back_val(); 9351 9352 // FIXME: Skip over implicit declarations for now. This matters for things 9353 // like implicitly-declared special member functions. This isn't entirely 9354 // correct; we can end up with multiple unmerged declarations of the same 9355 // implicit entity. 9356 if (D->isImplicit()) 9357 continue; 9358 9359 DeclContext *CanonDef = D->getDeclContext(); 9360 9361 bool Found = false; 9362 const Decl *DCanon = D->getCanonicalDecl(); 9363 9364 for (auto RI : D->redecls()) { 9365 if (RI->getLexicalDeclContext() == CanonDef) { 9366 Found = true; 9367 break; 9368 } 9369 } 9370 if (Found) 9371 continue; 9372 9373 // Quick check failed, time to do the slow thing. Note, we can't just 9374 // look up the name of D in CanonDef here, because the member that is 9375 // in CanonDef might not be found by name lookup (it might have been 9376 // replaced by a more recent declaration in the lookup table), and we 9377 // can't necessarily find it in the redeclaration chain because it might 9378 // be merely mergeable, not redeclarable. 9379 llvm::SmallVector<const NamedDecl*, 4> Candidates; 9380 for (auto *CanonMember : CanonDef->decls()) { 9381 if (CanonMember->getCanonicalDecl() == DCanon) { 9382 // This can happen if the declaration is merely mergeable and not 9383 // actually redeclarable (we looked for redeclarations earlier). 9384 // 9385 // FIXME: We should be able to detect this more efficiently, without 9386 // pulling in all of the members of CanonDef. 9387 Found = true; 9388 break; 9389 } 9390 if (auto *ND = dyn_cast<NamedDecl>(CanonMember)) 9391 if (ND->getDeclName() == D->getDeclName()) 9392 Candidates.push_back(ND); 9393 } 9394 9395 if (!Found) { 9396 // The AST doesn't like TagDecls becoming invalid after they've been 9397 // completed. We only really need to mark FieldDecls as invalid here. 9398 if (!isa<TagDecl>(D)) 9399 D->setInvalidDecl(); 9400 9401 // Ensure we don't accidentally recursively enter deserialization while 9402 // we're producing our diagnostic. 9403 Deserializing RecursionGuard(this); 9404 9405 std::string CanonDefModule = 9406 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef)); 9407 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl) 9408 << D << getOwningModuleNameForDiagnostic(D) 9409 << CanonDef << CanonDefModule.empty() << CanonDefModule; 9410 9411 if (Candidates.empty()) 9412 Diag(cast<Decl>(CanonDef)->getLocation(), 9413 diag::note_module_odr_violation_no_possible_decls) << D; 9414 else { 9415 for (unsigned I = 0, N = Candidates.size(); I != N; ++I) 9416 Diag(Candidates[I]->getLocation(), 9417 diag::note_module_odr_violation_possible_decl) 9418 << Candidates[I]; 9419 } 9420 9421 DiagnosedOdrMergeFailures.insert(CanonDef); 9422 } 9423 } 9424 9425 if (OdrMergeFailures.empty() && FunctionOdrMergeFailures.empty()) 9426 return; 9427 9428 // Ensure we don't accidentally recursively enter deserialization while 9429 // we're producing our diagnostics. 9430 Deserializing RecursionGuard(this); 9431 9432 // Common code for hashing helpers. 9433 ODRHash Hash; 9434 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) { 9435 Hash.clear(); 9436 Hash.AddQualType(Ty); 9437 return Hash.CalculateHash(); 9438 }; 9439 9440 auto ComputeODRHash = [&Hash](const Stmt *S) { 9441 assert(S); 9442 Hash.clear(); 9443 Hash.AddStmt(S); 9444 return Hash.CalculateHash(); 9445 }; 9446 9447 auto ComputeSubDeclODRHash = [&Hash](const Decl *D) { 9448 assert(D); 9449 Hash.clear(); 9450 Hash.AddSubDecl(D); 9451 return Hash.CalculateHash(); 9452 }; 9453 9454 auto ComputeTemplateArgumentODRHash = [&Hash](const TemplateArgument &TA) { 9455 Hash.clear(); 9456 Hash.AddTemplateArgument(TA); 9457 return Hash.CalculateHash(); 9458 }; 9459 9460 // Issue any pending ODR-failure diagnostics. 9461 for (auto &Merge : OdrMergeFailures) { 9462 // If we've already pointed out a specific problem with this class, don't 9463 // bother issuing a general "something's different" diagnostic. 9464 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 9465 continue; 9466 9467 bool Diagnosed = false; 9468 CXXRecordDecl *FirstRecord = Merge.first; 9469 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstRecord); 9470 for (auto &RecordPair : Merge.second) { 9471 CXXRecordDecl *SecondRecord = RecordPair.first; 9472 // Multiple different declarations got merged together; tell the user 9473 // where they came from. 9474 if (FirstRecord == SecondRecord) 9475 continue; 9476 9477 std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord); 9478 9479 auto *FirstDD = FirstRecord->DefinitionData; 9480 auto *SecondDD = RecordPair.second; 9481 9482 assert(FirstDD && SecondDD && "Definitions without DefinitionData"); 9483 9484 // Diagnostics from DefinitionData are emitted here. 9485 if (FirstDD != SecondDD) { 9486 enum ODRDefinitionDataDifference { 9487 NumBases, 9488 NumVBases, 9489 BaseType, 9490 BaseVirtual, 9491 BaseAccess, 9492 }; 9493 auto ODRDiagError = [FirstRecord, &FirstModule, 9494 this](SourceLocation Loc, SourceRange Range, 9495 ODRDefinitionDataDifference DiffType) { 9496 return Diag(Loc, diag::err_module_odr_violation_definition_data) 9497 << FirstRecord << FirstModule.empty() << FirstModule << Range 9498 << DiffType; 9499 }; 9500 auto ODRDiagNote = [&SecondModule, 9501 this](SourceLocation Loc, SourceRange Range, 9502 ODRDefinitionDataDifference DiffType) { 9503 return Diag(Loc, diag::note_module_odr_violation_definition_data) 9504 << SecondModule << Range << DiffType; 9505 }; 9506 9507 unsigned FirstNumBases = FirstDD->NumBases; 9508 unsigned FirstNumVBases = FirstDD->NumVBases; 9509 unsigned SecondNumBases = SecondDD->NumBases; 9510 unsigned SecondNumVBases = SecondDD->NumVBases; 9511 9512 auto GetSourceRange = [](struct CXXRecordDecl::DefinitionData *DD) { 9513 unsigned NumBases = DD->NumBases; 9514 if (NumBases == 0) return SourceRange(); 9515 auto bases = DD->bases(); 9516 return SourceRange(bases[0].getLocStart(), 9517 bases[NumBases - 1].getLocEnd()); 9518 }; 9519 9520 if (FirstNumBases != SecondNumBases) { 9521 ODRDiagError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 9522 NumBases) 9523 << FirstNumBases; 9524 ODRDiagNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 9525 NumBases) 9526 << SecondNumBases; 9527 Diagnosed = true; 9528 break; 9529 } 9530 9531 if (FirstNumVBases != SecondNumVBases) { 9532 ODRDiagError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 9533 NumVBases) 9534 << FirstNumVBases; 9535 ODRDiagNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 9536 NumVBases) 9537 << SecondNumVBases; 9538 Diagnosed = true; 9539 break; 9540 } 9541 9542 auto FirstBases = FirstDD->bases(); 9543 auto SecondBases = SecondDD->bases(); 9544 unsigned i = 0; 9545 for (i = 0; i < FirstNumBases; ++i) { 9546 auto FirstBase = FirstBases[i]; 9547 auto SecondBase = SecondBases[i]; 9548 if (ComputeQualTypeODRHash(FirstBase.getType()) != 9549 ComputeQualTypeODRHash(SecondBase.getType())) { 9550 ODRDiagError(FirstRecord->getLocation(), FirstBase.getSourceRange(), 9551 BaseType) 9552 << (i + 1) << FirstBase.getType(); 9553 ODRDiagNote(SecondRecord->getLocation(), 9554 SecondBase.getSourceRange(), BaseType) 9555 << (i + 1) << SecondBase.getType(); 9556 break; 9557 } 9558 9559 if (FirstBase.isVirtual() != SecondBase.isVirtual()) { 9560 ODRDiagError(FirstRecord->getLocation(), FirstBase.getSourceRange(), 9561 BaseVirtual) 9562 << (i + 1) << FirstBase.isVirtual() << FirstBase.getType(); 9563 ODRDiagNote(SecondRecord->getLocation(), 9564 SecondBase.getSourceRange(), BaseVirtual) 9565 << (i + 1) << SecondBase.isVirtual() << SecondBase.getType(); 9566 break; 9567 } 9568 9569 if (FirstBase.getAccessSpecifierAsWritten() != 9570 SecondBase.getAccessSpecifierAsWritten()) { 9571 ODRDiagError(FirstRecord->getLocation(), FirstBase.getSourceRange(), 9572 BaseAccess) 9573 << (i + 1) << FirstBase.getType() 9574 << (int)FirstBase.getAccessSpecifierAsWritten(); 9575 ODRDiagNote(SecondRecord->getLocation(), 9576 SecondBase.getSourceRange(), BaseAccess) 9577 << (i + 1) << SecondBase.getType() 9578 << (int)SecondBase.getAccessSpecifierAsWritten(); 9579 break; 9580 } 9581 } 9582 9583 if (i != FirstNumBases) { 9584 Diagnosed = true; 9585 break; 9586 } 9587 } 9588 9589 using DeclHashes = llvm::SmallVector<std::pair<Decl *, unsigned>, 4>; 9590 9591 const ClassTemplateDecl *FirstTemplate = 9592 FirstRecord->getDescribedClassTemplate(); 9593 const ClassTemplateDecl *SecondTemplate = 9594 SecondRecord->getDescribedClassTemplate(); 9595 9596 assert(!FirstTemplate == !SecondTemplate && 9597 "Both pointers should be null or non-null"); 9598 9599 enum ODRTemplateDifference { 9600 ParamEmptyName, 9601 ParamName, 9602 ParamSingleDefaultArgument, 9603 ParamDifferentDefaultArgument, 9604 }; 9605 9606 if (FirstTemplate && SecondTemplate) { 9607 DeclHashes FirstTemplateHashes; 9608 DeclHashes SecondTemplateHashes; 9609 9610 auto PopulateTemplateParameterHashs = 9611 [&ComputeSubDeclODRHash](DeclHashes &Hashes, 9612 const ClassTemplateDecl *TD) { 9613 for (auto *D : TD->getTemplateParameters()->asArray()) { 9614 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 9615 } 9616 }; 9617 9618 PopulateTemplateParameterHashs(FirstTemplateHashes, FirstTemplate); 9619 PopulateTemplateParameterHashs(SecondTemplateHashes, SecondTemplate); 9620 9621 assert(FirstTemplateHashes.size() == SecondTemplateHashes.size() && 9622 "Number of template parameters should be equal."); 9623 9624 auto FirstIt = FirstTemplateHashes.begin(); 9625 auto FirstEnd = FirstTemplateHashes.end(); 9626 auto SecondIt = SecondTemplateHashes.begin(); 9627 for (; FirstIt != FirstEnd; ++FirstIt, ++SecondIt) { 9628 if (FirstIt->second == SecondIt->second) 9629 continue; 9630 9631 auto ODRDiagError = [FirstRecord, &FirstModule, 9632 this](SourceLocation Loc, SourceRange Range, 9633 ODRTemplateDifference DiffType) { 9634 return Diag(Loc, diag::err_module_odr_violation_template_parameter) 9635 << FirstRecord << FirstModule.empty() << FirstModule << Range 9636 << DiffType; 9637 }; 9638 auto ODRDiagNote = [&SecondModule, 9639 this](SourceLocation Loc, SourceRange Range, 9640 ODRTemplateDifference DiffType) { 9641 return Diag(Loc, diag::note_module_odr_violation_template_parameter) 9642 << SecondModule << Range << DiffType; 9643 }; 9644 9645 const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first); 9646 const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first); 9647 9648 assert(FirstDecl->getKind() == SecondDecl->getKind() && 9649 "Parameter Decl's should be the same kind."); 9650 9651 DeclarationName FirstName = FirstDecl->getDeclName(); 9652 DeclarationName SecondName = SecondDecl->getDeclName(); 9653 9654 if (FirstName != SecondName) { 9655 const bool FirstNameEmpty = 9656 FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo(); 9657 const bool SecondNameEmpty = 9658 SecondName.isIdentifier() && !SecondName.getAsIdentifierInfo(); 9659 assert((!FirstNameEmpty || !SecondNameEmpty) && 9660 "Both template parameters cannot be unnamed."); 9661 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(), 9662 FirstNameEmpty ? ParamEmptyName : ParamName) 9663 << FirstName; 9664 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(), 9665 SecondNameEmpty ? ParamEmptyName : ParamName) 9666 << SecondName; 9667 break; 9668 } 9669 9670 switch (FirstDecl->getKind()) { 9671 default: 9672 llvm_unreachable("Invalid template parameter type."); 9673 case Decl::TemplateTypeParm: { 9674 const auto *FirstParam = cast<TemplateTypeParmDecl>(FirstDecl); 9675 const auto *SecondParam = cast<TemplateTypeParmDecl>(SecondDecl); 9676 const bool HasFirstDefaultArgument = 9677 FirstParam->hasDefaultArgument() && 9678 !FirstParam->defaultArgumentWasInherited(); 9679 const bool HasSecondDefaultArgument = 9680 SecondParam->hasDefaultArgument() && 9681 !SecondParam->defaultArgumentWasInherited(); 9682 9683 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 9684 ODRDiagError(FirstDecl->getLocation(), 9685 FirstDecl->getSourceRange(), 9686 ParamSingleDefaultArgument) 9687 << HasFirstDefaultArgument; 9688 ODRDiagNote(SecondDecl->getLocation(), 9689 SecondDecl->getSourceRange(), 9690 ParamSingleDefaultArgument) 9691 << HasSecondDefaultArgument; 9692 break; 9693 } 9694 9695 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 9696 "Expecting default arguments."); 9697 9698 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(), 9699 ParamDifferentDefaultArgument); 9700 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(), 9701 ParamDifferentDefaultArgument); 9702 9703 break; 9704 } 9705 case Decl::NonTypeTemplateParm: { 9706 const auto *FirstParam = cast<NonTypeTemplateParmDecl>(FirstDecl); 9707 const auto *SecondParam = cast<NonTypeTemplateParmDecl>(SecondDecl); 9708 const bool HasFirstDefaultArgument = 9709 FirstParam->hasDefaultArgument() && 9710 !FirstParam->defaultArgumentWasInherited(); 9711 const bool HasSecondDefaultArgument = 9712 SecondParam->hasDefaultArgument() && 9713 !SecondParam->defaultArgumentWasInherited(); 9714 9715 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 9716 ODRDiagError(FirstDecl->getLocation(), 9717 FirstDecl->getSourceRange(), 9718 ParamSingleDefaultArgument) 9719 << HasFirstDefaultArgument; 9720 ODRDiagNote(SecondDecl->getLocation(), 9721 SecondDecl->getSourceRange(), 9722 ParamSingleDefaultArgument) 9723 << HasSecondDefaultArgument; 9724 break; 9725 } 9726 9727 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 9728 "Expecting default arguments."); 9729 9730 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(), 9731 ParamDifferentDefaultArgument); 9732 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(), 9733 ParamDifferentDefaultArgument); 9734 9735 break; 9736 } 9737 case Decl::TemplateTemplateParm: { 9738 const auto *FirstParam = cast<TemplateTemplateParmDecl>(FirstDecl); 9739 const auto *SecondParam = 9740 cast<TemplateTemplateParmDecl>(SecondDecl); 9741 const bool HasFirstDefaultArgument = 9742 FirstParam->hasDefaultArgument() && 9743 !FirstParam->defaultArgumentWasInherited(); 9744 const bool HasSecondDefaultArgument = 9745 SecondParam->hasDefaultArgument() && 9746 !SecondParam->defaultArgumentWasInherited(); 9747 9748 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 9749 ODRDiagError(FirstDecl->getLocation(), 9750 FirstDecl->getSourceRange(), 9751 ParamSingleDefaultArgument) 9752 << HasFirstDefaultArgument; 9753 ODRDiagNote(SecondDecl->getLocation(), 9754 SecondDecl->getSourceRange(), 9755 ParamSingleDefaultArgument) 9756 << HasSecondDefaultArgument; 9757 break; 9758 } 9759 9760 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 9761 "Expecting default arguments."); 9762 9763 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(), 9764 ParamDifferentDefaultArgument); 9765 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(), 9766 ParamDifferentDefaultArgument); 9767 9768 break; 9769 } 9770 } 9771 9772 break; 9773 } 9774 9775 if (FirstIt != FirstEnd) { 9776 Diagnosed = true; 9777 break; 9778 } 9779 } 9780 9781 DeclHashes FirstHashes; 9782 DeclHashes SecondHashes; 9783 9784 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstRecord]( 9785 DeclHashes &Hashes, CXXRecordDecl *Record) { 9786 for (auto *D : Record->decls()) { 9787 // Due to decl merging, the first CXXRecordDecl is the parent of 9788 // Decls in both records. 9789 if (!ODRHash::isWhitelistedDecl(D, FirstRecord)) 9790 continue; 9791 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 9792 } 9793 }; 9794 PopulateHashes(FirstHashes, FirstRecord); 9795 PopulateHashes(SecondHashes, SecondRecord); 9796 9797 // Used with err_module_odr_violation_mismatch_decl and 9798 // note_module_odr_violation_mismatch_decl 9799 // This list should be the same Decl's as in ODRHash::isWhiteListedDecl 9800 enum { 9801 EndOfClass, 9802 PublicSpecifer, 9803 PrivateSpecifer, 9804 ProtectedSpecifer, 9805 StaticAssert, 9806 Field, 9807 CXXMethod, 9808 TypeAlias, 9809 TypeDef, 9810 Var, 9811 Friend, 9812 Other 9813 } FirstDiffType = Other, 9814 SecondDiffType = Other; 9815 9816 auto DifferenceSelector = [](Decl *D) { 9817 assert(D && "valid Decl required"); 9818 switch (D->getKind()) { 9819 default: 9820 return Other; 9821 case Decl::AccessSpec: 9822 switch (D->getAccess()) { 9823 case AS_public: 9824 return PublicSpecifer; 9825 case AS_private: 9826 return PrivateSpecifer; 9827 case AS_protected: 9828 return ProtectedSpecifer; 9829 case AS_none: 9830 break; 9831 } 9832 llvm_unreachable("Invalid access specifier"); 9833 case Decl::StaticAssert: 9834 return StaticAssert; 9835 case Decl::Field: 9836 return Field; 9837 case Decl::CXXMethod: 9838 case Decl::CXXConstructor: 9839 case Decl::CXXDestructor: 9840 return CXXMethod; 9841 case Decl::TypeAlias: 9842 return TypeAlias; 9843 case Decl::Typedef: 9844 return TypeDef; 9845 case Decl::Var: 9846 return Var; 9847 case Decl::Friend: 9848 return Friend; 9849 } 9850 }; 9851 9852 Decl *FirstDecl = nullptr; 9853 Decl *SecondDecl = nullptr; 9854 auto FirstIt = FirstHashes.begin(); 9855 auto SecondIt = SecondHashes.begin(); 9856 9857 // If there is a diagnoseable difference, FirstDiffType and 9858 // SecondDiffType will not be Other and FirstDecl and SecondDecl will be 9859 // filled in if not EndOfClass. 9860 while (FirstIt != FirstHashes.end() || SecondIt != SecondHashes.end()) { 9861 if (FirstIt != FirstHashes.end() && SecondIt != SecondHashes.end() && 9862 FirstIt->second == SecondIt->second) { 9863 ++FirstIt; 9864 ++SecondIt; 9865 continue; 9866 } 9867 9868 FirstDecl = FirstIt == FirstHashes.end() ? nullptr : FirstIt->first; 9869 SecondDecl = SecondIt == SecondHashes.end() ? nullptr : SecondIt->first; 9870 9871 FirstDiffType = FirstDecl ? DifferenceSelector(FirstDecl) : EndOfClass; 9872 SecondDiffType = 9873 SecondDecl ? DifferenceSelector(SecondDecl) : EndOfClass; 9874 9875 break; 9876 } 9877 9878 if (FirstDiffType == Other || SecondDiffType == Other) { 9879 // Reaching this point means an unexpected Decl was encountered 9880 // or no difference was detected. This causes a generic error 9881 // message to be emitted. 9882 Diag(FirstRecord->getLocation(), 9883 diag::err_module_odr_violation_different_definitions) 9884 << FirstRecord << FirstModule.empty() << FirstModule; 9885 9886 if (FirstDecl) { 9887 Diag(FirstDecl->getLocation(), diag::note_first_module_difference) 9888 << FirstRecord << FirstDecl->getSourceRange(); 9889 } 9890 9891 Diag(SecondRecord->getLocation(), 9892 diag::note_module_odr_violation_different_definitions) 9893 << SecondModule; 9894 9895 if (SecondDecl) { 9896 Diag(SecondDecl->getLocation(), diag::note_second_module_difference) 9897 << SecondDecl->getSourceRange(); 9898 } 9899 9900 Diagnosed = true; 9901 break; 9902 } 9903 9904 if (FirstDiffType != SecondDiffType) { 9905 SourceLocation FirstLoc; 9906 SourceRange FirstRange; 9907 if (FirstDiffType == EndOfClass) { 9908 FirstLoc = FirstRecord->getBraceRange().getEnd(); 9909 } else { 9910 FirstLoc = FirstIt->first->getLocation(); 9911 FirstRange = FirstIt->first->getSourceRange(); 9912 } 9913 Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl) 9914 << FirstRecord << FirstModule.empty() << FirstModule << FirstRange 9915 << FirstDiffType; 9916 9917 SourceLocation SecondLoc; 9918 SourceRange SecondRange; 9919 if (SecondDiffType == EndOfClass) { 9920 SecondLoc = SecondRecord->getBraceRange().getEnd(); 9921 } else { 9922 SecondLoc = SecondDecl->getLocation(); 9923 SecondRange = SecondDecl->getSourceRange(); 9924 } 9925 Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl) 9926 << SecondModule << SecondRange << SecondDiffType; 9927 Diagnosed = true; 9928 break; 9929 } 9930 9931 assert(FirstDiffType == SecondDiffType); 9932 9933 // Used with err_module_odr_violation_mismatch_decl_diff and 9934 // note_module_odr_violation_mismatch_decl_diff 9935 enum ODRDeclDifference{ 9936 StaticAssertCondition, 9937 StaticAssertMessage, 9938 StaticAssertOnlyMessage, 9939 FieldName, 9940 FieldTypeName, 9941 FieldSingleBitField, 9942 FieldDifferentWidthBitField, 9943 FieldSingleMutable, 9944 FieldSingleInitializer, 9945 FieldDifferentInitializers, 9946 MethodName, 9947 MethodDeleted, 9948 MethodVirtual, 9949 MethodStatic, 9950 MethodVolatile, 9951 MethodConst, 9952 MethodInline, 9953 MethodNumberParameters, 9954 MethodParameterType, 9955 MethodParameterName, 9956 MethodParameterSingleDefaultArgument, 9957 MethodParameterDifferentDefaultArgument, 9958 MethodNoTemplateArguments, 9959 MethodDifferentNumberTemplateArguments, 9960 MethodDifferentTemplateArgument, 9961 TypedefName, 9962 TypedefType, 9963 VarName, 9964 VarType, 9965 VarSingleInitializer, 9966 VarDifferentInitializer, 9967 VarConstexpr, 9968 FriendTypeFunction, 9969 FriendType, 9970 FriendFunction, 9971 }; 9972 9973 // These lambdas have the common portions of the ODR diagnostics. This 9974 // has the same return as Diag(), so addition parameters can be passed 9975 // in with operator<< 9976 auto ODRDiagError = [FirstRecord, &FirstModule, this]( 9977 SourceLocation Loc, SourceRange Range, ODRDeclDifference DiffType) { 9978 return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff) 9979 << FirstRecord << FirstModule.empty() << FirstModule << Range 9980 << DiffType; 9981 }; 9982 auto ODRDiagNote = [&SecondModule, this]( 9983 SourceLocation Loc, SourceRange Range, ODRDeclDifference DiffType) { 9984 return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff) 9985 << SecondModule << Range << DiffType; 9986 }; 9987 9988 switch (FirstDiffType) { 9989 case Other: 9990 case EndOfClass: 9991 case PublicSpecifer: 9992 case PrivateSpecifer: 9993 case ProtectedSpecifer: 9994 llvm_unreachable("Invalid diff type"); 9995 9996 case StaticAssert: { 9997 StaticAssertDecl *FirstSA = cast<StaticAssertDecl>(FirstDecl); 9998 StaticAssertDecl *SecondSA = cast<StaticAssertDecl>(SecondDecl); 9999 10000 Expr *FirstExpr = FirstSA->getAssertExpr(); 10001 Expr *SecondExpr = SecondSA->getAssertExpr(); 10002 unsigned FirstODRHash = ComputeODRHash(FirstExpr); 10003 unsigned SecondODRHash = ComputeODRHash(SecondExpr); 10004 if (FirstODRHash != SecondODRHash) { 10005 ODRDiagError(FirstExpr->getLocStart(), FirstExpr->getSourceRange(), 10006 StaticAssertCondition); 10007 ODRDiagNote(SecondExpr->getLocStart(), 10008 SecondExpr->getSourceRange(), StaticAssertCondition); 10009 Diagnosed = true; 10010 break; 10011 } 10012 10013 StringLiteral *FirstStr = FirstSA->getMessage(); 10014 StringLiteral *SecondStr = SecondSA->getMessage(); 10015 assert((FirstStr || SecondStr) && "Both messages cannot be empty"); 10016 if ((FirstStr && !SecondStr) || (!FirstStr && SecondStr)) { 10017 SourceLocation FirstLoc, SecondLoc; 10018 SourceRange FirstRange, SecondRange; 10019 if (FirstStr) { 10020 FirstLoc = FirstStr->getLocStart(); 10021 FirstRange = FirstStr->getSourceRange(); 10022 } else { 10023 FirstLoc = FirstSA->getLocStart(); 10024 FirstRange = FirstSA->getSourceRange(); 10025 } 10026 if (SecondStr) { 10027 SecondLoc = SecondStr->getLocStart(); 10028 SecondRange = SecondStr->getSourceRange(); 10029 } else { 10030 SecondLoc = SecondSA->getLocStart(); 10031 SecondRange = SecondSA->getSourceRange(); 10032 } 10033 ODRDiagError(FirstLoc, FirstRange, StaticAssertOnlyMessage) 10034 << (FirstStr == nullptr); 10035 ODRDiagNote(SecondLoc, SecondRange, StaticAssertOnlyMessage) 10036 << (SecondStr == nullptr); 10037 Diagnosed = true; 10038 break; 10039 } 10040 10041 if (FirstStr && SecondStr && 10042 FirstStr->getString() != SecondStr->getString()) { 10043 ODRDiagError(FirstStr->getLocStart(), FirstStr->getSourceRange(), 10044 StaticAssertMessage); 10045 ODRDiagNote(SecondStr->getLocStart(), SecondStr->getSourceRange(), 10046 StaticAssertMessage); 10047 Diagnosed = true; 10048 break; 10049 } 10050 break; 10051 } 10052 case Field: { 10053 FieldDecl *FirstField = cast<FieldDecl>(FirstDecl); 10054 FieldDecl *SecondField = cast<FieldDecl>(SecondDecl); 10055 IdentifierInfo *FirstII = FirstField->getIdentifier(); 10056 IdentifierInfo *SecondII = SecondField->getIdentifier(); 10057 if (FirstII->getName() != SecondII->getName()) { 10058 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), 10059 FieldName) 10060 << FirstII; 10061 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), 10062 FieldName) 10063 << SecondII; 10064 10065 Diagnosed = true; 10066 break; 10067 } 10068 10069 assert(getContext().hasSameType(FirstField->getType(), 10070 SecondField->getType())); 10071 10072 QualType FirstType = FirstField->getType(); 10073 QualType SecondType = SecondField->getType(); 10074 if (ComputeQualTypeODRHash(FirstType) != 10075 ComputeQualTypeODRHash(SecondType)) { 10076 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), 10077 FieldTypeName) 10078 << FirstII << FirstType; 10079 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), 10080 FieldTypeName) 10081 << SecondII << SecondType; 10082 10083 Diagnosed = true; 10084 break; 10085 } 10086 10087 const bool IsFirstBitField = FirstField->isBitField(); 10088 const bool IsSecondBitField = SecondField->isBitField(); 10089 if (IsFirstBitField != IsSecondBitField) { 10090 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), 10091 FieldSingleBitField) 10092 << FirstII << IsFirstBitField; 10093 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), 10094 FieldSingleBitField) 10095 << SecondII << IsSecondBitField; 10096 Diagnosed = true; 10097 break; 10098 } 10099 10100 if (IsFirstBitField && IsSecondBitField) { 10101 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), 10102 FieldDifferentWidthBitField) 10103 << FirstII << FirstField->getBitWidth()->getSourceRange(); 10104 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), 10105 FieldDifferentWidthBitField) 10106 << SecondII << SecondField->getBitWidth()->getSourceRange(); 10107 Diagnosed = true; 10108 break; 10109 } 10110 10111 const bool IsFirstMutable = FirstField->isMutable(); 10112 const bool IsSecondMutable = SecondField->isMutable(); 10113 if (IsFirstMutable != IsSecondMutable) { 10114 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), 10115 FieldSingleMutable) 10116 << FirstII << IsFirstMutable; 10117 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), 10118 FieldSingleMutable) 10119 << SecondII << IsSecondMutable; 10120 Diagnosed = true; 10121 break; 10122 } 10123 10124 const Expr *FirstInitializer = FirstField->getInClassInitializer(); 10125 const Expr *SecondInitializer = SecondField->getInClassInitializer(); 10126 if ((!FirstInitializer && SecondInitializer) || 10127 (FirstInitializer && !SecondInitializer)) { 10128 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), 10129 FieldSingleInitializer) 10130 << FirstII << (FirstInitializer != nullptr); 10131 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), 10132 FieldSingleInitializer) 10133 << SecondII << (SecondInitializer != nullptr); 10134 Diagnosed = true; 10135 break; 10136 } 10137 10138 if (FirstInitializer && SecondInitializer) { 10139 unsigned FirstInitHash = ComputeODRHash(FirstInitializer); 10140 unsigned SecondInitHash = ComputeODRHash(SecondInitializer); 10141 if (FirstInitHash != SecondInitHash) { 10142 ODRDiagError(FirstField->getLocation(), 10143 FirstField->getSourceRange(), 10144 FieldDifferentInitializers) 10145 << FirstII << FirstInitializer->getSourceRange(); 10146 ODRDiagNote(SecondField->getLocation(), 10147 SecondField->getSourceRange(), 10148 FieldDifferentInitializers) 10149 << SecondII << SecondInitializer->getSourceRange(); 10150 Diagnosed = true; 10151 break; 10152 } 10153 } 10154 10155 break; 10156 } 10157 case CXXMethod: { 10158 enum { 10159 DiagMethod, 10160 DiagConstructor, 10161 DiagDestructor, 10162 } FirstMethodType, 10163 SecondMethodType; 10164 auto GetMethodTypeForDiagnostics = [](const CXXMethodDecl* D) { 10165 if (isa<CXXConstructorDecl>(D)) return DiagConstructor; 10166 if (isa<CXXDestructorDecl>(D)) return DiagDestructor; 10167 return DiagMethod; 10168 }; 10169 const CXXMethodDecl *FirstMethod = cast<CXXMethodDecl>(FirstDecl); 10170 const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl); 10171 FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod); 10172 SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod); 10173 auto FirstName = FirstMethod->getDeclName(); 10174 auto SecondName = SecondMethod->getDeclName(); 10175 if (FirstMethodType != SecondMethodType || FirstName != SecondName) { 10176 ODRDiagError(FirstMethod->getLocation(), 10177 FirstMethod->getSourceRange(), MethodName) 10178 << FirstMethodType << FirstName; 10179 ODRDiagNote(SecondMethod->getLocation(), 10180 SecondMethod->getSourceRange(), MethodName) 10181 << SecondMethodType << SecondName; 10182 10183 Diagnosed = true; 10184 break; 10185 } 10186 10187 const bool FirstDeleted = FirstMethod->isDeleted(); 10188 const bool SecondDeleted = SecondMethod->isDeleted(); 10189 if (FirstDeleted != SecondDeleted) { 10190 ODRDiagError(FirstMethod->getLocation(), 10191 FirstMethod->getSourceRange(), MethodDeleted) 10192 << FirstMethodType << FirstName << FirstDeleted; 10193 10194 ODRDiagNote(SecondMethod->getLocation(), 10195 SecondMethod->getSourceRange(), MethodDeleted) 10196 << SecondMethodType << SecondName << SecondDeleted; 10197 Diagnosed = true; 10198 break; 10199 } 10200 10201 const bool FirstVirtual = FirstMethod->isVirtualAsWritten(); 10202 const bool SecondVirtual = SecondMethod->isVirtualAsWritten(); 10203 const bool FirstPure = FirstMethod->isPure(); 10204 const bool SecondPure = SecondMethod->isPure(); 10205 if ((FirstVirtual || SecondVirtual) && 10206 (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) { 10207 ODRDiagError(FirstMethod->getLocation(), 10208 FirstMethod->getSourceRange(), MethodVirtual) 10209 << FirstMethodType << FirstName << FirstPure << FirstVirtual; 10210 ODRDiagNote(SecondMethod->getLocation(), 10211 SecondMethod->getSourceRange(), MethodVirtual) 10212 << SecondMethodType << SecondName << SecondPure << SecondVirtual; 10213 Diagnosed = true; 10214 break; 10215 } 10216 10217 // CXXMethodDecl::isStatic uses the canonical Decl. With Decl merging, 10218 // FirstDecl is the canonical Decl of SecondDecl, so the storage 10219 // class needs to be checked instead. 10220 const auto FirstStorage = FirstMethod->getStorageClass(); 10221 const auto SecondStorage = SecondMethod->getStorageClass(); 10222 const bool FirstStatic = FirstStorage == SC_Static; 10223 const bool SecondStatic = SecondStorage == SC_Static; 10224 if (FirstStatic != SecondStatic) { 10225 ODRDiagError(FirstMethod->getLocation(), 10226 FirstMethod->getSourceRange(), MethodStatic) 10227 << FirstMethodType << FirstName << FirstStatic; 10228 ODRDiagNote(SecondMethod->getLocation(), 10229 SecondMethod->getSourceRange(), MethodStatic) 10230 << SecondMethodType << SecondName << SecondStatic; 10231 Diagnosed = true; 10232 break; 10233 } 10234 10235 const bool FirstVolatile = FirstMethod->isVolatile(); 10236 const bool SecondVolatile = SecondMethod->isVolatile(); 10237 if (FirstVolatile != SecondVolatile) { 10238 ODRDiagError(FirstMethod->getLocation(), 10239 FirstMethod->getSourceRange(), MethodVolatile) 10240 << FirstMethodType << FirstName << FirstVolatile; 10241 ODRDiagNote(SecondMethod->getLocation(), 10242 SecondMethod->getSourceRange(), MethodVolatile) 10243 << SecondMethodType << SecondName << SecondVolatile; 10244 Diagnosed = true; 10245 break; 10246 } 10247 10248 const bool FirstConst = FirstMethod->isConst(); 10249 const bool SecondConst = SecondMethod->isConst(); 10250 if (FirstConst != SecondConst) { 10251 ODRDiagError(FirstMethod->getLocation(), 10252 FirstMethod->getSourceRange(), MethodConst) 10253 << FirstMethodType << FirstName << FirstConst; 10254 ODRDiagNote(SecondMethod->getLocation(), 10255 SecondMethod->getSourceRange(), MethodConst) 10256 << SecondMethodType << SecondName << SecondConst; 10257 Diagnosed = true; 10258 break; 10259 } 10260 10261 const bool FirstInline = FirstMethod->isInlineSpecified(); 10262 const bool SecondInline = SecondMethod->isInlineSpecified(); 10263 if (FirstInline != SecondInline) { 10264 ODRDiagError(FirstMethod->getLocation(), 10265 FirstMethod->getSourceRange(), MethodInline) 10266 << FirstMethodType << FirstName << FirstInline; 10267 ODRDiagNote(SecondMethod->getLocation(), 10268 SecondMethod->getSourceRange(), MethodInline) 10269 << SecondMethodType << SecondName << SecondInline; 10270 Diagnosed = true; 10271 break; 10272 } 10273 10274 const unsigned FirstNumParameters = FirstMethod->param_size(); 10275 const unsigned SecondNumParameters = SecondMethod->param_size(); 10276 if (FirstNumParameters != SecondNumParameters) { 10277 ODRDiagError(FirstMethod->getLocation(), 10278 FirstMethod->getSourceRange(), MethodNumberParameters) 10279 << FirstMethodType << FirstName << FirstNumParameters; 10280 ODRDiagNote(SecondMethod->getLocation(), 10281 SecondMethod->getSourceRange(), MethodNumberParameters) 10282 << SecondMethodType << SecondName << SecondNumParameters; 10283 Diagnosed = true; 10284 break; 10285 } 10286 10287 // Need this status boolean to know when break out of the switch. 10288 bool ParameterMismatch = false; 10289 for (unsigned I = 0; I < FirstNumParameters; ++I) { 10290 const ParmVarDecl *FirstParam = FirstMethod->getParamDecl(I); 10291 const ParmVarDecl *SecondParam = SecondMethod->getParamDecl(I); 10292 10293 QualType FirstParamType = FirstParam->getType(); 10294 QualType SecondParamType = SecondParam->getType(); 10295 if (FirstParamType != SecondParamType && 10296 ComputeQualTypeODRHash(FirstParamType) != 10297 ComputeQualTypeODRHash(SecondParamType)) { 10298 if (const DecayedType *ParamDecayedType = 10299 FirstParamType->getAs<DecayedType>()) { 10300 ODRDiagError(FirstMethod->getLocation(), 10301 FirstMethod->getSourceRange(), MethodParameterType) 10302 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10303 << true << ParamDecayedType->getOriginalType(); 10304 } else { 10305 ODRDiagError(FirstMethod->getLocation(), 10306 FirstMethod->getSourceRange(), MethodParameterType) 10307 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10308 << false; 10309 } 10310 10311 if (const DecayedType *ParamDecayedType = 10312 SecondParamType->getAs<DecayedType>()) { 10313 ODRDiagNote(SecondMethod->getLocation(), 10314 SecondMethod->getSourceRange(), MethodParameterType) 10315 << SecondMethodType << SecondName << (I + 1) 10316 << SecondParamType << true 10317 << ParamDecayedType->getOriginalType(); 10318 } else { 10319 ODRDiagNote(SecondMethod->getLocation(), 10320 SecondMethod->getSourceRange(), MethodParameterType) 10321 << SecondMethodType << SecondName << (I + 1) 10322 << SecondParamType << false; 10323 } 10324 ParameterMismatch = true; 10325 break; 10326 } 10327 10328 DeclarationName FirstParamName = FirstParam->getDeclName(); 10329 DeclarationName SecondParamName = SecondParam->getDeclName(); 10330 if (FirstParamName != SecondParamName) { 10331 ODRDiagError(FirstMethod->getLocation(), 10332 FirstMethod->getSourceRange(), MethodParameterName) 10333 << FirstMethodType << FirstName << (I + 1) << FirstParamName; 10334 ODRDiagNote(SecondMethod->getLocation(), 10335 SecondMethod->getSourceRange(), MethodParameterName) 10336 << SecondMethodType << SecondName << (I + 1) << SecondParamName; 10337 ParameterMismatch = true; 10338 break; 10339 } 10340 10341 const Expr *FirstInit = FirstParam->getInit(); 10342 const Expr *SecondInit = SecondParam->getInit(); 10343 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 10344 ODRDiagError(FirstMethod->getLocation(), 10345 FirstMethod->getSourceRange(), 10346 MethodParameterSingleDefaultArgument) 10347 << FirstMethodType << FirstName << (I + 1) 10348 << (FirstInit == nullptr) 10349 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 10350 ODRDiagNote(SecondMethod->getLocation(), 10351 SecondMethod->getSourceRange(), 10352 MethodParameterSingleDefaultArgument) 10353 << SecondMethodType << SecondName << (I + 1) 10354 << (SecondInit == nullptr) 10355 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 10356 ParameterMismatch = true; 10357 break; 10358 } 10359 10360 if (FirstInit && SecondInit && 10361 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 10362 ODRDiagError(FirstMethod->getLocation(), 10363 FirstMethod->getSourceRange(), 10364 MethodParameterDifferentDefaultArgument) 10365 << FirstMethodType << FirstName << (I + 1) 10366 << FirstInit->getSourceRange(); 10367 ODRDiagNote(SecondMethod->getLocation(), 10368 SecondMethod->getSourceRange(), 10369 MethodParameterDifferentDefaultArgument) 10370 << SecondMethodType << SecondName << (I + 1) 10371 << SecondInit->getSourceRange(); 10372 ParameterMismatch = true; 10373 break; 10374 10375 } 10376 } 10377 10378 if (ParameterMismatch) { 10379 Diagnosed = true; 10380 break; 10381 } 10382 10383 const auto *FirstTemplateArgs = 10384 FirstMethod->getTemplateSpecializationArgs(); 10385 const auto *SecondTemplateArgs = 10386 SecondMethod->getTemplateSpecializationArgs(); 10387 10388 if ((FirstTemplateArgs && !SecondTemplateArgs) || 10389 (!FirstTemplateArgs && SecondTemplateArgs)) { 10390 ODRDiagError(FirstMethod->getLocation(), 10391 FirstMethod->getSourceRange(), MethodNoTemplateArguments) 10392 << FirstMethodType << FirstName << (FirstTemplateArgs != nullptr); 10393 ODRDiagNote(SecondMethod->getLocation(), 10394 SecondMethod->getSourceRange(), MethodNoTemplateArguments) 10395 << SecondMethodType << SecondName 10396 << (SecondTemplateArgs != nullptr); 10397 10398 Diagnosed = true; 10399 break; 10400 } 10401 10402 if (FirstTemplateArgs && SecondTemplateArgs) { 10403 // Remove pack expansions from argument list. 10404 auto ExpandTemplateArgumentList = 10405 [](const TemplateArgumentList *TAL) { 10406 llvm::SmallVector<const TemplateArgument *, 8> ExpandedList; 10407 for (const TemplateArgument &TA : TAL->asArray()) { 10408 if (TA.getKind() != TemplateArgument::Pack) { 10409 ExpandedList.push_back(&TA); 10410 continue; 10411 } 10412 for (const TemplateArgument &PackTA : TA.getPackAsArray()) { 10413 ExpandedList.push_back(&PackTA); 10414 } 10415 } 10416 return ExpandedList; 10417 }; 10418 llvm::SmallVector<const TemplateArgument *, 8> FirstExpandedList = 10419 ExpandTemplateArgumentList(FirstTemplateArgs); 10420 llvm::SmallVector<const TemplateArgument *, 8> SecondExpandedList = 10421 ExpandTemplateArgumentList(SecondTemplateArgs); 10422 10423 if (FirstExpandedList.size() != SecondExpandedList.size()) { 10424 ODRDiagError(FirstMethod->getLocation(), 10425 FirstMethod->getSourceRange(), 10426 MethodDifferentNumberTemplateArguments) 10427 << FirstMethodType << FirstName 10428 << (unsigned)FirstExpandedList.size(); 10429 ODRDiagNote(SecondMethod->getLocation(), 10430 SecondMethod->getSourceRange(), 10431 MethodDifferentNumberTemplateArguments) 10432 << SecondMethodType << SecondName 10433 << (unsigned)SecondExpandedList.size(); 10434 10435 Diagnosed = true; 10436 break; 10437 } 10438 10439 bool TemplateArgumentMismatch = false; 10440 for (unsigned i = 0, e = FirstExpandedList.size(); i != e; ++i) { 10441 const TemplateArgument &FirstTA = *FirstExpandedList[i], 10442 &SecondTA = *SecondExpandedList[i]; 10443 if (ComputeTemplateArgumentODRHash(FirstTA) == 10444 ComputeTemplateArgumentODRHash(SecondTA)) { 10445 continue; 10446 } 10447 10448 ODRDiagError(FirstMethod->getLocation(), 10449 FirstMethod->getSourceRange(), 10450 MethodDifferentTemplateArgument) 10451 << FirstMethodType << FirstName << FirstTA << i + 1; 10452 ODRDiagNote(SecondMethod->getLocation(), 10453 SecondMethod->getSourceRange(), 10454 MethodDifferentTemplateArgument) 10455 << SecondMethodType << SecondName << SecondTA << i + 1; 10456 10457 TemplateArgumentMismatch = true; 10458 break; 10459 } 10460 10461 if (TemplateArgumentMismatch) { 10462 Diagnosed = true; 10463 break; 10464 } 10465 } 10466 break; 10467 } 10468 case TypeAlias: 10469 case TypeDef: { 10470 TypedefNameDecl *FirstTD = cast<TypedefNameDecl>(FirstDecl); 10471 TypedefNameDecl *SecondTD = cast<TypedefNameDecl>(SecondDecl); 10472 auto FirstName = FirstTD->getDeclName(); 10473 auto SecondName = SecondTD->getDeclName(); 10474 if (FirstName != SecondName) { 10475 ODRDiagError(FirstTD->getLocation(), FirstTD->getSourceRange(), 10476 TypedefName) 10477 << (FirstDiffType == TypeAlias) << FirstName; 10478 ODRDiagNote(SecondTD->getLocation(), SecondTD->getSourceRange(), 10479 TypedefName) 10480 << (FirstDiffType == TypeAlias) << SecondName; 10481 Diagnosed = true; 10482 break; 10483 } 10484 10485 QualType FirstType = FirstTD->getUnderlyingType(); 10486 QualType SecondType = SecondTD->getUnderlyingType(); 10487 if (ComputeQualTypeODRHash(FirstType) != 10488 ComputeQualTypeODRHash(SecondType)) { 10489 ODRDiagError(FirstTD->getLocation(), FirstTD->getSourceRange(), 10490 TypedefType) 10491 << (FirstDiffType == TypeAlias) << FirstName << FirstType; 10492 ODRDiagNote(SecondTD->getLocation(), SecondTD->getSourceRange(), 10493 TypedefType) 10494 << (FirstDiffType == TypeAlias) << SecondName << SecondType; 10495 Diagnosed = true; 10496 break; 10497 } 10498 break; 10499 } 10500 case Var: { 10501 VarDecl *FirstVD = cast<VarDecl>(FirstDecl); 10502 VarDecl *SecondVD = cast<VarDecl>(SecondDecl); 10503 auto FirstName = FirstVD->getDeclName(); 10504 auto SecondName = SecondVD->getDeclName(); 10505 if (FirstName != SecondName) { 10506 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(), 10507 VarName) 10508 << FirstName; 10509 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(), 10510 VarName) 10511 << SecondName; 10512 Diagnosed = true; 10513 break; 10514 } 10515 10516 QualType FirstType = FirstVD->getType(); 10517 QualType SecondType = SecondVD->getType(); 10518 if (ComputeQualTypeODRHash(FirstType) != 10519 ComputeQualTypeODRHash(SecondType)) { 10520 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(), 10521 VarType) 10522 << FirstName << FirstType; 10523 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(), 10524 VarType) 10525 << SecondName << SecondType; 10526 Diagnosed = true; 10527 break; 10528 } 10529 10530 const Expr *FirstInit = FirstVD->getInit(); 10531 const Expr *SecondInit = SecondVD->getInit(); 10532 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 10533 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(), 10534 VarSingleInitializer) 10535 << FirstName << (FirstInit == nullptr) 10536 << (FirstInit ? FirstInit->getSourceRange(): SourceRange()); 10537 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(), 10538 VarSingleInitializer) 10539 << SecondName << (SecondInit == nullptr) 10540 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 10541 Diagnosed = true; 10542 break; 10543 } 10544 10545 if (FirstInit && SecondInit && 10546 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 10547 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(), 10548 VarDifferentInitializer) 10549 << FirstName << FirstInit->getSourceRange(); 10550 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(), 10551 VarDifferentInitializer) 10552 << SecondName << SecondInit->getSourceRange(); 10553 Diagnosed = true; 10554 break; 10555 } 10556 10557 const bool FirstIsConstexpr = FirstVD->isConstexpr(); 10558 const bool SecondIsConstexpr = SecondVD->isConstexpr(); 10559 if (FirstIsConstexpr != SecondIsConstexpr) { 10560 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(), 10561 VarConstexpr) 10562 << FirstName << FirstIsConstexpr; 10563 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(), 10564 VarConstexpr) 10565 << SecondName << SecondIsConstexpr; 10566 Diagnosed = true; 10567 break; 10568 } 10569 break; 10570 } 10571 case Friend: { 10572 FriendDecl *FirstFriend = cast<FriendDecl>(FirstDecl); 10573 FriendDecl *SecondFriend = cast<FriendDecl>(SecondDecl); 10574 10575 NamedDecl *FirstND = FirstFriend->getFriendDecl(); 10576 NamedDecl *SecondND = SecondFriend->getFriendDecl(); 10577 10578 TypeSourceInfo *FirstTSI = FirstFriend->getFriendType(); 10579 TypeSourceInfo *SecondTSI = SecondFriend->getFriendType(); 10580 10581 if (FirstND && SecondND) { 10582 ODRDiagError(FirstFriend->getFriendLoc(), 10583 FirstFriend->getSourceRange(), FriendFunction) 10584 << FirstND; 10585 ODRDiagNote(SecondFriend->getFriendLoc(), 10586 SecondFriend->getSourceRange(), FriendFunction) 10587 << SecondND; 10588 10589 Diagnosed = true; 10590 break; 10591 } 10592 10593 if (FirstTSI && SecondTSI) { 10594 QualType FirstFriendType = FirstTSI->getType(); 10595 QualType SecondFriendType = SecondTSI->getType(); 10596 assert(ComputeQualTypeODRHash(FirstFriendType) != 10597 ComputeQualTypeODRHash(SecondFriendType)); 10598 ODRDiagError(FirstFriend->getFriendLoc(), 10599 FirstFriend->getSourceRange(), FriendType) 10600 << FirstFriendType; 10601 ODRDiagNote(SecondFriend->getFriendLoc(), 10602 SecondFriend->getSourceRange(), FriendType) 10603 << SecondFriendType; 10604 Diagnosed = true; 10605 break; 10606 } 10607 10608 ODRDiagError(FirstFriend->getFriendLoc(), FirstFriend->getSourceRange(), 10609 FriendTypeFunction) 10610 << (FirstTSI == nullptr); 10611 ODRDiagNote(SecondFriend->getFriendLoc(), 10612 SecondFriend->getSourceRange(), FriendTypeFunction) 10613 << (SecondTSI == nullptr); 10614 10615 Diagnosed = true; 10616 break; 10617 } 10618 } 10619 10620 if (Diagnosed) 10621 continue; 10622 10623 Diag(FirstDecl->getLocation(), 10624 diag::err_module_odr_violation_mismatch_decl_unknown) 10625 << FirstRecord << FirstModule.empty() << FirstModule << FirstDiffType 10626 << FirstDecl->getSourceRange(); 10627 Diag(SecondDecl->getLocation(), 10628 diag::note_module_odr_violation_mismatch_decl_unknown) 10629 << SecondModule << FirstDiffType << SecondDecl->getSourceRange(); 10630 Diagnosed = true; 10631 } 10632 10633 if (!Diagnosed) { 10634 // All definitions are updates to the same declaration. This happens if a 10635 // module instantiates the declaration of a class template specialization 10636 // and two or more other modules instantiate its definition. 10637 // 10638 // FIXME: Indicate which modules had instantiations of this definition. 10639 // FIXME: How can this even happen? 10640 Diag(Merge.first->getLocation(), 10641 diag::err_module_odr_violation_different_instantiations) 10642 << Merge.first; 10643 } 10644 } 10645 10646 // Issue ODR failures diagnostics for functions. 10647 for (auto &Merge : FunctionOdrMergeFailures) { 10648 enum ODRFunctionDifference { 10649 ReturnType, 10650 ParameterName, 10651 ParameterType, 10652 ParameterSingleDefaultArgument, 10653 ParameterDifferentDefaultArgument, 10654 FunctionBody, 10655 }; 10656 10657 FunctionDecl *FirstFunction = Merge.first; 10658 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstFunction); 10659 10660 bool Diagnosed = false; 10661 for (auto &SecondFunction : Merge.second) { 10662 10663 if (FirstFunction == SecondFunction) 10664 continue; 10665 10666 std::string SecondModule = 10667 getOwningModuleNameForDiagnostic(SecondFunction); 10668 10669 auto ODRDiagError = [FirstFunction, &FirstModule, 10670 this](SourceLocation Loc, SourceRange Range, 10671 ODRFunctionDifference DiffType) { 10672 return Diag(Loc, diag::err_module_odr_violation_function) 10673 << FirstFunction << FirstModule.empty() << FirstModule << Range 10674 << DiffType; 10675 }; 10676 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 10677 SourceRange Range, 10678 ODRFunctionDifference DiffType) { 10679 return Diag(Loc, diag::note_module_odr_violation_function) 10680 << SecondModule << Range << DiffType; 10681 }; 10682 10683 if (ComputeQualTypeODRHash(FirstFunction->getReturnType()) != 10684 ComputeQualTypeODRHash(SecondFunction->getReturnType())) { 10685 ODRDiagError(FirstFunction->getReturnTypeSourceRange().getBegin(), 10686 FirstFunction->getReturnTypeSourceRange(), ReturnType) 10687 << FirstFunction->getReturnType(); 10688 ODRDiagNote(SecondFunction->getReturnTypeSourceRange().getBegin(), 10689 SecondFunction->getReturnTypeSourceRange(), ReturnType) 10690 << SecondFunction->getReturnType(); 10691 Diagnosed = true; 10692 break; 10693 } 10694 10695 assert(FirstFunction->param_size() == SecondFunction->param_size() && 10696 "Merged functions with different number of parameters"); 10697 10698 auto ParamSize = FirstFunction->param_size(); 10699 bool ParameterMismatch = false; 10700 for (unsigned I = 0; I < ParamSize; ++I) { 10701 auto *FirstParam = FirstFunction->getParamDecl(I); 10702 auto *SecondParam = SecondFunction->getParamDecl(I); 10703 10704 assert(getContext().hasSameType(FirstParam->getType(), 10705 SecondParam->getType()) && 10706 "Merged function has different parameter types."); 10707 10708 if (FirstParam->getDeclName() != SecondParam->getDeclName()) { 10709 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 10710 ParameterName) 10711 << I + 1 << FirstParam->getDeclName(); 10712 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 10713 ParameterName) 10714 << I + 1 << SecondParam->getDeclName(); 10715 ParameterMismatch = true; 10716 break; 10717 }; 10718 10719 QualType FirstParamType = FirstParam->getType(); 10720 QualType SecondParamType = SecondParam->getType(); 10721 if (FirstParamType != SecondParamType && 10722 ComputeQualTypeODRHash(FirstParamType) != 10723 ComputeQualTypeODRHash(SecondParamType)) { 10724 if (const DecayedType *ParamDecayedType = 10725 FirstParamType->getAs<DecayedType>()) { 10726 ODRDiagError(FirstParam->getLocation(), 10727 FirstParam->getSourceRange(), ParameterType) 10728 << (I + 1) << FirstParamType << true 10729 << ParamDecayedType->getOriginalType(); 10730 } else { 10731 ODRDiagError(FirstParam->getLocation(), 10732 FirstParam->getSourceRange(), ParameterType) 10733 << (I + 1) << FirstParamType << false; 10734 } 10735 10736 if (const DecayedType *ParamDecayedType = 10737 SecondParamType->getAs<DecayedType>()) { 10738 ODRDiagNote(SecondParam->getLocation(), 10739 SecondParam->getSourceRange(), ParameterType) 10740 << (I + 1) << SecondParamType << true 10741 << ParamDecayedType->getOriginalType(); 10742 } else { 10743 ODRDiagNote(SecondParam->getLocation(), 10744 SecondParam->getSourceRange(), ParameterType) 10745 << (I + 1) << SecondParamType << false; 10746 } 10747 ParameterMismatch = true; 10748 break; 10749 } 10750 10751 const Expr *FirstInit = FirstParam->getInit(); 10752 const Expr *SecondInit = SecondParam->getInit(); 10753 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 10754 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 10755 ParameterSingleDefaultArgument) 10756 << (I + 1) << (FirstInit == nullptr) 10757 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 10758 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 10759 ParameterSingleDefaultArgument) 10760 << (I + 1) << (SecondInit == nullptr) 10761 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 10762 ParameterMismatch = true; 10763 break; 10764 } 10765 10766 if (FirstInit && SecondInit && 10767 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 10768 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 10769 ParameterDifferentDefaultArgument) 10770 << (I + 1) << FirstInit->getSourceRange(); 10771 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 10772 ParameterDifferentDefaultArgument) 10773 << (I + 1) << SecondInit->getSourceRange(); 10774 ParameterMismatch = true; 10775 break; 10776 } 10777 10778 assert(ComputeSubDeclODRHash(FirstParam) == 10779 ComputeSubDeclODRHash(SecondParam) && 10780 "Undiagnosed parameter difference."); 10781 } 10782 10783 if (ParameterMismatch) { 10784 Diagnosed = true; 10785 break; 10786 } 10787 10788 // If no error has been generated before now, assume the problem is in 10789 // the body and generate a message. 10790 ODRDiagError(FirstFunction->getLocation(), 10791 FirstFunction->getSourceRange(), FunctionBody); 10792 ODRDiagNote(SecondFunction->getLocation(), 10793 SecondFunction->getSourceRange(), FunctionBody); 10794 Diagnosed = true; 10795 break; 10796 } 10797 (void)Diagnosed; 10798 assert(Diagnosed && "Unable to emit ODR diagnostic."); 10799 } 10800 } 10801 10802 void ASTReader::StartedDeserializing() { 10803 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get()) 10804 ReadTimer->startTimer(); 10805 } 10806 10807 void ASTReader::FinishedDeserializing() { 10808 assert(NumCurrentElementsDeserializing && 10809 "FinishedDeserializing not paired with StartedDeserializing"); 10810 if (NumCurrentElementsDeserializing == 1) { 10811 // We decrease NumCurrentElementsDeserializing only after pending actions 10812 // are finished, to avoid recursively re-calling finishPendingActions(). 10813 finishPendingActions(); 10814 } 10815 --NumCurrentElementsDeserializing; 10816 10817 if (NumCurrentElementsDeserializing == 0) { 10818 // Propagate exception specification updates along redeclaration chains. 10819 while (!PendingExceptionSpecUpdates.empty()) { 10820 auto Updates = std::move(PendingExceptionSpecUpdates); 10821 PendingExceptionSpecUpdates.clear(); 10822 for (auto Update : Updates) { 10823 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 10824 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>(); 10825 auto ESI = FPT->getExtProtoInfo().ExceptionSpec; 10826 if (auto *Listener = getContext().getASTMutationListener()) 10827 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second)); 10828 for (auto *Redecl : Update.second->redecls()) 10829 getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI); 10830 } 10831 } 10832 10833 if (ReadTimer) 10834 ReadTimer->stopTimer(); 10835 10836 diagnoseOdrViolations(); 10837 10838 // We are not in recursive loading, so it's safe to pass the "interesting" 10839 // decls to the consumer. 10840 if (Consumer) 10841 PassInterestingDeclsToConsumer(); 10842 } 10843 } 10844 10845 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 10846 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { 10847 // Remove any fake results before adding any real ones. 10848 auto It = PendingFakeLookupResults.find(II); 10849 if (It != PendingFakeLookupResults.end()) { 10850 for (auto *ND : It->second) 10851 SemaObj->IdResolver.RemoveDecl(ND); 10852 // FIXME: this works around module+PCH performance issue. 10853 // Rather than erase the result from the map, which is O(n), just clear 10854 // the vector of NamedDecls. 10855 It->second.clear(); 10856 } 10857 } 10858 10859 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 10860 SemaObj->TUScope->AddDecl(D); 10861 } else if (SemaObj->TUScope) { 10862 // Adding the decl to IdResolver may have failed because it was already in 10863 // (even though it was not added in scope). If it is already in, make sure 10864 // it gets in the scope as well. 10865 if (std::find(SemaObj->IdResolver.begin(Name), 10866 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 10867 SemaObj->TUScope->AddDecl(D); 10868 } 10869 } 10870 10871 ASTReader::ASTReader(Preprocessor &PP, ASTContext *Context, 10872 const PCHContainerReader &PCHContainerRdr, 10873 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions, 10874 StringRef isysroot, bool DisableValidation, 10875 bool AllowASTWithCompilerErrors, 10876 bool AllowConfigurationMismatch, bool ValidateSystemInputs, 10877 bool UseGlobalIndex, 10878 std::unique_ptr<llvm::Timer> ReadTimer) 10879 : Listener(DisableValidation 10880 ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP)) 10881 : cast<ASTReaderListener>(new PCHValidator(PP, *this))), 10882 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), 10883 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP), 10884 ContextObj(Context), 10885 ModuleMgr(PP.getFileManager(), PP.getPCMCache(), PCHContainerRdr, 10886 PP.getHeaderSearchInfo()), 10887 PCMCache(PP.getPCMCache()), DummyIdResolver(PP), 10888 ReadTimer(std::move(ReadTimer)), isysroot(isysroot), 10889 DisableValidation(DisableValidation), 10890 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 10891 AllowConfigurationMismatch(AllowConfigurationMismatch), 10892 ValidateSystemInputs(ValidateSystemInputs), 10893 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) { 10894 SourceMgr.setExternalSLocEntrySource(this); 10895 10896 for (const auto &Ext : Extensions) { 10897 auto BlockName = Ext->getExtensionMetadata().BlockName; 10898 auto Known = ModuleFileExtensions.find(BlockName); 10899 if (Known != ModuleFileExtensions.end()) { 10900 Diags.Report(diag::warn_duplicate_module_file_extension) 10901 << BlockName; 10902 continue; 10903 } 10904 10905 ModuleFileExtensions.insert({BlockName, Ext}); 10906 } 10907 } 10908 10909 ASTReader::~ASTReader() { 10910 if (OwnsDeserializationListener) 10911 delete DeserializationListener; 10912 } 10913 10914 IdentifierResolver &ASTReader::getIdResolver() { 10915 return SemaObj ? SemaObj->IdResolver : DummyIdResolver; 10916 } 10917 10918 unsigned ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor, 10919 unsigned AbbrevID) { 10920 Idx = 0; 10921 Record.clear(); 10922 return Cursor.readRecord(AbbrevID, Record); 10923 } 10924