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