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