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