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