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