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