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