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