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