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