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 break; 3217 } 3218 3219 case CXX_CTOR_INITIALIZERS_OFFSETS: { 3220 if (F.LocalNumCXXCtorInitializers != 0) { 3221 Error("duplicate CXX_CTOR_INITIALIZERS_OFFSETS record in AST file"); 3222 return Failure; 3223 } 3224 3225 F.LocalNumCXXCtorInitializers = Record[0]; 3226 F.CXXCtorInitializersOffsets = (const uint32_t *)Blob.data(); 3227 break; 3228 } 3229 3230 case DIAG_PRAGMA_MAPPINGS: 3231 if (F.PragmaDiagMappings.empty()) 3232 F.PragmaDiagMappings.swap(Record); 3233 else 3234 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(), 3235 Record.begin(), Record.end()); 3236 break; 3237 3238 case CUDA_SPECIAL_DECL_REFS: 3239 // Later tables overwrite earlier ones. 3240 // FIXME: Modules will have trouble with this. 3241 CUDASpecialDeclRefs.clear(); 3242 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3243 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3244 break; 3245 3246 case HEADER_SEARCH_TABLE: { 3247 F.HeaderFileInfoTableData = Blob.data(); 3248 F.LocalNumHeaderFileInfos = Record[1]; 3249 if (Record[0]) { 3250 F.HeaderFileInfoTable 3251 = HeaderFileInfoLookupTable::Create( 3252 (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 3253 (const unsigned char *)F.HeaderFileInfoTableData, 3254 HeaderFileInfoTrait(*this, F, 3255 &PP.getHeaderSearchInfo(), 3256 Blob.data() + Record[2])); 3257 3258 PP.getHeaderSearchInfo().SetExternalSource(this); 3259 if (!PP.getHeaderSearchInfo().getExternalLookup()) 3260 PP.getHeaderSearchInfo().SetExternalLookup(this); 3261 } 3262 break; 3263 } 3264 3265 case FP_PRAGMA_OPTIONS: 3266 // Later tables overwrite earlier ones. 3267 FPPragmaOptions.swap(Record); 3268 break; 3269 3270 case OPENCL_EXTENSIONS: 3271 // Later tables overwrite earlier ones. 3272 OpenCLExtensions.swap(Record); 3273 break; 3274 3275 case TENTATIVE_DEFINITIONS: 3276 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3277 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 3278 break; 3279 3280 case KNOWN_NAMESPACES: 3281 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3282 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 3283 break; 3284 3285 case UNDEFINED_BUT_USED: 3286 if (UndefinedButUsed.size() % 2 != 0) { 3287 Error("Invalid existing UndefinedButUsed"); 3288 return Failure; 3289 } 3290 3291 if (Record.size() % 2 != 0) { 3292 Error("invalid undefined-but-used record"); 3293 return Failure; 3294 } 3295 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3296 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 3297 UndefinedButUsed.push_back( 3298 ReadSourceLocation(F, Record, I).getRawEncoding()); 3299 } 3300 break; 3301 3302 case IMPORTED_MODULES: { 3303 if (F.Kind != MK_ImplicitModule && F.Kind != MK_ExplicitModule) { 3304 // If we aren't loading a module (which has its own exports), make 3305 // all of the imported modules visible. 3306 // FIXME: Deal with macros-only imports. 3307 for (unsigned I = 0, N = Record.size(); I != N; /**/) { 3308 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]); 3309 SourceLocation Loc = ReadSourceLocation(F, Record, I); 3310 if (GlobalID) 3311 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc)); 3312 } 3313 } 3314 break; 3315 } 3316 3317 case LOCAL_REDECLARATIONS: { 3318 F.RedeclarationChains.swap(Record); 3319 break; 3320 } 3321 3322 case LOCAL_REDECLARATIONS_MAP: { 3323 if (F.LocalNumRedeclarationsInMap != 0) { 3324 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file"); 3325 return Failure; 3326 } 3327 3328 F.LocalNumRedeclarationsInMap = Record[0]; 3329 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data(); 3330 break; 3331 } 3332 3333 case MACRO_OFFSET: { 3334 if (F.LocalNumMacros != 0) { 3335 Error("duplicate MACRO_OFFSET record in AST file"); 3336 return Failure; 3337 } 3338 F.MacroOffsets = (const uint32_t *)Blob.data(); 3339 F.LocalNumMacros = Record[0]; 3340 unsigned LocalBaseMacroID = Record[1]; 3341 F.BaseMacroID = getTotalNumMacros(); 3342 3343 if (F.LocalNumMacros > 0) { 3344 // Introduce the global -> local mapping for macros within this module. 3345 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 3346 3347 // Introduce the local -> global mapping for macros within this module. 3348 F.MacroRemap.insertOrReplace( 3349 std::make_pair(LocalBaseMacroID, 3350 F.BaseMacroID - LocalBaseMacroID)); 3351 3352 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 3353 } 3354 break; 3355 } 3356 3357 case MACRO_TABLE: { 3358 // FIXME: Not used yet. 3359 break; 3360 } 3361 3362 case LATE_PARSED_TEMPLATE: { 3363 LateParsedTemplates.append(Record.begin(), Record.end()); 3364 break; 3365 } 3366 3367 case OPTIMIZE_PRAGMA_OPTIONS: 3368 if (Record.size() != 1) { 3369 Error("invalid pragma optimize record"); 3370 return Failure; 3371 } 3372 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]); 3373 break; 3374 3375 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES: 3376 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3377 UnusedLocalTypedefNameCandidates.push_back( 3378 getGlobalDeclID(F, Record[I])); 3379 break; 3380 } 3381 } 3382 } 3383 3384 ASTReader::ASTReadResult 3385 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F, 3386 const ModuleFile *ImportedBy, 3387 unsigned ClientLoadCapabilities) { 3388 unsigned Idx = 0; 3389 F.ModuleMapPath = ReadPath(F, Record, Idx); 3390 3391 if (F.Kind == MK_ExplicitModule) { 3392 // For an explicitly-loaded module, we don't care whether the original 3393 // module map file exists or matches. 3394 return Success; 3395 } 3396 3397 // Try to resolve ModuleName in the current header search context and 3398 // verify that it is found in the same module map file as we saved. If the 3399 // top-level AST file is a main file, skip this check because there is no 3400 // usable header search context. 3401 assert(!F.ModuleName.empty() && 3402 "MODULE_NAME should come before MODULE_MAP_FILE"); 3403 if (F.Kind == MK_ImplicitModule && 3404 (*ModuleMgr.begin())->Kind != MK_MainFile) { 3405 // An implicitly-loaded module file should have its module listed in some 3406 // module map file that we've already loaded. 3407 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName); 3408 auto &Map = PP.getHeaderSearchInfo().getModuleMap(); 3409 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr; 3410 if (!ModMap) { 3411 assert(ImportedBy && "top-level import should be verified"); 3412 if ((ClientLoadCapabilities & ARR_Missing) == 0) 3413 Diag(diag::err_imported_module_not_found) << F.ModuleName << F.FileName 3414 << ImportedBy->FileName 3415 << F.ModuleMapPath; 3416 return Missing; 3417 } 3418 3419 assert(M->Name == F.ModuleName && "found module with different name"); 3420 3421 // Check the primary module map file. 3422 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath); 3423 if (StoredModMap == nullptr || StoredModMap != ModMap) { 3424 assert(ModMap && "found module is missing module map file"); 3425 assert(ImportedBy && "top-level import should be verified"); 3426 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3427 Diag(diag::err_imported_module_modmap_changed) 3428 << F.ModuleName << ImportedBy->FileName 3429 << ModMap->getName() << F.ModuleMapPath; 3430 return OutOfDate; 3431 } 3432 3433 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps; 3434 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) { 3435 // FIXME: we should use input files rather than storing names. 3436 std::string Filename = ReadPath(F, Record, Idx); 3437 const FileEntry *F = 3438 FileMgr.getFile(Filename, false, false); 3439 if (F == nullptr) { 3440 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3441 Error("could not find file '" + Filename +"' referenced by AST file"); 3442 return OutOfDate; 3443 } 3444 AdditionalStoredMaps.insert(F); 3445 } 3446 3447 // Check any additional module map files (e.g. module.private.modulemap) 3448 // that are not in the pcm. 3449 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) { 3450 for (const FileEntry *ModMap : *AdditionalModuleMaps) { 3451 // Remove files that match 3452 // Note: SmallPtrSet::erase is really remove 3453 if (!AdditionalStoredMaps.erase(ModMap)) { 3454 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3455 Diag(diag::err_module_different_modmap) 3456 << F.ModuleName << /*new*/0 << ModMap->getName(); 3457 return OutOfDate; 3458 } 3459 } 3460 } 3461 3462 // Check any additional module map files that are in the pcm, but not 3463 // found in header search. Cases that match are already removed. 3464 for (const FileEntry *ModMap : AdditionalStoredMaps) { 3465 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3466 Diag(diag::err_module_different_modmap) 3467 << F.ModuleName << /*not new*/1 << ModMap->getName(); 3468 return OutOfDate; 3469 } 3470 } 3471 3472 if (Listener) 3473 Listener->ReadModuleMapFile(F.ModuleMapPath); 3474 return Success; 3475 } 3476 3477 3478 /// \brief Move the given method to the back of the global list of methods. 3479 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 3480 // Find the entry for this selector in the method pool. 3481 Sema::GlobalMethodPool::iterator Known 3482 = S.MethodPool.find(Method->getSelector()); 3483 if (Known == S.MethodPool.end()) 3484 return; 3485 3486 // Retrieve the appropriate method list. 3487 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 3488 : Known->second.second; 3489 bool Found = false; 3490 for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 3491 if (!Found) { 3492 if (List->getMethod() == Method) { 3493 Found = true; 3494 } else { 3495 // Keep searching. 3496 continue; 3497 } 3498 } 3499 3500 if (List->getNext()) 3501 List->setMethod(List->getNext()->getMethod()); 3502 else 3503 List->setMethod(Method); 3504 } 3505 } 3506 3507 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner, 3508 bool FromFinalization) { 3509 // FIXME: Only do this if Owner->NameVisibility == AllVisible. 3510 for (Decl *D : Names.HiddenDecls) { 3511 bool wasHidden = D->Hidden; 3512 D->Hidden = false; 3513 3514 if (wasHidden && SemaObj) { 3515 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 3516 moveMethodToBackOfGlobalList(*SemaObj, Method); 3517 } 3518 } 3519 } 3520 3521 assert((FromFinalization || Owner->NameVisibility >= Module::MacrosVisible) && 3522 "nothing to make visible?"); 3523 for (const auto &Macro : Names.HiddenMacros) { 3524 if (FromFinalization) 3525 PP.appendMacroDirective(Macro.first, 3526 Macro.second->import(PP, SourceLocation())); 3527 else 3528 installImportedMacro(Macro.first, Macro.second, Owner); 3529 } 3530 } 3531 3532 void ASTReader::makeModuleVisible(Module *Mod, 3533 Module::NameVisibilityKind NameVisibility, 3534 SourceLocation ImportLoc, 3535 bool Complain) { 3536 llvm::SmallPtrSet<Module *, 4> Visited; 3537 SmallVector<Module *, 4> Stack; 3538 Stack.push_back(Mod); 3539 while (!Stack.empty()) { 3540 Mod = Stack.pop_back_val(); 3541 3542 if (NameVisibility <= Mod->NameVisibility) { 3543 // This module already has this level of visibility (or greater), so 3544 // there is nothing more to do. 3545 continue; 3546 } 3547 3548 if (!Mod->isAvailable()) { 3549 // Modules that aren't available cannot be made visible. 3550 continue; 3551 } 3552 3553 // Update the module's name visibility. 3554 if (NameVisibility >= Module::MacrosVisible && 3555 Mod->NameVisibility < Module::MacrosVisible) 3556 Mod->MacroVisibilityLoc = ImportLoc; 3557 Mod->NameVisibility = NameVisibility; 3558 3559 // If we've already deserialized any names from this module, 3560 // mark them as visible. 3561 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 3562 if (Hidden != HiddenNamesMap.end()) { 3563 auto HiddenNames = std::move(*Hidden); 3564 HiddenNamesMap.erase(Hidden); 3565 makeNamesVisible(HiddenNames.second, HiddenNames.first, 3566 /*FromFinalization*/false); 3567 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && 3568 "making names visible added hidden names"); 3569 } 3570 3571 // Push any exported modules onto the stack to be marked as visible. 3572 SmallVector<Module *, 16> Exports; 3573 Mod->getExportedModules(Exports); 3574 for (SmallVectorImpl<Module *>::iterator 3575 I = Exports.begin(), E = Exports.end(); I != E; ++I) { 3576 Module *Exported = *I; 3577 if (Visited.insert(Exported).second) 3578 Stack.push_back(Exported); 3579 } 3580 3581 // Detect any conflicts. 3582 if (Complain) { 3583 assert(ImportLoc.isValid() && "Missing import location"); 3584 for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) { 3585 if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) { 3586 Diag(ImportLoc, diag::warn_module_conflict) 3587 << Mod->getFullModuleName() 3588 << Mod->Conflicts[I].Other->getFullModuleName() 3589 << Mod->Conflicts[I].Message; 3590 // FIXME: Need note where the other module was imported. 3591 } 3592 } 3593 } 3594 } 3595 } 3596 3597 bool ASTReader::loadGlobalIndex() { 3598 if (GlobalIndex) 3599 return false; 3600 3601 if (TriedLoadingGlobalIndex || !UseGlobalIndex || 3602 !Context.getLangOpts().Modules) 3603 return true; 3604 3605 // Try to load the global index. 3606 TriedLoadingGlobalIndex = true; 3607 StringRef ModuleCachePath 3608 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 3609 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result 3610 = GlobalModuleIndex::readIndex(ModuleCachePath); 3611 if (!Result.first) 3612 return true; 3613 3614 GlobalIndex.reset(Result.first); 3615 ModuleMgr.setGlobalIndex(GlobalIndex.get()); 3616 return false; 3617 } 3618 3619 bool ASTReader::isGlobalIndexUnavailable() const { 3620 return Context.getLangOpts().Modules && UseGlobalIndex && 3621 !hasGlobalIndex() && TriedLoadingGlobalIndex; 3622 } 3623 3624 static void updateModuleTimestamp(ModuleFile &MF) { 3625 // Overwrite the timestamp file contents so that file's mtime changes. 3626 std::string TimestampFilename = MF.getTimestampFilename(); 3627 std::error_code EC; 3628 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text); 3629 if (EC) 3630 return; 3631 OS << "Timestamp file\n"; 3632 } 3633 3634 ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName, 3635 ModuleKind Type, 3636 SourceLocation ImportLoc, 3637 unsigned ClientLoadCapabilities) { 3638 llvm::SaveAndRestore<SourceLocation> 3639 SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 3640 3641 // Defer any pending actions until we get to the end of reading the AST file. 3642 Deserializing AnASTFile(this); 3643 3644 // Bump the generation number. 3645 unsigned PreviousGeneration = incrementGeneration(Context); 3646 3647 unsigned NumModules = ModuleMgr.size(); 3648 SmallVector<ImportedModule, 4> Loaded; 3649 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc, 3650 /*ImportedBy=*/nullptr, Loaded, 3651 0, 0, 0, 3652 ClientLoadCapabilities)) { 3653 case Failure: 3654 case Missing: 3655 case OutOfDate: 3656 case VersionMismatch: 3657 case ConfigurationMismatch: 3658 case HadErrors: { 3659 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet; 3660 for (const ImportedModule &IM : Loaded) 3661 LoadedSet.insert(IM.Mod); 3662 3663 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(), 3664 LoadedSet, 3665 Context.getLangOpts().Modules 3666 ? &PP.getHeaderSearchInfo().getModuleMap() 3667 : nullptr); 3668 3669 // If we find that any modules are unusable, the global index is going 3670 // to be out-of-date. Just remove it. 3671 GlobalIndex.reset(); 3672 ModuleMgr.setGlobalIndex(nullptr); 3673 return ReadResult; 3674 } 3675 case Success: 3676 break; 3677 } 3678 3679 // Here comes stuff that we only do once the entire chain is loaded. 3680 3681 // Load the AST blocks of all of the modules that we loaded. 3682 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), 3683 MEnd = Loaded.end(); 3684 M != MEnd; ++M) { 3685 ModuleFile &F = *M->Mod; 3686 3687 // Read the AST block. 3688 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities)) 3689 return Result; 3690 3691 // Once read, set the ModuleFile bit base offset and update the size in 3692 // bits of all files we've seen. 3693 F.GlobalBitOffset = TotalModulesSizeInBits; 3694 TotalModulesSizeInBits += F.SizeInBits; 3695 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 3696 3697 // Preload SLocEntries. 3698 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 3699 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 3700 // Load it through the SourceManager and don't call ReadSLocEntry() 3701 // directly because the entry may have already been loaded in which case 3702 // calling ReadSLocEntry() directly would trigger an assertion in 3703 // SourceManager. 3704 SourceMgr.getLoadedSLocEntryByID(Index); 3705 } 3706 } 3707 3708 // Setup the import locations and notify the module manager that we've 3709 // committed to these module files. 3710 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), 3711 MEnd = Loaded.end(); 3712 M != MEnd; ++M) { 3713 ModuleFile &F = *M->Mod; 3714 3715 ModuleMgr.moduleFileAccepted(&F); 3716 3717 // Set the import location. 3718 F.DirectImportLoc = ImportLoc; 3719 if (!M->ImportedBy) 3720 F.ImportLoc = M->ImportLoc; 3721 else 3722 F.ImportLoc = ReadSourceLocation(*M->ImportedBy, 3723 M->ImportLoc.getRawEncoding()); 3724 } 3725 3726 // Mark all of the identifiers in the identifier table as being out of date, 3727 // so that various accessors know to check the loaded modules when the 3728 // identifier is used. 3729 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 3730 IdEnd = PP.getIdentifierTable().end(); 3731 Id != IdEnd; ++Id) 3732 Id->second->setOutOfDate(true); 3733 3734 // Resolve any unresolved module exports. 3735 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) { 3736 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I]; 3737 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 3738 Module *ResolvedMod = getSubmodule(GlobalID); 3739 3740 switch (Unresolved.Kind) { 3741 case UnresolvedModuleRef::Conflict: 3742 if (ResolvedMod) { 3743 Module::Conflict Conflict; 3744 Conflict.Other = ResolvedMod; 3745 Conflict.Message = Unresolved.String.str(); 3746 Unresolved.Mod->Conflicts.push_back(Conflict); 3747 } 3748 continue; 3749 3750 case UnresolvedModuleRef::Import: 3751 if (ResolvedMod) 3752 Unresolved.Mod->Imports.push_back(ResolvedMod); 3753 continue; 3754 3755 case UnresolvedModuleRef::Export: 3756 if (ResolvedMod || Unresolved.IsWildcard) 3757 Unresolved.Mod->Exports.push_back( 3758 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 3759 continue; 3760 } 3761 } 3762 UnresolvedModuleRefs.clear(); 3763 3764 // FIXME: How do we load the 'use'd modules? They may not be submodules. 3765 // Might be unnecessary as use declarations are only used to build the 3766 // module itself. 3767 3768 InitializeContext(); 3769 3770 if (SemaObj) 3771 UpdateSema(); 3772 3773 if (DeserializationListener) 3774 DeserializationListener->ReaderInitialized(this); 3775 3776 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 3777 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) { 3778 PrimaryModule.OriginalSourceFileID 3779 = FileID::get(PrimaryModule.SLocEntryBaseID 3780 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1); 3781 3782 // If this AST file is a precompiled preamble, then set the 3783 // preamble file ID of the source manager to the file source file 3784 // from which the preamble was built. 3785 if (Type == MK_Preamble) { 3786 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 3787 } else if (Type == MK_MainFile) { 3788 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 3789 } 3790 } 3791 3792 // For any Objective-C class definitions we have already loaded, make sure 3793 // that we load any additional categories. 3794 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 3795 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 3796 ObjCClassesLoaded[I], 3797 PreviousGeneration); 3798 } 3799 3800 if (PP.getHeaderSearchInfo() 3801 .getHeaderSearchOpts() 3802 .ModulesValidateOncePerBuildSession) { 3803 // Now we are certain that the module and all modules it depends on are 3804 // up to date. Create or update timestamp files for modules that are 3805 // located in the module cache (not for PCH files that could be anywhere 3806 // in the filesystem). 3807 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) { 3808 ImportedModule &M = Loaded[I]; 3809 if (M.Mod->Kind == MK_ImplicitModule) { 3810 updateModuleTimestamp(*M.Mod); 3811 } 3812 } 3813 } 3814 3815 return Success; 3816 } 3817 3818 static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile); 3819 3820 /// \brief Whether \p Stream starts with the AST/PCH file magic number 'CPCH'. 3821 static bool startsWithASTFileMagic(BitstreamCursor &Stream) { 3822 return Stream.Read(8) == 'C' && 3823 Stream.Read(8) == 'P' && 3824 Stream.Read(8) == 'C' && 3825 Stream.Read(8) == 'H'; 3826 } 3827 3828 ASTReader::ASTReadResult 3829 ASTReader::ReadASTCore(StringRef FileName, 3830 ModuleKind Type, 3831 SourceLocation ImportLoc, 3832 ModuleFile *ImportedBy, 3833 SmallVectorImpl<ImportedModule> &Loaded, 3834 off_t ExpectedSize, time_t ExpectedModTime, 3835 ASTFileSignature ExpectedSignature, 3836 unsigned ClientLoadCapabilities) { 3837 ModuleFile *M; 3838 std::string ErrorStr; 3839 ModuleManager::AddModuleResult AddResult 3840 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy, 3841 getGeneration(), ExpectedSize, ExpectedModTime, 3842 ExpectedSignature, readASTFileSignature, 3843 M, ErrorStr); 3844 3845 switch (AddResult) { 3846 case ModuleManager::AlreadyLoaded: 3847 return Success; 3848 3849 case ModuleManager::NewlyLoaded: 3850 // Load module file below. 3851 break; 3852 3853 case ModuleManager::Missing: 3854 // The module file was missing; if the client can handle that, return 3855 // it. 3856 if (ClientLoadCapabilities & ARR_Missing) 3857 return Missing; 3858 3859 // Otherwise, return an error. 3860 { 3861 std::string Msg = "Unable to load module \"" + FileName.str() + "\": " 3862 + ErrorStr; 3863 Error(Msg); 3864 } 3865 return Failure; 3866 3867 case ModuleManager::OutOfDate: 3868 // We couldn't load the module file because it is out-of-date. If the 3869 // client can handle out-of-date, return it. 3870 if (ClientLoadCapabilities & ARR_OutOfDate) 3871 return OutOfDate; 3872 3873 // Otherwise, return an error. 3874 { 3875 std::string Msg = "Unable to load module \"" + FileName.str() + "\": " 3876 + ErrorStr; 3877 Error(Msg); 3878 } 3879 return Failure; 3880 } 3881 3882 assert(M && "Missing module file"); 3883 3884 // FIXME: This seems rather a hack. Should CurrentDir be part of the 3885 // module? 3886 if (FileName != "-") { 3887 CurrentDir = llvm::sys::path::parent_path(FileName); 3888 if (CurrentDir.empty()) CurrentDir = "."; 3889 } 3890 3891 ModuleFile &F = *M; 3892 BitstreamCursor &Stream = F.Stream; 3893 Stream.init(&F.StreamFile); 3894 F.SizeInBits = F.Buffer->getBufferSize() * 8; 3895 3896 // Sniff for the signature. 3897 if (!startsWithASTFileMagic(Stream)) { 3898 Diag(diag::err_not_a_pch_file) << FileName; 3899 return Failure; 3900 } 3901 3902 // This is used for compatibility with older PCH formats. 3903 bool HaveReadControlBlock = false; 3904 3905 while (1) { 3906 llvm::BitstreamEntry Entry = Stream.advance(); 3907 3908 switch (Entry.Kind) { 3909 case llvm::BitstreamEntry::Error: 3910 case llvm::BitstreamEntry::EndBlock: 3911 case llvm::BitstreamEntry::Record: 3912 Error("invalid record at top-level of AST file"); 3913 return Failure; 3914 3915 case llvm::BitstreamEntry::SubBlock: 3916 break; 3917 } 3918 3919 // We only know the control subblock ID. 3920 switch (Entry.ID) { 3921 case llvm::bitc::BLOCKINFO_BLOCK_ID: 3922 if (Stream.ReadBlockInfoBlock()) { 3923 Error("malformed BlockInfoBlock in AST file"); 3924 return Failure; 3925 } 3926 break; 3927 case CONTROL_BLOCK_ID: 3928 HaveReadControlBlock = true; 3929 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) { 3930 case Success: 3931 break; 3932 3933 case Failure: return Failure; 3934 case Missing: return Missing; 3935 case OutOfDate: return OutOfDate; 3936 case VersionMismatch: return VersionMismatch; 3937 case ConfigurationMismatch: return ConfigurationMismatch; 3938 case HadErrors: return HadErrors; 3939 } 3940 break; 3941 case AST_BLOCK_ID: 3942 if (!HaveReadControlBlock) { 3943 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 3944 Diag(diag::err_pch_version_too_old); 3945 return VersionMismatch; 3946 } 3947 3948 // Record that we've loaded this module. 3949 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 3950 return Success; 3951 3952 default: 3953 if (Stream.SkipBlock()) { 3954 Error("malformed block record in AST file"); 3955 return Failure; 3956 } 3957 break; 3958 } 3959 } 3960 3961 return Success; 3962 } 3963 3964 void ASTReader::InitializeContext() { 3965 // If there's a listener, notify them that we "read" the translation unit. 3966 if (DeserializationListener) 3967 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 3968 Context.getTranslationUnitDecl()); 3969 3970 // FIXME: Find a better way to deal with collisions between these 3971 // built-in types. Right now, we just ignore the problem. 3972 3973 // Load the special types. 3974 if (SpecialTypes.size() >= NumSpecialTypeIDs) { 3975 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 3976 if (!Context.CFConstantStringTypeDecl) 3977 Context.setCFConstantStringType(GetType(String)); 3978 } 3979 3980 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 3981 QualType FileType = GetType(File); 3982 if (FileType.isNull()) { 3983 Error("FILE type is NULL"); 3984 return; 3985 } 3986 3987 if (!Context.FILEDecl) { 3988 if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 3989 Context.setFILEDecl(Typedef->getDecl()); 3990 else { 3991 const TagType *Tag = FileType->getAs<TagType>(); 3992 if (!Tag) { 3993 Error("Invalid FILE type in AST file"); 3994 return; 3995 } 3996 Context.setFILEDecl(Tag->getDecl()); 3997 } 3998 } 3999 } 4000 4001 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 4002 QualType Jmp_bufType = GetType(Jmp_buf); 4003 if (Jmp_bufType.isNull()) { 4004 Error("jmp_buf type is NULL"); 4005 return; 4006 } 4007 4008 if (!Context.jmp_bufDecl) { 4009 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 4010 Context.setjmp_bufDecl(Typedef->getDecl()); 4011 else { 4012 const TagType *Tag = Jmp_bufType->getAs<TagType>(); 4013 if (!Tag) { 4014 Error("Invalid jmp_buf type in AST file"); 4015 return; 4016 } 4017 Context.setjmp_bufDecl(Tag->getDecl()); 4018 } 4019 } 4020 } 4021 4022 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 4023 QualType Sigjmp_bufType = GetType(Sigjmp_buf); 4024 if (Sigjmp_bufType.isNull()) { 4025 Error("sigjmp_buf type is NULL"); 4026 return; 4027 } 4028 4029 if (!Context.sigjmp_bufDecl) { 4030 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 4031 Context.setsigjmp_bufDecl(Typedef->getDecl()); 4032 else { 4033 const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 4034 assert(Tag && "Invalid sigjmp_buf type in AST file"); 4035 Context.setsigjmp_bufDecl(Tag->getDecl()); 4036 } 4037 } 4038 } 4039 4040 if (unsigned ObjCIdRedef 4041 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 4042 if (Context.ObjCIdRedefinitionType.isNull()) 4043 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 4044 } 4045 4046 if (unsigned ObjCClassRedef 4047 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 4048 if (Context.ObjCClassRedefinitionType.isNull()) 4049 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 4050 } 4051 4052 if (unsigned ObjCSelRedef 4053 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 4054 if (Context.ObjCSelRedefinitionType.isNull()) 4055 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 4056 } 4057 4058 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 4059 QualType Ucontext_tType = GetType(Ucontext_t); 4060 if (Ucontext_tType.isNull()) { 4061 Error("ucontext_t type is NULL"); 4062 return; 4063 } 4064 4065 if (!Context.ucontext_tDecl) { 4066 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 4067 Context.setucontext_tDecl(Typedef->getDecl()); 4068 else { 4069 const TagType *Tag = Ucontext_tType->getAs<TagType>(); 4070 assert(Tag && "Invalid ucontext_t type in AST file"); 4071 Context.setucontext_tDecl(Tag->getDecl()); 4072 } 4073 } 4074 } 4075 } 4076 4077 ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 4078 4079 // If there were any CUDA special declarations, deserialize them. 4080 if (!CUDASpecialDeclRefs.empty()) { 4081 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 4082 Context.setcudaConfigureCallDecl( 4083 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 4084 } 4085 4086 // Re-export any modules that were imported by a non-module AST file. 4087 // FIXME: This does not make macro-only imports visible again. It also doesn't 4088 // make #includes mapped to module imports visible. 4089 for (auto &Import : ImportedModules) { 4090 if (Module *Imported = getSubmodule(Import.ID)) 4091 makeModuleVisible(Imported, Module::AllVisible, 4092 /*ImportLoc=*/Import.ImportLoc, 4093 /*Complain=*/false); 4094 } 4095 ImportedModules.clear(); 4096 } 4097 4098 void ASTReader::finalizeForWriting() { 4099 while (!HiddenNamesMap.empty()) { 4100 auto HiddenNames = std::move(*HiddenNamesMap.begin()); 4101 HiddenNamesMap.erase(HiddenNamesMap.begin()); 4102 makeNamesVisible(HiddenNames.second, HiddenNames.first, 4103 /*FromFinalization*/true); 4104 } 4105 } 4106 4107 /// \brief Given a cursor at the start of an AST file, scan ahead and drop the 4108 /// cursor into the start of the given block ID, returning false on success and 4109 /// true on failure. 4110 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 4111 while (1) { 4112 llvm::BitstreamEntry Entry = Cursor.advance(); 4113 switch (Entry.Kind) { 4114 case llvm::BitstreamEntry::Error: 4115 case llvm::BitstreamEntry::EndBlock: 4116 return true; 4117 4118 case llvm::BitstreamEntry::Record: 4119 // Ignore top-level records. 4120 Cursor.skipRecord(Entry.ID); 4121 break; 4122 4123 case llvm::BitstreamEntry::SubBlock: 4124 if (Entry.ID == BlockID) { 4125 if (Cursor.EnterSubBlock(BlockID)) 4126 return true; 4127 // Found it! 4128 return false; 4129 } 4130 4131 if (Cursor.SkipBlock()) 4132 return true; 4133 } 4134 } 4135 } 4136 4137 /// \brief Reads and return the signature record from \p StreamFile's control 4138 /// block, or else returns 0. 4139 static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile){ 4140 BitstreamCursor Stream(StreamFile); 4141 if (!startsWithASTFileMagic(Stream)) 4142 return 0; 4143 4144 // Scan for the CONTROL_BLOCK_ID block. 4145 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 4146 return 0; 4147 4148 // Scan for SIGNATURE inside the control block. 4149 ASTReader::RecordData Record; 4150 while (1) { 4151 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 4152 if (Entry.Kind == llvm::BitstreamEntry::EndBlock || 4153 Entry.Kind != llvm::BitstreamEntry::Record) 4154 return 0; 4155 4156 Record.clear(); 4157 StringRef Blob; 4158 if (SIGNATURE == Stream.readRecord(Entry.ID, Record, &Blob)) 4159 return Record[0]; 4160 } 4161 } 4162 4163 /// \brief Retrieve the name of the original source file name 4164 /// directly from the AST file, without actually loading the AST 4165 /// file. 4166 std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName, 4167 FileManager &FileMgr, 4168 DiagnosticsEngine &Diags) { 4169 // Open the AST file. 4170 auto Buffer = FileMgr.getBufferForFile(ASTFileName); 4171 if (!Buffer) { 4172 Diags.Report(diag::err_fe_unable_to_read_pch_file) 4173 << ASTFileName << Buffer.getError().message(); 4174 return std::string(); 4175 } 4176 4177 // Initialize the stream 4178 llvm::BitstreamReader StreamFile; 4179 StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(), 4180 (const unsigned char *)(*Buffer)->getBufferEnd()); 4181 BitstreamCursor Stream(StreamFile); 4182 4183 // Sniff for the signature. 4184 if (!startsWithASTFileMagic(Stream)) { 4185 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName; 4186 return std::string(); 4187 } 4188 4189 // Scan for the CONTROL_BLOCK_ID block. 4190 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 4191 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 4192 return std::string(); 4193 } 4194 4195 // Scan for ORIGINAL_FILE inside the control block. 4196 RecordData Record; 4197 while (1) { 4198 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 4199 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 4200 return std::string(); 4201 4202 if (Entry.Kind != llvm::BitstreamEntry::Record) { 4203 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 4204 return std::string(); 4205 } 4206 4207 Record.clear(); 4208 StringRef Blob; 4209 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE) 4210 return Blob.str(); 4211 } 4212 } 4213 4214 namespace { 4215 class SimplePCHValidator : public ASTReaderListener { 4216 const LangOptions &ExistingLangOpts; 4217 const TargetOptions &ExistingTargetOpts; 4218 const PreprocessorOptions &ExistingPPOpts; 4219 std::string ExistingModuleCachePath; 4220 FileManager &FileMgr; 4221 4222 public: 4223 SimplePCHValidator(const LangOptions &ExistingLangOpts, 4224 const TargetOptions &ExistingTargetOpts, 4225 const PreprocessorOptions &ExistingPPOpts, 4226 StringRef ExistingModuleCachePath, 4227 FileManager &FileMgr) 4228 : ExistingLangOpts(ExistingLangOpts), 4229 ExistingTargetOpts(ExistingTargetOpts), 4230 ExistingPPOpts(ExistingPPOpts), 4231 ExistingModuleCachePath(ExistingModuleCachePath), 4232 FileMgr(FileMgr) 4233 { 4234 } 4235 4236 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, 4237 bool AllowCompatibleDifferences) override { 4238 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr, 4239 AllowCompatibleDifferences); 4240 } 4241 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, 4242 bool AllowCompatibleDifferences) override { 4243 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr, 4244 AllowCompatibleDifferences); 4245 } 4246 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 4247 StringRef SpecificModuleCachePath, 4248 bool Complain) override { 4249 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 4250 ExistingModuleCachePath, 4251 nullptr, ExistingLangOpts); 4252 } 4253 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 4254 bool Complain, 4255 std::string &SuggestedPredefines) override { 4256 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr, 4257 SuggestedPredefines, ExistingLangOpts); 4258 } 4259 }; 4260 } 4261 4262 bool ASTReader::readASTFileControlBlock(StringRef Filename, 4263 FileManager &FileMgr, 4264 ASTReaderListener &Listener) { 4265 // Open the AST file. 4266 // FIXME: This allows use of the VFS; we do not allow use of the 4267 // VFS when actually loading a module. 4268 auto Buffer = FileMgr.getBufferForFile(Filename); 4269 if (!Buffer) { 4270 return true; 4271 } 4272 4273 // Initialize the stream 4274 llvm::BitstreamReader StreamFile; 4275 StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(), 4276 (const unsigned char *)(*Buffer)->getBufferEnd()); 4277 BitstreamCursor Stream(StreamFile); 4278 4279 // Sniff for the signature. 4280 if (!startsWithASTFileMagic(Stream)) 4281 return true; 4282 4283 // Scan for the CONTROL_BLOCK_ID block. 4284 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 4285 return true; 4286 4287 bool NeedsInputFiles = Listener.needsInputFileVisitation(); 4288 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation(); 4289 bool NeedsImports = Listener.needsImportVisitation(); 4290 BitstreamCursor InputFilesCursor; 4291 if (NeedsInputFiles) { 4292 InputFilesCursor = Stream; 4293 if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID)) 4294 return true; 4295 4296 // Read the abbreviations 4297 while (true) { 4298 uint64_t Offset = InputFilesCursor.GetCurrentBitNo(); 4299 unsigned Code = InputFilesCursor.ReadCode(); 4300 4301 // We expect all abbrevs to be at the start of the block. 4302 if (Code != llvm::bitc::DEFINE_ABBREV) { 4303 InputFilesCursor.JumpToBit(Offset); 4304 break; 4305 } 4306 InputFilesCursor.ReadAbbrevRecord(); 4307 } 4308 } 4309 4310 // Scan for ORIGINAL_FILE inside the control block. 4311 RecordData Record; 4312 std::string ModuleDir; 4313 while (1) { 4314 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 4315 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 4316 return false; 4317 4318 if (Entry.Kind != llvm::BitstreamEntry::Record) 4319 return true; 4320 4321 Record.clear(); 4322 StringRef Blob; 4323 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob); 4324 switch ((ControlRecordTypes)RecCode) { 4325 case METADATA: { 4326 if (Record[0] != VERSION_MAJOR) 4327 return true; 4328 4329 if (Listener.ReadFullVersionInformation(Blob)) 4330 return true; 4331 4332 break; 4333 } 4334 case MODULE_NAME: 4335 Listener.ReadModuleName(Blob); 4336 break; 4337 case MODULE_DIRECTORY: 4338 ModuleDir = Blob; 4339 break; 4340 case MODULE_MAP_FILE: { 4341 unsigned Idx = 0; 4342 auto Path = ReadString(Record, Idx); 4343 ResolveImportedPath(Path, ModuleDir); 4344 Listener.ReadModuleMapFile(Path); 4345 break; 4346 } 4347 case LANGUAGE_OPTIONS: 4348 if (ParseLanguageOptions(Record, false, Listener, 4349 /*AllowCompatibleConfigurationMismatch*/false)) 4350 return true; 4351 break; 4352 4353 case TARGET_OPTIONS: 4354 if (ParseTargetOptions(Record, false, Listener, 4355 /*AllowCompatibleConfigurationMismatch*/ false)) 4356 return true; 4357 break; 4358 4359 case DIAGNOSTIC_OPTIONS: 4360 if (ParseDiagnosticOptions(Record, false, Listener)) 4361 return true; 4362 break; 4363 4364 case FILE_SYSTEM_OPTIONS: 4365 if (ParseFileSystemOptions(Record, false, Listener)) 4366 return true; 4367 break; 4368 4369 case HEADER_SEARCH_OPTIONS: 4370 if (ParseHeaderSearchOptions(Record, false, Listener)) 4371 return true; 4372 break; 4373 4374 case PREPROCESSOR_OPTIONS: { 4375 std::string IgnoredSuggestedPredefines; 4376 if (ParsePreprocessorOptions(Record, false, Listener, 4377 IgnoredSuggestedPredefines)) 4378 return true; 4379 break; 4380 } 4381 4382 case INPUT_FILE_OFFSETS: { 4383 if (!NeedsInputFiles) 4384 break; 4385 4386 unsigned NumInputFiles = Record[0]; 4387 unsigned NumUserFiles = Record[1]; 4388 const uint64_t *InputFileOffs = (const uint64_t *)Blob.data(); 4389 for (unsigned I = 0; I != NumInputFiles; ++I) { 4390 // Go find this input file. 4391 bool isSystemFile = I >= NumUserFiles; 4392 4393 if (isSystemFile && !NeedsSystemInputFiles) 4394 break; // the rest are system input files 4395 4396 BitstreamCursor &Cursor = InputFilesCursor; 4397 SavedStreamPosition SavedPosition(Cursor); 4398 Cursor.JumpToBit(InputFileOffs[I]); 4399 4400 unsigned Code = Cursor.ReadCode(); 4401 RecordData Record; 4402 StringRef Blob; 4403 bool shouldContinue = false; 4404 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) { 4405 case INPUT_FILE: 4406 bool Overridden = static_cast<bool>(Record[3]); 4407 std::string Filename = Blob; 4408 ResolveImportedPath(Filename, ModuleDir); 4409 shouldContinue = 4410 Listener.visitInputFile(Filename, isSystemFile, Overridden); 4411 break; 4412 } 4413 if (!shouldContinue) 4414 break; 4415 } 4416 break; 4417 } 4418 4419 case IMPORTS: { 4420 if (!NeedsImports) 4421 break; 4422 4423 unsigned Idx = 0, N = Record.size(); 4424 while (Idx < N) { 4425 // Read information about the AST file. 4426 Idx += 5; // ImportLoc, Size, ModTime, Signature 4427 std::string Filename = ReadString(Record, Idx); 4428 ResolveImportedPath(Filename, ModuleDir); 4429 Listener.visitImport(Filename); 4430 } 4431 break; 4432 } 4433 4434 case KNOWN_MODULE_FILES: { 4435 // Known-but-not-technically-used module files are treated as imports. 4436 if (!NeedsImports) 4437 break; 4438 4439 unsigned Idx = 0, N = Record.size(); 4440 while (Idx < N) { 4441 std::string Filename = ReadString(Record, Idx); 4442 ResolveImportedPath(Filename, ModuleDir); 4443 Listener.visitImport(Filename); 4444 } 4445 break; 4446 } 4447 4448 default: 4449 // No other validation to perform. 4450 break; 4451 } 4452 } 4453 } 4454 4455 4456 bool ASTReader::isAcceptableASTFile(StringRef Filename, 4457 FileManager &FileMgr, 4458 const LangOptions &LangOpts, 4459 const TargetOptions &TargetOpts, 4460 const PreprocessorOptions &PPOpts, 4461 std::string ExistingModuleCachePath) { 4462 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, 4463 ExistingModuleCachePath, FileMgr); 4464 return !readASTFileControlBlock(Filename, FileMgr, validator); 4465 } 4466 4467 ASTReader::ASTReadResult 4468 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 4469 // Enter the submodule block. 4470 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) { 4471 Error("malformed submodule block record in AST file"); 4472 return Failure; 4473 } 4474 4475 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 4476 bool First = true; 4477 Module *CurrentModule = nullptr; 4478 RecordData Record; 4479 while (true) { 4480 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks(); 4481 4482 switch (Entry.Kind) { 4483 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 4484 case llvm::BitstreamEntry::Error: 4485 Error("malformed block record in AST file"); 4486 return Failure; 4487 case llvm::BitstreamEntry::EndBlock: 4488 return Success; 4489 case llvm::BitstreamEntry::Record: 4490 // The interesting case. 4491 break; 4492 } 4493 4494 // Read a record. 4495 StringRef Blob; 4496 Record.clear(); 4497 auto Kind = F.Stream.readRecord(Entry.ID, Record, &Blob); 4498 4499 if ((Kind == SUBMODULE_METADATA) != First) { 4500 Error("submodule metadata record should be at beginning of block"); 4501 return Failure; 4502 } 4503 First = false; 4504 4505 // Submodule information is only valid if we have a current module. 4506 // FIXME: Should we error on these cases? 4507 if (!CurrentModule && Kind != SUBMODULE_METADATA && 4508 Kind != SUBMODULE_DEFINITION) 4509 continue; 4510 4511 switch (Kind) { 4512 default: // Default behavior: ignore. 4513 break; 4514 4515 case SUBMODULE_DEFINITION: { 4516 if (Record.size() < 8) { 4517 Error("malformed module definition"); 4518 return Failure; 4519 } 4520 4521 StringRef Name = Blob; 4522 unsigned Idx = 0; 4523 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]); 4524 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]); 4525 bool IsFramework = Record[Idx++]; 4526 bool IsExplicit = Record[Idx++]; 4527 bool IsSystem = Record[Idx++]; 4528 bool IsExternC = Record[Idx++]; 4529 bool InferSubmodules = Record[Idx++]; 4530 bool InferExplicitSubmodules = Record[Idx++]; 4531 bool InferExportWildcard = Record[Idx++]; 4532 bool ConfigMacrosExhaustive = Record[Idx++]; 4533 4534 Module *ParentModule = nullptr; 4535 if (Parent) 4536 ParentModule = getSubmodule(Parent); 4537 4538 // Retrieve this (sub)module from the module map, creating it if 4539 // necessary. 4540 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, IsFramework, 4541 IsExplicit).first; 4542 4543 // FIXME: set the definition loc for CurrentModule, or call 4544 // ModMap.setInferredModuleAllowedBy() 4545 4546 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 4547 if (GlobalIndex >= SubmodulesLoaded.size() || 4548 SubmodulesLoaded[GlobalIndex]) { 4549 Error("too many submodules"); 4550 return Failure; 4551 } 4552 4553 if (!ParentModule) { 4554 if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 4555 if (CurFile != F.File) { 4556 if (!Diags.isDiagnosticInFlight()) { 4557 Diag(diag::err_module_file_conflict) 4558 << CurrentModule->getTopLevelModuleName() 4559 << CurFile->getName() 4560 << F.File->getName(); 4561 } 4562 return Failure; 4563 } 4564 } 4565 4566 CurrentModule->setASTFile(F.File); 4567 } 4568 4569 CurrentModule->IsFromModuleFile = true; 4570 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 4571 CurrentModule->IsExternC = IsExternC; 4572 CurrentModule->InferSubmodules = InferSubmodules; 4573 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 4574 CurrentModule->InferExportWildcard = InferExportWildcard; 4575 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive; 4576 if (DeserializationListener) 4577 DeserializationListener->ModuleRead(GlobalID, CurrentModule); 4578 4579 SubmodulesLoaded[GlobalIndex] = CurrentModule; 4580 4581 // Clear out data that will be replaced by what is the module file. 4582 CurrentModule->LinkLibraries.clear(); 4583 CurrentModule->ConfigMacros.clear(); 4584 CurrentModule->UnresolvedConflicts.clear(); 4585 CurrentModule->Conflicts.clear(); 4586 break; 4587 } 4588 4589 case SUBMODULE_UMBRELLA_HEADER: { 4590 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) { 4591 if (!CurrentModule->getUmbrellaHeader()) 4592 ModMap.setUmbrellaHeader(CurrentModule, Umbrella); 4593 else if (CurrentModule->getUmbrellaHeader() != Umbrella) { 4594 // This can be a spurious difference caused by changing the VFS to 4595 // point to a different copy of the file, and it is too late to 4596 // to rebuild safely. 4597 // FIXME: If we wrote the virtual paths instead of the 'real' paths, 4598 // after input file validation only real problems would remain and we 4599 // could just error. For now, assume it's okay. 4600 break; 4601 } 4602 } 4603 break; 4604 } 4605 4606 case SUBMODULE_HEADER: 4607 case SUBMODULE_EXCLUDED_HEADER: 4608 case SUBMODULE_PRIVATE_HEADER: 4609 // We lazily associate headers with their modules via the HeaderInfo table. 4610 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 4611 // of complete filenames or remove it entirely. 4612 break; 4613 4614 case SUBMODULE_TEXTUAL_HEADER: 4615 case SUBMODULE_PRIVATE_TEXTUAL_HEADER: 4616 // FIXME: Textual headers are not marked in the HeaderInfo table. Load 4617 // them here. 4618 break; 4619 4620 case SUBMODULE_TOPHEADER: { 4621 CurrentModule->addTopHeaderFilename(Blob); 4622 break; 4623 } 4624 4625 case SUBMODULE_UMBRELLA_DIR: { 4626 if (const DirectoryEntry *Umbrella 4627 = PP.getFileManager().getDirectory(Blob)) { 4628 if (!CurrentModule->getUmbrellaDir()) 4629 ModMap.setUmbrellaDir(CurrentModule, Umbrella); 4630 else if (CurrentModule->getUmbrellaDir() != Umbrella) { 4631 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 4632 Error("mismatched umbrella directories in submodule"); 4633 return OutOfDate; 4634 } 4635 } 4636 break; 4637 } 4638 4639 case SUBMODULE_METADATA: { 4640 F.BaseSubmoduleID = getTotalNumSubmodules(); 4641 F.LocalNumSubmodules = Record[0]; 4642 unsigned LocalBaseSubmoduleID = Record[1]; 4643 if (F.LocalNumSubmodules > 0) { 4644 // Introduce the global -> local mapping for submodules within this 4645 // module. 4646 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 4647 4648 // Introduce the local -> global mapping for submodules within this 4649 // module. 4650 F.SubmoduleRemap.insertOrReplace( 4651 std::make_pair(LocalBaseSubmoduleID, 4652 F.BaseSubmoduleID - LocalBaseSubmoduleID)); 4653 4654 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 4655 } 4656 break; 4657 } 4658 4659 case SUBMODULE_IMPORTS: { 4660 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 4661 UnresolvedModuleRef Unresolved; 4662 Unresolved.File = &F; 4663 Unresolved.Mod = CurrentModule; 4664 Unresolved.ID = Record[Idx]; 4665 Unresolved.Kind = UnresolvedModuleRef::Import; 4666 Unresolved.IsWildcard = false; 4667 UnresolvedModuleRefs.push_back(Unresolved); 4668 } 4669 break; 4670 } 4671 4672 case SUBMODULE_EXPORTS: { 4673 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 4674 UnresolvedModuleRef Unresolved; 4675 Unresolved.File = &F; 4676 Unresolved.Mod = CurrentModule; 4677 Unresolved.ID = Record[Idx]; 4678 Unresolved.Kind = UnresolvedModuleRef::Export; 4679 Unresolved.IsWildcard = Record[Idx + 1]; 4680 UnresolvedModuleRefs.push_back(Unresolved); 4681 } 4682 4683 // Once we've loaded the set of exports, there's no reason to keep 4684 // the parsed, unresolved exports around. 4685 CurrentModule->UnresolvedExports.clear(); 4686 break; 4687 } 4688 case SUBMODULE_REQUIRES: { 4689 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(), 4690 Context.getTargetInfo()); 4691 break; 4692 } 4693 4694 case SUBMODULE_LINK_LIBRARY: 4695 CurrentModule->LinkLibraries.push_back( 4696 Module::LinkLibrary(Blob, Record[0])); 4697 break; 4698 4699 case SUBMODULE_CONFIG_MACRO: 4700 CurrentModule->ConfigMacros.push_back(Blob.str()); 4701 break; 4702 4703 case SUBMODULE_CONFLICT: { 4704 UnresolvedModuleRef Unresolved; 4705 Unresolved.File = &F; 4706 Unresolved.Mod = CurrentModule; 4707 Unresolved.ID = Record[0]; 4708 Unresolved.Kind = UnresolvedModuleRef::Conflict; 4709 Unresolved.IsWildcard = false; 4710 Unresolved.String = Blob; 4711 UnresolvedModuleRefs.push_back(Unresolved); 4712 break; 4713 } 4714 } 4715 } 4716 } 4717 4718 /// \brief Parse the record that corresponds to a LangOptions data 4719 /// structure. 4720 /// 4721 /// This routine parses the language options from the AST file and then gives 4722 /// them to the AST listener if one is set. 4723 /// 4724 /// \returns true if the listener deems the file unacceptable, false otherwise. 4725 bool ASTReader::ParseLanguageOptions(const RecordData &Record, 4726 bool Complain, 4727 ASTReaderListener &Listener, 4728 bool AllowCompatibleDifferences) { 4729 LangOptions LangOpts; 4730 unsigned Idx = 0; 4731 #define LANGOPT(Name, Bits, Default, Description) \ 4732 LangOpts.Name = Record[Idx++]; 4733 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 4734 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 4735 #include "clang/Basic/LangOptions.def" 4736 #define SANITIZER(NAME, ID) \ 4737 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]); 4738 #include "clang/Basic/Sanitizers.def" 4739 4740 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 4741 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 4742 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 4743 4744 unsigned Length = Record[Idx++]; 4745 LangOpts.CurrentModule.assign(Record.begin() + Idx, 4746 Record.begin() + Idx + Length); 4747 4748 Idx += Length; 4749 4750 // Comment options. 4751 for (unsigned N = Record[Idx++]; N; --N) { 4752 LangOpts.CommentOpts.BlockCommandNames.push_back( 4753 ReadString(Record, Idx)); 4754 } 4755 LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 4756 4757 return Listener.ReadLanguageOptions(LangOpts, Complain, 4758 AllowCompatibleDifferences); 4759 } 4760 4761 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain, 4762 ASTReaderListener &Listener, 4763 bool AllowCompatibleDifferences) { 4764 unsigned Idx = 0; 4765 TargetOptions TargetOpts; 4766 TargetOpts.Triple = ReadString(Record, Idx); 4767 TargetOpts.CPU = ReadString(Record, Idx); 4768 TargetOpts.ABI = ReadString(Record, Idx); 4769 for (unsigned N = Record[Idx++]; N; --N) { 4770 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 4771 } 4772 for (unsigned N = Record[Idx++]; N; --N) { 4773 TargetOpts.Features.push_back(ReadString(Record, Idx)); 4774 } 4775 4776 return Listener.ReadTargetOptions(TargetOpts, Complain, 4777 AllowCompatibleDifferences); 4778 } 4779 4780 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 4781 ASTReaderListener &Listener) { 4782 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); 4783 unsigned Idx = 0; 4784 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++]; 4785 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 4786 DiagOpts->set##Name(static_cast<Type>(Record[Idx++])); 4787 #include "clang/Basic/DiagnosticOptions.def" 4788 4789 for (unsigned N = Record[Idx++]; N; --N) 4790 DiagOpts->Warnings.push_back(ReadString(Record, Idx)); 4791 for (unsigned N = Record[Idx++]; N; --N) 4792 DiagOpts->Remarks.push_back(ReadString(Record, Idx)); 4793 4794 return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 4795 } 4796 4797 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 4798 ASTReaderListener &Listener) { 4799 FileSystemOptions FSOpts; 4800 unsigned Idx = 0; 4801 FSOpts.WorkingDir = ReadString(Record, Idx); 4802 return Listener.ReadFileSystemOptions(FSOpts, Complain); 4803 } 4804 4805 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 4806 bool Complain, 4807 ASTReaderListener &Listener) { 4808 HeaderSearchOptions HSOpts; 4809 unsigned Idx = 0; 4810 HSOpts.Sysroot = ReadString(Record, Idx); 4811 4812 // Include entries. 4813 for (unsigned N = Record[Idx++]; N; --N) { 4814 std::string Path = ReadString(Record, Idx); 4815 frontend::IncludeDirGroup Group 4816 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 4817 bool IsFramework = Record[Idx++]; 4818 bool IgnoreSysRoot = Record[Idx++]; 4819 HSOpts.UserEntries.push_back( 4820 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot)); 4821 } 4822 4823 // System header prefixes. 4824 for (unsigned N = Record[Idx++]; N; --N) { 4825 std::string Prefix = ReadString(Record, Idx); 4826 bool IsSystemHeader = Record[Idx++]; 4827 HSOpts.SystemHeaderPrefixes.push_back( 4828 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader)); 4829 } 4830 4831 HSOpts.ResourceDir = ReadString(Record, Idx); 4832 HSOpts.ModuleCachePath = ReadString(Record, Idx); 4833 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx); 4834 HSOpts.DisableModuleHash = Record[Idx++]; 4835 HSOpts.UseBuiltinIncludes = Record[Idx++]; 4836 HSOpts.UseStandardSystemIncludes = Record[Idx++]; 4837 HSOpts.UseStandardCXXIncludes = Record[Idx++]; 4838 HSOpts.UseLibcxx = Record[Idx++]; 4839 std::string SpecificModuleCachePath = ReadString(Record, Idx); 4840 4841 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 4842 Complain); 4843 } 4844 4845 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 4846 bool Complain, 4847 ASTReaderListener &Listener, 4848 std::string &SuggestedPredefines) { 4849 PreprocessorOptions PPOpts; 4850 unsigned Idx = 0; 4851 4852 // Macro definitions/undefs 4853 for (unsigned N = Record[Idx++]; N; --N) { 4854 std::string Macro = ReadString(Record, Idx); 4855 bool IsUndef = Record[Idx++]; 4856 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 4857 } 4858 4859 // Includes 4860 for (unsigned N = Record[Idx++]; N; --N) { 4861 PPOpts.Includes.push_back(ReadString(Record, Idx)); 4862 } 4863 4864 // Macro Includes 4865 for (unsigned N = Record[Idx++]; N; --N) { 4866 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 4867 } 4868 4869 PPOpts.UsePredefines = Record[Idx++]; 4870 PPOpts.DetailedRecord = Record[Idx++]; 4871 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 4872 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx); 4873 PPOpts.ObjCXXARCStandardLibrary = 4874 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 4875 SuggestedPredefines.clear(); 4876 return Listener.ReadPreprocessorOptions(PPOpts, Complain, 4877 SuggestedPredefines); 4878 } 4879 4880 std::pair<ModuleFile *, unsigned> 4881 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 4882 GlobalPreprocessedEntityMapType::iterator 4883 I = GlobalPreprocessedEntityMap.find(GlobalIndex); 4884 assert(I != GlobalPreprocessedEntityMap.end() && 4885 "Corrupted global preprocessed entity map"); 4886 ModuleFile *M = I->second; 4887 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 4888 return std::make_pair(M, LocalIndex); 4889 } 4890 4891 llvm::iterator_range<PreprocessingRecord::iterator> 4892 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 4893 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 4894 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 4895 Mod.NumPreprocessedEntities); 4896 4897 return llvm::make_range(PreprocessingRecord::iterator(), 4898 PreprocessingRecord::iterator()); 4899 } 4900 4901 llvm::iterator_range<ASTReader::ModuleDeclIterator> 4902 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 4903 return llvm::make_range( 4904 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 4905 ModuleDeclIterator(this, &Mod, 4906 Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 4907 } 4908 4909 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 4910 PreprocessedEntityID PPID = Index+1; 4911 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 4912 ModuleFile &M = *PPInfo.first; 4913 unsigned LocalIndex = PPInfo.second; 4914 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 4915 4916 if (!PP.getPreprocessingRecord()) { 4917 Error("no preprocessing record"); 4918 return nullptr; 4919 } 4920 4921 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 4922 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset); 4923 4924 llvm::BitstreamEntry Entry = 4925 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 4926 if (Entry.Kind != llvm::BitstreamEntry::Record) 4927 return nullptr; 4928 4929 // Read the record. 4930 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin), 4931 ReadSourceLocation(M, PPOffs.End)); 4932 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 4933 StringRef Blob; 4934 RecordData Record; 4935 PreprocessorDetailRecordTypes RecType = 4936 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord( 4937 Entry.ID, Record, &Blob); 4938 switch (RecType) { 4939 case PPD_MACRO_EXPANSION: { 4940 bool isBuiltin = Record[0]; 4941 IdentifierInfo *Name = nullptr; 4942 MacroDefinition *Def = nullptr; 4943 if (isBuiltin) 4944 Name = getLocalIdentifier(M, Record[1]); 4945 else { 4946 PreprocessedEntityID 4947 GlobalID = getGlobalPreprocessedEntityID(M, Record[1]); 4948 Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1)); 4949 } 4950 4951 MacroExpansion *ME; 4952 if (isBuiltin) 4953 ME = new (PPRec) MacroExpansion(Name, Range); 4954 else 4955 ME = new (PPRec) MacroExpansion(Def, Range); 4956 4957 return ME; 4958 } 4959 4960 case PPD_MACRO_DEFINITION: { 4961 // Decode the identifier info and then check again; if the macro is 4962 // still defined and associated with the identifier, 4963 IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 4964 MacroDefinition *MD 4965 = new (PPRec) MacroDefinition(II, Range); 4966 4967 if (DeserializationListener) 4968 DeserializationListener->MacroDefinitionRead(PPID, MD); 4969 4970 return MD; 4971 } 4972 4973 case PPD_INCLUSION_DIRECTIVE: { 4974 const char *FullFileNameStart = Blob.data() + Record[0]; 4975 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 4976 const FileEntry *File = nullptr; 4977 if (!FullFileName.empty()) 4978 File = PP.getFileManager().getFile(FullFileName); 4979 4980 // FIXME: Stable encoding 4981 InclusionDirective::InclusionKind Kind 4982 = static_cast<InclusionDirective::InclusionKind>(Record[2]); 4983 InclusionDirective *ID 4984 = new (PPRec) InclusionDirective(PPRec, Kind, 4985 StringRef(Blob.data(), Record[0]), 4986 Record[1], Record[3], 4987 File, 4988 Range); 4989 return ID; 4990 } 4991 } 4992 4993 llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 4994 } 4995 4996 /// \brief \arg SLocMapI points at a chunk of a module that contains no 4997 /// preprocessed entities or the entities it contains are not the ones we are 4998 /// looking for. Find the next module that contains entities and return the ID 4999 /// of the first entry. 5000 PreprocessedEntityID ASTReader::findNextPreprocessedEntity( 5001 GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 5002 ++SLocMapI; 5003 for (GlobalSLocOffsetMapType::const_iterator 5004 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 5005 ModuleFile &M = *SLocMapI->second; 5006 if (M.NumPreprocessedEntities) 5007 return M.BasePreprocessedEntityID; 5008 } 5009 5010 return getTotalNumPreprocessedEntities(); 5011 } 5012 5013 namespace { 5014 5015 template <unsigned PPEntityOffset::*PPLoc> 5016 struct PPEntityComp { 5017 const ASTReader &Reader; 5018 ModuleFile &M; 5019 5020 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { } 5021 5022 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 5023 SourceLocation LHS = getLoc(L); 5024 SourceLocation RHS = getLoc(R); 5025 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5026 } 5027 5028 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 5029 SourceLocation LHS = getLoc(L); 5030 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5031 } 5032 5033 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 5034 SourceLocation RHS = getLoc(R); 5035 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5036 } 5037 5038 SourceLocation getLoc(const PPEntityOffset &PPE) const { 5039 return Reader.ReadSourceLocation(M, PPE.*PPLoc); 5040 } 5041 }; 5042 5043 } 5044 5045 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc, 5046 bool EndsAfter) const { 5047 if (SourceMgr.isLocalSourceLocation(Loc)) 5048 return getTotalNumPreprocessedEntities(); 5049 5050 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find( 5051 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1); 5052 assert(SLocMapI != GlobalSLocOffsetMap.end() && 5053 "Corrupted global sloc offset map"); 5054 5055 if (SLocMapI->second->NumPreprocessedEntities == 0) 5056 return findNextPreprocessedEntity(SLocMapI); 5057 5058 ModuleFile &M = *SLocMapI->second; 5059 typedef const PPEntityOffset *pp_iterator; 5060 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 5061 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 5062 5063 size_t Count = M.NumPreprocessedEntities; 5064 size_t Half; 5065 pp_iterator First = pp_begin; 5066 pp_iterator PPI; 5067 5068 if (EndsAfter) { 5069 PPI = std::upper_bound(pp_begin, pp_end, Loc, 5070 PPEntityComp<&PPEntityOffset::Begin>(*this, M)); 5071 } else { 5072 // Do a binary search manually instead of using std::lower_bound because 5073 // The end locations of entities may be unordered (when a macro expansion 5074 // is inside another macro argument), but for this case it is not important 5075 // whether we get the first macro expansion or its containing macro. 5076 while (Count > 0) { 5077 Half = Count / 2; 5078 PPI = First; 5079 std::advance(PPI, Half); 5080 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End), 5081 Loc)) { 5082 First = PPI; 5083 ++First; 5084 Count = Count - Half - 1; 5085 } else 5086 Count = Half; 5087 } 5088 } 5089 5090 if (PPI == pp_end) 5091 return findNextPreprocessedEntity(SLocMapI); 5092 5093 return M.BasePreprocessedEntityID + (PPI - pp_begin); 5094 } 5095 5096 /// \brief Returns a pair of [Begin, End) indices of preallocated 5097 /// preprocessed entities that \arg Range encompasses. 5098 std::pair<unsigned, unsigned> 5099 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 5100 if (Range.isInvalid()) 5101 return std::make_pair(0,0); 5102 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 5103 5104 PreprocessedEntityID BeginID = 5105 findPreprocessedEntity(Range.getBegin(), false); 5106 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true); 5107 return std::make_pair(BeginID, EndID); 5108 } 5109 5110 /// \brief Optionally returns true or false if the preallocated preprocessed 5111 /// entity with index \arg Index came from file \arg FID. 5112 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 5113 FileID FID) { 5114 if (FID.isInvalid()) 5115 return false; 5116 5117 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 5118 ModuleFile &M = *PPInfo.first; 5119 unsigned LocalIndex = PPInfo.second; 5120 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 5121 5122 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin); 5123 if (Loc.isInvalid()) 5124 return false; 5125 5126 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 5127 return true; 5128 else 5129 return false; 5130 } 5131 5132 namespace { 5133 /// \brief Visitor used to search for information about a header file. 5134 class HeaderFileInfoVisitor { 5135 const FileEntry *FE; 5136 5137 Optional<HeaderFileInfo> HFI; 5138 5139 public: 5140 explicit HeaderFileInfoVisitor(const FileEntry *FE) 5141 : FE(FE) { } 5142 5143 static bool visit(ModuleFile &M, void *UserData) { 5144 HeaderFileInfoVisitor *This 5145 = static_cast<HeaderFileInfoVisitor *>(UserData); 5146 5147 HeaderFileInfoLookupTable *Table 5148 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 5149 if (!Table) 5150 return false; 5151 5152 // Look in the on-disk hash table for an entry for this file name. 5153 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE); 5154 if (Pos == Table->end()) 5155 return false; 5156 5157 This->HFI = *Pos; 5158 return true; 5159 } 5160 5161 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 5162 }; 5163 } 5164 5165 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 5166 HeaderFileInfoVisitor Visitor(FE); 5167 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor); 5168 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 5169 return *HFI; 5170 5171 return HeaderFileInfo(); 5172 } 5173 5174 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 5175 // FIXME: Make it work properly with modules. 5176 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates; 5177 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) { 5178 ModuleFile &F = *(*I); 5179 unsigned Idx = 0; 5180 DiagStates.clear(); 5181 assert(!Diag.DiagStates.empty()); 5182 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one. 5183 while (Idx < F.PragmaDiagMappings.size()) { 5184 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 5185 unsigned DiagStateID = F.PragmaDiagMappings[Idx++]; 5186 if (DiagStateID != 0) { 5187 Diag.DiagStatePoints.push_back( 5188 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1], 5189 FullSourceLoc(Loc, SourceMgr))); 5190 continue; 5191 } 5192 5193 assert(DiagStateID == 0); 5194 // A new DiagState was created here. 5195 Diag.DiagStates.push_back(*Diag.GetCurDiagState()); 5196 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back(); 5197 DiagStates.push_back(NewState); 5198 Diag.DiagStatePoints.push_back( 5199 DiagnosticsEngine::DiagStatePoint(NewState, 5200 FullSourceLoc(Loc, SourceMgr))); 5201 while (1) { 5202 assert(Idx < F.PragmaDiagMappings.size() && 5203 "Invalid data, didn't find '-1' marking end of diag/map pairs"); 5204 if (Idx >= F.PragmaDiagMappings.size()) { 5205 break; // Something is messed up but at least avoid infinite loop in 5206 // release build. 5207 } 5208 unsigned DiagID = F.PragmaDiagMappings[Idx++]; 5209 if (DiagID == (unsigned)-1) { 5210 break; // no more diag/map pairs for this location. 5211 } 5212 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++]; 5213 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc); 5214 Diag.GetCurDiagState()->setMapping(DiagID, Mapping); 5215 } 5216 } 5217 } 5218 } 5219 5220 /// \brief Get the correct cursor and offset for loading a type. 5221 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 5222 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 5223 assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 5224 ModuleFile *M = I->second; 5225 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]); 5226 } 5227 5228 /// \brief Read and return the type with the given index.. 5229 /// 5230 /// The index is the type ID, shifted and minus the number of predefs. This 5231 /// routine actually reads the record corresponding to the type at the given 5232 /// location. It is a helper routine for GetType, which deals with reading type 5233 /// IDs. 5234 QualType ASTReader::readTypeRecord(unsigned Index) { 5235 RecordLocation Loc = TypeCursorForIndex(Index); 5236 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 5237 5238 // Keep track of where we are in the stream, then jump back there 5239 // after reading this type. 5240 SavedStreamPosition SavedPosition(DeclsCursor); 5241 5242 ReadingKindTracker ReadingKind(Read_Type, *this); 5243 5244 // Note that we are loading a type record. 5245 Deserializing AType(this); 5246 5247 unsigned Idx = 0; 5248 DeclsCursor.JumpToBit(Loc.Offset); 5249 RecordData Record; 5250 unsigned Code = DeclsCursor.ReadCode(); 5251 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) { 5252 case TYPE_EXT_QUAL: { 5253 if (Record.size() != 2) { 5254 Error("Incorrect encoding of extended qualifier type"); 5255 return QualType(); 5256 } 5257 QualType Base = readType(*Loc.F, Record, Idx); 5258 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]); 5259 return Context.getQualifiedType(Base, Quals); 5260 } 5261 5262 case TYPE_COMPLEX: { 5263 if (Record.size() != 1) { 5264 Error("Incorrect encoding of complex type"); 5265 return QualType(); 5266 } 5267 QualType ElemType = readType(*Loc.F, Record, Idx); 5268 return Context.getComplexType(ElemType); 5269 } 5270 5271 case TYPE_POINTER: { 5272 if (Record.size() != 1) { 5273 Error("Incorrect encoding of pointer type"); 5274 return QualType(); 5275 } 5276 QualType PointeeType = readType(*Loc.F, Record, Idx); 5277 return Context.getPointerType(PointeeType); 5278 } 5279 5280 case TYPE_DECAYED: { 5281 if (Record.size() != 1) { 5282 Error("Incorrect encoding of decayed type"); 5283 return QualType(); 5284 } 5285 QualType OriginalType = readType(*Loc.F, Record, Idx); 5286 QualType DT = Context.getAdjustedParameterType(OriginalType); 5287 if (!isa<DecayedType>(DT)) 5288 Error("Decayed type does not decay"); 5289 return DT; 5290 } 5291 5292 case TYPE_ADJUSTED: { 5293 if (Record.size() != 2) { 5294 Error("Incorrect encoding of adjusted type"); 5295 return QualType(); 5296 } 5297 QualType OriginalTy = readType(*Loc.F, Record, Idx); 5298 QualType AdjustedTy = readType(*Loc.F, Record, Idx); 5299 return Context.getAdjustedType(OriginalTy, AdjustedTy); 5300 } 5301 5302 case TYPE_BLOCK_POINTER: { 5303 if (Record.size() != 1) { 5304 Error("Incorrect encoding of block pointer type"); 5305 return QualType(); 5306 } 5307 QualType PointeeType = readType(*Loc.F, Record, Idx); 5308 return Context.getBlockPointerType(PointeeType); 5309 } 5310 5311 case TYPE_LVALUE_REFERENCE: { 5312 if (Record.size() != 2) { 5313 Error("Incorrect encoding of lvalue reference type"); 5314 return QualType(); 5315 } 5316 QualType PointeeType = readType(*Loc.F, Record, Idx); 5317 return Context.getLValueReferenceType(PointeeType, Record[1]); 5318 } 5319 5320 case TYPE_RVALUE_REFERENCE: { 5321 if (Record.size() != 1) { 5322 Error("Incorrect encoding of rvalue reference type"); 5323 return QualType(); 5324 } 5325 QualType PointeeType = readType(*Loc.F, Record, Idx); 5326 return Context.getRValueReferenceType(PointeeType); 5327 } 5328 5329 case TYPE_MEMBER_POINTER: { 5330 if (Record.size() != 2) { 5331 Error("Incorrect encoding of member pointer type"); 5332 return QualType(); 5333 } 5334 QualType PointeeType = readType(*Loc.F, Record, Idx); 5335 QualType ClassType = readType(*Loc.F, Record, Idx); 5336 if (PointeeType.isNull() || ClassType.isNull()) 5337 return QualType(); 5338 5339 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr()); 5340 } 5341 5342 case TYPE_CONSTANT_ARRAY: { 5343 QualType ElementType = readType(*Loc.F, Record, Idx); 5344 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 5345 unsigned IndexTypeQuals = Record[2]; 5346 unsigned Idx = 3; 5347 llvm::APInt Size = ReadAPInt(Record, Idx); 5348 return Context.getConstantArrayType(ElementType, Size, 5349 ASM, IndexTypeQuals); 5350 } 5351 5352 case TYPE_INCOMPLETE_ARRAY: { 5353 QualType ElementType = readType(*Loc.F, Record, Idx); 5354 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 5355 unsigned IndexTypeQuals = Record[2]; 5356 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals); 5357 } 5358 5359 case TYPE_VARIABLE_ARRAY: { 5360 QualType ElementType = readType(*Loc.F, Record, Idx); 5361 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 5362 unsigned IndexTypeQuals = Record[2]; 5363 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]); 5364 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]); 5365 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F), 5366 ASM, IndexTypeQuals, 5367 SourceRange(LBLoc, RBLoc)); 5368 } 5369 5370 case TYPE_VECTOR: { 5371 if (Record.size() != 3) { 5372 Error("incorrect encoding of vector type in AST file"); 5373 return QualType(); 5374 } 5375 5376 QualType ElementType = readType(*Loc.F, Record, Idx); 5377 unsigned NumElements = Record[1]; 5378 unsigned VecKind = Record[2]; 5379 return Context.getVectorType(ElementType, NumElements, 5380 (VectorType::VectorKind)VecKind); 5381 } 5382 5383 case TYPE_EXT_VECTOR: { 5384 if (Record.size() != 3) { 5385 Error("incorrect encoding of extended vector type in AST file"); 5386 return QualType(); 5387 } 5388 5389 QualType ElementType = readType(*Loc.F, Record, Idx); 5390 unsigned NumElements = Record[1]; 5391 return Context.getExtVectorType(ElementType, NumElements); 5392 } 5393 5394 case TYPE_FUNCTION_NO_PROTO: { 5395 if (Record.size() != 6) { 5396 Error("incorrect encoding of no-proto function type"); 5397 return QualType(); 5398 } 5399 QualType ResultType = readType(*Loc.F, Record, Idx); 5400 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3], 5401 (CallingConv)Record[4], Record[5]); 5402 return Context.getFunctionNoProtoType(ResultType, Info); 5403 } 5404 5405 case TYPE_FUNCTION_PROTO: { 5406 QualType ResultType = readType(*Loc.F, Record, Idx); 5407 5408 FunctionProtoType::ExtProtoInfo EPI; 5409 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1], 5410 /*hasregparm*/ Record[2], 5411 /*regparm*/ Record[3], 5412 static_cast<CallingConv>(Record[4]), 5413 /*produces*/ Record[5]); 5414 5415 unsigned Idx = 6; 5416 5417 EPI.Variadic = Record[Idx++]; 5418 EPI.HasTrailingReturn = Record[Idx++]; 5419 EPI.TypeQuals = Record[Idx++]; 5420 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]); 5421 SmallVector<QualType, 8> ExceptionStorage; 5422 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx); 5423 5424 unsigned NumParams = Record[Idx++]; 5425 SmallVector<QualType, 16> ParamTypes; 5426 for (unsigned I = 0; I != NumParams; ++I) 5427 ParamTypes.push_back(readType(*Loc.F, Record, Idx)); 5428 5429 return Context.getFunctionType(ResultType, ParamTypes, EPI); 5430 } 5431 5432 case TYPE_UNRESOLVED_USING: { 5433 unsigned Idx = 0; 5434 return Context.getTypeDeclType( 5435 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx)); 5436 } 5437 5438 case TYPE_TYPEDEF: { 5439 if (Record.size() != 2) { 5440 Error("incorrect encoding of typedef type"); 5441 return QualType(); 5442 } 5443 unsigned Idx = 0; 5444 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx); 5445 QualType Canonical = readType(*Loc.F, Record, Idx); 5446 if (!Canonical.isNull()) 5447 Canonical = Context.getCanonicalType(Canonical); 5448 return Context.getTypedefType(Decl, Canonical); 5449 } 5450 5451 case TYPE_TYPEOF_EXPR: 5452 return Context.getTypeOfExprType(ReadExpr(*Loc.F)); 5453 5454 case TYPE_TYPEOF: { 5455 if (Record.size() != 1) { 5456 Error("incorrect encoding of typeof(type) in AST file"); 5457 return QualType(); 5458 } 5459 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 5460 return Context.getTypeOfType(UnderlyingType); 5461 } 5462 5463 case TYPE_DECLTYPE: { 5464 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 5465 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType); 5466 } 5467 5468 case TYPE_UNARY_TRANSFORM: { 5469 QualType BaseType = readType(*Loc.F, Record, Idx); 5470 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 5471 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2]; 5472 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind); 5473 } 5474 5475 case TYPE_AUTO: { 5476 QualType Deduced = readType(*Loc.F, Record, Idx); 5477 bool IsDecltypeAuto = Record[Idx++]; 5478 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false; 5479 return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent); 5480 } 5481 5482 case TYPE_RECORD: { 5483 if (Record.size() != 2) { 5484 Error("incorrect encoding of record type"); 5485 return QualType(); 5486 } 5487 unsigned Idx = 0; 5488 bool IsDependent = Record[Idx++]; 5489 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx); 5490 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl()); 5491 QualType T = Context.getRecordType(RD); 5492 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 5493 return T; 5494 } 5495 5496 case TYPE_ENUM: { 5497 if (Record.size() != 2) { 5498 Error("incorrect encoding of enum type"); 5499 return QualType(); 5500 } 5501 unsigned Idx = 0; 5502 bool IsDependent = Record[Idx++]; 5503 QualType T 5504 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx)); 5505 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 5506 return T; 5507 } 5508 5509 case TYPE_ATTRIBUTED: { 5510 if (Record.size() != 3) { 5511 Error("incorrect encoding of attributed type"); 5512 return QualType(); 5513 } 5514 QualType modifiedType = readType(*Loc.F, Record, Idx); 5515 QualType equivalentType = readType(*Loc.F, Record, Idx); 5516 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]); 5517 return Context.getAttributedType(kind, modifiedType, equivalentType); 5518 } 5519 5520 case TYPE_PAREN: { 5521 if (Record.size() != 1) { 5522 Error("incorrect encoding of paren type"); 5523 return QualType(); 5524 } 5525 QualType InnerType = readType(*Loc.F, Record, Idx); 5526 return Context.getParenType(InnerType); 5527 } 5528 5529 case TYPE_PACK_EXPANSION: { 5530 if (Record.size() != 2) { 5531 Error("incorrect encoding of pack expansion type"); 5532 return QualType(); 5533 } 5534 QualType Pattern = readType(*Loc.F, Record, Idx); 5535 if (Pattern.isNull()) 5536 return QualType(); 5537 Optional<unsigned> NumExpansions; 5538 if (Record[1]) 5539 NumExpansions = Record[1] - 1; 5540 return Context.getPackExpansionType(Pattern, NumExpansions); 5541 } 5542 5543 case TYPE_ELABORATED: { 5544 unsigned Idx = 0; 5545 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 5546 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 5547 QualType NamedType = readType(*Loc.F, Record, Idx); 5548 return Context.getElaboratedType(Keyword, NNS, NamedType); 5549 } 5550 5551 case TYPE_OBJC_INTERFACE: { 5552 unsigned Idx = 0; 5553 ObjCInterfaceDecl *ItfD 5554 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx); 5555 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl()); 5556 } 5557 5558 case TYPE_OBJC_OBJECT: { 5559 unsigned Idx = 0; 5560 QualType Base = readType(*Loc.F, Record, Idx); 5561 unsigned NumProtos = Record[Idx++]; 5562 SmallVector<ObjCProtocolDecl*, 4> Protos; 5563 for (unsigned I = 0; I != NumProtos; ++I) 5564 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx)); 5565 return Context.getObjCObjectType(Base, Protos.data(), NumProtos); 5566 } 5567 5568 case TYPE_OBJC_OBJECT_POINTER: { 5569 unsigned Idx = 0; 5570 QualType Pointee = readType(*Loc.F, Record, Idx); 5571 return Context.getObjCObjectPointerType(Pointee); 5572 } 5573 5574 case TYPE_SUBST_TEMPLATE_TYPE_PARM: { 5575 unsigned Idx = 0; 5576 QualType Parm = readType(*Loc.F, Record, Idx); 5577 QualType Replacement = readType(*Loc.F, Record, Idx); 5578 return Context.getSubstTemplateTypeParmType( 5579 cast<TemplateTypeParmType>(Parm), 5580 Context.getCanonicalType(Replacement)); 5581 } 5582 5583 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: { 5584 unsigned Idx = 0; 5585 QualType Parm = readType(*Loc.F, Record, Idx); 5586 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx); 5587 return Context.getSubstTemplateTypeParmPackType( 5588 cast<TemplateTypeParmType>(Parm), 5589 ArgPack); 5590 } 5591 5592 case TYPE_INJECTED_CLASS_NAME: { 5593 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx); 5594 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable 5595 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable 5596 // for AST reading, too much interdependencies. 5597 const Type *T = nullptr; 5598 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) { 5599 if (const Type *Existing = DI->getTypeForDecl()) { 5600 T = Existing; 5601 break; 5602 } 5603 } 5604 if (!T) { 5605 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST); 5606 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) 5607 DI->setTypeForDecl(T); 5608 } 5609 return QualType(T, 0); 5610 } 5611 5612 case TYPE_TEMPLATE_TYPE_PARM: { 5613 unsigned Idx = 0; 5614 unsigned Depth = Record[Idx++]; 5615 unsigned Index = Record[Idx++]; 5616 bool Pack = Record[Idx++]; 5617 TemplateTypeParmDecl *D 5618 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx); 5619 return Context.getTemplateTypeParmType(Depth, Index, Pack, D); 5620 } 5621 5622 case TYPE_DEPENDENT_NAME: { 5623 unsigned Idx = 0; 5624 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 5625 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 5626 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx); 5627 QualType Canon = readType(*Loc.F, Record, Idx); 5628 if (!Canon.isNull()) 5629 Canon = Context.getCanonicalType(Canon); 5630 return Context.getDependentNameType(Keyword, NNS, Name, Canon); 5631 } 5632 5633 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: { 5634 unsigned Idx = 0; 5635 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 5636 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 5637 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx); 5638 unsigned NumArgs = Record[Idx++]; 5639 SmallVector<TemplateArgument, 8> Args; 5640 Args.reserve(NumArgs); 5641 while (NumArgs--) 5642 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx)); 5643 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name, 5644 Args.size(), Args.data()); 5645 } 5646 5647 case TYPE_DEPENDENT_SIZED_ARRAY: { 5648 unsigned Idx = 0; 5649 5650 // ArrayType 5651 QualType ElementType = readType(*Loc.F, Record, Idx); 5652 ArrayType::ArraySizeModifier ASM 5653 = (ArrayType::ArraySizeModifier)Record[Idx++]; 5654 unsigned IndexTypeQuals = Record[Idx++]; 5655 5656 // DependentSizedArrayType 5657 Expr *NumElts = ReadExpr(*Loc.F); 5658 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx); 5659 5660 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM, 5661 IndexTypeQuals, Brackets); 5662 } 5663 5664 case TYPE_TEMPLATE_SPECIALIZATION: { 5665 unsigned Idx = 0; 5666 bool IsDependent = Record[Idx++]; 5667 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx); 5668 SmallVector<TemplateArgument, 8> Args; 5669 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx); 5670 QualType Underlying = readType(*Loc.F, Record, Idx); 5671 QualType T; 5672 if (Underlying.isNull()) 5673 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(), 5674 Args.size()); 5675 else 5676 T = Context.getTemplateSpecializationType(Name, Args.data(), 5677 Args.size(), Underlying); 5678 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 5679 return T; 5680 } 5681 5682 case TYPE_ATOMIC: { 5683 if (Record.size() != 1) { 5684 Error("Incorrect encoding of atomic type"); 5685 return QualType(); 5686 } 5687 QualType ValueType = readType(*Loc.F, Record, Idx); 5688 return Context.getAtomicType(ValueType); 5689 } 5690 } 5691 llvm_unreachable("Invalid TypeCode!"); 5692 } 5693 5694 void ASTReader::readExceptionSpec(ModuleFile &ModuleFile, 5695 SmallVectorImpl<QualType> &Exceptions, 5696 FunctionProtoType::ExceptionSpecInfo &ESI, 5697 const RecordData &Record, unsigned &Idx) { 5698 ExceptionSpecificationType EST = 5699 static_cast<ExceptionSpecificationType>(Record[Idx++]); 5700 ESI.Type = EST; 5701 if (EST == EST_Dynamic) { 5702 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I) 5703 Exceptions.push_back(readType(ModuleFile, Record, Idx)); 5704 ESI.Exceptions = Exceptions; 5705 } else if (EST == EST_ComputedNoexcept) { 5706 ESI.NoexceptExpr = ReadExpr(ModuleFile); 5707 } else if (EST == EST_Uninstantiated) { 5708 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx); 5709 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx); 5710 } else if (EST == EST_Unevaluated) { 5711 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx); 5712 } 5713 } 5714 5715 class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> { 5716 ASTReader &Reader; 5717 ModuleFile &F; 5718 const ASTReader::RecordData &Record; 5719 unsigned &Idx; 5720 5721 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R, 5722 unsigned &I) { 5723 return Reader.ReadSourceLocation(F, R, I); 5724 } 5725 5726 template<typename T> 5727 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) { 5728 return Reader.ReadDeclAs<T>(F, Record, Idx); 5729 } 5730 5731 public: 5732 TypeLocReader(ASTReader &Reader, ModuleFile &F, 5733 const ASTReader::RecordData &Record, unsigned &Idx) 5734 : Reader(Reader), F(F), Record(Record), Idx(Idx) 5735 { } 5736 5737 // We want compile-time assurance that we've enumerated all of 5738 // these, so unfortunately we have to declare them first, then 5739 // define them out-of-line. 5740 #define ABSTRACT_TYPELOC(CLASS, PARENT) 5741 #define TYPELOC(CLASS, PARENT) \ 5742 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 5743 #include "clang/AST/TypeLocNodes.def" 5744 5745 void VisitFunctionTypeLoc(FunctionTypeLoc); 5746 void VisitArrayTypeLoc(ArrayTypeLoc); 5747 }; 5748 5749 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 5750 // nothing to do 5751 } 5752 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 5753 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx)); 5754 if (TL.needsExtraLocalData()) { 5755 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++])); 5756 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++])); 5757 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++])); 5758 TL.setModeAttr(Record[Idx++]); 5759 } 5760 } 5761 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 5762 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5763 } 5764 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 5765 TL.setStarLoc(ReadSourceLocation(Record, Idx)); 5766 } 5767 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 5768 // nothing to do 5769 } 5770 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 5771 // nothing to do 5772 } 5773 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 5774 TL.setCaretLoc(ReadSourceLocation(Record, Idx)); 5775 } 5776 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 5777 TL.setAmpLoc(ReadSourceLocation(Record, Idx)); 5778 } 5779 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 5780 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx)); 5781 } 5782 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 5783 TL.setStarLoc(ReadSourceLocation(Record, Idx)); 5784 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 5785 } 5786 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 5787 TL.setLBracketLoc(ReadSourceLocation(Record, Idx)); 5788 TL.setRBracketLoc(ReadSourceLocation(Record, Idx)); 5789 if (Record[Idx++]) 5790 TL.setSizeExpr(Reader.ReadExpr(F)); 5791 else 5792 TL.setSizeExpr(nullptr); 5793 } 5794 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 5795 VisitArrayTypeLoc(TL); 5796 } 5797 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 5798 VisitArrayTypeLoc(TL); 5799 } 5800 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 5801 VisitArrayTypeLoc(TL); 5802 } 5803 void TypeLocReader::VisitDependentSizedArrayTypeLoc( 5804 DependentSizedArrayTypeLoc TL) { 5805 VisitArrayTypeLoc(TL); 5806 } 5807 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 5808 DependentSizedExtVectorTypeLoc TL) { 5809 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5810 } 5811 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 5812 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5813 } 5814 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 5815 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5816 } 5817 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 5818 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx)); 5819 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5820 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5821 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx)); 5822 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) { 5823 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx)); 5824 } 5825 } 5826 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 5827 VisitFunctionTypeLoc(TL); 5828 } 5829 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 5830 VisitFunctionTypeLoc(TL); 5831 } 5832 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 5833 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5834 } 5835 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 5836 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5837 } 5838 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 5839 TL.setTypeofLoc(ReadSourceLocation(Record, Idx)); 5840 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5841 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5842 } 5843 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 5844 TL.setTypeofLoc(ReadSourceLocation(Record, Idx)); 5845 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5846 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5847 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 5848 } 5849 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 5850 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5851 } 5852 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 5853 TL.setKWLoc(ReadSourceLocation(Record, Idx)); 5854 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5855 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5856 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 5857 } 5858 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 5859 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5860 } 5861 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 5862 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5863 } 5864 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 5865 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5866 } 5867 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 5868 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx)); 5869 if (TL.hasAttrOperand()) { 5870 SourceRange range; 5871 range.setBegin(ReadSourceLocation(Record, Idx)); 5872 range.setEnd(ReadSourceLocation(Record, Idx)); 5873 TL.setAttrOperandParensRange(range); 5874 } 5875 if (TL.hasAttrExprOperand()) { 5876 if (Record[Idx++]) 5877 TL.setAttrExprOperand(Reader.ReadExpr(F)); 5878 else 5879 TL.setAttrExprOperand(nullptr); 5880 } else if (TL.hasAttrEnumOperand()) 5881 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx)); 5882 } 5883 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 5884 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5885 } 5886 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 5887 SubstTemplateTypeParmTypeLoc TL) { 5888 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5889 } 5890 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 5891 SubstTemplateTypeParmPackTypeLoc TL) { 5892 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5893 } 5894 void TypeLocReader::VisitTemplateSpecializationTypeLoc( 5895 TemplateSpecializationTypeLoc TL) { 5896 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx)); 5897 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx)); 5898 TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 5899 TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 5900 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 5901 TL.setArgLocInfo(i, 5902 Reader.GetTemplateArgumentLocInfo(F, 5903 TL.getTypePtr()->getArg(i).getKind(), 5904 Record, Idx)); 5905 } 5906 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 5907 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5908 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5909 } 5910 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 5911 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 5912 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 5913 } 5914 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 5915 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5916 } 5917 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 5918 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 5919 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 5920 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5921 } 5922 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 5923 DependentTemplateSpecializationTypeLoc TL) { 5924 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 5925 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 5926 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx)); 5927 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx)); 5928 TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 5929 TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 5930 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 5931 TL.setArgLocInfo(I, 5932 Reader.GetTemplateArgumentLocInfo(F, 5933 TL.getTypePtr()->getArg(I).getKind(), 5934 Record, Idx)); 5935 } 5936 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 5937 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx)); 5938 } 5939 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 5940 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5941 } 5942 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 5943 TL.setHasBaseTypeAsWritten(Record[Idx++]); 5944 TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 5945 TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 5946 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 5947 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx)); 5948 } 5949 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 5950 TL.setStarLoc(ReadSourceLocation(Record, Idx)); 5951 } 5952 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 5953 TL.setKWLoc(ReadSourceLocation(Record, Idx)); 5954 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5955 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5956 } 5957 5958 TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F, 5959 const RecordData &Record, 5960 unsigned &Idx) { 5961 QualType InfoTy = readType(F, Record, Idx); 5962 if (InfoTy.isNull()) 5963 return nullptr; 5964 5965 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 5966 TypeLocReader TLR(*this, F, Record, Idx); 5967 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc()) 5968 TLR.Visit(TL); 5969 return TInfo; 5970 } 5971 5972 QualType ASTReader::GetType(TypeID ID) { 5973 unsigned FastQuals = ID & Qualifiers::FastMask; 5974 unsigned Index = ID >> Qualifiers::FastWidth; 5975 5976 if (Index < NUM_PREDEF_TYPE_IDS) { 5977 QualType T; 5978 switch ((PredefinedTypeIDs)Index) { 5979 case PREDEF_TYPE_NULL_ID: return QualType(); 5980 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break; 5981 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break; 5982 5983 case PREDEF_TYPE_CHAR_U_ID: 5984 case PREDEF_TYPE_CHAR_S_ID: 5985 // FIXME: Check that the signedness of CharTy is correct! 5986 T = Context.CharTy; 5987 break; 5988 5989 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break; 5990 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break; 5991 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break; 5992 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break; 5993 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break; 5994 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break; 5995 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break; 5996 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break; 5997 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break; 5998 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break; 5999 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break; 6000 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break; 6001 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break; 6002 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break; 6003 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break; 6004 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break; 6005 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break; 6006 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break; 6007 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break; 6008 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break; 6009 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break; 6010 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break; 6011 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break; 6012 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break; 6013 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break; 6014 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break; 6015 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break; 6016 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break; 6017 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break; 6018 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break; 6019 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break; 6020 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break; 6021 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break; 6022 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break; 6023 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break; 6024 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break; 6025 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break; 6026 6027 case PREDEF_TYPE_AUTO_RREF_DEDUCT: 6028 T = Context.getAutoRRefDeductType(); 6029 break; 6030 6031 case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 6032 T = Context.ARCUnbridgedCastTy; 6033 break; 6034 6035 case PREDEF_TYPE_VA_LIST_TAG: 6036 T = Context.getVaListTagType(); 6037 break; 6038 6039 case PREDEF_TYPE_BUILTIN_FN: 6040 T = Context.BuiltinFnTy; 6041 break; 6042 } 6043 6044 assert(!T.isNull() && "Unknown predefined type"); 6045 return T.withFastQualifiers(FastQuals); 6046 } 6047 6048 Index -= NUM_PREDEF_TYPE_IDS; 6049 assert(Index < TypesLoaded.size() && "Type index out-of-range"); 6050 if (TypesLoaded[Index].isNull()) { 6051 TypesLoaded[Index] = readTypeRecord(Index); 6052 if (TypesLoaded[Index].isNull()) 6053 return QualType(); 6054 6055 TypesLoaded[Index]->setFromAST(); 6056 if (DeserializationListener) 6057 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 6058 TypesLoaded[Index]); 6059 } 6060 6061 return TypesLoaded[Index].withFastQualifiers(FastQuals); 6062 } 6063 6064 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 6065 return GetType(getGlobalTypeID(F, LocalID)); 6066 } 6067 6068 serialization::TypeID 6069 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 6070 unsigned FastQuals = LocalID & Qualifiers::FastMask; 6071 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 6072 6073 if (LocalIndex < NUM_PREDEF_TYPE_IDS) 6074 return LocalID; 6075 6076 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6077 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 6078 assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 6079 6080 unsigned GlobalIndex = LocalIndex + I->second; 6081 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 6082 } 6083 6084 TemplateArgumentLocInfo 6085 ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F, 6086 TemplateArgument::ArgKind Kind, 6087 const RecordData &Record, 6088 unsigned &Index) { 6089 switch (Kind) { 6090 case TemplateArgument::Expression: 6091 return ReadExpr(F); 6092 case TemplateArgument::Type: 6093 return GetTypeSourceInfo(F, Record, Index); 6094 case TemplateArgument::Template: { 6095 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 6096 Index); 6097 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 6098 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 6099 SourceLocation()); 6100 } 6101 case TemplateArgument::TemplateExpansion: { 6102 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 6103 Index); 6104 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 6105 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index); 6106 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 6107 EllipsisLoc); 6108 } 6109 case TemplateArgument::Null: 6110 case TemplateArgument::Integral: 6111 case TemplateArgument::Declaration: 6112 case TemplateArgument::NullPtr: 6113 case TemplateArgument::Pack: 6114 // FIXME: Is this right? 6115 return TemplateArgumentLocInfo(); 6116 } 6117 llvm_unreachable("unexpected template argument loc"); 6118 } 6119 6120 TemplateArgumentLoc 6121 ASTReader::ReadTemplateArgumentLoc(ModuleFile &F, 6122 const RecordData &Record, unsigned &Index) { 6123 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index); 6124 6125 if (Arg.getKind() == TemplateArgument::Expression) { 6126 if (Record[Index++]) // bool InfoHasSameExpr. 6127 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 6128 } 6129 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(), 6130 Record, Index)); 6131 } 6132 6133 const ASTTemplateArgumentListInfo* 6134 ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F, 6135 const RecordData &Record, 6136 unsigned &Index) { 6137 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index); 6138 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index); 6139 unsigned NumArgsAsWritten = Record[Index++]; 6140 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 6141 for (unsigned i = 0; i != NumArgsAsWritten; ++i) 6142 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index)); 6143 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 6144 } 6145 6146 Decl *ASTReader::GetExternalDecl(uint32_t ID) { 6147 return GetDecl(ID); 6148 } 6149 6150 template<typename TemplateSpecializationDecl> 6151 static void completeRedeclChainForTemplateSpecialization(Decl *D) { 6152 if (auto *TSD = dyn_cast<TemplateSpecializationDecl>(D)) 6153 TSD->getSpecializedTemplate()->LoadLazySpecializations(); 6154 } 6155 6156 void ASTReader::CompleteRedeclChain(const Decl *D) { 6157 if (NumCurrentElementsDeserializing) { 6158 // We arrange to not care about the complete redeclaration chain while we're 6159 // deserializing. Just remember that the AST has marked this one as complete 6160 // but that it's not actually complete yet, so we know we still need to 6161 // complete it later. 6162 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D)); 6163 return; 6164 } 6165 6166 const DeclContext *DC = D->getDeclContext()->getRedeclContext(); 6167 6168 // If this is a named declaration, complete it by looking it up 6169 // within its context. 6170 // 6171 // FIXME: Merging a function definition should merge 6172 // all mergeable entities within it. 6173 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) || 6174 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) { 6175 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) { 6176 auto *II = Name.getAsIdentifierInfo(); 6177 if (isa<TranslationUnitDecl>(DC) && II) { 6178 // Outside of C++, we don't have a lookup table for the TU, so update 6179 // the identifier instead. In C++, either way should work fine. 6180 if (II->isOutOfDate()) 6181 updateOutOfDateIdentifier(*II); 6182 } else 6183 DC->lookup(Name); 6184 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) { 6185 // FIXME: It'd be nice to do something a bit more targeted here. 6186 D->getDeclContext()->decls_begin(); 6187 } 6188 } 6189 6190 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) 6191 CTSD->getSpecializedTemplate()->LoadLazySpecializations(); 6192 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) 6193 VTSD->getSpecializedTemplate()->LoadLazySpecializations(); 6194 if (auto *FD = dyn_cast<FunctionDecl>(D)) { 6195 if (auto *Template = FD->getPrimaryTemplate()) 6196 Template->LoadLazySpecializations(); 6197 } 6198 } 6199 6200 uint64_t ASTReader::ReadCXXCtorInitializersRef(ModuleFile &M, 6201 const RecordData &Record, 6202 unsigned &Idx) { 6203 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXCtorInitializers) { 6204 Error("malformed AST file: missing C++ ctor initializers"); 6205 return 0; 6206 } 6207 6208 unsigned LocalID = Record[Idx++]; 6209 return getGlobalBitOffset(M, M.CXXCtorInitializersOffsets[LocalID - 1]); 6210 } 6211 6212 CXXCtorInitializer ** 6213 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) { 6214 RecordLocation Loc = getLocalBitOffset(Offset); 6215 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 6216 SavedStreamPosition SavedPosition(Cursor); 6217 Cursor.JumpToBit(Loc.Offset); 6218 ReadingKindTracker ReadingKind(Read_Decl, *this); 6219 6220 RecordData Record; 6221 unsigned Code = Cursor.ReadCode(); 6222 unsigned RecCode = Cursor.readRecord(Code, Record); 6223 if (RecCode != DECL_CXX_CTOR_INITIALIZERS) { 6224 Error("malformed AST file: missing C++ ctor initializers"); 6225 return nullptr; 6226 } 6227 6228 unsigned Idx = 0; 6229 return ReadCXXCtorInitializers(*Loc.F, Record, Idx); 6230 } 6231 6232 uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M, 6233 const RecordData &Record, 6234 unsigned &Idx) { 6235 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) { 6236 Error("malformed AST file: missing C++ base specifier"); 6237 return 0; 6238 } 6239 6240 unsigned LocalID = Record[Idx++]; 6241 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]); 6242 } 6243 6244 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 6245 RecordLocation Loc = getLocalBitOffset(Offset); 6246 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 6247 SavedStreamPosition SavedPosition(Cursor); 6248 Cursor.JumpToBit(Loc.Offset); 6249 ReadingKindTracker ReadingKind(Read_Decl, *this); 6250 RecordData Record; 6251 unsigned Code = Cursor.ReadCode(); 6252 unsigned RecCode = Cursor.readRecord(Code, Record); 6253 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 6254 Error("malformed AST file: missing C++ base specifiers"); 6255 return nullptr; 6256 } 6257 6258 unsigned Idx = 0; 6259 unsigned NumBases = Record[Idx++]; 6260 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 6261 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 6262 for (unsigned I = 0; I != NumBases; ++I) 6263 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx); 6264 return Bases; 6265 } 6266 6267 serialization::DeclID 6268 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 6269 if (LocalID < NUM_PREDEF_DECL_IDS) 6270 return LocalID; 6271 6272 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6273 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 6274 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 6275 6276 return LocalID + I->second; 6277 } 6278 6279 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 6280 ModuleFile &M) const { 6281 // Predefined decls aren't from any module. 6282 if (ID < NUM_PREDEF_DECL_IDS) 6283 return false; 6284 6285 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID); 6286 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 6287 return &M == I->second; 6288 } 6289 6290 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 6291 if (!D->isFromASTFile()) 6292 return nullptr; 6293 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 6294 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 6295 return I->second; 6296 } 6297 6298 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 6299 if (ID < NUM_PREDEF_DECL_IDS) 6300 return SourceLocation(); 6301 6302 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 6303 6304 if (Index > DeclsLoaded.size()) { 6305 Error("declaration ID out-of-range for AST file"); 6306 return SourceLocation(); 6307 } 6308 6309 if (Decl *D = DeclsLoaded[Index]) 6310 return D->getLocation(); 6311 6312 unsigned RawLocation = 0; 6313 RecordLocation Rec = DeclCursorForID(ID, RawLocation); 6314 return ReadSourceLocation(*Rec.F, RawLocation); 6315 } 6316 6317 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) { 6318 switch (ID) { 6319 case PREDEF_DECL_NULL_ID: 6320 return nullptr; 6321 6322 case PREDEF_DECL_TRANSLATION_UNIT_ID: 6323 return Context.getTranslationUnitDecl(); 6324 6325 case PREDEF_DECL_OBJC_ID_ID: 6326 return Context.getObjCIdDecl(); 6327 6328 case PREDEF_DECL_OBJC_SEL_ID: 6329 return Context.getObjCSelDecl(); 6330 6331 case PREDEF_DECL_OBJC_CLASS_ID: 6332 return Context.getObjCClassDecl(); 6333 6334 case PREDEF_DECL_OBJC_PROTOCOL_ID: 6335 return Context.getObjCProtocolDecl(); 6336 6337 case PREDEF_DECL_INT_128_ID: 6338 return Context.getInt128Decl(); 6339 6340 case PREDEF_DECL_UNSIGNED_INT_128_ID: 6341 return Context.getUInt128Decl(); 6342 6343 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 6344 return Context.getObjCInstanceTypeDecl(); 6345 6346 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 6347 return Context.getBuiltinVaListDecl(); 6348 6349 case PREDEF_DECL_EXTERN_C_CONTEXT_ID: 6350 return Context.getExternCContextDecl(); 6351 } 6352 llvm_unreachable("PredefinedDeclIDs unknown enum value"); 6353 } 6354 6355 Decl *ASTReader::GetExistingDecl(DeclID ID) { 6356 if (ID < NUM_PREDEF_DECL_IDS) { 6357 Decl *D = getPredefinedDecl(Context, (PredefinedDeclIDs)ID); 6358 if (D) { 6359 // Track that we have merged the declaration with ID \p ID into the 6360 // pre-existing predefined declaration \p D. 6361 auto &Merged = MergedDecls[D->getCanonicalDecl()]; 6362 if (Merged.empty()) 6363 Merged.push_back(ID); 6364 } 6365 return D; 6366 } 6367 6368 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 6369 6370 if (Index >= DeclsLoaded.size()) { 6371 assert(0 && "declaration ID out-of-range for AST file"); 6372 Error("declaration ID out-of-range for AST file"); 6373 return nullptr; 6374 } 6375 6376 return DeclsLoaded[Index]; 6377 } 6378 6379 Decl *ASTReader::GetDecl(DeclID ID) { 6380 if (ID < NUM_PREDEF_DECL_IDS) 6381 return GetExistingDecl(ID); 6382 6383 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 6384 6385 if (Index >= DeclsLoaded.size()) { 6386 assert(0 && "declaration ID out-of-range for AST file"); 6387 Error("declaration ID out-of-range for AST file"); 6388 return nullptr; 6389 } 6390 6391 if (!DeclsLoaded[Index]) { 6392 ReadDeclRecord(ID); 6393 if (DeserializationListener) 6394 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 6395 } 6396 6397 return DeclsLoaded[Index]; 6398 } 6399 6400 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 6401 DeclID GlobalID) { 6402 if (GlobalID < NUM_PREDEF_DECL_IDS) 6403 return GlobalID; 6404 6405 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 6406 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 6407 ModuleFile *Owner = I->second; 6408 6409 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 6410 = M.GlobalToLocalDeclIDs.find(Owner); 6411 if (Pos == M.GlobalToLocalDeclIDs.end()) 6412 return 0; 6413 6414 return GlobalID - Owner->BaseDeclID + Pos->second; 6415 } 6416 6417 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 6418 const RecordData &Record, 6419 unsigned &Idx) { 6420 if (Idx >= Record.size()) { 6421 Error("Corrupted AST file"); 6422 return 0; 6423 } 6424 6425 return getGlobalDeclID(F, Record[Idx++]); 6426 } 6427 6428 /// \brief Resolve the offset of a statement into a statement. 6429 /// 6430 /// This operation will read a new statement from the external 6431 /// source each time it is called, and is meant to be used via a 6432 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 6433 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 6434 // Switch case IDs are per Decl. 6435 ClearSwitchCaseIDs(); 6436 6437 // Offset here is a global offset across the entire chain. 6438 RecordLocation Loc = getLocalBitOffset(Offset); 6439 Loc.F->DeclsCursor.JumpToBit(Loc.Offset); 6440 return ReadStmtFromStream(*Loc.F); 6441 } 6442 6443 namespace { 6444 class FindExternalLexicalDeclsVisitor { 6445 ASTReader &Reader; 6446 const DeclContext *DC; 6447 bool (*isKindWeWant)(Decl::Kind); 6448 6449 SmallVectorImpl<Decl*> &Decls; 6450 bool PredefsVisited[NUM_PREDEF_DECL_IDS]; 6451 6452 public: 6453 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC, 6454 bool (*isKindWeWant)(Decl::Kind), 6455 SmallVectorImpl<Decl*> &Decls) 6456 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls) 6457 { 6458 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I) 6459 PredefsVisited[I] = false; 6460 } 6461 6462 static bool visit(ModuleFile &M, bool Preorder, void *UserData) { 6463 if (Preorder) 6464 return false; 6465 6466 FindExternalLexicalDeclsVisitor *This 6467 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData); 6468 6469 ModuleFile::DeclContextInfosMap::iterator Info 6470 = M.DeclContextInfos.find(This->DC); 6471 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls) 6472 return false; 6473 6474 // Load all of the declaration IDs 6475 for (const KindDeclIDPair *ID = Info->second.LexicalDecls, 6476 *IDE = ID + Info->second.NumLexicalDecls; 6477 ID != IDE; ++ID) { 6478 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first)) 6479 continue; 6480 6481 // Don't add predefined declarations to the lexical context more 6482 // than once. 6483 if (ID->second < NUM_PREDEF_DECL_IDS) { 6484 if (This->PredefsVisited[ID->second]) 6485 continue; 6486 6487 This->PredefsVisited[ID->second] = true; 6488 } 6489 6490 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) { 6491 if (!This->DC->isDeclInLexicalTraversal(D)) 6492 This->Decls.push_back(D); 6493 } 6494 } 6495 6496 return false; 6497 } 6498 }; 6499 } 6500 6501 ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC, 6502 bool (*isKindWeWant)(Decl::Kind), 6503 SmallVectorImpl<Decl*> &Decls) { 6504 // There might be lexical decls in multiple modules, for the TU at 6505 // least. Walk all of the modules in the order they were loaded. 6506 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls); 6507 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor); 6508 ++NumLexicalDeclContextsRead; 6509 return ELR_Success; 6510 } 6511 6512 namespace { 6513 6514 class DeclIDComp { 6515 ASTReader &Reader; 6516 ModuleFile &Mod; 6517 6518 public: 6519 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 6520 6521 bool operator()(LocalDeclID L, LocalDeclID R) const { 6522 SourceLocation LHS = getLocation(L); 6523 SourceLocation RHS = getLocation(R); 6524 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6525 } 6526 6527 bool operator()(SourceLocation LHS, LocalDeclID R) const { 6528 SourceLocation RHS = getLocation(R); 6529 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6530 } 6531 6532 bool operator()(LocalDeclID L, SourceLocation RHS) const { 6533 SourceLocation LHS = getLocation(L); 6534 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6535 } 6536 6537 SourceLocation getLocation(LocalDeclID ID) const { 6538 return Reader.getSourceManager().getFileLoc( 6539 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 6540 } 6541 }; 6542 6543 } 6544 6545 void ASTReader::FindFileRegionDecls(FileID File, 6546 unsigned Offset, unsigned Length, 6547 SmallVectorImpl<Decl *> &Decls) { 6548 SourceManager &SM = getSourceManager(); 6549 6550 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 6551 if (I == FileDeclIDs.end()) 6552 return; 6553 6554 FileDeclsInfo &DInfo = I->second; 6555 if (DInfo.Decls.empty()) 6556 return; 6557 6558 SourceLocation 6559 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 6560 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 6561 6562 DeclIDComp DIDComp(*this, *DInfo.Mod); 6563 ArrayRef<serialization::LocalDeclID>::iterator 6564 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 6565 BeginLoc, DIDComp); 6566 if (BeginIt != DInfo.Decls.begin()) 6567 --BeginIt; 6568 6569 // If we are pointing at a top-level decl inside an objc container, we need 6570 // to backtrack until we find it otherwise we will fail to report that the 6571 // region overlaps with an objc container. 6572 while (BeginIt != DInfo.Decls.begin() && 6573 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 6574 ->isTopLevelDeclInObjCContainer()) 6575 --BeginIt; 6576 6577 ArrayRef<serialization::LocalDeclID>::iterator 6578 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 6579 EndLoc, DIDComp); 6580 if (EndIt != DInfo.Decls.end()) 6581 ++EndIt; 6582 6583 for (ArrayRef<serialization::LocalDeclID>::iterator 6584 DIt = BeginIt; DIt != EndIt; ++DIt) 6585 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 6586 } 6587 6588 namespace { 6589 /// \brief ModuleFile visitor used to perform name lookup into a 6590 /// declaration context. 6591 class DeclContextNameLookupVisitor { 6592 ASTReader &Reader; 6593 ArrayRef<const DeclContext *> Contexts; 6594 DeclarationName Name; 6595 SmallVectorImpl<NamedDecl *> &Decls; 6596 llvm::SmallPtrSetImpl<NamedDecl *> &DeclSet; 6597 6598 public: 6599 DeclContextNameLookupVisitor(ASTReader &Reader, 6600 ArrayRef<const DeclContext *> Contexts, 6601 DeclarationName Name, 6602 SmallVectorImpl<NamedDecl *> &Decls, 6603 llvm::SmallPtrSetImpl<NamedDecl *> &DeclSet) 6604 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls), 6605 DeclSet(DeclSet) { } 6606 6607 static bool visit(ModuleFile &M, void *UserData) { 6608 DeclContextNameLookupVisitor *This 6609 = static_cast<DeclContextNameLookupVisitor *>(UserData); 6610 6611 // Check whether we have any visible declaration information for 6612 // this context in this module. 6613 ModuleFile::DeclContextInfosMap::iterator Info; 6614 bool FoundInfo = false; 6615 for (auto *DC : This->Contexts) { 6616 Info = M.DeclContextInfos.find(DC); 6617 if (Info != M.DeclContextInfos.end() && 6618 Info->second.NameLookupTableData) { 6619 FoundInfo = true; 6620 break; 6621 } 6622 } 6623 6624 if (!FoundInfo) 6625 return false; 6626 6627 // Look for this name within this module. 6628 ASTDeclContextNameLookupTable *LookupTable = 6629 Info->second.NameLookupTableData; 6630 ASTDeclContextNameLookupTable::iterator Pos 6631 = LookupTable->find(This->Name); 6632 if (Pos == LookupTable->end()) 6633 return false; 6634 6635 bool FoundAnything = false; 6636 ASTDeclContextNameLookupTrait::data_type Data = *Pos; 6637 for (; Data.first != Data.second; ++Data.first) { 6638 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first); 6639 if (!ND) 6640 continue; 6641 6642 if (ND->getDeclName() != This->Name) { 6643 // A name might be null because the decl's redeclarable part is 6644 // currently read before reading its name. The lookup is triggered by 6645 // building that decl (likely indirectly), and so it is later in the 6646 // sense of "already existing" and can be ignored here. 6647 // FIXME: This should not happen; deserializing declarations should 6648 // not perform lookups since that can lead to deserialization cycles. 6649 continue; 6650 } 6651 6652 // Record this declaration. 6653 FoundAnything = true; 6654 if (This->DeclSet.insert(ND).second) 6655 This->Decls.push_back(ND); 6656 } 6657 6658 return FoundAnything; 6659 } 6660 }; 6661 } 6662 6663 /// \brief Retrieve the "definitive" module file for the definition of the 6664 /// given declaration context, if there is one. 6665 /// 6666 /// The "definitive" module file is the only place where we need to look to 6667 /// find information about the declarations within the given declaration 6668 /// context. For example, C++ and Objective-C classes, C structs/unions, and 6669 /// Objective-C protocols, categories, and extensions are all defined in a 6670 /// single place in the source code, so they have definitive module files 6671 /// associated with them. C++ namespaces, on the other hand, can have 6672 /// definitions in multiple different module files. 6673 /// 6674 /// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's 6675 /// NDEBUG checking. 6676 static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC, 6677 ASTReader &Reader) { 6678 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC)) 6679 return Reader.getOwningModuleFile(cast<Decl>(DefDC)); 6680 6681 return nullptr; 6682 } 6683 6684 bool 6685 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 6686 DeclarationName Name) { 6687 assert(DC->hasExternalVisibleStorage() && 6688 "DeclContext has no visible decls in storage"); 6689 if (!Name) 6690 return false; 6691 6692 Deserializing LookupResults(this); 6693 6694 SmallVector<NamedDecl *, 64> Decls; 6695 llvm::SmallPtrSet<NamedDecl*, 64> DeclSet; 6696 6697 // Compute the declaration contexts we need to look into. Multiple such 6698 // declaration contexts occur when two declaration contexts from disjoint 6699 // modules get merged, e.g., when two namespaces with the same name are 6700 // independently defined in separate modules. 6701 SmallVector<const DeclContext *, 2> Contexts; 6702 Contexts.push_back(DC); 6703 6704 if (DC->isNamespace()) { 6705 auto Merged = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC))); 6706 if (Merged != MergedDecls.end()) { 6707 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I) 6708 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I]))); 6709 } 6710 } 6711 6712 auto LookUpInContexts = [&](ArrayRef<const DeclContext*> Contexts) { 6713 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls, DeclSet); 6714 6715 // If we can definitively determine which module file to look into, 6716 // only look there. Otherwise, look in all module files. 6717 ModuleFile *Definitive; 6718 if (Contexts.size() == 1 && 6719 (Definitive = getDefinitiveModuleFileFor(Contexts[0], *this))) { 6720 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor); 6721 } else { 6722 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor); 6723 } 6724 }; 6725 6726 LookUpInContexts(Contexts); 6727 6728 // If this might be an implicit special member function, then also search 6729 // all merged definitions of the surrounding class. We need to search them 6730 // individually, because finding an entity in one of them doesn't imply that 6731 // we can't find a different entity in another one. 6732 if (isa<CXXRecordDecl>(DC)) { 6733 auto Kind = Name.getNameKind(); 6734 if (Kind == DeclarationName::CXXConstructorName || 6735 Kind == DeclarationName::CXXDestructorName || 6736 (Kind == DeclarationName::CXXOperatorName && 6737 Name.getCXXOverloadedOperator() == OO_Equal)) { 6738 auto Merged = MergedLookups.find(DC); 6739 if (Merged != MergedLookups.end()) { 6740 for (unsigned I = 0; I != Merged->second.size(); ++I) { 6741 const DeclContext *Context = Merged->second[I]; 6742 LookUpInContexts(Context); 6743 // We might have just added some more merged lookups. If so, our 6744 // iterator is now invalid, so grab a fresh one before continuing. 6745 Merged = MergedLookups.find(DC); 6746 } 6747 } 6748 } 6749 } 6750 6751 ++NumVisibleDeclContextsRead; 6752 SetExternalVisibleDeclsForName(DC, Name, Decls); 6753 return !Decls.empty(); 6754 } 6755 6756 namespace { 6757 /// \brief ModuleFile visitor used to retrieve all visible names in a 6758 /// declaration context. 6759 class DeclContextAllNamesVisitor { 6760 ASTReader &Reader; 6761 SmallVectorImpl<const DeclContext *> &Contexts; 6762 DeclsMap &Decls; 6763 llvm::SmallPtrSet<NamedDecl *, 256> DeclSet; 6764 bool VisitAll; 6765 6766 public: 6767 DeclContextAllNamesVisitor(ASTReader &Reader, 6768 SmallVectorImpl<const DeclContext *> &Contexts, 6769 DeclsMap &Decls, bool VisitAll) 6770 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { } 6771 6772 static bool visit(ModuleFile &M, void *UserData) { 6773 DeclContextAllNamesVisitor *This 6774 = static_cast<DeclContextAllNamesVisitor *>(UserData); 6775 6776 // Check whether we have any visible declaration information for 6777 // this context in this module. 6778 ModuleFile::DeclContextInfosMap::iterator Info; 6779 bool FoundInfo = false; 6780 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) { 6781 Info = M.DeclContextInfos.find(This->Contexts[I]); 6782 if (Info != M.DeclContextInfos.end() && 6783 Info->second.NameLookupTableData) { 6784 FoundInfo = true; 6785 break; 6786 } 6787 } 6788 6789 if (!FoundInfo) 6790 return false; 6791 6792 ASTDeclContextNameLookupTable *LookupTable = 6793 Info->second.NameLookupTableData; 6794 bool FoundAnything = false; 6795 for (ASTDeclContextNameLookupTable::data_iterator 6796 I = LookupTable->data_begin(), E = LookupTable->data_end(); 6797 I != E; 6798 ++I) { 6799 ASTDeclContextNameLookupTrait::data_type Data = *I; 6800 for (; Data.first != Data.second; ++Data.first) { 6801 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, 6802 *Data.first); 6803 if (!ND) 6804 continue; 6805 6806 // Record this declaration. 6807 FoundAnything = true; 6808 if (This->DeclSet.insert(ND).second) 6809 This->Decls[ND->getDeclName()].push_back(ND); 6810 } 6811 } 6812 6813 return FoundAnything && !This->VisitAll; 6814 } 6815 }; 6816 } 6817 6818 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 6819 if (!DC->hasExternalVisibleStorage()) 6820 return; 6821 DeclsMap Decls; 6822 6823 // Compute the declaration contexts we need to look into. Multiple such 6824 // declaration contexts occur when two declaration contexts from disjoint 6825 // modules get merged, e.g., when two namespaces with the same name are 6826 // independently defined in separate modules. 6827 SmallVector<const DeclContext *, 2> Contexts; 6828 Contexts.push_back(DC); 6829 6830 if (DC->isNamespace()) { 6831 MergedDeclsMap::iterator Merged 6832 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC))); 6833 if (Merged != MergedDecls.end()) { 6834 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I) 6835 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I]))); 6836 } 6837 } 6838 6839 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls, 6840 /*VisitAll=*/DC->isFileContext()); 6841 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor); 6842 ++NumVisibleDeclContextsRead; 6843 6844 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 6845 SetExternalVisibleDeclsForName(DC, I->first, I->second); 6846 } 6847 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 6848 } 6849 6850 /// \brief Under non-PCH compilation the consumer receives the objc methods 6851 /// before receiving the implementation, and codegen depends on this. 6852 /// We simulate this by deserializing and passing to consumer the methods of the 6853 /// implementation before passing the deserialized implementation decl. 6854 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 6855 ASTConsumer *Consumer) { 6856 assert(ImplD && Consumer); 6857 6858 for (auto *I : ImplD->methods()) 6859 Consumer->HandleInterestingDecl(DeclGroupRef(I)); 6860 6861 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 6862 } 6863 6864 void ASTReader::PassInterestingDeclsToConsumer() { 6865 assert(Consumer); 6866 6867 if (PassingDeclsToConsumer) 6868 return; 6869 6870 // Guard variable to avoid recursively redoing the process of passing 6871 // decls to consumer. 6872 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer, 6873 true); 6874 6875 // Ensure that we've loaded all potentially-interesting declarations 6876 // that need to be eagerly loaded. 6877 for (auto ID : EagerlyDeserializedDecls) 6878 GetDecl(ID); 6879 EagerlyDeserializedDecls.clear(); 6880 6881 while (!InterestingDecls.empty()) { 6882 Decl *D = InterestingDecls.front(); 6883 InterestingDecls.pop_front(); 6884 6885 PassInterestingDeclToConsumer(D); 6886 } 6887 } 6888 6889 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 6890 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 6891 PassObjCImplDeclToConsumer(ImplD, Consumer); 6892 else 6893 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 6894 } 6895 6896 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 6897 this->Consumer = Consumer; 6898 6899 if (Consumer) 6900 PassInterestingDeclsToConsumer(); 6901 6902 if (DeserializationListener) 6903 DeserializationListener->ReaderInitialized(this); 6904 } 6905 6906 void ASTReader::PrintStats() { 6907 std::fprintf(stderr, "*** AST File Statistics:\n"); 6908 6909 unsigned NumTypesLoaded 6910 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 6911 QualType()); 6912 unsigned NumDeclsLoaded 6913 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 6914 (Decl *)nullptr); 6915 unsigned NumIdentifiersLoaded 6916 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 6917 IdentifiersLoaded.end(), 6918 (IdentifierInfo *)nullptr); 6919 unsigned NumMacrosLoaded 6920 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 6921 MacrosLoaded.end(), 6922 (MacroInfo *)nullptr); 6923 unsigned NumSelectorsLoaded 6924 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 6925 SelectorsLoaded.end(), 6926 Selector()); 6927 6928 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 6929 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 6930 NumSLocEntriesRead, TotalNumSLocEntries, 6931 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 6932 if (!TypesLoaded.empty()) 6933 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 6934 NumTypesLoaded, (unsigned)TypesLoaded.size(), 6935 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 6936 if (!DeclsLoaded.empty()) 6937 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 6938 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 6939 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 6940 if (!IdentifiersLoaded.empty()) 6941 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 6942 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 6943 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 6944 if (!MacrosLoaded.empty()) 6945 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 6946 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 6947 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 6948 if (!SelectorsLoaded.empty()) 6949 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 6950 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 6951 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 6952 if (TotalNumStatements) 6953 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 6954 NumStatementsRead, TotalNumStatements, 6955 ((float)NumStatementsRead/TotalNumStatements * 100)); 6956 if (TotalNumMacros) 6957 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 6958 NumMacrosRead, TotalNumMacros, 6959 ((float)NumMacrosRead/TotalNumMacros * 100)); 6960 if (TotalLexicalDeclContexts) 6961 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 6962 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 6963 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 6964 * 100)); 6965 if (TotalVisibleDeclContexts) 6966 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 6967 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 6968 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 6969 * 100)); 6970 if (TotalNumMethodPoolEntries) { 6971 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 6972 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 6973 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 6974 * 100)); 6975 } 6976 if (NumMethodPoolLookups) { 6977 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 6978 NumMethodPoolHits, NumMethodPoolLookups, 6979 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 6980 } 6981 if (NumMethodPoolTableLookups) { 6982 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 6983 NumMethodPoolTableHits, NumMethodPoolTableLookups, 6984 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 6985 * 100.0)); 6986 } 6987 6988 if (NumIdentifierLookupHits) { 6989 std::fprintf(stderr, 6990 " %u / %u identifier table lookups succeeded (%f%%)\n", 6991 NumIdentifierLookupHits, NumIdentifierLookups, 6992 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 6993 } 6994 6995 if (GlobalIndex) { 6996 std::fprintf(stderr, "\n"); 6997 GlobalIndex->printStats(); 6998 } 6999 7000 std::fprintf(stderr, "\n"); 7001 dump(); 7002 std::fprintf(stderr, "\n"); 7003 } 7004 7005 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 7006 static void 7007 dumpModuleIDMap(StringRef Name, 7008 const ContinuousRangeMap<Key, ModuleFile *, 7009 InitialCapacity> &Map) { 7010 if (Map.begin() == Map.end()) 7011 return; 7012 7013 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType; 7014 llvm::errs() << Name << ":\n"; 7015 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 7016 I != IEnd; ++I) { 7017 llvm::errs() << " " << I->first << " -> " << I->second->FileName 7018 << "\n"; 7019 } 7020 } 7021 7022 void ASTReader::dump() { 7023 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 7024 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 7025 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 7026 dumpModuleIDMap("Global type map", GlobalTypeMap); 7027 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 7028 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 7029 dumpModuleIDMap("Global macro map", GlobalMacroMap); 7030 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 7031 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 7032 dumpModuleIDMap("Global preprocessed entity map", 7033 GlobalPreprocessedEntityMap); 7034 7035 llvm::errs() << "\n*** PCH/Modules Loaded:"; 7036 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(), 7037 MEnd = ModuleMgr.end(); 7038 M != MEnd; ++M) 7039 (*M)->dump(); 7040 } 7041 7042 /// Return the amount of memory used by memory buffers, breaking down 7043 /// by heap-backed versus mmap'ed memory. 7044 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 7045 for (ModuleConstIterator I = ModuleMgr.begin(), 7046 E = ModuleMgr.end(); I != E; ++I) { 7047 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) { 7048 size_t bytes = buf->getBufferSize(); 7049 switch (buf->getBufferKind()) { 7050 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 7051 sizes.malloc_bytes += bytes; 7052 break; 7053 case llvm::MemoryBuffer::MemoryBuffer_MMap: 7054 sizes.mmap_bytes += bytes; 7055 break; 7056 } 7057 } 7058 } 7059 } 7060 7061 void ASTReader::InitializeSema(Sema &S) { 7062 SemaObj = &S; 7063 S.addExternalSource(this); 7064 7065 // Makes sure any declarations that were deserialized "too early" 7066 // still get added to the identifier's declaration chains. 7067 for (uint64_t ID : PreloadedDeclIDs) { 7068 NamedDecl *D = cast<NamedDecl>(GetDecl(ID)); 7069 pushExternalDeclIntoScope(D, D->getDeclName()); 7070 } 7071 PreloadedDeclIDs.clear(); 7072 7073 // FIXME: What happens if these are changed by a module import? 7074 if (!FPPragmaOptions.empty()) { 7075 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 7076 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0]; 7077 } 7078 7079 // FIXME: What happens if these are changed by a module import? 7080 if (!OpenCLExtensions.empty()) { 7081 unsigned I = 0; 7082 #define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++]; 7083 #include "clang/Basic/OpenCLExtensions.def" 7084 7085 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS"); 7086 } 7087 7088 UpdateSema(); 7089 } 7090 7091 void ASTReader::UpdateSema() { 7092 assert(SemaObj && "no Sema to update"); 7093 7094 // Load the offsets of the declarations that Sema references. 7095 // They will be lazily deserialized when needed. 7096 if (!SemaDeclRefs.empty()) { 7097 assert(SemaDeclRefs.size() % 2 == 0); 7098 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) { 7099 if (!SemaObj->StdNamespace) 7100 SemaObj->StdNamespace = SemaDeclRefs[I]; 7101 if (!SemaObj->StdBadAlloc) 7102 SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 7103 } 7104 SemaDeclRefs.clear(); 7105 } 7106 7107 // Update the state of 'pragma clang optimize'. Use the same API as if we had 7108 // encountered the pragma in the source. 7109 if(OptimizeOffPragmaLocation.isValid()) 7110 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation); 7111 } 7112 7113 IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) { 7114 // Note that we are loading an identifier. 7115 Deserializing AnIdentifier(this); 7116 StringRef Name(NameStart, NameEnd - NameStart); 7117 7118 // If there is a global index, look there first to determine which modules 7119 // provably do not have any results for this identifier. 7120 GlobalModuleIndex::HitSet Hits; 7121 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 7122 if (!loadGlobalIndex()) { 7123 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 7124 HitsPtr = &Hits; 7125 } 7126 } 7127 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 7128 NumIdentifierLookups, 7129 NumIdentifierLookupHits); 7130 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr); 7131 IdentifierInfo *II = Visitor.getIdentifierInfo(); 7132 markIdentifierUpToDate(II); 7133 return II; 7134 } 7135 7136 namespace clang { 7137 /// \brief An identifier-lookup iterator that enumerates all of the 7138 /// identifiers stored within a set of AST files. 7139 class ASTIdentifierIterator : public IdentifierIterator { 7140 /// \brief The AST reader whose identifiers are being enumerated. 7141 const ASTReader &Reader; 7142 7143 /// \brief The current index into the chain of AST files stored in 7144 /// the AST reader. 7145 unsigned Index; 7146 7147 /// \brief The current position within the identifier lookup table 7148 /// of the current AST file. 7149 ASTIdentifierLookupTable::key_iterator Current; 7150 7151 /// \brief The end position within the identifier lookup table of 7152 /// the current AST file. 7153 ASTIdentifierLookupTable::key_iterator End; 7154 7155 public: 7156 explicit ASTIdentifierIterator(const ASTReader &Reader); 7157 7158 StringRef Next() override; 7159 }; 7160 } 7161 7162 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader) 7163 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) { 7164 ASTIdentifierLookupTable *IdTable 7165 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable; 7166 Current = IdTable->key_begin(); 7167 End = IdTable->key_end(); 7168 } 7169 7170 StringRef ASTIdentifierIterator::Next() { 7171 while (Current == End) { 7172 // If we have exhausted all of our AST files, we're done. 7173 if (Index == 0) 7174 return StringRef(); 7175 7176 --Index; 7177 ASTIdentifierLookupTable *IdTable 7178 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index]. 7179 IdentifierLookupTable; 7180 Current = IdTable->key_begin(); 7181 End = IdTable->key_end(); 7182 } 7183 7184 // We have any identifiers remaining in the current AST file; return 7185 // the next one. 7186 StringRef Result = *Current; 7187 ++Current; 7188 return Result; 7189 } 7190 7191 IdentifierIterator *ASTReader::getIdentifiers() { 7192 if (!loadGlobalIndex()) 7193 return GlobalIndex->createIdentifierIterator(); 7194 7195 return new ASTIdentifierIterator(*this); 7196 } 7197 7198 namespace clang { namespace serialization { 7199 class ReadMethodPoolVisitor { 7200 ASTReader &Reader; 7201 Selector Sel; 7202 unsigned PriorGeneration; 7203 unsigned InstanceBits; 7204 unsigned FactoryBits; 7205 bool InstanceHasMoreThanOneDecl; 7206 bool FactoryHasMoreThanOneDecl; 7207 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 7208 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 7209 7210 public: 7211 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 7212 unsigned PriorGeneration) 7213 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration), 7214 InstanceBits(0), FactoryBits(0), InstanceHasMoreThanOneDecl(false), 7215 FactoryHasMoreThanOneDecl(false) {} 7216 7217 static bool visit(ModuleFile &M, void *UserData) { 7218 ReadMethodPoolVisitor *This 7219 = static_cast<ReadMethodPoolVisitor *>(UserData); 7220 7221 if (!M.SelectorLookupTable) 7222 return false; 7223 7224 // If we've already searched this module file, skip it now. 7225 if (M.Generation <= This->PriorGeneration) 7226 return true; 7227 7228 ++This->Reader.NumMethodPoolTableLookups; 7229 ASTSelectorLookupTable *PoolTable 7230 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 7231 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel); 7232 if (Pos == PoolTable->end()) 7233 return false; 7234 7235 ++This->Reader.NumMethodPoolTableHits; 7236 ++This->Reader.NumSelectorsRead; 7237 // FIXME: Not quite happy with the statistics here. We probably should 7238 // disable this tracking when called via LoadSelector. 7239 // Also, should entries without methods count as misses? 7240 ++This->Reader.NumMethodPoolEntriesRead; 7241 ASTSelectorLookupTrait::data_type Data = *Pos; 7242 if (This->Reader.DeserializationListener) 7243 This->Reader.DeserializationListener->SelectorRead(Data.ID, 7244 This->Sel); 7245 7246 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 7247 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 7248 This->InstanceBits = Data.InstanceBits; 7249 This->FactoryBits = Data.FactoryBits; 7250 This->InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl; 7251 This->FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl; 7252 return true; 7253 } 7254 7255 /// \brief Retrieve the instance methods found by this visitor. 7256 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 7257 return InstanceMethods; 7258 } 7259 7260 /// \brief Retrieve the instance methods found by this visitor. 7261 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 7262 return FactoryMethods; 7263 } 7264 7265 unsigned getInstanceBits() const { return InstanceBits; } 7266 unsigned getFactoryBits() const { return FactoryBits; } 7267 bool instanceHasMoreThanOneDecl() const { 7268 return InstanceHasMoreThanOneDecl; 7269 } 7270 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; } 7271 }; 7272 } } // end namespace clang::serialization 7273 7274 /// \brief Add the given set of methods to the method list. 7275 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 7276 ObjCMethodList &List) { 7277 for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 7278 S.addMethodToGlobalList(&List, Methods[I]); 7279 } 7280 } 7281 7282 void ASTReader::ReadMethodPool(Selector Sel) { 7283 // Get the selector generation and update it to the current generation. 7284 unsigned &Generation = SelectorGeneration[Sel]; 7285 unsigned PriorGeneration = Generation; 7286 Generation = getGeneration(); 7287 7288 // Search for methods defined with this selector. 7289 ++NumMethodPoolLookups; 7290 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 7291 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor); 7292 7293 if (Visitor.getInstanceMethods().empty() && 7294 Visitor.getFactoryMethods().empty()) 7295 return; 7296 7297 ++NumMethodPoolHits; 7298 7299 if (!getSema()) 7300 return; 7301 7302 Sema &S = *getSema(); 7303 Sema::GlobalMethodPool::iterator Pos 7304 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first; 7305 7306 Pos->second.first.setBits(Visitor.getInstanceBits()); 7307 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl()); 7308 Pos->second.second.setBits(Visitor.getFactoryBits()); 7309 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl()); 7310 7311 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since 7312 // when building a module we keep every method individually and may need to 7313 // update hasMoreThanOneDecl as we add the methods. 7314 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 7315 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 7316 } 7317 7318 void ASTReader::ReadKnownNamespaces( 7319 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 7320 Namespaces.clear(); 7321 7322 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 7323 if (NamespaceDecl *Namespace 7324 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 7325 Namespaces.push_back(Namespace); 7326 } 7327 } 7328 7329 void ASTReader::ReadUndefinedButUsed( 7330 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) { 7331 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 7332 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 7333 SourceLocation Loc = 7334 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 7335 Undefined.insert(std::make_pair(D, Loc)); 7336 } 7337 } 7338 7339 void ASTReader::ReadTentativeDefinitions( 7340 SmallVectorImpl<VarDecl *> &TentativeDefs) { 7341 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 7342 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 7343 if (Var) 7344 TentativeDefs.push_back(Var); 7345 } 7346 TentativeDefinitions.clear(); 7347 } 7348 7349 void ASTReader::ReadUnusedFileScopedDecls( 7350 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 7351 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 7352 DeclaratorDecl *D 7353 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 7354 if (D) 7355 Decls.push_back(D); 7356 } 7357 UnusedFileScopedDecls.clear(); 7358 } 7359 7360 void ASTReader::ReadDelegatingConstructors( 7361 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 7362 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 7363 CXXConstructorDecl *D 7364 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 7365 if (D) 7366 Decls.push_back(D); 7367 } 7368 DelegatingCtorDecls.clear(); 7369 } 7370 7371 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 7372 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 7373 TypedefNameDecl *D 7374 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 7375 if (D) 7376 Decls.push_back(D); 7377 } 7378 ExtVectorDecls.clear(); 7379 } 7380 7381 void ASTReader::ReadUnusedLocalTypedefNameCandidates( 7382 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 7383 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N; 7384 ++I) { 7385 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>( 7386 GetDecl(UnusedLocalTypedefNameCandidates[I])); 7387 if (D) 7388 Decls.insert(D); 7389 } 7390 UnusedLocalTypedefNameCandidates.clear(); 7391 } 7392 7393 void ASTReader::ReadReferencedSelectors( 7394 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) { 7395 if (ReferencedSelectorsData.empty()) 7396 return; 7397 7398 // If there are @selector references added them to its pool. This is for 7399 // implementation of -Wselector. 7400 unsigned int DataSize = ReferencedSelectorsData.size()-1; 7401 unsigned I = 0; 7402 while (I < DataSize) { 7403 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 7404 SourceLocation SelLoc 7405 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 7406 Sels.push_back(std::make_pair(Sel, SelLoc)); 7407 } 7408 ReferencedSelectorsData.clear(); 7409 } 7410 7411 void ASTReader::ReadWeakUndeclaredIdentifiers( 7412 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) { 7413 if (WeakUndeclaredIdentifiers.empty()) 7414 return; 7415 7416 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 7417 IdentifierInfo *WeakId 7418 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 7419 IdentifierInfo *AliasId 7420 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 7421 SourceLocation Loc 7422 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 7423 bool Used = WeakUndeclaredIdentifiers[I++]; 7424 WeakInfo WI(AliasId, Loc); 7425 WI.setUsed(Used); 7426 WeakIDs.push_back(std::make_pair(WeakId, WI)); 7427 } 7428 WeakUndeclaredIdentifiers.clear(); 7429 } 7430 7431 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 7432 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 7433 ExternalVTableUse VT; 7434 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 7435 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 7436 VT.DefinitionRequired = VTableUses[Idx++]; 7437 VTables.push_back(VT); 7438 } 7439 7440 VTableUses.clear(); 7441 } 7442 7443 void ASTReader::ReadPendingInstantiations( 7444 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) { 7445 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 7446 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 7447 SourceLocation Loc 7448 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 7449 7450 Pending.push_back(std::make_pair(D, Loc)); 7451 } 7452 PendingInstantiations.clear(); 7453 } 7454 7455 void ASTReader::ReadLateParsedTemplates( 7456 llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) { 7457 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N; 7458 /* In loop */) { 7459 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++])); 7460 7461 LateParsedTemplate *LT = new LateParsedTemplate; 7462 LT->D = GetDecl(LateParsedTemplates[Idx++]); 7463 7464 ModuleFile *F = getOwningModuleFile(LT->D); 7465 assert(F && "No module"); 7466 7467 unsigned TokN = LateParsedTemplates[Idx++]; 7468 LT->Toks.reserve(TokN); 7469 for (unsigned T = 0; T < TokN; ++T) 7470 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx)); 7471 7472 LPTMap[FD] = LT; 7473 } 7474 7475 LateParsedTemplates.clear(); 7476 } 7477 7478 void ASTReader::LoadSelector(Selector Sel) { 7479 // It would be complicated to avoid reading the methods anyway. So don't. 7480 ReadMethodPool(Sel); 7481 } 7482 7483 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 7484 assert(ID && "Non-zero identifier ID required"); 7485 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 7486 IdentifiersLoaded[ID - 1] = II; 7487 if (DeserializationListener) 7488 DeserializationListener->IdentifierRead(ID, II); 7489 } 7490 7491 /// \brief Set the globally-visible declarations associated with the given 7492 /// identifier. 7493 /// 7494 /// If the AST reader is currently in a state where the given declaration IDs 7495 /// cannot safely be resolved, they are queued until it is safe to resolve 7496 /// them. 7497 /// 7498 /// \param II an IdentifierInfo that refers to one or more globally-visible 7499 /// declarations. 7500 /// 7501 /// \param DeclIDs the set of declaration IDs with the name @p II that are 7502 /// visible at global scope. 7503 /// 7504 /// \param Decls if non-null, this vector will be populated with the set of 7505 /// deserialized declarations. These declarations will not be pushed into 7506 /// scope. 7507 void 7508 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 7509 const SmallVectorImpl<uint32_t> &DeclIDs, 7510 SmallVectorImpl<Decl *> *Decls) { 7511 if (NumCurrentElementsDeserializing && !Decls) { 7512 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 7513 return; 7514 } 7515 7516 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 7517 if (!SemaObj) { 7518 // Queue this declaration so that it will be added to the 7519 // translation unit scope and identifier's declaration chain 7520 // once a Sema object is known. 7521 PreloadedDeclIDs.push_back(DeclIDs[I]); 7522 continue; 7523 } 7524 7525 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 7526 7527 // If we're simply supposed to record the declarations, do so now. 7528 if (Decls) { 7529 Decls->push_back(D); 7530 continue; 7531 } 7532 7533 // Introduce this declaration into the translation-unit scope 7534 // and add it to the declaration chain for this identifier, so 7535 // that (unqualified) name lookup will find it. 7536 pushExternalDeclIntoScope(D, II); 7537 } 7538 } 7539 7540 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 7541 if (ID == 0) 7542 return nullptr; 7543 7544 if (IdentifiersLoaded.empty()) { 7545 Error("no identifier table in AST file"); 7546 return nullptr; 7547 } 7548 7549 ID -= 1; 7550 if (!IdentifiersLoaded[ID]) { 7551 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 7552 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 7553 ModuleFile *M = I->second; 7554 unsigned Index = ID - M->BaseIdentifierID; 7555 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index]; 7556 7557 // All of the strings in the AST file are preceded by a 16-bit length. 7558 // Extract that 16-bit length to avoid having to execute strlen(). 7559 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as 7560 // unsigned integers. This is important to avoid integer overflow when 7561 // we cast them to 'unsigned'. 7562 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2; 7563 unsigned StrLen = (((unsigned) StrLenPtr[0]) 7564 | (((unsigned) StrLenPtr[1]) << 8)) - 1; 7565 IdentifiersLoaded[ID] 7566 = &PP.getIdentifierTable().get(StringRef(Str, StrLen)); 7567 if (DeserializationListener) 7568 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]); 7569 } 7570 7571 return IdentifiersLoaded[ID]; 7572 } 7573 7574 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 7575 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 7576 } 7577 7578 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 7579 if (LocalID < NUM_PREDEF_IDENT_IDS) 7580 return LocalID; 7581 7582 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7583 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 7584 assert(I != M.IdentifierRemap.end() 7585 && "Invalid index into identifier index remap"); 7586 7587 return LocalID + I->second; 7588 } 7589 7590 MacroInfo *ASTReader::getMacro(MacroID ID) { 7591 if (ID == 0) 7592 return nullptr; 7593 7594 if (MacrosLoaded.empty()) { 7595 Error("no macro table in AST file"); 7596 return nullptr; 7597 } 7598 7599 ID -= NUM_PREDEF_MACRO_IDS; 7600 if (!MacrosLoaded[ID]) { 7601 GlobalMacroMapType::iterator I 7602 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 7603 assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 7604 ModuleFile *M = I->second; 7605 unsigned Index = ID - M->BaseMacroID; 7606 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]); 7607 7608 if (DeserializationListener) 7609 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 7610 MacrosLoaded[ID]); 7611 } 7612 7613 return MacrosLoaded[ID]; 7614 } 7615 7616 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 7617 if (LocalID < NUM_PREDEF_MACRO_IDS) 7618 return LocalID; 7619 7620 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7621 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 7622 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 7623 7624 return LocalID + I->second; 7625 } 7626 7627 serialization::SubmoduleID 7628 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 7629 if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 7630 return LocalID; 7631 7632 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7633 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 7634 assert(I != M.SubmoduleRemap.end() 7635 && "Invalid index into submodule index remap"); 7636 7637 return LocalID + I->second; 7638 } 7639 7640 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) { 7641 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 7642 assert(GlobalID == 0 && "Unhandled global submodule ID"); 7643 return nullptr; 7644 } 7645 7646 if (GlobalID > SubmodulesLoaded.size()) { 7647 Error("submodule ID out of range in AST file"); 7648 return nullptr; 7649 } 7650 7651 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 7652 } 7653 7654 Module *ASTReader::getModule(unsigned ID) { 7655 return getSubmodule(ID); 7656 } 7657 7658 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 7659 return DecodeSelector(getGlobalSelectorID(M, LocalID)); 7660 } 7661 7662 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { 7663 if (ID == 0) 7664 return Selector(); 7665 7666 if (ID > SelectorsLoaded.size()) { 7667 Error("selector ID out of range in AST file"); 7668 return Selector(); 7669 } 7670 7671 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) { 7672 // Load this selector from the selector table. 7673 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 7674 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 7675 ModuleFile &M = *I->second; 7676 ASTSelectorLookupTrait Trait(*this, M); 7677 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 7678 SelectorsLoaded[ID - 1] = 7679 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 7680 if (DeserializationListener) 7681 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 7682 } 7683 7684 return SelectorsLoaded[ID - 1]; 7685 } 7686 7687 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 7688 return DecodeSelector(ID); 7689 } 7690 7691 uint32_t ASTReader::GetNumExternalSelectors() { 7692 // ID 0 (the null selector) is considered an external selector. 7693 return getTotalNumSelectors() + 1; 7694 } 7695 7696 serialization::SelectorID 7697 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 7698 if (LocalID < NUM_PREDEF_SELECTOR_IDS) 7699 return LocalID; 7700 7701 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7702 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 7703 assert(I != M.SelectorRemap.end() 7704 && "Invalid index into selector index remap"); 7705 7706 return LocalID + I->second; 7707 } 7708 7709 DeclarationName 7710 ASTReader::ReadDeclarationName(ModuleFile &F, 7711 const RecordData &Record, unsigned &Idx) { 7712 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++]; 7713 switch (Kind) { 7714 case DeclarationName::Identifier: 7715 return DeclarationName(GetIdentifierInfo(F, Record, Idx)); 7716 7717 case DeclarationName::ObjCZeroArgSelector: 7718 case DeclarationName::ObjCOneArgSelector: 7719 case DeclarationName::ObjCMultiArgSelector: 7720 return DeclarationName(ReadSelector(F, Record, Idx)); 7721 7722 case DeclarationName::CXXConstructorName: 7723 return Context.DeclarationNames.getCXXConstructorName( 7724 Context.getCanonicalType(readType(F, Record, Idx))); 7725 7726 case DeclarationName::CXXDestructorName: 7727 return Context.DeclarationNames.getCXXDestructorName( 7728 Context.getCanonicalType(readType(F, Record, Idx))); 7729 7730 case DeclarationName::CXXConversionFunctionName: 7731 return Context.DeclarationNames.getCXXConversionFunctionName( 7732 Context.getCanonicalType(readType(F, Record, Idx))); 7733 7734 case DeclarationName::CXXOperatorName: 7735 return Context.DeclarationNames.getCXXOperatorName( 7736 (OverloadedOperatorKind)Record[Idx++]); 7737 7738 case DeclarationName::CXXLiteralOperatorName: 7739 return Context.DeclarationNames.getCXXLiteralOperatorName( 7740 GetIdentifierInfo(F, Record, Idx)); 7741 7742 case DeclarationName::CXXUsingDirective: 7743 return DeclarationName::getUsingDirectiveName(); 7744 } 7745 7746 llvm_unreachable("Invalid NameKind!"); 7747 } 7748 7749 void ASTReader::ReadDeclarationNameLoc(ModuleFile &F, 7750 DeclarationNameLoc &DNLoc, 7751 DeclarationName Name, 7752 const RecordData &Record, unsigned &Idx) { 7753 switch (Name.getNameKind()) { 7754 case DeclarationName::CXXConstructorName: 7755 case DeclarationName::CXXDestructorName: 7756 case DeclarationName::CXXConversionFunctionName: 7757 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx); 7758 break; 7759 7760 case DeclarationName::CXXOperatorName: 7761 DNLoc.CXXOperatorName.BeginOpNameLoc 7762 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 7763 DNLoc.CXXOperatorName.EndOpNameLoc 7764 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 7765 break; 7766 7767 case DeclarationName::CXXLiteralOperatorName: 7768 DNLoc.CXXLiteralOperatorName.OpNameLoc 7769 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 7770 break; 7771 7772 case DeclarationName::Identifier: 7773 case DeclarationName::ObjCZeroArgSelector: 7774 case DeclarationName::ObjCOneArgSelector: 7775 case DeclarationName::ObjCMultiArgSelector: 7776 case DeclarationName::CXXUsingDirective: 7777 break; 7778 } 7779 } 7780 7781 void ASTReader::ReadDeclarationNameInfo(ModuleFile &F, 7782 DeclarationNameInfo &NameInfo, 7783 const RecordData &Record, unsigned &Idx) { 7784 NameInfo.setName(ReadDeclarationName(F, Record, Idx)); 7785 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx)); 7786 DeclarationNameLoc DNLoc; 7787 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx); 7788 NameInfo.setInfo(DNLoc); 7789 } 7790 7791 void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info, 7792 const RecordData &Record, unsigned &Idx) { 7793 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx); 7794 unsigned NumTPLists = Record[Idx++]; 7795 Info.NumTemplParamLists = NumTPLists; 7796 if (NumTPLists) { 7797 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists]; 7798 for (unsigned i=0; i != NumTPLists; ++i) 7799 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx); 7800 } 7801 } 7802 7803 TemplateName 7804 ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record, 7805 unsigned &Idx) { 7806 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++]; 7807 switch (Kind) { 7808 case TemplateName::Template: 7809 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx)); 7810 7811 case TemplateName::OverloadedTemplate: { 7812 unsigned size = Record[Idx++]; 7813 UnresolvedSet<8> Decls; 7814 while (size--) 7815 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx)); 7816 7817 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end()); 7818 } 7819 7820 case TemplateName::QualifiedTemplate: { 7821 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 7822 bool hasTemplKeyword = Record[Idx++]; 7823 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx); 7824 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template); 7825 } 7826 7827 case TemplateName::DependentTemplate: { 7828 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 7829 if (Record[Idx++]) // isIdentifier 7830 return Context.getDependentTemplateName(NNS, 7831 GetIdentifierInfo(F, Record, 7832 Idx)); 7833 return Context.getDependentTemplateName(NNS, 7834 (OverloadedOperatorKind)Record[Idx++]); 7835 } 7836 7837 case TemplateName::SubstTemplateTemplateParm: { 7838 TemplateTemplateParmDecl *param 7839 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 7840 if (!param) return TemplateName(); 7841 TemplateName replacement = ReadTemplateName(F, Record, Idx); 7842 return Context.getSubstTemplateTemplateParm(param, replacement); 7843 } 7844 7845 case TemplateName::SubstTemplateTemplateParmPack: { 7846 TemplateTemplateParmDecl *Param 7847 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 7848 if (!Param) 7849 return TemplateName(); 7850 7851 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx); 7852 if (ArgPack.getKind() != TemplateArgument::Pack) 7853 return TemplateName(); 7854 7855 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 7856 } 7857 } 7858 7859 llvm_unreachable("Unhandled template name kind!"); 7860 } 7861 7862 TemplateArgument 7863 ASTReader::ReadTemplateArgument(ModuleFile &F, 7864 const RecordData &Record, unsigned &Idx) { 7865 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++]; 7866 switch (Kind) { 7867 case TemplateArgument::Null: 7868 return TemplateArgument(); 7869 case TemplateArgument::Type: 7870 return TemplateArgument(readType(F, Record, Idx)); 7871 case TemplateArgument::Declaration: { 7872 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx); 7873 return TemplateArgument(D, readType(F, Record, Idx)); 7874 } 7875 case TemplateArgument::NullPtr: 7876 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true); 7877 case TemplateArgument::Integral: { 7878 llvm::APSInt Value = ReadAPSInt(Record, Idx); 7879 QualType T = readType(F, Record, Idx); 7880 return TemplateArgument(Context, Value, T); 7881 } 7882 case TemplateArgument::Template: 7883 return TemplateArgument(ReadTemplateName(F, Record, Idx)); 7884 case TemplateArgument::TemplateExpansion: { 7885 TemplateName Name = ReadTemplateName(F, Record, Idx); 7886 Optional<unsigned> NumTemplateExpansions; 7887 if (unsigned NumExpansions = Record[Idx++]) 7888 NumTemplateExpansions = NumExpansions - 1; 7889 return TemplateArgument(Name, NumTemplateExpansions); 7890 } 7891 case TemplateArgument::Expression: 7892 return TemplateArgument(ReadExpr(F)); 7893 case TemplateArgument::Pack: { 7894 unsigned NumArgs = Record[Idx++]; 7895 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs]; 7896 for (unsigned I = 0; I != NumArgs; ++I) 7897 Args[I] = ReadTemplateArgument(F, Record, Idx); 7898 return TemplateArgument(Args, NumArgs); 7899 } 7900 } 7901 7902 llvm_unreachable("Unhandled template argument kind!"); 7903 } 7904 7905 TemplateParameterList * 7906 ASTReader::ReadTemplateParameterList(ModuleFile &F, 7907 const RecordData &Record, unsigned &Idx) { 7908 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx); 7909 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx); 7910 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx); 7911 7912 unsigned NumParams = Record[Idx++]; 7913 SmallVector<NamedDecl *, 16> Params; 7914 Params.reserve(NumParams); 7915 while (NumParams--) 7916 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx)); 7917 7918 TemplateParameterList* TemplateParams = 7919 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc, 7920 Params.data(), Params.size(), RAngleLoc); 7921 return TemplateParams; 7922 } 7923 7924 void 7925 ASTReader:: 7926 ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs, 7927 ModuleFile &F, const RecordData &Record, 7928 unsigned &Idx) { 7929 unsigned NumTemplateArgs = Record[Idx++]; 7930 TemplArgs.reserve(NumTemplateArgs); 7931 while (NumTemplateArgs--) 7932 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx)); 7933 } 7934 7935 /// \brief Read a UnresolvedSet structure. 7936 void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set, 7937 const RecordData &Record, unsigned &Idx) { 7938 unsigned NumDecls = Record[Idx++]; 7939 Set.reserve(Context, NumDecls); 7940 while (NumDecls--) { 7941 DeclID ID = ReadDeclID(F, Record, Idx); 7942 AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 7943 Set.addLazyDecl(Context, ID, AS); 7944 } 7945 } 7946 7947 CXXBaseSpecifier 7948 ASTReader::ReadCXXBaseSpecifier(ModuleFile &F, 7949 const RecordData &Record, unsigned &Idx) { 7950 bool isVirtual = static_cast<bool>(Record[Idx++]); 7951 bool isBaseOfClass = static_cast<bool>(Record[Idx++]); 7952 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]); 7953 bool inheritConstructors = static_cast<bool>(Record[Idx++]); 7954 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx); 7955 SourceRange Range = ReadSourceRange(F, Record, Idx); 7956 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx); 7957 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 7958 EllipsisLoc); 7959 Result.setInheritConstructors(inheritConstructors); 7960 return Result; 7961 } 7962 7963 CXXCtorInitializer ** 7964 ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record, 7965 unsigned &Idx) { 7966 unsigned NumInitializers = Record[Idx++]; 7967 assert(NumInitializers && "wrote ctor initializers but have no inits"); 7968 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers]; 7969 for (unsigned i = 0; i != NumInitializers; ++i) { 7970 TypeSourceInfo *TInfo = nullptr; 7971 bool IsBaseVirtual = false; 7972 FieldDecl *Member = nullptr; 7973 IndirectFieldDecl *IndirectMember = nullptr; 7974 7975 CtorInitializerType Type = (CtorInitializerType)Record[Idx++]; 7976 switch (Type) { 7977 case CTOR_INITIALIZER_BASE: 7978 TInfo = GetTypeSourceInfo(F, Record, Idx); 7979 IsBaseVirtual = Record[Idx++]; 7980 break; 7981 7982 case CTOR_INITIALIZER_DELEGATING: 7983 TInfo = GetTypeSourceInfo(F, Record, Idx); 7984 break; 7985 7986 case CTOR_INITIALIZER_MEMBER: 7987 Member = ReadDeclAs<FieldDecl>(F, Record, Idx); 7988 break; 7989 7990 case CTOR_INITIALIZER_INDIRECT_MEMBER: 7991 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx); 7992 break; 7993 } 7994 7995 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx); 7996 Expr *Init = ReadExpr(F); 7997 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx); 7998 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx); 7999 bool IsWritten = Record[Idx++]; 8000 unsigned SourceOrderOrNumArrayIndices; 8001 SmallVector<VarDecl *, 8> Indices; 8002 if (IsWritten) { 8003 SourceOrderOrNumArrayIndices = Record[Idx++]; 8004 } else { 8005 SourceOrderOrNumArrayIndices = Record[Idx++]; 8006 Indices.reserve(SourceOrderOrNumArrayIndices); 8007 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i) 8008 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx)); 8009 } 8010 8011 CXXCtorInitializer *BOMInit; 8012 if (Type == CTOR_INITIALIZER_BASE) { 8013 BOMInit = new (Context) 8014 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init, 8015 RParenLoc, MemberOrEllipsisLoc); 8016 } else if (Type == CTOR_INITIALIZER_DELEGATING) { 8017 BOMInit = new (Context) 8018 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc); 8019 } else if (IsWritten) { 8020 if (Member) 8021 BOMInit = new (Context) CXXCtorInitializer( 8022 Context, Member, MemberOrEllipsisLoc, LParenLoc, Init, RParenLoc); 8023 else 8024 BOMInit = new (Context) 8025 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc, 8026 LParenLoc, Init, RParenLoc); 8027 } else { 8028 if (IndirectMember) { 8029 assert(Indices.empty() && "Indirect field improperly initialized"); 8030 BOMInit = new (Context) 8031 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc, 8032 LParenLoc, Init, RParenLoc); 8033 } else { 8034 BOMInit = CXXCtorInitializer::Create( 8035 Context, Member, MemberOrEllipsisLoc, LParenLoc, Init, RParenLoc, 8036 Indices.data(), Indices.size()); 8037 } 8038 } 8039 8040 if (IsWritten) 8041 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices); 8042 CtorInitializers[i] = BOMInit; 8043 } 8044 8045 return CtorInitializers; 8046 } 8047 8048 NestedNameSpecifier * 8049 ASTReader::ReadNestedNameSpecifier(ModuleFile &F, 8050 const RecordData &Record, unsigned &Idx) { 8051 unsigned N = Record[Idx++]; 8052 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr; 8053 for (unsigned I = 0; I != N; ++I) { 8054 NestedNameSpecifier::SpecifierKind Kind 8055 = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 8056 switch (Kind) { 8057 case NestedNameSpecifier::Identifier: { 8058 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 8059 NNS = NestedNameSpecifier::Create(Context, Prev, II); 8060 break; 8061 } 8062 8063 case NestedNameSpecifier::Namespace: { 8064 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 8065 NNS = NestedNameSpecifier::Create(Context, Prev, NS); 8066 break; 8067 } 8068 8069 case NestedNameSpecifier::NamespaceAlias: { 8070 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 8071 NNS = NestedNameSpecifier::Create(Context, Prev, Alias); 8072 break; 8073 } 8074 8075 case NestedNameSpecifier::TypeSpec: 8076 case NestedNameSpecifier::TypeSpecWithTemplate: { 8077 const Type *T = readType(F, Record, Idx).getTypePtrOrNull(); 8078 if (!T) 8079 return nullptr; 8080 8081 bool Template = Record[Idx++]; 8082 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T); 8083 break; 8084 } 8085 8086 case NestedNameSpecifier::Global: { 8087 NNS = NestedNameSpecifier::GlobalSpecifier(Context); 8088 // No associated value, and there can't be a prefix. 8089 break; 8090 } 8091 8092 case NestedNameSpecifier::Super: { 8093 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx); 8094 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD); 8095 break; 8096 } 8097 } 8098 Prev = NNS; 8099 } 8100 return NNS; 8101 } 8102 8103 NestedNameSpecifierLoc 8104 ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record, 8105 unsigned &Idx) { 8106 unsigned N = Record[Idx++]; 8107 NestedNameSpecifierLocBuilder Builder; 8108 for (unsigned I = 0; I != N; ++I) { 8109 NestedNameSpecifier::SpecifierKind Kind 8110 = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 8111 switch (Kind) { 8112 case NestedNameSpecifier::Identifier: { 8113 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 8114 SourceRange Range = ReadSourceRange(F, Record, Idx); 8115 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 8116 break; 8117 } 8118 8119 case NestedNameSpecifier::Namespace: { 8120 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 8121 SourceRange Range = ReadSourceRange(F, Record, Idx); 8122 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 8123 break; 8124 } 8125 8126 case NestedNameSpecifier::NamespaceAlias: { 8127 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 8128 SourceRange Range = ReadSourceRange(F, Record, Idx); 8129 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 8130 break; 8131 } 8132 8133 case NestedNameSpecifier::TypeSpec: 8134 case NestedNameSpecifier::TypeSpecWithTemplate: { 8135 bool Template = Record[Idx++]; 8136 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx); 8137 if (!T) 8138 return NestedNameSpecifierLoc(); 8139 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 8140 8141 // FIXME: 'template' keyword location not saved anywhere, so we fake it. 8142 Builder.Extend(Context, 8143 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 8144 T->getTypeLoc(), ColonColonLoc); 8145 break; 8146 } 8147 8148 case NestedNameSpecifier::Global: { 8149 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 8150 Builder.MakeGlobal(Context, ColonColonLoc); 8151 break; 8152 } 8153 8154 case NestedNameSpecifier::Super: { 8155 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx); 8156 SourceRange Range = ReadSourceRange(F, Record, Idx); 8157 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd()); 8158 break; 8159 } 8160 } 8161 } 8162 8163 return Builder.getWithLocInContext(Context); 8164 } 8165 8166 SourceRange 8167 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 8168 unsigned &Idx) { 8169 SourceLocation beg = ReadSourceLocation(F, Record, Idx); 8170 SourceLocation end = ReadSourceLocation(F, Record, Idx); 8171 return SourceRange(beg, end); 8172 } 8173 8174 /// \brief Read an integral value 8175 llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) { 8176 unsigned BitWidth = Record[Idx++]; 8177 unsigned NumWords = llvm::APInt::getNumWords(BitWidth); 8178 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]); 8179 Idx += NumWords; 8180 return Result; 8181 } 8182 8183 /// \brief Read a signed integral value 8184 llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) { 8185 bool isUnsigned = Record[Idx++]; 8186 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned); 8187 } 8188 8189 /// \brief Read a floating-point value 8190 llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record, 8191 const llvm::fltSemantics &Sem, 8192 unsigned &Idx) { 8193 return llvm::APFloat(Sem, ReadAPInt(Record, Idx)); 8194 } 8195 8196 // \brief Read a string 8197 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 8198 unsigned Len = Record[Idx++]; 8199 std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 8200 Idx += Len; 8201 return Result; 8202 } 8203 8204 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record, 8205 unsigned &Idx) { 8206 std::string Filename = ReadString(Record, Idx); 8207 ResolveImportedPath(F, Filename); 8208 return Filename; 8209 } 8210 8211 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 8212 unsigned &Idx) { 8213 unsigned Major = Record[Idx++]; 8214 unsigned Minor = Record[Idx++]; 8215 unsigned Subminor = Record[Idx++]; 8216 if (Minor == 0) 8217 return VersionTuple(Major); 8218 if (Subminor == 0) 8219 return VersionTuple(Major, Minor - 1); 8220 return VersionTuple(Major, Minor - 1, Subminor - 1); 8221 } 8222 8223 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 8224 const RecordData &Record, 8225 unsigned &Idx) { 8226 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 8227 return CXXTemporary::Create(Context, Decl); 8228 } 8229 8230 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) { 8231 return Diag(CurrentImportLoc, DiagID); 8232 } 8233 8234 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) { 8235 return Diags.Report(Loc, DiagID); 8236 } 8237 8238 /// \brief Retrieve the identifier table associated with the 8239 /// preprocessor. 8240 IdentifierTable &ASTReader::getIdentifierTable() { 8241 return PP.getIdentifierTable(); 8242 } 8243 8244 /// \brief Record that the given ID maps to the given switch-case 8245 /// statement. 8246 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 8247 assert((*CurrSwitchCaseStmts)[ID] == nullptr && 8248 "Already have a SwitchCase with this ID"); 8249 (*CurrSwitchCaseStmts)[ID] = SC; 8250 } 8251 8252 /// \brief Retrieve the switch-case statement with the given ID. 8253 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 8254 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID"); 8255 return (*CurrSwitchCaseStmts)[ID]; 8256 } 8257 8258 void ASTReader::ClearSwitchCaseIDs() { 8259 CurrSwitchCaseStmts->clear(); 8260 } 8261 8262 void ASTReader::ReadComments() { 8263 std::vector<RawComment *> Comments; 8264 for (SmallVectorImpl<std::pair<BitstreamCursor, 8265 serialization::ModuleFile *> >::iterator 8266 I = CommentsCursors.begin(), 8267 E = CommentsCursors.end(); 8268 I != E; ++I) { 8269 Comments.clear(); 8270 BitstreamCursor &Cursor = I->first; 8271 serialization::ModuleFile &F = *I->second; 8272 SavedStreamPosition SavedPosition(Cursor); 8273 8274 RecordData Record; 8275 while (true) { 8276 llvm::BitstreamEntry Entry = 8277 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd); 8278 8279 switch (Entry.Kind) { 8280 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 8281 case llvm::BitstreamEntry::Error: 8282 Error("malformed block record in AST file"); 8283 return; 8284 case llvm::BitstreamEntry::EndBlock: 8285 goto NextCursor; 8286 case llvm::BitstreamEntry::Record: 8287 // The interesting case. 8288 break; 8289 } 8290 8291 // Read a record. 8292 Record.clear(); 8293 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) { 8294 case COMMENTS_RAW_COMMENT: { 8295 unsigned Idx = 0; 8296 SourceRange SR = ReadSourceRange(F, Record, Idx); 8297 RawComment::CommentKind Kind = 8298 (RawComment::CommentKind) Record[Idx++]; 8299 bool IsTrailingComment = Record[Idx++]; 8300 bool IsAlmostTrailingComment = Record[Idx++]; 8301 Comments.push_back(new (Context) RawComment( 8302 SR, Kind, IsTrailingComment, IsAlmostTrailingComment, 8303 Context.getLangOpts().CommentOpts.ParseAllComments)); 8304 break; 8305 } 8306 } 8307 } 8308 NextCursor: 8309 Context.Comments.addDeserializedComments(Comments); 8310 } 8311 } 8312 8313 void ASTReader::getInputFiles(ModuleFile &F, 8314 SmallVectorImpl<serialization::InputFile> &Files) { 8315 for (unsigned I = 0, E = F.InputFilesLoaded.size(); I != E; ++I) { 8316 unsigned ID = I+1; 8317 Files.push_back(getInputFile(F, ID)); 8318 } 8319 } 8320 8321 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) { 8322 // If we know the owning module, use it. 8323 if (Module *M = D->getOwningModule()) 8324 return M->getFullModuleName(); 8325 8326 // Otherwise, use the name of the top-level module the decl is within. 8327 if (ModuleFile *M = getOwningModuleFile(D)) 8328 return M->ModuleName; 8329 8330 // Not from a module. 8331 return ""; 8332 } 8333 8334 void ASTReader::finishPendingActions() { 8335 while (!PendingIdentifierInfos.empty() || 8336 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() || 8337 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || 8338 !PendingUpdateRecords.empty()) { 8339 // If any identifiers with corresponding top-level declarations have 8340 // been loaded, load those declarations now. 8341 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> > 8342 TopLevelDeclsMap; 8343 TopLevelDeclsMap TopLevelDecls; 8344 8345 while (!PendingIdentifierInfos.empty()) { 8346 IdentifierInfo *II = PendingIdentifierInfos.back().first; 8347 SmallVector<uint32_t, 4> DeclIDs = 8348 std::move(PendingIdentifierInfos.back().second); 8349 PendingIdentifierInfos.pop_back(); 8350 8351 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 8352 } 8353 8354 // For each decl chain that we wanted to complete while deserializing, mark 8355 // it as "still needs to be completed". 8356 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) { 8357 markIncompleteDeclChain(PendingIncompleteDeclChains[I]); 8358 } 8359 PendingIncompleteDeclChains.clear(); 8360 8361 // Load pending declaration chains. 8362 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) { 8363 PendingDeclChainsKnown.erase(PendingDeclChains[I]); 8364 loadPendingDeclChain(PendingDeclChains[I]); 8365 } 8366 assert(PendingDeclChainsKnown.empty()); 8367 PendingDeclChains.clear(); 8368 8369 // Make the most recent of the top-level declarations visible. 8370 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 8371 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 8372 IdentifierInfo *II = TLD->first; 8373 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 8374 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 8375 } 8376 } 8377 8378 // Load any pending macro definitions. 8379 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 8380 IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 8381 SmallVector<PendingMacroInfo, 2> GlobalIDs; 8382 GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 8383 // Initialize the macro history from chained-PCHs ahead of module imports. 8384 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 8385 ++IDIdx) { 8386 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 8387 if (Info.M->Kind != MK_ImplicitModule && 8388 Info.M->Kind != MK_ExplicitModule) 8389 resolvePendingMacro(II, Info); 8390 } 8391 // Handle module imports. 8392 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 8393 ++IDIdx) { 8394 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 8395 if (Info.M->Kind == MK_ImplicitModule || 8396 Info.M->Kind == MK_ExplicitModule) 8397 resolvePendingMacro(II, Info); 8398 } 8399 } 8400 PendingMacroIDs.clear(); 8401 8402 // Wire up the DeclContexts for Decls that we delayed setting until 8403 // recursive loading is completed. 8404 while (!PendingDeclContextInfos.empty()) { 8405 PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 8406 PendingDeclContextInfos.pop_front(); 8407 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 8408 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 8409 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 8410 } 8411 8412 // Perform any pending declaration updates. 8413 while (!PendingUpdateRecords.empty()) { 8414 auto Update = PendingUpdateRecords.pop_back_val(); 8415 ReadingKindTracker ReadingKind(Read_Decl, *this); 8416 loadDeclUpdateRecords(Update.first, Update.second); 8417 } 8418 } 8419 8420 // At this point, all update records for loaded decls are in place, so any 8421 // fake class definitions should have become real. 8422 assert(PendingFakeDefinitionData.empty() && 8423 "faked up a class definition but never saw the real one"); 8424 8425 // If we deserialized any C++ or Objective-C class definitions, any 8426 // Objective-C protocol definitions, or any redeclarable templates, make sure 8427 // that all redeclarations point to the definitions. Note that this can only 8428 // happen now, after the redeclaration chains have been fully wired. 8429 for (Decl *D : PendingDefinitions) { 8430 if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 8431 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) { 8432 // Make sure that the TagType points at the definition. 8433 const_cast<TagType*>(TagT)->decl = TD; 8434 } 8435 8436 if (auto RD = dyn_cast<CXXRecordDecl>(D)) { 8437 for (auto *R = getMostRecentExistingDecl(RD); R; 8438 R = R->getPreviousDecl()) { 8439 assert((R == D) == 8440 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && 8441 "declaration thinks it's the definition but it isn't"); 8442 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData; 8443 } 8444 } 8445 8446 continue; 8447 } 8448 8449 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) { 8450 // Make sure that the ObjCInterfaceType points at the definition. 8451 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 8452 ->Decl = ID; 8453 8454 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl()) 8455 cast<ObjCInterfaceDecl>(R)->Data = ID->Data; 8456 8457 continue; 8458 } 8459 8460 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) { 8461 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl()) 8462 cast<ObjCProtocolDecl>(R)->Data = PD->Data; 8463 8464 continue; 8465 } 8466 8467 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl(); 8468 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl()) 8469 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common; 8470 } 8471 PendingDefinitions.clear(); 8472 8473 // Load the bodies of any functions or methods we've encountered. We do 8474 // this now (delayed) so that we can be sure that the declaration chains 8475 // have been fully wired up. 8476 // FIXME: There seems to be no point in delaying this, it does not depend 8477 // on the redecl chains having been wired up. 8478 for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 8479 PBEnd = PendingBodies.end(); 8480 PB != PBEnd; ++PB) { 8481 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 8482 // FIXME: Check for =delete/=default? 8483 // FIXME: Complain about ODR violations here? 8484 if (!getContext().getLangOpts().Modules || !FD->hasBody()) 8485 FD->setLazyBody(PB->second); 8486 continue; 8487 } 8488 8489 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 8490 if (!getContext().getLangOpts().Modules || !MD->hasBody()) 8491 MD->setLazyBody(PB->second); 8492 } 8493 PendingBodies.clear(); 8494 } 8495 8496 void ASTReader::diagnoseOdrViolations() { 8497 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty()) 8498 return; 8499 8500 // Trigger the import of the full definition of each class that had any 8501 // odr-merging problems, so we can produce better diagnostics for them. 8502 // These updates may in turn find and diagnose some ODR failures, so take 8503 // ownership of the set first. 8504 auto OdrMergeFailures = std::move(PendingOdrMergeFailures); 8505 PendingOdrMergeFailures.clear(); 8506 for (auto &Merge : OdrMergeFailures) { 8507 Merge.first->buildLookup(); 8508 Merge.first->decls_begin(); 8509 Merge.first->bases_begin(); 8510 Merge.first->vbases_begin(); 8511 for (auto *RD : Merge.second) { 8512 RD->decls_begin(); 8513 RD->bases_begin(); 8514 RD->vbases_begin(); 8515 } 8516 } 8517 8518 // For each declaration from a merged context, check that the canonical 8519 // definition of that context also contains a declaration of the same 8520 // entity. 8521 // 8522 // Caution: this loop does things that might invalidate iterators into 8523 // PendingOdrMergeChecks. Don't turn this into a range-based for loop! 8524 while (!PendingOdrMergeChecks.empty()) { 8525 NamedDecl *D = PendingOdrMergeChecks.pop_back_val(); 8526 8527 // FIXME: Skip over implicit declarations for now. This matters for things 8528 // like implicitly-declared special member functions. This isn't entirely 8529 // correct; we can end up with multiple unmerged declarations of the same 8530 // implicit entity. 8531 if (D->isImplicit()) 8532 continue; 8533 8534 DeclContext *CanonDef = D->getDeclContext(); 8535 8536 bool Found = false; 8537 const Decl *DCanon = D->getCanonicalDecl(); 8538 8539 for (auto RI : D->redecls()) { 8540 if (RI->getLexicalDeclContext() == CanonDef) { 8541 Found = true; 8542 break; 8543 } 8544 } 8545 if (Found) 8546 continue; 8547 8548 llvm::SmallVector<const NamedDecl*, 4> Candidates; 8549 DeclContext::lookup_result R = CanonDef->lookup(D->getDeclName()); 8550 for (DeclContext::lookup_iterator I = R.begin(), E = R.end(); 8551 !Found && I != E; ++I) { 8552 for (auto RI : (*I)->redecls()) { 8553 if (RI->getLexicalDeclContext() == CanonDef) { 8554 // This declaration is present in the canonical definition. If it's 8555 // in the same redecl chain, it's the one we're looking for. 8556 if (RI->getCanonicalDecl() == DCanon) 8557 Found = true; 8558 else 8559 Candidates.push_back(cast<NamedDecl>(RI)); 8560 break; 8561 } 8562 } 8563 } 8564 8565 if (!Found) { 8566 // The AST doesn't like TagDecls becoming invalid after they've been 8567 // completed. We only really need to mark FieldDecls as invalid here. 8568 if (!isa<TagDecl>(D)) 8569 D->setInvalidDecl(); 8570 8571 // Ensure we don't accidentally recursively enter deserialization while 8572 // we're producing our diagnostic. 8573 Deserializing RecursionGuard(this); 8574 8575 std::string CanonDefModule = 8576 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef)); 8577 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl) 8578 << D << getOwningModuleNameForDiagnostic(D) 8579 << CanonDef << CanonDefModule.empty() << CanonDefModule; 8580 8581 if (Candidates.empty()) 8582 Diag(cast<Decl>(CanonDef)->getLocation(), 8583 diag::note_module_odr_violation_no_possible_decls) << D; 8584 else { 8585 for (unsigned I = 0, N = Candidates.size(); I != N; ++I) 8586 Diag(Candidates[I]->getLocation(), 8587 diag::note_module_odr_violation_possible_decl) 8588 << Candidates[I]; 8589 } 8590 8591 DiagnosedOdrMergeFailures.insert(CanonDef); 8592 } 8593 } 8594 8595 if (OdrMergeFailures.empty()) 8596 return; 8597 8598 // Ensure we don't accidentally recursively enter deserialization while 8599 // we're producing our diagnostics. 8600 Deserializing RecursionGuard(this); 8601 8602 // Issue any pending ODR-failure diagnostics. 8603 for (auto &Merge : OdrMergeFailures) { 8604 // If we've already pointed out a specific problem with this class, don't 8605 // bother issuing a general "something's different" diagnostic. 8606 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 8607 continue; 8608 8609 bool Diagnosed = false; 8610 for (auto *RD : Merge.second) { 8611 // Multiple different declarations got merged together; tell the user 8612 // where they came from. 8613 if (Merge.first != RD) { 8614 // FIXME: Walk the definition, figure out what's different, 8615 // and diagnose that. 8616 if (!Diagnosed) { 8617 std::string Module = getOwningModuleNameForDiagnostic(Merge.first); 8618 Diag(Merge.first->getLocation(), 8619 diag::err_module_odr_violation_different_definitions) 8620 << Merge.first << Module.empty() << Module; 8621 Diagnosed = true; 8622 } 8623 8624 Diag(RD->getLocation(), 8625 diag::note_module_odr_violation_different_definitions) 8626 << getOwningModuleNameForDiagnostic(RD); 8627 } 8628 } 8629 8630 if (!Diagnosed) { 8631 // All definitions are updates to the same declaration. This happens if a 8632 // module instantiates the declaration of a class template specialization 8633 // and two or more other modules instantiate its definition. 8634 // 8635 // FIXME: Indicate which modules had instantiations of this definition. 8636 // FIXME: How can this even happen? 8637 Diag(Merge.first->getLocation(), 8638 diag::err_module_odr_violation_different_instantiations) 8639 << Merge.first; 8640 } 8641 } 8642 } 8643 8644 void ASTReader::FinishedDeserializing() { 8645 assert(NumCurrentElementsDeserializing && 8646 "FinishedDeserializing not paired with StartedDeserializing"); 8647 if (NumCurrentElementsDeserializing == 1) { 8648 // We decrease NumCurrentElementsDeserializing only after pending actions 8649 // are finished, to avoid recursively re-calling finishPendingActions(). 8650 finishPendingActions(); 8651 } 8652 --NumCurrentElementsDeserializing; 8653 8654 if (NumCurrentElementsDeserializing == 0) { 8655 // Propagate exception specification updates along redeclaration chains. 8656 while (!PendingExceptionSpecUpdates.empty()) { 8657 auto Updates = std::move(PendingExceptionSpecUpdates); 8658 PendingExceptionSpecUpdates.clear(); 8659 for (auto Update : Updates) { 8660 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>(); 8661 SemaObj->UpdateExceptionSpec(Update.second, 8662 FPT->getExtProtoInfo().ExceptionSpec); 8663 } 8664 } 8665 8666 diagnoseOdrViolations(); 8667 8668 // We are not in recursive loading, so it's safe to pass the "interesting" 8669 // decls to the consumer. 8670 if (Consumer) 8671 PassInterestingDeclsToConsumer(); 8672 } 8673 } 8674 8675 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 8676 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { 8677 // Remove any fake results before adding any real ones. 8678 auto It = PendingFakeLookupResults.find(II); 8679 if (It != PendingFakeLookupResults.end()) { 8680 for (auto *ND : PendingFakeLookupResults[II]) 8681 SemaObj->IdResolver.RemoveDecl(ND); 8682 PendingFakeLookupResults.erase(It); 8683 } 8684 } 8685 8686 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 8687 SemaObj->TUScope->AddDecl(D); 8688 } else if (SemaObj->TUScope) { 8689 // Adding the decl to IdResolver may have failed because it was already in 8690 // (even though it was not added in scope). If it is already in, make sure 8691 // it gets in the scope as well. 8692 if (std::find(SemaObj->IdResolver.begin(Name), 8693 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 8694 SemaObj->TUScope->AddDecl(D); 8695 } 8696 } 8697 8698 ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, StringRef isysroot, 8699 bool DisableValidation, bool AllowASTWithCompilerErrors, 8700 bool AllowConfigurationMismatch, bool ValidateSystemInputs, 8701 bool UseGlobalIndex) 8702 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr), 8703 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()), 8704 FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()), 8705 SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr), 8706 ModuleMgr(PP.getFileManager()), isysroot(isysroot), 8707 DisableValidation(DisableValidation), 8708 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 8709 AllowConfigurationMismatch(AllowConfigurationMismatch), 8710 ValidateSystemInputs(ValidateSystemInputs), 8711 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false), 8712 CurrSwitchCaseStmts(&SwitchCaseStmts), 8713 NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0), 8714 TotalNumStatements(0), NumMacrosRead(0), TotalNumMacros(0), 8715 NumIdentifierLookups(0), NumIdentifierLookupHits(0), NumSelectorsRead(0), 8716 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0), 8717 NumMethodPoolHits(0), NumMethodPoolTableLookups(0), 8718 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0), 8719 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0), 8720 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0), 8721 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0), 8722 PassingDeclsToConsumer(false), ReadingKind(Read_None) { 8723 SourceMgr.setExternalSLocEntrySource(this); 8724 } 8725 8726 ASTReader::~ASTReader() { 8727 if (OwnsDeserializationListener) 8728 delete DeserializationListener; 8729 8730 for (DeclContextVisibleUpdatesPending::iterator 8731 I = PendingVisibleUpdates.begin(), 8732 E = PendingVisibleUpdates.end(); 8733 I != E; ++I) { 8734 for (DeclContextVisibleUpdates::iterator J = I->second.begin(), 8735 F = I->second.end(); 8736 J != F; ++J) 8737 delete J->first; 8738 } 8739 } 8740