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