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