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