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