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 getLocalIdentifier(*I, Record[0]); 1685 break; 1686 1687 case PP_TOKEN: 1688 // Ignore tokens. 1689 break; 1690 } 1691 break; 1692 } 1693 } 1694 NextCursor: ; 1695 } 1696 } 1697 1698 namespace { 1699 /// \brief Visitor class used to look up identifirs in an AST file. 1700 class IdentifierLookupVisitor { 1701 StringRef Name; 1702 unsigned NameHash; 1703 unsigned PriorGeneration; 1704 unsigned &NumIdentifierLookups; 1705 unsigned &NumIdentifierLookupHits; 1706 IdentifierInfo *Found; 1707 1708 public: 1709 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration, 1710 unsigned &NumIdentifierLookups, 1711 unsigned &NumIdentifierLookupHits) 1712 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)), 1713 PriorGeneration(PriorGeneration), 1714 NumIdentifierLookups(NumIdentifierLookups), 1715 NumIdentifierLookupHits(NumIdentifierLookupHits), 1716 Found() 1717 { 1718 } 1719 1720 bool operator()(ModuleFile &M) { 1721 // If we've already searched this module file, skip it now. 1722 if (M.Generation <= PriorGeneration) 1723 return true; 1724 1725 ASTIdentifierLookupTable *IdTable 1726 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable; 1727 if (!IdTable) 1728 return false; 1729 1730 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M, 1731 Found); 1732 ++NumIdentifierLookups; 1733 ASTIdentifierLookupTable::iterator Pos = 1734 IdTable->find_hashed(Name, NameHash, &Trait); 1735 if (Pos == IdTable->end()) 1736 return false; 1737 1738 // Dereferencing the iterator has the effect of building the 1739 // IdentifierInfo node and populating it with the various 1740 // declarations it needs. 1741 ++NumIdentifierLookupHits; 1742 Found = *Pos; 1743 return true; 1744 } 1745 1746 // \brief Retrieve the identifier info found within the module 1747 // files. 1748 IdentifierInfo *getIdentifierInfo() const { return Found; } 1749 }; 1750 } 1751 1752 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) { 1753 // Note that we are loading an identifier. 1754 Deserializing AnIdentifier(this); 1755 1756 unsigned PriorGeneration = 0; 1757 if (getContext().getLangOpts().Modules) 1758 PriorGeneration = IdentifierGeneration[&II]; 1759 1760 // If there is a global index, look there first to determine which modules 1761 // provably do not have any results for this identifier. 1762 GlobalModuleIndex::HitSet Hits; 1763 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 1764 if (!loadGlobalIndex()) { 1765 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) { 1766 HitsPtr = &Hits; 1767 } 1768 } 1769 1770 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration, 1771 NumIdentifierLookups, 1772 NumIdentifierLookupHits); 1773 ModuleMgr.visit(Visitor, HitsPtr); 1774 markIdentifierUpToDate(&II); 1775 } 1776 1777 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) { 1778 if (!II) 1779 return; 1780 1781 II->setOutOfDate(false); 1782 1783 // Update the generation for this identifier. 1784 if (getContext().getLangOpts().Modules) 1785 IdentifierGeneration[II] = getGeneration(); 1786 } 1787 1788 void ASTReader::resolvePendingMacro(IdentifierInfo *II, 1789 const PendingMacroInfo &PMInfo) { 1790 ModuleFile &M = *PMInfo.M; 1791 1792 BitstreamCursor &Cursor = M.MacroCursor; 1793 SavedStreamPosition SavedPosition(Cursor); 1794 Cursor.JumpToBit(PMInfo.MacroDirectivesOffset); 1795 1796 struct ModuleMacroRecord { 1797 SubmoduleID SubModID; 1798 MacroInfo *MI; 1799 SmallVector<SubmoduleID, 8> Overrides; 1800 }; 1801 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros; 1802 1803 // We expect to see a sequence of PP_MODULE_MACRO records listing exported 1804 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete 1805 // macro histroy. 1806 RecordData Record; 1807 while (true) { 1808 llvm::BitstreamEntry Entry = 1809 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 1810 if (Entry.Kind != llvm::BitstreamEntry::Record) { 1811 Error("malformed block record in AST file"); 1812 return; 1813 } 1814 1815 Record.clear(); 1816 switch ((PreprocessorRecordTypes)Cursor.readRecord(Entry.ID, Record)) { 1817 case PP_MACRO_DIRECTIVE_HISTORY: 1818 break; 1819 1820 case PP_MODULE_MACRO: { 1821 ModuleMacros.push_back(ModuleMacroRecord()); 1822 auto &Info = ModuleMacros.back(); 1823 Info.SubModID = getGlobalSubmoduleID(M, Record[0]); 1824 Info.MI = getMacro(getGlobalMacroID(M, Record[1])); 1825 for (int I = 2, N = Record.size(); I != N; ++I) 1826 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I])); 1827 continue; 1828 } 1829 1830 default: 1831 Error("malformed block record in AST file"); 1832 return; 1833 } 1834 1835 // We found the macro directive history; that's the last record 1836 // for this macro. 1837 break; 1838 } 1839 1840 // Module macros are listed in reverse dependency order. 1841 { 1842 std::reverse(ModuleMacros.begin(), ModuleMacros.end()); 1843 llvm::SmallVector<ModuleMacro*, 8> Overrides; 1844 for (auto &MMR : ModuleMacros) { 1845 Overrides.clear(); 1846 for (unsigned ModID : MMR.Overrides) { 1847 Module *Mod = getSubmodule(ModID); 1848 auto *Macro = PP.getModuleMacro(Mod, II); 1849 assert(Macro && "missing definition for overridden macro"); 1850 Overrides.push_back(Macro); 1851 } 1852 1853 bool Inserted = false; 1854 Module *Owner = getSubmodule(MMR.SubModID); 1855 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted); 1856 } 1857 } 1858 1859 // Don't read the directive history for a module; we don't have anywhere 1860 // to put it. 1861 if (M.Kind == MK_ImplicitModule || M.Kind == MK_ExplicitModule) 1862 return; 1863 1864 // Deserialize the macro directives history in reverse source-order. 1865 MacroDirective *Latest = nullptr, *Earliest = nullptr; 1866 unsigned Idx = 0, N = Record.size(); 1867 while (Idx < N) { 1868 MacroDirective *MD = nullptr; 1869 SourceLocation Loc = ReadSourceLocation(M, Record, Idx); 1870 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++]; 1871 switch (K) { 1872 case MacroDirective::MD_Define: { 1873 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++])); 1874 MD = PP.AllocateDefMacroDirective(MI, Loc); 1875 break; 1876 } 1877 case MacroDirective::MD_Undefine: { 1878 MD = PP.AllocateUndefMacroDirective(Loc); 1879 break; 1880 } 1881 case MacroDirective::MD_Visibility: 1882 bool isPublic = Record[Idx++]; 1883 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic); 1884 break; 1885 } 1886 1887 if (!Latest) 1888 Latest = MD; 1889 if (Earliest) 1890 Earliest->setPrevious(MD); 1891 Earliest = MD; 1892 } 1893 1894 if (Latest) 1895 PP.setLoadedMacroDirective(II, Latest); 1896 } 1897 1898 ASTReader::InputFileInfo 1899 ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) { 1900 // Go find this input file. 1901 BitstreamCursor &Cursor = F.InputFilesCursor; 1902 SavedStreamPosition SavedPosition(Cursor); 1903 Cursor.JumpToBit(F.InputFileOffsets[ID-1]); 1904 1905 unsigned Code = Cursor.ReadCode(); 1906 RecordData Record; 1907 StringRef Blob; 1908 1909 unsigned Result = Cursor.readRecord(Code, Record, &Blob); 1910 assert(static_cast<InputFileRecordTypes>(Result) == INPUT_FILE && 1911 "invalid record type for input file"); 1912 (void)Result; 1913 1914 assert(Record[0] == ID && "Bogus stored ID or offset"); 1915 InputFileInfo R; 1916 R.StoredSize = static_cast<off_t>(Record[1]); 1917 R.StoredTime = static_cast<time_t>(Record[2]); 1918 R.Overridden = static_cast<bool>(Record[3]); 1919 R.Transient = static_cast<bool>(Record[4]); 1920 R.Filename = Blob; 1921 ResolveImportedPath(F, R.Filename); 1922 return R; 1923 } 1924 1925 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { 1926 // If this ID is bogus, just return an empty input file. 1927 if (ID == 0 || ID > F.InputFilesLoaded.size()) 1928 return InputFile(); 1929 1930 // If we've already loaded this input file, return it. 1931 if (F.InputFilesLoaded[ID-1].getFile()) 1932 return F.InputFilesLoaded[ID-1]; 1933 1934 if (F.InputFilesLoaded[ID-1].isNotFound()) 1935 return InputFile(); 1936 1937 // Go find this input file. 1938 BitstreamCursor &Cursor = F.InputFilesCursor; 1939 SavedStreamPosition SavedPosition(Cursor); 1940 Cursor.JumpToBit(F.InputFileOffsets[ID-1]); 1941 1942 InputFileInfo FI = readInputFileInfo(F, ID); 1943 off_t StoredSize = FI.StoredSize; 1944 time_t StoredTime = FI.StoredTime; 1945 bool Overridden = FI.Overridden; 1946 bool Transient = FI.Transient; 1947 StringRef Filename = FI.Filename; 1948 1949 const FileEntry *File = FileMgr.getFile(Filename, /*OpenFile=*/false); 1950 1951 // If we didn't find the file, resolve it relative to the 1952 // original directory from which this AST file was created. 1953 if (File == nullptr && !F.OriginalDir.empty() && !CurrentDir.empty() && 1954 F.OriginalDir != CurrentDir) { 1955 std::string Resolved = resolveFileRelativeToOriginalDir(Filename, 1956 F.OriginalDir, 1957 CurrentDir); 1958 if (!Resolved.empty()) 1959 File = FileMgr.getFile(Resolved); 1960 } 1961 1962 // For an overridden file, create a virtual file with the stored 1963 // size/timestamp. 1964 if ((Overridden || Transient) && File == nullptr) 1965 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime); 1966 1967 if (File == nullptr) { 1968 if (Complain) { 1969 std::string ErrorStr = "could not find file '"; 1970 ErrorStr += Filename; 1971 ErrorStr += "' referenced by AST file '"; 1972 ErrorStr += F.FileName; 1973 ErrorStr += "'"; 1974 Error(ErrorStr.c_str()); 1975 } 1976 // Record that we didn't find the file. 1977 F.InputFilesLoaded[ID-1] = InputFile::getNotFound(); 1978 return InputFile(); 1979 } 1980 1981 // Check if there was a request to override the contents of the file 1982 // that was part of the precompiled header. Overridding such a file 1983 // can lead to problems when lexing using the source locations from the 1984 // PCH. 1985 SourceManager &SM = getSourceManager(); 1986 // FIXME: Reject if the overrides are different. 1987 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) { 1988 if (Complain) 1989 Error(diag::err_fe_pch_file_overridden, Filename); 1990 // After emitting the diagnostic, recover by disabling the override so 1991 // that the original file will be used. 1992 // 1993 // FIXME: This recovery is just as broken as the original state; there may 1994 // be another precompiled module that's using the overridden contents, or 1995 // we might be half way through parsing it. Instead, we should treat the 1996 // overridden contents as belonging to a separate FileEntry. 1997 SM.disableFileContentsOverride(File); 1998 // The FileEntry is a virtual file entry with the size of the contents 1999 // that would override the original contents. Set it to the original's 2000 // size/time. 2001 FileMgr.modifyFileEntry(const_cast<FileEntry*>(File), 2002 StoredSize, StoredTime); 2003 } 2004 2005 bool IsOutOfDate = false; 2006 2007 // For an overridden file, there is nothing to validate. 2008 if (!Overridden && // 2009 (StoredSize != File->getSize() || 2010 #if defined(LLVM_ON_WIN32) 2011 false 2012 #else 2013 // In our regression testing, the Windows file system seems to 2014 // have inconsistent modification times that sometimes 2015 // erroneously trigger this error-handling path. 2016 // 2017 // FIXME: This probably also breaks HeaderFileInfo lookups on Windows. 2018 (StoredTime && StoredTime != File->getModificationTime() && 2019 !DisableValidation) 2020 #endif 2021 )) { 2022 if (Complain) { 2023 // Build a list of the PCH imports that got us here (in reverse). 2024 SmallVector<ModuleFile *, 4> ImportStack(1, &F); 2025 while (ImportStack.back()->ImportedBy.size() > 0) 2026 ImportStack.push_back(ImportStack.back()->ImportedBy[0]); 2027 2028 // The top-level PCH is stale. 2029 StringRef TopLevelPCHName(ImportStack.back()->FileName); 2030 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName); 2031 2032 // Print the import stack. 2033 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) { 2034 Diag(diag::note_pch_required_by) 2035 << Filename << ImportStack[0]->FileName; 2036 for (unsigned I = 1; I < ImportStack.size(); ++I) 2037 Diag(diag::note_pch_required_by) 2038 << ImportStack[I-1]->FileName << ImportStack[I]->FileName; 2039 } 2040 2041 if (!Diags.isDiagnosticInFlight()) 2042 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName; 2043 } 2044 2045 IsOutOfDate = true; 2046 } 2047 // FIXME: If the file is overridden and we've already opened it, 2048 // issue an error (or split it into a separate FileEntry). 2049 2050 InputFile IF = InputFile(File, Overridden || Transient, IsOutOfDate); 2051 2052 // Note that we've loaded this input file. 2053 F.InputFilesLoaded[ID-1] = IF; 2054 return IF; 2055 } 2056 2057 /// \brief If we are loading a relocatable PCH or module file, and the filename 2058 /// is not an absolute path, add the system or module root to the beginning of 2059 /// the file name. 2060 void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) { 2061 // Resolve relative to the base directory, if we have one. 2062 if (!M.BaseDirectory.empty()) 2063 return ResolveImportedPath(Filename, M.BaseDirectory); 2064 } 2065 2066 void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) { 2067 if (Filename.empty() || llvm::sys::path::is_absolute(Filename)) 2068 return; 2069 2070 SmallString<128> Buffer; 2071 llvm::sys::path::append(Buffer, Prefix, Filename); 2072 Filename.assign(Buffer.begin(), Buffer.end()); 2073 } 2074 2075 static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) { 2076 switch (ARR) { 2077 case ASTReader::Failure: return true; 2078 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing); 2079 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate); 2080 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch); 2081 case ASTReader::ConfigurationMismatch: 2082 return !(Caps & ASTReader::ARR_ConfigurationMismatch); 2083 case ASTReader::HadErrors: return true; 2084 case ASTReader::Success: return false; 2085 } 2086 2087 llvm_unreachable("unknown ASTReadResult"); 2088 } 2089 2090 ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( 2091 BitstreamCursor &Stream, unsigned ClientLoadCapabilities, 2092 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener, 2093 std::string &SuggestedPredefines) { 2094 if (Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) 2095 return Failure; 2096 2097 // Read all of the records in the options block. 2098 RecordData Record; 2099 ASTReadResult Result = Success; 2100 while (1) { 2101 llvm::BitstreamEntry Entry = Stream.advance(); 2102 2103 switch (Entry.Kind) { 2104 case llvm::BitstreamEntry::Error: 2105 case llvm::BitstreamEntry::SubBlock: 2106 return Failure; 2107 2108 case llvm::BitstreamEntry::EndBlock: 2109 return Result; 2110 2111 case llvm::BitstreamEntry::Record: 2112 // The interesting case. 2113 break; 2114 } 2115 2116 // Read and process a record. 2117 Record.clear(); 2118 switch ((OptionsRecordTypes)Stream.readRecord(Entry.ID, Record)) { 2119 case LANGUAGE_OPTIONS: { 2120 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2121 if (ParseLanguageOptions(Record, Complain, Listener, 2122 AllowCompatibleConfigurationMismatch)) 2123 Result = ConfigurationMismatch; 2124 break; 2125 } 2126 2127 case TARGET_OPTIONS: { 2128 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2129 if (ParseTargetOptions(Record, Complain, Listener, 2130 AllowCompatibleConfigurationMismatch)) 2131 Result = ConfigurationMismatch; 2132 break; 2133 } 2134 2135 case DIAGNOSTIC_OPTIONS: { 2136 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 2137 if (!AllowCompatibleConfigurationMismatch && 2138 ParseDiagnosticOptions(Record, Complain, Listener)) 2139 return OutOfDate; 2140 break; 2141 } 2142 2143 case FILE_SYSTEM_OPTIONS: { 2144 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2145 if (!AllowCompatibleConfigurationMismatch && 2146 ParseFileSystemOptions(Record, Complain, Listener)) 2147 Result = ConfigurationMismatch; 2148 break; 2149 } 2150 2151 case HEADER_SEARCH_OPTIONS: { 2152 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2153 if (!AllowCompatibleConfigurationMismatch && 2154 ParseHeaderSearchOptions(Record, Complain, Listener)) 2155 Result = ConfigurationMismatch; 2156 break; 2157 } 2158 2159 case PREPROCESSOR_OPTIONS: 2160 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2161 if (!AllowCompatibleConfigurationMismatch && 2162 ParsePreprocessorOptions(Record, Complain, Listener, 2163 SuggestedPredefines)) 2164 Result = ConfigurationMismatch; 2165 break; 2166 } 2167 } 2168 } 2169 2170 ASTReader::ASTReadResult 2171 ASTReader::ReadControlBlock(ModuleFile &F, 2172 SmallVectorImpl<ImportedModule> &Loaded, 2173 const ModuleFile *ImportedBy, 2174 unsigned ClientLoadCapabilities) { 2175 BitstreamCursor &Stream = F.Stream; 2176 ASTReadResult Result = Success; 2177 2178 if (Stream.EnterSubBlock(CONTROL_BLOCK_ID)) { 2179 Error("malformed block record in AST file"); 2180 return Failure; 2181 } 2182 2183 // Read all of the records and blocks in the control block. 2184 RecordData Record; 2185 unsigned NumInputs = 0; 2186 unsigned NumUserInputs = 0; 2187 while (1) { 2188 llvm::BitstreamEntry Entry = Stream.advance(); 2189 2190 switch (Entry.Kind) { 2191 case llvm::BitstreamEntry::Error: 2192 Error("malformed block record in AST file"); 2193 return Failure; 2194 case llvm::BitstreamEntry::EndBlock: { 2195 // Validate input files. 2196 const HeaderSearchOptions &HSOpts = 2197 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 2198 2199 // All user input files reside at the index range [0, NumUserInputs), and 2200 // system input files reside at [NumUserInputs, NumInputs). For explicitly 2201 // loaded module files, ignore missing inputs. 2202 if (!DisableValidation && F.Kind != MK_ExplicitModule) { 2203 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 2204 2205 // If we are reading a module, we will create a verification timestamp, 2206 // so we verify all input files. Otherwise, verify only user input 2207 // files. 2208 2209 unsigned N = NumUserInputs; 2210 if (ValidateSystemInputs || 2211 (HSOpts.ModulesValidateOncePerBuildSession && 2212 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp && 2213 F.Kind == MK_ImplicitModule)) 2214 N = NumInputs; 2215 2216 for (unsigned I = 0; I < N; ++I) { 2217 InputFile IF = getInputFile(F, I+1, Complain); 2218 if (!IF.getFile() || IF.isOutOfDate()) 2219 return OutOfDate; 2220 } 2221 } 2222 2223 if (Listener) 2224 Listener->visitModuleFile(F.FileName, F.Kind); 2225 2226 if (Listener && Listener->needsInputFileVisitation()) { 2227 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs 2228 : NumUserInputs; 2229 for (unsigned I = 0; I < N; ++I) { 2230 bool IsSystem = I >= NumUserInputs; 2231 InputFileInfo FI = readInputFileInfo(F, I+1); 2232 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden, 2233 F.Kind == MK_ExplicitModule); 2234 } 2235 } 2236 2237 return Result; 2238 } 2239 2240 case llvm::BitstreamEntry::SubBlock: 2241 switch (Entry.ID) { 2242 case INPUT_FILES_BLOCK_ID: 2243 F.InputFilesCursor = Stream; 2244 if (Stream.SkipBlock() || // Skip with the main cursor 2245 // Read the abbreviations 2246 ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) { 2247 Error("malformed block record in AST file"); 2248 return Failure; 2249 } 2250 continue; 2251 2252 case OPTIONS_BLOCK_ID: 2253 // If we're reading the first module for this group, check its options 2254 // are compatible with ours. For modules it imports, no further checking 2255 // is required, because we checked them when we built it. 2256 if (Listener && !ImportedBy) { 2257 // Should we allow the configuration of the module file to differ from 2258 // the configuration of the current translation unit in a compatible 2259 // way? 2260 // 2261 // FIXME: Allow this for files explicitly specified with -include-pch. 2262 bool AllowCompatibleConfigurationMismatch = 2263 F.Kind == MK_ExplicitModule; 2264 2265 Result = ReadOptionsBlock(Stream, ClientLoadCapabilities, 2266 AllowCompatibleConfigurationMismatch, 2267 *Listener, SuggestedPredefines); 2268 if (Result == Failure) { 2269 Error("malformed block record in AST file"); 2270 return Result; 2271 } 2272 2273 if (DisableValidation || 2274 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 2275 Result = Success; 2276 2277 // If we can't load the module, exit early since we likely 2278 // will rebuild the module anyway. The stream may be in the 2279 // middle of a block. 2280 if (Result != Success) 2281 return Result; 2282 } else if (Stream.SkipBlock()) { 2283 Error("malformed block record in AST file"); 2284 return Failure; 2285 } 2286 continue; 2287 2288 default: 2289 if (Stream.SkipBlock()) { 2290 Error("malformed block record in AST file"); 2291 return Failure; 2292 } 2293 continue; 2294 } 2295 2296 case llvm::BitstreamEntry::Record: 2297 // The interesting case. 2298 break; 2299 } 2300 2301 // Read and process a record. 2302 Record.clear(); 2303 StringRef Blob; 2304 switch ((ControlRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) { 2305 case METADATA: { 2306 if (Record[0] != VERSION_MAJOR && !DisableValidation) { 2307 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2308 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old 2309 : diag::err_pch_version_too_new); 2310 return VersionMismatch; 2311 } 2312 2313 bool hasErrors = Record[6]; 2314 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) { 2315 Diag(diag::err_pch_with_compiler_errors); 2316 return HadErrors; 2317 } 2318 2319 F.RelocatablePCH = Record[4]; 2320 // Relative paths in a relocatable PCH are relative to our sysroot. 2321 if (F.RelocatablePCH) 2322 F.BaseDirectory = isysroot.empty() ? "/" : isysroot; 2323 2324 F.HasTimestamps = Record[5]; 2325 2326 const std::string &CurBranch = getClangFullRepositoryVersion(); 2327 StringRef ASTBranch = Blob; 2328 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) { 2329 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2330 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch; 2331 return VersionMismatch; 2332 } 2333 break; 2334 } 2335 2336 case SIGNATURE: 2337 assert((!F.Signature || F.Signature == Record[0]) && "signature changed"); 2338 F.Signature = Record[0]; 2339 break; 2340 2341 case IMPORTS: { 2342 // Load each of the imported PCH files. 2343 unsigned Idx = 0, N = Record.size(); 2344 while (Idx < N) { 2345 // Read information about the AST file. 2346 ModuleKind ImportedKind = (ModuleKind)Record[Idx++]; 2347 // The import location will be the local one for now; we will adjust 2348 // all import locations of module imports after the global source 2349 // location info are setup, in ReadAST. 2350 SourceLocation ImportLoc = 2351 ReadUntranslatedSourceLocation(Record[Idx++]); 2352 off_t StoredSize = (off_t)Record[Idx++]; 2353 time_t StoredModTime = (time_t)Record[Idx++]; 2354 ASTFileSignature StoredSignature = Record[Idx++]; 2355 auto ImportedFile = ReadPath(F, Record, Idx); 2356 2357 // If our client can't cope with us being out of date, we can't cope with 2358 // our dependency being missing. 2359 unsigned Capabilities = ClientLoadCapabilities; 2360 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2361 Capabilities &= ~ARR_Missing; 2362 2363 // Load the AST file. 2364 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, 2365 Loaded, StoredSize, StoredModTime, 2366 StoredSignature, Capabilities); 2367 2368 // If we diagnosed a problem, produce a backtrace. 2369 if (isDiagnosedResult(Result, Capabilities)) 2370 Diag(diag::note_module_file_imported_by) 2371 << F.FileName << !F.ModuleName.empty() << F.ModuleName; 2372 2373 switch (Result) { 2374 case Failure: return Failure; 2375 // If we have to ignore the dependency, we'll have to ignore this too. 2376 case Missing: 2377 case OutOfDate: return OutOfDate; 2378 case VersionMismatch: return VersionMismatch; 2379 case ConfigurationMismatch: return ConfigurationMismatch; 2380 case HadErrors: return HadErrors; 2381 case Success: break; 2382 } 2383 } 2384 break; 2385 } 2386 2387 case ORIGINAL_FILE: 2388 F.OriginalSourceFileID = FileID::get(Record[0]); 2389 F.ActualOriginalSourceFileName = Blob; 2390 F.OriginalSourceFileName = F.ActualOriginalSourceFileName; 2391 ResolveImportedPath(F, F.OriginalSourceFileName); 2392 break; 2393 2394 case ORIGINAL_FILE_ID: 2395 F.OriginalSourceFileID = FileID::get(Record[0]); 2396 break; 2397 2398 case ORIGINAL_PCH_DIR: 2399 F.OriginalDir = Blob; 2400 break; 2401 2402 case MODULE_NAME: 2403 F.ModuleName = Blob; 2404 if (Listener) 2405 Listener->ReadModuleName(F.ModuleName); 2406 break; 2407 2408 case MODULE_DIRECTORY: { 2409 assert(!F.ModuleName.empty() && 2410 "MODULE_DIRECTORY found before MODULE_NAME"); 2411 // If we've already loaded a module map file covering this module, we may 2412 // have a better path for it (relative to the current build). 2413 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName); 2414 if (M && M->Directory) { 2415 // If we're implicitly loading a module, the base directory can't 2416 // change between the build and use. 2417 if (F.Kind != MK_ExplicitModule) { 2418 const DirectoryEntry *BuildDir = 2419 PP.getFileManager().getDirectory(Blob); 2420 if (!BuildDir || BuildDir != M->Directory) { 2421 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2422 Diag(diag::err_imported_module_relocated) 2423 << F.ModuleName << Blob << M->Directory->getName(); 2424 return OutOfDate; 2425 } 2426 } 2427 F.BaseDirectory = M->Directory->getName(); 2428 } else { 2429 F.BaseDirectory = Blob; 2430 } 2431 break; 2432 } 2433 2434 case MODULE_MAP_FILE: 2435 if (ASTReadResult Result = 2436 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities)) 2437 return Result; 2438 break; 2439 2440 case INPUT_FILE_OFFSETS: 2441 NumInputs = Record[0]; 2442 NumUserInputs = Record[1]; 2443 F.InputFileOffsets = 2444 (const llvm::support::unaligned_uint64_t *)Blob.data(); 2445 F.InputFilesLoaded.resize(NumInputs); 2446 break; 2447 } 2448 } 2449 } 2450 2451 ASTReader::ASTReadResult 2452 ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 2453 BitstreamCursor &Stream = F.Stream; 2454 2455 if (Stream.EnterSubBlock(AST_BLOCK_ID)) { 2456 Error("malformed block record in AST file"); 2457 return Failure; 2458 } 2459 2460 // Read all of the records and blocks for the AST file. 2461 RecordData Record; 2462 while (1) { 2463 llvm::BitstreamEntry Entry = Stream.advance(); 2464 2465 switch (Entry.Kind) { 2466 case llvm::BitstreamEntry::Error: 2467 Error("error at end of module block in AST file"); 2468 return Failure; 2469 case llvm::BitstreamEntry::EndBlock: { 2470 // Outside of C++, we do not store a lookup map for the translation unit. 2471 // Instead, mark it as needing a lookup map to be built if this module 2472 // contains any declarations lexically within it (which it always does!). 2473 // This usually has no cost, since we very rarely need the lookup map for 2474 // the translation unit outside C++. 2475 DeclContext *DC = Context.getTranslationUnitDecl(); 2476 if (DC->hasExternalLexicalStorage() && 2477 !getContext().getLangOpts().CPlusPlus) 2478 DC->setMustBuildLookupTable(); 2479 2480 return Success; 2481 } 2482 case llvm::BitstreamEntry::SubBlock: 2483 switch (Entry.ID) { 2484 case DECLTYPES_BLOCK_ID: 2485 // We lazily load the decls block, but we want to set up the 2486 // DeclsCursor cursor to point into it. Clone our current bitcode 2487 // cursor to it, enter the block and read the abbrevs in that block. 2488 // With the main cursor, we just skip over it. 2489 F.DeclsCursor = Stream; 2490 if (Stream.SkipBlock() || // Skip with the main cursor. 2491 // Read the abbrevs. 2492 ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) { 2493 Error("malformed block record in AST file"); 2494 return Failure; 2495 } 2496 break; 2497 2498 case PREPROCESSOR_BLOCK_ID: 2499 F.MacroCursor = Stream; 2500 if (!PP.getExternalSource()) 2501 PP.setExternalSource(this); 2502 2503 if (Stream.SkipBlock() || 2504 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) { 2505 Error("malformed block record in AST file"); 2506 return Failure; 2507 } 2508 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo(); 2509 break; 2510 2511 case PREPROCESSOR_DETAIL_BLOCK_ID: 2512 F.PreprocessorDetailCursor = Stream; 2513 if (Stream.SkipBlock() || 2514 ReadBlockAbbrevs(F.PreprocessorDetailCursor, 2515 PREPROCESSOR_DETAIL_BLOCK_ID)) { 2516 Error("malformed preprocessor detail record in AST file"); 2517 return Failure; 2518 } 2519 F.PreprocessorDetailStartOffset 2520 = F.PreprocessorDetailCursor.GetCurrentBitNo(); 2521 2522 if (!PP.getPreprocessingRecord()) 2523 PP.createPreprocessingRecord(); 2524 if (!PP.getPreprocessingRecord()->getExternalSource()) 2525 PP.getPreprocessingRecord()->SetExternalSource(*this); 2526 break; 2527 2528 case SOURCE_MANAGER_BLOCK_ID: 2529 if (ReadSourceManagerBlock(F)) 2530 return Failure; 2531 break; 2532 2533 case SUBMODULE_BLOCK_ID: 2534 if (ASTReadResult Result = ReadSubmoduleBlock(F, ClientLoadCapabilities)) 2535 return Result; 2536 break; 2537 2538 case COMMENTS_BLOCK_ID: { 2539 BitstreamCursor C = Stream; 2540 if (Stream.SkipBlock() || 2541 ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) { 2542 Error("malformed comments block in AST file"); 2543 return Failure; 2544 } 2545 CommentsCursors.push_back(std::make_pair(C, &F)); 2546 break; 2547 } 2548 2549 default: 2550 if (Stream.SkipBlock()) { 2551 Error("malformed block record in AST file"); 2552 return Failure; 2553 } 2554 break; 2555 } 2556 continue; 2557 2558 case llvm::BitstreamEntry::Record: 2559 // The interesting case. 2560 break; 2561 } 2562 2563 // Read and process a record. 2564 Record.clear(); 2565 StringRef Blob; 2566 switch ((ASTRecordTypes)Stream.readRecord(Entry.ID, Record, &Blob)) { 2567 default: // Default behavior: ignore. 2568 break; 2569 2570 case TYPE_OFFSET: { 2571 if (F.LocalNumTypes != 0) { 2572 Error("duplicate TYPE_OFFSET record in AST file"); 2573 return Failure; 2574 } 2575 F.TypeOffsets = (const uint32_t *)Blob.data(); 2576 F.LocalNumTypes = Record[0]; 2577 unsigned LocalBaseTypeIndex = Record[1]; 2578 F.BaseTypeIndex = getTotalNumTypes(); 2579 2580 if (F.LocalNumTypes > 0) { 2581 // Introduce the global -> local mapping for types within this module. 2582 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F)); 2583 2584 // Introduce the local -> global mapping for types within this module. 2585 F.TypeRemap.insertOrReplace( 2586 std::make_pair(LocalBaseTypeIndex, 2587 F.BaseTypeIndex - LocalBaseTypeIndex)); 2588 2589 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes); 2590 } 2591 break; 2592 } 2593 2594 case DECL_OFFSET: { 2595 if (F.LocalNumDecls != 0) { 2596 Error("duplicate DECL_OFFSET record in AST file"); 2597 return Failure; 2598 } 2599 F.DeclOffsets = (const DeclOffset *)Blob.data(); 2600 F.LocalNumDecls = Record[0]; 2601 unsigned LocalBaseDeclID = Record[1]; 2602 F.BaseDeclID = getTotalNumDecls(); 2603 2604 if (F.LocalNumDecls > 0) { 2605 // Introduce the global -> local mapping for declarations within this 2606 // module. 2607 GlobalDeclMap.insert( 2608 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F)); 2609 2610 // Introduce the local -> global mapping for declarations within this 2611 // module. 2612 F.DeclRemap.insertOrReplace( 2613 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID)); 2614 2615 // Introduce the global -> local mapping for declarations within this 2616 // module. 2617 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID; 2618 2619 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls); 2620 } 2621 break; 2622 } 2623 2624 case TU_UPDATE_LEXICAL: { 2625 DeclContext *TU = Context.getTranslationUnitDecl(); 2626 LexicalContents Contents( 2627 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 2628 Blob.data()), 2629 static_cast<unsigned int>(Blob.size() / 4)); 2630 TULexicalDecls.push_back(std::make_pair(&F, Contents)); 2631 TU->setHasExternalLexicalStorage(true); 2632 break; 2633 } 2634 2635 case UPDATE_VISIBLE: { 2636 unsigned Idx = 0; 2637 serialization::DeclID ID = ReadDeclID(F, Record, Idx); 2638 auto *Data = (const unsigned char*)Blob.data(); 2639 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data}); 2640 // If we've already loaded the decl, perform the updates when we finish 2641 // loading this block. 2642 if (Decl *D = GetExistingDecl(ID)) 2643 PendingUpdateRecords.push_back(std::make_pair(ID, D)); 2644 break; 2645 } 2646 2647 case IDENTIFIER_TABLE: 2648 F.IdentifierTableData = Blob.data(); 2649 if (Record[0]) { 2650 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create( 2651 (const unsigned char *)F.IdentifierTableData + Record[0], 2652 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t), 2653 (const unsigned char *)F.IdentifierTableData, 2654 ASTIdentifierLookupTrait(*this, F)); 2655 2656 PP.getIdentifierTable().setExternalIdentifierLookup(this); 2657 } 2658 break; 2659 2660 case IDENTIFIER_OFFSET: { 2661 if (F.LocalNumIdentifiers != 0) { 2662 Error("duplicate IDENTIFIER_OFFSET record in AST file"); 2663 return Failure; 2664 } 2665 F.IdentifierOffsets = (const uint32_t *)Blob.data(); 2666 F.LocalNumIdentifiers = Record[0]; 2667 unsigned LocalBaseIdentifierID = Record[1]; 2668 F.BaseIdentifierID = getTotalNumIdentifiers(); 2669 2670 if (F.LocalNumIdentifiers > 0) { 2671 // Introduce the global -> local mapping for identifiers within this 2672 // module. 2673 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1, 2674 &F)); 2675 2676 // Introduce the local -> global mapping for identifiers within this 2677 // module. 2678 F.IdentifierRemap.insertOrReplace( 2679 std::make_pair(LocalBaseIdentifierID, 2680 F.BaseIdentifierID - LocalBaseIdentifierID)); 2681 2682 IdentifiersLoaded.resize(IdentifiersLoaded.size() 2683 + F.LocalNumIdentifiers); 2684 } 2685 break; 2686 } 2687 2688 case INTERESTING_IDENTIFIERS: 2689 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end()); 2690 break; 2691 2692 case EAGERLY_DESERIALIZED_DECLS: 2693 // FIXME: Skip reading this record if our ASTConsumer doesn't care 2694 // about "interesting" decls (for instance, if we're building a module). 2695 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2696 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 2697 break; 2698 2699 case SPECIAL_TYPES: 2700 if (SpecialTypes.empty()) { 2701 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2702 SpecialTypes.push_back(getGlobalTypeID(F, Record[I])); 2703 break; 2704 } 2705 2706 if (SpecialTypes.size() != Record.size()) { 2707 Error("invalid special-types record"); 2708 return Failure; 2709 } 2710 2711 for (unsigned I = 0, N = Record.size(); I != N; ++I) { 2712 serialization::TypeID ID = getGlobalTypeID(F, Record[I]); 2713 if (!SpecialTypes[I]) 2714 SpecialTypes[I] = ID; 2715 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate 2716 // merge step? 2717 } 2718 break; 2719 2720 case STATISTICS: 2721 TotalNumStatements += Record[0]; 2722 TotalNumMacros += Record[1]; 2723 TotalLexicalDeclContexts += Record[2]; 2724 TotalVisibleDeclContexts += Record[3]; 2725 break; 2726 2727 case UNUSED_FILESCOPED_DECLS: 2728 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2729 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I])); 2730 break; 2731 2732 case DELEGATING_CTORS: 2733 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2734 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I])); 2735 break; 2736 2737 case WEAK_UNDECLARED_IDENTIFIERS: 2738 if (Record.size() % 4 != 0) { 2739 Error("invalid weak identifiers record"); 2740 return Failure; 2741 } 2742 2743 // FIXME: Ignore weak undeclared identifiers from non-original PCH 2744 // files. This isn't the way to do it :) 2745 WeakUndeclaredIdentifiers.clear(); 2746 2747 // Translate the weak, undeclared identifiers into global IDs. 2748 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) { 2749 WeakUndeclaredIdentifiers.push_back( 2750 getGlobalIdentifierID(F, Record[I++])); 2751 WeakUndeclaredIdentifiers.push_back( 2752 getGlobalIdentifierID(F, Record[I++])); 2753 WeakUndeclaredIdentifiers.push_back( 2754 ReadSourceLocation(F, Record, I).getRawEncoding()); 2755 WeakUndeclaredIdentifiers.push_back(Record[I++]); 2756 } 2757 break; 2758 2759 case SELECTOR_OFFSETS: { 2760 F.SelectorOffsets = (const uint32_t *)Blob.data(); 2761 F.LocalNumSelectors = Record[0]; 2762 unsigned LocalBaseSelectorID = Record[1]; 2763 F.BaseSelectorID = getTotalNumSelectors(); 2764 2765 if (F.LocalNumSelectors > 0) { 2766 // Introduce the global -> local mapping for selectors within this 2767 // module. 2768 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F)); 2769 2770 // Introduce the local -> global mapping for selectors within this 2771 // module. 2772 F.SelectorRemap.insertOrReplace( 2773 std::make_pair(LocalBaseSelectorID, 2774 F.BaseSelectorID - LocalBaseSelectorID)); 2775 2776 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors); 2777 } 2778 break; 2779 } 2780 2781 case METHOD_POOL: 2782 F.SelectorLookupTableData = (const unsigned char *)Blob.data(); 2783 if (Record[0]) 2784 F.SelectorLookupTable 2785 = ASTSelectorLookupTable::Create( 2786 F.SelectorLookupTableData + Record[0], 2787 F.SelectorLookupTableData, 2788 ASTSelectorLookupTrait(*this, F)); 2789 TotalNumMethodPoolEntries += Record[1]; 2790 break; 2791 2792 case REFERENCED_SELECTOR_POOL: 2793 if (!Record.empty()) { 2794 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) { 2795 ReferencedSelectorsData.push_back(getGlobalSelectorID(F, 2796 Record[Idx++])); 2797 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx). 2798 getRawEncoding()); 2799 } 2800 } 2801 break; 2802 2803 case PP_COUNTER_VALUE: 2804 if (!Record.empty() && Listener) 2805 Listener->ReadCounter(F, Record[0]); 2806 break; 2807 2808 case FILE_SORTED_DECLS: 2809 F.FileSortedDecls = (const DeclID *)Blob.data(); 2810 F.NumFileSortedDecls = Record[0]; 2811 break; 2812 2813 case SOURCE_LOCATION_OFFSETS: { 2814 F.SLocEntryOffsets = (const uint32_t *)Blob.data(); 2815 F.LocalNumSLocEntries = Record[0]; 2816 unsigned SLocSpaceSize = Record[1]; 2817 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) = 2818 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries, 2819 SLocSpaceSize); 2820 if (!F.SLocEntryBaseID) { 2821 Error("ran out of source locations"); 2822 break; 2823 } 2824 // Make our entry in the range map. BaseID is negative and growing, so 2825 // we invert it. Because we invert it, though, we need the other end of 2826 // the range. 2827 unsigned RangeStart = 2828 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1; 2829 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F)); 2830 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset); 2831 2832 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing. 2833 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0); 2834 GlobalSLocOffsetMap.insert( 2835 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset 2836 - SLocSpaceSize,&F)); 2837 2838 // Initialize the remapping table. 2839 // Invalid stays invalid. 2840 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0)); 2841 // This module. Base was 2 when being compiled. 2842 F.SLocRemap.insertOrReplace(std::make_pair(2U, 2843 static_cast<int>(F.SLocEntryBaseOffset - 2))); 2844 2845 TotalNumSLocEntries += F.LocalNumSLocEntries; 2846 break; 2847 } 2848 2849 case MODULE_OFFSET_MAP: { 2850 // Additional remapping information. 2851 const unsigned char *Data = (const unsigned char*)Blob.data(); 2852 const unsigned char *DataEnd = Data + Blob.size(); 2853 2854 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders. 2855 if (F.SLocRemap.find(0) == F.SLocRemap.end()) { 2856 F.SLocRemap.insert(std::make_pair(0U, 0)); 2857 F.SLocRemap.insert(std::make_pair(2U, 1)); 2858 } 2859 2860 // Continuous range maps we may be updating in our module. 2861 typedef ContinuousRangeMap<uint32_t, int, 2>::Builder 2862 RemapBuilder; 2863 RemapBuilder SLocRemap(F.SLocRemap); 2864 RemapBuilder IdentifierRemap(F.IdentifierRemap); 2865 RemapBuilder MacroRemap(F.MacroRemap); 2866 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap); 2867 RemapBuilder SubmoduleRemap(F.SubmoduleRemap); 2868 RemapBuilder SelectorRemap(F.SelectorRemap); 2869 RemapBuilder DeclRemap(F.DeclRemap); 2870 RemapBuilder TypeRemap(F.TypeRemap); 2871 2872 while (Data < DataEnd) { 2873 using namespace llvm::support; 2874 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data); 2875 StringRef Name = StringRef((const char*)Data, Len); 2876 Data += Len; 2877 ModuleFile *OM = ModuleMgr.lookup(Name); 2878 if (!OM) { 2879 Error("SourceLocation remap refers to unknown module"); 2880 return Failure; 2881 } 2882 2883 uint32_t SLocOffset = 2884 endian::readNext<uint32_t, little, unaligned>(Data); 2885 uint32_t IdentifierIDOffset = 2886 endian::readNext<uint32_t, little, unaligned>(Data); 2887 uint32_t MacroIDOffset = 2888 endian::readNext<uint32_t, little, unaligned>(Data); 2889 uint32_t PreprocessedEntityIDOffset = 2890 endian::readNext<uint32_t, little, unaligned>(Data); 2891 uint32_t SubmoduleIDOffset = 2892 endian::readNext<uint32_t, little, unaligned>(Data); 2893 uint32_t SelectorIDOffset = 2894 endian::readNext<uint32_t, little, unaligned>(Data); 2895 uint32_t DeclIDOffset = 2896 endian::readNext<uint32_t, little, unaligned>(Data); 2897 uint32_t TypeIndexOffset = 2898 endian::readNext<uint32_t, little, unaligned>(Data); 2899 2900 uint32_t None = std::numeric_limits<uint32_t>::max(); 2901 2902 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset, 2903 RemapBuilder &Remap) { 2904 if (Offset != None) 2905 Remap.insert(std::make_pair(Offset, 2906 static_cast<int>(BaseOffset - Offset))); 2907 }; 2908 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap); 2909 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap); 2910 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap); 2911 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID, 2912 PreprocessedEntityRemap); 2913 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap); 2914 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap); 2915 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap); 2916 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap); 2917 2918 // Global -> local mappings. 2919 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset; 2920 } 2921 break; 2922 } 2923 2924 case SOURCE_MANAGER_LINE_TABLE: 2925 if (ParseLineTable(F, Record)) 2926 return Failure; 2927 break; 2928 2929 case SOURCE_LOCATION_PRELOADS: { 2930 // Need to transform from the local view (1-based IDs) to the global view, 2931 // which is based off F.SLocEntryBaseID. 2932 if (!F.PreloadSLocEntries.empty()) { 2933 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file"); 2934 return Failure; 2935 } 2936 2937 F.PreloadSLocEntries.swap(Record); 2938 break; 2939 } 2940 2941 case EXT_VECTOR_DECLS: 2942 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2943 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I])); 2944 break; 2945 2946 case VTABLE_USES: 2947 if (Record.size() % 3 != 0) { 2948 Error("Invalid VTABLE_USES record"); 2949 return Failure; 2950 } 2951 2952 // Later tables overwrite earlier ones. 2953 // FIXME: Modules will have some trouble with this. This is clearly not 2954 // the right way to do this. 2955 VTableUses.clear(); 2956 2957 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) { 2958 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++])); 2959 VTableUses.push_back( 2960 ReadSourceLocation(F, Record, Idx).getRawEncoding()); 2961 VTableUses.push_back(Record[Idx++]); 2962 } 2963 break; 2964 2965 case PENDING_IMPLICIT_INSTANTIATIONS: 2966 if (PendingInstantiations.size() % 2 != 0) { 2967 Error("Invalid existing PendingInstantiations"); 2968 return Failure; 2969 } 2970 2971 if (Record.size() % 2 != 0) { 2972 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block"); 2973 return Failure; 2974 } 2975 2976 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 2977 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++])); 2978 PendingInstantiations.push_back( 2979 ReadSourceLocation(F, Record, I).getRawEncoding()); 2980 } 2981 break; 2982 2983 case SEMA_DECL_REFS: 2984 if (Record.size() != 2) { 2985 Error("Invalid SEMA_DECL_REFS block"); 2986 return Failure; 2987 } 2988 for (unsigned I = 0, N = Record.size(); I != N; ++I) 2989 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 2990 break; 2991 2992 case PPD_ENTITIES_OFFSETS: { 2993 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data(); 2994 assert(Blob.size() % sizeof(PPEntityOffset) == 0); 2995 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset); 2996 2997 unsigned LocalBasePreprocessedEntityID = Record[0]; 2998 2999 unsigned StartingID; 3000 if (!PP.getPreprocessingRecord()) 3001 PP.createPreprocessingRecord(); 3002 if (!PP.getPreprocessingRecord()->getExternalSource()) 3003 PP.getPreprocessingRecord()->SetExternalSource(*this); 3004 StartingID 3005 = PP.getPreprocessingRecord() 3006 ->allocateLoadedEntities(F.NumPreprocessedEntities); 3007 F.BasePreprocessedEntityID = StartingID; 3008 3009 if (F.NumPreprocessedEntities > 0) { 3010 // Introduce the global -> local mapping for preprocessed entities in 3011 // this module. 3012 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F)); 3013 3014 // Introduce the local -> global mapping for preprocessed entities in 3015 // this module. 3016 F.PreprocessedEntityRemap.insertOrReplace( 3017 std::make_pair(LocalBasePreprocessedEntityID, 3018 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID)); 3019 } 3020 3021 break; 3022 } 3023 3024 case DECL_UPDATE_OFFSETS: { 3025 if (Record.size() % 2 != 0) { 3026 Error("invalid DECL_UPDATE_OFFSETS block in AST file"); 3027 return Failure; 3028 } 3029 for (unsigned I = 0, N = Record.size(); I != N; I += 2) { 3030 GlobalDeclID ID = getGlobalDeclID(F, Record[I]); 3031 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1])); 3032 3033 // If we've already loaded the decl, perform the updates when we finish 3034 // loading this block. 3035 if (Decl *D = GetExistingDecl(ID)) 3036 PendingUpdateRecords.push_back(std::make_pair(ID, D)); 3037 } 3038 break; 3039 } 3040 3041 case OBJC_CATEGORIES_MAP: { 3042 if (F.LocalNumObjCCategoriesInMap != 0) { 3043 Error("duplicate OBJC_CATEGORIES_MAP record in AST file"); 3044 return Failure; 3045 } 3046 3047 F.LocalNumObjCCategoriesInMap = Record[0]; 3048 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data(); 3049 break; 3050 } 3051 3052 case OBJC_CATEGORIES: 3053 F.ObjCCategories.swap(Record); 3054 break; 3055 3056 case DIAG_PRAGMA_MAPPINGS: 3057 if (F.PragmaDiagMappings.empty()) 3058 F.PragmaDiagMappings.swap(Record); 3059 else 3060 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(), 3061 Record.begin(), Record.end()); 3062 break; 3063 3064 case CUDA_SPECIAL_DECL_REFS: 3065 // Later tables overwrite earlier ones. 3066 // FIXME: Modules will have trouble with this. 3067 CUDASpecialDeclRefs.clear(); 3068 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3069 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3070 break; 3071 3072 case HEADER_SEARCH_TABLE: { 3073 F.HeaderFileInfoTableData = Blob.data(); 3074 F.LocalNumHeaderFileInfos = Record[1]; 3075 if (Record[0]) { 3076 F.HeaderFileInfoTable 3077 = HeaderFileInfoLookupTable::Create( 3078 (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 3079 (const unsigned char *)F.HeaderFileInfoTableData, 3080 HeaderFileInfoTrait(*this, F, 3081 &PP.getHeaderSearchInfo(), 3082 Blob.data() + Record[2])); 3083 3084 PP.getHeaderSearchInfo().SetExternalSource(this); 3085 if (!PP.getHeaderSearchInfo().getExternalLookup()) 3086 PP.getHeaderSearchInfo().SetExternalLookup(this); 3087 } 3088 break; 3089 } 3090 3091 case FP_PRAGMA_OPTIONS: 3092 // Later tables overwrite earlier ones. 3093 FPPragmaOptions.swap(Record); 3094 break; 3095 3096 case OPENCL_EXTENSIONS: 3097 // Later tables overwrite earlier ones. 3098 OpenCLExtensions.swap(Record); 3099 break; 3100 3101 case TENTATIVE_DEFINITIONS: 3102 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3103 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 3104 break; 3105 3106 case KNOWN_NAMESPACES: 3107 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3108 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 3109 break; 3110 3111 case UNDEFINED_BUT_USED: 3112 if (UndefinedButUsed.size() % 2 != 0) { 3113 Error("Invalid existing UndefinedButUsed"); 3114 return Failure; 3115 } 3116 3117 if (Record.size() % 2 != 0) { 3118 Error("invalid undefined-but-used record"); 3119 return Failure; 3120 } 3121 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3122 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 3123 UndefinedButUsed.push_back( 3124 ReadSourceLocation(F, Record, I).getRawEncoding()); 3125 } 3126 break; 3127 case DELETE_EXPRS_TO_ANALYZE: 3128 for (unsigned I = 0, N = Record.size(); I != N;) { 3129 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++])); 3130 const uint64_t Count = Record[I++]; 3131 DelayedDeleteExprs.push_back(Count); 3132 for (uint64_t C = 0; C < Count; ++C) { 3133 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding()); 3134 bool IsArrayForm = Record[I++] == 1; 3135 DelayedDeleteExprs.push_back(IsArrayForm); 3136 } 3137 } 3138 break; 3139 3140 case IMPORTED_MODULES: { 3141 if (F.Kind != MK_ImplicitModule && F.Kind != MK_ExplicitModule) { 3142 // If we aren't loading a module (which has its own exports), make 3143 // all of the imported modules visible. 3144 // FIXME: Deal with macros-only imports. 3145 for (unsigned I = 0, N = Record.size(); I != N; /**/) { 3146 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]); 3147 SourceLocation Loc = ReadSourceLocation(F, Record, I); 3148 if (GlobalID) 3149 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc)); 3150 } 3151 } 3152 break; 3153 } 3154 3155 case MACRO_OFFSET: { 3156 if (F.LocalNumMacros != 0) { 3157 Error("duplicate MACRO_OFFSET record in AST file"); 3158 return Failure; 3159 } 3160 F.MacroOffsets = (const uint32_t *)Blob.data(); 3161 F.LocalNumMacros = Record[0]; 3162 unsigned LocalBaseMacroID = Record[1]; 3163 F.BaseMacroID = getTotalNumMacros(); 3164 3165 if (F.LocalNumMacros > 0) { 3166 // Introduce the global -> local mapping for macros within this module. 3167 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 3168 3169 // Introduce the local -> global mapping for macros within this module. 3170 F.MacroRemap.insertOrReplace( 3171 std::make_pair(LocalBaseMacroID, 3172 F.BaseMacroID - LocalBaseMacroID)); 3173 3174 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 3175 } 3176 break; 3177 } 3178 3179 case LATE_PARSED_TEMPLATE: { 3180 LateParsedTemplates.append(Record.begin(), Record.end()); 3181 break; 3182 } 3183 3184 case OPTIMIZE_PRAGMA_OPTIONS: 3185 if (Record.size() != 1) { 3186 Error("invalid pragma optimize record"); 3187 return Failure; 3188 } 3189 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]); 3190 break; 3191 3192 case MSSTRUCT_PRAGMA_OPTIONS: 3193 if (Record.size() != 1) { 3194 Error("invalid pragma ms_struct record"); 3195 return Failure; 3196 } 3197 PragmaMSStructState = Record[0]; 3198 break; 3199 3200 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS: 3201 if (Record.size() != 2) { 3202 Error("invalid pragma ms_struct record"); 3203 return Failure; 3204 } 3205 PragmaMSPointersToMembersState = Record[0]; 3206 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]); 3207 break; 3208 3209 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES: 3210 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3211 UnusedLocalTypedefNameCandidates.push_back( 3212 getGlobalDeclID(F, Record[I])); 3213 break; 3214 } 3215 } 3216 } 3217 3218 ASTReader::ASTReadResult 3219 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F, 3220 const ModuleFile *ImportedBy, 3221 unsigned ClientLoadCapabilities) { 3222 unsigned Idx = 0; 3223 F.ModuleMapPath = ReadPath(F, Record, Idx); 3224 3225 if (F.Kind == MK_ExplicitModule) { 3226 // For an explicitly-loaded module, we don't care whether the original 3227 // module map file exists or matches. 3228 return Success; 3229 } 3230 3231 // Try to resolve ModuleName in the current header search context and 3232 // verify that it is found in the same module map file as we saved. If the 3233 // top-level AST file is a main file, skip this check because there is no 3234 // usable header search context. 3235 assert(!F.ModuleName.empty() && 3236 "MODULE_NAME should come before MODULE_MAP_FILE"); 3237 if (F.Kind == MK_ImplicitModule && 3238 (*ModuleMgr.begin())->Kind != MK_MainFile) { 3239 // An implicitly-loaded module file should have its module listed in some 3240 // module map file that we've already loaded. 3241 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName); 3242 auto &Map = PP.getHeaderSearchInfo().getModuleMap(); 3243 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr; 3244 if (!ModMap) { 3245 assert(ImportedBy && "top-level import should be verified"); 3246 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) { 3247 if (auto *ASTFE = M ? M->getASTFile() : nullptr) 3248 // This module was defined by an imported (explicit) module. 3249 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName 3250 << ASTFE->getName(); 3251 else 3252 // This module was built with a different module map. 3253 Diag(diag::err_imported_module_not_found) 3254 << F.ModuleName << F.FileName << ImportedBy->FileName 3255 << F.ModuleMapPath; 3256 } 3257 return OutOfDate; 3258 } 3259 3260 assert(M->Name == F.ModuleName && "found module with different name"); 3261 3262 // Check the primary module map file. 3263 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath); 3264 if (StoredModMap == nullptr || StoredModMap != ModMap) { 3265 assert(ModMap && "found module is missing module map file"); 3266 assert(ImportedBy && "top-level import should be verified"); 3267 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3268 Diag(diag::err_imported_module_modmap_changed) 3269 << F.ModuleName << ImportedBy->FileName 3270 << ModMap->getName() << F.ModuleMapPath; 3271 return OutOfDate; 3272 } 3273 3274 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps; 3275 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) { 3276 // FIXME: we should use input files rather than storing names. 3277 std::string Filename = ReadPath(F, Record, Idx); 3278 const FileEntry *F = 3279 FileMgr.getFile(Filename, false, false); 3280 if (F == nullptr) { 3281 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3282 Error("could not find file '" + Filename +"' referenced by AST file"); 3283 return OutOfDate; 3284 } 3285 AdditionalStoredMaps.insert(F); 3286 } 3287 3288 // Check any additional module map files (e.g. module.private.modulemap) 3289 // that are not in the pcm. 3290 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) { 3291 for (const FileEntry *ModMap : *AdditionalModuleMaps) { 3292 // Remove files that match 3293 // Note: SmallPtrSet::erase is really remove 3294 if (!AdditionalStoredMaps.erase(ModMap)) { 3295 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3296 Diag(diag::err_module_different_modmap) 3297 << F.ModuleName << /*new*/0 << ModMap->getName(); 3298 return OutOfDate; 3299 } 3300 } 3301 } 3302 3303 // Check any additional module map files that are in the pcm, but not 3304 // found in header search. Cases that match are already removed. 3305 for (const FileEntry *ModMap : AdditionalStoredMaps) { 3306 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3307 Diag(diag::err_module_different_modmap) 3308 << F.ModuleName << /*not new*/1 << ModMap->getName(); 3309 return OutOfDate; 3310 } 3311 } 3312 3313 if (Listener) 3314 Listener->ReadModuleMapFile(F.ModuleMapPath); 3315 return Success; 3316 } 3317 3318 3319 /// \brief Move the given method to the back of the global list of methods. 3320 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 3321 // Find the entry for this selector in the method pool. 3322 Sema::GlobalMethodPool::iterator Known 3323 = S.MethodPool.find(Method->getSelector()); 3324 if (Known == S.MethodPool.end()) 3325 return; 3326 3327 // Retrieve the appropriate method list. 3328 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 3329 : Known->second.second; 3330 bool Found = false; 3331 for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 3332 if (!Found) { 3333 if (List->getMethod() == Method) { 3334 Found = true; 3335 } else { 3336 // Keep searching. 3337 continue; 3338 } 3339 } 3340 3341 if (List->getNext()) 3342 List->setMethod(List->getNext()->getMethod()); 3343 else 3344 List->setMethod(Method); 3345 } 3346 } 3347 3348 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) { 3349 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?"); 3350 for (Decl *D : Names) { 3351 bool wasHidden = D->Hidden; 3352 D->Hidden = false; 3353 3354 if (wasHidden && SemaObj) { 3355 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 3356 moveMethodToBackOfGlobalList(*SemaObj, Method); 3357 } 3358 } 3359 } 3360 } 3361 3362 void ASTReader::makeModuleVisible(Module *Mod, 3363 Module::NameVisibilityKind NameVisibility, 3364 SourceLocation ImportLoc) { 3365 llvm::SmallPtrSet<Module *, 4> Visited; 3366 SmallVector<Module *, 4> Stack; 3367 Stack.push_back(Mod); 3368 while (!Stack.empty()) { 3369 Mod = Stack.pop_back_val(); 3370 3371 if (NameVisibility <= Mod->NameVisibility) { 3372 // This module already has this level of visibility (or greater), so 3373 // there is nothing more to do. 3374 continue; 3375 } 3376 3377 if (!Mod->isAvailable()) { 3378 // Modules that aren't available cannot be made visible. 3379 continue; 3380 } 3381 3382 // Update the module's name visibility. 3383 Mod->NameVisibility = NameVisibility; 3384 3385 // If we've already deserialized any names from this module, 3386 // mark them as visible. 3387 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 3388 if (Hidden != HiddenNamesMap.end()) { 3389 auto HiddenNames = std::move(*Hidden); 3390 HiddenNamesMap.erase(Hidden); 3391 makeNamesVisible(HiddenNames.second, HiddenNames.first); 3392 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && 3393 "making names visible added hidden names"); 3394 } 3395 3396 // Push any exported modules onto the stack to be marked as visible. 3397 SmallVector<Module *, 16> Exports; 3398 Mod->getExportedModules(Exports); 3399 for (SmallVectorImpl<Module *>::iterator 3400 I = Exports.begin(), E = Exports.end(); I != E; ++I) { 3401 Module *Exported = *I; 3402 if (Visited.insert(Exported).second) 3403 Stack.push_back(Exported); 3404 } 3405 } 3406 } 3407 3408 bool ASTReader::loadGlobalIndex() { 3409 if (GlobalIndex) 3410 return false; 3411 3412 if (TriedLoadingGlobalIndex || !UseGlobalIndex || 3413 !Context.getLangOpts().Modules) 3414 return true; 3415 3416 // Try to load the global index. 3417 TriedLoadingGlobalIndex = true; 3418 StringRef ModuleCachePath 3419 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 3420 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result 3421 = GlobalModuleIndex::readIndex(ModuleCachePath); 3422 if (!Result.first) 3423 return true; 3424 3425 GlobalIndex.reset(Result.first); 3426 ModuleMgr.setGlobalIndex(GlobalIndex.get()); 3427 return false; 3428 } 3429 3430 bool ASTReader::isGlobalIndexUnavailable() const { 3431 return Context.getLangOpts().Modules && UseGlobalIndex && 3432 !hasGlobalIndex() && TriedLoadingGlobalIndex; 3433 } 3434 3435 static void updateModuleTimestamp(ModuleFile &MF) { 3436 // Overwrite the timestamp file contents so that file's mtime changes. 3437 std::string TimestampFilename = MF.getTimestampFilename(); 3438 std::error_code EC; 3439 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text); 3440 if (EC) 3441 return; 3442 OS << "Timestamp file\n"; 3443 } 3444 3445 /// \brief Given a cursor at the start of an AST file, scan ahead and drop the 3446 /// cursor into the start of the given block ID, returning false on success and 3447 /// true on failure. 3448 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 3449 while (1) { 3450 llvm::BitstreamEntry Entry = Cursor.advance(); 3451 switch (Entry.Kind) { 3452 case llvm::BitstreamEntry::Error: 3453 case llvm::BitstreamEntry::EndBlock: 3454 return true; 3455 3456 case llvm::BitstreamEntry::Record: 3457 // Ignore top-level records. 3458 Cursor.skipRecord(Entry.ID); 3459 break; 3460 3461 case llvm::BitstreamEntry::SubBlock: 3462 if (Entry.ID == BlockID) { 3463 if (Cursor.EnterSubBlock(BlockID)) 3464 return true; 3465 // Found it! 3466 return false; 3467 } 3468 3469 if (Cursor.SkipBlock()) 3470 return true; 3471 } 3472 } 3473 } 3474 3475 ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, 3476 ModuleKind Type, 3477 SourceLocation ImportLoc, 3478 unsigned ClientLoadCapabilities) { 3479 llvm::SaveAndRestore<SourceLocation> 3480 SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 3481 3482 // Defer any pending actions until we get to the end of reading the AST file. 3483 Deserializing AnASTFile(this); 3484 3485 // Bump the generation number. 3486 unsigned PreviousGeneration = incrementGeneration(Context); 3487 3488 unsigned NumModules = ModuleMgr.size(); 3489 SmallVector<ImportedModule, 4> Loaded; 3490 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc, 3491 /*ImportedBy=*/nullptr, Loaded, 3492 0, 0, 0, 3493 ClientLoadCapabilities)) { 3494 case Failure: 3495 case Missing: 3496 case OutOfDate: 3497 case VersionMismatch: 3498 case ConfigurationMismatch: 3499 case HadErrors: { 3500 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet; 3501 for (const ImportedModule &IM : Loaded) 3502 LoadedSet.insert(IM.Mod); 3503 3504 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(), 3505 LoadedSet, 3506 Context.getLangOpts().Modules 3507 ? &PP.getHeaderSearchInfo().getModuleMap() 3508 : nullptr); 3509 3510 // If we find that any modules are unusable, the global index is going 3511 // to be out-of-date. Just remove it. 3512 GlobalIndex.reset(); 3513 ModuleMgr.setGlobalIndex(nullptr); 3514 return ReadResult; 3515 } 3516 case Success: 3517 break; 3518 } 3519 3520 // Here comes stuff that we only do once the entire chain is loaded. 3521 3522 // Load the AST blocks of all of the modules that we loaded. 3523 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), 3524 MEnd = Loaded.end(); 3525 M != MEnd; ++M) { 3526 ModuleFile &F = *M->Mod; 3527 3528 // Read the AST block. 3529 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities)) 3530 return Result; 3531 3532 // Read the extension blocks. 3533 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) { 3534 if (ASTReadResult Result = ReadExtensionBlock(F)) 3535 return Result; 3536 } 3537 3538 // Once read, set the ModuleFile bit base offset and update the size in 3539 // bits of all files we've seen. 3540 F.GlobalBitOffset = TotalModulesSizeInBits; 3541 TotalModulesSizeInBits += F.SizeInBits; 3542 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 3543 3544 // Preload SLocEntries. 3545 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 3546 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 3547 // Load it through the SourceManager and don't call ReadSLocEntry() 3548 // directly because the entry may have already been loaded in which case 3549 // calling ReadSLocEntry() directly would trigger an assertion in 3550 // SourceManager. 3551 SourceMgr.getLoadedSLocEntryByID(Index); 3552 } 3553 3554 // Preload all the pending interesting identifiers by marking them out of 3555 // date. 3556 for (auto Offset : F.PreloadIdentifierOffsets) { 3557 const unsigned char *Data = reinterpret_cast<const unsigned char *>( 3558 F.IdentifierTableData + Offset); 3559 3560 ASTIdentifierLookupTrait Trait(*this, F); 3561 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 3562 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 3563 auto &II = PP.getIdentifierTable().getOwn(Key); 3564 II.setOutOfDate(true); 3565 3566 // Mark this identifier as being from an AST file so that we can track 3567 // whether we need to serialize it. 3568 markIdentifierFromAST(*this, II); 3569 3570 // Associate the ID with the identifier so that the writer can reuse it. 3571 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first); 3572 SetIdentifierInfo(ID, &II); 3573 } 3574 } 3575 3576 // Setup the import locations and notify the module manager that we've 3577 // committed to these module files. 3578 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), 3579 MEnd = Loaded.end(); 3580 M != MEnd; ++M) { 3581 ModuleFile &F = *M->Mod; 3582 3583 ModuleMgr.moduleFileAccepted(&F); 3584 3585 // Set the import location. 3586 F.DirectImportLoc = ImportLoc; 3587 // FIXME: We assume that locations from PCH / preamble do not need 3588 // any translation. 3589 if (!M->ImportedBy) 3590 F.ImportLoc = M->ImportLoc; 3591 else 3592 F.ImportLoc = TranslateSourceLocation(*M->ImportedBy, M->ImportLoc); 3593 } 3594 3595 if (!Context.getLangOpts().CPlusPlus || 3596 (Type != MK_ImplicitModule && Type != MK_ExplicitModule)) { 3597 // Mark all of the identifiers in the identifier table as being out of date, 3598 // so that various accessors know to check the loaded modules when the 3599 // identifier is used. 3600 // 3601 // For C++ modules, we don't need information on many identifiers (just 3602 // those that provide macros or are poisoned), so we mark all of 3603 // the interesting ones via PreloadIdentifierOffsets. 3604 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 3605 IdEnd = PP.getIdentifierTable().end(); 3606 Id != IdEnd; ++Id) 3607 Id->second->setOutOfDate(true); 3608 } 3609 3610 // Resolve any unresolved module exports. 3611 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) { 3612 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I]; 3613 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 3614 Module *ResolvedMod = getSubmodule(GlobalID); 3615 3616 switch (Unresolved.Kind) { 3617 case UnresolvedModuleRef::Conflict: 3618 if (ResolvedMod) { 3619 Module::Conflict Conflict; 3620 Conflict.Other = ResolvedMod; 3621 Conflict.Message = Unresolved.String.str(); 3622 Unresolved.Mod->Conflicts.push_back(Conflict); 3623 } 3624 continue; 3625 3626 case UnresolvedModuleRef::Import: 3627 if (ResolvedMod) 3628 Unresolved.Mod->Imports.insert(ResolvedMod); 3629 continue; 3630 3631 case UnresolvedModuleRef::Export: 3632 if (ResolvedMod || Unresolved.IsWildcard) 3633 Unresolved.Mod->Exports.push_back( 3634 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 3635 continue; 3636 } 3637 } 3638 UnresolvedModuleRefs.clear(); 3639 3640 // FIXME: How do we load the 'use'd modules? They may not be submodules. 3641 // Might be unnecessary as use declarations are only used to build the 3642 // module itself. 3643 3644 InitializeContext(); 3645 3646 if (SemaObj) 3647 UpdateSema(); 3648 3649 if (DeserializationListener) 3650 DeserializationListener->ReaderInitialized(this); 3651 3652 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 3653 if (PrimaryModule.OriginalSourceFileID.isValid()) { 3654 PrimaryModule.OriginalSourceFileID 3655 = FileID::get(PrimaryModule.SLocEntryBaseID 3656 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1); 3657 3658 // If this AST file is a precompiled preamble, then set the 3659 // preamble file ID of the source manager to the file source file 3660 // from which the preamble was built. 3661 if (Type == MK_Preamble) { 3662 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 3663 } else if (Type == MK_MainFile) { 3664 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 3665 } 3666 } 3667 3668 // For any Objective-C class definitions we have already loaded, make sure 3669 // that we load any additional categories. 3670 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 3671 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 3672 ObjCClassesLoaded[I], 3673 PreviousGeneration); 3674 } 3675 3676 if (PP.getHeaderSearchInfo() 3677 .getHeaderSearchOpts() 3678 .ModulesValidateOncePerBuildSession) { 3679 // Now we are certain that the module and all modules it depends on are 3680 // up to date. Create or update timestamp files for modules that are 3681 // located in the module cache (not for PCH files that could be anywhere 3682 // in the filesystem). 3683 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) { 3684 ImportedModule &M = Loaded[I]; 3685 if (M.Mod->Kind == MK_ImplicitModule) { 3686 updateModuleTimestamp(*M.Mod); 3687 } 3688 } 3689 } 3690 3691 return Success; 3692 } 3693 3694 static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile); 3695 3696 /// \brief Whether \p Stream starts with the AST/PCH file magic number 'CPCH'. 3697 static bool startsWithASTFileMagic(BitstreamCursor &Stream) { 3698 return Stream.Read(8) == 'C' && 3699 Stream.Read(8) == 'P' && 3700 Stream.Read(8) == 'C' && 3701 Stream.Read(8) == 'H'; 3702 } 3703 3704 static unsigned moduleKindForDiagnostic(ModuleKind Kind) { 3705 switch (Kind) { 3706 case MK_PCH: 3707 return 0; // PCH 3708 case MK_ImplicitModule: 3709 case MK_ExplicitModule: 3710 return 1; // module 3711 case MK_MainFile: 3712 case MK_Preamble: 3713 return 2; // main source file 3714 } 3715 llvm_unreachable("unknown module kind"); 3716 } 3717 3718 ASTReader::ASTReadResult 3719 ASTReader::ReadASTCore(StringRef FileName, 3720 ModuleKind Type, 3721 SourceLocation ImportLoc, 3722 ModuleFile *ImportedBy, 3723 SmallVectorImpl<ImportedModule> &Loaded, 3724 off_t ExpectedSize, time_t ExpectedModTime, 3725 ASTFileSignature ExpectedSignature, 3726 unsigned ClientLoadCapabilities) { 3727 ModuleFile *M; 3728 std::string ErrorStr; 3729 ModuleManager::AddModuleResult AddResult 3730 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy, 3731 getGeneration(), ExpectedSize, ExpectedModTime, 3732 ExpectedSignature, readASTFileSignature, 3733 M, ErrorStr); 3734 3735 switch (AddResult) { 3736 case ModuleManager::AlreadyLoaded: 3737 return Success; 3738 3739 case ModuleManager::NewlyLoaded: 3740 // Load module file below. 3741 break; 3742 3743 case ModuleManager::Missing: 3744 // The module file was missing; if the client can handle that, return 3745 // it. 3746 if (ClientLoadCapabilities & ARR_Missing) 3747 return Missing; 3748 3749 // Otherwise, return an error. 3750 Diag(diag::err_module_file_not_found) << moduleKindForDiagnostic(Type) 3751 << FileName << ErrorStr.empty() 3752 << ErrorStr; 3753 return Failure; 3754 3755 case ModuleManager::OutOfDate: 3756 // We couldn't load the module file because it is out-of-date. If the 3757 // client can handle out-of-date, return it. 3758 if (ClientLoadCapabilities & ARR_OutOfDate) 3759 return OutOfDate; 3760 3761 // Otherwise, return an error. 3762 Diag(diag::err_module_file_out_of_date) << moduleKindForDiagnostic(Type) 3763 << FileName << ErrorStr.empty() 3764 << ErrorStr; 3765 return Failure; 3766 } 3767 3768 assert(M && "Missing module file"); 3769 3770 // FIXME: This seems rather a hack. Should CurrentDir be part of the 3771 // module? 3772 if (FileName != "-") { 3773 CurrentDir = llvm::sys::path::parent_path(FileName); 3774 if (CurrentDir.empty()) CurrentDir = "."; 3775 } 3776 3777 ModuleFile &F = *M; 3778 BitstreamCursor &Stream = F.Stream; 3779 PCHContainerRdr.ExtractPCH(F.Buffer->getMemBufferRef(), F.StreamFile); 3780 Stream.init(&F.StreamFile); 3781 F.SizeInBits = F.Buffer->getBufferSize() * 8; 3782 3783 // Sniff for the signature. 3784 if (!startsWithASTFileMagic(Stream)) { 3785 Diag(diag::err_module_file_invalid) << moduleKindForDiagnostic(Type) 3786 << FileName; 3787 return Failure; 3788 } 3789 3790 // This is used for compatibility with older PCH formats. 3791 bool HaveReadControlBlock = false; 3792 while (1) { 3793 llvm::BitstreamEntry Entry = Stream.advance(); 3794 3795 switch (Entry.Kind) { 3796 case llvm::BitstreamEntry::Error: 3797 case llvm::BitstreamEntry::Record: 3798 case llvm::BitstreamEntry::EndBlock: 3799 Error("invalid record at top-level of AST file"); 3800 return Failure; 3801 3802 case llvm::BitstreamEntry::SubBlock: 3803 break; 3804 } 3805 3806 switch (Entry.ID) { 3807 case CONTROL_BLOCK_ID: 3808 HaveReadControlBlock = true; 3809 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) { 3810 case Success: 3811 // Check that we didn't try to load a non-module AST file as a module. 3812 // 3813 // FIXME: Should we also perform the converse check? Loading a module as 3814 // a PCH file sort of works, but it's a bit wonky. 3815 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule) && 3816 F.ModuleName.empty()) { 3817 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure; 3818 if (Result != OutOfDate || 3819 (ClientLoadCapabilities & ARR_OutOfDate) == 0) 3820 Diag(diag::err_module_file_not_module) << FileName; 3821 return Result; 3822 } 3823 break; 3824 3825 case Failure: return Failure; 3826 case Missing: return Missing; 3827 case OutOfDate: return OutOfDate; 3828 case VersionMismatch: return VersionMismatch; 3829 case ConfigurationMismatch: return ConfigurationMismatch; 3830 case HadErrors: return HadErrors; 3831 } 3832 break; 3833 3834 case AST_BLOCK_ID: 3835 if (!HaveReadControlBlock) { 3836 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 3837 Diag(diag::err_pch_version_too_old); 3838 return VersionMismatch; 3839 } 3840 3841 // Record that we've loaded this module. 3842 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 3843 return Success; 3844 3845 default: 3846 if (Stream.SkipBlock()) { 3847 Error("malformed block record in AST file"); 3848 return Failure; 3849 } 3850 break; 3851 } 3852 } 3853 3854 return Success; 3855 } 3856 3857 /// Parse a record and blob containing module file extension metadata. 3858 static bool parseModuleFileExtensionMetadata( 3859 const SmallVectorImpl<uint64_t> &Record, 3860 StringRef Blob, 3861 ModuleFileExtensionMetadata &Metadata) { 3862 if (Record.size() < 4) return true; 3863 3864 Metadata.MajorVersion = Record[0]; 3865 Metadata.MinorVersion = Record[1]; 3866 3867 unsigned BlockNameLen = Record[2]; 3868 unsigned UserInfoLen = Record[3]; 3869 3870 if (BlockNameLen + UserInfoLen > Blob.size()) return true; 3871 3872 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen); 3873 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen, 3874 Blob.data() + BlockNameLen + UserInfoLen); 3875 return false; 3876 } 3877 3878 ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) { 3879 BitstreamCursor &Stream = F.Stream; 3880 3881 RecordData Record; 3882 while (true) { 3883 llvm::BitstreamEntry Entry = Stream.advance(); 3884 switch (Entry.Kind) { 3885 case llvm::BitstreamEntry::SubBlock: 3886 if (Stream.SkipBlock()) 3887 return Failure; 3888 3889 continue; 3890 3891 case llvm::BitstreamEntry::EndBlock: 3892 return Success; 3893 3894 case llvm::BitstreamEntry::Error: 3895 return HadErrors; 3896 3897 case llvm::BitstreamEntry::Record: 3898 break; 3899 } 3900 3901 Record.clear(); 3902 StringRef Blob; 3903 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob); 3904 switch (RecCode) { 3905 case EXTENSION_METADATA: { 3906 ModuleFileExtensionMetadata Metadata; 3907 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 3908 return Failure; 3909 3910 // Find a module file extension with this block name. 3911 auto Known = ModuleFileExtensions.find(Metadata.BlockName); 3912 if (Known == ModuleFileExtensions.end()) break; 3913 3914 // Form a reader. 3915 if (auto Reader = Known->second->createExtensionReader(Metadata, *this, 3916 F, Stream)) { 3917 F.ExtensionReaders.push_back(std::move(Reader)); 3918 } 3919 3920 break; 3921 } 3922 } 3923 } 3924 3925 return Success; 3926 } 3927 3928 void ASTReader::InitializeContext() { 3929 // If there's a listener, notify them that we "read" the translation unit. 3930 if (DeserializationListener) 3931 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 3932 Context.getTranslationUnitDecl()); 3933 3934 // FIXME: Find a better way to deal with collisions between these 3935 // built-in types. Right now, we just ignore the problem. 3936 3937 // Load the special types. 3938 if (SpecialTypes.size() >= NumSpecialTypeIDs) { 3939 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 3940 if (!Context.CFConstantStringTypeDecl) 3941 Context.setCFConstantStringType(GetType(String)); 3942 } 3943 3944 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 3945 QualType FileType = GetType(File); 3946 if (FileType.isNull()) { 3947 Error("FILE type is NULL"); 3948 return; 3949 } 3950 3951 if (!Context.FILEDecl) { 3952 if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 3953 Context.setFILEDecl(Typedef->getDecl()); 3954 else { 3955 const TagType *Tag = FileType->getAs<TagType>(); 3956 if (!Tag) { 3957 Error("Invalid FILE type in AST file"); 3958 return; 3959 } 3960 Context.setFILEDecl(Tag->getDecl()); 3961 } 3962 } 3963 } 3964 3965 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 3966 QualType Jmp_bufType = GetType(Jmp_buf); 3967 if (Jmp_bufType.isNull()) { 3968 Error("jmp_buf type is NULL"); 3969 return; 3970 } 3971 3972 if (!Context.jmp_bufDecl) { 3973 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 3974 Context.setjmp_bufDecl(Typedef->getDecl()); 3975 else { 3976 const TagType *Tag = Jmp_bufType->getAs<TagType>(); 3977 if (!Tag) { 3978 Error("Invalid jmp_buf type in AST file"); 3979 return; 3980 } 3981 Context.setjmp_bufDecl(Tag->getDecl()); 3982 } 3983 } 3984 } 3985 3986 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 3987 QualType Sigjmp_bufType = GetType(Sigjmp_buf); 3988 if (Sigjmp_bufType.isNull()) { 3989 Error("sigjmp_buf type is NULL"); 3990 return; 3991 } 3992 3993 if (!Context.sigjmp_bufDecl) { 3994 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 3995 Context.setsigjmp_bufDecl(Typedef->getDecl()); 3996 else { 3997 const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 3998 assert(Tag && "Invalid sigjmp_buf type in AST file"); 3999 Context.setsigjmp_bufDecl(Tag->getDecl()); 4000 } 4001 } 4002 } 4003 4004 if (unsigned ObjCIdRedef 4005 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 4006 if (Context.ObjCIdRedefinitionType.isNull()) 4007 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 4008 } 4009 4010 if (unsigned ObjCClassRedef 4011 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 4012 if (Context.ObjCClassRedefinitionType.isNull()) 4013 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 4014 } 4015 4016 if (unsigned ObjCSelRedef 4017 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 4018 if (Context.ObjCSelRedefinitionType.isNull()) 4019 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 4020 } 4021 4022 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 4023 QualType Ucontext_tType = GetType(Ucontext_t); 4024 if (Ucontext_tType.isNull()) { 4025 Error("ucontext_t type is NULL"); 4026 return; 4027 } 4028 4029 if (!Context.ucontext_tDecl) { 4030 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 4031 Context.setucontext_tDecl(Typedef->getDecl()); 4032 else { 4033 const TagType *Tag = Ucontext_tType->getAs<TagType>(); 4034 assert(Tag && "Invalid ucontext_t type in AST file"); 4035 Context.setucontext_tDecl(Tag->getDecl()); 4036 } 4037 } 4038 } 4039 } 4040 4041 ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 4042 4043 // If there were any CUDA special declarations, deserialize them. 4044 if (!CUDASpecialDeclRefs.empty()) { 4045 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 4046 Context.setcudaConfigureCallDecl( 4047 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 4048 } 4049 4050 // Re-export any modules that were imported by a non-module AST file. 4051 // FIXME: This does not make macro-only imports visible again. 4052 for (auto &Import : ImportedModules) { 4053 if (Module *Imported = getSubmodule(Import.ID)) { 4054 makeModuleVisible(Imported, Module::AllVisible, 4055 /*ImportLoc=*/Import.ImportLoc); 4056 if (Import.ImportLoc.isValid()) 4057 PP.makeModuleVisible(Imported, Import.ImportLoc); 4058 // FIXME: should we tell Sema to make the module visible too? 4059 } 4060 } 4061 ImportedModules.clear(); 4062 } 4063 4064 void ASTReader::finalizeForWriting() { 4065 // Nothing to do for now. 4066 } 4067 4068 /// \brief Reads and return the signature record from \p StreamFile's control 4069 /// block, or else returns 0. 4070 static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile){ 4071 BitstreamCursor Stream(StreamFile); 4072 if (!startsWithASTFileMagic(Stream)) 4073 return 0; 4074 4075 // Scan for the CONTROL_BLOCK_ID block. 4076 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 4077 return 0; 4078 4079 // Scan for SIGNATURE inside the control block. 4080 ASTReader::RecordData Record; 4081 while (1) { 4082 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 4083 if (Entry.Kind == llvm::BitstreamEntry::EndBlock || 4084 Entry.Kind != llvm::BitstreamEntry::Record) 4085 return 0; 4086 4087 Record.clear(); 4088 StringRef Blob; 4089 if (SIGNATURE == Stream.readRecord(Entry.ID, Record, &Blob)) 4090 return Record[0]; 4091 } 4092 } 4093 4094 /// \brief Retrieve the name of the original source file name 4095 /// directly from the AST file, without actually loading the AST 4096 /// file. 4097 std::string ASTReader::getOriginalSourceFile( 4098 const std::string &ASTFileName, FileManager &FileMgr, 4099 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) { 4100 // Open the AST file. 4101 auto Buffer = FileMgr.getBufferForFile(ASTFileName); 4102 if (!Buffer) { 4103 Diags.Report(diag::err_fe_unable_to_read_pch_file) 4104 << ASTFileName << Buffer.getError().message(); 4105 return std::string(); 4106 } 4107 4108 // Initialize the stream 4109 llvm::BitstreamReader StreamFile; 4110 PCHContainerRdr.ExtractPCH((*Buffer)->getMemBufferRef(), StreamFile); 4111 BitstreamCursor Stream(StreamFile); 4112 4113 // Sniff for the signature. 4114 if (!startsWithASTFileMagic(Stream)) { 4115 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName; 4116 return std::string(); 4117 } 4118 4119 // Scan for the CONTROL_BLOCK_ID block. 4120 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 4121 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 4122 return std::string(); 4123 } 4124 4125 // Scan for ORIGINAL_FILE inside the control block. 4126 RecordData Record; 4127 while (1) { 4128 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 4129 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 4130 return std::string(); 4131 4132 if (Entry.Kind != llvm::BitstreamEntry::Record) { 4133 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 4134 return std::string(); 4135 } 4136 4137 Record.clear(); 4138 StringRef Blob; 4139 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE) 4140 return Blob.str(); 4141 } 4142 } 4143 4144 namespace { 4145 class SimplePCHValidator : public ASTReaderListener { 4146 const LangOptions &ExistingLangOpts; 4147 const TargetOptions &ExistingTargetOpts; 4148 const PreprocessorOptions &ExistingPPOpts; 4149 std::string ExistingModuleCachePath; 4150 FileManager &FileMgr; 4151 4152 public: 4153 SimplePCHValidator(const LangOptions &ExistingLangOpts, 4154 const TargetOptions &ExistingTargetOpts, 4155 const PreprocessorOptions &ExistingPPOpts, 4156 StringRef ExistingModuleCachePath, 4157 FileManager &FileMgr) 4158 : ExistingLangOpts(ExistingLangOpts), 4159 ExistingTargetOpts(ExistingTargetOpts), 4160 ExistingPPOpts(ExistingPPOpts), 4161 ExistingModuleCachePath(ExistingModuleCachePath), 4162 FileMgr(FileMgr) 4163 { 4164 } 4165 4166 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, 4167 bool AllowCompatibleDifferences) override { 4168 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr, 4169 AllowCompatibleDifferences); 4170 } 4171 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, 4172 bool AllowCompatibleDifferences) override { 4173 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr, 4174 AllowCompatibleDifferences); 4175 } 4176 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 4177 StringRef SpecificModuleCachePath, 4178 bool Complain) override { 4179 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 4180 ExistingModuleCachePath, 4181 nullptr, ExistingLangOpts); 4182 } 4183 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 4184 bool Complain, 4185 std::string &SuggestedPredefines) override { 4186 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr, 4187 SuggestedPredefines, ExistingLangOpts); 4188 } 4189 }; 4190 } 4191 4192 bool ASTReader::readASTFileControlBlock( 4193 StringRef Filename, FileManager &FileMgr, 4194 const PCHContainerReader &PCHContainerRdr, 4195 bool FindModuleFileExtensions, 4196 ASTReaderListener &Listener) { 4197 // Open the AST file. 4198 // FIXME: This allows use of the VFS; we do not allow use of the 4199 // VFS when actually loading a module. 4200 auto Buffer = FileMgr.getBufferForFile(Filename); 4201 if (!Buffer) { 4202 return true; 4203 } 4204 4205 // Initialize the stream 4206 llvm::BitstreamReader StreamFile; 4207 PCHContainerRdr.ExtractPCH((*Buffer)->getMemBufferRef(), StreamFile); 4208 BitstreamCursor Stream(StreamFile); 4209 4210 // Sniff for the signature. 4211 if (!startsWithASTFileMagic(Stream)) 4212 return true; 4213 4214 // Scan for the CONTROL_BLOCK_ID block. 4215 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 4216 return true; 4217 4218 bool NeedsInputFiles = Listener.needsInputFileVisitation(); 4219 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation(); 4220 bool NeedsImports = Listener.needsImportVisitation(); 4221 BitstreamCursor InputFilesCursor; 4222 4223 RecordData Record; 4224 std::string ModuleDir; 4225 bool DoneWithControlBlock = false; 4226 while (!DoneWithControlBlock) { 4227 llvm::BitstreamEntry Entry = Stream.advance(); 4228 4229 switch (Entry.Kind) { 4230 case llvm::BitstreamEntry::SubBlock: { 4231 switch (Entry.ID) { 4232 case OPTIONS_BLOCK_ID: { 4233 std::string IgnoredSuggestedPredefines; 4234 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate, 4235 /*AllowCompatibleConfigurationMismatch*/ false, 4236 Listener, IgnoredSuggestedPredefines) != Success) 4237 return true; 4238 break; 4239 } 4240 4241 case INPUT_FILES_BLOCK_ID: 4242 InputFilesCursor = Stream; 4243 if (Stream.SkipBlock() || 4244 (NeedsInputFiles && 4245 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID))) 4246 return true; 4247 break; 4248 4249 default: 4250 if (Stream.SkipBlock()) 4251 return true; 4252 break; 4253 } 4254 4255 continue; 4256 } 4257 4258 case llvm::BitstreamEntry::EndBlock: 4259 DoneWithControlBlock = true; 4260 break; 4261 4262 case llvm::BitstreamEntry::Error: 4263 return true; 4264 4265 case llvm::BitstreamEntry::Record: 4266 break; 4267 } 4268 4269 if (DoneWithControlBlock) break; 4270 4271 Record.clear(); 4272 StringRef Blob; 4273 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob); 4274 switch ((ControlRecordTypes)RecCode) { 4275 case METADATA: { 4276 if (Record[0] != VERSION_MAJOR) 4277 return true; 4278 4279 if (Listener.ReadFullVersionInformation(Blob)) 4280 return true; 4281 4282 break; 4283 } 4284 case MODULE_NAME: 4285 Listener.ReadModuleName(Blob); 4286 break; 4287 case MODULE_DIRECTORY: 4288 ModuleDir = Blob; 4289 break; 4290 case MODULE_MAP_FILE: { 4291 unsigned Idx = 0; 4292 auto Path = ReadString(Record, Idx); 4293 ResolveImportedPath(Path, ModuleDir); 4294 Listener.ReadModuleMapFile(Path); 4295 break; 4296 } 4297 case INPUT_FILE_OFFSETS: { 4298 if (!NeedsInputFiles) 4299 break; 4300 4301 unsigned NumInputFiles = Record[0]; 4302 unsigned NumUserFiles = Record[1]; 4303 const uint64_t *InputFileOffs = (const uint64_t *)Blob.data(); 4304 for (unsigned I = 0; I != NumInputFiles; ++I) { 4305 // Go find this input file. 4306 bool isSystemFile = I >= NumUserFiles; 4307 4308 if (isSystemFile && !NeedsSystemInputFiles) 4309 break; // the rest are system input files 4310 4311 BitstreamCursor &Cursor = InputFilesCursor; 4312 SavedStreamPosition SavedPosition(Cursor); 4313 Cursor.JumpToBit(InputFileOffs[I]); 4314 4315 unsigned Code = Cursor.ReadCode(); 4316 RecordData Record; 4317 StringRef Blob; 4318 bool shouldContinue = false; 4319 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) { 4320 case INPUT_FILE: 4321 bool Overridden = static_cast<bool>(Record[3]); 4322 std::string Filename = Blob; 4323 ResolveImportedPath(Filename, ModuleDir); 4324 shouldContinue = Listener.visitInputFile( 4325 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false); 4326 break; 4327 } 4328 if (!shouldContinue) 4329 break; 4330 } 4331 break; 4332 } 4333 4334 case IMPORTS: { 4335 if (!NeedsImports) 4336 break; 4337 4338 unsigned Idx = 0, N = Record.size(); 4339 while (Idx < N) { 4340 // Read information about the AST file. 4341 Idx += 5; // ImportLoc, Size, ModTime, Signature 4342 std::string Filename = ReadString(Record, Idx); 4343 ResolveImportedPath(Filename, ModuleDir); 4344 Listener.visitImport(Filename); 4345 } 4346 break; 4347 } 4348 4349 default: 4350 // No other validation to perform. 4351 break; 4352 } 4353 } 4354 4355 // Look for module file extension blocks, if requested. 4356 if (FindModuleFileExtensions) { 4357 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) { 4358 bool DoneWithExtensionBlock = false; 4359 while (!DoneWithExtensionBlock) { 4360 llvm::BitstreamEntry Entry = Stream.advance(); 4361 4362 switch (Entry.Kind) { 4363 case llvm::BitstreamEntry::SubBlock: 4364 if (Stream.SkipBlock()) 4365 return true; 4366 4367 continue; 4368 4369 case llvm::BitstreamEntry::EndBlock: 4370 DoneWithExtensionBlock = true; 4371 continue; 4372 4373 case llvm::BitstreamEntry::Error: 4374 return true; 4375 4376 case llvm::BitstreamEntry::Record: 4377 break; 4378 } 4379 4380 Record.clear(); 4381 StringRef Blob; 4382 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob); 4383 switch (RecCode) { 4384 case EXTENSION_METADATA: { 4385 ModuleFileExtensionMetadata Metadata; 4386 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 4387 return true; 4388 4389 Listener.readModuleFileExtension(Metadata); 4390 break; 4391 } 4392 } 4393 } 4394 } 4395 } 4396 4397 return false; 4398 } 4399 4400 bool ASTReader::isAcceptableASTFile( 4401 StringRef Filename, FileManager &FileMgr, 4402 const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts, 4403 const TargetOptions &TargetOpts, const PreprocessorOptions &PPOpts, 4404 std::string ExistingModuleCachePath) { 4405 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, 4406 ExistingModuleCachePath, FileMgr); 4407 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr, 4408 /*FindModuleFileExtensions=*/false, 4409 validator); 4410 } 4411 4412 ASTReader::ASTReadResult 4413 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 4414 // Enter the submodule block. 4415 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) { 4416 Error("malformed submodule block record in AST file"); 4417 return Failure; 4418 } 4419 4420 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 4421 bool First = true; 4422 Module *CurrentModule = nullptr; 4423 RecordData Record; 4424 while (true) { 4425 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks(); 4426 4427 switch (Entry.Kind) { 4428 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 4429 case llvm::BitstreamEntry::Error: 4430 Error("malformed block record in AST file"); 4431 return Failure; 4432 case llvm::BitstreamEntry::EndBlock: 4433 return Success; 4434 case llvm::BitstreamEntry::Record: 4435 // The interesting case. 4436 break; 4437 } 4438 4439 // Read a record. 4440 StringRef Blob; 4441 Record.clear(); 4442 auto Kind = F.Stream.readRecord(Entry.ID, Record, &Blob); 4443 4444 if ((Kind == SUBMODULE_METADATA) != First) { 4445 Error("submodule metadata record should be at beginning of block"); 4446 return Failure; 4447 } 4448 First = false; 4449 4450 // Submodule information is only valid if we have a current module. 4451 // FIXME: Should we error on these cases? 4452 if (!CurrentModule && Kind != SUBMODULE_METADATA && 4453 Kind != SUBMODULE_DEFINITION) 4454 continue; 4455 4456 switch (Kind) { 4457 default: // Default behavior: ignore. 4458 break; 4459 4460 case SUBMODULE_DEFINITION: { 4461 if (Record.size() < 8) { 4462 Error("malformed module definition"); 4463 return Failure; 4464 } 4465 4466 StringRef Name = Blob; 4467 unsigned Idx = 0; 4468 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]); 4469 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]); 4470 bool IsFramework = Record[Idx++]; 4471 bool IsExplicit = Record[Idx++]; 4472 bool IsSystem = Record[Idx++]; 4473 bool IsExternC = Record[Idx++]; 4474 bool InferSubmodules = Record[Idx++]; 4475 bool InferExplicitSubmodules = Record[Idx++]; 4476 bool InferExportWildcard = Record[Idx++]; 4477 bool ConfigMacrosExhaustive = Record[Idx++]; 4478 4479 Module *ParentModule = nullptr; 4480 if (Parent) 4481 ParentModule = getSubmodule(Parent); 4482 4483 // Retrieve this (sub)module from the module map, creating it if 4484 // necessary. 4485 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, IsFramework, 4486 IsExplicit).first; 4487 4488 // FIXME: set the definition loc for CurrentModule, or call 4489 // ModMap.setInferredModuleAllowedBy() 4490 4491 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 4492 if (GlobalIndex >= SubmodulesLoaded.size() || 4493 SubmodulesLoaded[GlobalIndex]) { 4494 Error("too many submodules"); 4495 return Failure; 4496 } 4497 4498 if (!ParentModule) { 4499 if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 4500 if (CurFile != F.File) { 4501 if (!Diags.isDiagnosticInFlight()) { 4502 Diag(diag::err_module_file_conflict) 4503 << CurrentModule->getTopLevelModuleName() 4504 << CurFile->getName() 4505 << F.File->getName(); 4506 } 4507 return Failure; 4508 } 4509 } 4510 4511 CurrentModule->setASTFile(F.File); 4512 } 4513 4514 CurrentModule->Signature = F.Signature; 4515 CurrentModule->IsFromModuleFile = true; 4516 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 4517 CurrentModule->IsExternC = IsExternC; 4518 CurrentModule->InferSubmodules = InferSubmodules; 4519 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 4520 CurrentModule->InferExportWildcard = InferExportWildcard; 4521 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive; 4522 if (DeserializationListener) 4523 DeserializationListener->ModuleRead(GlobalID, CurrentModule); 4524 4525 SubmodulesLoaded[GlobalIndex] = CurrentModule; 4526 4527 // Clear out data that will be replaced by what is in the module file. 4528 CurrentModule->LinkLibraries.clear(); 4529 CurrentModule->ConfigMacros.clear(); 4530 CurrentModule->UnresolvedConflicts.clear(); 4531 CurrentModule->Conflicts.clear(); 4532 4533 // The module is available unless it's missing a requirement; relevant 4534 // requirements will be (re-)added by SUBMODULE_REQUIRES records. 4535 // Missing headers that were present when the module was built do not 4536 // make it unavailable -- if we got this far, this must be an explicitly 4537 // imported module file. 4538 CurrentModule->Requirements.clear(); 4539 CurrentModule->MissingHeaders.clear(); 4540 CurrentModule->IsMissingRequirement = 4541 ParentModule && ParentModule->IsMissingRequirement; 4542 CurrentModule->IsAvailable = !CurrentModule->IsMissingRequirement; 4543 break; 4544 } 4545 4546 case SUBMODULE_UMBRELLA_HEADER: { 4547 std::string Filename = Blob; 4548 ResolveImportedPath(F, Filename); 4549 if (auto *Umbrella = PP.getFileManager().getFile(Filename)) { 4550 if (!CurrentModule->getUmbrellaHeader()) 4551 ModMap.setUmbrellaHeader(CurrentModule, Umbrella, Blob); 4552 else if (CurrentModule->getUmbrellaHeader().Entry != Umbrella) { 4553 // This can be a spurious difference caused by changing the VFS to 4554 // point to a different copy of the file, and it is too late to 4555 // to rebuild safely. 4556 // FIXME: If we wrote the virtual paths instead of the 'real' paths, 4557 // after input file validation only real problems would remain and we 4558 // could just error. For now, assume it's okay. 4559 break; 4560 } 4561 } 4562 break; 4563 } 4564 4565 case SUBMODULE_HEADER: 4566 case SUBMODULE_EXCLUDED_HEADER: 4567 case SUBMODULE_PRIVATE_HEADER: 4568 // We lazily associate headers with their modules via the HeaderInfo table. 4569 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 4570 // of complete filenames or remove it entirely. 4571 break; 4572 4573 case SUBMODULE_TEXTUAL_HEADER: 4574 case SUBMODULE_PRIVATE_TEXTUAL_HEADER: 4575 // FIXME: Textual headers are not marked in the HeaderInfo table. Load 4576 // them here. 4577 break; 4578 4579 case SUBMODULE_TOPHEADER: { 4580 CurrentModule->addTopHeaderFilename(Blob); 4581 break; 4582 } 4583 4584 case SUBMODULE_UMBRELLA_DIR: { 4585 std::string Dirname = Blob; 4586 ResolveImportedPath(F, Dirname); 4587 if (auto *Umbrella = PP.getFileManager().getDirectory(Dirname)) { 4588 if (!CurrentModule->getUmbrellaDir()) 4589 ModMap.setUmbrellaDir(CurrentModule, Umbrella, Blob); 4590 else if (CurrentModule->getUmbrellaDir().Entry != Umbrella) { 4591 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 4592 Error("mismatched umbrella directories in submodule"); 4593 return OutOfDate; 4594 } 4595 } 4596 break; 4597 } 4598 4599 case SUBMODULE_METADATA: { 4600 F.BaseSubmoduleID = getTotalNumSubmodules(); 4601 F.LocalNumSubmodules = Record[0]; 4602 unsigned LocalBaseSubmoduleID = Record[1]; 4603 if (F.LocalNumSubmodules > 0) { 4604 // Introduce the global -> local mapping for submodules within this 4605 // module. 4606 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 4607 4608 // Introduce the local -> global mapping for submodules within this 4609 // module. 4610 F.SubmoduleRemap.insertOrReplace( 4611 std::make_pair(LocalBaseSubmoduleID, 4612 F.BaseSubmoduleID - LocalBaseSubmoduleID)); 4613 4614 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 4615 } 4616 break; 4617 } 4618 4619 case SUBMODULE_IMPORTS: { 4620 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 4621 UnresolvedModuleRef Unresolved; 4622 Unresolved.File = &F; 4623 Unresolved.Mod = CurrentModule; 4624 Unresolved.ID = Record[Idx]; 4625 Unresolved.Kind = UnresolvedModuleRef::Import; 4626 Unresolved.IsWildcard = false; 4627 UnresolvedModuleRefs.push_back(Unresolved); 4628 } 4629 break; 4630 } 4631 4632 case SUBMODULE_EXPORTS: { 4633 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 4634 UnresolvedModuleRef Unresolved; 4635 Unresolved.File = &F; 4636 Unresolved.Mod = CurrentModule; 4637 Unresolved.ID = Record[Idx]; 4638 Unresolved.Kind = UnresolvedModuleRef::Export; 4639 Unresolved.IsWildcard = Record[Idx + 1]; 4640 UnresolvedModuleRefs.push_back(Unresolved); 4641 } 4642 4643 // Once we've loaded the set of exports, there's no reason to keep 4644 // the parsed, unresolved exports around. 4645 CurrentModule->UnresolvedExports.clear(); 4646 break; 4647 } 4648 case SUBMODULE_REQUIRES: { 4649 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(), 4650 Context.getTargetInfo()); 4651 break; 4652 } 4653 4654 case SUBMODULE_LINK_LIBRARY: 4655 CurrentModule->LinkLibraries.push_back( 4656 Module::LinkLibrary(Blob, Record[0])); 4657 break; 4658 4659 case SUBMODULE_CONFIG_MACRO: 4660 CurrentModule->ConfigMacros.push_back(Blob.str()); 4661 break; 4662 4663 case SUBMODULE_CONFLICT: { 4664 UnresolvedModuleRef Unresolved; 4665 Unresolved.File = &F; 4666 Unresolved.Mod = CurrentModule; 4667 Unresolved.ID = Record[0]; 4668 Unresolved.Kind = UnresolvedModuleRef::Conflict; 4669 Unresolved.IsWildcard = false; 4670 Unresolved.String = Blob; 4671 UnresolvedModuleRefs.push_back(Unresolved); 4672 break; 4673 } 4674 } 4675 } 4676 } 4677 4678 /// \brief Parse the record that corresponds to a LangOptions data 4679 /// structure. 4680 /// 4681 /// This routine parses the language options from the AST file and then gives 4682 /// them to the AST listener if one is set. 4683 /// 4684 /// \returns true if the listener deems the file unacceptable, false otherwise. 4685 bool ASTReader::ParseLanguageOptions(const RecordData &Record, 4686 bool Complain, 4687 ASTReaderListener &Listener, 4688 bool AllowCompatibleDifferences) { 4689 LangOptions LangOpts; 4690 unsigned Idx = 0; 4691 #define LANGOPT(Name, Bits, Default, Description) \ 4692 LangOpts.Name = Record[Idx++]; 4693 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 4694 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 4695 #include "clang/Basic/LangOptions.def" 4696 #define SANITIZER(NAME, ID) \ 4697 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]); 4698 #include "clang/Basic/Sanitizers.def" 4699 4700 for (unsigned N = Record[Idx++]; N; --N) 4701 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx)); 4702 4703 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 4704 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 4705 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 4706 4707 LangOpts.CurrentModule = ReadString(Record, Idx); 4708 4709 // Comment options. 4710 for (unsigned N = Record[Idx++]; N; --N) { 4711 LangOpts.CommentOpts.BlockCommandNames.push_back( 4712 ReadString(Record, Idx)); 4713 } 4714 LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 4715 4716 // OpenMP offloading options. 4717 for (unsigned N = Record[Idx++]; N; --N) { 4718 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx))); 4719 } 4720 4721 LangOpts.OMPHostIRFile = ReadString(Record, Idx); 4722 4723 return Listener.ReadLanguageOptions(LangOpts, Complain, 4724 AllowCompatibleDifferences); 4725 } 4726 4727 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain, 4728 ASTReaderListener &Listener, 4729 bool AllowCompatibleDifferences) { 4730 unsigned Idx = 0; 4731 TargetOptions TargetOpts; 4732 TargetOpts.Triple = ReadString(Record, Idx); 4733 TargetOpts.CPU = ReadString(Record, Idx); 4734 TargetOpts.ABI = ReadString(Record, Idx); 4735 for (unsigned N = Record[Idx++]; N; --N) { 4736 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 4737 } 4738 for (unsigned N = Record[Idx++]; N; --N) { 4739 TargetOpts.Features.push_back(ReadString(Record, Idx)); 4740 } 4741 4742 return Listener.ReadTargetOptions(TargetOpts, Complain, 4743 AllowCompatibleDifferences); 4744 } 4745 4746 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 4747 ASTReaderListener &Listener) { 4748 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); 4749 unsigned Idx = 0; 4750 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++]; 4751 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 4752 DiagOpts->set##Name(static_cast<Type>(Record[Idx++])); 4753 #include "clang/Basic/DiagnosticOptions.def" 4754 4755 for (unsigned N = Record[Idx++]; N; --N) 4756 DiagOpts->Warnings.push_back(ReadString(Record, Idx)); 4757 for (unsigned N = Record[Idx++]; N; --N) 4758 DiagOpts->Remarks.push_back(ReadString(Record, Idx)); 4759 4760 return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 4761 } 4762 4763 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 4764 ASTReaderListener &Listener) { 4765 FileSystemOptions FSOpts; 4766 unsigned Idx = 0; 4767 FSOpts.WorkingDir = ReadString(Record, Idx); 4768 return Listener.ReadFileSystemOptions(FSOpts, Complain); 4769 } 4770 4771 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 4772 bool Complain, 4773 ASTReaderListener &Listener) { 4774 HeaderSearchOptions HSOpts; 4775 unsigned Idx = 0; 4776 HSOpts.Sysroot = ReadString(Record, Idx); 4777 4778 // Include entries. 4779 for (unsigned N = Record[Idx++]; N; --N) { 4780 std::string Path = ReadString(Record, Idx); 4781 frontend::IncludeDirGroup Group 4782 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 4783 bool IsFramework = Record[Idx++]; 4784 bool IgnoreSysRoot = Record[Idx++]; 4785 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework, 4786 IgnoreSysRoot); 4787 } 4788 4789 // System header prefixes. 4790 for (unsigned N = Record[Idx++]; N; --N) { 4791 std::string Prefix = ReadString(Record, Idx); 4792 bool IsSystemHeader = Record[Idx++]; 4793 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader); 4794 } 4795 4796 HSOpts.ResourceDir = ReadString(Record, Idx); 4797 HSOpts.ModuleCachePath = ReadString(Record, Idx); 4798 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx); 4799 HSOpts.DisableModuleHash = Record[Idx++]; 4800 HSOpts.UseBuiltinIncludes = Record[Idx++]; 4801 HSOpts.UseStandardSystemIncludes = Record[Idx++]; 4802 HSOpts.UseStandardCXXIncludes = Record[Idx++]; 4803 HSOpts.UseLibcxx = Record[Idx++]; 4804 std::string SpecificModuleCachePath = ReadString(Record, Idx); 4805 4806 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 4807 Complain); 4808 } 4809 4810 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 4811 bool Complain, 4812 ASTReaderListener &Listener, 4813 std::string &SuggestedPredefines) { 4814 PreprocessorOptions PPOpts; 4815 unsigned Idx = 0; 4816 4817 // Macro definitions/undefs 4818 for (unsigned N = Record[Idx++]; N; --N) { 4819 std::string Macro = ReadString(Record, Idx); 4820 bool IsUndef = Record[Idx++]; 4821 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 4822 } 4823 4824 // Includes 4825 for (unsigned N = Record[Idx++]; N; --N) { 4826 PPOpts.Includes.push_back(ReadString(Record, Idx)); 4827 } 4828 4829 // Macro Includes 4830 for (unsigned N = Record[Idx++]; N; --N) { 4831 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 4832 } 4833 4834 PPOpts.UsePredefines = Record[Idx++]; 4835 PPOpts.DetailedRecord = Record[Idx++]; 4836 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 4837 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx); 4838 PPOpts.ObjCXXARCStandardLibrary = 4839 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 4840 SuggestedPredefines.clear(); 4841 return Listener.ReadPreprocessorOptions(PPOpts, Complain, 4842 SuggestedPredefines); 4843 } 4844 4845 std::pair<ModuleFile *, unsigned> 4846 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 4847 GlobalPreprocessedEntityMapType::iterator 4848 I = GlobalPreprocessedEntityMap.find(GlobalIndex); 4849 assert(I != GlobalPreprocessedEntityMap.end() && 4850 "Corrupted global preprocessed entity map"); 4851 ModuleFile *M = I->second; 4852 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 4853 return std::make_pair(M, LocalIndex); 4854 } 4855 4856 llvm::iterator_range<PreprocessingRecord::iterator> 4857 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 4858 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 4859 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 4860 Mod.NumPreprocessedEntities); 4861 4862 return llvm::make_range(PreprocessingRecord::iterator(), 4863 PreprocessingRecord::iterator()); 4864 } 4865 4866 llvm::iterator_range<ASTReader::ModuleDeclIterator> 4867 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 4868 return llvm::make_range( 4869 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 4870 ModuleDeclIterator(this, &Mod, 4871 Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 4872 } 4873 4874 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 4875 PreprocessedEntityID PPID = Index+1; 4876 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 4877 ModuleFile &M = *PPInfo.first; 4878 unsigned LocalIndex = PPInfo.second; 4879 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 4880 4881 if (!PP.getPreprocessingRecord()) { 4882 Error("no preprocessing record"); 4883 return nullptr; 4884 } 4885 4886 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 4887 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset); 4888 4889 llvm::BitstreamEntry Entry = 4890 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 4891 if (Entry.Kind != llvm::BitstreamEntry::Record) 4892 return nullptr; 4893 4894 // Read the record. 4895 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()), 4896 TranslateSourceLocation(M, PPOffs.getEnd())); 4897 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 4898 StringRef Blob; 4899 RecordData Record; 4900 PreprocessorDetailRecordTypes RecType = 4901 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord( 4902 Entry.ID, Record, &Blob); 4903 switch (RecType) { 4904 case PPD_MACRO_EXPANSION: { 4905 bool isBuiltin = Record[0]; 4906 IdentifierInfo *Name = nullptr; 4907 MacroDefinitionRecord *Def = nullptr; 4908 if (isBuiltin) 4909 Name = getLocalIdentifier(M, Record[1]); 4910 else { 4911 PreprocessedEntityID GlobalID = 4912 getGlobalPreprocessedEntityID(M, Record[1]); 4913 Def = cast<MacroDefinitionRecord>( 4914 PPRec.getLoadedPreprocessedEntity(GlobalID - 1)); 4915 } 4916 4917 MacroExpansion *ME; 4918 if (isBuiltin) 4919 ME = new (PPRec) MacroExpansion(Name, Range); 4920 else 4921 ME = new (PPRec) MacroExpansion(Def, Range); 4922 4923 return ME; 4924 } 4925 4926 case PPD_MACRO_DEFINITION: { 4927 // Decode the identifier info and then check again; if the macro is 4928 // still defined and associated with the identifier, 4929 IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 4930 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range); 4931 4932 if (DeserializationListener) 4933 DeserializationListener->MacroDefinitionRead(PPID, MD); 4934 4935 return MD; 4936 } 4937 4938 case PPD_INCLUSION_DIRECTIVE: { 4939 const char *FullFileNameStart = Blob.data() + Record[0]; 4940 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 4941 const FileEntry *File = nullptr; 4942 if (!FullFileName.empty()) 4943 File = PP.getFileManager().getFile(FullFileName); 4944 4945 // FIXME: Stable encoding 4946 InclusionDirective::InclusionKind Kind 4947 = static_cast<InclusionDirective::InclusionKind>(Record[2]); 4948 InclusionDirective *ID 4949 = new (PPRec) InclusionDirective(PPRec, Kind, 4950 StringRef(Blob.data(), Record[0]), 4951 Record[1], Record[3], 4952 File, 4953 Range); 4954 return ID; 4955 } 4956 } 4957 4958 llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 4959 } 4960 4961 /// \brief \arg SLocMapI points at a chunk of a module that contains no 4962 /// preprocessed entities or the entities it contains are not the ones we are 4963 /// looking for. Find the next module that contains entities and return the ID 4964 /// of the first entry. 4965 PreprocessedEntityID ASTReader::findNextPreprocessedEntity( 4966 GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 4967 ++SLocMapI; 4968 for (GlobalSLocOffsetMapType::const_iterator 4969 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 4970 ModuleFile &M = *SLocMapI->second; 4971 if (M.NumPreprocessedEntities) 4972 return M.BasePreprocessedEntityID; 4973 } 4974 4975 return getTotalNumPreprocessedEntities(); 4976 } 4977 4978 namespace { 4979 4980 struct PPEntityComp { 4981 const ASTReader &Reader; 4982 ModuleFile &M; 4983 4984 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { } 4985 4986 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 4987 SourceLocation LHS = getLoc(L); 4988 SourceLocation RHS = getLoc(R); 4989 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 4990 } 4991 4992 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 4993 SourceLocation LHS = getLoc(L); 4994 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 4995 } 4996 4997 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 4998 SourceLocation RHS = getLoc(R); 4999 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5000 } 5001 5002 SourceLocation getLoc(const PPEntityOffset &PPE) const { 5003 return Reader.TranslateSourceLocation(M, PPE.getBegin()); 5004 } 5005 }; 5006 5007 } 5008 5009 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc, 5010 bool EndsAfter) const { 5011 if (SourceMgr.isLocalSourceLocation(Loc)) 5012 return getTotalNumPreprocessedEntities(); 5013 5014 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find( 5015 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1); 5016 assert(SLocMapI != GlobalSLocOffsetMap.end() && 5017 "Corrupted global sloc offset map"); 5018 5019 if (SLocMapI->second->NumPreprocessedEntities == 0) 5020 return findNextPreprocessedEntity(SLocMapI); 5021 5022 ModuleFile &M = *SLocMapI->second; 5023 typedef const PPEntityOffset *pp_iterator; 5024 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 5025 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 5026 5027 size_t Count = M.NumPreprocessedEntities; 5028 size_t Half; 5029 pp_iterator First = pp_begin; 5030 pp_iterator PPI; 5031 5032 if (EndsAfter) { 5033 PPI = std::upper_bound(pp_begin, pp_end, Loc, 5034 PPEntityComp(*this, M)); 5035 } else { 5036 // Do a binary search manually instead of using std::lower_bound because 5037 // The end locations of entities may be unordered (when a macro expansion 5038 // is inside another macro argument), but for this case it is not important 5039 // whether we get the first macro expansion or its containing macro. 5040 while (Count > 0) { 5041 Half = Count / 2; 5042 PPI = First; 5043 std::advance(PPI, Half); 5044 if (SourceMgr.isBeforeInTranslationUnit( 5045 TranslateSourceLocation(M, PPI->getEnd()), Loc)) { 5046 First = PPI; 5047 ++First; 5048 Count = Count - Half - 1; 5049 } else 5050 Count = Half; 5051 } 5052 } 5053 5054 if (PPI == pp_end) 5055 return findNextPreprocessedEntity(SLocMapI); 5056 5057 return M.BasePreprocessedEntityID + (PPI - pp_begin); 5058 } 5059 5060 /// \brief Returns a pair of [Begin, End) indices of preallocated 5061 /// preprocessed entities that \arg Range encompasses. 5062 std::pair<unsigned, unsigned> 5063 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 5064 if (Range.isInvalid()) 5065 return std::make_pair(0,0); 5066 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 5067 5068 PreprocessedEntityID BeginID = 5069 findPreprocessedEntity(Range.getBegin(), false); 5070 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true); 5071 return std::make_pair(BeginID, EndID); 5072 } 5073 5074 /// \brief Optionally returns true or false if the preallocated preprocessed 5075 /// entity with index \arg Index came from file \arg FID. 5076 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 5077 FileID FID) { 5078 if (FID.isInvalid()) 5079 return false; 5080 5081 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 5082 ModuleFile &M = *PPInfo.first; 5083 unsigned LocalIndex = PPInfo.second; 5084 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 5085 5086 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin()); 5087 if (Loc.isInvalid()) 5088 return false; 5089 5090 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 5091 return true; 5092 else 5093 return false; 5094 } 5095 5096 namespace { 5097 /// \brief Visitor used to search for information about a header file. 5098 class HeaderFileInfoVisitor { 5099 const FileEntry *FE; 5100 5101 Optional<HeaderFileInfo> HFI; 5102 5103 public: 5104 explicit HeaderFileInfoVisitor(const FileEntry *FE) 5105 : FE(FE) { } 5106 5107 bool operator()(ModuleFile &M) { 5108 HeaderFileInfoLookupTable *Table 5109 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 5110 if (!Table) 5111 return false; 5112 5113 // Look in the on-disk hash table for an entry for this file name. 5114 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE); 5115 if (Pos == Table->end()) 5116 return false; 5117 5118 HFI = *Pos; 5119 return true; 5120 } 5121 5122 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 5123 }; 5124 } 5125 5126 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 5127 HeaderFileInfoVisitor Visitor(FE); 5128 ModuleMgr.visit(Visitor); 5129 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 5130 return *HFI; 5131 5132 return HeaderFileInfo(); 5133 } 5134 5135 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 5136 // FIXME: Make it work properly with modules. 5137 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates; 5138 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) { 5139 ModuleFile &F = *(*I); 5140 unsigned Idx = 0; 5141 DiagStates.clear(); 5142 assert(!Diag.DiagStates.empty()); 5143 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one. 5144 while (Idx < F.PragmaDiagMappings.size()) { 5145 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 5146 unsigned DiagStateID = F.PragmaDiagMappings[Idx++]; 5147 if (DiagStateID != 0) { 5148 Diag.DiagStatePoints.push_back( 5149 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1], 5150 FullSourceLoc(Loc, SourceMgr))); 5151 continue; 5152 } 5153 5154 assert(DiagStateID == 0); 5155 // A new DiagState was created here. 5156 Diag.DiagStates.push_back(*Diag.GetCurDiagState()); 5157 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back(); 5158 DiagStates.push_back(NewState); 5159 Diag.DiagStatePoints.push_back( 5160 DiagnosticsEngine::DiagStatePoint(NewState, 5161 FullSourceLoc(Loc, SourceMgr))); 5162 while (1) { 5163 assert(Idx < F.PragmaDiagMappings.size() && 5164 "Invalid data, didn't find '-1' marking end of diag/map pairs"); 5165 if (Idx >= F.PragmaDiagMappings.size()) { 5166 break; // Something is messed up but at least avoid infinite loop in 5167 // release build. 5168 } 5169 unsigned DiagID = F.PragmaDiagMappings[Idx++]; 5170 if (DiagID == (unsigned)-1) { 5171 break; // no more diag/map pairs for this location. 5172 } 5173 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++]; 5174 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc); 5175 Diag.GetCurDiagState()->setMapping(DiagID, Mapping); 5176 } 5177 } 5178 } 5179 } 5180 5181 /// \brief Get the correct cursor and offset for loading a type. 5182 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 5183 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 5184 assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 5185 ModuleFile *M = I->second; 5186 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]); 5187 } 5188 5189 /// \brief Read and return the type with the given index.. 5190 /// 5191 /// The index is the type ID, shifted and minus the number of predefs. This 5192 /// routine actually reads the record corresponding to the type at the given 5193 /// location. It is a helper routine for GetType, which deals with reading type 5194 /// IDs. 5195 QualType ASTReader::readTypeRecord(unsigned Index) { 5196 RecordLocation Loc = TypeCursorForIndex(Index); 5197 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 5198 5199 // Keep track of where we are in the stream, then jump back there 5200 // after reading this type. 5201 SavedStreamPosition SavedPosition(DeclsCursor); 5202 5203 ReadingKindTracker ReadingKind(Read_Type, *this); 5204 5205 // Note that we are loading a type record. 5206 Deserializing AType(this); 5207 5208 unsigned Idx = 0; 5209 DeclsCursor.JumpToBit(Loc.Offset); 5210 RecordData Record; 5211 unsigned Code = DeclsCursor.ReadCode(); 5212 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) { 5213 case TYPE_EXT_QUAL: { 5214 if (Record.size() != 2) { 5215 Error("Incorrect encoding of extended qualifier type"); 5216 return QualType(); 5217 } 5218 QualType Base = readType(*Loc.F, Record, Idx); 5219 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]); 5220 return Context.getQualifiedType(Base, Quals); 5221 } 5222 5223 case TYPE_COMPLEX: { 5224 if (Record.size() != 1) { 5225 Error("Incorrect encoding of complex type"); 5226 return QualType(); 5227 } 5228 QualType ElemType = readType(*Loc.F, Record, Idx); 5229 return Context.getComplexType(ElemType); 5230 } 5231 5232 case TYPE_POINTER: { 5233 if (Record.size() != 1) { 5234 Error("Incorrect encoding of pointer type"); 5235 return QualType(); 5236 } 5237 QualType PointeeType = readType(*Loc.F, Record, Idx); 5238 return Context.getPointerType(PointeeType); 5239 } 5240 5241 case TYPE_DECAYED: { 5242 if (Record.size() != 1) { 5243 Error("Incorrect encoding of decayed type"); 5244 return QualType(); 5245 } 5246 QualType OriginalType = readType(*Loc.F, Record, Idx); 5247 QualType DT = Context.getAdjustedParameterType(OriginalType); 5248 if (!isa<DecayedType>(DT)) 5249 Error("Decayed type does not decay"); 5250 return DT; 5251 } 5252 5253 case TYPE_ADJUSTED: { 5254 if (Record.size() != 2) { 5255 Error("Incorrect encoding of adjusted type"); 5256 return QualType(); 5257 } 5258 QualType OriginalTy = readType(*Loc.F, Record, Idx); 5259 QualType AdjustedTy = readType(*Loc.F, Record, Idx); 5260 return Context.getAdjustedType(OriginalTy, AdjustedTy); 5261 } 5262 5263 case TYPE_BLOCK_POINTER: { 5264 if (Record.size() != 1) { 5265 Error("Incorrect encoding of block pointer type"); 5266 return QualType(); 5267 } 5268 QualType PointeeType = readType(*Loc.F, Record, Idx); 5269 return Context.getBlockPointerType(PointeeType); 5270 } 5271 5272 case TYPE_LVALUE_REFERENCE: { 5273 if (Record.size() != 2) { 5274 Error("Incorrect encoding of lvalue reference type"); 5275 return QualType(); 5276 } 5277 QualType PointeeType = readType(*Loc.F, Record, Idx); 5278 return Context.getLValueReferenceType(PointeeType, Record[1]); 5279 } 5280 5281 case TYPE_RVALUE_REFERENCE: { 5282 if (Record.size() != 1) { 5283 Error("Incorrect encoding of rvalue reference type"); 5284 return QualType(); 5285 } 5286 QualType PointeeType = readType(*Loc.F, Record, Idx); 5287 return Context.getRValueReferenceType(PointeeType); 5288 } 5289 5290 case TYPE_MEMBER_POINTER: { 5291 if (Record.size() != 2) { 5292 Error("Incorrect encoding of member pointer type"); 5293 return QualType(); 5294 } 5295 QualType PointeeType = readType(*Loc.F, Record, Idx); 5296 QualType ClassType = readType(*Loc.F, Record, Idx); 5297 if (PointeeType.isNull() || ClassType.isNull()) 5298 return QualType(); 5299 5300 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr()); 5301 } 5302 5303 case TYPE_CONSTANT_ARRAY: { 5304 QualType ElementType = readType(*Loc.F, Record, Idx); 5305 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 5306 unsigned IndexTypeQuals = Record[2]; 5307 unsigned Idx = 3; 5308 llvm::APInt Size = ReadAPInt(Record, Idx); 5309 return Context.getConstantArrayType(ElementType, Size, 5310 ASM, IndexTypeQuals); 5311 } 5312 5313 case TYPE_INCOMPLETE_ARRAY: { 5314 QualType ElementType = readType(*Loc.F, Record, Idx); 5315 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 5316 unsigned IndexTypeQuals = Record[2]; 5317 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals); 5318 } 5319 5320 case TYPE_VARIABLE_ARRAY: { 5321 QualType ElementType = readType(*Loc.F, Record, Idx); 5322 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 5323 unsigned IndexTypeQuals = Record[2]; 5324 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]); 5325 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]); 5326 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F), 5327 ASM, IndexTypeQuals, 5328 SourceRange(LBLoc, RBLoc)); 5329 } 5330 5331 case TYPE_VECTOR: { 5332 if (Record.size() != 3) { 5333 Error("incorrect encoding of vector type in AST file"); 5334 return QualType(); 5335 } 5336 5337 QualType ElementType = readType(*Loc.F, Record, Idx); 5338 unsigned NumElements = Record[1]; 5339 unsigned VecKind = Record[2]; 5340 return Context.getVectorType(ElementType, NumElements, 5341 (VectorType::VectorKind)VecKind); 5342 } 5343 5344 case TYPE_EXT_VECTOR: { 5345 if (Record.size() != 3) { 5346 Error("incorrect encoding of extended vector type in AST file"); 5347 return QualType(); 5348 } 5349 5350 QualType ElementType = readType(*Loc.F, Record, Idx); 5351 unsigned NumElements = Record[1]; 5352 return Context.getExtVectorType(ElementType, NumElements); 5353 } 5354 5355 case TYPE_FUNCTION_NO_PROTO: { 5356 if (Record.size() != 6) { 5357 Error("incorrect encoding of no-proto function type"); 5358 return QualType(); 5359 } 5360 QualType ResultType = readType(*Loc.F, Record, Idx); 5361 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3], 5362 (CallingConv)Record[4], Record[5]); 5363 return Context.getFunctionNoProtoType(ResultType, Info); 5364 } 5365 5366 case TYPE_FUNCTION_PROTO: { 5367 QualType ResultType = readType(*Loc.F, Record, Idx); 5368 5369 FunctionProtoType::ExtProtoInfo EPI; 5370 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1], 5371 /*hasregparm*/ Record[2], 5372 /*regparm*/ Record[3], 5373 static_cast<CallingConv>(Record[4]), 5374 /*produces*/ Record[5]); 5375 5376 unsigned Idx = 6; 5377 5378 EPI.Variadic = Record[Idx++]; 5379 EPI.HasTrailingReturn = Record[Idx++]; 5380 EPI.TypeQuals = Record[Idx++]; 5381 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]); 5382 SmallVector<QualType, 8> ExceptionStorage; 5383 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx); 5384 5385 unsigned NumParams = Record[Idx++]; 5386 SmallVector<QualType, 16> ParamTypes; 5387 for (unsigned I = 0; I != NumParams; ++I) 5388 ParamTypes.push_back(readType(*Loc.F, Record, Idx)); 5389 5390 SmallVector<FunctionProtoType::ExtParameterInfo, 4> ExtParameterInfos; 5391 if (Idx != Record.size()) { 5392 for (unsigned I = 0; I != NumParams; ++I) 5393 ExtParameterInfos.push_back( 5394 FunctionProtoType::ExtParameterInfo 5395 ::getFromOpaqueValue(Record[Idx++])); 5396 EPI.ExtParameterInfos = ExtParameterInfos.data(); 5397 } 5398 5399 assert(Idx == Record.size()); 5400 5401 return Context.getFunctionType(ResultType, ParamTypes, EPI); 5402 } 5403 5404 case TYPE_UNRESOLVED_USING: { 5405 unsigned Idx = 0; 5406 return Context.getTypeDeclType( 5407 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx)); 5408 } 5409 5410 case TYPE_TYPEDEF: { 5411 if (Record.size() != 2) { 5412 Error("incorrect encoding of typedef type"); 5413 return QualType(); 5414 } 5415 unsigned Idx = 0; 5416 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx); 5417 QualType Canonical = readType(*Loc.F, Record, Idx); 5418 if (!Canonical.isNull()) 5419 Canonical = Context.getCanonicalType(Canonical); 5420 return Context.getTypedefType(Decl, Canonical); 5421 } 5422 5423 case TYPE_TYPEOF_EXPR: 5424 return Context.getTypeOfExprType(ReadExpr(*Loc.F)); 5425 5426 case TYPE_TYPEOF: { 5427 if (Record.size() != 1) { 5428 Error("incorrect encoding of typeof(type) in AST file"); 5429 return QualType(); 5430 } 5431 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 5432 return Context.getTypeOfType(UnderlyingType); 5433 } 5434 5435 case TYPE_DECLTYPE: { 5436 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 5437 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType); 5438 } 5439 5440 case TYPE_UNARY_TRANSFORM: { 5441 QualType BaseType = readType(*Loc.F, Record, Idx); 5442 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 5443 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2]; 5444 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind); 5445 } 5446 5447 case TYPE_AUTO: { 5448 QualType Deduced = readType(*Loc.F, Record, Idx); 5449 AutoTypeKeyword Keyword = (AutoTypeKeyword)Record[Idx++]; 5450 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false; 5451 return Context.getAutoType(Deduced, Keyword, IsDependent); 5452 } 5453 5454 case TYPE_RECORD: { 5455 if (Record.size() != 2) { 5456 Error("incorrect encoding of record type"); 5457 return QualType(); 5458 } 5459 unsigned Idx = 0; 5460 bool IsDependent = Record[Idx++]; 5461 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx); 5462 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl()); 5463 QualType T = Context.getRecordType(RD); 5464 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 5465 return T; 5466 } 5467 5468 case TYPE_ENUM: { 5469 if (Record.size() != 2) { 5470 Error("incorrect encoding of enum type"); 5471 return QualType(); 5472 } 5473 unsigned Idx = 0; 5474 bool IsDependent = Record[Idx++]; 5475 QualType T 5476 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx)); 5477 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 5478 return T; 5479 } 5480 5481 case TYPE_ATTRIBUTED: { 5482 if (Record.size() != 3) { 5483 Error("incorrect encoding of attributed type"); 5484 return QualType(); 5485 } 5486 QualType modifiedType = readType(*Loc.F, Record, Idx); 5487 QualType equivalentType = readType(*Loc.F, Record, Idx); 5488 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]); 5489 return Context.getAttributedType(kind, modifiedType, equivalentType); 5490 } 5491 5492 case TYPE_PAREN: { 5493 if (Record.size() != 1) { 5494 Error("incorrect encoding of paren type"); 5495 return QualType(); 5496 } 5497 QualType InnerType = readType(*Loc.F, Record, Idx); 5498 return Context.getParenType(InnerType); 5499 } 5500 5501 case TYPE_PACK_EXPANSION: { 5502 if (Record.size() != 2) { 5503 Error("incorrect encoding of pack expansion type"); 5504 return QualType(); 5505 } 5506 QualType Pattern = readType(*Loc.F, Record, Idx); 5507 if (Pattern.isNull()) 5508 return QualType(); 5509 Optional<unsigned> NumExpansions; 5510 if (Record[1]) 5511 NumExpansions = Record[1] - 1; 5512 return Context.getPackExpansionType(Pattern, NumExpansions); 5513 } 5514 5515 case TYPE_ELABORATED: { 5516 unsigned Idx = 0; 5517 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 5518 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 5519 QualType NamedType = readType(*Loc.F, Record, Idx); 5520 return Context.getElaboratedType(Keyword, NNS, NamedType); 5521 } 5522 5523 case TYPE_OBJC_INTERFACE: { 5524 unsigned Idx = 0; 5525 ObjCInterfaceDecl *ItfD 5526 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx); 5527 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl()); 5528 } 5529 5530 case TYPE_OBJC_OBJECT: { 5531 unsigned Idx = 0; 5532 QualType Base = readType(*Loc.F, Record, Idx); 5533 unsigned NumTypeArgs = Record[Idx++]; 5534 SmallVector<QualType, 4> TypeArgs; 5535 for (unsigned I = 0; I != NumTypeArgs; ++I) 5536 TypeArgs.push_back(readType(*Loc.F, Record, Idx)); 5537 unsigned NumProtos = Record[Idx++]; 5538 SmallVector<ObjCProtocolDecl*, 4> Protos; 5539 for (unsigned I = 0; I != NumProtos; ++I) 5540 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx)); 5541 bool IsKindOf = Record[Idx++]; 5542 return Context.getObjCObjectType(Base, TypeArgs, Protos, IsKindOf); 5543 } 5544 5545 case TYPE_OBJC_OBJECT_POINTER: { 5546 unsigned Idx = 0; 5547 QualType Pointee = readType(*Loc.F, Record, Idx); 5548 return Context.getObjCObjectPointerType(Pointee); 5549 } 5550 5551 case TYPE_SUBST_TEMPLATE_TYPE_PARM: { 5552 unsigned Idx = 0; 5553 QualType Parm = readType(*Loc.F, Record, Idx); 5554 QualType Replacement = readType(*Loc.F, Record, Idx); 5555 return Context.getSubstTemplateTypeParmType( 5556 cast<TemplateTypeParmType>(Parm), 5557 Context.getCanonicalType(Replacement)); 5558 } 5559 5560 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: { 5561 unsigned Idx = 0; 5562 QualType Parm = readType(*Loc.F, Record, Idx); 5563 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx); 5564 return Context.getSubstTemplateTypeParmPackType( 5565 cast<TemplateTypeParmType>(Parm), 5566 ArgPack); 5567 } 5568 5569 case TYPE_INJECTED_CLASS_NAME: { 5570 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx); 5571 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable 5572 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable 5573 // for AST reading, too much interdependencies. 5574 const Type *T = nullptr; 5575 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) { 5576 if (const Type *Existing = DI->getTypeForDecl()) { 5577 T = Existing; 5578 break; 5579 } 5580 } 5581 if (!T) { 5582 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST); 5583 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) 5584 DI->setTypeForDecl(T); 5585 } 5586 return QualType(T, 0); 5587 } 5588 5589 case TYPE_TEMPLATE_TYPE_PARM: { 5590 unsigned Idx = 0; 5591 unsigned Depth = Record[Idx++]; 5592 unsigned Index = Record[Idx++]; 5593 bool Pack = Record[Idx++]; 5594 TemplateTypeParmDecl *D 5595 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx); 5596 return Context.getTemplateTypeParmType(Depth, Index, Pack, D); 5597 } 5598 5599 case TYPE_DEPENDENT_NAME: { 5600 unsigned Idx = 0; 5601 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 5602 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 5603 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx); 5604 QualType Canon = readType(*Loc.F, Record, Idx); 5605 if (!Canon.isNull()) 5606 Canon = Context.getCanonicalType(Canon); 5607 return Context.getDependentNameType(Keyword, NNS, Name, Canon); 5608 } 5609 5610 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: { 5611 unsigned Idx = 0; 5612 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 5613 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 5614 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx); 5615 unsigned NumArgs = Record[Idx++]; 5616 SmallVector<TemplateArgument, 8> Args; 5617 Args.reserve(NumArgs); 5618 while (NumArgs--) 5619 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx)); 5620 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name, 5621 Args.size(), Args.data()); 5622 } 5623 5624 case TYPE_DEPENDENT_SIZED_ARRAY: { 5625 unsigned Idx = 0; 5626 5627 // ArrayType 5628 QualType ElementType = readType(*Loc.F, Record, Idx); 5629 ArrayType::ArraySizeModifier ASM 5630 = (ArrayType::ArraySizeModifier)Record[Idx++]; 5631 unsigned IndexTypeQuals = Record[Idx++]; 5632 5633 // DependentSizedArrayType 5634 Expr *NumElts = ReadExpr(*Loc.F); 5635 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx); 5636 5637 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM, 5638 IndexTypeQuals, Brackets); 5639 } 5640 5641 case TYPE_TEMPLATE_SPECIALIZATION: { 5642 unsigned Idx = 0; 5643 bool IsDependent = Record[Idx++]; 5644 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx); 5645 SmallVector<TemplateArgument, 8> Args; 5646 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx); 5647 QualType Underlying = readType(*Loc.F, Record, Idx); 5648 QualType T; 5649 if (Underlying.isNull()) 5650 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(), 5651 Args.size()); 5652 else 5653 T = Context.getTemplateSpecializationType(Name, Args.data(), 5654 Args.size(), 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_OVERLOAD_ID: 6041 T = Context.OverloadTy; 6042 break; 6043 case PREDEF_TYPE_BOUND_MEMBER: 6044 T = Context.BoundMemberTy; 6045 break; 6046 case PREDEF_TYPE_PSEUDO_OBJECT: 6047 T = Context.PseudoObjectTy; 6048 break; 6049 case PREDEF_TYPE_DEPENDENT_ID: 6050 T = Context.DependentTy; 6051 break; 6052 case PREDEF_TYPE_UNKNOWN_ANY: 6053 T = Context.UnknownAnyTy; 6054 break; 6055 case PREDEF_TYPE_NULLPTR_ID: 6056 T = Context.NullPtrTy; 6057 break; 6058 case PREDEF_TYPE_CHAR16_ID: 6059 T = Context.Char16Ty; 6060 break; 6061 case PREDEF_TYPE_CHAR32_ID: 6062 T = Context.Char32Ty; 6063 break; 6064 case PREDEF_TYPE_OBJC_ID: 6065 T = Context.ObjCBuiltinIdTy; 6066 break; 6067 case PREDEF_TYPE_OBJC_CLASS: 6068 T = Context.ObjCBuiltinClassTy; 6069 break; 6070 case PREDEF_TYPE_OBJC_SEL: 6071 T = Context.ObjCBuiltinSelTy; 6072 break; 6073 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 6074 case PREDEF_TYPE_##Id##_ID: \ 6075 T = Context.SingletonId; \ 6076 break; 6077 #include "clang/Basic/OpenCLImageTypes.def" 6078 case PREDEF_TYPE_SAMPLER_ID: 6079 T = Context.OCLSamplerTy; 6080 break; 6081 case PREDEF_TYPE_EVENT_ID: 6082 T = Context.OCLEventTy; 6083 break; 6084 case PREDEF_TYPE_CLK_EVENT_ID: 6085 T = Context.OCLClkEventTy; 6086 break; 6087 case PREDEF_TYPE_QUEUE_ID: 6088 T = Context.OCLQueueTy; 6089 break; 6090 case PREDEF_TYPE_NDRANGE_ID: 6091 T = Context.OCLNDRangeTy; 6092 break; 6093 case PREDEF_TYPE_RESERVE_ID_ID: 6094 T = Context.OCLReserveIDTy; 6095 break; 6096 case PREDEF_TYPE_AUTO_DEDUCT: 6097 T = Context.getAutoDeductType(); 6098 break; 6099 6100 case PREDEF_TYPE_AUTO_RREF_DEDUCT: 6101 T = Context.getAutoRRefDeductType(); 6102 break; 6103 6104 case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 6105 T = Context.ARCUnbridgedCastTy; 6106 break; 6107 6108 case PREDEF_TYPE_BUILTIN_FN: 6109 T = Context.BuiltinFnTy; 6110 break; 6111 6112 case PREDEF_TYPE_OMP_ARRAY_SECTION: 6113 T = Context.OMPArraySectionTy; 6114 break; 6115 } 6116 6117 assert(!T.isNull() && "Unknown predefined type"); 6118 return T.withFastQualifiers(FastQuals); 6119 } 6120 6121 Index -= NUM_PREDEF_TYPE_IDS; 6122 assert(Index < TypesLoaded.size() && "Type index out-of-range"); 6123 if (TypesLoaded[Index].isNull()) { 6124 TypesLoaded[Index] = readTypeRecord(Index); 6125 if (TypesLoaded[Index].isNull()) 6126 return QualType(); 6127 6128 TypesLoaded[Index]->setFromAST(); 6129 if (DeserializationListener) 6130 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 6131 TypesLoaded[Index]); 6132 } 6133 6134 return TypesLoaded[Index].withFastQualifiers(FastQuals); 6135 } 6136 6137 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 6138 return GetType(getGlobalTypeID(F, LocalID)); 6139 } 6140 6141 serialization::TypeID 6142 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 6143 unsigned FastQuals = LocalID & Qualifiers::FastMask; 6144 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 6145 6146 if (LocalIndex < NUM_PREDEF_TYPE_IDS) 6147 return LocalID; 6148 6149 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6150 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 6151 assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 6152 6153 unsigned GlobalIndex = LocalIndex + I->second; 6154 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 6155 } 6156 6157 TemplateArgumentLocInfo 6158 ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F, 6159 TemplateArgument::ArgKind Kind, 6160 const RecordData &Record, 6161 unsigned &Index) { 6162 switch (Kind) { 6163 case TemplateArgument::Expression: 6164 return ReadExpr(F); 6165 case TemplateArgument::Type: 6166 return GetTypeSourceInfo(F, Record, Index); 6167 case TemplateArgument::Template: { 6168 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 6169 Index); 6170 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 6171 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 6172 SourceLocation()); 6173 } 6174 case TemplateArgument::TemplateExpansion: { 6175 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 6176 Index); 6177 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 6178 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index); 6179 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 6180 EllipsisLoc); 6181 } 6182 case TemplateArgument::Null: 6183 case TemplateArgument::Integral: 6184 case TemplateArgument::Declaration: 6185 case TemplateArgument::NullPtr: 6186 case TemplateArgument::Pack: 6187 // FIXME: Is this right? 6188 return TemplateArgumentLocInfo(); 6189 } 6190 llvm_unreachable("unexpected template argument loc"); 6191 } 6192 6193 TemplateArgumentLoc 6194 ASTReader::ReadTemplateArgumentLoc(ModuleFile &F, 6195 const RecordData &Record, unsigned &Index) { 6196 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index); 6197 6198 if (Arg.getKind() == TemplateArgument::Expression) { 6199 if (Record[Index++]) // bool InfoHasSameExpr. 6200 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 6201 } 6202 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(), 6203 Record, Index)); 6204 } 6205 6206 const ASTTemplateArgumentListInfo* 6207 ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F, 6208 const RecordData &Record, 6209 unsigned &Index) { 6210 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index); 6211 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index); 6212 unsigned NumArgsAsWritten = Record[Index++]; 6213 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 6214 for (unsigned i = 0; i != NumArgsAsWritten; ++i) 6215 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index)); 6216 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 6217 } 6218 6219 Decl *ASTReader::GetExternalDecl(uint32_t ID) { 6220 return GetDecl(ID); 6221 } 6222 6223 template<typename TemplateSpecializationDecl> 6224 static void completeRedeclChainForTemplateSpecialization(Decl *D) { 6225 if (auto *TSD = dyn_cast<TemplateSpecializationDecl>(D)) 6226 TSD->getSpecializedTemplate()->LoadLazySpecializations(); 6227 } 6228 6229 void ASTReader::CompleteRedeclChain(const Decl *D) { 6230 if (NumCurrentElementsDeserializing) { 6231 // We arrange to not care about the complete redeclaration chain while we're 6232 // deserializing. Just remember that the AST has marked this one as complete 6233 // but that it's not actually complete yet, so we know we still need to 6234 // complete it later. 6235 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D)); 6236 return; 6237 } 6238 6239 const DeclContext *DC = D->getDeclContext()->getRedeclContext(); 6240 6241 // If this is a named declaration, complete it by looking it up 6242 // within its context. 6243 // 6244 // FIXME: Merging a function definition should merge 6245 // all mergeable entities within it. 6246 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) || 6247 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) { 6248 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) { 6249 if (!getContext().getLangOpts().CPlusPlus && 6250 isa<TranslationUnitDecl>(DC)) { 6251 // Outside of C++, we don't have a lookup table for the TU, so update 6252 // the identifier instead. (For C++ modules, we don't store decls 6253 // in the serialized identifier table, so we do the lookup in the TU.) 6254 auto *II = Name.getAsIdentifierInfo(); 6255 assert(II && "non-identifier name in C?"); 6256 if (II->isOutOfDate()) 6257 updateOutOfDateIdentifier(*II); 6258 } else 6259 DC->lookup(Name); 6260 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) { 6261 // Find all declarations of this kind from the relevant context. 6262 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) { 6263 auto *DC = cast<DeclContext>(DCDecl); 6264 SmallVector<Decl*, 8> Decls; 6265 FindExternalLexicalDecls( 6266 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls); 6267 } 6268 } 6269 } 6270 6271 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) 6272 CTSD->getSpecializedTemplate()->LoadLazySpecializations(); 6273 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) 6274 VTSD->getSpecializedTemplate()->LoadLazySpecializations(); 6275 if (auto *FD = dyn_cast<FunctionDecl>(D)) { 6276 if (auto *Template = FD->getPrimaryTemplate()) 6277 Template->LoadLazySpecializations(); 6278 } 6279 } 6280 6281 CXXCtorInitializer ** 6282 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) { 6283 RecordLocation Loc = getLocalBitOffset(Offset); 6284 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 6285 SavedStreamPosition SavedPosition(Cursor); 6286 Cursor.JumpToBit(Loc.Offset); 6287 ReadingKindTracker ReadingKind(Read_Decl, *this); 6288 6289 RecordData Record; 6290 unsigned Code = Cursor.ReadCode(); 6291 unsigned RecCode = Cursor.readRecord(Code, Record); 6292 if (RecCode != DECL_CXX_CTOR_INITIALIZERS) { 6293 Error("malformed AST file: missing C++ ctor initializers"); 6294 return nullptr; 6295 } 6296 6297 unsigned Idx = 0; 6298 return ReadCXXCtorInitializers(*Loc.F, Record, Idx); 6299 } 6300 6301 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 6302 RecordLocation Loc = getLocalBitOffset(Offset); 6303 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 6304 SavedStreamPosition SavedPosition(Cursor); 6305 Cursor.JumpToBit(Loc.Offset); 6306 ReadingKindTracker ReadingKind(Read_Decl, *this); 6307 RecordData Record; 6308 unsigned Code = Cursor.ReadCode(); 6309 unsigned RecCode = Cursor.readRecord(Code, Record); 6310 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 6311 Error("malformed AST file: missing C++ base specifiers"); 6312 return nullptr; 6313 } 6314 6315 unsigned Idx = 0; 6316 unsigned NumBases = Record[Idx++]; 6317 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 6318 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 6319 for (unsigned I = 0; I != NumBases; ++I) 6320 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx); 6321 return Bases; 6322 } 6323 6324 serialization::DeclID 6325 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 6326 if (LocalID < NUM_PREDEF_DECL_IDS) 6327 return LocalID; 6328 6329 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6330 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 6331 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 6332 6333 return LocalID + I->second; 6334 } 6335 6336 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 6337 ModuleFile &M) const { 6338 // Predefined decls aren't from any module. 6339 if (ID < NUM_PREDEF_DECL_IDS) 6340 return false; 6341 6342 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID && 6343 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls; 6344 } 6345 6346 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 6347 if (!D->isFromASTFile()) 6348 return nullptr; 6349 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 6350 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 6351 return I->second; 6352 } 6353 6354 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 6355 if (ID < NUM_PREDEF_DECL_IDS) 6356 return SourceLocation(); 6357 6358 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 6359 6360 if (Index > DeclsLoaded.size()) { 6361 Error("declaration ID out-of-range for AST file"); 6362 return SourceLocation(); 6363 } 6364 6365 if (Decl *D = DeclsLoaded[Index]) 6366 return D->getLocation(); 6367 6368 SourceLocation Loc; 6369 DeclCursorForID(ID, Loc); 6370 return Loc; 6371 } 6372 6373 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) { 6374 switch (ID) { 6375 case PREDEF_DECL_NULL_ID: 6376 return nullptr; 6377 6378 case PREDEF_DECL_TRANSLATION_UNIT_ID: 6379 return Context.getTranslationUnitDecl(); 6380 6381 case PREDEF_DECL_OBJC_ID_ID: 6382 return Context.getObjCIdDecl(); 6383 6384 case PREDEF_DECL_OBJC_SEL_ID: 6385 return Context.getObjCSelDecl(); 6386 6387 case PREDEF_DECL_OBJC_CLASS_ID: 6388 return Context.getObjCClassDecl(); 6389 6390 case PREDEF_DECL_OBJC_PROTOCOL_ID: 6391 return Context.getObjCProtocolDecl(); 6392 6393 case PREDEF_DECL_INT_128_ID: 6394 return Context.getInt128Decl(); 6395 6396 case PREDEF_DECL_UNSIGNED_INT_128_ID: 6397 return Context.getUInt128Decl(); 6398 6399 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 6400 return Context.getObjCInstanceTypeDecl(); 6401 6402 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 6403 return Context.getBuiltinVaListDecl(); 6404 6405 case PREDEF_DECL_VA_LIST_TAG: 6406 return Context.getVaListTagDecl(); 6407 6408 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID: 6409 return Context.getBuiltinMSVaListDecl(); 6410 6411 case PREDEF_DECL_EXTERN_C_CONTEXT_ID: 6412 return Context.getExternCContextDecl(); 6413 6414 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID: 6415 return Context.getMakeIntegerSeqDecl(); 6416 6417 case PREDEF_DECL_CF_CONSTANT_STRING_ID: 6418 return Context.getCFConstantStringDecl(); 6419 6420 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID: 6421 return Context.getCFConstantStringTagDecl(); 6422 } 6423 llvm_unreachable("PredefinedDeclIDs unknown enum value"); 6424 } 6425 6426 Decl *ASTReader::GetExistingDecl(DeclID ID) { 6427 if (ID < NUM_PREDEF_DECL_IDS) { 6428 Decl *D = getPredefinedDecl(Context, (PredefinedDeclIDs)ID); 6429 if (D) { 6430 // Track that we have merged the declaration with ID \p ID into the 6431 // pre-existing predefined declaration \p D. 6432 auto &Merged = KeyDecls[D->getCanonicalDecl()]; 6433 if (Merged.empty()) 6434 Merged.push_back(ID); 6435 } 6436 return D; 6437 } 6438 6439 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 6440 6441 if (Index >= DeclsLoaded.size()) { 6442 assert(0 && "declaration ID out-of-range for AST file"); 6443 Error("declaration ID out-of-range for AST file"); 6444 return nullptr; 6445 } 6446 6447 return DeclsLoaded[Index]; 6448 } 6449 6450 Decl *ASTReader::GetDecl(DeclID ID) { 6451 if (ID < NUM_PREDEF_DECL_IDS) 6452 return GetExistingDecl(ID); 6453 6454 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 6455 6456 if (Index >= DeclsLoaded.size()) { 6457 assert(0 && "declaration ID out-of-range for AST file"); 6458 Error("declaration ID out-of-range for AST file"); 6459 return nullptr; 6460 } 6461 6462 if (!DeclsLoaded[Index]) { 6463 ReadDeclRecord(ID); 6464 if (DeserializationListener) 6465 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 6466 } 6467 6468 return DeclsLoaded[Index]; 6469 } 6470 6471 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 6472 DeclID GlobalID) { 6473 if (GlobalID < NUM_PREDEF_DECL_IDS) 6474 return GlobalID; 6475 6476 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 6477 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 6478 ModuleFile *Owner = I->second; 6479 6480 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 6481 = M.GlobalToLocalDeclIDs.find(Owner); 6482 if (Pos == M.GlobalToLocalDeclIDs.end()) 6483 return 0; 6484 6485 return GlobalID - Owner->BaseDeclID + Pos->second; 6486 } 6487 6488 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 6489 const RecordData &Record, 6490 unsigned &Idx) { 6491 if (Idx >= Record.size()) { 6492 Error("Corrupted AST file"); 6493 return 0; 6494 } 6495 6496 return getGlobalDeclID(F, Record[Idx++]); 6497 } 6498 6499 /// \brief Resolve the offset of a statement into a statement. 6500 /// 6501 /// This operation will read a new statement from the external 6502 /// source each time it is called, and is meant to be used via a 6503 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 6504 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 6505 // Switch case IDs are per Decl. 6506 ClearSwitchCaseIDs(); 6507 6508 // Offset here is a global offset across the entire chain. 6509 RecordLocation Loc = getLocalBitOffset(Offset); 6510 Loc.F->DeclsCursor.JumpToBit(Loc.Offset); 6511 return ReadStmtFromStream(*Loc.F); 6512 } 6513 6514 void ASTReader::FindExternalLexicalDecls( 6515 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 6516 SmallVectorImpl<Decl *> &Decls) { 6517 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {}; 6518 6519 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) { 6520 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries"); 6521 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) { 6522 auto K = (Decl::Kind)+LexicalDecls[I]; 6523 if (!IsKindWeWant(K)) 6524 continue; 6525 6526 auto ID = (serialization::DeclID)+LexicalDecls[I + 1]; 6527 6528 // Don't add predefined declarations to the lexical context more 6529 // than once. 6530 if (ID < NUM_PREDEF_DECL_IDS) { 6531 if (PredefsVisited[ID]) 6532 continue; 6533 6534 PredefsVisited[ID] = true; 6535 } 6536 6537 if (Decl *D = GetLocalDecl(*M, ID)) { 6538 assert(D->getKind() == K && "wrong kind for lexical decl"); 6539 if (!DC->isDeclInLexicalTraversal(D)) 6540 Decls.push_back(D); 6541 } 6542 } 6543 }; 6544 6545 if (isa<TranslationUnitDecl>(DC)) { 6546 for (auto Lexical : TULexicalDecls) 6547 Visit(Lexical.first, Lexical.second); 6548 } else { 6549 auto I = LexicalDecls.find(DC); 6550 if (I != LexicalDecls.end()) 6551 Visit(I->second.first, I->second.second); 6552 } 6553 6554 ++NumLexicalDeclContextsRead; 6555 } 6556 6557 namespace { 6558 6559 class DeclIDComp { 6560 ASTReader &Reader; 6561 ModuleFile &Mod; 6562 6563 public: 6564 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 6565 6566 bool operator()(LocalDeclID L, LocalDeclID R) const { 6567 SourceLocation LHS = getLocation(L); 6568 SourceLocation RHS = getLocation(R); 6569 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6570 } 6571 6572 bool operator()(SourceLocation LHS, LocalDeclID R) const { 6573 SourceLocation RHS = getLocation(R); 6574 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6575 } 6576 6577 bool operator()(LocalDeclID L, SourceLocation RHS) const { 6578 SourceLocation LHS = getLocation(L); 6579 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6580 } 6581 6582 SourceLocation getLocation(LocalDeclID ID) const { 6583 return Reader.getSourceManager().getFileLoc( 6584 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 6585 } 6586 }; 6587 6588 } 6589 6590 void ASTReader::FindFileRegionDecls(FileID File, 6591 unsigned Offset, unsigned Length, 6592 SmallVectorImpl<Decl *> &Decls) { 6593 SourceManager &SM = getSourceManager(); 6594 6595 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 6596 if (I == FileDeclIDs.end()) 6597 return; 6598 6599 FileDeclsInfo &DInfo = I->second; 6600 if (DInfo.Decls.empty()) 6601 return; 6602 6603 SourceLocation 6604 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 6605 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 6606 6607 DeclIDComp DIDComp(*this, *DInfo.Mod); 6608 ArrayRef<serialization::LocalDeclID>::iterator 6609 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 6610 BeginLoc, DIDComp); 6611 if (BeginIt != DInfo.Decls.begin()) 6612 --BeginIt; 6613 6614 // If we are pointing at a top-level decl inside an objc container, we need 6615 // to backtrack until we find it otherwise we will fail to report that the 6616 // region overlaps with an objc container. 6617 while (BeginIt != DInfo.Decls.begin() && 6618 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 6619 ->isTopLevelDeclInObjCContainer()) 6620 --BeginIt; 6621 6622 ArrayRef<serialization::LocalDeclID>::iterator 6623 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 6624 EndLoc, DIDComp); 6625 if (EndIt != DInfo.Decls.end()) 6626 ++EndIt; 6627 6628 for (ArrayRef<serialization::LocalDeclID>::iterator 6629 DIt = BeginIt; DIt != EndIt; ++DIt) 6630 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 6631 } 6632 6633 bool 6634 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 6635 DeclarationName Name) { 6636 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && 6637 "DeclContext has no visible decls in storage"); 6638 if (!Name) 6639 return false; 6640 6641 auto It = Lookups.find(DC); 6642 if (It == Lookups.end()) 6643 return false; 6644 6645 Deserializing LookupResults(this); 6646 6647 // Load the list of declarations. 6648 SmallVector<NamedDecl *, 64> Decls; 6649 for (DeclID ID : It->second.Table.find(Name)) { 6650 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 6651 if (ND->getDeclName() == Name) 6652 Decls.push_back(ND); 6653 } 6654 6655 ++NumVisibleDeclContextsRead; 6656 SetExternalVisibleDeclsForName(DC, Name, Decls); 6657 return !Decls.empty(); 6658 } 6659 6660 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 6661 if (!DC->hasExternalVisibleStorage()) 6662 return; 6663 6664 auto It = Lookups.find(DC); 6665 assert(It != Lookups.end() && 6666 "have external visible storage but no lookup tables"); 6667 6668 DeclsMap Decls; 6669 6670 for (DeclID ID : It->second.Table.findAll()) { 6671 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 6672 Decls[ND->getDeclName()].push_back(ND); 6673 } 6674 6675 ++NumVisibleDeclContextsRead; 6676 6677 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 6678 SetExternalVisibleDeclsForName(DC, I->first, I->second); 6679 } 6680 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 6681 } 6682 6683 const serialization::reader::DeclContextLookupTable * 6684 ASTReader::getLoadedLookupTables(DeclContext *Primary) const { 6685 auto I = Lookups.find(Primary); 6686 return I == Lookups.end() ? nullptr : &I->second; 6687 } 6688 6689 /// \brief Under non-PCH compilation the consumer receives the objc methods 6690 /// before receiving the implementation, and codegen depends on this. 6691 /// We simulate this by deserializing and passing to consumer the methods of the 6692 /// implementation before passing the deserialized implementation decl. 6693 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 6694 ASTConsumer *Consumer) { 6695 assert(ImplD && Consumer); 6696 6697 for (auto *I : ImplD->methods()) 6698 Consumer->HandleInterestingDecl(DeclGroupRef(I)); 6699 6700 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 6701 } 6702 6703 void ASTReader::PassInterestingDeclsToConsumer() { 6704 assert(Consumer); 6705 6706 if (PassingDeclsToConsumer) 6707 return; 6708 6709 // Guard variable to avoid recursively redoing the process of passing 6710 // decls to consumer. 6711 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer, 6712 true); 6713 6714 // Ensure that we've loaded all potentially-interesting declarations 6715 // that need to be eagerly loaded. 6716 for (auto ID : EagerlyDeserializedDecls) 6717 GetDecl(ID); 6718 EagerlyDeserializedDecls.clear(); 6719 6720 while (!InterestingDecls.empty()) { 6721 Decl *D = InterestingDecls.front(); 6722 InterestingDecls.pop_front(); 6723 6724 PassInterestingDeclToConsumer(D); 6725 } 6726 } 6727 6728 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 6729 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 6730 PassObjCImplDeclToConsumer(ImplD, Consumer); 6731 else 6732 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 6733 } 6734 6735 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 6736 this->Consumer = Consumer; 6737 6738 if (Consumer) 6739 PassInterestingDeclsToConsumer(); 6740 6741 if (DeserializationListener) 6742 DeserializationListener->ReaderInitialized(this); 6743 } 6744 6745 void ASTReader::PrintStats() { 6746 std::fprintf(stderr, "*** AST File Statistics:\n"); 6747 6748 unsigned NumTypesLoaded 6749 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 6750 QualType()); 6751 unsigned NumDeclsLoaded 6752 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 6753 (Decl *)nullptr); 6754 unsigned NumIdentifiersLoaded 6755 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 6756 IdentifiersLoaded.end(), 6757 (IdentifierInfo *)nullptr); 6758 unsigned NumMacrosLoaded 6759 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 6760 MacrosLoaded.end(), 6761 (MacroInfo *)nullptr); 6762 unsigned NumSelectorsLoaded 6763 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 6764 SelectorsLoaded.end(), 6765 Selector()); 6766 6767 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 6768 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 6769 NumSLocEntriesRead, TotalNumSLocEntries, 6770 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 6771 if (!TypesLoaded.empty()) 6772 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 6773 NumTypesLoaded, (unsigned)TypesLoaded.size(), 6774 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 6775 if (!DeclsLoaded.empty()) 6776 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 6777 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 6778 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 6779 if (!IdentifiersLoaded.empty()) 6780 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 6781 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 6782 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 6783 if (!MacrosLoaded.empty()) 6784 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 6785 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 6786 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 6787 if (!SelectorsLoaded.empty()) 6788 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 6789 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 6790 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 6791 if (TotalNumStatements) 6792 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 6793 NumStatementsRead, TotalNumStatements, 6794 ((float)NumStatementsRead/TotalNumStatements * 100)); 6795 if (TotalNumMacros) 6796 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 6797 NumMacrosRead, TotalNumMacros, 6798 ((float)NumMacrosRead/TotalNumMacros * 100)); 6799 if (TotalLexicalDeclContexts) 6800 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 6801 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 6802 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 6803 * 100)); 6804 if (TotalVisibleDeclContexts) 6805 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 6806 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 6807 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 6808 * 100)); 6809 if (TotalNumMethodPoolEntries) { 6810 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 6811 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 6812 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 6813 * 100)); 6814 } 6815 if (NumMethodPoolLookups) { 6816 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 6817 NumMethodPoolHits, NumMethodPoolLookups, 6818 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 6819 } 6820 if (NumMethodPoolTableLookups) { 6821 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 6822 NumMethodPoolTableHits, NumMethodPoolTableLookups, 6823 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 6824 * 100.0)); 6825 } 6826 6827 if (NumIdentifierLookupHits) { 6828 std::fprintf(stderr, 6829 " %u / %u identifier table lookups succeeded (%f%%)\n", 6830 NumIdentifierLookupHits, NumIdentifierLookups, 6831 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 6832 } 6833 6834 if (GlobalIndex) { 6835 std::fprintf(stderr, "\n"); 6836 GlobalIndex->printStats(); 6837 } 6838 6839 std::fprintf(stderr, "\n"); 6840 dump(); 6841 std::fprintf(stderr, "\n"); 6842 } 6843 6844 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 6845 static void 6846 dumpModuleIDMap(StringRef Name, 6847 const ContinuousRangeMap<Key, ModuleFile *, 6848 InitialCapacity> &Map) { 6849 if (Map.begin() == Map.end()) 6850 return; 6851 6852 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType; 6853 llvm::errs() << Name << ":\n"; 6854 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 6855 I != IEnd; ++I) { 6856 llvm::errs() << " " << I->first << " -> " << I->second->FileName 6857 << "\n"; 6858 } 6859 } 6860 6861 LLVM_DUMP_METHOD void ASTReader::dump() { 6862 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 6863 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 6864 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 6865 dumpModuleIDMap("Global type map", GlobalTypeMap); 6866 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 6867 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 6868 dumpModuleIDMap("Global macro map", GlobalMacroMap); 6869 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 6870 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 6871 dumpModuleIDMap("Global preprocessed entity map", 6872 GlobalPreprocessedEntityMap); 6873 6874 llvm::errs() << "\n*** PCH/Modules Loaded:"; 6875 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(), 6876 MEnd = ModuleMgr.end(); 6877 M != MEnd; ++M) 6878 (*M)->dump(); 6879 } 6880 6881 /// Return the amount of memory used by memory buffers, breaking down 6882 /// by heap-backed versus mmap'ed memory. 6883 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 6884 for (ModuleConstIterator I = ModuleMgr.begin(), 6885 E = ModuleMgr.end(); I != E; ++I) { 6886 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) { 6887 size_t bytes = buf->getBufferSize(); 6888 switch (buf->getBufferKind()) { 6889 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 6890 sizes.malloc_bytes += bytes; 6891 break; 6892 case llvm::MemoryBuffer::MemoryBuffer_MMap: 6893 sizes.mmap_bytes += bytes; 6894 break; 6895 } 6896 } 6897 } 6898 } 6899 6900 void ASTReader::InitializeSema(Sema &S) { 6901 SemaObj = &S; 6902 S.addExternalSource(this); 6903 6904 // Makes sure any declarations that were deserialized "too early" 6905 // still get added to the identifier's declaration chains. 6906 for (uint64_t ID : PreloadedDeclIDs) { 6907 NamedDecl *D = cast<NamedDecl>(GetDecl(ID)); 6908 pushExternalDeclIntoScope(D, D->getDeclName()); 6909 } 6910 PreloadedDeclIDs.clear(); 6911 6912 // FIXME: What happens if these are changed by a module import? 6913 if (!FPPragmaOptions.empty()) { 6914 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 6915 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0]; 6916 } 6917 6918 // FIXME: What happens if these are changed by a module import? 6919 if (!OpenCLExtensions.empty()) { 6920 unsigned I = 0; 6921 #define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++]; 6922 #include "clang/Basic/OpenCLExtensions.def" 6923 6924 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS"); 6925 } 6926 6927 UpdateSema(); 6928 } 6929 6930 void ASTReader::UpdateSema() { 6931 assert(SemaObj && "no Sema to update"); 6932 6933 // Load the offsets of the declarations that Sema references. 6934 // They will be lazily deserialized when needed. 6935 if (!SemaDeclRefs.empty()) { 6936 assert(SemaDeclRefs.size() % 2 == 0); 6937 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) { 6938 if (!SemaObj->StdNamespace) 6939 SemaObj->StdNamespace = SemaDeclRefs[I]; 6940 if (!SemaObj->StdBadAlloc) 6941 SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 6942 } 6943 SemaDeclRefs.clear(); 6944 } 6945 6946 // Update the state of pragmas. Use the same API as if we had encountered the 6947 // pragma in the source. 6948 if(OptimizeOffPragmaLocation.isValid()) 6949 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation); 6950 if (PragmaMSStructState != -1) 6951 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState); 6952 if (PointersToMembersPragmaLocation.isValid()) { 6953 SemaObj->ActOnPragmaMSPointersToMembers( 6954 (LangOptions::PragmaMSPointersToMembersKind) 6955 PragmaMSPointersToMembersState, 6956 PointersToMembersPragmaLocation); 6957 } 6958 } 6959 6960 IdentifierInfo *ASTReader::get(StringRef Name) { 6961 // Note that we are loading an identifier. 6962 Deserializing AnIdentifier(this); 6963 6964 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 6965 NumIdentifierLookups, 6966 NumIdentifierLookupHits); 6967 6968 // We don't need to do identifier table lookups in C++ modules (we preload 6969 // all interesting declarations, and don't need to use the scope for name 6970 // lookups). Perform the lookup in PCH files, though, since we don't build 6971 // a complete initial identifier table if we're carrying on from a PCH. 6972 if (Context.getLangOpts().CPlusPlus) { 6973 for (auto F : ModuleMgr.pch_modules()) 6974 if (Visitor(*F)) 6975 break; 6976 } else { 6977 // If there is a global index, look there first to determine which modules 6978 // provably do not have any results for this identifier. 6979 GlobalModuleIndex::HitSet Hits; 6980 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 6981 if (!loadGlobalIndex()) { 6982 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 6983 HitsPtr = &Hits; 6984 } 6985 } 6986 6987 ModuleMgr.visit(Visitor, HitsPtr); 6988 } 6989 6990 IdentifierInfo *II = Visitor.getIdentifierInfo(); 6991 markIdentifierUpToDate(II); 6992 return II; 6993 } 6994 6995 namespace clang { 6996 /// \brief An identifier-lookup iterator that enumerates all of the 6997 /// identifiers stored within a set of AST files. 6998 class ASTIdentifierIterator : public IdentifierIterator { 6999 /// \brief The AST reader whose identifiers are being enumerated. 7000 const ASTReader &Reader; 7001 7002 /// \brief The current index into the chain of AST files stored in 7003 /// the AST reader. 7004 unsigned Index; 7005 7006 /// \brief The current position within the identifier lookup table 7007 /// of the current AST file. 7008 ASTIdentifierLookupTable::key_iterator Current; 7009 7010 /// \brief The end position within the identifier lookup table of 7011 /// the current AST file. 7012 ASTIdentifierLookupTable::key_iterator End; 7013 7014 public: 7015 explicit ASTIdentifierIterator(const ASTReader &Reader); 7016 7017 StringRef Next() override; 7018 }; 7019 } 7020 7021 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader) 7022 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) { 7023 ASTIdentifierLookupTable *IdTable 7024 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable; 7025 Current = IdTable->key_begin(); 7026 End = IdTable->key_end(); 7027 } 7028 7029 StringRef ASTIdentifierIterator::Next() { 7030 while (Current == End) { 7031 // If we have exhausted all of our AST files, we're done. 7032 if (Index == 0) 7033 return StringRef(); 7034 7035 --Index; 7036 ASTIdentifierLookupTable *IdTable 7037 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index]. 7038 IdentifierLookupTable; 7039 Current = IdTable->key_begin(); 7040 End = IdTable->key_end(); 7041 } 7042 7043 // We have any identifiers remaining in the current AST file; return 7044 // the next one. 7045 StringRef Result = *Current; 7046 ++Current; 7047 return Result; 7048 } 7049 7050 IdentifierIterator *ASTReader::getIdentifiers() { 7051 if (!loadGlobalIndex()) 7052 return GlobalIndex->createIdentifierIterator(); 7053 7054 return new ASTIdentifierIterator(*this); 7055 } 7056 7057 namespace clang { namespace serialization { 7058 class ReadMethodPoolVisitor { 7059 ASTReader &Reader; 7060 Selector Sel; 7061 unsigned PriorGeneration; 7062 unsigned InstanceBits; 7063 unsigned FactoryBits; 7064 bool InstanceHasMoreThanOneDecl; 7065 bool FactoryHasMoreThanOneDecl; 7066 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 7067 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 7068 7069 public: 7070 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 7071 unsigned PriorGeneration) 7072 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration), 7073 InstanceBits(0), FactoryBits(0), InstanceHasMoreThanOneDecl(false), 7074 FactoryHasMoreThanOneDecl(false) {} 7075 7076 bool operator()(ModuleFile &M) { 7077 if (!M.SelectorLookupTable) 7078 return false; 7079 7080 // If we've already searched this module file, skip it now. 7081 if (M.Generation <= PriorGeneration) 7082 return true; 7083 7084 ++Reader.NumMethodPoolTableLookups; 7085 ASTSelectorLookupTable *PoolTable 7086 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 7087 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel); 7088 if (Pos == PoolTable->end()) 7089 return false; 7090 7091 ++Reader.NumMethodPoolTableHits; 7092 ++Reader.NumSelectorsRead; 7093 // FIXME: Not quite happy with the statistics here. We probably should 7094 // disable this tracking when called via LoadSelector. 7095 // Also, should entries without methods count as misses? 7096 ++Reader.NumMethodPoolEntriesRead; 7097 ASTSelectorLookupTrait::data_type Data = *Pos; 7098 if (Reader.DeserializationListener) 7099 Reader.DeserializationListener->SelectorRead(Data.ID, Sel); 7100 7101 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 7102 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 7103 InstanceBits = Data.InstanceBits; 7104 FactoryBits = Data.FactoryBits; 7105 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl; 7106 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl; 7107 return true; 7108 } 7109 7110 /// \brief Retrieve the instance methods found by this visitor. 7111 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 7112 return InstanceMethods; 7113 } 7114 7115 /// \brief Retrieve the instance methods found by this visitor. 7116 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 7117 return FactoryMethods; 7118 } 7119 7120 unsigned getInstanceBits() const { return InstanceBits; } 7121 unsigned getFactoryBits() const { return FactoryBits; } 7122 bool instanceHasMoreThanOneDecl() const { 7123 return InstanceHasMoreThanOneDecl; 7124 } 7125 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; } 7126 }; 7127 } } // end namespace clang::serialization 7128 7129 /// \brief Add the given set of methods to the method list. 7130 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 7131 ObjCMethodList &List) { 7132 for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 7133 S.addMethodToGlobalList(&List, Methods[I]); 7134 } 7135 } 7136 7137 void ASTReader::ReadMethodPool(Selector Sel) { 7138 // Get the selector generation and update it to the current generation. 7139 unsigned &Generation = SelectorGeneration[Sel]; 7140 unsigned PriorGeneration = Generation; 7141 Generation = getGeneration(); 7142 7143 // Search for methods defined with this selector. 7144 ++NumMethodPoolLookups; 7145 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 7146 ModuleMgr.visit(Visitor); 7147 7148 if (Visitor.getInstanceMethods().empty() && 7149 Visitor.getFactoryMethods().empty()) 7150 return; 7151 7152 ++NumMethodPoolHits; 7153 7154 if (!getSema()) 7155 return; 7156 7157 Sema &S = *getSema(); 7158 Sema::GlobalMethodPool::iterator Pos 7159 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first; 7160 7161 Pos->second.first.setBits(Visitor.getInstanceBits()); 7162 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl()); 7163 Pos->second.second.setBits(Visitor.getFactoryBits()); 7164 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl()); 7165 7166 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since 7167 // when building a module we keep every method individually and may need to 7168 // update hasMoreThanOneDecl as we add the methods. 7169 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 7170 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 7171 } 7172 7173 void ASTReader::ReadKnownNamespaces( 7174 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 7175 Namespaces.clear(); 7176 7177 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 7178 if (NamespaceDecl *Namespace 7179 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 7180 Namespaces.push_back(Namespace); 7181 } 7182 } 7183 7184 void ASTReader::ReadUndefinedButUsed( 7185 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) { 7186 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 7187 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 7188 SourceLocation Loc = 7189 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 7190 Undefined.insert(std::make_pair(D, Loc)); 7191 } 7192 } 7193 7194 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector< 7195 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> & 7196 Exprs) { 7197 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) { 7198 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++])); 7199 uint64_t Count = DelayedDeleteExprs[Idx++]; 7200 for (uint64_t C = 0; C < Count; ++C) { 7201 SourceLocation DeleteLoc = 7202 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]); 7203 const bool IsArrayForm = DelayedDeleteExprs[Idx++]; 7204 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm)); 7205 } 7206 } 7207 } 7208 7209 void ASTReader::ReadTentativeDefinitions( 7210 SmallVectorImpl<VarDecl *> &TentativeDefs) { 7211 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 7212 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 7213 if (Var) 7214 TentativeDefs.push_back(Var); 7215 } 7216 TentativeDefinitions.clear(); 7217 } 7218 7219 void ASTReader::ReadUnusedFileScopedDecls( 7220 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 7221 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 7222 DeclaratorDecl *D 7223 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 7224 if (D) 7225 Decls.push_back(D); 7226 } 7227 UnusedFileScopedDecls.clear(); 7228 } 7229 7230 void ASTReader::ReadDelegatingConstructors( 7231 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 7232 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 7233 CXXConstructorDecl *D 7234 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 7235 if (D) 7236 Decls.push_back(D); 7237 } 7238 DelegatingCtorDecls.clear(); 7239 } 7240 7241 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 7242 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 7243 TypedefNameDecl *D 7244 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 7245 if (D) 7246 Decls.push_back(D); 7247 } 7248 ExtVectorDecls.clear(); 7249 } 7250 7251 void ASTReader::ReadUnusedLocalTypedefNameCandidates( 7252 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 7253 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N; 7254 ++I) { 7255 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>( 7256 GetDecl(UnusedLocalTypedefNameCandidates[I])); 7257 if (D) 7258 Decls.insert(D); 7259 } 7260 UnusedLocalTypedefNameCandidates.clear(); 7261 } 7262 7263 void ASTReader::ReadReferencedSelectors( 7264 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) { 7265 if (ReferencedSelectorsData.empty()) 7266 return; 7267 7268 // If there are @selector references added them to its pool. This is for 7269 // implementation of -Wselector. 7270 unsigned int DataSize = ReferencedSelectorsData.size()-1; 7271 unsigned I = 0; 7272 while (I < DataSize) { 7273 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 7274 SourceLocation SelLoc 7275 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 7276 Sels.push_back(std::make_pair(Sel, SelLoc)); 7277 } 7278 ReferencedSelectorsData.clear(); 7279 } 7280 7281 void ASTReader::ReadWeakUndeclaredIdentifiers( 7282 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) { 7283 if (WeakUndeclaredIdentifiers.empty()) 7284 return; 7285 7286 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 7287 IdentifierInfo *WeakId 7288 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 7289 IdentifierInfo *AliasId 7290 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 7291 SourceLocation Loc 7292 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 7293 bool Used = WeakUndeclaredIdentifiers[I++]; 7294 WeakInfo WI(AliasId, Loc); 7295 WI.setUsed(Used); 7296 WeakIDs.push_back(std::make_pair(WeakId, WI)); 7297 } 7298 WeakUndeclaredIdentifiers.clear(); 7299 } 7300 7301 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 7302 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 7303 ExternalVTableUse VT; 7304 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 7305 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 7306 VT.DefinitionRequired = VTableUses[Idx++]; 7307 VTables.push_back(VT); 7308 } 7309 7310 VTableUses.clear(); 7311 } 7312 7313 void ASTReader::ReadPendingInstantiations( 7314 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) { 7315 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 7316 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 7317 SourceLocation Loc 7318 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 7319 7320 Pending.push_back(std::make_pair(D, Loc)); 7321 } 7322 PendingInstantiations.clear(); 7323 } 7324 7325 void ASTReader::ReadLateParsedTemplates( 7326 llvm::MapVector<const FunctionDecl *, LateParsedTemplate *> &LPTMap) { 7327 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N; 7328 /* In loop */) { 7329 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++])); 7330 7331 LateParsedTemplate *LT = new LateParsedTemplate; 7332 LT->D = GetDecl(LateParsedTemplates[Idx++]); 7333 7334 ModuleFile *F = getOwningModuleFile(LT->D); 7335 assert(F && "No module"); 7336 7337 unsigned TokN = LateParsedTemplates[Idx++]; 7338 LT->Toks.reserve(TokN); 7339 for (unsigned T = 0; T < TokN; ++T) 7340 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx)); 7341 7342 LPTMap.insert(std::make_pair(FD, LT)); 7343 } 7344 7345 LateParsedTemplates.clear(); 7346 } 7347 7348 void ASTReader::LoadSelector(Selector Sel) { 7349 // It would be complicated to avoid reading the methods anyway. So don't. 7350 ReadMethodPool(Sel); 7351 } 7352 7353 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 7354 assert(ID && "Non-zero identifier ID required"); 7355 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 7356 IdentifiersLoaded[ID - 1] = II; 7357 if (DeserializationListener) 7358 DeserializationListener->IdentifierRead(ID, II); 7359 } 7360 7361 /// \brief Set the globally-visible declarations associated with the given 7362 /// identifier. 7363 /// 7364 /// If the AST reader is currently in a state where the given declaration IDs 7365 /// cannot safely be resolved, they are queued until it is safe to resolve 7366 /// them. 7367 /// 7368 /// \param II an IdentifierInfo that refers to one or more globally-visible 7369 /// declarations. 7370 /// 7371 /// \param DeclIDs the set of declaration IDs with the name @p II that are 7372 /// visible at global scope. 7373 /// 7374 /// \param Decls if non-null, this vector will be populated with the set of 7375 /// deserialized declarations. These declarations will not be pushed into 7376 /// scope. 7377 void 7378 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 7379 const SmallVectorImpl<uint32_t> &DeclIDs, 7380 SmallVectorImpl<Decl *> *Decls) { 7381 if (NumCurrentElementsDeserializing && !Decls) { 7382 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 7383 return; 7384 } 7385 7386 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 7387 if (!SemaObj) { 7388 // Queue this declaration so that it will be added to the 7389 // translation unit scope and identifier's declaration chain 7390 // once a Sema object is known. 7391 PreloadedDeclIDs.push_back(DeclIDs[I]); 7392 continue; 7393 } 7394 7395 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 7396 7397 // If we're simply supposed to record the declarations, do so now. 7398 if (Decls) { 7399 Decls->push_back(D); 7400 continue; 7401 } 7402 7403 // Introduce this declaration into the translation-unit scope 7404 // and add it to the declaration chain for this identifier, so 7405 // that (unqualified) name lookup will find it. 7406 pushExternalDeclIntoScope(D, II); 7407 } 7408 } 7409 7410 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 7411 if (ID == 0) 7412 return nullptr; 7413 7414 if (IdentifiersLoaded.empty()) { 7415 Error("no identifier table in AST file"); 7416 return nullptr; 7417 } 7418 7419 ID -= 1; 7420 if (!IdentifiersLoaded[ID]) { 7421 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 7422 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 7423 ModuleFile *M = I->second; 7424 unsigned Index = ID - M->BaseIdentifierID; 7425 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index]; 7426 7427 // All of the strings in the AST file are preceded by a 16-bit length. 7428 // Extract that 16-bit length to avoid having to execute strlen(). 7429 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as 7430 // unsigned integers. This is important to avoid integer overflow when 7431 // we cast them to 'unsigned'. 7432 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2; 7433 unsigned StrLen = (((unsigned) StrLenPtr[0]) 7434 | (((unsigned) StrLenPtr[1]) << 8)) - 1; 7435 auto &II = PP.getIdentifierTable().get(StringRef(Str, StrLen)); 7436 IdentifiersLoaded[ID] = &II; 7437 markIdentifierFromAST(*this, II); 7438 if (DeserializationListener) 7439 DeserializationListener->IdentifierRead(ID + 1, &II); 7440 } 7441 7442 return IdentifiersLoaded[ID]; 7443 } 7444 7445 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 7446 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 7447 } 7448 7449 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 7450 if (LocalID < NUM_PREDEF_IDENT_IDS) 7451 return LocalID; 7452 7453 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7454 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 7455 assert(I != M.IdentifierRemap.end() 7456 && "Invalid index into identifier index remap"); 7457 7458 return LocalID + I->second; 7459 } 7460 7461 MacroInfo *ASTReader::getMacro(MacroID ID) { 7462 if (ID == 0) 7463 return nullptr; 7464 7465 if (MacrosLoaded.empty()) { 7466 Error("no macro table in AST file"); 7467 return nullptr; 7468 } 7469 7470 ID -= NUM_PREDEF_MACRO_IDS; 7471 if (!MacrosLoaded[ID]) { 7472 GlobalMacroMapType::iterator I 7473 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 7474 assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 7475 ModuleFile *M = I->second; 7476 unsigned Index = ID - M->BaseMacroID; 7477 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]); 7478 7479 if (DeserializationListener) 7480 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 7481 MacrosLoaded[ID]); 7482 } 7483 7484 return MacrosLoaded[ID]; 7485 } 7486 7487 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 7488 if (LocalID < NUM_PREDEF_MACRO_IDS) 7489 return LocalID; 7490 7491 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7492 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 7493 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 7494 7495 return LocalID + I->second; 7496 } 7497 7498 serialization::SubmoduleID 7499 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 7500 if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 7501 return LocalID; 7502 7503 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7504 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 7505 assert(I != M.SubmoduleRemap.end() 7506 && "Invalid index into submodule index remap"); 7507 7508 return LocalID + I->second; 7509 } 7510 7511 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) { 7512 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 7513 assert(GlobalID == 0 && "Unhandled global submodule ID"); 7514 return nullptr; 7515 } 7516 7517 if (GlobalID > SubmodulesLoaded.size()) { 7518 Error("submodule ID out of range in AST file"); 7519 return nullptr; 7520 } 7521 7522 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 7523 } 7524 7525 Module *ASTReader::getModule(unsigned ID) { 7526 return getSubmodule(ID); 7527 } 7528 7529 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) { 7530 if (ID & 1) { 7531 // It's a module, look it up by submodule ID. 7532 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1)); 7533 return I == GlobalSubmoduleMap.end() ? nullptr : I->second; 7534 } else { 7535 // It's a prefix (preamble, PCH, ...). Look it up by index. 7536 unsigned IndexFromEnd = ID >> 1; 7537 assert(IndexFromEnd && "got reference to unknown module file"); 7538 return getModuleManager().pch_modules().end()[-IndexFromEnd]; 7539 } 7540 } 7541 7542 unsigned ASTReader::getModuleFileID(ModuleFile *F) { 7543 if (!F) 7544 return 1; 7545 7546 // For a file representing a module, use the submodule ID of the top-level 7547 // module as the file ID. For any other kind of file, the number of such 7548 // files loaded beforehand will be the same on reload. 7549 // FIXME: Is this true even if we have an explicit module file and a PCH? 7550 if (F->isModule()) 7551 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1; 7552 7553 auto PCHModules = getModuleManager().pch_modules(); 7554 auto I = std::find(PCHModules.begin(), PCHModules.end(), F); 7555 assert(I != PCHModules.end() && "emitting reference to unknown file"); 7556 return (I - PCHModules.end()) << 1; 7557 } 7558 7559 llvm::Optional<ExternalASTSource::ASTSourceDescriptor> 7560 ASTReader::getSourceDescriptor(unsigned ID) { 7561 if (const Module *M = getSubmodule(ID)) 7562 return ExternalASTSource::ASTSourceDescriptor(*M); 7563 7564 // If there is only a single PCH, return it instead. 7565 // Chained PCH are not suported. 7566 if (ModuleMgr.size() == 1) { 7567 ModuleFile &MF = ModuleMgr.getPrimaryModule(); 7568 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName); 7569 return ASTReader::ASTSourceDescriptor(ModuleName, MF.OriginalDir, 7570 MF.FileName, MF.Signature); 7571 } 7572 return None; 7573 } 7574 7575 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 7576 return DecodeSelector(getGlobalSelectorID(M, LocalID)); 7577 } 7578 7579 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { 7580 if (ID == 0) 7581 return Selector(); 7582 7583 if (ID > SelectorsLoaded.size()) { 7584 Error("selector ID out of range in AST file"); 7585 return Selector(); 7586 } 7587 7588 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) { 7589 // Load this selector from the selector table. 7590 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 7591 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 7592 ModuleFile &M = *I->second; 7593 ASTSelectorLookupTrait Trait(*this, M); 7594 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 7595 SelectorsLoaded[ID - 1] = 7596 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 7597 if (DeserializationListener) 7598 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 7599 } 7600 7601 return SelectorsLoaded[ID - 1]; 7602 } 7603 7604 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 7605 return DecodeSelector(ID); 7606 } 7607 7608 uint32_t ASTReader::GetNumExternalSelectors() { 7609 // ID 0 (the null selector) is considered an external selector. 7610 return getTotalNumSelectors() + 1; 7611 } 7612 7613 serialization::SelectorID 7614 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 7615 if (LocalID < NUM_PREDEF_SELECTOR_IDS) 7616 return LocalID; 7617 7618 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7619 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 7620 assert(I != M.SelectorRemap.end() 7621 && "Invalid index into selector index remap"); 7622 7623 return LocalID + I->second; 7624 } 7625 7626 DeclarationName 7627 ASTReader::ReadDeclarationName(ModuleFile &F, 7628 const RecordData &Record, unsigned &Idx) { 7629 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++]; 7630 switch (Kind) { 7631 case DeclarationName::Identifier: 7632 return DeclarationName(GetIdentifierInfo(F, Record, Idx)); 7633 7634 case DeclarationName::ObjCZeroArgSelector: 7635 case DeclarationName::ObjCOneArgSelector: 7636 case DeclarationName::ObjCMultiArgSelector: 7637 return DeclarationName(ReadSelector(F, Record, Idx)); 7638 7639 case DeclarationName::CXXConstructorName: 7640 return Context.DeclarationNames.getCXXConstructorName( 7641 Context.getCanonicalType(readType(F, Record, Idx))); 7642 7643 case DeclarationName::CXXDestructorName: 7644 return Context.DeclarationNames.getCXXDestructorName( 7645 Context.getCanonicalType(readType(F, Record, Idx))); 7646 7647 case DeclarationName::CXXConversionFunctionName: 7648 return Context.DeclarationNames.getCXXConversionFunctionName( 7649 Context.getCanonicalType(readType(F, Record, Idx))); 7650 7651 case DeclarationName::CXXOperatorName: 7652 return Context.DeclarationNames.getCXXOperatorName( 7653 (OverloadedOperatorKind)Record[Idx++]); 7654 7655 case DeclarationName::CXXLiteralOperatorName: 7656 return Context.DeclarationNames.getCXXLiteralOperatorName( 7657 GetIdentifierInfo(F, Record, Idx)); 7658 7659 case DeclarationName::CXXUsingDirective: 7660 return DeclarationName::getUsingDirectiveName(); 7661 } 7662 7663 llvm_unreachable("Invalid NameKind!"); 7664 } 7665 7666 void ASTReader::ReadDeclarationNameLoc(ModuleFile &F, 7667 DeclarationNameLoc &DNLoc, 7668 DeclarationName Name, 7669 const RecordData &Record, unsigned &Idx) { 7670 switch (Name.getNameKind()) { 7671 case DeclarationName::CXXConstructorName: 7672 case DeclarationName::CXXDestructorName: 7673 case DeclarationName::CXXConversionFunctionName: 7674 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx); 7675 break; 7676 7677 case DeclarationName::CXXOperatorName: 7678 DNLoc.CXXOperatorName.BeginOpNameLoc 7679 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 7680 DNLoc.CXXOperatorName.EndOpNameLoc 7681 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 7682 break; 7683 7684 case DeclarationName::CXXLiteralOperatorName: 7685 DNLoc.CXXLiteralOperatorName.OpNameLoc 7686 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 7687 break; 7688 7689 case DeclarationName::Identifier: 7690 case DeclarationName::ObjCZeroArgSelector: 7691 case DeclarationName::ObjCOneArgSelector: 7692 case DeclarationName::ObjCMultiArgSelector: 7693 case DeclarationName::CXXUsingDirective: 7694 break; 7695 } 7696 } 7697 7698 void ASTReader::ReadDeclarationNameInfo(ModuleFile &F, 7699 DeclarationNameInfo &NameInfo, 7700 const RecordData &Record, unsigned &Idx) { 7701 NameInfo.setName(ReadDeclarationName(F, Record, Idx)); 7702 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx)); 7703 DeclarationNameLoc DNLoc; 7704 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx); 7705 NameInfo.setInfo(DNLoc); 7706 } 7707 7708 void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info, 7709 const RecordData &Record, unsigned &Idx) { 7710 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx); 7711 unsigned NumTPLists = Record[Idx++]; 7712 Info.NumTemplParamLists = NumTPLists; 7713 if (NumTPLists) { 7714 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists]; 7715 for (unsigned i=0; i != NumTPLists; ++i) 7716 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx); 7717 } 7718 } 7719 7720 TemplateName 7721 ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record, 7722 unsigned &Idx) { 7723 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++]; 7724 switch (Kind) { 7725 case TemplateName::Template: 7726 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx)); 7727 7728 case TemplateName::OverloadedTemplate: { 7729 unsigned size = Record[Idx++]; 7730 UnresolvedSet<8> Decls; 7731 while (size--) 7732 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx)); 7733 7734 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end()); 7735 } 7736 7737 case TemplateName::QualifiedTemplate: { 7738 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 7739 bool hasTemplKeyword = Record[Idx++]; 7740 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx); 7741 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template); 7742 } 7743 7744 case TemplateName::DependentTemplate: { 7745 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 7746 if (Record[Idx++]) // isIdentifier 7747 return Context.getDependentTemplateName(NNS, 7748 GetIdentifierInfo(F, Record, 7749 Idx)); 7750 return Context.getDependentTemplateName(NNS, 7751 (OverloadedOperatorKind)Record[Idx++]); 7752 } 7753 7754 case TemplateName::SubstTemplateTemplateParm: { 7755 TemplateTemplateParmDecl *param 7756 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 7757 if (!param) return TemplateName(); 7758 TemplateName replacement = ReadTemplateName(F, Record, Idx); 7759 return Context.getSubstTemplateTemplateParm(param, replacement); 7760 } 7761 7762 case TemplateName::SubstTemplateTemplateParmPack: { 7763 TemplateTemplateParmDecl *Param 7764 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 7765 if (!Param) 7766 return TemplateName(); 7767 7768 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx); 7769 if (ArgPack.getKind() != TemplateArgument::Pack) 7770 return TemplateName(); 7771 7772 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 7773 } 7774 } 7775 7776 llvm_unreachable("Unhandled template name kind!"); 7777 } 7778 7779 TemplateArgument ASTReader::ReadTemplateArgument(ModuleFile &F, 7780 const RecordData &Record, 7781 unsigned &Idx, 7782 bool Canonicalize) { 7783 if (Canonicalize) { 7784 // The caller wants a canonical template argument. Sometimes the AST only 7785 // wants template arguments in canonical form (particularly as the template 7786 // argument lists of template specializations) so ensure we preserve that 7787 // canonical form across serialization. 7788 TemplateArgument Arg = ReadTemplateArgument(F, Record, Idx, false); 7789 return Context.getCanonicalTemplateArgument(Arg); 7790 } 7791 7792 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++]; 7793 switch (Kind) { 7794 case TemplateArgument::Null: 7795 return TemplateArgument(); 7796 case TemplateArgument::Type: 7797 return TemplateArgument(readType(F, Record, Idx)); 7798 case TemplateArgument::Declaration: { 7799 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx); 7800 return TemplateArgument(D, readType(F, Record, Idx)); 7801 } 7802 case TemplateArgument::NullPtr: 7803 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true); 7804 case TemplateArgument::Integral: { 7805 llvm::APSInt Value = ReadAPSInt(Record, Idx); 7806 QualType T = readType(F, Record, Idx); 7807 return TemplateArgument(Context, Value, T); 7808 } 7809 case TemplateArgument::Template: 7810 return TemplateArgument(ReadTemplateName(F, Record, Idx)); 7811 case TemplateArgument::TemplateExpansion: { 7812 TemplateName Name = ReadTemplateName(F, Record, Idx); 7813 Optional<unsigned> NumTemplateExpansions; 7814 if (unsigned NumExpansions = Record[Idx++]) 7815 NumTemplateExpansions = NumExpansions - 1; 7816 return TemplateArgument(Name, NumTemplateExpansions); 7817 } 7818 case TemplateArgument::Expression: 7819 return TemplateArgument(ReadExpr(F)); 7820 case TemplateArgument::Pack: { 7821 unsigned NumArgs = Record[Idx++]; 7822 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs]; 7823 for (unsigned I = 0; I != NumArgs; ++I) 7824 Args[I] = ReadTemplateArgument(F, Record, Idx); 7825 return TemplateArgument(llvm::makeArrayRef(Args, NumArgs)); 7826 } 7827 } 7828 7829 llvm_unreachable("Unhandled template argument kind!"); 7830 } 7831 7832 TemplateParameterList * 7833 ASTReader::ReadTemplateParameterList(ModuleFile &F, 7834 const RecordData &Record, unsigned &Idx) { 7835 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx); 7836 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx); 7837 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx); 7838 7839 unsigned NumParams = Record[Idx++]; 7840 SmallVector<NamedDecl *, 16> Params; 7841 Params.reserve(NumParams); 7842 while (NumParams--) 7843 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx)); 7844 7845 TemplateParameterList* TemplateParams = 7846 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc, 7847 Params, RAngleLoc); 7848 return TemplateParams; 7849 } 7850 7851 void 7852 ASTReader:: 7853 ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs, 7854 ModuleFile &F, const RecordData &Record, 7855 unsigned &Idx, bool Canonicalize) { 7856 unsigned NumTemplateArgs = Record[Idx++]; 7857 TemplArgs.reserve(NumTemplateArgs); 7858 while (NumTemplateArgs--) 7859 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx, Canonicalize)); 7860 } 7861 7862 /// \brief Read a UnresolvedSet structure. 7863 void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set, 7864 const RecordData &Record, unsigned &Idx) { 7865 unsigned NumDecls = Record[Idx++]; 7866 Set.reserve(Context, NumDecls); 7867 while (NumDecls--) { 7868 DeclID ID = ReadDeclID(F, Record, Idx); 7869 AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 7870 Set.addLazyDecl(Context, ID, AS); 7871 } 7872 } 7873 7874 CXXBaseSpecifier 7875 ASTReader::ReadCXXBaseSpecifier(ModuleFile &F, 7876 const RecordData &Record, unsigned &Idx) { 7877 bool isVirtual = static_cast<bool>(Record[Idx++]); 7878 bool isBaseOfClass = static_cast<bool>(Record[Idx++]); 7879 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]); 7880 bool inheritConstructors = static_cast<bool>(Record[Idx++]); 7881 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx); 7882 SourceRange Range = ReadSourceRange(F, Record, Idx); 7883 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx); 7884 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 7885 EllipsisLoc); 7886 Result.setInheritConstructors(inheritConstructors); 7887 return Result; 7888 } 7889 7890 CXXCtorInitializer ** 7891 ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record, 7892 unsigned &Idx) { 7893 unsigned NumInitializers = Record[Idx++]; 7894 assert(NumInitializers && "wrote ctor initializers but have no inits"); 7895 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers]; 7896 for (unsigned i = 0; i != NumInitializers; ++i) { 7897 TypeSourceInfo *TInfo = nullptr; 7898 bool IsBaseVirtual = false; 7899 FieldDecl *Member = nullptr; 7900 IndirectFieldDecl *IndirectMember = nullptr; 7901 7902 CtorInitializerType Type = (CtorInitializerType)Record[Idx++]; 7903 switch (Type) { 7904 case CTOR_INITIALIZER_BASE: 7905 TInfo = GetTypeSourceInfo(F, Record, Idx); 7906 IsBaseVirtual = Record[Idx++]; 7907 break; 7908 7909 case CTOR_INITIALIZER_DELEGATING: 7910 TInfo = GetTypeSourceInfo(F, Record, Idx); 7911 break; 7912 7913 case CTOR_INITIALIZER_MEMBER: 7914 Member = ReadDeclAs<FieldDecl>(F, Record, Idx); 7915 break; 7916 7917 case CTOR_INITIALIZER_INDIRECT_MEMBER: 7918 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx); 7919 break; 7920 } 7921 7922 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx); 7923 Expr *Init = ReadExpr(F); 7924 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx); 7925 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx); 7926 bool IsWritten = Record[Idx++]; 7927 unsigned SourceOrderOrNumArrayIndices; 7928 SmallVector<VarDecl *, 8> Indices; 7929 if (IsWritten) { 7930 SourceOrderOrNumArrayIndices = Record[Idx++]; 7931 } else { 7932 SourceOrderOrNumArrayIndices = Record[Idx++]; 7933 Indices.reserve(SourceOrderOrNumArrayIndices); 7934 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i) 7935 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx)); 7936 } 7937 7938 CXXCtorInitializer *BOMInit; 7939 if (Type == CTOR_INITIALIZER_BASE) { 7940 BOMInit = new (Context) 7941 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init, 7942 RParenLoc, MemberOrEllipsisLoc); 7943 } else if (Type == CTOR_INITIALIZER_DELEGATING) { 7944 BOMInit = new (Context) 7945 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc); 7946 } else if (IsWritten) { 7947 if (Member) 7948 BOMInit = new (Context) CXXCtorInitializer( 7949 Context, Member, MemberOrEllipsisLoc, LParenLoc, Init, RParenLoc); 7950 else 7951 BOMInit = new (Context) 7952 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc, 7953 LParenLoc, Init, RParenLoc); 7954 } else { 7955 if (IndirectMember) { 7956 assert(Indices.empty() && "Indirect field improperly initialized"); 7957 BOMInit = new (Context) 7958 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc, 7959 LParenLoc, Init, RParenLoc); 7960 } else { 7961 BOMInit = CXXCtorInitializer::Create( 7962 Context, Member, MemberOrEllipsisLoc, LParenLoc, Init, RParenLoc, 7963 Indices.data(), Indices.size()); 7964 } 7965 } 7966 7967 if (IsWritten) 7968 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices); 7969 CtorInitializers[i] = BOMInit; 7970 } 7971 7972 return CtorInitializers; 7973 } 7974 7975 NestedNameSpecifier * 7976 ASTReader::ReadNestedNameSpecifier(ModuleFile &F, 7977 const RecordData &Record, unsigned &Idx) { 7978 unsigned N = Record[Idx++]; 7979 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr; 7980 for (unsigned I = 0; I != N; ++I) { 7981 NestedNameSpecifier::SpecifierKind Kind 7982 = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 7983 switch (Kind) { 7984 case NestedNameSpecifier::Identifier: { 7985 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 7986 NNS = NestedNameSpecifier::Create(Context, Prev, II); 7987 break; 7988 } 7989 7990 case NestedNameSpecifier::Namespace: { 7991 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 7992 NNS = NestedNameSpecifier::Create(Context, Prev, NS); 7993 break; 7994 } 7995 7996 case NestedNameSpecifier::NamespaceAlias: { 7997 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 7998 NNS = NestedNameSpecifier::Create(Context, Prev, Alias); 7999 break; 8000 } 8001 8002 case NestedNameSpecifier::TypeSpec: 8003 case NestedNameSpecifier::TypeSpecWithTemplate: { 8004 const Type *T = readType(F, Record, Idx).getTypePtrOrNull(); 8005 if (!T) 8006 return nullptr; 8007 8008 bool Template = Record[Idx++]; 8009 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T); 8010 break; 8011 } 8012 8013 case NestedNameSpecifier::Global: { 8014 NNS = NestedNameSpecifier::GlobalSpecifier(Context); 8015 // No associated value, and there can't be a prefix. 8016 break; 8017 } 8018 8019 case NestedNameSpecifier::Super: { 8020 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx); 8021 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD); 8022 break; 8023 } 8024 } 8025 Prev = NNS; 8026 } 8027 return NNS; 8028 } 8029 8030 NestedNameSpecifierLoc 8031 ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record, 8032 unsigned &Idx) { 8033 unsigned N = Record[Idx++]; 8034 NestedNameSpecifierLocBuilder Builder; 8035 for (unsigned I = 0; I != N; ++I) { 8036 NestedNameSpecifier::SpecifierKind Kind 8037 = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 8038 switch (Kind) { 8039 case NestedNameSpecifier::Identifier: { 8040 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 8041 SourceRange Range = ReadSourceRange(F, Record, Idx); 8042 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 8043 break; 8044 } 8045 8046 case NestedNameSpecifier::Namespace: { 8047 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 8048 SourceRange Range = ReadSourceRange(F, Record, Idx); 8049 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 8050 break; 8051 } 8052 8053 case NestedNameSpecifier::NamespaceAlias: { 8054 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 8055 SourceRange Range = ReadSourceRange(F, Record, Idx); 8056 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 8057 break; 8058 } 8059 8060 case NestedNameSpecifier::TypeSpec: 8061 case NestedNameSpecifier::TypeSpecWithTemplate: { 8062 bool Template = Record[Idx++]; 8063 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx); 8064 if (!T) 8065 return NestedNameSpecifierLoc(); 8066 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 8067 8068 // FIXME: 'template' keyword location not saved anywhere, so we fake it. 8069 Builder.Extend(Context, 8070 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 8071 T->getTypeLoc(), ColonColonLoc); 8072 break; 8073 } 8074 8075 case NestedNameSpecifier::Global: { 8076 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 8077 Builder.MakeGlobal(Context, ColonColonLoc); 8078 break; 8079 } 8080 8081 case NestedNameSpecifier::Super: { 8082 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx); 8083 SourceRange Range = ReadSourceRange(F, Record, Idx); 8084 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd()); 8085 break; 8086 } 8087 } 8088 } 8089 8090 return Builder.getWithLocInContext(Context); 8091 } 8092 8093 SourceRange 8094 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 8095 unsigned &Idx) { 8096 SourceLocation beg = ReadSourceLocation(F, Record, Idx); 8097 SourceLocation end = ReadSourceLocation(F, Record, Idx); 8098 return SourceRange(beg, end); 8099 } 8100 8101 /// \brief Read an integral value 8102 llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) { 8103 unsigned BitWidth = Record[Idx++]; 8104 unsigned NumWords = llvm::APInt::getNumWords(BitWidth); 8105 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]); 8106 Idx += NumWords; 8107 return Result; 8108 } 8109 8110 /// \brief Read a signed integral value 8111 llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) { 8112 bool isUnsigned = Record[Idx++]; 8113 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned); 8114 } 8115 8116 /// \brief Read a floating-point value 8117 llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record, 8118 const llvm::fltSemantics &Sem, 8119 unsigned &Idx) { 8120 return llvm::APFloat(Sem, ReadAPInt(Record, Idx)); 8121 } 8122 8123 // \brief Read a string 8124 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 8125 unsigned Len = Record[Idx++]; 8126 std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 8127 Idx += Len; 8128 return Result; 8129 } 8130 8131 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record, 8132 unsigned &Idx) { 8133 std::string Filename = ReadString(Record, Idx); 8134 ResolveImportedPath(F, Filename); 8135 return Filename; 8136 } 8137 8138 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 8139 unsigned &Idx) { 8140 unsigned Major = Record[Idx++]; 8141 unsigned Minor = Record[Idx++]; 8142 unsigned Subminor = Record[Idx++]; 8143 if (Minor == 0) 8144 return VersionTuple(Major); 8145 if (Subminor == 0) 8146 return VersionTuple(Major, Minor - 1); 8147 return VersionTuple(Major, Minor - 1, Subminor - 1); 8148 } 8149 8150 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 8151 const RecordData &Record, 8152 unsigned &Idx) { 8153 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 8154 return CXXTemporary::Create(Context, Decl); 8155 } 8156 8157 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) { 8158 return Diag(CurrentImportLoc, DiagID); 8159 } 8160 8161 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) { 8162 return Diags.Report(Loc, DiagID); 8163 } 8164 8165 /// \brief Retrieve the identifier table associated with the 8166 /// preprocessor. 8167 IdentifierTable &ASTReader::getIdentifierTable() { 8168 return PP.getIdentifierTable(); 8169 } 8170 8171 /// \brief Record that the given ID maps to the given switch-case 8172 /// statement. 8173 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 8174 assert((*CurrSwitchCaseStmts)[ID] == nullptr && 8175 "Already have a SwitchCase with this ID"); 8176 (*CurrSwitchCaseStmts)[ID] = SC; 8177 } 8178 8179 /// \brief Retrieve the switch-case statement with the given ID. 8180 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 8181 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID"); 8182 return (*CurrSwitchCaseStmts)[ID]; 8183 } 8184 8185 void ASTReader::ClearSwitchCaseIDs() { 8186 CurrSwitchCaseStmts->clear(); 8187 } 8188 8189 void ASTReader::ReadComments() { 8190 std::vector<RawComment *> Comments; 8191 for (SmallVectorImpl<std::pair<BitstreamCursor, 8192 serialization::ModuleFile *> >::iterator 8193 I = CommentsCursors.begin(), 8194 E = CommentsCursors.end(); 8195 I != E; ++I) { 8196 Comments.clear(); 8197 BitstreamCursor &Cursor = I->first; 8198 serialization::ModuleFile &F = *I->second; 8199 SavedStreamPosition SavedPosition(Cursor); 8200 8201 RecordData Record; 8202 while (true) { 8203 llvm::BitstreamEntry Entry = 8204 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd); 8205 8206 switch (Entry.Kind) { 8207 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 8208 case llvm::BitstreamEntry::Error: 8209 Error("malformed block record in AST file"); 8210 return; 8211 case llvm::BitstreamEntry::EndBlock: 8212 goto NextCursor; 8213 case llvm::BitstreamEntry::Record: 8214 // The interesting case. 8215 break; 8216 } 8217 8218 // Read a record. 8219 Record.clear(); 8220 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) { 8221 case COMMENTS_RAW_COMMENT: { 8222 unsigned Idx = 0; 8223 SourceRange SR = ReadSourceRange(F, Record, Idx); 8224 RawComment::CommentKind Kind = 8225 (RawComment::CommentKind) Record[Idx++]; 8226 bool IsTrailingComment = Record[Idx++]; 8227 bool IsAlmostTrailingComment = Record[Idx++]; 8228 Comments.push_back(new (Context) RawComment( 8229 SR, Kind, IsTrailingComment, IsAlmostTrailingComment, 8230 Context.getLangOpts().CommentOpts.ParseAllComments)); 8231 break; 8232 } 8233 } 8234 } 8235 NextCursor: 8236 Context.Comments.addDeserializedComments(Comments); 8237 } 8238 } 8239 8240 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) { 8241 // If we know the owning module, use it. 8242 if (Module *M = D->getImportedOwningModule()) 8243 return M->getFullModuleName(); 8244 8245 // Otherwise, use the name of the top-level module the decl is within. 8246 if (ModuleFile *M = getOwningModuleFile(D)) 8247 return M->ModuleName; 8248 8249 // Not from a module. 8250 return ""; 8251 } 8252 8253 void ASTReader::finishPendingActions() { 8254 while (!PendingIdentifierInfos.empty() || 8255 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() || 8256 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || 8257 !PendingUpdateRecords.empty()) { 8258 // If any identifiers with corresponding top-level declarations have 8259 // been loaded, load those declarations now. 8260 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> > 8261 TopLevelDeclsMap; 8262 TopLevelDeclsMap TopLevelDecls; 8263 8264 while (!PendingIdentifierInfos.empty()) { 8265 IdentifierInfo *II = PendingIdentifierInfos.back().first; 8266 SmallVector<uint32_t, 4> DeclIDs = 8267 std::move(PendingIdentifierInfos.back().second); 8268 PendingIdentifierInfos.pop_back(); 8269 8270 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 8271 } 8272 8273 // For each decl chain that we wanted to complete while deserializing, mark 8274 // it as "still needs to be completed". 8275 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) { 8276 markIncompleteDeclChain(PendingIncompleteDeclChains[I]); 8277 } 8278 PendingIncompleteDeclChains.clear(); 8279 8280 // Load pending declaration chains. 8281 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) 8282 loadPendingDeclChain(PendingDeclChains[I].first, PendingDeclChains[I].second); 8283 PendingDeclChains.clear(); 8284 8285 // Make the most recent of the top-level declarations visible. 8286 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 8287 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 8288 IdentifierInfo *II = TLD->first; 8289 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 8290 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 8291 } 8292 } 8293 8294 // Load any pending macro definitions. 8295 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 8296 IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 8297 SmallVector<PendingMacroInfo, 2> GlobalIDs; 8298 GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 8299 // Initialize the macro history from chained-PCHs ahead of module imports. 8300 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 8301 ++IDIdx) { 8302 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 8303 if (Info.M->Kind != MK_ImplicitModule && 8304 Info.M->Kind != MK_ExplicitModule) 8305 resolvePendingMacro(II, Info); 8306 } 8307 // Handle module imports. 8308 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 8309 ++IDIdx) { 8310 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 8311 if (Info.M->Kind == MK_ImplicitModule || 8312 Info.M->Kind == MK_ExplicitModule) 8313 resolvePendingMacro(II, Info); 8314 } 8315 } 8316 PendingMacroIDs.clear(); 8317 8318 // Wire up the DeclContexts for Decls that we delayed setting until 8319 // recursive loading is completed. 8320 while (!PendingDeclContextInfos.empty()) { 8321 PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 8322 PendingDeclContextInfos.pop_front(); 8323 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 8324 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 8325 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 8326 } 8327 8328 // Perform any pending declaration updates. 8329 while (!PendingUpdateRecords.empty()) { 8330 auto Update = PendingUpdateRecords.pop_back_val(); 8331 ReadingKindTracker ReadingKind(Read_Decl, *this); 8332 loadDeclUpdateRecords(Update.first, Update.second); 8333 } 8334 } 8335 8336 // At this point, all update records for loaded decls are in place, so any 8337 // fake class definitions should have become real. 8338 assert(PendingFakeDefinitionData.empty() && 8339 "faked up a class definition but never saw the real one"); 8340 8341 // If we deserialized any C++ or Objective-C class definitions, any 8342 // Objective-C protocol definitions, or any redeclarable templates, make sure 8343 // that all redeclarations point to the definitions. Note that this can only 8344 // happen now, after the redeclaration chains have been fully wired. 8345 for (Decl *D : PendingDefinitions) { 8346 if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 8347 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) { 8348 // Make sure that the TagType points at the definition. 8349 const_cast<TagType*>(TagT)->decl = TD; 8350 } 8351 8352 if (auto RD = dyn_cast<CXXRecordDecl>(D)) { 8353 for (auto *R = getMostRecentExistingDecl(RD); R; 8354 R = R->getPreviousDecl()) { 8355 assert((R == D) == 8356 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && 8357 "declaration thinks it's the definition but it isn't"); 8358 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData; 8359 } 8360 } 8361 8362 continue; 8363 } 8364 8365 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) { 8366 // Make sure that the ObjCInterfaceType points at the definition. 8367 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 8368 ->Decl = ID; 8369 8370 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl()) 8371 cast<ObjCInterfaceDecl>(R)->Data = ID->Data; 8372 8373 continue; 8374 } 8375 8376 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) { 8377 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl()) 8378 cast<ObjCProtocolDecl>(R)->Data = PD->Data; 8379 8380 continue; 8381 } 8382 8383 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl(); 8384 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl()) 8385 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common; 8386 } 8387 PendingDefinitions.clear(); 8388 8389 // Load the bodies of any functions or methods we've encountered. We do 8390 // this now (delayed) so that we can be sure that the declaration chains 8391 // have been fully wired up (hasBody relies on this). 8392 // FIXME: We shouldn't require complete redeclaration chains here. 8393 for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 8394 PBEnd = PendingBodies.end(); 8395 PB != PBEnd; ++PB) { 8396 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 8397 // FIXME: Check for =delete/=default? 8398 // FIXME: Complain about ODR violations here? 8399 if (!getContext().getLangOpts().Modules || !FD->hasBody()) 8400 FD->setLazyBody(PB->second); 8401 continue; 8402 } 8403 8404 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 8405 if (!getContext().getLangOpts().Modules || !MD->hasBody()) 8406 MD->setLazyBody(PB->second); 8407 } 8408 PendingBodies.clear(); 8409 8410 // Do some cleanup. 8411 for (auto *ND : PendingMergedDefinitionsToDeduplicate) 8412 getContext().deduplicateMergedDefinitonsFor(ND); 8413 PendingMergedDefinitionsToDeduplicate.clear(); 8414 } 8415 8416 void ASTReader::diagnoseOdrViolations() { 8417 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty()) 8418 return; 8419 8420 // Trigger the import of the full definition of each class that had any 8421 // odr-merging problems, so we can produce better diagnostics for them. 8422 // These updates may in turn find and diagnose some ODR failures, so take 8423 // ownership of the set first. 8424 auto OdrMergeFailures = std::move(PendingOdrMergeFailures); 8425 PendingOdrMergeFailures.clear(); 8426 for (auto &Merge : OdrMergeFailures) { 8427 Merge.first->buildLookup(); 8428 Merge.first->decls_begin(); 8429 Merge.first->bases_begin(); 8430 Merge.first->vbases_begin(); 8431 for (auto *RD : Merge.second) { 8432 RD->decls_begin(); 8433 RD->bases_begin(); 8434 RD->vbases_begin(); 8435 } 8436 } 8437 8438 // For each declaration from a merged context, check that the canonical 8439 // definition of that context also contains a declaration of the same 8440 // entity. 8441 // 8442 // Caution: this loop does things that might invalidate iterators into 8443 // PendingOdrMergeChecks. Don't turn this into a range-based for loop! 8444 while (!PendingOdrMergeChecks.empty()) { 8445 NamedDecl *D = PendingOdrMergeChecks.pop_back_val(); 8446 8447 // FIXME: Skip over implicit declarations for now. This matters for things 8448 // like implicitly-declared special member functions. This isn't entirely 8449 // correct; we can end up with multiple unmerged declarations of the same 8450 // implicit entity. 8451 if (D->isImplicit()) 8452 continue; 8453 8454 DeclContext *CanonDef = D->getDeclContext(); 8455 8456 bool Found = false; 8457 const Decl *DCanon = D->getCanonicalDecl(); 8458 8459 for (auto RI : D->redecls()) { 8460 if (RI->getLexicalDeclContext() == CanonDef) { 8461 Found = true; 8462 break; 8463 } 8464 } 8465 if (Found) 8466 continue; 8467 8468 // Quick check failed, time to do the slow thing. Note, we can't just 8469 // look up the name of D in CanonDef here, because the member that is 8470 // in CanonDef might not be found by name lookup (it might have been 8471 // replaced by a more recent declaration in the lookup table), and we 8472 // can't necessarily find it in the redeclaration chain because it might 8473 // be merely mergeable, not redeclarable. 8474 llvm::SmallVector<const NamedDecl*, 4> Candidates; 8475 for (auto *CanonMember : CanonDef->decls()) { 8476 if (CanonMember->getCanonicalDecl() == DCanon) { 8477 // This can happen if the declaration is merely mergeable and not 8478 // actually redeclarable (we looked for redeclarations earlier). 8479 // 8480 // FIXME: We should be able to detect this more efficiently, without 8481 // pulling in all of the members of CanonDef. 8482 Found = true; 8483 break; 8484 } 8485 if (auto *ND = dyn_cast<NamedDecl>(CanonMember)) 8486 if (ND->getDeclName() == D->getDeclName()) 8487 Candidates.push_back(ND); 8488 } 8489 8490 if (!Found) { 8491 // The AST doesn't like TagDecls becoming invalid after they've been 8492 // completed. We only really need to mark FieldDecls as invalid here. 8493 if (!isa<TagDecl>(D)) 8494 D->setInvalidDecl(); 8495 8496 // Ensure we don't accidentally recursively enter deserialization while 8497 // we're producing our diagnostic. 8498 Deserializing RecursionGuard(this); 8499 8500 std::string CanonDefModule = 8501 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef)); 8502 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl) 8503 << D << getOwningModuleNameForDiagnostic(D) 8504 << CanonDef << CanonDefModule.empty() << CanonDefModule; 8505 8506 if (Candidates.empty()) 8507 Diag(cast<Decl>(CanonDef)->getLocation(), 8508 diag::note_module_odr_violation_no_possible_decls) << D; 8509 else { 8510 for (unsigned I = 0, N = Candidates.size(); I != N; ++I) 8511 Diag(Candidates[I]->getLocation(), 8512 diag::note_module_odr_violation_possible_decl) 8513 << Candidates[I]; 8514 } 8515 8516 DiagnosedOdrMergeFailures.insert(CanonDef); 8517 } 8518 } 8519 8520 if (OdrMergeFailures.empty()) 8521 return; 8522 8523 // Ensure we don't accidentally recursively enter deserialization while 8524 // we're producing our diagnostics. 8525 Deserializing RecursionGuard(this); 8526 8527 // Issue any pending ODR-failure diagnostics. 8528 for (auto &Merge : OdrMergeFailures) { 8529 // If we've already pointed out a specific problem with this class, don't 8530 // bother issuing a general "something's different" diagnostic. 8531 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 8532 continue; 8533 8534 bool Diagnosed = false; 8535 for (auto *RD : Merge.second) { 8536 // Multiple different declarations got merged together; tell the user 8537 // where they came from. 8538 if (Merge.first != RD) { 8539 // FIXME: Walk the definition, figure out what's different, 8540 // and diagnose that. 8541 if (!Diagnosed) { 8542 std::string Module = getOwningModuleNameForDiagnostic(Merge.first); 8543 Diag(Merge.first->getLocation(), 8544 diag::err_module_odr_violation_different_definitions) 8545 << Merge.first << Module.empty() << Module; 8546 Diagnosed = true; 8547 } 8548 8549 Diag(RD->getLocation(), 8550 diag::note_module_odr_violation_different_definitions) 8551 << getOwningModuleNameForDiagnostic(RD); 8552 } 8553 } 8554 8555 if (!Diagnosed) { 8556 // All definitions are updates to the same declaration. This happens if a 8557 // module instantiates the declaration of a class template specialization 8558 // and two or more other modules instantiate its definition. 8559 // 8560 // FIXME: Indicate which modules had instantiations of this definition. 8561 // FIXME: How can this even happen? 8562 Diag(Merge.first->getLocation(), 8563 diag::err_module_odr_violation_different_instantiations) 8564 << Merge.first; 8565 } 8566 } 8567 } 8568 8569 void ASTReader::StartedDeserializing() { 8570 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get()) 8571 ReadTimer->startTimer(); 8572 } 8573 8574 void ASTReader::FinishedDeserializing() { 8575 assert(NumCurrentElementsDeserializing && 8576 "FinishedDeserializing not paired with StartedDeserializing"); 8577 if (NumCurrentElementsDeserializing == 1) { 8578 // We decrease NumCurrentElementsDeserializing only after pending actions 8579 // are finished, to avoid recursively re-calling finishPendingActions(). 8580 finishPendingActions(); 8581 } 8582 --NumCurrentElementsDeserializing; 8583 8584 if (NumCurrentElementsDeserializing == 0) { 8585 // Propagate exception specification updates along redeclaration chains. 8586 while (!PendingExceptionSpecUpdates.empty()) { 8587 auto Updates = std::move(PendingExceptionSpecUpdates); 8588 PendingExceptionSpecUpdates.clear(); 8589 for (auto Update : Updates) { 8590 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>(); 8591 auto ESI = FPT->getExtProtoInfo().ExceptionSpec; 8592 if (auto *Listener = Context.getASTMutationListener()) 8593 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second)); 8594 for (auto *Redecl : Update.second->redecls()) 8595 Context.adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI); 8596 } 8597 } 8598 8599 if (ReadTimer) 8600 ReadTimer->stopTimer(); 8601 8602 diagnoseOdrViolations(); 8603 8604 // We are not in recursive loading, so it's safe to pass the "interesting" 8605 // decls to the consumer. 8606 if (Consumer) 8607 PassInterestingDeclsToConsumer(); 8608 } 8609 } 8610 8611 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 8612 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { 8613 // Remove any fake results before adding any real ones. 8614 auto It = PendingFakeLookupResults.find(II); 8615 if (It != PendingFakeLookupResults.end()) { 8616 for (auto *ND : It->second) 8617 SemaObj->IdResolver.RemoveDecl(ND); 8618 // FIXME: this works around module+PCH performance issue. 8619 // Rather than erase the result from the map, which is O(n), just clear 8620 // the vector of NamedDecls. 8621 It->second.clear(); 8622 } 8623 } 8624 8625 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 8626 SemaObj->TUScope->AddDecl(D); 8627 } else if (SemaObj->TUScope) { 8628 // Adding the decl to IdResolver may have failed because it was already in 8629 // (even though it was not added in scope). If it is already in, make sure 8630 // it gets in the scope as well. 8631 if (std::find(SemaObj->IdResolver.begin(Name), 8632 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 8633 SemaObj->TUScope->AddDecl(D); 8634 } 8635 } 8636 8637 ASTReader::ASTReader( 8638 Preprocessor &PP, ASTContext &Context, 8639 const PCHContainerReader &PCHContainerRdr, 8640 ArrayRef<IntrusiveRefCntPtr<ModuleFileExtension>> Extensions, 8641 StringRef isysroot, bool DisableValidation, 8642 bool AllowASTWithCompilerErrors, 8643 bool AllowConfigurationMismatch, bool ValidateSystemInputs, 8644 bool UseGlobalIndex, 8645 std::unique_ptr<llvm::Timer> ReadTimer) 8646 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr), 8647 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()), 8648 FileMgr(PP.getFileManager()), PCHContainerRdr(PCHContainerRdr), 8649 Diags(PP.getDiagnostics()), SemaObj(nullptr), PP(PP), Context(Context), 8650 Consumer(nullptr), ModuleMgr(PP.getFileManager(), PCHContainerRdr), 8651 ReadTimer(std::move(ReadTimer)), 8652 PragmaMSStructState(-1), 8653 PragmaMSPointersToMembersState(-1), 8654 isysroot(isysroot), DisableValidation(DisableValidation), 8655 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 8656 AllowConfigurationMismatch(AllowConfigurationMismatch), 8657 ValidateSystemInputs(ValidateSystemInputs), 8658 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false), 8659 CurrSwitchCaseStmts(&SwitchCaseStmts), NumSLocEntriesRead(0), 8660 TotalNumSLocEntries(0), NumStatementsRead(0), TotalNumStatements(0), 8661 NumMacrosRead(0), TotalNumMacros(0), NumIdentifierLookups(0), 8662 NumIdentifierLookupHits(0), NumSelectorsRead(0), 8663 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0), 8664 NumMethodPoolHits(0), NumMethodPoolTableLookups(0), 8665 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0), 8666 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0), 8667 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0), 8668 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0), 8669 PassingDeclsToConsumer(false), ReadingKind(Read_None) { 8670 SourceMgr.setExternalSLocEntrySource(this); 8671 8672 for (const auto &Ext : Extensions) { 8673 auto BlockName = Ext->getExtensionMetadata().BlockName; 8674 auto Known = ModuleFileExtensions.find(BlockName); 8675 if (Known != ModuleFileExtensions.end()) { 8676 Diags.Report(diag::warn_duplicate_module_file_extension) 8677 << BlockName; 8678 continue; 8679 } 8680 8681 ModuleFileExtensions.insert({BlockName, Ext}); 8682 } 8683 } 8684 8685 ASTReader::~ASTReader() { 8686 if (OwnsDeserializationListener) 8687 delete DeserializationListener; 8688 } 8689