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