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