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, in ReadAST. 2345 SourceLocation ImportLoc = 2346 ReadUntranslatedSourceLocation(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 OBJC_CATEGORIES_MAP: { 3037 if (F.LocalNumObjCCategoriesInMap != 0) { 3038 Error("duplicate OBJC_CATEGORIES_MAP record in AST file"); 3039 return Failure; 3040 } 3041 3042 F.LocalNumObjCCategoriesInMap = Record[0]; 3043 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data(); 3044 break; 3045 } 3046 3047 case OBJC_CATEGORIES: 3048 F.ObjCCategories.swap(Record); 3049 break; 3050 3051 case CXX_BASE_SPECIFIER_OFFSETS: { 3052 if (F.LocalNumCXXBaseSpecifiers != 0) { 3053 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file"); 3054 return Failure; 3055 } 3056 3057 F.LocalNumCXXBaseSpecifiers = Record[0]; 3058 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data(); 3059 break; 3060 } 3061 3062 case CXX_CTOR_INITIALIZERS_OFFSETS: { 3063 if (F.LocalNumCXXCtorInitializers != 0) { 3064 Error("duplicate CXX_CTOR_INITIALIZERS_OFFSETS record in AST file"); 3065 return Failure; 3066 } 3067 3068 F.LocalNumCXXCtorInitializers = Record[0]; 3069 F.CXXCtorInitializersOffsets = (const uint32_t *)Blob.data(); 3070 break; 3071 } 3072 3073 case DIAG_PRAGMA_MAPPINGS: 3074 if (F.PragmaDiagMappings.empty()) 3075 F.PragmaDiagMappings.swap(Record); 3076 else 3077 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(), 3078 Record.begin(), Record.end()); 3079 break; 3080 3081 case CUDA_SPECIAL_DECL_REFS: 3082 // Later tables overwrite earlier ones. 3083 // FIXME: Modules will have trouble with this. 3084 CUDASpecialDeclRefs.clear(); 3085 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3086 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3087 break; 3088 3089 case HEADER_SEARCH_TABLE: { 3090 F.HeaderFileInfoTableData = Blob.data(); 3091 F.LocalNumHeaderFileInfos = Record[1]; 3092 if (Record[0]) { 3093 F.HeaderFileInfoTable 3094 = HeaderFileInfoLookupTable::Create( 3095 (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 3096 (const unsigned char *)F.HeaderFileInfoTableData, 3097 HeaderFileInfoTrait(*this, F, 3098 &PP.getHeaderSearchInfo(), 3099 Blob.data() + Record[2])); 3100 3101 PP.getHeaderSearchInfo().SetExternalSource(this); 3102 if (!PP.getHeaderSearchInfo().getExternalLookup()) 3103 PP.getHeaderSearchInfo().SetExternalLookup(this); 3104 } 3105 break; 3106 } 3107 3108 case FP_PRAGMA_OPTIONS: 3109 // Later tables overwrite earlier ones. 3110 FPPragmaOptions.swap(Record); 3111 break; 3112 3113 case OPENCL_EXTENSIONS: 3114 // Later tables overwrite earlier ones. 3115 OpenCLExtensions.swap(Record); 3116 break; 3117 3118 case TENTATIVE_DEFINITIONS: 3119 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3120 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 3121 break; 3122 3123 case KNOWN_NAMESPACES: 3124 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3125 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 3126 break; 3127 3128 case UNDEFINED_BUT_USED: 3129 if (UndefinedButUsed.size() % 2 != 0) { 3130 Error("Invalid existing UndefinedButUsed"); 3131 return Failure; 3132 } 3133 3134 if (Record.size() % 2 != 0) { 3135 Error("invalid undefined-but-used record"); 3136 return Failure; 3137 } 3138 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3139 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 3140 UndefinedButUsed.push_back( 3141 ReadSourceLocation(F, Record, I).getRawEncoding()); 3142 } 3143 break; 3144 case DELETE_EXPRS_TO_ANALYZE: 3145 for (unsigned I = 0, N = Record.size(); I != N;) { 3146 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++])); 3147 const uint64_t Count = Record[I++]; 3148 DelayedDeleteExprs.push_back(Count); 3149 for (uint64_t C = 0; C < Count; ++C) { 3150 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding()); 3151 bool IsArrayForm = Record[I++] == 1; 3152 DelayedDeleteExprs.push_back(IsArrayForm); 3153 } 3154 } 3155 break; 3156 3157 case IMPORTED_MODULES: { 3158 if (F.Kind != MK_ImplicitModule && F.Kind != MK_ExplicitModule) { 3159 // If we aren't loading a module (which has its own exports), make 3160 // all of the imported modules visible. 3161 // FIXME: Deal with macros-only imports. 3162 for (unsigned I = 0, N = Record.size(); I != N; /**/) { 3163 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]); 3164 SourceLocation Loc = ReadSourceLocation(F, Record, I); 3165 if (GlobalID) 3166 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc)); 3167 } 3168 } 3169 break; 3170 } 3171 3172 case MACRO_OFFSET: { 3173 if (F.LocalNumMacros != 0) { 3174 Error("duplicate MACRO_OFFSET record in AST file"); 3175 return Failure; 3176 } 3177 F.MacroOffsets = (const uint32_t *)Blob.data(); 3178 F.LocalNumMacros = Record[0]; 3179 unsigned LocalBaseMacroID = Record[1]; 3180 F.BaseMacroID = getTotalNumMacros(); 3181 3182 if (F.LocalNumMacros > 0) { 3183 // Introduce the global -> local mapping for macros within this module. 3184 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 3185 3186 // Introduce the local -> global mapping for macros within this module. 3187 F.MacroRemap.insertOrReplace( 3188 std::make_pair(LocalBaseMacroID, 3189 F.BaseMacroID - LocalBaseMacroID)); 3190 3191 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 3192 } 3193 break; 3194 } 3195 3196 case LATE_PARSED_TEMPLATE: { 3197 LateParsedTemplates.append(Record.begin(), Record.end()); 3198 break; 3199 } 3200 3201 case OPTIMIZE_PRAGMA_OPTIONS: 3202 if (Record.size() != 1) { 3203 Error("invalid pragma optimize record"); 3204 return Failure; 3205 } 3206 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]); 3207 break; 3208 3209 case MSSTRUCT_PRAGMA_OPTIONS: 3210 if (Record.size() != 1) { 3211 Error("invalid pragma ms_struct record"); 3212 return Failure; 3213 } 3214 PragmaMSStructState = Record[0]; 3215 break; 3216 3217 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS: 3218 if (Record.size() != 2) { 3219 Error("invalid pragma ms_struct record"); 3220 return Failure; 3221 } 3222 PragmaMSPointersToMembersState = Record[0]; 3223 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]); 3224 break; 3225 3226 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES: 3227 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3228 UnusedLocalTypedefNameCandidates.push_back( 3229 getGlobalDeclID(F, Record[I])); 3230 break; 3231 } 3232 } 3233 } 3234 3235 ASTReader::ASTReadResult 3236 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F, 3237 const ModuleFile *ImportedBy, 3238 unsigned ClientLoadCapabilities) { 3239 unsigned Idx = 0; 3240 F.ModuleMapPath = ReadPath(F, Record, Idx); 3241 3242 if (F.Kind == MK_ExplicitModule) { 3243 // For an explicitly-loaded module, we don't care whether the original 3244 // module map file exists or matches. 3245 return Success; 3246 } 3247 3248 // Try to resolve ModuleName in the current header search context and 3249 // verify that it is found in the same module map file as we saved. If the 3250 // top-level AST file is a main file, skip this check because there is no 3251 // usable header search context. 3252 assert(!F.ModuleName.empty() && 3253 "MODULE_NAME should come before MODULE_MAP_FILE"); 3254 if (F.Kind == MK_ImplicitModule && 3255 (*ModuleMgr.begin())->Kind != MK_MainFile) { 3256 // An implicitly-loaded module file should have its module listed in some 3257 // module map file that we've already loaded. 3258 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName); 3259 auto &Map = PP.getHeaderSearchInfo().getModuleMap(); 3260 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr; 3261 if (!ModMap) { 3262 assert(ImportedBy && "top-level import should be verified"); 3263 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) { 3264 if (auto *ASTFE = M ? M->getASTFile() : nullptr) 3265 // This module was defined by an imported (explicit) module. 3266 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName 3267 << ASTFE->getName(); 3268 else 3269 // This module was built with a different module map. 3270 Diag(diag::err_imported_module_not_found) 3271 << F.ModuleName << F.FileName << ImportedBy->FileName 3272 << F.ModuleMapPath; 3273 } 3274 return OutOfDate; 3275 } 3276 3277 assert(M->Name == F.ModuleName && "found module with different name"); 3278 3279 // Check the primary module map file. 3280 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath); 3281 if (StoredModMap == nullptr || StoredModMap != ModMap) { 3282 assert(ModMap && "found module is missing module map file"); 3283 assert(ImportedBy && "top-level import should be verified"); 3284 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3285 Diag(diag::err_imported_module_modmap_changed) 3286 << F.ModuleName << ImportedBy->FileName 3287 << ModMap->getName() << F.ModuleMapPath; 3288 return OutOfDate; 3289 } 3290 3291 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps; 3292 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) { 3293 // FIXME: we should use input files rather than storing names. 3294 std::string Filename = ReadPath(F, Record, Idx); 3295 const FileEntry *F = 3296 FileMgr.getFile(Filename, false, false); 3297 if (F == nullptr) { 3298 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3299 Error("could not find file '" + Filename +"' referenced by AST file"); 3300 return OutOfDate; 3301 } 3302 AdditionalStoredMaps.insert(F); 3303 } 3304 3305 // Check any additional module map files (e.g. module.private.modulemap) 3306 // that are not in the pcm. 3307 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) { 3308 for (const FileEntry *ModMap : *AdditionalModuleMaps) { 3309 // Remove files that match 3310 // Note: SmallPtrSet::erase is really remove 3311 if (!AdditionalStoredMaps.erase(ModMap)) { 3312 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3313 Diag(diag::err_module_different_modmap) 3314 << F.ModuleName << /*new*/0 << ModMap->getName(); 3315 return OutOfDate; 3316 } 3317 } 3318 } 3319 3320 // Check any additional module map files that are in the pcm, but not 3321 // found in header search. Cases that match are already removed. 3322 for (const FileEntry *ModMap : AdditionalStoredMaps) { 3323 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3324 Diag(diag::err_module_different_modmap) 3325 << F.ModuleName << /*not new*/1 << ModMap->getName(); 3326 return OutOfDate; 3327 } 3328 } 3329 3330 if (Listener) 3331 Listener->ReadModuleMapFile(F.ModuleMapPath); 3332 return Success; 3333 } 3334 3335 3336 /// \brief Move the given method to the back of the global list of methods. 3337 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 3338 // Find the entry for this selector in the method pool. 3339 Sema::GlobalMethodPool::iterator Known 3340 = S.MethodPool.find(Method->getSelector()); 3341 if (Known == S.MethodPool.end()) 3342 return; 3343 3344 // Retrieve the appropriate method list. 3345 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 3346 : Known->second.second; 3347 bool Found = false; 3348 for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 3349 if (!Found) { 3350 if (List->getMethod() == Method) { 3351 Found = true; 3352 } else { 3353 // Keep searching. 3354 continue; 3355 } 3356 } 3357 3358 if (List->getNext()) 3359 List->setMethod(List->getNext()->getMethod()); 3360 else 3361 List->setMethod(Method); 3362 } 3363 } 3364 3365 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) { 3366 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?"); 3367 for (Decl *D : Names) { 3368 bool wasHidden = D->Hidden; 3369 D->Hidden = false; 3370 3371 if (wasHidden && SemaObj) { 3372 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 3373 moveMethodToBackOfGlobalList(*SemaObj, Method); 3374 } 3375 } 3376 } 3377 } 3378 3379 void ASTReader::makeModuleVisible(Module *Mod, 3380 Module::NameVisibilityKind NameVisibility, 3381 SourceLocation ImportLoc) { 3382 llvm::SmallPtrSet<Module *, 4> Visited; 3383 SmallVector<Module *, 4> Stack; 3384 Stack.push_back(Mod); 3385 while (!Stack.empty()) { 3386 Mod = Stack.pop_back_val(); 3387 3388 if (NameVisibility <= Mod->NameVisibility) { 3389 // This module already has this level of visibility (or greater), so 3390 // there is nothing more to do. 3391 continue; 3392 } 3393 3394 if (!Mod->isAvailable()) { 3395 // Modules that aren't available cannot be made visible. 3396 continue; 3397 } 3398 3399 // Update the module's name visibility. 3400 Mod->NameVisibility = NameVisibility; 3401 3402 // If we've already deserialized any names from this module, 3403 // mark them as visible. 3404 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 3405 if (Hidden != HiddenNamesMap.end()) { 3406 auto HiddenNames = std::move(*Hidden); 3407 HiddenNamesMap.erase(Hidden); 3408 makeNamesVisible(HiddenNames.second, HiddenNames.first); 3409 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && 3410 "making names visible added hidden names"); 3411 } 3412 3413 // Push any exported modules onto the stack to be marked as visible. 3414 SmallVector<Module *, 16> Exports; 3415 Mod->getExportedModules(Exports); 3416 for (SmallVectorImpl<Module *>::iterator 3417 I = Exports.begin(), E = Exports.end(); I != E; ++I) { 3418 Module *Exported = *I; 3419 if (Visited.insert(Exported).second) 3420 Stack.push_back(Exported); 3421 } 3422 } 3423 } 3424 3425 bool ASTReader::loadGlobalIndex() { 3426 if (GlobalIndex) 3427 return false; 3428 3429 if (TriedLoadingGlobalIndex || !UseGlobalIndex || 3430 !Context.getLangOpts().Modules) 3431 return true; 3432 3433 // Try to load the global index. 3434 TriedLoadingGlobalIndex = true; 3435 StringRef ModuleCachePath 3436 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 3437 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result 3438 = GlobalModuleIndex::readIndex(ModuleCachePath); 3439 if (!Result.first) 3440 return true; 3441 3442 GlobalIndex.reset(Result.first); 3443 ModuleMgr.setGlobalIndex(GlobalIndex.get()); 3444 return false; 3445 } 3446 3447 bool ASTReader::isGlobalIndexUnavailable() const { 3448 return Context.getLangOpts().Modules && UseGlobalIndex && 3449 !hasGlobalIndex() && TriedLoadingGlobalIndex; 3450 } 3451 3452 static void updateModuleTimestamp(ModuleFile &MF) { 3453 // Overwrite the timestamp file contents so that file's mtime changes. 3454 std::string TimestampFilename = MF.getTimestampFilename(); 3455 std::error_code EC; 3456 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text); 3457 if (EC) 3458 return; 3459 OS << "Timestamp file\n"; 3460 } 3461 3462 /// \brief Given a cursor at the start of an AST file, scan ahead and drop the 3463 /// cursor into the start of the given block ID, returning false on success and 3464 /// true on failure. 3465 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 3466 while (1) { 3467 llvm::BitstreamEntry Entry = Cursor.advance(); 3468 switch (Entry.Kind) { 3469 case llvm::BitstreamEntry::Error: 3470 case llvm::BitstreamEntry::EndBlock: 3471 return true; 3472 3473 case llvm::BitstreamEntry::Record: 3474 // Ignore top-level records. 3475 Cursor.skipRecord(Entry.ID); 3476 break; 3477 3478 case llvm::BitstreamEntry::SubBlock: 3479 if (Entry.ID == BlockID) { 3480 if (Cursor.EnterSubBlock(BlockID)) 3481 return true; 3482 // Found it! 3483 return false; 3484 } 3485 3486 if (Cursor.SkipBlock()) 3487 return true; 3488 } 3489 } 3490 } 3491 3492 ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, 3493 ModuleKind Type, 3494 SourceLocation ImportLoc, 3495 unsigned ClientLoadCapabilities) { 3496 llvm::SaveAndRestore<SourceLocation> 3497 SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 3498 3499 // Defer any pending actions until we get to the end of reading the AST file. 3500 Deserializing AnASTFile(this); 3501 3502 // Bump the generation number. 3503 unsigned PreviousGeneration = incrementGeneration(Context); 3504 3505 unsigned NumModules = ModuleMgr.size(); 3506 SmallVector<ImportedModule, 4> Loaded; 3507 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc, 3508 /*ImportedBy=*/nullptr, Loaded, 3509 0, 0, 0, 3510 ClientLoadCapabilities)) { 3511 case Failure: 3512 case Missing: 3513 case OutOfDate: 3514 case VersionMismatch: 3515 case ConfigurationMismatch: 3516 case HadErrors: { 3517 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet; 3518 for (const ImportedModule &IM : Loaded) 3519 LoadedSet.insert(IM.Mod); 3520 3521 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(), 3522 LoadedSet, 3523 Context.getLangOpts().Modules 3524 ? &PP.getHeaderSearchInfo().getModuleMap() 3525 : nullptr); 3526 3527 // If we find that any modules are unusable, the global index is going 3528 // to be out-of-date. Just remove it. 3529 GlobalIndex.reset(); 3530 ModuleMgr.setGlobalIndex(nullptr); 3531 return ReadResult; 3532 } 3533 case Success: 3534 break; 3535 } 3536 3537 // Here comes stuff that we only do once the entire chain is loaded. 3538 3539 // Load the AST blocks of all of the modules that we loaded. 3540 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), 3541 MEnd = Loaded.end(); 3542 M != MEnd; ++M) { 3543 ModuleFile &F = *M->Mod; 3544 3545 // Read the AST block. 3546 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities)) 3547 return Result; 3548 3549 // Read the extension blocks. 3550 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) { 3551 if (ASTReadResult Result = ReadExtensionBlock(F)) 3552 return Result; 3553 } 3554 3555 // Once read, set the ModuleFile bit base offset and update the size in 3556 // bits of all files we've seen. 3557 F.GlobalBitOffset = TotalModulesSizeInBits; 3558 TotalModulesSizeInBits += F.SizeInBits; 3559 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 3560 3561 // Preload SLocEntries. 3562 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 3563 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 3564 // Load it through the SourceManager and don't call ReadSLocEntry() 3565 // directly because the entry may have already been loaded in which case 3566 // calling ReadSLocEntry() directly would trigger an assertion in 3567 // SourceManager. 3568 SourceMgr.getLoadedSLocEntryByID(Index); 3569 } 3570 3571 // Preload all the pending interesting identifiers by marking them out of 3572 // date. 3573 for (auto Offset : F.PreloadIdentifierOffsets) { 3574 const unsigned char *Data = reinterpret_cast<const unsigned char *>( 3575 F.IdentifierTableData + Offset); 3576 3577 ASTIdentifierLookupTrait Trait(*this, F); 3578 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 3579 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 3580 auto &II = PP.getIdentifierTable().getOwn(Key); 3581 II.setOutOfDate(true); 3582 3583 // Mark this identifier as being from an AST file so that we can track 3584 // whether we need to serialize it. 3585 markIdentifierFromAST(*this, II); 3586 3587 // Associate the ID with the identifier so that the writer can reuse it. 3588 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first); 3589 SetIdentifierInfo(ID, &II); 3590 } 3591 } 3592 3593 // Setup the import locations and notify the module manager that we've 3594 // committed to these module files. 3595 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), 3596 MEnd = Loaded.end(); 3597 M != MEnd; ++M) { 3598 ModuleFile &F = *M->Mod; 3599 3600 ModuleMgr.moduleFileAccepted(&F); 3601 3602 // Set the import location. 3603 F.DirectImportLoc = ImportLoc; 3604 // FIXME: We assume that locations from PCH / preamble do not need 3605 // any translation. 3606 if (!M->ImportedBy) 3607 F.ImportLoc = M->ImportLoc; 3608 else 3609 F.ImportLoc = TranslateSourceLocation(*M->ImportedBy, M->ImportLoc); 3610 } 3611 3612 if (!Context.getLangOpts().CPlusPlus || 3613 (Type != MK_ImplicitModule && Type != MK_ExplicitModule)) { 3614 // Mark all of the identifiers in the identifier table as being out of date, 3615 // so that various accessors know to check the loaded modules when the 3616 // identifier is used. 3617 // 3618 // For C++ modules, we don't need information on many identifiers (just 3619 // those that provide macros or are poisoned), so we mark all of 3620 // the interesting ones via PreloadIdentifierOffsets. 3621 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 3622 IdEnd = PP.getIdentifierTable().end(); 3623 Id != IdEnd; ++Id) 3624 Id->second->setOutOfDate(true); 3625 } 3626 3627 // Resolve any unresolved module exports. 3628 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) { 3629 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I]; 3630 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 3631 Module *ResolvedMod = getSubmodule(GlobalID); 3632 3633 switch (Unresolved.Kind) { 3634 case UnresolvedModuleRef::Conflict: 3635 if (ResolvedMod) { 3636 Module::Conflict Conflict; 3637 Conflict.Other = ResolvedMod; 3638 Conflict.Message = Unresolved.String.str(); 3639 Unresolved.Mod->Conflicts.push_back(Conflict); 3640 } 3641 continue; 3642 3643 case UnresolvedModuleRef::Import: 3644 if (ResolvedMod) 3645 Unresolved.Mod->Imports.insert(ResolvedMod); 3646 continue; 3647 3648 case UnresolvedModuleRef::Export: 3649 if (ResolvedMod || Unresolved.IsWildcard) 3650 Unresolved.Mod->Exports.push_back( 3651 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 3652 continue; 3653 } 3654 } 3655 UnresolvedModuleRefs.clear(); 3656 3657 // FIXME: How do we load the 'use'd modules? They may not be submodules. 3658 // Might be unnecessary as use declarations are only used to build the 3659 // module itself. 3660 3661 InitializeContext(); 3662 3663 if (SemaObj) 3664 UpdateSema(); 3665 3666 if (DeserializationListener) 3667 DeserializationListener->ReaderInitialized(this); 3668 3669 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 3670 if (PrimaryModule.OriginalSourceFileID.isValid()) { 3671 PrimaryModule.OriginalSourceFileID 3672 = FileID::get(PrimaryModule.SLocEntryBaseID 3673 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1); 3674 3675 // If this AST file is a precompiled preamble, then set the 3676 // preamble file ID of the source manager to the file source file 3677 // from which the preamble was built. 3678 if (Type == MK_Preamble) { 3679 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 3680 } else if (Type == MK_MainFile) { 3681 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 3682 } 3683 } 3684 3685 // For any Objective-C class definitions we have already loaded, make sure 3686 // that we load any additional categories. 3687 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 3688 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 3689 ObjCClassesLoaded[I], 3690 PreviousGeneration); 3691 } 3692 3693 if (PP.getHeaderSearchInfo() 3694 .getHeaderSearchOpts() 3695 .ModulesValidateOncePerBuildSession) { 3696 // Now we are certain that the module and all modules it depends on are 3697 // up to date. Create or update timestamp files for modules that are 3698 // located in the module cache (not for PCH files that could be anywhere 3699 // in the filesystem). 3700 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) { 3701 ImportedModule &M = Loaded[I]; 3702 if (M.Mod->Kind == MK_ImplicitModule) { 3703 updateModuleTimestamp(*M.Mod); 3704 } 3705 } 3706 } 3707 3708 return Success; 3709 } 3710 3711 static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile); 3712 3713 /// \brief Whether \p Stream starts with the AST/PCH file magic number 'CPCH'. 3714 static bool startsWithASTFileMagic(BitstreamCursor &Stream) { 3715 return Stream.Read(8) == 'C' && 3716 Stream.Read(8) == 'P' && 3717 Stream.Read(8) == 'C' && 3718 Stream.Read(8) == 'H'; 3719 } 3720 3721 static unsigned moduleKindForDiagnostic(ModuleKind Kind) { 3722 switch (Kind) { 3723 case MK_PCH: 3724 return 0; // PCH 3725 case MK_ImplicitModule: 3726 case MK_ExplicitModule: 3727 return 1; // module 3728 case MK_MainFile: 3729 case MK_Preamble: 3730 return 2; // main source file 3731 } 3732 llvm_unreachable("unknown module kind"); 3733 } 3734 3735 ASTReader::ASTReadResult 3736 ASTReader::ReadASTCore(StringRef FileName, 3737 ModuleKind Type, 3738 SourceLocation ImportLoc, 3739 ModuleFile *ImportedBy, 3740 SmallVectorImpl<ImportedModule> &Loaded, 3741 off_t ExpectedSize, time_t ExpectedModTime, 3742 ASTFileSignature ExpectedSignature, 3743 unsigned ClientLoadCapabilities) { 3744 ModuleFile *M; 3745 std::string ErrorStr; 3746 ModuleManager::AddModuleResult AddResult 3747 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy, 3748 getGeneration(), ExpectedSize, ExpectedModTime, 3749 ExpectedSignature, readASTFileSignature, 3750 M, ErrorStr); 3751 3752 switch (AddResult) { 3753 case ModuleManager::AlreadyLoaded: 3754 return Success; 3755 3756 case ModuleManager::NewlyLoaded: 3757 // Load module file below. 3758 break; 3759 3760 case ModuleManager::Missing: 3761 // The module file was missing; if the client can handle that, return 3762 // it. 3763 if (ClientLoadCapabilities & ARR_Missing) 3764 return Missing; 3765 3766 // Otherwise, return an error. 3767 Diag(diag::err_module_file_not_found) << moduleKindForDiagnostic(Type) 3768 << FileName << ErrorStr.empty() 3769 << ErrorStr; 3770 return Failure; 3771 3772 case ModuleManager::OutOfDate: 3773 // We couldn't load the module file because it is out-of-date. If the 3774 // client can handle out-of-date, return it. 3775 if (ClientLoadCapabilities & ARR_OutOfDate) 3776 return OutOfDate; 3777 3778 // Otherwise, return an error. 3779 Diag(diag::err_module_file_out_of_date) << moduleKindForDiagnostic(Type) 3780 << FileName << ErrorStr.empty() 3781 << ErrorStr; 3782 return Failure; 3783 } 3784 3785 assert(M && "Missing module file"); 3786 3787 // FIXME: This seems rather a hack. Should CurrentDir be part of the 3788 // module? 3789 if (FileName != "-") { 3790 CurrentDir = llvm::sys::path::parent_path(FileName); 3791 if (CurrentDir.empty()) CurrentDir = "."; 3792 } 3793 3794 ModuleFile &F = *M; 3795 BitstreamCursor &Stream = F.Stream; 3796 PCHContainerRdr.ExtractPCH(F.Buffer->getMemBufferRef(), F.StreamFile); 3797 Stream.init(&F.StreamFile); 3798 F.SizeInBits = F.Buffer->getBufferSize() * 8; 3799 3800 // Sniff for the signature. 3801 if (!startsWithASTFileMagic(Stream)) { 3802 Diag(diag::err_module_file_invalid) << moduleKindForDiagnostic(Type) 3803 << FileName; 3804 return Failure; 3805 } 3806 3807 // This is used for compatibility with older PCH formats. 3808 bool HaveReadControlBlock = false; 3809 while (1) { 3810 llvm::BitstreamEntry Entry = Stream.advance(); 3811 3812 switch (Entry.Kind) { 3813 case llvm::BitstreamEntry::Error: 3814 case llvm::BitstreamEntry::Record: 3815 case llvm::BitstreamEntry::EndBlock: 3816 Error("invalid record at top-level of AST file"); 3817 return Failure; 3818 3819 case llvm::BitstreamEntry::SubBlock: 3820 break; 3821 } 3822 3823 switch (Entry.ID) { 3824 case CONTROL_BLOCK_ID: 3825 HaveReadControlBlock = true; 3826 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) { 3827 case Success: 3828 // Check that we didn't try to load a non-module AST file as a module. 3829 // 3830 // FIXME: Should we also perform the converse check? Loading a module as 3831 // a PCH file sort of works, but it's a bit wonky. 3832 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule) && 3833 F.ModuleName.empty()) { 3834 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure; 3835 if (Result != OutOfDate || 3836 (ClientLoadCapabilities & ARR_OutOfDate) == 0) 3837 Diag(diag::err_module_file_not_module) << FileName; 3838 return Result; 3839 } 3840 break; 3841 3842 case Failure: return Failure; 3843 case Missing: return Missing; 3844 case OutOfDate: return OutOfDate; 3845 case VersionMismatch: return VersionMismatch; 3846 case ConfigurationMismatch: return ConfigurationMismatch; 3847 case HadErrors: return HadErrors; 3848 } 3849 break; 3850 3851 case AST_BLOCK_ID: 3852 if (!HaveReadControlBlock) { 3853 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 3854 Diag(diag::err_pch_version_too_old); 3855 return VersionMismatch; 3856 } 3857 3858 // Record that we've loaded this module. 3859 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 3860 return Success; 3861 3862 default: 3863 if (Stream.SkipBlock()) { 3864 Error("malformed block record in AST file"); 3865 return Failure; 3866 } 3867 break; 3868 } 3869 } 3870 3871 return Success; 3872 } 3873 3874 /// Parse a record and blob containing module file extension metadata. 3875 static bool parseModuleFileExtensionMetadata( 3876 const SmallVectorImpl<uint64_t> &Record, 3877 StringRef Blob, 3878 ModuleFileExtensionMetadata &Metadata) { 3879 if (Record.size() < 4) return true; 3880 3881 Metadata.MajorVersion = Record[0]; 3882 Metadata.MinorVersion = Record[1]; 3883 3884 unsigned BlockNameLen = Record[2]; 3885 unsigned UserInfoLen = Record[3]; 3886 3887 if (BlockNameLen + UserInfoLen > Blob.size()) return true; 3888 3889 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen); 3890 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen, 3891 Blob.data() + BlockNameLen + UserInfoLen); 3892 return false; 3893 } 3894 3895 ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) { 3896 BitstreamCursor &Stream = F.Stream; 3897 3898 RecordData Record; 3899 while (true) { 3900 llvm::BitstreamEntry Entry = Stream.advance(); 3901 switch (Entry.Kind) { 3902 case llvm::BitstreamEntry::SubBlock: 3903 if (Stream.SkipBlock()) 3904 return Failure; 3905 3906 continue; 3907 3908 case llvm::BitstreamEntry::EndBlock: 3909 return Success; 3910 3911 case llvm::BitstreamEntry::Error: 3912 return HadErrors; 3913 3914 case llvm::BitstreamEntry::Record: 3915 break; 3916 } 3917 3918 Record.clear(); 3919 StringRef Blob; 3920 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob); 3921 switch (RecCode) { 3922 case EXTENSION_METADATA: { 3923 ModuleFileExtensionMetadata Metadata; 3924 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 3925 return Failure; 3926 3927 // Find a module file extension with this block name. 3928 auto Known = ModuleFileExtensions.find(Metadata.BlockName); 3929 if (Known == ModuleFileExtensions.end()) break; 3930 3931 // Form a reader. 3932 if (auto Reader = Known->second->createExtensionReader(Metadata, *this, 3933 F, Stream)) { 3934 F.ExtensionReaders.push_back(std::move(Reader)); 3935 } 3936 3937 break; 3938 } 3939 } 3940 } 3941 3942 return Success; 3943 } 3944 3945 void ASTReader::InitializeContext() { 3946 // If there's a listener, notify them that we "read" the translation unit. 3947 if (DeserializationListener) 3948 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 3949 Context.getTranslationUnitDecl()); 3950 3951 // FIXME: Find a better way to deal with collisions between these 3952 // built-in types. Right now, we just ignore the problem. 3953 3954 // Load the special types. 3955 if (SpecialTypes.size() >= NumSpecialTypeIDs) { 3956 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 3957 if (!Context.CFConstantStringTypeDecl) 3958 Context.setCFConstantStringType(GetType(String)); 3959 } 3960 3961 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 3962 QualType FileType = GetType(File); 3963 if (FileType.isNull()) { 3964 Error("FILE type is NULL"); 3965 return; 3966 } 3967 3968 if (!Context.FILEDecl) { 3969 if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 3970 Context.setFILEDecl(Typedef->getDecl()); 3971 else { 3972 const TagType *Tag = FileType->getAs<TagType>(); 3973 if (!Tag) { 3974 Error("Invalid FILE type in AST file"); 3975 return; 3976 } 3977 Context.setFILEDecl(Tag->getDecl()); 3978 } 3979 } 3980 } 3981 3982 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 3983 QualType Jmp_bufType = GetType(Jmp_buf); 3984 if (Jmp_bufType.isNull()) { 3985 Error("jmp_buf type is NULL"); 3986 return; 3987 } 3988 3989 if (!Context.jmp_bufDecl) { 3990 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 3991 Context.setjmp_bufDecl(Typedef->getDecl()); 3992 else { 3993 const TagType *Tag = Jmp_bufType->getAs<TagType>(); 3994 if (!Tag) { 3995 Error("Invalid jmp_buf type in AST file"); 3996 return; 3997 } 3998 Context.setjmp_bufDecl(Tag->getDecl()); 3999 } 4000 } 4001 } 4002 4003 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 4004 QualType Sigjmp_bufType = GetType(Sigjmp_buf); 4005 if (Sigjmp_bufType.isNull()) { 4006 Error("sigjmp_buf type is NULL"); 4007 return; 4008 } 4009 4010 if (!Context.sigjmp_bufDecl) { 4011 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 4012 Context.setsigjmp_bufDecl(Typedef->getDecl()); 4013 else { 4014 const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 4015 assert(Tag && "Invalid sigjmp_buf type in AST file"); 4016 Context.setsigjmp_bufDecl(Tag->getDecl()); 4017 } 4018 } 4019 } 4020 4021 if (unsigned ObjCIdRedef 4022 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 4023 if (Context.ObjCIdRedefinitionType.isNull()) 4024 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 4025 } 4026 4027 if (unsigned ObjCClassRedef 4028 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 4029 if (Context.ObjCClassRedefinitionType.isNull()) 4030 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 4031 } 4032 4033 if (unsigned ObjCSelRedef 4034 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 4035 if (Context.ObjCSelRedefinitionType.isNull()) 4036 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 4037 } 4038 4039 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 4040 QualType Ucontext_tType = GetType(Ucontext_t); 4041 if (Ucontext_tType.isNull()) { 4042 Error("ucontext_t type is NULL"); 4043 return; 4044 } 4045 4046 if (!Context.ucontext_tDecl) { 4047 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 4048 Context.setucontext_tDecl(Typedef->getDecl()); 4049 else { 4050 const TagType *Tag = Ucontext_tType->getAs<TagType>(); 4051 assert(Tag && "Invalid ucontext_t type in AST file"); 4052 Context.setucontext_tDecl(Tag->getDecl()); 4053 } 4054 } 4055 } 4056 } 4057 4058 ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 4059 4060 // If there were any CUDA special declarations, deserialize them. 4061 if (!CUDASpecialDeclRefs.empty()) { 4062 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 4063 Context.setcudaConfigureCallDecl( 4064 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 4065 } 4066 4067 // Re-export any modules that were imported by a non-module AST file. 4068 // FIXME: This does not make macro-only imports visible again. 4069 for (auto &Import : ImportedModules) { 4070 if (Module *Imported = getSubmodule(Import.ID)) { 4071 makeModuleVisible(Imported, Module::AllVisible, 4072 /*ImportLoc=*/Import.ImportLoc); 4073 if (Import.ImportLoc.isValid()) 4074 PP.makeModuleVisible(Imported, Import.ImportLoc); 4075 // FIXME: should we tell Sema to make the module visible too? 4076 } 4077 } 4078 ImportedModules.clear(); 4079 } 4080 4081 void ASTReader::finalizeForWriting() { 4082 // Nothing to do for now. 4083 } 4084 4085 /// \brief Reads and return the signature record from \p StreamFile's control 4086 /// block, or else returns 0. 4087 static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile){ 4088 BitstreamCursor Stream(StreamFile); 4089 if (!startsWithASTFileMagic(Stream)) 4090 return 0; 4091 4092 // Scan for the CONTROL_BLOCK_ID block. 4093 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 4094 return 0; 4095 4096 // Scan for SIGNATURE inside the control block. 4097 ASTReader::RecordData Record; 4098 while (1) { 4099 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 4100 if (Entry.Kind == llvm::BitstreamEntry::EndBlock || 4101 Entry.Kind != llvm::BitstreamEntry::Record) 4102 return 0; 4103 4104 Record.clear(); 4105 StringRef Blob; 4106 if (SIGNATURE == Stream.readRecord(Entry.ID, Record, &Blob)) 4107 return Record[0]; 4108 } 4109 } 4110 4111 /// \brief Retrieve the name of the original source file name 4112 /// directly from the AST file, without actually loading the AST 4113 /// file. 4114 std::string ASTReader::getOriginalSourceFile( 4115 const std::string &ASTFileName, FileManager &FileMgr, 4116 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) { 4117 // Open the AST file. 4118 auto Buffer = FileMgr.getBufferForFile(ASTFileName); 4119 if (!Buffer) { 4120 Diags.Report(diag::err_fe_unable_to_read_pch_file) 4121 << ASTFileName << Buffer.getError().message(); 4122 return std::string(); 4123 } 4124 4125 // Initialize the stream 4126 llvm::BitstreamReader StreamFile; 4127 PCHContainerRdr.ExtractPCH((*Buffer)->getMemBufferRef(), StreamFile); 4128 BitstreamCursor Stream(StreamFile); 4129 4130 // Sniff for the signature. 4131 if (!startsWithASTFileMagic(Stream)) { 4132 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName; 4133 return std::string(); 4134 } 4135 4136 // Scan for the CONTROL_BLOCK_ID block. 4137 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 4138 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 4139 return std::string(); 4140 } 4141 4142 // Scan for ORIGINAL_FILE inside the control block. 4143 RecordData Record; 4144 while (1) { 4145 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 4146 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 4147 return std::string(); 4148 4149 if (Entry.Kind != llvm::BitstreamEntry::Record) { 4150 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 4151 return std::string(); 4152 } 4153 4154 Record.clear(); 4155 StringRef Blob; 4156 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE) 4157 return Blob.str(); 4158 } 4159 } 4160 4161 namespace { 4162 class SimplePCHValidator : public ASTReaderListener { 4163 const LangOptions &ExistingLangOpts; 4164 const TargetOptions &ExistingTargetOpts; 4165 const PreprocessorOptions &ExistingPPOpts; 4166 std::string ExistingModuleCachePath; 4167 FileManager &FileMgr; 4168 4169 public: 4170 SimplePCHValidator(const LangOptions &ExistingLangOpts, 4171 const TargetOptions &ExistingTargetOpts, 4172 const PreprocessorOptions &ExistingPPOpts, 4173 StringRef ExistingModuleCachePath, 4174 FileManager &FileMgr) 4175 : ExistingLangOpts(ExistingLangOpts), 4176 ExistingTargetOpts(ExistingTargetOpts), 4177 ExistingPPOpts(ExistingPPOpts), 4178 ExistingModuleCachePath(ExistingModuleCachePath), 4179 FileMgr(FileMgr) 4180 { 4181 } 4182 4183 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, 4184 bool AllowCompatibleDifferences) override { 4185 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr, 4186 AllowCompatibleDifferences); 4187 } 4188 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, 4189 bool AllowCompatibleDifferences) override { 4190 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr, 4191 AllowCompatibleDifferences); 4192 } 4193 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 4194 StringRef SpecificModuleCachePath, 4195 bool Complain) override { 4196 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 4197 ExistingModuleCachePath, 4198 nullptr, ExistingLangOpts); 4199 } 4200 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 4201 bool Complain, 4202 std::string &SuggestedPredefines) override { 4203 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr, 4204 SuggestedPredefines, ExistingLangOpts); 4205 } 4206 }; 4207 } 4208 4209 bool ASTReader::readASTFileControlBlock( 4210 StringRef Filename, FileManager &FileMgr, 4211 const PCHContainerReader &PCHContainerRdr, 4212 bool FindModuleFileExtensions, 4213 ASTReaderListener &Listener) { 4214 // Open the AST file. 4215 // FIXME: This allows use of the VFS; we do not allow use of the 4216 // VFS when actually loading a module. 4217 auto Buffer = FileMgr.getBufferForFile(Filename); 4218 if (!Buffer) { 4219 return true; 4220 } 4221 4222 // Initialize the stream 4223 llvm::BitstreamReader StreamFile; 4224 PCHContainerRdr.ExtractPCH((*Buffer)->getMemBufferRef(), StreamFile); 4225 BitstreamCursor Stream(StreamFile); 4226 4227 // Sniff for the signature. 4228 if (!startsWithASTFileMagic(Stream)) 4229 return true; 4230 4231 // Scan for the CONTROL_BLOCK_ID block. 4232 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 4233 return true; 4234 4235 bool NeedsInputFiles = Listener.needsInputFileVisitation(); 4236 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation(); 4237 bool NeedsImports = Listener.needsImportVisitation(); 4238 BitstreamCursor InputFilesCursor; 4239 4240 RecordData Record; 4241 std::string ModuleDir; 4242 bool DoneWithControlBlock = false; 4243 while (!DoneWithControlBlock) { 4244 llvm::BitstreamEntry Entry = Stream.advance(); 4245 4246 switch (Entry.Kind) { 4247 case llvm::BitstreamEntry::SubBlock: { 4248 switch (Entry.ID) { 4249 case OPTIONS_BLOCK_ID: { 4250 std::string IgnoredSuggestedPredefines; 4251 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate, 4252 /*AllowCompatibleConfigurationMismatch*/ false, 4253 Listener, IgnoredSuggestedPredefines) != Success) 4254 return true; 4255 break; 4256 } 4257 4258 case INPUT_FILES_BLOCK_ID: 4259 InputFilesCursor = Stream; 4260 if (Stream.SkipBlock() || 4261 (NeedsInputFiles && 4262 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID))) 4263 return true; 4264 break; 4265 4266 default: 4267 if (Stream.SkipBlock()) 4268 return true; 4269 break; 4270 } 4271 4272 continue; 4273 } 4274 4275 case llvm::BitstreamEntry::EndBlock: 4276 DoneWithControlBlock = true; 4277 break; 4278 4279 case llvm::BitstreamEntry::Error: 4280 return true; 4281 4282 case llvm::BitstreamEntry::Record: 4283 break; 4284 } 4285 4286 if (DoneWithControlBlock) break; 4287 4288 Record.clear(); 4289 StringRef Blob; 4290 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob); 4291 switch ((ControlRecordTypes)RecCode) { 4292 case METADATA: { 4293 if (Record[0] != VERSION_MAJOR) 4294 return true; 4295 4296 if (Listener.ReadFullVersionInformation(Blob)) 4297 return true; 4298 4299 break; 4300 } 4301 case MODULE_NAME: 4302 Listener.ReadModuleName(Blob); 4303 break; 4304 case MODULE_DIRECTORY: 4305 ModuleDir = Blob; 4306 break; 4307 case MODULE_MAP_FILE: { 4308 unsigned Idx = 0; 4309 auto Path = ReadString(Record, Idx); 4310 ResolveImportedPath(Path, ModuleDir); 4311 Listener.ReadModuleMapFile(Path); 4312 break; 4313 } 4314 case INPUT_FILE_OFFSETS: { 4315 if (!NeedsInputFiles) 4316 break; 4317 4318 unsigned NumInputFiles = Record[0]; 4319 unsigned NumUserFiles = Record[1]; 4320 const uint64_t *InputFileOffs = (const uint64_t *)Blob.data(); 4321 for (unsigned I = 0; I != NumInputFiles; ++I) { 4322 // Go find this input file. 4323 bool isSystemFile = I >= NumUserFiles; 4324 4325 if (isSystemFile && !NeedsSystemInputFiles) 4326 break; // the rest are system input files 4327 4328 BitstreamCursor &Cursor = InputFilesCursor; 4329 SavedStreamPosition SavedPosition(Cursor); 4330 Cursor.JumpToBit(InputFileOffs[I]); 4331 4332 unsigned Code = Cursor.ReadCode(); 4333 RecordData Record; 4334 StringRef Blob; 4335 bool shouldContinue = false; 4336 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) { 4337 case INPUT_FILE: 4338 bool Overridden = static_cast<bool>(Record[3]); 4339 std::string Filename = Blob; 4340 ResolveImportedPath(Filename, ModuleDir); 4341 shouldContinue = Listener.visitInputFile( 4342 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false); 4343 break; 4344 } 4345 if (!shouldContinue) 4346 break; 4347 } 4348 break; 4349 } 4350 4351 case IMPORTS: { 4352 if (!NeedsImports) 4353 break; 4354 4355 unsigned Idx = 0, N = Record.size(); 4356 while (Idx < N) { 4357 // Read information about the AST file. 4358 Idx += 5; // ImportLoc, Size, ModTime, Signature 4359 std::string Filename = ReadString(Record, Idx); 4360 ResolveImportedPath(Filename, ModuleDir); 4361 Listener.visitImport(Filename); 4362 } 4363 break; 4364 } 4365 4366 default: 4367 // No other validation to perform. 4368 break; 4369 } 4370 } 4371 4372 // Look for module file extension blocks, if requested. 4373 if (FindModuleFileExtensions) { 4374 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) { 4375 bool DoneWithExtensionBlock = false; 4376 while (!DoneWithExtensionBlock) { 4377 llvm::BitstreamEntry Entry = Stream.advance(); 4378 4379 switch (Entry.Kind) { 4380 case llvm::BitstreamEntry::SubBlock: 4381 if (Stream.SkipBlock()) 4382 return true; 4383 4384 continue; 4385 4386 case llvm::BitstreamEntry::EndBlock: 4387 DoneWithExtensionBlock = true; 4388 continue; 4389 4390 case llvm::BitstreamEntry::Error: 4391 return true; 4392 4393 case llvm::BitstreamEntry::Record: 4394 break; 4395 } 4396 4397 Record.clear(); 4398 StringRef Blob; 4399 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob); 4400 switch (RecCode) { 4401 case EXTENSION_METADATA: { 4402 ModuleFileExtensionMetadata Metadata; 4403 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 4404 return true; 4405 4406 Listener.readModuleFileExtension(Metadata); 4407 break; 4408 } 4409 } 4410 } 4411 } 4412 } 4413 4414 return false; 4415 } 4416 4417 bool ASTReader::isAcceptableASTFile( 4418 StringRef Filename, FileManager &FileMgr, 4419 const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts, 4420 const TargetOptions &TargetOpts, const PreprocessorOptions &PPOpts, 4421 std::string ExistingModuleCachePath) { 4422 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, 4423 ExistingModuleCachePath, FileMgr); 4424 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr, 4425 /*FindModuleFileExtensions=*/false, 4426 validator); 4427 } 4428 4429 ASTReader::ASTReadResult 4430 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 4431 // Enter the submodule block. 4432 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) { 4433 Error("malformed submodule block record in AST file"); 4434 return Failure; 4435 } 4436 4437 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 4438 bool First = true; 4439 Module *CurrentModule = nullptr; 4440 RecordData Record; 4441 while (true) { 4442 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks(); 4443 4444 switch (Entry.Kind) { 4445 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 4446 case llvm::BitstreamEntry::Error: 4447 Error("malformed block record in AST file"); 4448 return Failure; 4449 case llvm::BitstreamEntry::EndBlock: 4450 return Success; 4451 case llvm::BitstreamEntry::Record: 4452 // The interesting case. 4453 break; 4454 } 4455 4456 // Read a record. 4457 StringRef Blob; 4458 Record.clear(); 4459 auto Kind = F.Stream.readRecord(Entry.ID, Record, &Blob); 4460 4461 if ((Kind == SUBMODULE_METADATA) != First) { 4462 Error("submodule metadata record should be at beginning of block"); 4463 return Failure; 4464 } 4465 First = false; 4466 4467 // Submodule information is only valid if we have a current module. 4468 // FIXME: Should we error on these cases? 4469 if (!CurrentModule && Kind != SUBMODULE_METADATA && 4470 Kind != SUBMODULE_DEFINITION) 4471 continue; 4472 4473 switch (Kind) { 4474 default: // Default behavior: ignore. 4475 break; 4476 4477 case SUBMODULE_DEFINITION: { 4478 if (Record.size() < 8) { 4479 Error("malformed module definition"); 4480 return Failure; 4481 } 4482 4483 StringRef Name = Blob; 4484 unsigned Idx = 0; 4485 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]); 4486 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]); 4487 bool IsFramework = Record[Idx++]; 4488 bool IsExplicit = Record[Idx++]; 4489 bool IsSystem = Record[Idx++]; 4490 bool IsExternC = Record[Idx++]; 4491 bool InferSubmodules = Record[Idx++]; 4492 bool InferExplicitSubmodules = Record[Idx++]; 4493 bool InferExportWildcard = Record[Idx++]; 4494 bool ConfigMacrosExhaustive = Record[Idx++]; 4495 4496 Module *ParentModule = nullptr; 4497 if (Parent) 4498 ParentModule = getSubmodule(Parent); 4499 4500 // Retrieve this (sub)module from the module map, creating it if 4501 // necessary. 4502 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, IsFramework, 4503 IsExplicit).first; 4504 4505 // FIXME: set the definition loc for CurrentModule, or call 4506 // ModMap.setInferredModuleAllowedBy() 4507 4508 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 4509 if (GlobalIndex >= SubmodulesLoaded.size() || 4510 SubmodulesLoaded[GlobalIndex]) { 4511 Error("too many submodules"); 4512 return Failure; 4513 } 4514 4515 if (!ParentModule) { 4516 if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 4517 if (CurFile != F.File) { 4518 if (!Diags.isDiagnosticInFlight()) { 4519 Diag(diag::err_module_file_conflict) 4520 << CurrentModule->getTopLevelModuleName() 4521 << CurFile->getName() 4522 << F.File->getName(); 4523 } 4524 return Failure; 4525 } 4526 } 4527 4528 CurrentModule->setASTFile(F.File); 4529 } 4530 4531 CurrentModule->Signature = F.Signature; 4532 CurrentModule->IsFromModuleFile = true; 4533 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 4534 CurrentModule->IsExternC = IsExternC; 4535 CurrentModule->InferSubmodules = InferSubmodules; 4536 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 4537 CurrentModule->InferExportWildcard = InferExportWildcard; 4538 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive; 4539 if (DeserializationListener) 4540 DeserializationListener->ModuleRead(GlobalID, CurrentModule); 4541 4542 SubmodulesLoaded[GlobalIndex] = CurrentModule; 4543 4544 // Clear out data that will be replaced by what is the module file. 4545 CurrentModule->LinkLibraries.clear(); 4546 CurrentModule->ConfigMacros.clear(); 4547 CurrentModule->UnresolvedConflicts.clear(); 4548 CurrentModule->Conflicts.clear(); 4549 break; 4550 } 4551 4552 case SUBMODULE_UMBRELLA_HEADER: { 4553 std::string Filename = Blob; 4554 ResolveImportedPath(F, Filename); 4555 if (auto *Umbrella = PP.getFileManager().getFile(Filename)) { 4556 if (!CurrentModule->getUmbrellaHeader()) 4557 ModMap.setUmbrellaHeader(CurrentModule, Umbrella, Blob); 4558 else if (CurrentModule->getUmbrellaHeader().Entry != Umbrella) { 4559 // This can be a spurious difference caused by changing the VFS to 4560 // point to a different copy of the file, and it is too late to 4561 // to rebuild safely. 4562 // FIXME: If we wrote the virtual paths instead of the 'real' paths, 4563 // after input file validation only real problems would remain and we 4564 // could just error. For now, assume it's okay. 4565 break; 4566 } 4567 } 4568 break; 4569 } 4570 4571 case SUBMODULE_HEADER: 4572 case SUBMODULE_EXCLUDED_HEADER: 4573 case SUBMODULE_PRIVATE_HEADER: 4574 // We lazily associate headers with their modules via the HeaderInfo table. 4575 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 4576 // of complete filenames or remove it entirely. 4577 break; 4578 4579 case SUBMODULE_TEXTUAL_HEADER: 4580 case SUBMODULE_PRIVATE_TEXTUAL_HEADER: 4581 // FIXME: Textual headers are not marked in the HeaderInfo table. Load 4582 // them here. 4583 break; 4584 4585 case SUBMODULE_TOPHEADER: { 4586 CurrentModule->addTopHeaderFilename(Blob); 4587 break; 4588 } 4589 4590 case SUBMODULE_UMBRELLA_DIR: { 4591 std::string Dirname = Blob; 4592 ResolveImportedPath(F, Dirname); 4593 if (auto *Umbrella = PP.getFileManager().getDirectory(Dirname)) { 4594 if (!CurrentModule->getUmbrellaDir()) 4595 ModMap.setUmbrellaDir(CurrentModule, Umbrella, Blob); 4596 else if (CurrentModule->getUmbrellaDir().Entry != Umbrella) { 4597 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 4598 Error("mismatched umbrella directories in submodule"); 4599 return OutOfDate; 4600 } 4601 } 4602 break; 4603 } 4604 4605 case SUBMODULE_METADATA: { 4606 F.BaseSubmoduleID = getTotalNumSubmodules(); 4607 F.LocalNumSubmodules = Record[0]; 4608 unsigned LocalBaseSubmoduleID = Record[1]; 4609 if (F.LocalNumSubmodules > 0) { 4610 // Introduce the global -> local mapping for submodules within this 4611 // module. 4612 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 4613 4614 // Introduce the local -> global mapping for submodules within this 4615 // module. 4616 F.SubmoduleRemap.insertOrReplace( 4617 std::make_pair(LocalBaseSubmoduleID, 4618 F.BaseSubmoduleID - LocalBaseSubmoduleID)); 4619 4620 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 4621 } 4622 break; 4623 } 4624 4625 case SUBMODULE_IMPORTS: { 4626 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 4627 UnresolvedModuleRef Unresolved; 4628 Unresolved.File = &F; 4629 Unresolved.Mod = CurrentModule; 4630 Unresolved.ID = Record[Idx]; 4631 Unresolved.Kind = UnresolvedModuleRef::Import; 4632 Unresolved.IsWildcard = false; 4633 UnresolvedModuleRefs.push_back(Unresolved); 4634 } 4635 break; 4636 } 4637 4638 case SUBMODULE_EXPORTS: { 4639 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 4640 UnresolvedModuleRef Unresolved; 4641 Unresolved.File = &F; 4642 Unresolved.Mod = CurrentModule; 4643 Unresolved.ID = Record[Idx]; 4644 Unresolved.Kind = UnresolvedModuleRef::Export; 4645 Unresolved.IsWildcard = Record[Idx + 1]; 4646 UnresolvedModuleRefs.push_back(Unresolved); 4647 } 4648 4649 // Once we've loaded the set of exports, there's no reason to keep 4650 // the parsed, unresolved exports around. 4651 CurrentModule->UnresolvedExports.clear(); 4652 break; 4653 } 4654 case SUBMODULE_REQUIRES: { 4655 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(), 4656 Context.getTargetInfo()); 4657 break; 4658 } 4659 4660 case SUBMODULE_LINK_LIBRARY: 4661 CurrentModule->LinkLibraries.push_back( 4662 Module::LinkLibrary(Blob, Record[0])); 4663 break; 4664 4665 case SUBMODULE_CONFIG_MACRO: 4666 CurrentModule->ConfigMacros.push_back(Blob.str()); 4667 break; 4668 4669 case SUBMODULE_CONFLICT: { 4670 UnresolvedModuleRef Unresolved; 4671 Unresolved.File = &F; 4672 Unresolved.Mod = CurrentModule; 4673 Unresolved.ID = Record[0]; 4674 Unresolved.Kind = UnresolvedModuleRef::Conflict; 4675 Unresolved.IsWildcard = false; 4676 Unresolved.String = Blob; 4677 UnresolvedModuleRefs.push_back(Unresolved); 4678 break; 4679 } 4680 } 4681 } 4682 } 4683 4684 /// \brief Parse the record that corresponds to a LangOptions data 4685 /// structure. 4686 /// 4687 /// This routine parses the language options from the AST file and then gives 4688 /// them to the AST listener if one is set. 4689 /// 4690 /// \returns true if the listener deems the file unacceptable, false otherwise. 4691 bool ASTReader::ParseLanguageOptions(const RecordData &Record, 4692 bool Complain, 4693 ASTReaderListener &Listener, 4694 bool AllowCompatibleDifferences) { 4695 LangOptions LangOpts; 4696 unsigned Idx = 0; 4697 #define LANGOPT(Name, Bits, Default, Description) \ 4698 LangOpts.Name = Record[Idx++]; 4699 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 4700 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 4701 #include "clang/Basic/LangOptions.def" 4702 #define SANITIZER(NAME, ID) \ 4703 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]); 4704 #include "clang/Basic/Sanitizers.def" 4705 4706 for (unsigned N = Record[Idx++]; N; --N) 4707 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx)); 4708 4709 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 4710 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 4711 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 4712 4713 LangOpts.CurrentModule = ReadString(Record, Idx); 4714 4715 // Comment options. 4716 for (unsigned N = Record[Idx++]; N; --N) { 4717 LangOpts.CommentOpts.BlockCommandNames.push_back( 4718 ReadString(Record, Idx)); 4719 } 4720 LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 4721 4722 // OpenMP offloading options. 4723 for (unsigned N = Record[Idx++]; N; --N) { 4724 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx))); 4725 } 4726 4727 LangOpts.OMPHostIRFile = ReadString(Record, Idx); 4728 4729 return Listener.ReadLanguageOptions(LangOpts, Complain, 4730 AllowCompatibleDifferences); 4731 } 4732 4733 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain, 4734 ASTReaderListener &Listener, 4735 bool AllowCompatibleDifferences) { 4736 unsigned Idx = 0; 4737 TargetOptions TargetOpts; 4738 TargetOpts.Triple = ReadString(Record, Idx); 4739 TargetOpts.CPU = ReadString(Record, Idx); 4740 TargetOpts.ABI = ReadString(Record, Idx); 4741 for (unsigned N = Record[Idx++]; N; --N) { 4742 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 4743 } 4744 for (unsigned N = Record[Idx++]; N; --N) { 4745 TargetOpts.Features.push_back(ReadString(Record, Idx)); 4746 } 4747 4748 return Listener.ReadTargetOptions(TargetOpts, Complain, 4749 AllowCompatibleDifferences); 4750 } 4751 4752 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 4753 ASTReaderListener &Listener) { 4754 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); 4755 unsigned Idx = 0; 4756 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++]; 4757 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 4758 DiagOpts->set##Name(static_cast<Type>(Record[Idx++])); 4759 #include "clang/Basic/DiagnosticOptions.def" 4760 4761 for (unsigned N = Record[Idx++]; N; --N) 4762 DiagOpts->Warnings.push_back(ReadString(Record, Idx)); 4763 for (unsigned N = Record[Idx++]; N; --N) 4764 DiagOpts->Remarks.push_back(ReadString(Record, Idx)); 4765 4766 return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 4767 } 4768 4769 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 4770 ASTReaderListener &Listener) { 4771 FileSystemOptions FSOpts; 4772 unsigned Idx = 0; 4773 FSOpts.WorkingDir = ReadString(Record, Idx); 4774 return Listener.ReadFileSystemOptions(FSOpts, Complain); 4775 } 4776 4777 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 4778 bool Complain, 4779 ASTReaderListener &Listener) { 4780 HeaderSearchOptions HSOpts; 4781 unsigned Idx = 0; 4782 HSOpts.Sysroot = ReadString(Record, Idx); 4783 4784 // Include entries. 4785 for (unsigned N = Record[Idx++]; N; --N) { 4786 std::string Path = ReadString(Record, Idx); 4787 frontend::IncludeDirGroup Group 4788 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 4789 bool IsFramework = Record[Idx++]; 4790 bool IgnoreSysRoot = Record[Idx++]; 4791 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework, 4792 IgnoreSysRoot); 4793 } 4794 4795 // System header prefixes. 4796 for (unsigned N = Record[Idx++]; N; --N) { 4797 std::string Prefix = ReadString(Record, Idx); 4798 bool IsSystemHeader = Record[Idx++]; 4799 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader); 4800 } 4801 4802 HSOpts.ResourceDir = ReadString(Record, Idx); 4803 HSOpts.ModuleCachePath = ReadString(Record, Idx); 4804 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx); 4805 HSOpts.DisableModuleHash = Record[Idx++]; 4806 HSOpts.UseBuiltinIncludes = Record[Idx++]; 4807 HSOpts.UseStandardSystemIncludes = Record[Idx++]; 4808 HSOpts.UseStandardCXXIncludes = Record[Idx++]; 4809 HSOpts.UseLibcxx = Record[Idx++]; 4810 std::string SpecificModuleCachePath = ReadString(Record, Idx); 4811 4812 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 4813 Complain); 4814 } 4815 4816 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 4817 bool Complain, 4818 ASTReaderListener &Listener, 4819 std::string &SuggestedPredefines) { 4820 PreprocessorOptions PPOpts; 4821 unsigned Idx = 0; 4822 4823 // Macro definitions/undefs 4824 for (unsigned N = Record[Idx++]; N; --N) { 4825 std::string Macro = ReadString(Record, Idx); 4826 bool IsUndef = Record[Idx++]; 4827 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 4828 } 4829 4830 // Includes 4831 for (unsigned N = Record[Idx++]; N; --N) { 4832 PPOpts.Includes.push_back(ReadString(Record, Idx)); 4833 } 4834 4835 // Macro Includes 4836 for (unsigned N = Record[Idx++]; N; --N) { 4837 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 4838 } 4839 4840 PPOpts.UsePredefines = Record[Idx++]; 4841 PPOpts.DetailedRecord = Record[Idx++]; 4842 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 4843 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx); 4844 PPOpts.ObjCXXARCStandardLibrary = 4845 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 4846 SuggestedPredefines.clear(); 4847 return Listener.ReadPreprocessorOptions(PPOpts, Complain, 4848 SuggestedPredefines); 4849 } 4850 4851 std::pair<ModuleFile *, unsigned> 4852 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 4853 GlobalPreprocessedEntityMapType::iterator 4854 I = GlobalPreprocessedEntityMap.find(GlobalIndex); 4855 assert(I != GlobalPreprocessedEntityMap.end() && 4856 "Corrupted global preprocessed entity map"); 4857 ModuleFile *M = I->second; 4858 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 4859 return std::make_pair(M, LocalIndex); 4860 } 4861 4862 llvm::iterator_range<PreprocessingRecord::iterator> 4863 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 4864 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 4865 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 4866 Mod.NumPreprocessedEntities); 4867 4868 return llvm::make_range(PreprocessingRecord::iterator(), 4869 PreprocessingRecord::iterator()); 4870 } 4871 4872 llvm::iterator_range<ASTReader::ModuleDeclIterator> 4873 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 4874 return llvm::make_range( 4875 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 4876 ModuleDeclIterator(this, &Mod, 4877 Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 4878 } 4879 4880 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 4881 PreprocessedEntityID PPID = Index+1; 4882 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 4883 ModuleFile &M = *PPInfo.first; 4884 unsigned LocalIndex = PPInfo.second; 4885 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 4886 4887 if (!PP.getPreprocessingRecord()) { 4888 Error("no preprocessing record"); 4889 return nullptr; 4890 } 4891 4892 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 4893 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset); 4894 4895 llvm::BitstreamEntry Entry = 4896 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 4897 if (Entry.Kind != llvm::BitstreamEntry::Record) 4898 return nullptr; 4899 4900 // Read the record. 4901 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()), 4902 TranslateSourceLocation(M, PPOffs.getEnd())); 4903 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 4904 StringRef Blob; 4905 RecordData Record; 4906 PreprocessorDetailRecordTypes RecType = 4907 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord( 4908 Entry.ID, Record, &Blob); 4909 switch (RecType) { 4910 case PPD_MACRO_EXPANSION: { 4911 bool isBuiltin = Record[0]; 4912 IdentifierInfo *Name = nullptr; 4913 MacroDefinitionRecord *Def = nullptr; 4914 if (isBuiltin) 4915 Name = getLocalIdentifier(M, Record[1]); 4916 else { 4917 PreprocessedEntityID GlobalID = 4918 getGlobalPreprocessedEntityID(M, Record[1]); 4919 Def = cast<MacroDefinitionRecord>( 4920 PPRec.getLoadedPreprocessedEntity(GlobalID - 1)); 4921 } 4922 4923 MacroExpansion *ME; 4924 if (isBuiltin) 4925 ME = new (PPRec) MacroExpansion(Name, Range); 4926 else 4927 ME = new (PPRec) MacroExpansion(Def, Range); 4928 4929 return ME; 4930 } 4931 4932 case PPD_MACRO_DEFINITION: { 4933 // Decode the identifier info and then check again; if the macro is 4934 // still defined and associated with the identifier, 4935 IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 4936 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range); 4937 4938 if (DeserializationListener) 4939 DeserializationListener->MacroDefinitionRead(PPID, MD); 4940 4941 return MD; 4942 } 4943 4944 case PPD_INCLUSION_DIRECTIVE: { 4945 const char *FullFileNameStart = Blob.data() + Record[0]; 4946 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 4947 const FileEntry *File = nullptr; 4948 if (!FullFileName.empty()) 4949 File = PP.getFileManager().getFile(FullFileName); 4950 4951 // FIXME: Stable encoding 4952 InclusionDirective::InclusionKind Kind 4953 = static_cast<InclusionDirective::InclusionKind>(Record[2]); 4954 InclusionDirective *ID 4955 = new (PPRec) InclusionDirective(PPRec, Kind, 4956 StringRef(Blob.data(), Record[0]), 4957 Record[1], Record[3], 4958 File, 4959 Range); 4960 return ID; 4961 } 4962 } 4963 4964 llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 4965 } 4966 4967 /// \brief \arg SLocMapI points at a chunk of a module that contains no 4968 /// preprocessed entities or the entities it contains are not the ones we are 4969 /// looking for. Find the next module that contains entities and return the ID 4970 /// of the first entry. 4971 PreprocessedEntityID ASTReader::findNextPreprocessedEntity( 4972 GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 4973 ++SLocMapI; 4974 for (GlobalSLocOffsetMapType::const_iterator 4975 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 4976 ModuleFile &M = *SLocMapI->second; 4977 if (M.NumPreprocessedEntities) 4978 return M.BasePreprocessedEntityID; 4979 } 4980 4981 return getTotalNumPreprocessedEntities(); 4982 } 4983 4984 namespace { 4985 4986 struct PPEntityComp { 4987 const ASTReader &Reader; 4988 ModuleFile &M; 4989 4990 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { } 4991 4992 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 4993 SourceLocation LHS = getLoc(L); 4994 SourceLocation RHS = getLoc(R); 4995 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 4996 } 4997 4998 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 4999 SourceLocation LHS = getLoc(L); 5000 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5001 } 5002 5003 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 5004 SourceLocation RHS = getLoc(R); 5005 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5006 } 5007 5008 SourceLocation getLoc(const PPEntityOffset &PPE) const { 5009 return Reader.TranslateSourceLocation(M, PPE.getBegin()); 5010 } 5011 }; 5012 5013 } 5014 5015 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc, 5016 bool EndsAfter) const { 5017 if (SourceMgr.isLocalSourceLocation(Loc)) 5018 return getTotalNumPreprocessedEntities(); 5019 5020 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find( 5021 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1); 5022 assert(SLocMapI != GlobalSLocOffsetMap.end() && 5023 "Corrupted global sloc offset map"); 5024 5025 if (SLocMapI->second->NumPreprocessedEntities == 0) 5026 return findNextPreprocessedEntity(SLocMapI); 5027 5028 ModuleFile &M = *SLocMapI->second; 5029 typedef const PPEntityOffset *pp_iterator; 5030 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 5031 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 5032 5033 size_t Count = M.NumPreprocessedEntities; 5034 size_t Half; 5035 pp_iterator First = pp_begin; 5036 pp_iterator PPI; 5037 5038 if (EndsAfter) { 5039 PPI = std::upper_bound(pp_begin, pp_end, Loc, 5040 PPEntityComp(*this, M)); 5041 } else { 5042 // Do a binary search manually instead of using std::lower_bound because 5043 // The end locations of entities may be unordered (when a macro expansion 5044 // is inside another macro argument), but for this case it is not important 5045 // whether we get the first macro expansion or its containing macro. 5046 while (Count > 0) { 5047 Half = Count / 2; 5048 PPI = First; 5049 std::advance(PPI, Half); 5050 if (SourceMgr.isBeforeInTranslationUnit( 5051 TranslateSourceLocation(M, PPI->getEnd()), Loc)) { 5052 First = PPI; 5053 ++First; 5054 Count = Count - Half - 1; 5055 } else 5056 Count = Half; 5057 } 5058 } 5059 5060 if (PPI == pp_end) 5061 return findNextPreprocessedEntity(SLocMapI); 5062 5063 return M.BasePreprocessedEntityID + (PPI - pp_begin); 5064 } 5065 5066 /// \brief Returns a pair of [Begin, End) indices of preallocated 5067 /// preprocessed entities that \arg Range encompasses. 5068 std::pair<unsigned, unsigned> 5069 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 5070 if (Range.isInvalid()) 5071 return std::make_pair(0,0); 5072 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 5073 5074 PreprocessedEntityID BeginID = 5075 findPreprocessedEntity(Range.getBegin(), false); 5076 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true); 5077 return std::make_pair(BeginID, EndID); 5078 } 5079 5080 /// \brief Optionally returns true or false if the preallocated preprocessed 5081 /// entity with index \arg Index came from file \arg FID. 5082 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 5083 FileID FID) { 5084 if (FID.isInvalid()) 5085 return false; 5086 5087 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 5088 ModuleFile &M = *PPInfo.first; 5089 unsigned LocalIndex = PPInfo.second; 5090 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 5091 5092 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin()); 5093 if (Loc.isInvalid()) 5094 return false; 5095 5096 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 5097 return true; 5098 else 5099 return false; 5100 } 5101 5102 namespace { 5103 /// \brief Visitor used to search for information about a header file. 5104 class HeaderFileInfoVisitor { 5105 const FileEntry *FE; 5106 5107 Optional<HeaderFileInfo> HFI; 5108 5109 public: 5110 explicit HeaderFileInfoVisitor(const FileEntry *FE) 5111 : FE(FE) { } 5112 5113 bool operator()(ModuleFile &M) { 5114 HeaderFileInfoLookupTable *Table 5115 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 5116 if (!Table) 5117 return false; 5118 5119 // Look in the on-disk hash table for an entry for this file name. 5120 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE); 5121 if (Pos == Table->end()) 5122 return false; 5123 5124 HFI = *Pos; 5125 return true; 5126 } 5127 5128 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 5129 }; 5130 } 5131 5132 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 5133 HeaderFileInfoVisitor Visitor(FE); 5134 ModuleMgr.visit(Visitor); 5135 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 5136 return *HFI; 5137 5138 return HeaderFileInfo(); 5139 } 5140 5141 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 5142 // FIXME: Make it work properly with modules. 5143 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates; 5144 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) { 5145 ModuleFile &F = *(*I); 5146 unsigned Idx = 0; 5147 DiagStates.clear(); 5148 assert(!Diag.DiagStates.empty()); 5149 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one. 5150 while (Idx < F.PragmaDiagMappings.size()) { 5151 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 5152 unsigned DiagStateID = F.PragmaDiagMappings[Idx++]; 5153 if (DiagStateID != 0) { 5154 Diag.DiagStatePoints.push_back( 5155 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1], 5156 FullSourceLoc(Loc, SourceMgr))); 5157 continue; 5158 } 5159 5160 assert(DiagStateID == 0); 5161 // A new DiagState was created here. 5162 Diag.DiagStates.push_back(*Diag.GetCurDiagState()); 5163 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back(); 5164 DiagStates.push_back(NewState); 5165 Diag.DiagStatePoints.push_back( 5166 DiagnosticsEngine::DiagStatePoint(NewState, 5167 FullSourceLoc(Loc, SourceMgr))); 5168 while (1) { 5169 assert(Idx < F.PragmaDiagMappings.size() && 5170 "Invalid data, didn't find '-1' marking end of diag/map pairs"); 5171 if (Idx >= F.PragmaDiagMappings.size()) { 5172 break; // Something is messed up but at least avoid infinite loop in 5173 // release build. 5174 } 5175 unsigned DiagID = F.PragmaDiagMappings[Idx++]; 5176 if (DiagID == (unsigned)-1) { 5177 break; // no more diag/map pairs for this location. 5178 } 5179 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++]; 5180 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc); 5181 Diag.GetCurDiagState()->setMapping(DiagID, Mapping); 5182 } 5183 } 5184 } 5185 } 5186 5187 /// \brief Get the correct cursor and offset for loading a type. 5188 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 5189 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 5190 assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 5191 ModuleFile *M = I->second; 5192 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]); 5193 } 5194 5195 /// \brief Read and return the type with the given index.. 5196 /// 5197 /// The index is the type ID, shifted and minus the number of predefs. This 5198 /// routine actually reads the record corresponding to the type at the given 5199 /// location. It is a helper routine for GetType, which deals with reading type 5200 /// IDs. 5201 QualType ASTReader::readTypeRecord(unsigned Index) { 5202 RecordLocation Loc = TypeCursorForIndex(Index); 5203 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 5204 5205 // Keep track of where we are in the stream, then jump back there 5206 // after reading this type. 5207 SavedStreamPosition SavedPosition(DeclsCursor); 5208 5209 ReadingKindTracker ReadingKind(Read_Type, *this); 5210 5211 // Note that we are loading a type record. 5212 Deserializing AType(this); 5213 5214 unsigned Idx = 0; 5215 DeclsCursor.JumpToBit(Loc.Offset); 5216 RecordData Record; 5217 unsigned Code = DeclsCursor.ReadCode(); 5218 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) { 5219 case TYPE_EXT_QUAL: { 5220 if (Record.size() != 2) { 5221 Error("Incorrect encoding of extended qualifier type"); 5222 return QualType(); 5223 } 5224 QualType Base = readType(*Loc.F, Record, Idx); 5225 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]); 5226 return Context.getQualifiedType(Base, Quals); 5227 } 5228 5229 case TYPE_COMPLEX: { 5230 if (Record.size() != 1) { 5231 Error("Incorrect encoding of complex type"); 5232 return QualType(); 5233 } 5234 QualType ElemType = readType(*Loc.F, Record, Idx); 5235 return Context.getComplexType(ElemType); 5236 } 5237 5238 case TYPE_POINTER: { 5239 if (Record.size() != 1) { 5240 Error("Incorrect encoding of pointer type"); 5241 return QualType(); 5242 } 5243 QualType PointeeType = readType(*Loc.F, Record, Idx); 5244 return Context.getPointerType(PointeeType); 5245 } 5246 5247 case TYPE_DECAYED: { 5248 if (Record.size() != 1) { 5249 Error("Incorrect encoding of decayed type"); 5250 return QualType(); 5251 } 5252 QualType OriginalType = readType(*Loc.F, Record, Idx); 5253 QualType DT = Context.getAdjustedParameterType(OriginalType); 5254 if (!isa<DecayedType>(DT)) 5255 Error("Decayed type does not decay"); 5256 return DT; 5257 } 5258 5259 case TYPE_ADJUSTED: { 5260 if (Record.size() != 2) { 5261 Error("Incorrect encoding of adjusted type"); 5262 return QualType(); 5263 } 5264 QualType OriginalTy = readType(*Loc.F, Record, Idx); 5265 QualType AdjustedTy = readType(*Loc.F, Record, Idx); 5266 return Context.getAdjustedType(OriginalTy, AdjustedTy); 5267 } 5268 5269 case TYPE_BLOCK_POINTER: { 5270 if (Record.size() != 1) { 5271 Error("Incorrect encoding of block pointer type"); 5272 return QualType(); 5273 } 5274 QualType PointeeType = readType(*Loc.F, Record, Idx); 5275 return Context.getBlockPointerType(PointeeType); 5276 } 5277 5278 case TYPE_LVALUE_REFERENCE: { 5279 if (Record.size() != 2) { 5280 Error("Incorrect encoding of lvalue reference type"); 5281 return QualType(); 5282 } 5283 QualType PointeeType = readType(*Loc.F, Record, Idx); 5284 return Context.getLValueReferenceType(PointeeType, Record[1]); 5285 } 5286 5287 case TYPE_RVALUE_REFERENCE: { 5288 if (Record.size() != 1) { 5289 Error("Incorrect encoding of rvalue reference type"); 5290 return QualType(); 5291 } 5292 QualType PointeeType = readType(*Loc.F, Record, Idx); 5293 return Context.getRValueReferenceType(PointeeType); 5294 } 5295 5296 case TYPE_MEMBER_POINTER: { 5297 if (Record.size() != 2) { 5298 Error("Incorrect encoding of member pointer type"); 5299 return QualType(); 5300 } 5301 QualType PointeeType = readType(*Loc.F, Record, Idx); 5302 QualType ClassType = readType(*Loc.F, Record, Idx); 5303 if (PointeeType.isNull() || ClassType.isNull()) 5304 return QualType(); 5305 5306 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr()); 5307 } 5308 5309 case TYPE_CONSTANT_ARRAY: { 5310 QualType ElementType = readType(*Loc.F, Record, Idx); 5311 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 5312 unsigned IndexTypeQuals = Record[2]; 5313 unsigned Idx = 3; 5314 llvm::APInt Size = ReadAPInt(Record, Idx); 5315 return Context.getConstantArrayType(ElementType, Size, 5316 ASM, IndexTypeQuals); 5317 } 5318 5319 case TYPE_INCOMPLETE_ARRAY: { 5320 QualType ElementType = readType(*Loc.F, Record, Idx); 5321 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 5322 unsigned IndexTypeQuals = Record[2]; 5323 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals); 5324 } 5325 5326 case TYPE_VARIABLE_ARRAY: { 5327 QualType ElementType = readType(*Loc.F, Record, Idx); 5328 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 5329 unsigned IndexTypeQuals = Record[2]; 5330 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]); 5331 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]); 5332 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F), 5333 ASM, IndexTypeQuals, 5334 SourceRange(LBLoc, RBLoc)); 5335 } 5336 5337 case TYPE_VECTOR: { 5338 if (Record.size() != 3) { 5339 Error("incorrect encoding of vector type in AST file"); 5340 return QualType(); 5341 } 5342 5343 QualType ElementType = readType(*Loc.F, Record, Idx); 5344 unsigned NumElements = Record[1]; 5345 unsigned VecKind = Record[2]; 5346 return Context.getVectorType(ElementType, NumElements, 5347 (VectorType::VectorKind)VecKind); 5348 } 5349 5350 case TYPE_EXT_VECTOR: { 5351 if (Record.size() != 3) { 5352 Error("incorrect encoding of extended vector type in AST file"); 5353 return QualType(); 5354 } 5355 5356 QualType ElementType = readType(*Loc.F, Record, Idx); 5357 unsigned NumElements = Record[1]; 5358 return Context.getExtVectorType(ElementType, NumElements); 5359 } 5360 5361 case TYPE_FUNCTION_NO_PROTO: { 5362 if (Record.size() != 6) { 5363 Error("incorrect encoding of no-proto function type"); 5364 return QualType(); 5365 } 5366 QualType ResultType = readType(*Loc.F, Record, Idx); 5367 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3], 5368 (CallingConv)Record[4], Record[5]); 5369 return Context.getFunctionNoProtoType(ResultType, Info); 5370 } 5371 5372 case TYPE_FUNCTION_PROTO: { 5373 QualType ResultType = readType(*Loc.F, Record, Idx); 5374 5375 FunctionProtoType::ExtProtoInfo EPI; 5376 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1], 5377 /*hasregparm*/ Record[2], 5378 /*regparm*/ Record[3], 5379 static_cast<CallingConv>(Record[4]), 5380 /*produces*/ Record[5]); 5381 5382 unsigned Idx = 6; 5383 5384 EPI.Variadic = Record[Idx++]; 5385 EPI.HasTrailingReturn = Record[Idx++]; 5386 EPI.TypeQuals = Record[Idx++]; 5387 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]); 5388 SmallVector<QualType, 8> ExceptionStorage; 5389 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx); 5390 5391 unsigned NumParams = Record[Idx++]; 5392 SmallVector<QualType, 16> ParamTypes; 5393 for (unsigned I = 0; I != NumParams; ++I) 5394 ParamTypes.push_back(readType(*Loc.F, Record, Idx)); 5395 5396 SmallVector<FunctionProtoType::ExtParameterInfo, 4> ExtParameterInfos; 5397 if (Idx != Record.size()) { 5398 for (unsigned I = 0; I != NumParams; ++I) 5399 ExtParameterInfos.push_back( 5400 FunctionProtoType::ExtParameterInfo 5401 ::getFromOpaqueValue(Record[Idx++])); 5402 EPI.ExtParameterInfos = ExtParameterInfos.data(); 5403 } 5404 5405 assert(Idx == Record.size()); 5406 5407 return Context.getFunctionType(ResultType, ParamTypes, EPI); 5408 } 5409 5410 case TYPE_UNRESOLVED_USING: { 5411 unsigned Idx = 0; 5412 return Context.getTypeDeclType( 5413 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx)); 5414 } 5415 5416 case TYPE_TYPEDEF: { 5417 if (Record.size() != 2) { 5418 Error("incorrect encoding of typedef type"); 5419 return QualType(); 5420 } 5421 unsigned Idx = 0; 5422 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx); 5423 QualType Canonical = readType(*Loc.F, Record, Idx); 5424 if (!Canonical.isNull()) 5425 Canonical = Context.getCanonicalType(Canonical); 5426 return Context.getTypedefType(Decl, Canonical); 5427 } 5428 5429 case TYPE_TYPEOF_EXPR: 5430 return Context.getTypeOfExprType(ReadExpr(*Loc.F)); 5431 5432 case TYPE_TYPEOF: { 5433 if (Record.size() != 1) { 5434 Error("incorrect encoding of typeof(type) in AST file"); 5435 return QualType(); 5436 } 5437 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 5438 return Context.getTypeOfType(UnderlyingType); 5439 } 5440 5441 case TYPE_DECLTYPE: { 5442 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 5443 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType); 5444 } 5445 5446 case TYPE_UNARY_TRANSFORM: { 5447 QualType BaseType = readType(*Loc.F, Record, Idx); 5448 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 5449 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2]; 5450 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind); 5451 } 5452 5453 case TYPE_AUTO: { 5454 QualType Deduced = readType(*Loc.F, Record, Idx); 5455 AutoTypeKeyword Keyword = (AutoTypeKeyword)Record[Idx++]; 5456 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false; 5457 return Context.getAutoType(Deduced, Keyword, IsDependent); 5458 } 5459 5460 case TYPE_RECORD: { 5461 if (Record.size() != 2) { 5462 Error("incorrect encoding of record type"); 5463 return QualType(); 5464 } 5465 unsigned Idx = 0; 5466 bool IsDependent = Record[Idx++]; 5467 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx); 5468 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl()); 5469 QualType T = Context.getRecordType(RD); 5470 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 5471 return T; 5472 } 5473 5474 case TYPE_ENUM: { 5475 if (Record.size() != 2) { 5476 Error("incorrect encoding of enum type"); 5477 return QualType(); 5478 } 5479 unsigned Idx = 0; 5480 bool IsDependent = Record[Idx++]; 5481 QualType T 5482 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx)); 5483 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 5484 return T; 5485 } 5486 5487 case TYPE_ATTRIBUTED: { 5488 if (Record.size() != 3) { 5489 Error("incorrect encoding of attributed type"); 5490 return QualType(); 5491 } 5492 QualType modifiedType = readType(*Loc.F, Record, Idx); 5493 QualType equivalentType = readType(*Loc.F, Record, Idx); 5494 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]); 5495 return Context.getAttributedType(kind, modifiedType, equivalentType); 5496 } 5497 5498 case TYPE_PAREN: { 5499 if (Record.size() != 1) { 5500 Error("incorrect encoding of paren type"); 5501 return QualType(); 5502 } 5503 QualType InnerType = readType(*Loc.F, Record, Idx); 5504 return Context.getParenType(InnerType); 5505 } 5506 5507 case TYPE_PACK_EXPANSION: { 5508 if (Record.size() != 2) { 5509 Error("incorrect encoding of pack expansion type"); 5510 return QualType(); 5511 } 5512 QualType Pattern = readType(*Loc.F, Record, Idx); 5513 if (Pattern.isNull()) 5514 return QualType(); 5515 Optional<unsigned> NumExpansions; 5516 if (Record[1]) 5517 NumExpansions = Record[1] - 1; 5518 return Context.getPackExpansionType(Pattern, NumExpansions); 5519 } 5520 5521 case TYPE_ELABORATED: { 5522 unsigned Idx = 0; 5523 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 5524 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 5525 QualType NamedType = readType(*Loc.F, Record, Idx); 5526 return Context.getElaboratedType(Keyword, NNS, NamedType); 5527 } 5528 5529 case TYPE_OBJC_INTERFACE: { 5530 unsigned Idx = 0; 5531 ObjCInterfaceDecl *ItfD 5532 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx); 5533 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl()); 5534 } 5535 5536 case TYPE_OBJC_OBJECT: { 5537 unsigned Idx = 0; 5538 QualType Base = readType(*Loc.F, Record, Idx); 5539 unsigned NumTypeArgs = Record[Idx++]; 5540 SmallVector<QualType, 4> TypeArgs; 5541 for (unsigned I = 0; I != NumTypeArgs; ++I) 5542 TypeArgs.push_back(readType(*Loc.F, Record, Idx)); 5543 unsigned NumProtos = Record[Idx++]; 5544 SmallVector<ObjCProtocolDecl*, 4> Protos; 5545 for (unsigned I = 0; I != NumProtos; ++I) 5546 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx)); 5547 bool IsKindOf = Record[Idx++]; 5548 return Context.getObjCObjectType(Base, TypeArgs, Protos, IsKindOf); 5549 } 5550 5551 case TYPE_OBJC_OBJECT_POINTER: { 5552 unsigned Idx = 0; 5553 QualType Pointee = readType(*Loc.F, Record, Idx); 5554 return Context.getObjCObjectPointerType(Pointee); 5555 } 5556 5557 case TYPE_SUBST_TEMPLATE_TYPE_PARM: { 5558 unsigned Idx = 0; 5559 QualType Parm = readType(*Loc.F, Record, Idx); 5560 QualType Replacement = readType(*Loc.F, Record, Idx); 5561 return Context.getSubstTemplateTypeParmType( 5562 cast<TemplateTypeParmType>(Parm), 5563 Context.getCanonicalType(Replacement)); 5564 } 5565 5566 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: { 5567 unsigned Idx = 0; 5568 QualType Parm = readType(*Loc.F, Record, Idx); 5569 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx); 5570 return Context.getSubstTemplateTypeParmPackType( 5571 cast<TemplateTypeParmType>(Parm), 5572 ArgPack); 5573 } 5574 5575 case TYPE_INJECTED_CLASS_NAME: { 5576 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx); 5577 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable 5578 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable 5579 // for AST reading, too much interdependencies. 5580 const Type *T = nullptr; 5581 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) { 5582 if (const Type *Existing = DI->getTypeForDecl()) { 5583 T = Existing; 5584 break; 5585 } 5586 } 5587 if (!T) { 5588 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST); 5589 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) 5590 DI->setTypeForDecl(T); 5591 } 5592 return QualType(T, 0); 5593 } 5594 5595 case TYPE_TEMPLATE_TYPE_PARM: { 5596 unsigned Idx = 0; 5597 unsigned Depth = Record[Idx++]; 5598 unsigned Index = Record[Idx++]; 5599 bool Pack = Record[Idx++]; 5600 TemplateTypeParmDecl *D 5601 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx); 5602 return Context.getTemplateTypeParmType(Depth, Index, Pack, D); 5603 } 5604 5605 case TYPE_DEPENDENT_NAME: { 5606 unsigned Idx = 0; 5607 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 5608 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 5609 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx); 5610 QualType Canon = readType(*Loc.F, Record, Idx); 5611 if (!Canon.isNull()) 5612 Canon = Context.getCanonicalType(Canon); 5613 return Context.getDependentNameType(Keyword, NNS, Name, Canon); 5614 } 5615 5616 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: { 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 unsigned NumArgs = Record[Idx++]; 5622 SmallVector<TemplateArgument, 8> Args; 5623 Args.reserve(NumArgs); 5624 while (NumArgs--) 5625 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx)); 5626 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name, 5627 Args.size(), Args.data()); 5628 } 5629 5630 case TYPE_DEPENDENT_SIZED_ARRAY: { 5631 unsigned Idx = 0; 5632 5633 // ArrayType 5634 QualType ElementType = readType(*Loc.F, Record, Idx); 5635 ArrayType::ArraySizeModifier ASM 5636 = (ArrayType::ArraySizeModifier)Record[Idx++]; 5637 unsigned IndexTypeQuals = Record[Idx++]; 5638 5639 // DependentSizedArrayType 5640 Expr *NumElts = ReadExpr(*Loc.F); 5641 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx); 5642 5643 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM, 5644 IndexTypeQuals, Brackets); 5645 } 5646 5647 case TYPE_TEMPLATE_SPECIALIZATION: { 5648 unsigned Idx = 0; 5649 bool IsDependent = Record[Idx++]; 5650 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx); 5651 SmallVector<TemplateArgument, 8> Args; 5652 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx); 5653 QualType Underlying = readType(*Loc.F, Record, Idx); 5654 QualType T; 5655 if (Underlying.isNull()) 5656 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(), 5657 Args.size()); 5658 else 5659 T = Context.getTemplateSpecializationType(Name, Args.data(), 5660 Args.size(), Underlying); 5661 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 5662 return T; 5663 } 5664 5665 case TYPE_ATOMIC: { 5666 if (Record.size() != 1) { 5667 Error("Incorrect encoding of atomic type"); 5668 return QualType(); 5669 } 5670 QualType ValueType = readType(*Loc.F, Record, Idx); 5671 return Context.getAtomicType(ValueType); 5672 } 5673 5674 case TYPE_PIPE: { 5675 if (Record.size() != 1) { 5676 Error("Incorrect encoding of pipe type"); 5677 return QualType(); 5678 } 5679 5680 // Reading the pipe element type. 5681 QualType ElementType = readType(*Loc.F, Record, Idx); 5682 return Context.getPipeType(ElementType); 5683 } 5684 } 5685 llvm_unreachable("Invalid TypeCode!"); 5686 } 5687 5688 void ASTReader::readExceptionSpec(ModuleFile &ModuleFile, 5689 SmallVectorImpl<QualType> &Exceptions, 5690 FunctionProtoType::ExceptionSpecInfo &ESI, 5691 const RecordData &Record, unsigned &Idx) { 5692 ExceptionSpecificationType EST = 5693 static_cast<ExceptionSpecificationType>(Record[Idx++]); 5694 ESI.Type = EST; 5695 if (EST == EST_Dynamic) { 5696 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I) 5697 Exceptions.push_back(readType(ModuleFile, Record, Idx)); 5698 ESI.Exceptions = Exceptions; 5699 } else if (EST == EST_ComputedNoexcept) { 5700 ESI.NoexceptExpr = ReadExpr(ModuleFile); 5701 } else if (EST == EST_Uninstantiated) { 5702 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx); 5703 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx); 5704 } else if (EST == EST_Unevaluated) { 5705 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx); 5706 } 5707 } 5708 5709 class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> { 5710 ASTReader &Reader; 5711 ModuleFile &F; 5712 const ASTReader::RecordData &Record; 5713 unsigned &Idx; 5714 5715 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R, 5716 unsigned &I) { 5717 return Reader.ReadSourceLocation(F, R, I); 5718 } 5719 5720 template<typename T> 5721 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) { 5722 return Reader.ReadDeclAs<T>(F, Record, Idx); 5723 } 5724 5725 public: 5726 TypeLocReader(ASTReader &Reader, ModuleFile &F, 5727 const ASTReader::RecordData &Record, unsigned &Idx) 5728 : Reader(Reader), F(F), Record(Record), Idx(Idx) 5729 { } 5730 5731 // We want compile-time assurance that we've enumerated all of 5732 // these, so unfortunately we have to declare them first, then 5733 // define them out-of-line. 5734 #define ABSTRACT_TYPELOC(CLASS, PARENT) 5735 #define TYPELOC(CLASS, PARENT) \ 5736 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 5737 #include "clang/AST/TypeLocNodes.def" 5738 5739 void VisitFunctionTypeLoc(FunctionTypeLoc); 5740 void VisitArrayTypeLoc(ArrayTypeLoc); 5741 }; 5742 5743 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 5744 // nothing to do 5745 } 5746 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 5747 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx)); 5748 if (TL.needsExtraLocalData()) { 5749 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++])); 5750 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++])); 5751 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++])); 5752 TL.setModeAttr(Record[Idx++]); 5753 } 5754 } 5755 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 5756 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5757 } 5758 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 5759 TL.setStarLoc(ReadSourceLocation(Record, Idx)); 5760 } 5761 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 5762 // nothing to do 5763 } 5764 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 5765 // nothing to do 5766 } 5767 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 5768 TL.setCaretLoc(ReadSourceLocation(Record, Idx)); 5769 } 5770 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 5771 TL.setAmpLoc(ReadSourceLocation(Record, Idx)); 5772 } 5773 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 5774 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx)); 5775 } 5776 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 5777 TL.setStarLoc(ReadSourceLocation(Record, Idx)); 5778 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 5779 } 5780 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 5781 TL.setLBracketLoc(ReadSourceLocation(Record, Idx)); 5782 TL.setRBracketLoc(ReadSourceLocation(Record, Idx)); 5783 if (Record[Idx++]) 5784 TL.setSizeExpr(Reader.ReadExpr(F)); 5785 else 5786 TL.setSizeExpr(nullptr); 5787 } 5788 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 5789 VisitArrayTypeLoc(TL); 5790 } 5791 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 5792 VisitArrayTypeLoc(TL); 5793 } 5794 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 5795 VisitArrayTypeLoc(TL); 5796 } 5797 void TypeLocReader::VisitDependentSizedArrayTypeLoc( 5798 DependentSizedArrayTypeLoc TL) { 5799 VisitArrayTypeLoc(TL); 5800 } 5801 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 5802 DependentSizedExtVectorTypeLoc TL) { 5803 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5804 } 5805 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 5806 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5807 } 5808 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 5809 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5810 } 5811 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 5812 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx)); 5813 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5814 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5815 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx)); 5816 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) { 5817 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx)); 5818 } 5819 } 5820 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 5821 VisitFunctionTypeLoc(TL); 5822 } 5823 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 5824 VisitFunctionTypeLoc(TL); 5825 } 5826 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 5827 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5828 } 5829 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 5830 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5831 } 5832 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 5833 TL.setTypeofLoc(ReadSourceLocation(Record, Idx)); 5834 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5835 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5836 } 5837 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 5838 TL.setTypeofLoc(ReadSourceLocation(Record, Idx)); 5839 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5840 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5841 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 5842 } 5843 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 5844 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5845 } 5846 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 5847 TL.setKWLoc(ReadSourceLocation(Record, Idx)); 5848 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5849 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5850 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 5851 } 5852 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 5853 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5854 } 5855 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 5856 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5857 } 5858 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 5859 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5860 } 5861 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 5862 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx)); 5863 if (TL.hasAttrOperand()) { 5864 SourceRange range; 5865 range.setBegin(ReadSourceLocation(Record, Idx)); 5866 range.setEnd(ReadSourceLocation(Record, Idx)); 5867 TL.setAttrOperandParensRange(range); 5868 } 5869 if (TL.hasAttrExprOperand()) { 5870 if (Record[Idx++]) 5871 TL.setAttrExprOperand(Reader.ReadExpr(F)); 5872 else 5873 TL.setAttrExprOperand(nullptr); 5874 } else if (TL.hasAttrEnumOperand()) 5875 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx)); 5876 } 5877 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 5878 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5879 } 5880 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 5881 SubstTemplateTypeParmTypeLoc TL) { 5882 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5883 } 5884 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 5885 SubstTemplateTypeParmPackTypeLoc TL) { 5886 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5887 } 5888 void TypeLocReader::VisitTemplateSpecializationTypeLoc( 5889 TemplateSpecializationTypeLoc TL) { 5890 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx)); 5891 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx)); 5892 TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 5893 TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 5894 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 5895 TL.setArgLocInfo(i, 5896 Reader.GetTemplateArgumentLocInfo(F, 5897 TL.getTypePtr()->getArg(i).getKind(), 5898 Record, Idx)); 5899 } 5900 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 5901 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5902 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5903 } 5904 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 5905 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 5906 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 5907 } 5908 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 5909 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5910 } 5911 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 5912 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 5913 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 5914 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5915 } 5916 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 5917 DependentTemplateSpecializationTypeLoc TL) { 5918 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 5919 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 5920 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx)); 5921 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx)); 5922 TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 5923 TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 5924 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 5925 TL.setArgLocInfo(I, 5926 Reader.GetTemplateArgumentLocInfo(F, 5927 TL.getTypePtr()->getArg(I).getKind(), 5928 Record, Idx)); 5929 } 5930 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 5931 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx)); 5932 } 5933 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 5934 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5935 } 5936 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 5937 TL.setHasBaseTypeAsWritten(Record[Idx++]); 5938 TL.setTypeArgsLAngleLoc(ReadSourceLocation(Record, Idx)); 5939 TL.setTypeArgsRAngleLoc(ReadSourceLocation(Record, Idx)); 5940 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i) 5941 TL.setTypeArgTInfo(i, Reader.GetTypeSourceInfo(F, Record, Idx)); 5942 TL.setProtocolLAngleLoc(ReadSourceLocation(Record, Idx)); 5943 TL.setProtocolRAngleLoc(ReadSourceLocation(Record, Idx)); 5944 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 5945 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx)); 5946 } 5947 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 5948 TL.setStarLoc(ReadSourceLocation(Record, Idx)); 5949 } 5950 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 5951 TL.setKWLoc(ReadSourceLocation(Record, Idx)); 5952 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5953 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5954 } 5955 void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) { 5956 TL.setKWLoc(ReadSourceLocation(Record, Idx)); 5957 } 5958 5959 TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F, 5960 const RecordData &Record, 5961 unsigned &Idx) { 5962 QualType InfoTy = readType(F, Record, Idx); 5963 if (InfoTy.isNull()) 5964 return nullptr; 5965 5966 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 5967 TypeLocReader TLR(*this, F, Record, Idx); 5968 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc()) 5969 TLR.Visit(TL); 5970 return TInfo; 5971 } 5972 5973 QualType ASTReader::GetType(TypeID ID) { 5974 unsigned FastQuals = ID & Qualifiers::FastMask; 5975 unsigned Index = ID >> Qualifiers::FastWidth; 5976 5977 if (Index < NUM_PREDEF_TYPE_IDS) { 5978 QualType T; 5979 switch ((PredefinedTypeIDs)Index) { 5980 case PREDEF_TYPE_NULL_ID: 5981 return QualType(); 5982 case PREDEF_TYPE_VOID_ID: 5983 T = Context.VoidTy; 5984 break; 5985 case PREDEF_TYPE_BOOL_ID: 5986 T = Context.BoolTy; 5987 break; 5988 5989 case PREDEF_TYPE_CHAR_U_ID: 5990 case PREDEF_TYPE_CHAR_S_ID: 5991 // FIXME: Check that the signedness of CharTy is correct! 5992 T = Context.CharTy; 5993 break; 5994 5995 case PREDEF_TYPE_UCHAR_ID: 5996 T = Context.UnsignedCharTy; 5997 break; 5998 case PREDEF_TYPE_USHORT_ID: 5999 T = Context.UnsignedShortTy; 6000 break; 6001 case PREDEF_TYPE_UINT_ID: 6002 T = Context.UnsignedIntTy; 6003 break; 6004 case PREDEF_TYPE_ULONG_ID: 6005 T = Context.UnsignedLongTy; 6006 break; 6007 case PREDEF_TYPE_ULONGLONG_ID: 6008 T = Context.UnsignedLongLongTy; 6009 break; 6010 case PREDEF_TYPE_UINT128_ID: 6011 T = Context.UnsignedInt128Ty; 6012 break; 6013 case PREDEF_TYPE_SCHAR_ID: 6014 T = Context.SignedCharTy; 6015 break; 6016 case PREDEF_TYPE_WCHAR_ID: 6017 T = Context.WCharTy; 6018 break; 6019 case PREDEF_TYPE_SHORT_ID: 6020 T = Context.ShortTy; 6021 break; 6022 case PREDEF_TYPE_INT_ID: 6023 T = Context.IntTy; 6024 break; 6025 case PREDEF_TYPE_LONG_ID: 6026 T = Context.LongTy; 6027 break; 6028 case PREDEF_TYPE_LONGLONG_ID: 6029 T = Context.LongLongTy; 6030 break; 6031 case PREDEF_TYPE_INT128_ID: 6032 T = Context.Int128Ty; 6033 break; 6034 case PREDEF_TYPE_HALF_ID: 6035 T = Context.HalfTy; 6036 break; 6037 case PREDEF_TYPE_FLOAT_ID: 6038 T = Context.FloatTy; 6039 break; 6040 case PREDEF_TYPE_DOUBLE_ID: 6041 T = Context.DoubleTy; 6042 break; 6043 case PREDEF_TYPE_LONGDOUBLE_ID: 6044 T = Context.LongDoubleTy; 6045 break; 6046 case PREDEF_TYPE_OVERLOAD_ID: 6047 T = Context.OverloadTy; 6048 break; 6049 case PREDEF_TYPE_BOUND_MEMBER: 6050 T = Context.BoundMemberTy; 6051 break; 6052 case PREDEF_TYPE_PSEUDO_OBJECT: 6053 T = Context.PseudoObjectTy; 6054 break; 6055 case PREDEF_TYPE_DEPENDENT_ID: 6056 T = Context.DependentTy; 6057 break; 6058 case PREDEF_TYPE_UNKNOWN_ANY: 6059 T = Context.UnknownAnyTy; 6060 break; 6061 case PREDEF_TYPE_NULLPTR_ID: 6062 T = Context.NullPtrTy; 6063 break; 6064 case PREDEF_TYPE_CHAR16_ID: 6065 T = Context.Char16Ty; 6066 break; 6067 case PREDEF_TYPE_CHAR32_ID: 6068 T = Context.Char32Ty; 6069 break; 6070 case PREDEF_TYPE_OBJC_ID: 6071 T = Context.ObjCBuiltinIdTy; 6072 break; 6073 case PREDEF_TYPE_OBJC_CLASS: 6074 T = Context.ObjCBuiltinClassTy; 6075 break; 6076 case PREDEF_TYPE_OBJC_SEL: 6077 T = Context.ObjCBuiltinSelTy; 6078 break; 6079 case PREDEF_TYPE_IMAGE1D_ID: 6080 T = Context.OCLImage1dTy; 6081 break; 6082 case PREDEF_TYPE_IMAGE1D_ARR_ID: 6083 T = Context.OCLImage1dArrayTy; 6084 break; 6085 case PREDEF_TYPE_IMAGE1D_BUFF_ID: 6086 T = Context.OCLImage1dBufferTy; 6087 break; 6088 case PREDEF_TYPE_IMAGE2D_ID: 6089 T = Context.OCLImage2dTy; 6090 break; 6091 case PREDEF_TYPE_IMAGE2D_ARR_ID: 6092 T = Context.OCLImage2dArrayTy; 6093 break; 6094 case PREDEF_TYPE_IMAGE2D_DEP_ID: 6095 T = Context.OCLImage2dDepthTy; 6096 break; 6097 case PREDEF_TYPE_IMAGE2D_ARR_DEP_ID: 6098 T = Context.OCLImage2dArrayDepthTy; 6099 break; 6100 case PREDEF_TYPE_IMAGE2D_MSAA_ID: 6101 T = Context.OCLImage2dMSAATy; 6102 break; 6103 case PREDEF_TYPE_IMAGE2D_ARR_MSAA_ID: 6104 T = Context.OCLImage2dArrayMSAATy; 6105 break; 6106 case PREDEF_TYPE_IMAGE2D_MSAA_DEP_ID: 6107 T = Context.OCLImage2dMSAADepthTy; 6108 break; 6109 case PREDEF_TYPE_IMAGE2D_ARR_MSAA_DEPTH_ID: 6110 T = Context.OCLImage2dArrayMSAADepthTy; 6111 break; 6112 case PREDEF_TYPE_IMAGE3D_ID: 6113 T = Context.OCLImage3dTy; 6114 break; 6115 case PREDEF_TYPE_SAMPLER_ID: 6116 T = Context.OCLSamplerTy; 6117 break; 6118 case PREDEF_TYPE_EVENT_ID: 6119 T = Context.OCLEventTy; 6120 break; 6121 case PREDEF_TYPE_CLK_EVENT_ID: 6122 T = Context.OCLClkEventTy; 6123 break; 6124 case PREDEF_TYPE_QUEUE_ID: 6125 T = Context.OCLQueueTy; 6126 break; 6127 case PREDEF_TYPE_NDRANGE_ID: 6128 T = Context.OCLNDRangeTy; 6129 break; 6130 case PREDEF_TYPE_RESERVE_ID_ID: 6131 T = Context.OCLReserveIDTy; 6132 break; 6133 case PREDEF_TYPE_AUTO_DEDUCT: 6134 T = Context.getAutoDeductType(); 6135 break; 6136 6137 case PREDEF_TYPE_AUTO_RREF_DEDUCT: 6138 T = Context.getAutoRRefDeductType(); 6139 break; 6140 6141 case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 6142 T = Context.ARCUnbridgedCastTy; 6143 break; 6144 6145 case PREDEF_TYPE_BUILTIN_FN: 6146 T = Context.BuiltinFnTy; 6147 break; 6148 6149 case PREDEF_TYPE_OMP_ARRAY_SECTION: 6150 T = Context.OMPArraySectionTy; 6151 break; 6152 } 6153 6154 assert(!T.isNull() && "Unknown predefined type"); 6155 return T.withFastQualifiers(FastQuals); 6156 } 6157 6158 Index -= NUM_PREDEF_TYPE_IDS; 6159 assert(Index < TypesLoaded.size() && "Type index out-of-range"); 6160 if (TypesLoaded[Index].isNull()) { 6161 TypesLoaded[Index] = readTypeRecord(Index); 6162 if (TypesLoaded[Index].isNull()) 6163 return QualType(); 6164 6165 TypesLoaded[Index]->setFromAST(); 6166 if (DeserializationListener) 6167 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 6168 TypesLoaded[Index]); 6169 } 6170 6171 return TypesLoaded[Index].withFastQualifiers(FastQuals); 6172 } 6173 6174 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 6175 return GetType(getGlobalTypeID(F, LocalID)); 6176 } 6177 6178 serialization::TypeID 6179 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 6180 unsigned FastQuals = LocalID & Qualifiers::FastMask; 6181 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 6182 6183 if (LocalIndex < NUM_PREDEF_TYPE_IDS) 6184 return LocalID; 6185 6186 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6187 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 6188 assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 6189 6190 unsigned GlobalIndex = LocalIndex + I->second; 6191 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 6192 } 6193 6194 TemplateArgumentLocInfo 6195 ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F, 6196 TemplateArgument::ArgKind Kind, 6197 const RecordData &Record, 6198 unsigned &Index) { 6199 switch (Kind) { 6200 case TemplateArgument::Expression: 6201 return ReadExpr(F); 6202 case TemplateArgument::Type: 6203 return GetTypeSourceInfo(F, Record, Index); 6204 case TemplateArgument::Template: { 6205 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 6206 Index); 6207 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 6208 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 6209 SourceLocation()); 6210 } 6211 case TemplateArgument::TemplateExpansion: { 6212 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 6213 Index); 6214 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 6215 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index); 6216 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 6217 EllipsisLoc); 6218 } 6219 case TemplateArgument::Null: 6220 case TemplateArgument::Integral: 6221 case TemplateArgument::Declaration: 6222 case TemplateArgument::NullPtr: 6223 case TemplateArgument::Pack: 6224 // FIXME: Is this right? 6225 return TemplateArgumentLocInfo(); 6226 } 6227 llvm_unreachable("unexpected template argument loc"); 6228 } 6229 6230 TemplateArgumentLoc 6231 ASTReader::ReadTemplateArgumentLoc(ModuleFile &F, 6232 const RecordData &Record, unsigned &Index) { 6233 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index); 6234 6235 if (Arg.getKind() == TemplateArgument::Expression) { 6236 if (Record[Index++]) // bool InfoHasSameExpr. 6237 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 6238 } 6239 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(), 6240 Record, Index)); 6241 } 6242 6243 const ASTTemplateArgumentListInfo* 6244 ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F, 6245 const RecordData &Record, 6246 unsigned &Index) { 6247 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index); 6248 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index); 6249 unsigned NumArgsAsWritten = Record[Index++]; 6250 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 6251 for (unsigned i = 0; i != NumArgsAsWritten; ++i) 6252 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index)); 6253 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 6254 } 6255 6256 Decl *ASTReader::GetExternalDecl(uint32_t ID) { 6257 return GetDecl(ID); 6258 } 6259 6260 template<typename TemplateSpecializationDecl> 6261 static void completeRedeclChainForTemplateSpecialization(Decl *D) { 6262 if (auto *TSD = dyn_cast<TemplateSpecializationDecl>(D)) 6263 TSD->getSpecializedTemplate()->LoadLazySpecializations(); 6264 } 6265 6266 void ASTReader::CompleteRedeclChain(const Decl *D) { 6267 if (NumCurrentElementsDeserializing) { 6268 // We arrange to not care about the complete redeclaration chain while we're 6269 // deserializing. Just remember that the AST has marked this one as complete 6270 // but that it's not actually complete yet, so we know we still need to 6271 // complete it later. 6272 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D)); 6273 return; 6274 } 6275 6276 const DeclContext *DC = D->getDeclContext()->getRedeclContext(); 6277 6278 // If this is a named declaration, complete it by looking it up 6279 // within its context. 6280 // 6281 // FIXME: Merging a function definition should merge 6282 // all mergeable entities within it. 6283 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) || 6284 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) { 6285 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) { 6286 if (!getContext().getLangOpts().CPlusPlus && 6287 isa<TranslationUnitDecl>(DC)) { 6288 // Outside of C++, we don't have a lookup table for the TU, so update 6289 // the identifier instead. (For C++ modules, we don't store decls 6290 // in the serialized identifier table, so we do the lookup in the TU.) 6291 auto *II = Name.getAsIdentifierInfo(); 6292 assert(II && "non-identifier name in C?"); 6293 if (II->isOutOfDate()) 6294 updateOutOfDateIdentifier(*II); 6295 } else 6296 DC->lookup(Name); 6297 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) { 6298 // Find all declarations of this kind from the relevant context. 6299 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) { 6300 auto *DC = cast<DeclContext>(DCDecl); 6301 SmallVector<Decl*, 8> Decls; 6302 FindExternalLexicalDecls( 6303 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls); 6304 } 6305 } 6306 } 6307 6308 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) 6309 CTSD->getSpecializedTemplate()->LoadLazySpecializations(); 6310 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) 6311 VTSD->getSpecializedTemplate()->LoadLazySpecializations(); 6312 if (auto *FD = dyn_cast<FunctionDecl>(D)) { 6313 if (auto *Template = FD->getPrimaryTemplate()) 6314 Template->LoadLazySpecializations(); 6315 } 6316 } 6317 6318 uint64_t ASTReader::ReadCXXCtorInitializersRef(ModuleFile &M, 6319 const RecordData &Record, 6320 unsigned &Idx) { 6321 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXCtorInitializers) { 6322 Error("malformed AST file: missing C++ ctor initializers"); 6323 return 0; 6324 } 6325 6326 unsigned LocalID = Record[Idx++]; 6327 return getGlobalBitOffset(M, M.CXXCtorInitializersOffsets[LocalID - 1]); 6328 } 6329 6330 CXXCtorInitializer ** 6331 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) { 6332 RecordLocation Loc = getLocalBitOffset(Offset); 6333 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 6334 SavedStreamPosition SavedPosition(Cursor); 6335 Cursor.JumpToBit(Loc.Offset); 6336 ReadingKindTracker ReadingKind(Read_Decl, *this); 6337 6338 RecordData Record; 6339 unsigned Code = Cursor.ReadCode(); 6340 unsigned RecCode = Cursor.readRecord(Code, Record); 6341 if (RecCode != DECL_CXX_CTOR_INITIALIZERS) { 6342 Error("malformed AST file: missing C++ ctor initializers"); 6343 return nullptr; 6344 } 6345 6346 unsigned Idx = 0; 6347 return ReadCXXCtorInitializers(*Loc.F, Record, Idx); 6348 } 6349 6350 uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M, 6351 const RecordData &Record, 6352 unsigned &Idx) { 6353 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) { 6354 Error("malformed AST file: missing C++ base specifier"); 6355 return 0; 6356 } 6357 6358 unsigned LocalID = Record[Idx++]; 6359 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]); 6360 } 6361 6362 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 6363 RecordLocation Loc = getLocalBitOffset(Offset); 6364 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 6365 SavedStreamPosition SavedPosition(Cursor); 6366 Cursor.JumpToBit(Loc.Offset); 6367 ReadingKindTracker ReadingKind(Read_Decl, *this); 6368 RecordData Record; 6369 unsigned Code = Cursor.ReadCode(); 6370 unsigned RecCode = Cursor.readRecord(Code, Record); 6371 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 6372 Error("malformed AST file: missing C++ base specifiers"); 6373 return nullptr; 6374 } 6375 6376 unsigned Idx = 0; 6377 unsigned NumBases = Record[Idx++]; 6378 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 6379 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 6380 for (unsigned I = 0; I != NumBases; ++I) 6381 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx); 6382 return Bases; 6383 } 6384 6385 serialization::DeclID 6386 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 6387 if (LocalID < NUM_PREDEF_DECL_IDS) 6388 return LocalID; 6389 6390 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6391 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 6392 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 6393 6394 return LocalID + I->second; 6395 } 6396 6397 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 6398 ModuleFile &M) const { 6399 // Predefined decls aren't from any module. 6400 if (ID < NUM_PREDEF_DECL_IDS) 6401 return false; 6402 6403 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID && 6404 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls; 6405 } 6406 6407 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 6408 if (!D->isFromASTFile()) 6409 return nullptr; 6410 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 6411 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 6412 return I->second; 6413 } 6414 6415 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 6416 if (ID < NUM_PREDEF_DECL_IDS) 6417 return SourceLocation(); 6418 6419 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 6420 6421 if (Index > DeclsLoaded.size()) { 6422 Error("declaration ID out-of-range for AST file"); 6423 return SourceLocation(); 6424 } 6425 6426 if (Decl *D = DeclsLoaded[Index]) 6427 return D->getLocation(); 6428 6429 SourceLocation Loc; 6430 DeclCursorForID(ID, Loc); 6431 return Loc; 6432 } 6433 6434 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) { 6435 switch (ID) { 6436 case PREDEF_DECL_NULL_ID: 6437 return nullptr; 6438 6439 case PREDEF_DECL_TRANSLATION_UNIT_ID: 6440 return Context.getTranslationUnitDecl(); 6441 6442 case PREDEF_DECL_OBJC_ID_ID: 6443 return Context.getObjCIdDecl(); 6444 6445 case PREDEF_DECL_OBJC_SEL_ID: 6446 return Context.getObjCSelDecl(); 6447 6448 case PREDEF_DECL_OBJC_CLASS_ID: 6449 return Context.getObjCClassDecl(); 6450 6451 case PREDEF_DECL_OBJC_PROTOCOL_ID: 6452 return Context.getObjCProtocolDecl(); 6453 6454 case PREDEF_DECL_INT_128_ID: 6455 return Context.getInt128Decl(); 6456 6457 case PREDEF_DECL_UNSIGNED_INT_128_ID: 6458 return Context.getUInt128Decl(); 6459 6460 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 6461 return Context.getObjCInstanceTypeDecl(); 6462 6463 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 6464 return Context.getBuiltinVaListDecl(); 6465 6466 case PREDEF_DECL_VA_LIST_TAG: 6467 return Context.getVaListTagDecl(); 6468 6469 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID: 6470 return Context.getBuiltinMSVaListDecl(); 6471 6472 case PREDEF_DECL_EXTERN_C_CONTEXT_ID: 6473 return Context.getExternCContextDecl(); 6474 6475 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID: 6476 return Context.getMakeIntegerSeqDecl(); 6477 6478 case PREDEF_DECL_CF_CONSTANT_STRING_ID: 6479 return Context.getCFConstantStringDecl(); 6480 6481 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID: 6482 return Context.getCFConstantStringTagDecl(); 6483 } 6484 llvm_unreachable("PredefinedDeclIDs unknown enum value"); 6485 } 6486 6487 Decl *ASTReader::GetExistingDecl(DeclID ID) { 6488 if (ID < NUM_PREDEF_DECL_IDS) { 6489 Decl *D = getPredefinedDecl(Context, (PredefinedDeclIDs)ID); 6490 if (D) { 6491 // Track that we have merged the declaration with ID \p ID into the 6492 // pre-existing predefined declaration \p D. 6493 auto &Merged = KeyDecls[D->getCanonicalDecl()]; 6494 if (Merged.empty()) 6495 Merged.push_back(ID); 6496 } 6497 return D; 6498 } 6499 6500 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 6501 6502 if (Index >= DeclsLoaded.size()) { 6503 assert(0 && "declaration ID out-of-range for AST file"); 6504 Error("declaration ID out-of-range for AST file"); 6505 return nullptr; 6506 } 6507 6508 return DeclsLoaded[Index]; 6509 } 6510 6511 Decl *ASTReader::GetDecl(DeclID ID) { 6512 if (ID < NUM_PREDEF_DECL_IDS) 6513 return GetExistingDecl(ID); 6514 6515 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 6516 6517 if (Index >= DeclsLoaded.size()) { 6518 assert(0 && "declaration ID out-of-range for AST file"); 6519 Error("declaration ID out-of-range for AST file"); 6520 return nullptr; 6521 } 6522 6523 if (!DeclsLoaded[Index]) { 6524 ReadDeclRecord(ID); 6525 if (DeserializationListener) 6526 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 6527 } 6528 6529 return DeclsLoaded[Index]; 6530 } 6531 6532 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 6533 DeclID GlobalID) { 6534 if (GlobalID < NUM_PREDEF_DECL_IDS) 6535 return GlobalID; 6536 6537 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 6538 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 6539 ModuleFile *Owner = I->second; 6540 6541 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 6542 = M.GlobalToLocalDeclIDs.find(Owner); 6543 if (Pos == M.GlobalToLocalDeclIDs.end()) 6544 return 0; 6545 6546 return GlobalID - Owner->BaseDeclID + Pos->second; 6547 } 6548 6549 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 6550 const RecordData &Record, 6551 unsigned &Idx) { 6552 if (Idx >= Record.size()) { 6553 Error("Corrupted AST file"); 6554 return 0; 6555 } 6556 6557 return getGlobalDeclID(F, Record[Idx++]); 6558 } 6559 6560 /// \brief Resolve the offset of a statement into a statement. 6561 /// 6562 /// This operation will read a new statement from the external 6563 /// source each time it is called, and is meant to be used via a 6564 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 6565 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 6566 // Switch case IDs are per Decl. 6567 ClearSwitchCaseIDs(); 6568 6569 // Offset here is a global offset across the entire chain. 6570 RecordLocation Loc = getLocalBitOffset(Offset); 6571 Loc.F->DeclsCursor.JumpToBit(Loc.Offset); 6572 return ReadStmtFromStream(*Loc.F); 6573 } 6574 6575 void ASTReader::FindExternalLexicalDecls( 6576 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 6577 SmallVectorImpl<Decl *> &Decls) { 6578 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {}; 6579 6580 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) { 6581 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries"); 6582 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) { 6583 auto K = (Decl::Kind)+LexicalDecls[I]; 6584 if (!IsKindWeWant(K)) 6585 continue; 6586 6587 auto ID = (serialization::DeclID)+LexicalDecls[I + 1]; 6588 6589 // Don't add predefined declarations to the lexical context more 6590 // than once. 6591 if (ID < NUM_PREDEF_DECL_IDS) { 6592 if (PredefsVisited[ID]) 6593 continue; 6594 6595 PredefsVisited[ID] = true; 6596 } 6597 6598 if (Decl *D = GetLocalDecl(*M, ID)) { 6599 assert(D->getKind() == K && "wrong kind for lexical decl"); 6600 if (!DC->isDeclInLexicalTraversal(D)) 6601 Decls.push_back(D); 6602 } 6603 } 6604 }; 6605 6606 if (isa<TranslationUnitDecl>(DC)) { 6607 for (auto Lexical : TULexicalDecls) 6608 Visit(Lexical.first, Lexical.second); 6609 } else { 6610 auto I = LexicalDecls.find(DC); 6611 if (I != LexicalDecls.end()) 6612 Visit(I->second.first, I->second.second); 6613 } 6614 6615 ++NumLexicalDeclContextsRead; 6616 } 6617 6618 namespace { 6619 6620 class DeclIDComp { 6621 ASTReader &Reader; 6622 ModuleFile &Mod; 6623 6624 public: 6625 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 6626 6627 bool operator()(LocalDeclID L, LocalDeclID R) const { 6628 SourceLocation LHS = getLocation(L); 6629 SourceLocation RHS = getLocation(R); 6630 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6631 } 6632 6633 bool operator()(SourceLocation LHS, LocalDeclID R) const { 6634 SourceLocation RHS = getLocation(R); 6635 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6636 } 6637 6638 bool operator()(LocalDeclID L, SourceLocation RHS) const { 6639 SourceLocation LHS = getLocation(L); 6640 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6641 } 6642 6643 SourceLocation getLocation(LocalDeclID ID) const { 6644 return Reader.getSourceManager().getFileLoc( 6645 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 6646 } 6647 }; 6648 6649 } 6650 6651 void ASTReader::FindFileRegionDecls(FileID File, 6652 unsigned Offset, unsigned Length, 6653 SmallVectorImpl<Decl *> &Decls) { 6654 SourceManager &SM = getSourceManager(); 6655 6656 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 6657 if (I == FileDeclIDs.end()) 6658 return; 6659 6660 FileDeclsInfo &DInfo = I->second; 6661 if (DInfo.Decls.empty()) 6662 return; 6663 6664 SourceLocation 6665 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 6666 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 6667 6668 DeclIDComp DIDComp(*this, *DInfo.Mod); 6669 ArrayRef<serialization::LocalDeclID>::iterator 6670 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 6671 BeginLoc, DIDComp); 6672 if (BeginIt != DInfo.Decls.begin()) 6673 --BeginIt; 6674 6675 // If we are pointing at a top-level decl inside an objc container, we need 6676 // to backtrack until we find it otherwise we will fail to report that the 6677 // region overlaps with an objc container. 6678 while (BeginIt != DInfo.Decls.begin() && 6679 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 6680 ->isTopLevelDeclInObjCContainer()) 6681 --BeginIt; 6682 6683 ArrayRef<serialization::LocalDeclID>::iterator 6684 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 6685 EndLoc, DIDComp); 6686 if (EndIt != DInfo.Decls.end()) 6687 ++EndIt; 6688 6689 for (ArrayRef<serialization::LocalDeclID>::iterator 6690 DIt = BeginIt; DIt != EndIt; ++DIt) 6691 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 6692 } 6693 6694 bool 6695 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 6696 DeclarationName Name) { 6697 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && 6698 "DeclContext has no visible decls in storage"); 6699 if (!Name) 6700 return false; 6701 6702 auto It = Lookups.find(DC); 6703 if (It == Lookups.end()) 6704 return false; 6705 6706 Deserializing LookupResults(this); 6707 6708 // Load the list of declarations. 6709 SmallVector<NamedDecl *, 64> Decls; 6710 for (DeclID ID : It->second.Table.find(Name)) { 6711 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 6712 if (ND->getDeclName() == Name) 6713 Decls.push_back(ND); 6714 } 6715 6716 ++NumVisibleDeclContextsRead; 6717 SetExternalVisibleDeclsForName(DC, Name, Decls); 6718 return !Decls.empty(); 6719 } 6720 6721 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 6722 if (!DC->hasExternalVisibleStorage()) 6723 return; 6724 6725 auto It = Lookups.find(DC); 6726 assert(It != Lookups.end() && 6727 "have external visible storage but no lookup tables"); 6728 6729 DeclsMap Decls; 6730 6731 for (DeclID ID : It->second.Table.findAll()) { 6732 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 6733 Decls[ND->getDeclName()].push_back(ND); 6734 } 6735 6736 ++NumVisibleDeclContextsRead; 6737 6738 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 6739 SetExternalVisibleDeclsForName(DC, I->first, I->second); 6740 } 6741 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 6742 } 6743 6744 const serialization::reader::DeclContextLookupTable * 6745 ASTReader::getLoadedLookupTables(DeclContext *Primary) const { 6746 auto I = Lookups.find(Primary); 6747 return I == Lookups.end() ? nullptr : &I->second; 6748 } 6749 6750 /// \brief Under non-PCH compilation the consumer receives the objc methods 6751 /// before receiving the implementation, and codegen depends on this. 6752 /// We simulate this by deserializing and passing to consumer the methods of the 6753 /// implementation before passing the deserialized implementation decl. 6754 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 6755 ASTConsumer *Consumer) { 6756 assert(ImplD && Consumer); 6757 6758 for (auto *I : ImplD->methods()) 6759 Consumer->HandleInterestingDecl(DeclGroupRef(I)); 6760 6761 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 6762 } 6763 6764 void ASTReader::PassInterestingDeclsToConsumer() { 6765 assert(Consumer); 6766 6767 if (PassingDeclsToConsumer) 6768 return; 6769 6770 // Guard variable to avoid recursively redoing the process of passing 6771 // decls to consumer. 6772 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer, 6773 true); 6774 6775 // Ensure that we've loaded all potentially-interesting declarations 6776 // that need to be eagerly loaded. 6777 for (auto ID : EagerlyDeserializedDecls) 6778 GetDecl(ID); 6779 EagerlyDeserializedDecls.clear(); 6780 6781 while (!InterestingDecls.empty()) { 6782 Decl *D = InterestingDecls.front(); 6783 InterestingDecls.pop_front(); 6784 6785 PassInterestingDeclToConsumer(D); 6786 } 6787 } 6788 6789 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 6790 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 6791 PassObjCImplDeclToConsumer(ImplD, Consumer); 6792 else 6793 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 6794 } 6795 6796 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 6797 this->Consumer = Consumer; 6798 6799 if (Consumer) 6800 PassInterestingDeclsToConsumer(); 6801 6802 if (DeserializationListener) 6803 DeserializationListener->ReaderInitialized(this); 6804 } 6805 6806 void ASTReader::PrintStats() { 6807 std::fprintf(stderr, "*** AST File Statistics:\n"); 6808 6809 unsigned NumTypesLoaded 6810 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 6811 QualType()); 6812 unsigned NumDeclsLoaded 6813 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 6814 (Decl *)nullptr); 6815 unsigned NumIdentifiersLoaded 6816 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 6817 IdentifiersLoaded.end(), 6818 (IdentifierInfo *)nullptr); 6819 unsigned NumMacrosLoaded 6820 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 6821 MacrosLoaded.end(), 6822 (MacroInfo *)nullptr); 6823 unsigned NumSelectorsLoaded 6824 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 6825 SelectorsLoaded.end(), 6826 Selector()); 6827 6828 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 6829 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 6830 NumSLocEntriesRead, TotalNumSLocEntries, 6831 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 6832 if (!TypesLoaded.empty()) 6833 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 6834 NumTypesLoaded, (unsigned)TypesLoaded.size(), 6835 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 6836 if (!DeclsLoaded.empty()) 6837 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 6838 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 6839 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 6840 if (!IdentifiersLoaded.empty()) 6841 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 6842 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 6843 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 6844 if (!MacrosLoaded.empty()) 6845 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 6846 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 6847 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 6848 if (!SelectorsLoaded.empty()) 6849 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 6850 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 6851 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 6852 if (TotalNumStatements) 6853 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 6854 NumStatementsRead, TotalNumStatements, 6855 ((float)NumStatementsRead/TotalNumStatements * 100)); 6856 if (TotalNumMacros) 6857 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 6858 NumMacrosRead, TotalNumMacros, 6859 ((float)NumMacrosRead/TotalNumMacros * 100)); 6860 if (TotalLexicalDeclContexts) 6861 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 6862 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 6863 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 6864 * 100)); 6865 if (TotalVisibleDeclContexts) 6866 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 6867 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 6868 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 6869 * 100)); 6870 if (TotalNumMethodPoolEntries) { 6871 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 6872 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 6873 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 6874 * 100)); 6875 } 6876 if (NumMethodPoolLookups) { 6877 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 6878 NumMethodPoolHits, NumMethodPoolLookups, 6879 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 6880 } 6881 if (NumMethodPoolTableLookups) { 6882 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 6883 NumMethodPoolTableHits, NumMethodPoolTableLookups, 6884 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 6885 * 100.0)); 6886 } 6887 6888 if (NumIdentifierLookupHits) { 6889 std::fprintf(stderr, 6890 " %u / %u identifier table lookups succeeded (%f%%)\n", 6891 NumIdentifierLookupHits, NumIdentifierLookups, 6892 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 6893 } 6894 6895 if (GlobalIndex) { 6896 std::fprintf(stderr, "\n"); 6897 GlobalIndex->printStats(); 6898 } 6899 6900 std::fprintf(stderr, "\n"); 6901 dump(); 6902 std::fprintf(stderr, "\n"); 6903 } 6904 6905 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 6906 static void 6907 dumpModuleIDMap(StringRef Name, 6908 const ContinuousRangeMap<Key, ModuleFile *, 6909 InitialCapacity> &Map) { 6910 if (Map.begin() == Map.end()) 6911 return; 6912 6913 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType; 6914 llvm::errs() << Name << ":\n"; 6915 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 6916 I != IEnd; ++I) { 6917 llvm::errs() << " " << I->first << " -> " << I->second->FileName 6918 << "\n"; 6919 } 6920 } 6921 6922 LLVM_DUMP_METHOD void ASTReader::dump() { 6923 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 6924 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 6925 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 6926 dumpModuleIDMap("Global type map", GlobalTypeMap); 6927 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 6928 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 6929 dumpModuleIDMap("Global macro map", GlobalMacroMap); 6930 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 6931 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 6932 dumpModuleIDMap("Global preprocessed entity map", 6933 GlobalPreprocessedEntityMap); 6934 6935 llvm::errs() << "\n*** PCH/Modules Loaded:"; 6936 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(), 6937 MEnd = ModuleMgr.end(); 6938 M != MEnd; ++M) 6939 (*M)->dump(); 6940 } 6941 6942 /// Return the amount of memory used by memory buffers, breaking down 6943 /// by heap-backed versus mmap'ed memory. 6944 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 6945 for (ModuleConstIterator I = ModuleMgr.begin(), 6946 E = ModuleMgr.end(); I != E; ++I) { 6947 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) { 6948 size_t bytes = buf->getBufferSize(); 6949 switch (buf->getBufferKind()) { 6950 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 6951 sizes.malloc_bytes += bytes; 6952 break; 6953 case llvm::MemoryBuffer::MemoryBuffer_MMap: 6954 sizes.mmap_bytes += bytes; 6955 break; 6956 } 6957 } 6958 } 6959 } 6960 6961 void ASTReader::InitializeSema(Sema &S) { 6962 SemaObj = &S; 6963 S.addExternalSource(this); 6964 6965 // Makes sure any declarations that were deserialized "too early" 6966 // still get added to the identifier's declaration chains. 6967 for (uint64_t ID : PreloadedDeclIDs) { 6968 NamedDecl *D = cast<NamedDecl>(GetDecl(ID)); 6969 pushExternalDeclIntoScope(D, D->getDeclName()); 6970 } 6971 PreloadedDeclIDs.clear(); 6972 6973 // FIXME: What happens if these are changed by a module import? 6974 if (!FPPragmaOptions.empty()) { 6975 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 6976 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0]; 6977 } 6978 6979 // FIXME: What happens if these are changed by a module import? 6980 if (!OpenCLExtensions.empty()) { 6981 unsigned I = 0; 6982 #define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++]; 6983 #include "clang/Basic/OpenCLExtensions.def" 6984 6985 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS"); 6986 } 6987 6988 UpdateSema(); 6989 } 6990 6991 void ASTReader::UpdateSema() { 6992 assert(SemaObj && "no Sema to update"); 6993 6994 // Load the offsets of the declarations that Sema references. 6995 // They will be lazily deserialized when needed. 6996 if (!SemaDeclRefs.empty()) { 6997 assert(SemaDeclRefs.size() % 2 == 0); 6998 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) { 6999 if (!SemaObj->StdNamespace) 7000 SemaObj->StdNamespace = SemaDeclRefs[I]; 7001 if (!SemaObj->StdBadAlloc) 7002 SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 7003 } 7004 SemaDeclRefs.clear(); 7005 } 7006 7007 // Update the state of pragmas. Use the same API as if we had encountered the 7008 // pragma in the source. 7009 if(OptimizeOffPragmaLocation.isValid()) 7010 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation); 7011 if (PragmaMSStructState != -1) 7012 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState); 7013 if (PointersToMembersPragmaLocation.isValid()) { 7014 SemaObj->ActOnPragmaMSPointersToMembers( 7015 (LangOptions::PragmaMSPointersToMembersKind) 7016 PragmaMSPointersToMembersState, 7017 PointersToMembersPragmaLocation); 7018 } 7019 } 7020 7021 IdentifierInfo *ASTReader::get(StringRef Name) { 7022 // Note that we are loading an identifier. 7023 Deserializing AnIdentifier(this); 7024 7025 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 7026 NumIdentifierLookups, 7027 NumIdentifierLookupHits); 7028 7029 // We don't need to do identifier table lookups in C++ modules (we preload 7030 // all interesting declarations, and don't need to use the scope for name 7031 // lookups). Perform the lookup in PCH files, though, since we don't build 7032 // a complete initial identifier table if we're carrying on from a PCH. 7033 if (Context.getLangOpts().CPlusPlus) { 7034 for (auto F : ModuleMgr.pch_modules()) 7035 if (Visitor(*F)) 7036 break; 7037 } else { 7038 // If there is a global index, look there first to determine which modules 7039 // provably do not have any results for this identifier. 7040 GlobalModuleIndex::HitSet Hits; 7041 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 7042 if (!loadGlobalIndex()) { 7043 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 7044 HitsPtr = &Hits; 7045 } 7046 } 7047 7048 ModuleMgr.visit(Visitor, HitsPtr); 7049 } 7050 7051 IdentifierInfo *II = Visitor.getIdentifierInfo(); 7052 markIdentifierUpToDate(II); 7053 return II; 7054 } 7055 7056 namespace clang { 7057 /// \brief An identifier-lookup iterator that enumerates all of the 7058 /// identifiers stored within a set of AST files. 7059 class ASTIdentifierIterator : public IdentifierIterator { 7060 /// \brief The AST reader whose identifiers are being enumerated. 7061 const ASTReader &Reader; 7062 7063 /// \brief The current index into the chain of AST files stored in 7064 /// the AST reader. 7065 unsigned Index; 7066 7067 /// \brief The current position within the identifier lookup table 7068 /// of the current AST file. 7069 ASTIdentifierLookupTable::key_iterator Current; 7070 7071 /// \brief The end position within the identifier lookup table of 7072 /// the current AST file. 7073 ASTIdentifierLookupTable::key_iterator End; 7074 7075 public: 7076 explicit ASTIdentifierIterator(const ASTReader &Reader); 7077 7078 StringRef Next() override; 7079 }; 7080 } 7081 7082 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader) 7083 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) { 7084 ASTIdentifierLookupTable *IdTable 7085 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable; 7086 Current = IdTable->key_begin(); 7087 End = IdTable->key_end(); 7088 } 7089 7090 StringRef ASTIdentifierIterator::Next() { 7091 while (Current == End) { 7092 // If we have exhausted all of our AST files, we're done. 7093 if (Index == 0) 7094 return StringRef(); 7095 7096 --Index; 7097 ASTIdentifierLookupTable *IdTable 7098 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index]. 7099 IdentifierLookupTable; 7100 Current = IdTable->key_begin(); 7101 End = IdTable->key_end(); 7102 } 7103 7104 // We have any identifiers remaining in the current AST file; return 7105 // the next one. 7106 StringRef Result = *Current; 7107 ++Current; 7108 return Result; 7109 } 7110 7111 IdentifierIterator *ASTReader::getIdentifiers() { 7112 if (!loadGlobalIndex()) 7113 return GlobalIndex->createIdentifierIterator(); 7114 7115 return new ASTIdentifierIterator(*this); 7116 } 7117 7118 namespace clang { namespace serialization { 7119 class ReadMethodPoolVisitor { 7120 ASTReader &Reader; 7121 Selector Sel; 7122 unsigned PriorGeneration; 7123 unsigned InstanceBits; 7124 unsigned FactoryBits; 7125 bool InstanceHasMoreThanOneDecl; 7126 bool FactoryHasMoreThanOneDecl; 7127 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 7128 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 7129 7130 public: 7131 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 7132 unsigned PriorGeneration) 7133 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration), 7134 InstanceBits(0), FactoryBits(0), InstanceHasMoreThanOneDecl(false), 7135 FactoryHasMoreThanOneDecl(false) {} 7136 7137 bool operator()(ModuleFile &M) { 7138 if (!M.SelectorLookupTable) 7139 return false; 7140 7141 // If we've already searched this module file, skip it now. 7142 if (M.Generation <= PriorGeneration) 7143 return true; 7144 7145 ++Reader.NumMethodPoolTableLookups; 7146 ASTSelectorLookupTable *PoolTable 7147 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 7148 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel); 7149 if (Pos == PoolTable->end()) 7150 return false; 7151 7152 ++Reader.NumMethodPoolTableHits; 7153 ++Reader.NumSelectorsRead; 7154 // FIXME: Not quite happy with the statistics here. We probably should 7155 // disable this tracking when called via LoadSelector. 7156 // Also, should entries without methods count as misses? 7157 ++Reader.NumMethodPoolEntriesRead; 7158 ASTSelectorLookupTrait::data_type Data = *Pos; 7159 if (Reader.DeserializationListener) 7160 Reader.DeserializationListener->SelectorRead(Data.ID, Sel); 7161 7162 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 7163 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 7164 InstanceBits = Data.InstanceBits; 7165 FactoryBits = Data.FactoryBits; 7166 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl; 7167 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl; 7168 return true; 7169 } 7170 7171 /// \brief Retrieve the instance methods found by this visitor. 7172 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 7173 return InstanceMethods; 7174 } 7175 7176 /// \brief Retrieve the instance methods found by this visitor. 7177 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 7178 return FactoryMethods; 7179 } 7180 7181 unsigned getInstanceBits() const { return InstanceBits; } 7182 unsigned getFactoryBits() const { return FactoryBits; } 7183 bool instanceHasMoreThanOneDecl() const { 7184 return InstanceHasMoreThanOneDecl; 7185 } 7186 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; } 7187 }; 7188 } } // end namespace clang::serialization 7189 7190 /// \brief Add the given set of methods to the method list. 7191 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 7192 ObjCMethodList &List) { 7193 for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 7194 S.addMethodToGlobalList(&List, Methods[I]); 7195 } 7196 } 7197 7198 void ASTReader::ReadMethodPool(Selector Sel) { 7199 // Get the selector generation and update it to the current generation. 7200 unsigned &Generation = SelectorGeneration[Sel]; 7201 unsigned PriorGeneration = Generation; 7202 Generation = getGeneration(); 7203 7204 // Search for methods defined with this selector. 7205 ++NumMethodPoolLookups; 7206 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 7207 ModuleMgr.visit(Visitor); 7208 7209 if (Visitor.getInstanceMethods().empty() && 7210 Visitor.getFactoryMethods().empty()) 7211 return; 7212 7213 ++NumMethodPoolHits; 7214 7215 if (!getSema()) 7216 return; 7217 7218 Sema &S = *getSema(); 7219 Sema::GlobalMethodPool::iterator Pos 7220 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first; 7221 7222 Pos->second.first.setBits(Visitor.getInstanceBits()); 7223 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl()); 7224 Pos->second.second.setBits(Visitor.getFactoryBits()); 7225 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl()); 7226 7227 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since 7228 // when building a module we keep every method individually and may need to 7229 // update hasMoreThanOneDecl as we add the methods. 7230 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 7231 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 7232 } 7233 7234 void ASTReader::ReadKnownNamespaces( 7235 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 7236 Namespaces.clear(); 7237 7238 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 7239 if (NamespaceDecl *Namespace 7240 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 7241 Namespaces.push_back(Namespace); 7242 } 7243 } 7244 7245 void ASTReader::ReadUndefinedButUsed( 7246 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) { 7247 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 7248 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 7249 SourceLocation Loc = 7250 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 7251 Undefined.insert(std::make_pair(D, Loc)); 7252 } 7253 } 7254 7255 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector< 7256 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> & 7257 Exprs) { 7258 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) { 7259 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++])); 7260 uint64_t Count = DelayedDeleteExprs[Idx++]; 7261 for (uint64_t C = 0; C < Count; ++C) { 7262 SourceLocation DeleteLoc = 7263 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]); 7264 const bool IsArrayForm = DelayedDeleteExprs[Idx++]; 7265 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm)); 7266 } 7267 } 7268 } 7269 7270 void ASTReader::ReadTentativeDefinitions( 7271 SmallVectorImpl<VarDecl *> &TentativeDefs) { 7272 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 7273 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 7274 if (Var) 7275 TentativeDefs.push_back(Var); 7276 } 7277 TentativeDefinitions.clear(); 7278 } 7279 7280 void ASTReader::ReadUnusedFileScopedDecls( 7281 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 7282 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 7283 DeclaratorDecl *D 7284 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 7285 if (D) 7286 Decls.push_back(D); 7287 } 7288 UnusedFileScopedDecls.clear(); 7289 } 7290 7291 void ASTReader::ReadDelegatingConstructors( 7292 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 7293 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 7294 CXXConstructorDecl *D 7295 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 7296 if (D) 7297 Decls.push_back(D); 7298 } 7299 DelegatingCtorDecls.clear(); 7300 } 7301 7302 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 7303 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 7304 TypedefNameDecl *D 7305 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 7306 if (D) 7307 Decls.push_back(D); 7308 } 7309 ExtVectorDecls.clear(); 7310 } 7311 7312 void ASTReader::ReadUnusedLocalTypedefNameCandidates( 7313 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 7314 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N; 7315 ++I) { 7316 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>( 7317 GetDecl(UnusedLocalTypedefNameCandidates[I])); 7318 if (D) 7319 Decls.insert(D); 7320 } 7321 UnusedLocalTypedefNameCandidates.clear(); 7322 } 7323 7324 void ASTReader::ReadReferencedSelectors( 7325 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) { 7326 if (ReferencedSelectorsData.empty()) 7327 return; 7328 7329 // If there are @selector references added them to its pool. This is for 7330 // implementation of -Wselector. 7331 unsigned int DataSize = ReferencedSelectorsData.size()-1; 7332 unsigned I = 0; 7333 while (I < DataSize) { 7334 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 7335 SourceLocation SelLoc 7336 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 7337 Sels.push_back(std::make_pair(Sel, SelLoc)); 7338 } 7339 ReferencedSelectorsData.clear(); 7340 } 7341 7342 void ASTReader::ReadWeakUndeclaredIdentifiers( 7343 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) { 7344 if (WeakUndeclaredIdentifiers.empty()) 7345 return; 7346 7347 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 7348 IdentifierInfo *WeakId 7349 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 7350 IdentifierInfo *AliasId 7351 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 7352 SourceLocation Loc 7353 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 7354 bool Used = WeakUndeclaredIdentifiers[I++]; 7355 WeakInfo WI(AliasId, Loc); 7356 WI.setUsed(Used); 7357 WeakIDs.push_back(std::make_pair(WeakId, WI)); 7358 } 7359 WeakUndeclaredIdentifiers.clear(); 7360 } 7361 7362 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 7363 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 7364 ExternalVTableUse VT; 7365 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 7366 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 7367 VT.DefinitionRequired = VTableUses[Idx++]; 7368 VTables.push_back(VT); 7369 } 7370 7371 VTableUses.clear(); 7372 } 7373 7374 void ASTReader::ReadPendingInstantiations( 7375 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) { 7376 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 7377 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 7378 SourceLocation Loc 7379 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 7380 7381 Pending.push_back(std::make_pair(D, Loc)); 7382 } 7383 PendingInstantiations.clear(); 7384 } 7385 7386 void ASTReader::ReadLateParsedTemplates( 7387 llvm::MapVector<const FunctionDecl *, LateParsedTemplate *> &LPTMap) { 7388 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N; 7389 /* In loop */) { 7390 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++])); 7391 7392 LateParsedTemplate *LT = new LateParsedTemplate; 7393 LT->D = GetDecl(LateParsedTemplates[Idx++]); 7394 7395 ModuleFile *F = getOwningModuleFile(LT->D); 7396 assert(F && "No module"); 7397 7398 unsigned TokN = LateParsedTemplates[Idx++]; 7399 LT->Toks.reserve(TokN); 7400 for (unsigned T = 0; T < TokN; ++T) 7401 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx)); 7402 7403 LPTMap.insert(std::make_pair(FD, LT)); 7404 } 7405 7406 LateParsedTemplates.clear(); 7407 } 7408 7409 void ASTReader::LoadSelector(Selector Sel) { 7410 // It would be complicated to avoid reading the methods anyway. So don't. 7411 ReadMethodPool(Sel); 7412 } 7413 7414 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 7415 assert(ID && "Non-zero identifier ID required"); 7416 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 7417 IdentifiersLoaded[ID - 1] = II; 7418 if (DeserializationListener) 7419 DeserializationListener->IdentifierRead(ID, II); 7420 } 7421 7422 /// \brief Set the globally-visible declarations associated with the given 7423 /// identifier. 7424 /// 7425 /// If the AST reader is currently in a state where the given declaration IDs 7426 /// cannot safely be resolved, they are queued until it is safe to resolve 7427 /// them. 7428 /// 7429 /// \param II an IdentifierInfo that refers to one or more globally-visible 7430 /// declarations. 7431 /// 7432 /// \param DeclIDs the set of declaration IDs with the name @p II that are 7433 /// visible at global scope. 7434 /// 7435 /// \param Decls if non-null, this vector will be populated with the set of 7436 /// deserialized declarations. These declarations will not be pushed into 7437 /// scope. 7438 void 7439 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 7440 const SmallVectorImpl<uint32_t> &DeclIDs, 7441 SmallVectorImpl<Decl *> *Decls) { 7442 if (NumCurrentElementsDeserializing && !Decls) { 7443 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 7444 return; 7445 } 7446 7447 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 7448 if (!SemaObj) { 7449 // Queue this declaration so that it will be added to the 7450 // translation unit scope and identifier's declaration chain 7451 // once a Sema object is known. 7452 PreloadedDeclIDs.push_back(DeclIDs[I]); 7453 continue; 7454 } 7455 7456 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 7457 7458 // If we're simply supposed to record the declarations, do so now. 7459 if (Decls) { 7460 Decls->push_back(D); 7461 continue; 7462 } 7463 7464 // Introduce this declaration into the translation-unit scope 7465 // and add it to the declaration chain for this identifier, so 7466 // that (unqualified) name lookup will find it. 7467 pushExternalDeclIntoScope(D, II); 7468 } 7469 } 7470 7471 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 7472 if (ID == 0) 7473 return nullptr; 7474 7475 if (IdentifiersLoaded.empty()) { 7476 Error("no identifier table in AST file"); 7477 return nullptr; 7478 } 7479 7480 ID -= 1; 7481 if (!IdentifiersLoaded[ID]) { 7482 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 7483 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 7484 ModuleFile *M = I->second; 7485 unsigned Index = ID - M->BaseIdentifierID; 7486 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index]; 7487 7488 // All of the strings in the AST file are preceded by a 16-bit length. 7489 // Extract that 16-bit length to avoid having to execute strlen(). 7490 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as 7491 // unsigned integers. This is important to avoid integer overflow when 7492 // we cast them to 'unsigned'. 7493 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2; 7494 unsigned StrLen = (((unsigned) StrLenPtr[0]) 7495 | (((unsigned) StrLenPtr[1]) << 8)) - 1; 7496 auto &II = PP.getIdentifierTable().get(StringRef(Str, StrLen)); 7497 IdentifiersLoaded[ID] = &II; 7498 markIdentifierFromAST(*this, II); 7499 if (DeserializationListener) 7500 DeserializationListener->IdentifierRead(ID + 1, &II); 7501 } 7502 7503 return IdentifiersLoaded[ID]; 7504 } 7505 7506 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 7507 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 7508 } 7509 7510 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 7511 if (LocalID < NUM_PREDEF_IDENT_IDS) 7512 return LocalID; 7513 7514 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7515 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 7516 assert(I != M.IdentifierRemap.end() 7517 && "Invalid index into identifier index remap"); 7518 7519 return LocalID + I->second; 7520 } 7521 7522 MacroInfo *ASTReader::getMacro(MacroID ID) { 7523 if (ID == 0) 7524 return nullptr; 7525 7526 if (MacrosLoaded.empty()) { 7527 Error("no macro table in AST file"); 7528 return nullptr; 7529 } 7530 7531 ID -= NUM_PREDEF_MACRO_IDS; 7532 if (!MacrosLoaded[ID]) { 7533 GlobalMacroMapType::iterator I 7534 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 7535 assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 7536 ModuleFile *M = I->second; 7537 unsigned Index = ID - M->BaseMacroID; 7538 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]); 7539 7540 if (DeserializationListener) 7541 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 7542 MacrosLoaded[ID]); 7543 } 7544 7545 return MacrosLoaded[ID]; 7546 } 7547 7548 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 7549 if (LocalID < NUM_PREDEF_MACRO_IDS) 7550 return LocalID; 7551 7552 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7553 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 7554 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 7555 7556 return LocalID + I->second; 7557 } 7558 7559 serialization::SubmoduleID 7560 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 7561 if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 7562 return LocalID; 7563 7564 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7565 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 7566 assert(I != M.SubmoduleRemap.end() 7567 && "Invalid index into submodule index remap"); 7568 7569 return LocalID + I->second; 7570 } 7571 7572 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) { 7573 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 7574 assert(GlobalID == 0 && "Unhandled global submodule ID"); 7575 return nullptr; 7576 } 7577 7578 if (GlobalID > SubmodulesLoaded.size()) { 7579 Error("submodule ID out of range in AST file"); 7580 return nullptr; 7581 } 7582 7583 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 7584 } 7585 7586 Module *ASTReader::getModule(unsigned ID) { 7587 return getSubmodule(ID); 7588 } 7589 7590 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) { 7591 if (ID & 1) { 7592 // It's a module, look it up by submodule ID. 7593 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1)); 7594 return I == GlobalSubmoduleMap.end() ? nullptr : I->second; 7595 } else { 7596 // It's a prefix (preamble, PCH, ...). Look it up by index. 7597 unsigned IndexFromEnd = ID >> 1; 7598 assert(IndexFromEnd && "got reference to unknown module file"); 7599 return getModuleManager().pch_modules().end()[-IndexFromEnd]; 7600 } 7601 } 7602 7603 unsigned ASTReader::getModuleFileID(ModuleFile *F) { 7604 if (!F) 7605 return 1; 7606 7607 // For a file representing a module, use the submodule ID of the top-level 7608 // module as the file ID. For any other kind of file, the number of such 7609 // files loaded beforehand will be the same on reload. 7610 // FIXME: Is this true even if we have an explicit module file and a PCH? 7611 if (F->isModule()) 7612 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1; 7613 7614 auto PCHModules = getModuleManager().pch_modules(); 7615 auto I = std::find(PCHModules.begin(), PCHModules.end(), F); 7616 assert(I != PCHModules.end() && "emitting reference to unknown file"); 7617 return (I - PCHModules.end()) << 1; 7618 } 7619 7620 llvm::Optional<ExternalASTSource::ASTSourceDescriptor> 7621 ASTReader::getSourceDescriptor(unsigned ID) { 7622 if (const Module *M = getSubmodule(ID)) 7623 return ExternalASTSource::ASTSourceDescriptor(*M); 7624 7625 // If there is only a single PCH, return it instead. 7626 // Chained PCH are not suported. 7627 if (ModuleMgr.size() == 1) { 7628 ModuleFile &MF = ModuleMgr.getPrimaryModule(); 7629 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName); 7630 return ASTReader::ASTSourceDescriptor(ModuleName, MF.OriginalDir, 7631 MF.FileName, MF.Signature); 7632 } 7633 return None; 7634 } 7635 7636 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 7637 return DecodeSelector(getGlobalSelectorID(M, LocalID)); 7638 } 7639 7640 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { 7641 if (ID == 0) 7642 return Selector(); 7643 7644 if (ID > SelectorsLoaded.size()) { 7645 Error("selector ID out of range in AST file"); 7646 return Selector(); 7647 } 7648 7649 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) { 7650 // Load this selector from the selector table. 7651 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 7652 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 7653 ModuleFile &M = *I->second; 7654 ASTSelectorLookupTrait Trait(*this, M); 7655 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 7656 SelectorsLoaded[ID - 1] = 7657 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 7658 if (DeserializationListener) 7659 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 7660 } 7661 7662 return SelectorsLoaded[ID - 1]; 7663 } 7664 7665 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 7666 return DecodeSelector(ID); 7667 } 7668 7669 uint32_t ASTReader::GetNumExternalSelectors() { 7670 // ID 0 (the null selector) is considered an external selector. 7671 return getTotalNumSelectors() + 1; 7672 } 7673 7674 serialization::SelectorID 7675 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 7676 if (LocalID < NUM_PREDEF_SELECTOR_IDS) 7677 return LocalID; 7678 7679 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7680 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 7681 assert(I != M.SelectorRemap.end() 7682 && "Invalid index into selector index remap"); 7683 7684 return LocalID + I->second; 7685 } 7686 7687 DeclarationName 7688 ASTReader::ReadDeclarationName(ModuleFile &F, 7689 const RecordData &Record, unsigned &Idx) { 7690 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++]; 7691 switch (Kind) { 7692 case DeclarationName::Identifier: 7693 return DeclarationName(GetIdentifierInfo(F, Record, Idx)); 7694 7695 case DeclarationName::ObjCZeroArgSelector: 7696 case DeclarationName::ObjCOneArgSelector: 7697 case DeclarationName::ObjCMultiArgSelector: 7698 return DeclarationName(ReadSelector(F, Record, Idx)); 7699 7700 case DeclarationName::CXXConstructorName: 7701 return Context.DeclarationNames.getCXXConstructorName( 7702 Context.getCanonicalType(readType(F, Record, Idx))); 7703 7704 case DeclarationName::CXXDestructorName: 7705 return Context.DeclarationNames.getCXXDestructorName( 7706 Context.getCanonicalType(readType(F, Record, Idx))); 7707 7708 case DeclarationName::CXXConversionFunctionName: 7709 return Context.DeclarationNames.getCXXConversionFunctionName( 7710 Context.getCanonicalType(readType(F, Record, Idx))); 7711 7712 case DeclarationName::CXXOperatorName: 7713 return Context.DeclarationNames.getCXXOperatorName( 7714 (OverloadedOperatorKind)Record[Idx++]); 7715 7716 case DeclarationName::CXXLiteralOperatorName: 7717 return Context.DeclarationNames.getCXXLiteralOperatorName( 7718 GetIdentifierInfo(F, Record, Idx)); 7719 7720 case DeclarationName::CXXUsingDirective: 7721 return DeclarationName::getUsingDirectiveName(); 7722 } 7723 7724 llvm_unreachable("Invalid NameKind!"); 7725 } 7726 7727 void ASTReader::ReadDeclarationNameLoc(ModuleFile &F, 7728 DeclarationNameLoc &DNLoc, 7729 DeclarationName Name, 7730 const RecordData &Record, unsigned &Idx) { 7731 switch (Name.getNameKind()) { 7732 case DeclarationName::CXXConstructorName: 7733 case DeclarationName::CXXDestructorName: 7734 case DeclarationName::CXXConversionFunctionName: 7735 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx); 7736 break; 7737 7738 case DeclarationName::CXXOperatorName: 7739 DNLoc.CXXOperatorName.BeginOpNameLoc 7740 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 7741 DNLoc.CXXOperatorName.EndOpNameLoc 7742 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 7743 break; 7744 7745 case DeclarationName::CXXLiteralOperatorName: 7746 DNLoc.CXXLiteralOperatorName.OpNameLoc 7747 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 7748 break; 7749 7750 case DeclarationName::Identifier: 7751 case DeclarationName::ObjCZeroArgSelector: 7752 case DeclarationName::ObjCOneArgSelector: 7753 case DeclarationName::ObjCMultiArgSelector: 7754 case DeclarationName::CXXUsingDirective: 7755 break; 7756 } 7757 } 7758 7759 void ASTReader::ReadDeclarationNameInfo(ModuleFile &F, 7760 DeclarationNameInfo &NameInfo, 7761 const RecordData &Record, unsigned &Idx) { 7762 NameInfo.setName(ReadDeclarationName(F, Record, Idx)); 7763 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx)); 7764 DeclarationNameLoc DNLoc; 7765 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx); 7766 NameInfo.setInfo(DNLoc); 7767 } 7768 7769 void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info, 7770 const RecordData &Record, unsigned &Idx) { 7771 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx); 7772 unsigned NumTPLists = Record[Idx++]; 7773 Info.NumTemplParamLists = NumTPLists; 7774 if (NumTPLists) { 7775 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists]; 7776 for (unsigned i=0; i != NumTPLists; ++i) 7777 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx); 7778 } 7779 } 7780 7781 TemplateName 7782 ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record, 7783 unsigned &Idx) { 7784 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++]; 7785 switch (Kind) { 7786 case TemplateName::Template: 7787 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx)); 7788 7789 case TemplateName::OverloadedTemplate: { 7790 unsigned size = Record[Idx++]; 7791 UnresolvedSet<8> Decls; 7792 while (size--) 7793 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx)); 7794 7795 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end()); 7796 } 7797 7798 case TemplateName::QualifiedTemplate: { 7799 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 7800 bool hasTemplKeyword = Record[Idx++]; 7801 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx); 7802 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template); 7803 } 7804 7805 case TemplateName::DependentTemplate: { 7806 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 7807 if (Record[Idx++]) // isIdentifier 7808 return Context.getDependentTemplateName(NNS, 7809 GetIdentifierInfo(F, Record, 7810 Idx)); 7811 return Context.getDependentTemplateName(NNS, 7812 (OverloadedOperatorKind)Record[Idx++]); 7813 } 7814 7815 case TemplateName::SubstTemplateTemplateParm: { 7816 TemplateTemplateParmDecl *param 7817 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 7818 if (!param) return TemplateName(); 7819 TemplateName replacement = ReadTemplateName(F, Record, Idx); 7820 return Context.getSubstTemplateTemplateParm(param, replacement); 7821 } 7822 7823 case TemplateName::SubstTemplateTemplateParmPack: { 7824 TemplateTemplateParmDecl *Param 7825 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 7826 if (!Param) 7827 return TemplateName(); 7828 7829 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx); 7830 if (ArgPack.getKind() != TemplateArgument::Pack) 7831 return TemplateName(); 7832 7833 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 7834 } 7835 } 7836 7837 llvm_unreachable("Unhandled template name kind!"); 7838 } 7839 7840 TemplateArgument ASTReader::ReadTemplateArgument(ModuleFile &F, 7841 const RecordData &Record, 7842 unsigned &Idx, 7843 bool Canonicalize) { 7844 if (Canonicalize) { 7845 // The caller wants a canonical template argument. Sometimes the AST only 7846 // wants template arguments in canonical form (particularly as the template 7847 // argument lists of template specializations) so ensure we preserve that 7848 // canonical form across serialization. 7849 TemplateArgument Arg = ReadTemplateArgument(F, Record, Idx, false); 7850 return Context.getCanonicalTemplateArgument(Arg); 7851 } 7852 7853 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++]; 7854 switch (Kind) { 7855 case TemplateArgument::Null: 7856 return TemplateArgument(); 7857 case TemplateArgument::Type: 7858 return TemplateArgument(readType(F, Record, Idx)); 7859 case TemplateArgument::Declaration: { 7860 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx); 7861 return TemplateArgument(D, readType(F, Record, Idx)); 7862 } 7863 case TemplateArgument::NullPtr: 7864 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true); 7865 case TemplateArgument::Integral: { 7866 llvm::APSInt Value = ReadAPSInt(Record, Idx); 7867 QualType T = readType(F, Record, Idx); 7868 return TemplateArgument(Context, Value, T); 7869 } 7870 case TemplateArgument::Template: 7871 return TemplateArgument(ReadTemplateName(F, Record, Idx)); 7872 case TemplateArgument::TemplateExpansion: { 7873 TemplateName Name = ReadTemplateName(F, Record, Idx); 7874 Optional<unsigned> NumTemplateExpansions; 7875 if (unsigned NumExpansions = Record[Idx++]) 7876 NumTemplateExpansions = NumExpansions - 1; 7877 return TemplateArgument(Name, NumTemplateExpansions); 7878 } 7879 case TemplateArgument::Expression: 7880 return TemplateArgument(ReadExpr(F)); 7881 case TemplateArgument::Pack: { 7882 unsigned NumArgs = Record[Idx++]; 7883 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs]; 7884 for (unsigned I = 0; I != NumArgs; ++I) 7885 Args[I] = ReadTemplateArgument(F, Record, Idx); 7886 return TemplateArgument(llvm::makeArrayRef(Args, NumArgs)); 7887 } 7888 } 7889 7890 llvm_unreachable("Unhandled template argument kind!"); 7891 } 7892 7893 TemplateParameterList * 7894 ASTReader::ReadTemplateParameterList(ModuleFile &F, 7895 const RecordData &Record, unsigned &Idx) { 7896 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx); 7897 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx); 7898 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx); 7899 7900 unsigned NumParams = Record[Idx++]; 7901 SmallVector<NamedDecl *, 16> Params; 7902 Params.reserve(NumParams); 7903 while (NumParams--) 7904 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx)); 7905 7906 TemplateParameterList* TemplateParams = 7907 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc, 7908 Params, RAngleLoc); 7909 return TemplateParams; 7910 } 7911 7912 void 7913 ASTReader:: 7914 ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs, 7915 ModuleFile &F, const RecordData &Record, 7916 unsigned &Idx, bool Canonicalize) { 7917 unsigned NumTemplateArgs = Record[Idx++]; 7918 TemplArgs.reserve(NumTemplateArgs); 7919 while (NumTemplateArgs--) 7920 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx, Canonicalize)); 7921 } 7922 7923 /// \brief Read a UnresolvedSet structure. 7924 void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set, 7925 const RecordData &Record, unsigned &Idx) { 7926 unsigned NumDecls = Record[Idx++]; 7927 Set.reserve(Context, NumDecls); 7928 while (NumDecls--) { 7929 DeclID ID = ReadDeclID(F, Record, Idx); 7930 AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 7931 Set.addLazyDecl(Context, ID, AS); 7932 } 7933 } 7934 7935 CXXBaseSpecifier 7936 ASTReader::ReadCXXBaseSpecifier(ModuleFile &F, 7937 const RecordData &Record, unsigned &Idx) { 7938 bool isVirtual = static_cast<bool>(Record[Idx++]); 7939 bool isBaseOfClass = static_cast<bool>(Record[Idx++]); 7940 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]); 7941 bool inheritConstructors = static_cast<bool>(Record[Idx++]); 7942 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx); 7943 SourceRange Range = ReadSourceRange(F, Record, Idx); 7944 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx); 7945 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 7946 EllipsisLoc); 7947 Result.setInheritConstructors(inheritConstructors); 7948 return Result; 7949 } 7950 7951 CXXCtorInitializer ** 7952 ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record, 7953 unsigned &Idx) { 7954 unsigned NumInitializers = Record[Idx++]; 7955 assert(NumInitializers && "wrote ctor initializers but have no inits"); 7956 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers]; 7957 for (unsigned i = 0; i != NumInitializers; ++i) { 7958 TypeSourceInfo *TInfo = nullptr; 7959 bool IsBaseVirtual = false; 7960 FieldDecl *Member = nullptr; 7961 IndirectFieldDecl *IndirectMember = nullptr; 7962 7963 CtorInitializerType Type = (CtorInitializerType)Record[Idx++]; 7964 switch (Type) { 7965 case CTOR_INITIALIZER_BASE: 7966 TInfo = GetTypeSourceInfo(F, Record, Idx); 7967 IsBaseVirtual = Record[Idx++]; 7968 break; 7969 7970 case CTOR_INITIALIZER_DELEGATING: 7971 TInfo = GetTypeSourceInfo(F, Record, Idx); 7972 break; 7973 7974 case CTOR_INITIALIZER_MEMBER: 7975 Member = ReadDeclAs<FieldDecl>(F, Record, Idx); 7976 break; 7977 7978 case CTOR_INITIALIZER_INDIRECT_MEMBER: 7979 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx); 7980 break; 7981 } 7982 7983 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx); 7984 Expr *Init = ReadExpr(F); 7985 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx); 7986 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx); 7987 bool IsWritten = Record[Idx++]; 7988 unsigned SourceOrderOrNumArrayIndices; 7989 SmallVector<VarDecl *, 8> Indices; 7990 if (IsWritten) { 7991 SourceOrderOrNumArrayIndices = Record[Idx++]; 7992 } else { 7993 SourceOrderOrNumArrayIndices = Record[Idx++]; 7994 Indices.reserve(SourceOrderOrNumArrayIndices); 7995 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i) 7996 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx)); 7997 } 7998 7999 CXXCtorInitializer *BOMInit; 8000 if (Type == CTOR_INITIALIZER_BASE) { 8001 BOMInit = new (Context) 8002 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init, 8003 RParenLoc, MemberOrEllipsisLoc); 8004 } else if (Type == CTOR_INITIALIZER_DELEGATING) { 8005 BOMInit = new (Context) 8006 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc); 8007 } else if (IsWritten) { 8008 if (Member) 8009 BOMInit = new (Context) CXXCtorInitializer( 8010 Context, Member, MemberOrEllipsisLoc, LParenLoc, Init, RParenLoc); 8011 else 8012 BOMInit = new (Context) 8013 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc, 8014 LParenLoc, Init, RParenLoc); 8015 } else { 8016 if (IndirectMember) { 8017 assert(Indices.empty() && "Indirect field improperly initialized"); 8018 BOMInit = new (Context) 8019 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc, 8020 LParenLoc, Init, RParenLoc); 8021 } else { 8022 BOMInit = CXXCtorInitializer::Create( 8023 Context, Member, MemberOrEllipsisLoc, LParenLoc, Init, RParenLoc, 8024 Indices.data(), Indices.size()); 8025 } 8026 } 8027 8028 if (IsWritten) 8029 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices); 8030 CtorInitializers[i] = BOMInit; 8031 } 8032 8033 return CtorInitializers; 8034 } 8035 8036 NestedNameSpecifier * 8037 ASTReader::ReadNestedNameSpecifier(ModuleFile &F, 8038 const RecordData &Record, unsigned &Idx) { 8039 unsigned N = Record[Idx++]; 8040 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr; 8041 for (unsigned I = 0; I != N; ++I) { 8042 NestedNameSpecifier::SpecifierKind Kind 8043 = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 8044 switch (Kind) { 8045 case NestedNameSpecifier::Identifier: { 8046 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 8047 NNS = NestedNameSpecifier::Create(Context, Prev, II); 8048 break; 8049 } 8050 8051 case NestedNameSpecifier::Namespace: { 8052 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 8053 NNS = NestedNameSpecifier::Create(Context, Prev, NS); 8054 break; 8055 } 8056 8057 case NestedNameSpecifier::NamespaceAlias: { 8058 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 8059 NNS = NestedNameSpecifier::Create(Context, Prev, Alias); 8060 break; 8061 } 8062 8063 case NestedNameSpecifier::TypeSpec: 8064 case NestedNameSpecifier::TypeSpecWithTemplate: { 8065 const Type *T = readType(F, Record, Idx).getTypePtrOrNull(); 8066 if (!T) 8067 return nullptr; 8068 8069 bool Template = Record[Idx++]; 8070 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T); 8071 break; 8072 } 8073 8074 case NestedNameSpecifier::Global: { 8075 NNS = NestedNameSpecifier::GlobalSpecifier(Context); 8076 // No associated value, and there can't be a prefix. 8077 break; 8078 } 8079 8080 case NestedNameSpecifier::Super: { 8081 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx); 8082 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD); 8083 break; 8084 } 8085 } 8086 Prev = NNS; 8087 } 8088 return NNS; 8089 } 8090 8091 NestedNameSpecifierLoc 8092 ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record, 8093 unsigned &Idx) { 8094 unsigned N = Record[Idx++]; 8095 NestedNameSpecifierLocBuilder Builder; 8096 for (unsigned I = 0; I != N; ++I) { 8097 NestedNameSpecifier::SpecifierKind Kind 8098 = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 8099 switch (Kind) { 8100 case NestedNameSpecifier::Identifier: { 8101 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 8102 SourceRange Range = ReadSourceRange(F, Record, Idx); 8103 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 8104 break; 8105 } 8106 8107 case NestedNameSpecifier::Namespace: { 8108 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 8109 SourceRange Range = ReadSourceRange(F, Record, Idx); 8110 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 8111 break; 8112 } 8113 8114 case NestedNameSpecifier::NamespaceAlias: { 8115 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 8116 SourceRange Range = ReadSourceRange(F, Record, Idx); 8117 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 8118 break; 8119 } 8120 8121 case NestedNameSpecifier::TypeSpec: 8122 case NestedNameSpecifier::TypeSpecWithTemplate: { 8123 bool Template = Record[Idx++]; 8124 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx); 8125 if (!T) 8126 return NestedNameSpecifierLoc(); 8127 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 8128 8129 // FIXME: 'template' keyword location not saved anywhere, so we fake it. 8130 Builder.Extend(Context, 8131 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 8132 T->getTypeLoc(), ColonColonLoc); 8133 break; 8134 } 8135 8136 case NestedNameSpecifier::Global: { 8137 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 8138 Builder.MakeGlobal(Context, ColonColonLoc); 8139 break; 8140 } 8141 8142 case NestedNameSpecifier::Super: { 8143 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx); 8144 SourceRange Range = ReadSourceRange(F, Record, Idx); 8145 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd()); 8146 break; 8147 } 8148 } 8149 } 8150 8151 return Builder.getWithLocInContext(Context); 8152 } 8153 8154 SourceRange 8155 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 8156 unsigned &Idx) { 8157 SourceLocation beg = ReadSourceLocation(F, Record, Idx); 8158 SourceLocation end = ReadSourceLocation(F, Record, Idx); 8159 return SourceRange(beg, end); 8160 } 8161 8162 /// \brief Read an integral value 8163 llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) { 8164 unsigned BitWidth = Record[Idx++]; 8165 unsigned NumWords = llvm::APInt::getNumWords(BitWidth); 8166 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]); 8167 Idx += NumWords; 8168 return Result; 8169 } 8170 8171 /// \brief Read a signed integral value 8172 llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) { 8173 bool isUnsigned = Record[Idx++]; 8174 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned); 8175 } 8176 8177 /// \brief Read a floating-point value 8178 llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record, 8179 const llvm::fltSemantics &Sem, 8180 unsigned &Idx) { 8181 return llvm::APFloat(Sem, ReadAPInt(Record, Idx)); 8182 } 8183 8184 // \brief Read a string 8185 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 8186 unsigned Len = Record[Idx++]; 8187 std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 8188 Idx += Len; 8189 return Result; 8190 } 8191 8192 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record, 8193 unsigned &Idx) { 8194 std::string Filename = ReadString(Record, Idx); 8195 ResolveImportedPath(F, Filename); 8196 return Filename; 8197 } 8198 8199 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 8200 unsigned &Idx) { 8201 unsigned Major = Record[Idx++]; 8202 unsigned Minor = Record[Idx++]; 8203 unsigned Subminor = Record[Idx++]; 8204 if (Minor == 0) 8205 return VersionTuple(Major); 8206 if (Subminor == 0) 8207 return VersionTuple(Major, Minor - 1); 8208 return VersionTuple(Major, Minor - 1, Subminor - 1); 8209 } 8210 8211 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 8212 const RecordData &Record, 8213 unsigned &Idx) { 8214 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 8215 return CXXTemporary::Create(Context, Decl); 8216 } 8217 8218 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) { 8219 return Diag(CurrentImportLoc, DiagID); 8220 } 8221 8222 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) { 8223 return Diags.Report(Loc, DiagID); 8224 } 8225 8226 /// \brief Retrieve the identifier table associated with the 8227 /// preprocessor. 8228 IdentifierTable &ASTReader::getIdentifierTable() { 8229 return PP.getIdentifierTable(); 8230 } 8231 8232 /// \brief Record that the given ID maps to the given switch-case 8233 /// statement. 8234 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 8235 assert((*CurrSwitchCaseStmts)[ID] == nullptr && 8236 "Already have a SwitchCase with this ID"); 8237 (*CurrSwitchCaseStmts)[ID] = SC; 8238 } 8239 8240 /// \brief Retrieve the switch-case statement with the given ID. 8241 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 8242 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID"); 8243 return (*CurrSwitchCaseStmts)[ID]; 8244 } 8245 8246 void ASTReader::ClearSwitchCaseIDs() { 8247 CurrSwitchCaseStmts->clear(); 8248 } 8249 8250 void ASTReader::ReadComments() { 8251 std::vector<RawComment *> Comments; 8252 for (SmallVectorImpl<std::pair<BitstreamCursor, 8253 serialization::ModuleFile *> >::iterator 8254 I = CommentsCursors.begin(), 8255 E = CommentsCursors.end(); 8256 I != E; ++I) { 8257 Comments.clear(); 8258 BitstreamCursor &Cursor = I->first; 8259 serialization::ModuleFile &F = *I->second; 8260 SavedStreamPosition SavedPosition(Cursor); 8261 8262 RecordData Record; 8263 while (true) { 8264 llvm::BitstreamEntry Entry = 8265 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd); 8266 8267 switch (Entry.Kind) { 8268 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 8269 case llvm::BitstreamEntry::Error: 8270 Error("malformed block record in AST file"); 8271 return; 8272 case llvm::BitstreamEntry::EndBlock: 8273 goto NextCursor; 8274 case llvm::BitstreamEntry::Record: 8275 // The interesting case. 8276 break; 8277 } 8278 8279 // Read a record. 8280 Record.clear(); 8281 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) { 8282 case COMMENTS_RAW_COMMENT: { 8283 unsigned Idx = 0; 8284 SourceRange SR = ReadSourceRange(F, Record, Idx); 8285 RawComment::CommentKind Kind = 8286 (RawComment::CommentKind) Record[Idx++]; 8287 bool IsTrailingComment = Record[Idx++]; 8288 bool IsAlmostTrailingComment = Record[Idx++]; 8289 Comments.push_back(new (Context) RawComment( 8290 SR, Kind, IsTrailingComment, IsAlmostTrailingComment, 8291 Context.getLangOpts().CommentOpts.ParseAllComments)); 8292 break; 8293 } 8294 } 8295 } 8296 NextCursor: 8297 Context.Comments.addDeserializedComments(Comments); 8298 } 8299 } 8300 8301 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) { 8302 // If we know the owning module, use it. 8303 if (Module *M = D->getImportedOwningModule()) 8304 return M->getFullModuleName(); 8305 8306 // Otherwise, use the name of the top-level module the decl is within. 8307 if (ModuleFile *M = getOwningModuleFile(D)) 8308 return M->ModuleName; 8309 8310 // Not from a module. 8311 return ""; 8312 } 8313 8314 void ASTReader::finishPendingActions() { 8315 while (!PendingIdentifierInfos.empty() || 8316 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() || 8317 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || 8318 !PendingUpdateRecords.empty()) { 8319 // If any identifiers with corresponding top-level declarations have 8320 // been loaded, load those declarations now. 8321 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> > 8322 TopLevelDeclsMap; 8323 TopLevelDeclsMap TopLevelDecls; 8324 8325 while (!PendingIdentifierInfos.empty()) { 8326 IdentifierInfo *II = PendingIdentifierInfos.back().first; 8327 SmallVector<uint32_t, 4> DeclIDs = 8328 std::move(PendingIdentifierInfos.back().second); 8329 PendingIdentifierInfos.pop_back(); 8330 8331 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 8332 } 8333 8334 // For each decl chain that we wanted to complete while deserializing, mark 8335 // it as "still needs to be completed". 8336 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) { 8337 markIncompleteDeclChain(PendingIncompleteDeclChains[I]); 8338 } 8339 PendingIncompleteDeclChains.clear(); 8340 8341 // Load pending declaration chains. 8342 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) 8343 loadPendingDeclChain(PendingDeclChains[I].first, PendingDeclChains[I].second); 8344 PendingDeclChains.clear(); 8345 8346 // Make the most recent of the top-level declarations visible. 8347 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 8348 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 8349 IdentifierInfo *II = TLD->first; 8350 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 8351 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 8352 } 8353 } 8354 8355 // Load any pending macro definitions. 8356 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 8357 IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 8358 SmallVector<PendingMacroInfo, 2> GlobalIDs; 8359 GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 8360 // Initialize the macro history from chained-PCHs ahead of module imports. 8361 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 8362 ++IDIdx) { 8363 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 8364 if (Info.M->Kind != MK_ImplicitModule && 8365 Info.M->Kind != MK_ExplicitModule) 8366 resolvePendingMacro(II, Info); 8367 } 8368 // Handle module imports. 8369 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 8370 ++IDIdx) { 8371 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 8372 if (Info.M->Kind == MK_ImplicitModule || 8373 Info.M->Kind == MK_ExplicitModule) 8374 resolvePendingMacro(II, Info); 8375 } 8376 } 8377 PendingMacroIDs.clear(); 8378 8379 // Wire up the DeclContexts for Decls that we delayed setting until 8380 // recursive loading is completed. 8381 while (!PendingDeclContextInfos.empty()) { 8382 PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 8383 PendingDeclContextInfos.pop_front(); 8384 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 8385 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 8386 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 8387 } 8388 8389 // Perform any pending declaration updates. 8390 while (!PendingUpdateRecords.empty()) { 8391 auto Update = PendingUpdateRecords.pop_back_val(); 8392 ReadingKindTracker ReadingKind(Read_Decl, *this); 8393 loadDeclUpdateRecords(Update.first, Update.second); 8394 } 8395 } 8396 8397 // At this point, all update records for loaded decls are in place, so any 8398 // fake class definitions should have become real. 8399 assert(PendingFakeDefinitionData.empty() && 8400 "faked up a class definition but never saw the real one"); 8401 8402 // If we deserialized any C++ or Objective-C class definitions, any 8403 // Objective-C protocol definitions, or any redeclarable templates, make sure 8404 // that all redeclarations point to the definitions. Note that this can only 8405 // happen now, after the redeclaration chains have been fully wired. 8406 for (Decl *D : PendingDefinitions) { 8407 if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 8408 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) { 8409 // Make sure that the TagType points at the definition. 8410 const_cast<TagType*>(TagT)->decl = TD; 8411 } 8412 8413 if (auto RD = dyn_cast<CXXRecordDecl>(D)) { 8414 for (auto *R = getMostRecentExistingDecl(RD); R; 8415 R = R->getPreviousDecl()) { 8416 assert((R == D) == 8417 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && 8418 "declaration thinks it's the definition but it isn't"); 8419 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData; 8420 } 8421 } 8422 8423 continue; 8424 } 8425 8426 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) { 8427 // Make sure that the ObjCInterfaceType points at the definition. 8428 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 8429 ->Decl = ID; 8430 8431 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl()) 8432 cast<ObjCInterfaceDecl>(R)->Data = ID->Data; 8433 8434 continue; 8435 } 8436 8437 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) { 8438 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl()) 8439 cast<ObjCProtocolDecl>(R)->Data = PD->Data; 8440 8441 continue; 8442 } 8443 8444 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl(); 8445 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl()) 8446 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common; 8447 } 8448 PendingDefinitions.clear(); 8449 8450 // Load the bodies of any functions or methods we've encountered. We do 8451 // this now (delayed) so that we can be sure that the declaration chains 8452 // have been fully wired up (hasBody relies on this). 8453 // FIXME: We shouldn't require complete redeclaration chains here. 8454 for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 8455 PBEnd = PendingBodies.end(); 8456 PB != PBEnd; ++PB) { 8457 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 8458 // FIXME: Check for =delete/=default? 8459 // FIXME: Complain about ODR violations here? 8460 if (!getContext().getLangOpts().Modules || !FD->hasBody()) 8461 FD->setLazyBody(PB->second); 8462 continue; 8463 } 8464 8465 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 8466 if (!getContext().getLangOpts().Modules || !MD->hasBody()) 8467 MD->setLazyBody(PB->second); 8468 } 8469 PendingBodies.clear(); 8470 8471 // Do some cleanup. 8472 for (auto *ND : PendingMergedDefinitionsToDeduplicate) 8473 getContext().deduplicateMergedDefinitonsFor(ND); 8474 PendingMergedDefinitionsToDeduplicate.clear(); 8475 } 8476 8477 void ASTReader::diagnoseOdrViolations() { 8478 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty()) 8479 return; 8480 8481 // Trigger the import of the full definition of each class that had any 8482 // odr-merging problems, so we can produce better diagnostics for them. 8483 // These updates may in turn find and diagnose some ODR failures, so take 8484 // ownership of the set first. 8485 auto OdrMergeFailures = std::move(PendingOdrMergeFailures); 8486 PendingOdrMergeFailures.clear(); 8487 for (auto &Merge : OdrMergeFailures) { 8488 Merge.first->buildLookup(); 8489 Merge.first->decls_begin(); 8490 Merge.first->bases_begin(); 8491 Merge.first->vbases_begin(); 8492 for (auto *RD : Merge.second) { 8493 RD->decls_begin(); 8494 RD->bases_begin(); 8495 RD->vbases_begin(); 8496 } 8497 } 8498 8499 // For each declaration from a merged context, check that the canonical 8500 // definition of that context also contains a declaration of the same 8501 // entity. 8502 // 8503 // Caution: this loop does things that might invalidate iterators into 8504 // PendingOdrMergeChecks. Don't turn this into a range-based for loop! 8505 while (!PendingOdrMergeChecks.empty()) { 8506 NamedDecl *D = PendingOdrMergeChecks.pop_back_val(); 8507 8508 // FIXME: Skip over implicit declarations for now. This matters for things 8509 // like implicitly-declared special member functions. This isn't entirely 8510 // correct; we can end up with multiple unmerged declarations of the same 8511 // implicit entity. 8512 if (D->isImplicit()) 8513 continue; 8514 8515 DeclContext *CanonDef = D->getDeclContext(); 8516 8517 bool Found = false; 8518 const Decl *DCanon = D->getCanonicalDecl(); 8519 8520 for (auto RI : D->redecls()) { 8521 if (RI->getLexicalDeclContext() == CanonDef) { 8522 Found = true; 8523 break; 8524 } 8525 } 8526 if (Found) 8527 continue; 8528 8529 // Quick check failed, time to do the slow thing. Note, we can't just 8530 // look up the name of D in CanonDef here, because the member that is 8531 // in CanonDef might not be found by name lookup (it might have been 8532 // replaced by a more recent declaration in the lookup table), and we 8533 // can't necessarily find it in the redeclaration chain because it might 8534 // be merely mergeable, not redeclarable. 8535 llvm::SmallVector<const NamedDecl*, 4> Candidates; 8536 for (auto *CanonMember : CanonDef->decls()) { 8537 if (CanonMember->getCanonicalDecl() == DCanon) { 8538 // This can happen if the declaration is merely mergeable and not 8539 // actually redeclarable (we looked for redeclarations earlier). 8540 // 8541 // FIXME: We should be able to detect this more efficiently, without 8542 // pulling in all of the members of CanonDef. 8543 Found = true; 8544 break; 8545 } 8546 if (auto *ND = dyn_cast<NamedDecl>(CanonMember)) 8547 if (ND->getDeclName() == D->getDeclName()) 8548 Candidates.push_back(ND); 8549 } 8550 8551 if (!Found) { 8552 // The AST doesn't like TagDecls becoming invalid after they've been 8553 // completed. We only really need to mark FieldDecls as invalid here. 8554 if (!isa<TagDecl>(D)) 8555 D->setInvalidDecl(); 8556 8557 // Ensure we don't accidentally recursively enter deserialization while 8558 // we're producing our diagnostic. 8559 Deserializing RecursionGuard(this); 8560 8561 std::string CanonDefModule = 8562 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef)); 8563 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl) 8564 << D << getOwningModuleNameForDiagnostic(D) 8565 << CanonDef << CanonDefModule.empty() << CanonDefModule; 8566 8567 if (Candidates.empty()) 8568 Diag(cast<Decl>(CanonDef)->getLocation(), 8569 diag::note_module_odr_violation_no_possible_decls) << D; 8570 else { 8571 for (unsigned I = 0, N = Candidates.size(); I != N; ++I) 8572 Diag(Candidates[I]->getLocation(), 8573 diag::note_module_odr_violation_possible_decl) 8574 << Candidates[I]; 8575 } 8576 8577 DiagnosedOdrMergeFailures.insert(CanonDef); 8578 } 8579 } 8580 8581 if (OdrMergeFailures.empty()) 8582 return; 8583 8584 // Ensure we don't accidentally recursively enter deserialization while 8585 // we're producing our diagnostics. 8586 Deserializing RecursionGuard(this); 8587 8588 // Issue any pending ODR-failure diagnostics. 8589 for (auto &Merge : OdrMergeFailures) { 8590 // If we've already pointed out a specific problem with this class, don't 8591 // bother issuing a general "something's different" diagnostic. 8592 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 8593 continue; 8594 8595 bool Diagnosed = false; 8596 for (auto *RD : Merge.second) { 8597 // Multiple different declarations got merged together; tell the user 8598 // where they came from. 8599 if (Merge.first != RD) { 8600 // FIXME: Walk the definition, figure out what's different, 8601 // and diagnose that. 8602 if (!Diagnosed) { 8603 std::string Module = getOwningModuleNameForDiagnostic(Merge.first); 8604 Diag(Merge.first->getLocation(), 8605 diag::err_module_odr_violation_different_definitions) 8606 << Merge.first << Module.empty() << Module; 8607 Diagnosed = true; 8608 } 8609 8610 Diag(RD->getLocation(), 8611 diag::note_module_odr_violation_different_definitions) 8612 << getOwningModuleNameForDiagnostic(RD); 8613 } 8614 } 8615 8616 if (!Diagnosed) { 8617 // All definitions are updates to the same declaration. This happens if a 8618 // module instantiates the declaration of a class template specialization 8619 // and two or more other modules instantiate its definition. 8620 // 8621 // FIXME: Indicate which modules had instantiations of this definition. 8622 // FIXME: How can this even happen? 8623 Diag(Merge.first->getLocation(), 8624 diag::err_module_odr_violation_different_instantiations) 8625 << Merge.first; 8626 } 8627 } 8628 } 8629 8630 void ASTReader::StartedDeserializing() { 8631 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get()) 8632 ReadTimer->startTimer(); 8633 } 8634 8635 void ASTReader::FinishedDeserializing() { 8636 assert(NumCurrentElementsDeserializing && 8637 "FinishedDeserializing not paired with StartedDeserializing"); 8638 if (NumCurrentElementsDeserializing == 1) { 8639 // We decrease NumCurrentElementsDeserializing only after pending actions 8640 // are finished, to avoid recursively re-calling finishPendingActions(). 8641 finishPendingActions(); 8642 } 8643 --NumCurrentElementsDeserializing; 8644 8645 if (NumCurrentElementsDeserializing == 0) { 8646 // Propagate exception specification updates along redeclaration chains. 8647 while (!PendingExceptionSpecUpdates.empty()) { 8648 auto Updates = std::move(PendingExceptionSpecUpdates); 8649 PendingExceptionSpecUpdates.clear(); 8650 for (auto Update : Updates) { 8651 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>(); 8652 auto ESI = FPT->getExtProtoInfo().ExceptionSpec; 8653 if (auto *Listener = Context.getASTMutationListener()) 8654 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second)); 8655 for (auto *Redecl : Update.second->redecls()) 8656 Context.adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI); 8657 } 8658 } 8659 8660 if (ReadTimer) 8661 ReadTimer->stopTimer(); 8662 8663 diagnoseOdrViolations(); 8664 8665 // We are not in recursive loading, so it's safe to pass the "interesting" 8666 // decls to the consumer. 8667 if (Consumer) 8668 PassInterestingDeclsToConsumer(); 8669 } 8670 } 8671 8672 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 8673 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { 8674 // Remove any fake results before adding any real ones. 8675 auto It = PendingFakeLookupResults.find(II); 8676 if (It != PendingFakeLookupResults.end()) { 8677 for (auto *ND : It->second) 8678 SemaObj->IdResolver.RemoveDecl(ND); 8679 // FIXME: this works around module+PCH performance issue. 8680 // Rather than erase the result from the map, which is O(n), just clear 8681 // the vector of NamedDecls. 8682 It->second.clear(); 8683 } 8684 } 8685 8686 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 8687 SemaObj->TUScope->AddDecl(D); 8688 } else if (SemaObj->TUScope) { 8689 // Adding the decl to IdResolver may have failed because it was already in 8690 // (even though it was not added in scope). If it is already in, make sure 8691 // it gets in the scope as well. 8692 if (std::find(SemaObj->IdResolver.begin(Name), 8693 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 8694 SemaObj->TUScope->AddDecl(D); 8695 } 8696 } 8697 8698 ASTReader::ASTReader( 8699 Preprocessor &PP, ASTContext &Context, 8700 const PCHContainerReader &PCHContainerRdr, 8701 ArrayRef<IntrusiveRefCntPtr<ModuleFileExtension>> Extensions, 8702 StringRef isysroot, bool DisableValidation, 8703 bool AllowASTWithCompilerErrors, 8704 bool AllowConfigurationMismatch, bool ValidateSystemInputs, 8705 bool UseGlobalIndex, 8706 std::unique_ptr<llvm::Timer> ReadTimer) 8707 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr), 8708 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()), 8709 FileMgr(PP.getFileManager()), PCHContainerRdr(PCHContainerRdr), 8710 Diags(PP.getDiagnostics()), SemaObj(nullptr), PP(PP), Context(Context), 8711 Consumer(nullptr), ModuleMgr(PP.getFileManager(), PCHContainerRdr), 8712 ReadTimer(std::move(ReadTimer)), 8713 PragmaMSStructState(-1), 8714 PragmaMSPointersToMembersState(-1), 8715 isysroot(isysroot), DisableValidation(DisableValidation), 8716 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 8717 AllowConfigurationMismatch(AllowConfigurationMismatch), 8718 ValidateSystemInputs(ValidateSystemInputs), 8719 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false), 8720 CurrSwitchCaseStmts(&SwitchCaseStmts), NumSLocEntriesRead(0), 8721 TotalNumSLocEntries(0), NumStatementsRead(0), TotalNumStatements(0), 8722 NumMacrosRead(0), TotalNumMacros(0), NumIdentifierLookups(0), 8723 NumIdentifierLookupHits(0), NumSelectorsRead(0), 8724 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0), 8725 NumMethodPoolHits(0), NumMethodPoolTableLookups(0), 8726 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0), 8727 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0), 8728 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0), 8729 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0), 8730 PassingDeclsToConsumer(false), ReadingKind(Read_None) { 8731 SourceMgr.setExternalSLocEntrySource(this); 8732 8733 for (const auto &Ext : Extensions) { 8734 auto BlockName = Ext->getExtensionMetadata().BlockName; 8735 auto Known = ModuleFileExtensions.find(BlockName); 8736 if (Known != ModuleFileExtensions.end()) { 8737 Diags.Report(diag::warn_duplicate_module_file_extension) 8738 << BlockName; 8739 continue; 8740 } 8741 8742 ModuleFileExtensions.insert({BlockName, Ext}); 8743 } 8744 } 8745 8746 ASTReader::~ASTReader() { 8747 if (OwnsDeserializationListener) 8748 delete DeserializationListener; 8749 } 8750