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