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