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 Find the next module that contains entities and return the ID 5429 /// of the first entry. 5430 /// 5431 /// \param SLocMapI points at a chunk of a module that contains no 5432 /// preprocessed entities or the entities it contains are not the ones we are 5433 /// looking for. 5434 PreprocessedEntityID ASTReader::findNextPreprocessedEntity( 5435 GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 5436 ++SLocMapI; 5437 for (GlobalSLocOffsetMapType::const_iterator 5438 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 5439 ModuleFile &M = *SLocMapI->second; 5440 if (M.NumPreprocessedEntities) 5441 return M.BasePreprocessedEntityID; 5442 } 5443 5444 return getTotalNumPreprocessedEntities(); 5445 } 5446 5447 namespace { 5448 5449 struct PPEntityComp { 5450 const ASTReader &Reader; 5451 ModuleFile &M; 5452 5453 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { } 5454 5455 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 5456 SourceLocation LHS = getLoc(L); 5457 SourceLocation RHS = getLoc(R); 5458 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5459 } 5460 5461 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 5462 SourceLocation LHS = getLoc(L); 5463 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5464 } 5465 5466 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 5467 SourceLocation RHS = getLoc(R); 5468 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5469 } 5470 5471 SourceLocation getLoc(const PPEntityOffset &PPE) const { 5472 return Reader.TranslateSourceLocation(M, PPE.getBegin()); 5473 } 5474 }; 5475 5476 } // end anonymous namespace 5477 5478 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc, 5479 bool EndsAfter) const { 5480 if (SourceMgr.isLocalSourceLocation(Loc)) 5481 return getTotalNumPreprocessedEntities(); 5482 5483 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find( 5484 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1); 5485 assert(SLocMapI != GlobalSLocOffsetMap.end() && 5486 "Corrupted global sloc offset map"); 5487 5488 if (SLocMapI->second->NumPreprocessedEntities == 0) 5489 return findNextPreprocessedEntity(SLocMapI); 5490 5491 ModuleFile &M = *SLocMapI->second; 5492 typedef const PPEntityOffset *pp_iterator; 5493 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 5494 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 5495 5496 size_t Count = M.NumPreprocessedEntities; 5497 size_t Half; 5498 pp_iterator First = pp_begin; 5499 pp_iterator PPI; 5500 5501 if (EndsAfter) { 5502 PPI = std::upper_bound(pp_begin, pp_end, Loc, 5503 PPEntityComp(*this, M)); 5504 } else { 5505 // Do a binary search manually instead of using std::lower_bound because 5506 // The end locations of entities may be unordered (when a macro expansion 5507 // is inside another macro argument), but for this case it is not important 5508 // whether we get the first macro expansion or its containing macro. 5509 while (Count > 0) { 5510 Half = Count / 2; 5511 PPI = First; 5512 std::advance(PPI, Half); 5513 if (SourceMgr.isBeforeInTranslationUnit( 5514 TranslateSourceLocation(M, PPI->getEnd()), Loc)) { 5515 First = PPI; 5516 ++First; 5517 Count = Count - Half - 1; 5518 } else 5519 Count = Half; 5520 } 5521 } 5522 5523 if (PPI == pp_end) 5524 return findNextPreprocessedEntity(SLocMapI); 5525 5526 return M.BasePreprocessedEntityID + (PPI - pp_begin); 5527 } 5528 5529 /// \brief Returns a pair of [Begin, End) indices of preallocated 5530 /// preprocessed entities that \arg Range encompasses. 5531 std::pair<unsigned, unsigned> 5532 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 5533 if (Range.isInvalid()) 5534 return std::make_pair(0,0); 5535 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 5536 5537 PreprocessedEntityID BeginID = 5538 findPreprocessedEntity(Range.getBegin(), false); 5539 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true); 5540 return std::make_pair(BeginID, EndID); 5541 } 5542 5543 /// \brief Optionally returns true or false if the preallocated preprocessed 5544 /// entity with index \arg Index came from file \arg FID. 5545 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 5546 FileID FID) { 5547 if (FID.isInvalid()) 5548 return false; 5549 5550 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 5551 ModuleFile &M = *PPInfo.first; 5552 unsigned LocalIndex = PPInfo.second; 5553 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 5554 5555 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin()); 5556 if (Loc.isInvalid()) 5557 return false; 5558 5559 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 5560 return true; 5561 else 5562 return false; 5563 } 5564 5565 namespace { 5566 5567 /// \brief Visitor used to search for information about a header file. 5568 class HeaderFileInfoVisitor { 5569 const FileEntry *FE; 5570 5571 Optional<HeaderFileInfo> HFI; 5572 5573 public: 5574 explicit HeaderFileInfoVisitor(const FileEntry *FE) 5575 : FE(FE) { } 5576 5577 bool operator()(ModuleFile &M) { 5578 HeaderFileInfoLookupTable *Table 5579 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 5580 if (!Table) 5581 return false; 5582 5583 // Look in the on-disk hash table for an entry for this file name. 5584 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE); 5585 if (Pos == Table->end()) 5586 return false; 5587 5588 HFI = *Pos; 5589 return true; 5590 } 5591 5592 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 5593 }; 5594 5595 } // end anonymous namespace 5596 5597 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 5598 HeaderFileInfoVisitor Visitor(FE); 5599 ModuleMgr.visit(Visitor); 5600 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 5601 return *HFI; 5602 5603 return HeaderFileInfo(); 5604 } 5605 5606 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 5607 using DiagState = DiagnosticsEngine::DiagState; 5608 SmallVector<DiagState *, 32> DiagStates; 5609 5610 for (ModuleFile &F : ModuleMgr) { 5611 unsigned Idx = 0; 5612 auto &Record = F.PragmaDiagMappings; 5613 if (Record.empty()) 5614 continue; 5615 5616 DiagStates.clear(); 5617 5618 auto ReadDiagState = 5619 [&](const DiagState &BasedOn, SourceLocation Loc, 5620 bool IncludeNonPragmaStates) -> DiagnosticsEngine::DiagState * { 5621 unsigned BackrefID = Record[Idx++]; 5622 if (BackrefID != 0) 5623 return DiagStates[BackrefID - 1]; 5624 5625 // A new DiagState was created here. 5626 Diag.DiagStates.push_back(BasedOn); 5627 DiagState *NewState = &Diag.DiagStates.back(); 5628 DiagStates.push_back(NewState); 5629 unsigned Size = Record[Idx++]; 5630 assert(Idx + Size * 2 <= Record.size() && 5631 "Invalid data, not enough diag/map pairs"); 5632 while (Size--) { 5633 unsigned DiagID = Record[Idx++]; 5634 DiagnosticMapping NewMapping = 5635 DiagnosticMapping::deserialize(Record[Idx++]); 5636 if (!NewMapping.isPragma() && !IncludeNonPragmaStates) 5637 continue; 5638 5639 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID); 5640 5641 // If this mapping was specified as a warning but the severity was 5642 // upgraded due to diagnostic settings, simulate the current diagnostic 5643 // settings (and use a warning). 5644 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) { 5645 NewMapping.setSeverity(diag::Severity::Warning); 5646 NewMapping.setUpgradedFromWarning(false); 5647 } 5648 5649 Mapping = NewMapping; 5650 } 5651 return NewState; 5652 }; 5653 5654 // Read the first state. 5655 DiagState *FirstState; 5656 if (F.Kind == MK_ImplicitModule) { 5657 // Implicitly-built modules are reused with different diagnostic 5658 // settings. Use the initial diagnostic state from Diag to simulate this 5659 // compilation's diagnostic settings. 5660 FirstState = Diag.DiagStatesByLoc.FirstDiagState; 5661 DiagStates.push_back(FirstState); 5662 5663 // Skip the initial diagnostic state from the serialized module. 5664 assert(Record[1] == 0 && 5665 "Invalid data, unexpected backref in initial state"); 5666 Idx = 3 + Record[2] * 2; 5667 assert(Idx < Record.size() && 5668 "Invalid data, not enough state change pairs in initial state"); 5669 } else if (F.isModule()) { 5670 // For an explicit module, preserve the flags from the module build 5671 // command line (-w, -Weverything, -Werror, ...) along with any explicit 5672 // -Wblah flags. 5673 unsigned Flags = Record[Idx++]; 5674 DiagState Initial; 5675 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1; 5676 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1; 5677 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1; 5678 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1; 5679 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1; 5680 Initial.ExtBehavior = (diag::Severity)Flags; 5681 FirstState = ReadDiagState(Initial, SourceLocation(), true); 5682 5683 // Set up the root buffer of the module to start with the initial 5684 // diagnostic state of the module itself, to cover files that contain no 5685 // explicit transitions (for which we did not serialize anything). 5686 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID] 5687 .StateTransitions.push_back({FirstState, 0}); 5688 } else { 5689 // For prefix ASTs, start with whatever the user configured on the 5690 // command line. 5691 Idx++; // Skip flags. 5692 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, 5693 SourceLocation(), false); 5694 } 5695 5696 // Read the state transitions. 5697 unsigned NumLocations = Record[Idx++]; 5698 while (NumLocations--) { 5699 assert(Idx < Record.size() && 5700 "Invalid data, missing pragma diagnostic states"); 5701 SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]); 5702 auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc); 5703 assert(IDAndOffset.second == 0 && "not a start location for a FileID"); 5704 unsigned Transitions = Record[Idx++]; 5705 5706 // Note that we don't need to set up Parent/ParentOffset here, because 5707 // we won't be changing the diagnostic state within imported FileIDs 5708 // (other than perhaps appending to the main source file, which has no 5709 // parent). 5710 auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first]; 5711 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions); 5712 for (unsigned I = 0; I != Transitions; ++I) { 5713 unsigned Offset = Record[Idx++]; 5714 auto *State = 5715 ReadDiagState(*FirstState, Loc.getLocWithOffset(Offset), false); 5716 F.StateTransitions.push_back({State, Offset}); 5717 } 5718 } 5719 5720 // Read the final state. 5721 assert(Idx < Record.size() && 5722 "Invalid data, missing final pragma diagnostic state"); 5723 SourceLocation CurStateLoc = 5724 ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 5725 auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false); 5726 5727 if (!F.isModule()) { 5728 Diag.DiagStatesByLoc.CurDiagState = CurState; 5729 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc; 5730 5731 // Preserve the property that the imaginary root file describes the 5732 // current state. 5733 FileID NullFile; 5734 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions; 5735 if (T.empty()) 5736 T.push_back({CurState, 0}); 5737 else 5738 T[0].State = CurState; 5739 } 5740 5741 // Don't try to read these mappings again. 5742 Record.clear(); 5743 } 5744 } 5745 5746 /// \brief Get the correct cursor and offset for loading a type. 5747 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 5748 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 5749 assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 5750 ModuleFile *M = I->second; 5751 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]); 5752 } 5753 5754 /// \brief Read and return the type with the given index.. 5755 /// 5756 /// The index is the type ID, shifted and minus the number of predefs. This 5757 /// routine actually reads the record corresponding to the type at the given 5758 /// location. It is a helper routine for GetType, which deals with reading type 5759 /// IDs. 5760 QualType ASTReader::readTypeRecord(unsigned Index) { 5761 assert(ContextObj && "reading type with no AST context"); 5762 ASTContext &Context = *ContextObj; 5763 RecordLocation Loc = TypeCursorForIndex(Index); 5764 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 5765 5766 // Keep track of where we are in the stream, then jump back there 5767 // after reading this type. 5768 SavedStreamPosition SavedPosition(DeclsCursor); 5769 5770 ReadingKindTracker ReadingKind(Read_Type, *this); 5771 5772 // Note that we are loading a type record. 5773 Deserializing AType(this); 5774 5775 unsigned Idx = 0; 5776 DeclsCursor.JumpToBit(Loc.Offset); 5777 RecordData Record; 5778 unsigned Code = DeclsCursor.ReadCode(); 5779 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) { 5780 case TYPE_EXT_QUAL: { 5781 if (Record.size() != 2) { 5782 Error("Incorrect encoding of extended qualifier type"); 5783 return QualType(); 5784 } 5785 QualType Base = readType(*Loc.F, Record, Idx); 5786 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]); 5787 return Context.getQualifiedType(Base, Quals); 5788 } 5789 5790 case TYPE_COMPLEX: { 5791 if (Record.size() != 1) { 5792 Error("Incorrect encoding of complex type"); 5793 return QualType(); 5794 } 5795 QualType ElemType = readType(*Loc.F, Record, Idx); 5796 return Context.getComplexType(ElemType); 5797 } 5798 5799 case TYPE_POINTER: { 5800 if (Record.size() != 1) { 5801 Error("Incorrect encoding of pointer type"); 5802 return QualType(); 5803 } 5804 QualType PointeeType = readType(*Loc.F, Record, Idx); 5805 return Context.getPointerType(PointeeType); 5806 } 5807 5808 case TYPE_DECAYED: { 5809 if (Record.size() != 1) { 5810 Error("Incorrect encoding of decayed type"); 5811 return QualType(); 5812 } 5813 QualType OriginalType = readType(*Loc.F, Record, Idx); 5814 QualType DT = Context.getAdjustedParameterType(OriginalType); 5815 if (!isa<DecayedType>(DT)) 5816 Error("Decayed type does not decay"); 5817 return DT; 5818 } 5819 5820 case TYPE_ADJUSTED: { 5821 if (Record.size() != 2) { 5822 Error("Incorrect encoding of adjusted type"); 5823 return QualType(); 5824 } 5825 QualType OriginalTy = readType(*Loc.F, Record, Idx); 5826 QualType AdjustedTy = readType(*Loc.F, Record, Idx); 5827 return Context.getAdjustedType(OriginalTy, AdjustedTy); 5828 } 5829 5830 case TYPE_BLOCK_POINTER: { 5831 if (Record.size() != 1) { 5832 Error("Incorrect encoding of block pointer type"); 5833 return QualType(); 5834 } 5835 QualType PointeeType = readType(*Loc.F, Record, Idx); 5836 return Context.getBlockPointerType(PointeeType); 5837 } 5838 5839 case TYPE_LVALUE_REFERENCE: { 5840 if (Record.size() != 2) { 5841 Error("Incorrect encoding of lvalue reference type"); 5842 return QualType(); 5843 } 5844 QualType PointeeType = readType(*Loc.F, Record, Idx); 5845 return Context.getLValueReferenceType(PointeeType, Record[1]); 5846 } 5847 5848 case TYPE_RVALUE_REFERENCE: { 5849 if (Record.size() != 1) { 5850 Error("Incorrect encoding of rvalue reference type"); 5851 return QualType(); 5852 } 5853 QualType PointeeType = readType(*Loc.F, Record, Idx); 5854 return Context.getRValueReferenceType(PointeeType); 5855 } 5856 5857 case TYPE_MEMBER_POINTER: { 5858 if (Record.size() != 2) { 5859 Error("Incorrect encoding of member pointer type"); 5860 return QualType(); 5861 } 5862 QualType PointeeType = readType(*Loc.F, Record, Idx); 5863 QualType ClassType = readType(*Loc.F, Record, Idx); 5864 if (PointeeType.isNull() || ClassType.isNull()) 5865 return QualType(); 5866 5867 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr()); 5868 } 5869 5870 case TYPE_CONSTANT_ARRAY: { 5871 QualType ElementType = readType(*Loc.F, Record, Idx); 5872 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 5873 unsigned IndexTypeQuals = Record[2]; 5874 unsigned Idx = 3; 5875 llvm::APInt Size = ReadAPInt(Record, Idx); 5876 return Context.getConstantArrayType(ElementType, Size, 5877 ASM, IndexTypeQuals); 5878 } 5879 5880 case TYPE_INCOMPLETE_ARRAY: { 5881 QualType ElementType = readType(*Loc.F, Record, Idx); 5882 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 5883 unsigned IndexTypeQuals = Record[2]; 5884 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals); 5885 } 5886 5887 case TYPE_VARIABLE_ARRAY: { 5888 QualType ElementType = readType(*Loc.F, Record, Idx); 5889 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 5890 unsigned IndexTypeQuals = Record[2]; 5891 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]); 5892 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]); 5893 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F), 5894 ASM, IndexTypeQuals, 5895 SourceRange(LBLoc, RBLoc)); 5896 } 5897 5898 case TYPE_VECTOR: { 5899 if (Record.size() != 3) { 5900 Error("incorrect encoding of vector type in AST file"); 5901 return QualType(); 5902 } 5903 5904 QualType ElementType = readType(*Loc.F, Record, Idx); 5905 unsigned NumElements = Record[1]; 5906 unsigned VecKind = Record[2]; 5907 return Context.getVectorType(ElementType, NumElements, 5908 (VectorType::VectorKind)VecKind); 5909 } 5910 5911 case TYPE_EXT_VECTOR: { 5912 if (Record.size() != 3) { 5913 Error("incorrect encoding of extended vector type in AST file"); 5914 return QualType(); 5915 } 5916 5917 QualType ElementType = readType(*Loc.F, Record, Idx); 5918 unsigned NumElements = Record[1]; 5919 return Context.getExtVectorType(ElementType, NumElements); 5920 } 5921 5922 case TYPE_FUNCTION_NO_PROTO: { 5923 if (Record.size() != 7) { 5924 Error("incorrect encoding of no-proto function type"); 5925 return QualType(); 5926 } 5927 QualType ResultType = readType(*Loc.F, Record, Idx); 5928 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3], 5929 (CallingConv)Record[4], Record[5], Record[6]); 5930 return Context.getFunctionNoProtoType(ResultType, Info); 5931 } 5932 5933 case TYPE_FUNCTION_PROTO: { 5934 QualType ResultType = readType(*Loc.F, Record, Idx); 5935 5936 FunctionProtoType::ExtProtoInfo EPI; 5937 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1], 5938 /*hasregparm*/ Record[2], 5939 /*regparm*/ Record[3], 5940 static_cast<CallingConv>(Record[4]), 5941 /*produces*/ Record[5], 5942 /*nocallersavedregs*/ Record[6]); 5943 5944 unsigned Idx = 7; 5945 5946 EPI.Variadic = Record[Idx++]; 5947 EPI.HasTrailingReturn = Record[Idx++]; 5948 EPI.TypeQuals = Record[Idx++]; 5949 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]); 5950 SmallVector<QualType, 8> ExceptionStorage; 5951 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx); 5952 5953 unsigned NumParams = Record[Idx++]; 5954 SmallVector<QualType, 16> ParamTypes; 5955 for (unsigned I = 0; I != NumParams; ++I) 5956 ParamTypes.push_back(readType(*Loc.F, Record, Idx)); 5957 5958 SmallVector<FunctionProtoType::ExtParameterInfo, 4> ExtParameterInfos; 5959 if (Idx != Record.size()) { 5960 for (unsigned I = 0; I != NumParams; ++I) 5961 ExtParameterInfos.push_back( 5962 FunctionProtoType::ExtParameterInfo 5963 ::getFromOpaqueValue(Record[Idx++])); 5964 EPI.ExtParameterInfos = ExtParameterInfos.data(); 5965 } 5966 5967 assert(Idx == Record.size()); 5968 5969 return Context.getFunctionType(ResultType, ParamTypes, EPI); 5970 } 5971 5972 case TYPE_UNRESOLVED_USING: { 5973 unsigned Idx = 0; 5974 return Context.getTypeDeclType( 5975 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx)); 5976 } 5977 5978 case TYPE_TYPEDEF: { 5979 if (Record.size() != 2) { 5980 Error("incorrect encoding of typedef type"); 5981 return QualType(); 5982 } 5983 unsigned Idx = 0; 5984 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx); 5985 QualType Canonical = readType(*Loc.F, Record, Idx); 5986 if (!Canonical.isNull()) 5987 Canonical = Context.getCanonicalType(Canonical); 5988 return Context.getTypedefType(Decl, Canonical); 5989 } 5990 5991 case TYPE_TYPEOF_EXPR: 5992 return Context.getTypeOfExprType(ReadExpr(*Loc.F)); 5993 5994 case TYPE_TYPEOF: { 5995 if (Record.size() != 1) { 5996 Error("incorrect encoding of typeof(type) in AST file"); 5997 return QualType(); 5998 } 5999 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 6000 return Context.getTypeOfType(UnderlyingType); 6001 } 6002 6003 case TYPE_DECLTYPE: { 6004 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 6005 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType); 6006 } 6007 6008 case TYPE_UNARY_TRANSFORM: { 6009 QualType BaseType = readType(*Loc.F, Record, Idx); 6010 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 6011 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2]; 6012 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind); 6013 } 6014 6015 case TYPE_AUTO: { 6016 QualType Deduced = readType(*Loc.F, Record, Idx); 6017 AutoTypeKeyword Keyword = (AutoTypeKeyword)Record[Idx++]; 6018 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false; 6019 return Context.getAutoType(Deduced, Keyword, IsDependent); 6020 } 6021 6022 case TYPE_DEDUCED_TEMPLATE_SPECIALIZATION: { 6023 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx); 6024 QualType Deduced = readType(*Loc.F, Record, Idx); 6025 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false; 6026 return Context.getDeducedTemplateSpecializationType(Name, Deduced, 6027 IsDependent); 6028 } 6029 6030 case TYPE_RECORD: { 6031 if (Record.size() != 2) { 6032 Error("incorrect encoding of record type"); 6033 return QualType(); 6034 } 6035 unsigned Idx = 0; 6036 bool IsDependent = Record[Idx++]; 6037 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx); 6038 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl()); 6039 QualType T = Context.getRecordType(RD); 6040 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 6041 return T; 6042 } 6043 6044 case TYPE_ENUM: { 6045 if (Record.size() != 2) { 6046 Error("incorrect encoding of enum type"); 6047 return QualType(); 6048 } 6049 unsigned Idx = 0; 6050 bool IsDependent = Record[Idx++]; 6051 QualType T 6052 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx)); 6053 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 6054 return T; 6055 } 6056 6057 case TYPE_ATTRIBUTED: { 6058 if (Record.size() != 3) { 6059 Error("incorrect encoding of attributed type"); 6060 return QualType(); 6061 } 6062 QualType modifiedType = readType(*Loc.F, Record, Idx); 6063 QualType equivalentType = readType(*Loc.F, Record, Idx); 6064 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]); 6065 return Context.getAttributedType(kind, modifiedType, equivalentType); 6066 } 6067 6068 case TYPE_PAREN: { 6069 if (Record.size() != 1) { 6070 Error("incorrect encoding of paren type"); 6071 return QualType(); 6072 } 6073 QualType InnerType = readType(*Loc.F, Record, Idx); 6074 return Context.getParenType(InnerType); 6075 } 6076 6077 case TYPE_PACK_EXPANSION: { 6078 if (Record.size() != 2) { 6079 Error("incorrect encoding of pack expansion type"); 6080 return QualType(); 6081 } 6082 QualType Pattern = readType(*Loc.F, Record, Idx); 6083 if (Pattern.isNull()) 6084 return QualType(); 6085 Optional<unsigned> NumExpansions; 6086 if (Record[1]) 6087 NumExpansions = Record[1] - 1; 6088 return Context.getPackExpansionType(Pattern, NumExpansions); 6089 } 6090 6091 case TYPE_ELABORATED: { 6092 unsigned Idx = 0; 6093 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 6094 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 6095 QualType NamedType = readType(*Loc.F, Record, Idx); 6096 return Context.getElaboratedType(Keyword, NNS, NamedType); 6097 } 6098 6099 case TYPE_OBJC_INTERFACE: { 6100 unsigned Idx = 0; 6101 ObjCInterfaceDecl *ItfD 6102 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx); 6103 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl()); 6104 } 6105 6106 case TYPE_OBJC_TYPE_PARAM: { 6107 unsigned Idx = 0; 6108 ObjCTypeParamDecl *Decl 6109 = ReadDeclAs<ObjCTypeParamDecl>(*Loc.F, Record, Idx); 6110 unsigned NumProtos = Record[Idx++]; 6111 SmallVector<ObjCProtocolDecl*, 4> Protos; 6112 for (unsigned I = 0; I != NumProtos; ++I) 6113 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx)); 6114 return Context.getObjCTypeParamType(Decl, Protos); 6115 } 6116 case TYPE_OBJC_OBJECT: { 6117 unsigned Idx = 0; 6118 QualType Base = readType(*Loc.F, Record, Idx); 6119 unsigned NumTypeArgs = Record[Idx++]; 6120 SmallVector<QualType, 4> TypeArgs; 6121 for (unsigned I = 0; I != NumTypeArgs; ++I) 6122 TypeArgs.push_back(readType(*Loc.F, Record, Idx)); 6123 unsigned NumProtos = Record[Idx++]; 6124 SmallVector<ObjCProtocolDecl*, 4> Protos; 6125 for (unsigned I = 0; I != NumProtos; ++I) 6126 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx)); 6127 bool IsKindOf = Record[Idx++]; 6128 return Context.getObjCObjectType(Base, TypeArgs, Protos, IsKindOf); 6129 } 6130 6131 case TYPE_OBJC_OBJECT_POINTER: { 6132 unsigned Idx = 0; 6133 QualType Pointee = readType(*Loc.F, Record, Idx); 6134 return Context.getObjCObjectPointerType(Pointee); 6135 } 6136 6137 case TYPE_SUBST_TEMPLATE_TYPE_PARM: { 6138 unsigned Idx = 0; 6139 QualType Parm = readType(*Loc.F, Record, Idx); 6140 QualType Replacement = readType(*Loc.F, Record, Idx); 6141 return Context.getSubstTemplateTypeParmType( 6142 cast<TemplateTypeParmType>(Parm), 6143 Context.getCanonicalType(Replacement)); 6144 } 6145 6146 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: { 6147 unsigned Idx = 0; 6148 QualType Parm = readType(*Loc.F, Record, Idx); 6149 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx); 6150 return Context.getSubstTemplateTypeParmPackType( 6151 cast<TemplateTypeParmType>(Parm), 6152 ArgPack); 6153 } 6154 6155 case TYPE_INJECTED_CLASS_NAME: { 6156 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx); 6157 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable 6158 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable 6159 // for AST reading, too much interdependencies. 6160 const Type *T = nullptr; 6161 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) { 6162 if (const Type *Existing = DI->getTypeForDecl()) { 6163 T = Existing; 6164 break; 6165 } 6166 } 6167 if (!T) { 6168 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST); 6169 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) 6170 DI->setTypeForDecl(T); 6171 } 6172 return QualType(T, 0); 6173 } 6174 6175 case TYPE_TEMPLATE_TYPE_PARM: { 6176 unsigned Idx = 0; 6177 unsigned Depth = Record[Idx++]; 6178 unsigned Index = Record[Idx++]; 6179 bool Pack = Record[Idx++]; 6180 TemplateTypeParmDecl *D 6181 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx); 6182 return Context.getTemplateTypeParmType(Depth, Index, Pack, D); 6183 } 6184 6185 case TYPE_DEPENDENT_NAME: { 6186 unsigned Idx = 0; 6187 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 6188 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 6189 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx); 6190 QualType Canon = readType(*Loc.F, Record, Idx); 6191 if (!Canon.isNull()) 6192 Canon = Context.getCanonicalType(Canon); 6193 return Context.getDependentNameType(Keyword, NNS, Name, Canon); 6194 } 6195 6196 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: { 6197 unsigned Idx = 0; 6198 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 6199 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 6200 const IdentifierInfo *Name = GetIdentifierInfo(*Loc.F, Record, Idx); 6201 unsigned NumArgs = Record[Idx++]; 6202 SmallVector<TemplateArgument, 8> Args; 6203 Args.reserve(NumArgs); 6204 while (NumArgs--) 6205 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx)); 6206 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name, 6207 Args); 6208 } 6209 6210 case TYPE_DEPENDENT_SIZED_ARRAY: { 6211 unsigned Idx = 0; 6212 6213 // ArrayType 6214 QualType ElementType = readType(*Loc.F, Record, Idx); 6215 ArrayType::ArraySizeModifier ASM 6216 = (ArrayType::ArraySizeModifier)Record[Idx++]; 6217 unsigned IndexTypeQuals = Record[Idx++]; 6218 6219 // DependentSizedArrayType 6220 Expr *NumElts = ReadExpr(*Loc.F); 6221 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx); 6222 6223 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM, 6224 IndexTypeQuals, Brackets); 6225 } 6226 6227 case TYPE_TEMPLATE_SPECIALIZATION: { 6228 unsigned Idx = 0; 6229 bool IsDependent = Record[Idx++]; 6230 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx); 6231 SmallVector<TemplateArgument, 8> Args; 6232 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx); 6233 QualType Underlying = readType(*Loc.F, Record, Idx); 6234 QualType T; 6235 if (Underlying.isNull()) 6236 T = Context.getCanonicalTemplateSpecializationType(Name, Args); 6237 else 6238 T = Context.getTemplateSpecializationType(Name, Args, Underlying); 6239 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 6240 return T; 6241 } 6242 6243 case TYPE_ATOMIC: { 6244 if (Record.size() != 1) { 6245 Error("Incorrect encoding of atomic type"); 6246 return QualType(); 6247 } 6248 QualType ValueType = readType(*Loc.F, Record, Idx); 6249 return Context.getAtomicType(ValueType); 6250 } 6251 6252 case TYPE_PIPE: { 6253 if (Record.size() != 2) { 6254 Error("Incorrect encoding of pipe type"); 6255 return QualType(); 6256 } 6257 6258 // Reading the pipe element type. 6259 QualType ElementType = readType(*Loc.F, Record, Idx); 6260 unsigned ReadOnly = Record[1]; 6261 return Context.getPipeType(ElementType, ReadOnly); 6262 } 6263 6264 case TYPE_DEPENDENT_SIZED_EXT_VECTOR: { 6265 unsigned Idx = 0; 6266 6267 // DependentSizedExtVectorType 6268 QualType ElementType = readType(*Loc.F, Record, Idx); 6269 Expr *SizeExpr = ReadExpr(*Loc.F); 6270 SourceLocation AttrLoc = ReadSourceLocation(*Loc.F, Record, Idx); 6271 6272 return Context.getDependentSizedExtVectorType(ElementType, SizeExpr, 6273 AttrLoc); 6274 } 6275 6276 case TYPE_DEPENDENT_ADDRESS_SPACE: { 6277 unsigned Idx = 0; 6278 6279 // DependentAddressSpaceType 6280 QualType PointeeType = readType(*Loc.F, Record, Idx); 6281 Expr *AddrSpaceExpr = ReadExpr(*Loc.F); 6282 SourceLocation AttrLoc = ReadSourceLocation(*Loc.F, Record, Idx); 6283 6284 return Context.getDependentAddressSpaceType(PointeeType, AddrSpaceExpr, 6285 AttrLoc); 6286 } 6287 } 6288 llvm_unreachable("Invalid TypeCode!"); 6289 } 6290 6291 void ASTReader::readExceptionSpec(ModuleFile &ModuleFile, 6292 SmallVectorImpl<QualType> &Exceptions, 6293 FunctionProtoType::ExceptionSpecInfo &ESI, 6294 const RecordData &Record, unsigned &Idx) { 6295 ExceptionSpecificationType EST = 6296 static_cast<ExceptionSpecificationType>(Record[Idx++]); 6297 ESI.Type = EST; 6298 if (EST == EST_Dynamic) { 6299 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I) 6300 Exceptions.push_back(readType(ModuleFile, Record, Idx)); 6301 ESI.Exceptions = Exceptions; 6302 } else if (EST == EST_ComputedNoexcept) { 6303 ESI.NoexceptExpr = ReadExpr(ModuleFile); 6304 } else if (EST == EST_Uninstantiated) { 6305 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx); 6306 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx); 6307 } else if (EST == EST_Unevaluated) { 6308 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx); 6309 } 6310 } 6311 6312 class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> { 6313 ModuleFile *F; 6314 ASTReader *Reader; 6315 const ASTReader::RecordData &Record; 6316 unsigned &Idx; 6317 6318 SourceLocation ReadSourceLocation() { 6319 return Reader->ReadSourceLocation(*F, Record, Idx); 6320 } 6321 6322 TypeSourceInfo *GetTypeSourceInfo() { 6323 return Reader->GetTypeSourceInfo(*F, Record, Idx); 6324 } 6325 6326 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() { 6327 return Reader->ReadNestedNameSpecifierLoc(*F, Record, Idx); 6328 } 6329 6330 public: 6331 TypeLocReader(ModuleFile &F, ASTReader &Reader, 6332 const ASTReader::RecordData &Record, unsigned &Idx) 6333 : F(&F), Reader(&Reader), Record(Record), Idx(Idx) {} 6334 6335 // We want compile-time assurance that we've enumerated all of 6336 // these, so unfortunately we have to declare them first, then 6337 // define them out-of-line. 6338 #define ABSTRACT_TYPELOC(CLASS, PARENT) 6339 #define TYPELOC(CLASS, PARENT) \ 6340 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 6341 #include "clang/AST/TypeLocNodes.def" 6342 6343 void VisitFunctionTypeLoc(FunctionTypeLoc); 6344 void VisitArrayTypeLoc(ArrayTypeLoc); 6345 }; 6346 6347 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 6348 // nothing to do 6349 } 6350 6351 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 6352 TL.setBuiltinLoc(ReadSourceLocation()); 6353 if (TL.needsExtraLocalData()) { 6354 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++])); 6355 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++])); 6356 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++])); 6357 TL.setModeAttr(Record[Idx++]); 6358 } 6359 } 6360 6361 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 6362 TL.setNameLoc(ReadSourceLocation()); 6363 } 6364 6365 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 6366 TL.setStarLoc(ReadSourceLocation()); 6367 } 6368 6369 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 6370 // nothing to do 6371 } 6372 6373 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 6374 // nothing to do 6375 } 6376 6377 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 6378 TL.setCaretLoc(ReadSourceLocation()); 6379 } 6380 6381 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 6382 TL.setAmpLoc(ReadSourceLocation()); 6383 } 6384 6385 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 6386 TL.setAmpAmpLoc(ReadSourceLocation()); 6387 } 6388 6389 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 6390 TL.setStarLoc(ReadSourceLocation()); 6391 TL.setClassTInfo(GetTypeSourceInfo()); 6392 } 6393 6394 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 6395 TL.setLBracketLoc(ReadSourceLocation()); 6396 TL.setRBracketLoc(ReadSourceLocation()); 6397 if (Record[Idx++]) 6398 TL.setSizeExpr(Reader->ReadExpr(*F)); 6399 else 6400 TL.setSizeExpr(nullptr); 6401 } 6402 6403 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 6404 VisitArrayTypeLoc(TL); 6405 } 6406 6407 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 6408 VisitArrayTypeLoc(TL); 6409 } 6410 6411 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 6412 VisitArrayTypeLoc(TL); 6413 } 6414 6415 void TypeLocReader::VisitDependentSizedArrayTypeLoc( 6416 DependentSizedArrayTypeLoc TL) { 6417 VisitArrayTypeLoc(TL); 6418 } 6419 6420 void TypeLocReader::VisitDependentAddressSpaceTypeLoc( 6421 DependentAddressSpaceTypeLoc TL) { 6422 6423 TL.setAttrNameLoc(ReadSourceLocation()); 6424 SourceRange range; 6425 range.setBegin(ReadSourceLocation()); 6426 range.setEnd(ReadSourceLocation()); 6427 TL.setAttrOperandParensRange(range); 6428 TL.setAttrExprOperand(Reader->ReadExpr(*F)); 6429 } 6430 6431 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 6432 DependentSizedExtVectorTypeLoc TL) { 6433 TL.setNameLoc(ReadSourceLocation()); 6434 } 6435 6436 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 6437 TL.setNameLoc(ReadSourceLocation()); 6438 } 6439 6440 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 6441 TL.setNameLoc(ReadSourceLocation()); 6442 } 6443 6444 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 6445 TL.setLocalRangeBegin(ReadSourceLocation()); 6446 TL.setLParenLoc(ReadSourceLocation()); 6447 TL.setRParenLoc(ReadSourceLocation()); 6448 TL.setExceptionSpecRange(SourceRange(Reader->ReadSourceLocation(*F, Record, Idx), 6449 Reader->ReadSourceLocation(*F, Record, Idx))); 6450 TL.setLocalRangeEnd(ReadSourceLocation()); 6451 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) { 6452 TL.setParam(i, Reader->ReadDeclAs<ParmVarDecl>(*F, Record, Idx)); 6453 } 6454 } 6455 6456 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 6457 VisitFunctionTypeLoc(TL); 6458 } 6459 6460 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 6461 VisitFunctionTypeLoc(TL); 6462 } 6463 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 6464 TL.setNameLoc(ReadSourceLocation()); 6465 } 6466 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 6467 TL.setNameLoc(ReadSourceLocation()); 6468 } 6469 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 6470 TL.setTypeofLoc(ReadSourceLocation()); 6471 TL.setLParenLoc(ReadSourceLocation()); 6472 TL.setRParenLoc(ReadSourceLocation()); 6473 } 6474 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 6475 TL.setTypeofLoc(ReadSourceLocation()); 6476 TL.setLParenLoc(ReadSourceLocation()); 6477 TL.setRParenLoc(ReadSourceLocation()); 6478 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6479 } 6480 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 6481 TL.setNameLoc(ReadSourceLocation()); 6482 } 6483 6484 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 6485 TL.setKWLoc(ReadSourceLocation()); 6486 TL.setLParenLoc(ReadSourceLocation()); 6487 TL.setRParenLoc(ReadSourceLocation()); 6488 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6489 } 6490 6491 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 6492 TL.setNameLoc(ReadSourceLocation()); 6493 } 6494 6495 void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc( 6496 DeducedTemplateSpecializationTypeLoc TL) { 6497 TL.setTemplateNameLoc(ReadSourceLocation()); 6498 } 6499 6500 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 6501 TL.setNameLoc(ReadSourceLocation()); 6502 } 6503 6504 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 6505 TL.setNameLoc(ReadSourceLocation()); 6506 } 6507 6508 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 6509 TL.setAttrNameLoc(ReadSourceLocation()); 6510 if (TL.hasAttrOperand()) { 6511 SourceRange range; 6512 range.setBegin(ReadSourceLocation()); 6513 range.setEnd(ReadSourceLocation()); 6514 TL.setAttrOperandParensRange(range); 6515 } 6516 if (TL.hasAttrExprOperand()) { 6517 if (Record[Idx++]) 6518 TL.setAttrExprOperand(Reader->ReadExpr(*F)); 6519 else 6520 TL.setAttrExprOperand(nullptr); 6521 } else if (TL.hasAttrEnumOperand()) 6522 TL.setAttrEnumOperandLoc(ReadSourceLocation()); 6523 } 6524 6525 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 6526 TL.setNameLoc(ReadSourceLocation()); 6527 } 6528 6529 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 6530 SubstTemplateTypeParmTypeLoc TL) { 6531 TL.setNameLoc(ReadSourceLocation()); 6532 } 6533 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 6534 SubstTemplateTypeParmPackTypeLoc TL) { 6535 TL.setNameLoc(ReadSourceLocation()); 6536 } 6537 void TypeLocReader::VisitTemplateSpecializationTypeLoc( 6538 TemplateSpecializationTypeLoc TL) { 6539 TL.setTemplateKeywordLoc(ReadSourceLocation()); 6540 TL.setTemplateNameLoc(ReadSourceLocation()); 6541 TL.setLAngleLoc(ReadSourceLocation()); 6542 TL.setRAngleLoc(ReadSourceLocation()); 6543 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6544 TL.setArgLocInfo( 6545 i, 6546 Reader->GetTemplateArgumentLocInfo( 6547 *F, TL.getTypePtr()->getArg(i).getKind(), Record, Idx)); 6548 } 6549 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 6550 TL.setLParenLoc(ReadSourceLocation()); 6551 TL.setRParenLoc(ReadSourceLocation()); 6552 } 6553 6554 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 6555 TL.setElaboratedKeywordLoc(ReadSourceLocation()); 6556 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6557 } 6558 6559 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 6560 TL.setNameLoc(ReadSourceLocation()); 6561 } 6562 6563 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 6564 TL.setElaboratedKeywordLoc(ReadSourceLocation()); 6565 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6566 TL.setNameLoc(ReadSourceLocation()); 6567 } 6568 6569 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 6570 DependentTemplateSpecializationTypeLoc TL) { 6571 TL.setElaboratedKeywordLoc(ReadSourceLocation()); 6572 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6573 TL.setTemplateKeywordLoc(ReadSourceLocation()); 6574 TL.setTemplateNameLoc(ReadSourceLocation()); 6575 TL.setLAngleLoc(ReadSourceLocation()); 6576 TL.setRAngleLoc(ReadSourceLocation()); 6577 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 6578 TL.setArgLocInfo( 6579 I, 6580 Reader->GetTemplateArgumentLocInfo( 6581 *F, TL.getTypePtr()->getArg(I).getKind(), Record, Idx)); 6582 } 6583 6584 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 6585 TL.setEllipsisLoc(ReadSourceLocation()); 6586 } 6587 6588 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 6589 TL.setNameLoc(ReadSourceLocation()); 6590 } 6591 6592 void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) { 6593 if (TL.getNumProtocols()) { 6594 TL.setProtocolLAngleLoc(ReadSourceLocation()); 6595 TL.setProtocolRAngleLoc(ReadSourceLocation()); 6596 } 6597 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6598 TL.setProtocolLoc(i, ReadSourceLocation()); 6599 } 6600 6601 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 6602 TL.setHasBaseTypeAsWritten(Record[Idx++]); 6603 TL.setTypeArgsLAngleLoc(ReadSourceLocation()); 6604 TL.setTypeArgsRAngleLoc(ReadSourceLocation()); 6605 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i) 6606 TL.setTypeArgTInfo(i, GetTypeSourceInfo()); 6607 TL.setProtocolLAngleLoc(ReadSourceLocation()); 6608 TL.setProtocolRAngleLoc(ReadSourceLocation()); 6609 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6610 TL.setProtocolLoc(i, ReadSourceLocation()); 6611 } 6612 6613 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 6614 TL.setStarLoc(ReadSourceLocation()); 6615 } 6616 6617 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 6618 TL.setKWLoc(ReadSourceLocation()); 6619 TL.setLParenLoc(ReadSourceLocation()); 6620 TL.setRParenLoc(ReadSourceLocation()); 6621 } 6622 6623 void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) { 6624 TL.setKWLoc(ReadSourceLocation()); 6625 } 6626 6627 TypeSourceInfo * 6628 ASTReader::GetTypeSourceInfo(ModuleFile &F, const ASTReader::RecordData &Record, 6629 unsigned &Idx) { 6630 QualType InfoTy = readType(F, Record, Idx); 6631 if (InfoTy.isNull()) 6632 return nullptr; 6633 6634 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 6635 TypeLocReader TLR(F, *this, Record, Idx); 6636 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc()) 6637 TLR.Visit(TL); 6638 return TInfo; 6639 } 6640 6641 QualType ASTReader::GetType(TypeID ID) { 6642 assert(ContextObj && "reading type with no AST context"); 6643 ASTContext &Context = *ContextObj; 6644 6645 unsigned FastQuals = ID & Qualifiers::FastMask; 6646 unsigned Index = ID >> Qualifiers::FastWidth; 6647 6648 if (Index < NUM_PREDEF_TYPE_IDS) { 6649 QualType T; 6650 switch ((PredefinedTypeIDs)Index) { 6651 case PREDEF_TYPE_NULL_ID: 6652 return QualType(); 6653 case PREDEF_TYPE_VOID_ID: 6654 T = Context.VoidTy; 6655 break; 6656 case PREDEF_TYPE_BOOL_ID: 6657 T = Context.BoolTy; 6658 break; 6659 6660 case PREDEF_TYPE_CHAR_U_ID: 6661 case PREDEF_TYPE_CHAR_S_ID: 6662 // FIXME: Check that the signedness of CharTy is correct! 6663 T = Context.CharTy; 6664 break; 6665 6666 case PREDEF_TYPE_UCHAR_ID: 6667 T = Context.UnsignedCharTy; 6668 break; 6669 case PREDEF_TYPE_USHORT_ID: 6670 T = Context.UnsignedShortTy; 6671 break; 6672 case PREDEF_TYPE_UINT_ID: 6673 T = Context.UnsignedIntTy; 6674 break; 6675 case PREDEF_TYPE_ULONG_ID: 6676 T = Context.UnsignedLongTy; 6677 break; 6678 case PREDEF_TYPE_ULONGLONG_ID: 6679 T = Context.UnsignedLongLongTy; 6680 break; 6681 case PREDEF_TYPE_UINT128_ID: 6682 T = Context.UnsignedInt128Ty; 6683 break; 6684 case PREDEF_TYPE_SCHAR_ID: 6685 T = Context.SignedCharTy; 6686 break; 6687 case PREDEF_TYPE_WCHAR_ID: 6688 T = Context.WCharTy; 6689 break; 6690 case PREDEF_TYPE_SHORT_ID: 6691 T = Context.ShortTy; 6692 break; 6693 case PREDEF_TYPE_INT_ID: 6694 T = Context.IntTy; 6695 break; 6696 case PREDEF_TYPE_LONG_ID: 6697 T = Context.LongTy; 6698 break; 6699 case PREDEF_TYPE_LONGLONG_ID: 6700 T = Context.LongLongTy; 6701 break; 6702 case PREDEF_TYPE_INT128_ID: 6703 T = Context.Int128Ty; 6704 break; 6705 case PREDEF_TYPE_HALF_ID: 6706 T = Context.HalfTy; 6707 break; 6708 case PREDEF_TYPE_FLOAT_ID: 6709 T = Context.FloatTy; 6710 break; 6711 case PREDEF_TYPE_DOUBLE_ID: 6712 T = Context.DoubleTy; 6713 break; 6714 case PREDEF_TYPE_LONGDOUBLE_ID: 6715 T = Context.LongDoubleTy; 6716 break; 6717 case PREDEF_TYPE_FLOAT16_ID: 6718 T = Context.Float16Ty; 6719 break; 6720 case PREDEF_TYPE_FLOAT128_ID: 6721 T = Context.Float128Ty; 6722 break; 6723 case PREDEF_TYPE_OVERLOAD_ID: 6724 T = Context.OverloadTy; 6725 break; 6726 case PREDEF_TYPE_BOUND_MEMBER: 6727 T = Context.BoundMemberTy; 6728 break; 6729 case PREDEF_TYPE_PSEUDO_OBJECT: 6730 T = Context.PseudoObjectTy; 6731 break; 6732 case PREDEF_TYPE_DEPENDENT_ID: 6733 T = Context.DependentTy; 6734 break; 6735 case PREDEF_TYPE_UNKNOWN_ANY: 6736 T = Context.UnknownAnyTy; 6737 break; 6738 case PREDEF_TYPE_NULLPTR_ID: 6739 T = Context.NullPtrTy; 6740 break; 6741 case PREDEF_TYPE_CHAR16_ID: 6742 T = Context.Char16Ty; 6743 break; 6744 case PREDEF_TYPE_CHAR32_ID: 6745 T = Context.Char32Ty; 6746 break; 6747 case PREDEF_TYPE_OBJC_ID: 6748 T = Context.ObjCBuiltinIdTy; 6749 break; 6750 case PREDEF_TYPE_OBJC_CLASS: 6751 T = Context.ObjCBuiltinClassTy; 6752 break; 6753 case PREDEF_TYPE_OBJC_SEL: 6754 T = Context.ObjCBuiltinSelTy; 6755 break; 6756 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 6757 case PREDEF_TYPE_##Id##_ID: \ 6758 T = Context.SingletonId; \ 6759 break; 6760 #include "clang/Basic/OpenCLImageTypes.def" 6761 case PREDEF_TYPE_SAMPLER_ID: 6762 T = Context.OCLSamplerTy; 6763 break; 6764 case PREDEF_TYPE_EVENT_ID: 6765 T = Context.OCLEventTy; 6766 break; 6767 case PREDEF_TYPE_CLK_EVENT_ID: 6768 T = Context.OCLClkEventTy; 6769 break; 6770 case PREDEF_TYPE_QUEUE_ID: 6771 T = Context.OCLQueueTy; 6772 break; 6773 case PREDEF_TYPE_RESERVE_ID_ID: 6774 T = Context.OCLReserveIDTy; 6775 break; 6776 case PREDEF_TYPE_AUTO_DEDUCT: 6777 T = Context.getAutoDeductType(); 6778 break; 6779 6780 case PREDEF_TYPE_AUTO_RREF_DEDUCT: 6781 T = Context.getAutoRRefDeductType(); 6782 break; 6783 6784 case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 6785 T = Context.ARCUnbridgedCastTy; 6786 break; 6787 6788 case PREDEF_TYPE_BUILTIN_FN: 6789 T = Context.BuiltinFnTy; 6790 break; 6791 6792 case PREDEF_TYPE_OMP_ARRAY_SECTION: 6793 T = Context.OMPArraySectionTy; 6794 break; 6795 } 6796 6797 assert(!T.isNull() && "Unknown predefined type"); 6798 return T.withFastQualifiers(FastQuals); 6799 } 6800 6801 Index -= NUM_PREDEF_TYPE_IDS; 6802 assert(Index < TypesLoaded.size() && "Type index out-of-range"); 6803 if (TypesLoaded[Index].isNull()) { 6804 TypesLoaded[Index] = readTypeRecord(Index); 6805 if (TypesLoaded[Index].isNull()) 6806 return QualType(); 6807 6808 TypesLoaded[Index]->setFromAST(); 6809 if (DeserializationListener) 6810 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 6811 TypesLoaded[Index]); 6812 } 6813 6814 return TypesLoaded[Index].withFastQualifiers(FastQuals); 6815 } 6816 6817 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 6818 return GetType(getGlobalTypeID(F, LocalID)); 6819 } 6820 6821 serialization::TypeID 6822 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 6823 unsigned FastQuals = LocalID & Qualifiers::FastMask; 6824 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 6825 6826 if (LocalIndex < NUM_PREDEF_TYPE_IDS) 6827 return LocalID; 6828 6829 if (!F.ModuleOffsetMap.empty()) 6830 ReadModuleOffsetMap(F); 6831 6832 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6833 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 6834 assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 6835 6836 unsigned GlobalIndex = LocalIndex + I->second; 6837 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 6838 } 6839 6840 TemplateArgumentLocInfo 6841 ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F, 6842 TemplateArgument::ArgKind Kind, 6843 const RecordData &Record, 6844 unsigned &Index) { 6845 switch (Kind) { 6846 case TemplateArgument::Expression: 6847 return ReadExpr(F); 6848 case TemplateArgument::Type: 6849 return GetTypeSourceInfo(F, Record, Index); 6850 case TemplateArgument::Template: { 6851 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 6852 Index); 6853 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 6854 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 6855 SourceLocation()); 6856 } 6857 case TemplateArgument::TemplateExpansion: { 6858 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 6859 Index); 6860 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 6861 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index); 6862 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 6863 EllipsisLoc); 6864 } 6865 case TemplateArgument::Null: 6866 case TemplateArgument::Integral: 6867 case TemplateArgument::Declaration: 6868 case TemplateArgument::NullPtr: 6869 case TemplateArgument::Pack: 6870 // FIXME: Is this right? 6871 return TemplateArgumentLocInfo(); 6872 } 6873 llvm_unreachable("unexpected template argument loc"); 6874 } 6875 6876 TemplateArgumentLoc 6877 ASTReader::ReadTemplateArgumentLoc(ModuleFile &F, 6878 const RecordData &Record, unsigned &Index) { 6879 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index); 6880 6881 if (Arg.getKind() == TemplateArgument::Expression) { 6882 if (Record[Index++]) // bool InfoHasSameExpr. 6883 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 6884 } 6885 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(), 6886 Record, Index)); 6887 } 6888 6889 const ASTTemplateArgumentListInfo* 6890 ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F, 6891 const RecordData &Record, 6892 unsigned &Index) { 6893 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index); 6894 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index); 6895 unsigned NumArgsAsWritten = Record[Index++]; 6896 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 6897 for (unsigned i = 0; i != NumArgsAsWritten; ++i) 6898 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index)); 6899 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 6900 } 6901 6902 Decl *ASTReader::GetExternalDecl(uint32_t ID) { 6903 return GetDecl(ID); 6904 } 6905 6906 void ASTReader::CompleteRedeclChain(const Decl *D) { 6907 if (NumCurrentElementsDeserializing) { 6908 // We arrange to not care about the complete redeclaration chain while we're 6909 // deserializing. Just remember that the AST has marked this one as complete 6910 // but that it's not actually complete yet, so we know we still need to 6911 // complete it later. 6912 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D)); 6913 return; 6914 } 6915 6916 const DeclContext *DC = D->getDeclContext()->getRedeclContext(); 6917 6918 // If this is a named declaration, complete it by looking it up 6919 // within its context. 6920 // 6921 // FIXME: Merging a function definition should merge 6922 // all mergeable entities within it. 6923 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) || 6924 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) { 6925 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) { 6926 if (!getContext().getLangOpts().CPlusPlus && 6927 isa<TranslationUnitDecl>(DC)) { 6928 // Outside of C++, we don't have a lookup table for the TU, so update 6929 // the identifier instead. (For C++ modules, we don't store decls 6930 // in the serialized identifier table, so we do the lookup in the TU.) 6931 auto *II = Name.getAsIdentifierInfo(); 6932 assert(II && "non-identifier name in C?"); 6933 if (II->isOutOfDate()) 6934 updateOutOfDateIdentifier(*II); 6935 } else 6936 DC->lookup(Name); 6937 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) { 6938 // Find all declarations of this kind from the relevant context. 6939 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) { 6940 auto *DC = cast<DeclContext>(DCDecl); 6941 SmallVector<Decl*, 8> Decls; 6942 FindExternalLexicalDecls( 6943 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls); 6944 } 6945 } 6946 } 6947 6948 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) 6949 CTSD->getSpecializedTemplate()->LoadLazySpecializations(); 6950 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) 6951 VTSD->getSpecializedTemplate()->LoadLazySpecializations(); 6952 if (auto *FD = dyn_cast<FunctionDecl>(D)) { 6953 if (auto *Template = FD->getPrimaryTemplate()) 6954 Template->LoadLazySpecializations(); 6955 } 6956 } 6957 6958 CXXCtorInitializer ** 6959 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) { 6960 RecordLocation Loc = getLocalBitOffset(Offset); 6961 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 6962 SavedStreamPosition SavedPosition(Cursor); 6963 Cursor.JumpToBit(Loc.Offset); 6964 ReadingKindTracker ReadingKind(Read_Decl, *this); 6965 6966 RecordData Record; 6967 unsigned Code = Cursor.ReadCode(); 6968 unsigned RecCode = Cursor.readRecord(Code, Record); 6969 if (RecCode != DECL_CXX_CTOR_INITIALIZERS) { 6970 Error("malformed AST file: missing C++ ctor initializers"); 6971 return nullptr; 6972 } 6973 6974 unsigned Idx = 0; 6975 return ReadCXXCtorInitializers(*Loc.F, Record, Idx); 6976 } 6977 6978 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 6979 assert(ContextObj && "reading base specifiers with no AST context"); 6980 ASTContext &Context = *ContextObj; 6981 6982 RecordLocation Loc = getLocalBitOffset(Offset); 6983 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 6984 SavedStreamPosition SavedPosition(Cursor); 6985 Cursor.JumpToBit(Loc.Offset); 6986 ReadingKindTracker ReadingKind(Read_Decl, *this); 6987 RecordData Record; 6988 unsigned Code = Cursor.ReadCode(); 6989 unsigned RecCode = Cursor.readRecord(Code, Record); 6990 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 6991 Error("malformed AST file: missing C++ base specifiers"); 6992 return nullptr; 6993 } 6994 6995 unsigned Idx = 0; 6996 unsigned NumBases = Record[Idx++]; 6997 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 6998 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 6999 for (unsigned I = 0; I != NumBases; ++I) 7000 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx); 7001 return Bases; 7002 } 7003 7004 serialization::DeclID 7005 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 7006 if (LocalID < NUM_PREDEF_DECL_IDS) 7007 return LocalID; 7008 7009 if (!F.ModuleOffsetMap.empty()) 7010 ReadModuleOffsetMap(F); 7011 7012 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7013 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 7014 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 7015 7016 return LocalID + I->second; 7017 } 7018 7019 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 7020 ModuleFile &M) const { 7021 // Predefined decls aren't from any module. 7022 if (ID < NUM_PREDEF_DECL_IDS) 7023 return false; 7024 7025 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID && 7026 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls; 7027 } 7028 7029 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 7030 if (!D->isFromASTFile()) 7031 return nullptr; 7032 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 7033 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7034 return I->second; 7035 } 7036 7037 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 7038 if (ID < NUM_PREDEF_DECL_IDS) 7039 return SourceLocation(); 7040 7041 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7042 7043 if (Index > DeclsLoaded.size()) { 7044 Error("declaration ID out-of-range for AST file"); 7045 return SourceLocation(); 7046 } 7047 7048 if (Decl *D = DeclsLoaded[Index]) 7049 return D->getLocation(); 7050 7051 SourceLocation Loc; 7052 DeclCursorForID(ID, Loc); 7053 return Loc; 7054 } 7055 7056 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) { 7057 switch (ID) { 7058 case PREDEF_DECL_NULL_ID: 7059 return nullptr; 7060 7061 case PREDEF_DECL_TRANSLATION_UNIT_ID: 7062 return Context.getTranslationUnitDecl(); 7063 7064 case PREDEF_DECL_OBJC_ID_ID: 7065 return Context.getObjCIdDecl(); 7066 7067 case PREDEF_DECL_OBJC_SEL_ID: 7068 return Context.getObjCSelDecl(); 7069 7070 case PREDEF_DECL_OBJC_CLASS_ID: 7071 return Context.getObjCClassDecl(); 7072 7073 case PREDEF_DECL_OBJC_PROTOCOL_ID: 7074 return Context.getObjCProtocolDecl(); 7075 7076 case PREDEF_DECL_INT_128_ID: 7077 return Context.getInt128Decl(); 7078 7079 case PREDEF_DECL_UNSIGNED_INT_128_ID: 7080 return Context.getUInt128Decl(); 7081 7082 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 7083 return Context.getObjCInstanceTypeDecl(); 7084 7085 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 7086 return Context.getBuiltinVaListDecl(); 7087 7088 case PREDEF_DECL_VA_LIST_TAG: 7089 return Context.getVaListTagDecl(); 7090 7091 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID: 7092 return Context.getBuiltinMSVaListDecl(); 7093 7094 case PREDEF_DECL_EXTERN_C_CONTEXT_ID: 7095 return Context.getExternCContextDecl(); 7096 7097 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID: 7098 return Context.getMakeIntegerSeqDecl(); 7099 7100 case PREDEF_DECL_CF_CONSTANT_STRING_ID: 7101 return Context.getCFConstantStringDecl(); 7102 7103 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID: 7104 return Context.getCFConstantStringTagDecl(); 7105 7106 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID: 7107 return Context.getTypePackElementDecl(); 7108 } 7109 llvm_unreachable("PredefinedDeclIDs unknown enum value"); 7110 } 7111 7112 Decl *ASTReader::GetExistingDecl(DeclID ID) { 7113 assert(ContextObj && "reading decl with no AST context"); 7114 if (ID < NUM_PREDEF_DECL_IDS) { 7115 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID); 7116 if (D) { 7117 // Track that we have merged the declaration with ID \p ID into the 7118 // pre-existing predefined declaration \p D. 7119 auto &Merged = KeyDecls[D->getCanonicalDecl()]; 7120 if (Merged.empty()) 7121 Merged.push_back(ID); 7122 } 7123 return D; 7124 } 7125 7126 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7127 7128 if (Index >= DeclsLoaded.size()) { 7129 assert(0 && "declaration ID out-of-range for AST file"); 7130 Error("declaration ID out-of-range for AST file"); 7131 return nullptr; 7132 } 7133 7134 return DeclsLoaded[Index]; 7135 } 7136 7137 Decl *ASTReader::GetDecl(DeclID ID) { 7138 if (ID < NUM_PREDEF_DECL_IDS) 7139 return GetExistingDecl(ID); 7140 7141 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7142 7143 if (Index >= DeclsLoaded.size()) { 7144 assert(0 && "declaration ID out-of-range for AST file"); 7145 Error("declaration ID out-of-range for AST file"); 7146 return nullptr; 7147 } 7148 7149 if (!DeclsLoaded[Index]) { 7150 ReadDeclRecord(ID); 7151 if (DeserializationListener) 7152 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 7153 } 7154 7155 return DeclsLoaded[Index]; 7156 } 7157 7158 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 7159 DeclID GlobalID) { 7160 if (GlobalID < NUM_PREDEF_DECL_IDS) 7161 return GlobalID; 7162 7163 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 7164 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7165 ModuleFile *Owner = I->second; 7166 7167 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 7168 = M.GlobalToLocalDeclIDs.find(Owner); 7169 if (Pos == M.GlobalToLocalDeclIDs.end()) 7170 return 0; 7171 7172 return GlobalID - Owner->BaseDeclID + Pos->second; 7173 } 7174 7175 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 7176 const RecordData &Record, 7177 unsigned &Idx) { 7178 if (Idx >= Record.size()) { 7179 Error("Corrupted AST file"); 7180 return 0; 7181 } 7182 7183 return getGlobalDeclID(F, Record[Idx++]); 7184 } 7185 7186 /// \brief Resolve the offset of a statement into a statement. 7187 /// 7188 /// This operation will read a new statement from the external 7189 /// source each time it is called, and is meant to be used via a 7190 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 7191 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 7192 // Switch case IDs are per Decl. 7193 ClearSwitchCaseIDs(); 7194 7195 // Offset here is a global offset across the entire chain. 7196 RecordLocation Loc = getLocalBitOffset(Offset); 7197 Loc.F->DeclsCursor.JumpToBit(Loc.Offset); 7198 assert(NumCurrentElementsDeserializing == 0 && 7199 "should not be called while already deserializing"); 7200 Deserializing D(this); 7201 return ReadStmtFromStream(*Loc.F); 7202 } 7203 7204 void ASTReader::FindExternalLexicalDecls( 7205 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 7206 SmallVectorImpl<Decl *> &Decls) { 7207 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {}; 7208 7209 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) { 7210 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries"); 7211 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) { 7212 auto K = (Decl::Kind)+LexicalDecls[I]; 7213 if (!IsKindWeWant(K)) 7214 continue; 7215 7216 auto ID = (serialization::DeclID)+LexicalDecls[I + 1]; 7217 7218 // Don't add predefined declarations to the lexical context more 7219 // than once. 7220 if (ID < NUM_PREDEF_DECL_IDS) { 7221 if (PredefsVisited[ID]) 7222 continue; 7223 7224 PredefsVisited[ID] = true; 7225 } 7226 7227 if (Decl *D = GetLocalDecl(*M, ID)) { 7228 assert(D->getKind() == K && "wrong kind for lexical decl"); 7229 if (!DC->isDeclInLexicalTraversal(D)) 7230 Decls.push_back(D); 7231 } 7232 } 7233 }; 7234 7235 if (isa<TranslationUnitDecl>(DC)) { 7236 for (auto Lexical : TULexicalDecls) 7237 Visit(Lexical.first, Lexical.second); 7238 } else { 7239 auto I = LexicalDecls.find(DC); 7240 if (I != LexicalDecls.end()) 7241 Visit(I->second.first, I->second.second); 7242 } 7243 7244 ++NumLexicalDeclContextsRead; 7245 } 7246 7247 namespace { 7248 7249 class DeclIDComp { 7250 ASTReader &Reader; 7251 ModuleFile &Mod; 7252 7253 public: 7254 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 7255 7256 bool operator()(LocalDeclID L, LocalDeclID R) const { 7257 SourceLocation LHS = getLocation(L); 7258 SourceLocation RHS = getLocation(R); 7259 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7260 } 7261 7262 bool operator()(SourceLocation LHS, LocalDeclID R) const { 7263 SourceLocation RHS = getLocation(R); 7264 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7265 } 7266 7267 bool operator()(LocalDeclID L, SourceLocation RHS) const { 7268 SourceLocation LHS = getLocation(L); 7269 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7270 } 7271 7272 SourceLocation getLocation(LocalDeclID ID) const { 7273 return Reader.getSourceManager().getFileLoc( 7274 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 7275 } 7276 }; 7277 7278 } // end anonymous namespace 7279 7280 void ASTReader::FindFileRegionDecls(FileID File, 7281 unsigned Offset, unsigned Length, 7282 SmallVectorImpl<Decl *> &Decls) { 7283 SourceManager &SM = getSourceManager(); 7284 7285 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 7286 if (I == FileDeclIDs.end()) 7287 return; 7288 7289 FileDeclsInfo &DInfo = I->second; 7290 if (DInfo.Decls.empty()) 7291 return; 7292 7293 SourceLocation 7294 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 7295 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 7296 7297 DeclIDComp DIDComp(*this, *DInfo.Mod); 7298 ArrayRef<serialization::LocalDeclID>::iterator 7299 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 7300 BeginLoc, DIDComp); 7301 if (BeginIt != DInfo.Decls.begin()) 7302 --BeginIt; 7303 7304 // If we are pointing at a top-level decl inside an objc container, we need 7305 // to backtrack until we find it otherwise we will fail to report that the 7306 // region overlaps with an objc container. 7307 while (BeginIt != DInfo.Decls.begin() && 7308 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 7309 ->isTopLevelDeclInObjCContainer()) 7310 --BeginIt; 7311 7312 ArrayRef<serialization::LocalDeclID>::iterator 7313 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 7314 EndLoc, DIDComp); 7315 if (EndIt != DInfo.Decls.end()) 7316 ++EndIt; 7317 7318 for (ArrayRef<serialization::LocalDeclID>::iterator 7319 DIt = BeginIt; DIt != EndIt; ++DIt) 7320 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 7321 } 7322 7323 bool 7324 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 7325 DeclarationName Name) { 7326 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && 7327 "DeclContext has no visible decls in storage"); 7328 if (!Name) 7329 return false; 7330 7331 auto It = Lookups.find(DC); 7332 if (It == Lookups.end()) 7333 return false; 7334 7335 Deserializing LookupResults(this); 7336 7337 // Load the list of declarations. 7338 SmallVector<NamedDecl *, 64> Decls; 7339 for (DeclID ID : It->second.Table.find(Name)) { 7340 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7341 if (ND->getDeclName() == Name) 7342 Decls.push_back(ND); 7343 } 7344 7345 ++NumVisibleDeclContextsRead; 7346 SetExternalVisibleDeclsForName(DC, Name, Decls); 7347 return !Decls.empty(); 7348 } 7349 7350 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 7351 if (!DC->hasExternalVisibleStorage()) 7352 return; 7353 7354 auto It = Lookups.find(DC); 7355 assert(It != Lookups.end() && 7356 "have external visible storage but no lookup tables"); 7357 7358 DeclsMap Decls; 7359 7360 for (DeclID ID : It->second.Table.findAll()) { 7361 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7362 Decls[ND->getDeclName()].push_back(ND); 7363 } 7364 7365 ++NumVisibleDeclContextsRead; 7366 7367 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 7368 SetExternalVisibleDeclsForName(DC, I->first, I->second); 7369 } 7370 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 7371 } 7372 7373 const serialization::reader::DeclContextLookupTable * 7374 ASTReader::getLoadedLookupTables(DeclContext *Primary) const { 7375 auto I = Lookups.find(Primary); 7376 return I == Lookups.end() ? nullptr : &I->second; 7377 } 7378 7379 /// \brief Under non-PCH compilation the consumer receives the objc methods 7380 /// before receiving the implementation, and codegen depends on this. 7381 /// We simulate this by deserializing and passing to consumer the methods of the 7382 /// implementation before passing the deserialized implementation decl. 7383 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 7384 ASTConsumer *Consumer) { 7385 assert(ImplD && Consumer); 7386 7387 for (auto *I : ImplD->methods()) 7388 Consumer->HandleInterestingDecl(DeclGroupRef(I)); 7389 7390 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 7391 } 7392 7393 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 7394 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 7395 PassObjCImplDeclToConsumer(ImplD, Consumer); 7396 else 7397 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 7398 } 7399 7400 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 7401 this->Consumer = Consumer; 7402 7403 if (Consumer) 7404 PassInterestingDeclsToConsumer(); 7405 7406 if (DeserializationListener) 7407 DeserializationListener->ReaderInitialized(this); 7408 } 7409 7410 void ASTReader::PrintStats() { 7411 std::fprintf(stderr, "*** AST File Statistics:\n"); 7412 7413 unsigned NumTypesLoaded 7414 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 7415 QualType()); 7416 unsigned NumDeclsLoaded 7417 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 7418 (Decl *)nullptr); 7419 unsigned NumIdentifiersLoaded 7420 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 7421 IdentifiersLoaded.end(), 7422 (IdentifierInfo *)nullptr); 7423 unsigned NumMacrosLoaded 7424 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 7425 MacrosLoaded.end(), 7426 (MacroInfo *)nullptr); 7427 unsigned NumSelectorsLoaded 7428 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 7429 SelectorsLoaded.end(), 7430 Selector()); 7431 7432 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 7433 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 7434 NumSLocEntriesRead, TotalNumSLocEntries, 7435 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 7436 if (!TypesLoaded.empty()) 7437 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 7438 NumTypesLoaded, (unsigned)TypesLoaded.size(), 7439 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 7440 if (!DeclsLoaded.empty()) 7441 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 7442 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 7443 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 7444 if (!IdentifiersLoaded.empty()) 7445 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 7446 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 7447 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 7448 if (!MacrosLoaded.empty()) 7449 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7450 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 7451 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 7452 if (!SelectorsLoaded.empty()) 7453 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 7454 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 7455 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 7456 if (TotalNumStatements) 7457 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 7458 NumStatementsRead, TotalNumStatements, 7459 ((float)NumStatementsRead/TotalNumStatements * 100)); 7460 if (TotalNumMacros) 7461 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7462 NumMacrosRead, TotalNumMacros, 7463 ((float)NumMacrosRead/TotalNumMacros * 100)); 7464 if (TotalLexicalDeclContexts) 7465 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 7466 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 7467 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 7468 * 100)); 7469 if (TotalVisibleDeclContexts) 7470 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 7471 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 7472 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 7473 * 100)); 7474 if (TotalNumMethodPoolEntries) { 7475 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 7476 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 7477 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 7478 * 100)); 7479 } 7480 if (NumMethodPoolLookups) { 7481 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 7482 NumMethodPoolHits, NumMethodPoolLookups, 7483 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 7484 } 7485 if (NumMethodPoolTableLookups) { 7486 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 7487 NumMethodPoolTableHits, NumMethodPoolTableLookups, 7488 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 7489 * 100.0)); 7490 } 7491 7492 if (NumIdentifierLookupHits) { 7493 std::fprintf(stderr, 7494 " %u / %u identifier table lookups succeeded (%f%%)\n", 7495 NumIdentifierLookupHits, NumIdentifierLookups, 7496 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 7497 } 7498 7499 if (GlobalIndex) { 7500 std::fprintf(stderr, "\n"); 7501 GlobalIndex->printStats(); 7502 } 7503 7504 std::fprintf(stderr, "\n"); 7505 dump(); 7506 std::fprintf(stderr, "\n"); 7507 } 7508 7509 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 7510 LLVM_DUMP_METHOD static void 7511 dumpModuleIDMap(StringRef Name, 7512 const ContinuousRangeMap<Key, ModuleFile *, 7513 InitialCapacity> &Map) { 7514 if (Map.begin() == Map.end()) 7515 return; 7516 7517 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType; 7518 llvm::errs() << Name << ":\n"; 7519 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 7520 I != IEnd; ++I) { 7521 llvm::errs() << " " << I->first << " -> " << I->second->FileName 7522 << "\n"; 7523 } 7524 } 7525 7526 LLVM_DUMP_METHOD void ASTReader::dump() { 7527 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 7528 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 7529 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 7530 dumpModuleIDMap("Global type map", GlobalTypeMap); 7531 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 7532 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 7533 dumpModuleIDMap("Global macro map", GlobalMacroMap); 7534 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 7535 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 7536 dumpModuleIDMap("Global preprocessed entity map", 7537 GlobalPreprocessedEntityMap); 7538 7539 llvm::errs() << "\n*** PCH/Modules Loaded:"; 7540 for (ModuleFile &M : ModuleMgr) 7541 M.dump(); 7542 } 7543 7544 /// Return the amount of memory used by memory buffers, breaking down 7545 /// by heap-backed versus mmap'ed memory. 7546 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 7547 for (ModuleFile &I : ModuleMgr) { 7548 if (llvm::MemoryBuffer *buf = I.Buffer) { 7549 size_t bytes = buf->getBufferSize(); 7550 switch (buf->getBufferKind()) { 7551 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 7552 sizes.malloc_bytes += bytes; 7553 break; 7554 case llvm::MemoryBuffer::MemoryBuffer_MMap: 7555 sizes.mmap_bytes += bytes; 7556 break; 7557 } 7558 } 7559 } 7560 } 7561 7562 void ASTReader::InitializeSema(Sema &S) { 7563 SemaObj = &S; 7564 S.addExternalSource(this); 7565 7566 // Makes sure any declarations that were deserialized "too early" 7567 // still get added to the identifier's declaration chains. 7568 for (uint64_t ID : PreloadedDeclIDs) { 7569 NamedDecl *D = cast<NamedDecl>(GetDecl(ID)); 7570 pushExternalDeclIntoScope(D, D->getDeclName()); 7571 } 7572 PreloadedDeclIDs.clear(); 7573 7574 // FIXME: What happens if these are changed by a module import? 7575 if (!FPPragmaOptions.empty()) { 7576 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 7577 SemaObj->FPFeatures = FPOptions(FPPragmaOptions[0]); 7578 } 7579 7580 SemaObj->OpenCLFeatures.copy(OpenCLExtensions); 7581 SemaObj->OpenCLTypeExtMap = OpenCLTypeExtMap; 7582 SemaObj->OpenCLDeclExtMap = OpenCLDeclExtMap; 7583 7584 UpdateSema(); 7585 } 7586 7587 void ASTReader::UpdateSema() { 7588 assert(SemaObj && "no Sema to update"); 7589 7590 // Load the offsets of the declarations that Sema references. 7591 // They will be lazily deserialized when needed. 7592 if (!SemaDeclRefs.empty()) { 7593 assert(SemaDeclRefs.size() % 3 == 0); 7594 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) { 7595 if (!SemaObj->StdNamespace) 7596 SemaObj->StdNamespace = SemaDeclRefs[I]; 7597 if (!SemaObj->StdBadAlloc) 7598 SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 7599 if (!SemaObj->StdAlignValT) 7600 SemaObj->StdAlignValT = SemaDeclRefs[I+2]; 7601 } 7602 SemaDeclRefs.clear(); 7603 } 7604 7605 // Update the state of pragmas. Use the same API as if we had encountered the 7606 // pragma in the source. 7607 if(OptimizeOffPragmaLocation.isValid()) 7608 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation); 7609 if (PragmaMSStructState != -1) 7610 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState); 7611 if (PointersToMembersPragmaLocation.isValid()) { 7612 SemaObj->ActOnPragmaMSPointersToMembers( 7613 (LangOptions::PragmaMSPointersToMembersKind) 7614 PragmaMSPointersToMembersState, 7615 PointersToMembersPragmaLocation); 7616 } 7617 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth; 7618 7619 if (PragmaPackCurrentValue) { 7620 // The bottom of the stack might have a default value. It must be adjusted 7621 // to the current value to ensure that the packing state is preserved after 7622 // popping entries that were included/imported from a PCH/module. 7623 bool DropFirst = false; 7624 if (!PragmaPackStack.empty() && 7625 PragmaPackStack.front().Location.isInvalid()) { 7626 assert(PragmaPackStack.front().Value == SemaObj->PackStack.DefaultValue && 7627 "Expected a default alignment value"); 7628 SemaObj->PackStack.Stack.emplace_back( 7629 PragmaPackStack.front().SlotLabel, SemaObj->PackStack.CurrentValue, 7630 SemaObj->PackStack.CurrentPragmaLocation, 7631 PragmaPackStack.front().PushLocation); 7632 DropFirst = true; 7633 } 7634 for (const auto &Entry : 7635 llvm::makeArrayRef(PragmaPackStack).drop_front(DropFirst ? 1 : 0)) 7636 SemaObj->PackStack.Stack.emplace_back(Entry.SlotLabel, Entry.Value, 7637 Entry.Location, Entry.PushLocation); 7638 if (PragmaPackCurrentLocation.isInvalid()) { 7639 assert(*PragmaPackCurrentValue == SemaObj->PackStack.DefaultValue && 7640 "Expected a default alignment value"); 7641 // Keep the current values. 7642 } else { 7643 SemaObj->PackStack.CurrentValue = *PragmaPackCurrentValue; 7644 SemaObj->PackStack.CurrentPragmaLocation = PragmaPackCurrentLocation; 7645 } 7646 } 7647 } 7648 7649 IdentifierInfo *ASTReader::get(StringRef Name) { 7650 // Note that we are loading an identifier. 7651 Deserializing AnIdentifier(this); 7652 7653 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 7654 NumIdentifierLookups, 7655 NumIdentifierLookupHits); 7656 7657 // We don't need to do identifier table lookups in C++ modules (we preload 7658 // all interesting declarations, and don't need to use the scope for name 7659 // lookups). Perform the lookup in PCH files, though, since we don't build 7660 // a complete initial identifier table if we're carrying on from a PCH. 7661 if (PP.getLangOpts().CPlusPlus) { 7662 for (auto F : ModuleMgr.pch_modules()) 7663 if (Visitor(*F)) 7664 break; 7665 } else { 7666 // If there is a global index, look there first to determine which modules 7667 // provably do not have any results for this identifier. 7668 GlobalModuleIndex::HitSet Hits; 7669 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 7670 if (!loadGlobalIndex()) { 7671 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 7672 HitsPtr = &Hits; 7673 } 7674 } 7675 7676 ModuleMgr.visit(Visitor, HitsPtr); 7677 } 7678 7679 IdentifierInfo *II = Visitor.getIdentifierInfo(); 7680 markIdentifierUpToDate(II); 7681 return II; 7682 } 7683 7684 namespace clang { 7685 7686 /// \brief An identifier-lookup iterator that enumerates all of the 7687 /// identifiers stored within a set of AST files. 7688 class ASTIdentifierIterator : public IdentifierIterator { 7689 /// \brief The AST reader whose identifiers are being enumerated. 7690 const ASTReader &Reader; 7691 7692 /// \brief The current index into the chain of AST files stored in 7693 /// the AST reader. 7694 unsigned Index; 7695 7696 /// \brief The current position within the identifier lookup table 7697 /// of the current AST file. 7698 ASTIdentifierLookupTable::key_iterator Current; 7699 7700 /// \brief The end position within the identifier lookup table of 7701 /// the current AST file. 7702 ASTIdentifierLookupTable::key_iterator End; 7703 7704 /// \brief Whether to skip any modules in the ASTReader. 7705 bool SkipModules; 7706 7707 public: 7708 explicit ASTIdentifierIterator(const ASTReader &Reader, 7709 bool SkipModules = false); 7710 7711 StringRef Next() override; 7712 }; 7713 7714 } // end namespace clang 7715 7716 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader, 7717 bool SkipModules) 7718 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) { 7719 } 7720 7721 StringRef ASTIdentifierIterator::Next() { 7722 while (Current == End) { 7723 // If we have exhausted all of our AST files, we're done. 7724 if (Index == 0) 7725 return StringRef(); 7726 7727 --Index; 7728 ModuleFile &F = Reader.ModuleMgr[Index]; 7729 if (SkipModules && F.isModule()) 7730 continue; 7731 7732 ASTIdentifierLookupTable *IdTable = 7733 (ASTIdentifierLookupTable *)F.IdentifierLookupTable; 7734 Current = IdTable->key_begin(); 7735 End = IdTable->key_end(); 7736 } 7737 7738 // We have any identifiers remaining in the current AST file; return 7739 // the next one. 7740 StringRef Result = *Current; 7741 ++Current; 7742 return Result; 7743 } 7744 7745 namespace { 7746 7747 /// A utility for appending two IdentifierIterators. 7748 class ChainedIdentifierIterator : public IdentifierIterator { 7749 std::unique_ptr<IdentifierIterator> Current; 7750 std::unique_ptr<IdentifierIterator> Queued; 7751 7752 public: 7753 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First, 7754 std::unique_ptr<IdentifierIterator> Second) 7755 : Current(std::move(First)), Queued(std::move(Second)) {} 7756 7757 StringRef Next() override { 7758 if (!Current) 7759 return StringRef(); 7760 7761 StringRef result = Current->Next(); 7762 if (!result.empty()) 7763 return result; 7764 7765 // Try the queued iterator, which may itself be empty. 7766 Current.reset(); 7767 std::swap(Current, Queued); 7768 return Next(); 7769 } 7770 }; 7771 7772 } // end anonymous namespace. 7773 7774 IdentifierIterator *ASTReader::getIdentifiers() { 7775 if (!loadGlobalIndex()) { 7776 std::unique_ptr<IdentifierIterator> ReaderIter( 7777 new ASTIdentifierIterator(*this, /*SkipModules=*/true)); 7778 std::unique_ptr<IdentifierIterator> ModulesIter( 7779 GlobalIndex->createIdentifierIterator()); 7780 return new ChainedIdentifierIterator(std::move(ReaderIter), 7781 std::move(ModulesIter)); 7782 } 7783 7784 return new ASTIdentifierIterator(*this); 7785 } 7786 7787 namespace clang { 7788 namespace serialization { 7789 7790 class ReadMethodPoolVisitor { 7791 ASTReader &Reader; 7792 Selector Sel; 7793 unsigned PriorGeneration; 7794 unsigned InstanceBits; 7795 unsigned FactoryBits; 7796 bool InstanceHasMoreThanOneDecl; 7797 bool FactoryHasMoreThanOneDecl; 7798 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 7799 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 7800 7801 public: 7802 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 7803 unsigned PriorGeneration) 7804 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration), 7805 InstanceBits(0), FactoryBits(0), InstanceHasMoreThanOneDecl(false), 7806 FactoryHasMoreThanOneDecl(false) {} 7807 7808 bool operator()(ModuleFile &M) { 7809 if (!M.SelectorLookupTable) 7810 return false; 7811 7812 // If we've already searched this module file, skip it now. 7813 if (M.Generation <= PriorGeneration) 7814 return true; 7815 7816 ++Reader.NumMethodPoolTableLookups; 7817 ASTSelectorLookupTable *PoolTable 7818 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 7819 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel); 7820 if (Pos == PoolTable->end()) 7821 return false; 7822 7823 ++Reader.NumMethodPoolTableHits; 7824 ++Reader.NumSelectorsRead; 7825 // FIXME: Not quite happy with the statistics here. We probably should 7826 // disable this tracking when called via LoadSelector. 7827 // Also, should entries without methods count as misses? 7828 ++Reader.NumMethodPoolEntriesRead; 7829 ASTSelectorLookupTrait::data_type Data = *Pos; 7830 if (Reader.DeserializationListener) 7831 Reader.DeserializationListener->SelectorRead(Data.ID, Sel); 7832 7833 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 7834 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 7835 InstanceBits = Data.InstanceBits; 7836 FactoryBits = Data.FactoryBits; 7837 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl; 7838 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl; 7839 return true; 7840 } 7841 7842 /// \brief Retrieve the instance methods found by this visitor. 7843 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 7844 return InstanceMethods; 7845 } 7846 7847 /// \brief Retrieve the instance methods found by this visitor. 7848 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 7849 return FactoryMethods; 7850 } 7851 7852 unsigned getInstanceBits() const { return InstanceBits; } 7853 unsigned getFactoryBits() const { return FactoryBits; } 7854 bool instanceHasMoreThanOneDecl() const { 7855 return InstanceHasMoreThanOneDecl; 7856 } 7857 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; } 7858 }; 7859 7860 } // end namespace serialization 7861 } // end namespace clang 7862 7863 /// \brief Add the given set of methods to the method list. 7864 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 7865 ObjCMethodList &List) { 7866 for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 7867 S.addMethodToGlobalList(&List, Methods[I]); 7868 } 7869 } 7870 7871 void ASTReader::ReadMethodPool(Selector Sel) { 7872 // Get the selector generation and update it to the current generation. 7873 unsigned &Generation = SelectorGeneration[Sel]; 7874 unsigned PriorGeneration = Generation; 7875 Generation = getGeneration(); 7876 SelectorOutOfDate[Sel] = false; 7877 7878 // Search for methods defined with this selector. 7879 ++NumMethodPoolLookups; 7880 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 7881 ModuleMgr.visit(Visitor); 7882 7883 if (Visitor.getInstanceMethods().empty() && 7884 Visitor.getFactoryMethods().empty()) 7885 return; 7886 7887 ++NumMethodPoolHits; 7888 7889 if (!getSema()) 7890 return; 7891 7892 Sema &S = *getSema(); 7893 Sema::GlobalMethodPool::iterator Pos 7894 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first; 7895 7896 Pos->second.first.setBits(Visitor.getInstanceBits()); 7897 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl()); 7898 Pos->second.second.setBits(Visitor.getFactoryBits()); 7899 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl()); 7900 7901 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since 7902 // when building a module we keep every method individually and may need to 7903 // update hasMoreThanOneDecl as we add the methods. 7904 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 7905 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 7906 } 7907 7908 void ASTReader::updateOutOfDateSelector(Selector Sel) { 7909 if (SelectorOutOfDate[Sel]) 7910 ReadMethodPool(Sel); 7911 } 7912 7913 void ASTReader::ReadKnownNamespaces( 7914 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 7915 Namespaces.clear(); 7916 7917 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 7918 if (NamespaceDecl *Namespace 7919 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 7920 Namespaces.push_back(Namespace); 7921 } 7922 } 7923 7924 void ASTReader::ReadUndefinedButUsed( 7925 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) { 7926 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 7927 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 7928 SourceLocation Loc = 7929 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 7930 Undefined.insert(std::make_pair(D, Loc)); 7931 } 7932 } 7933 7934 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector< 7935 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> & 7936 Exprs) { 7937 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) { 7938 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++])); 7939 uint64_t Count = DelayedDeleteExprs[Idx++]; 7940 for (uint64_t C = 0; C < Count; ++C) { 7941 SourceLocation DeleteLoc = 7942 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]); 7943 const bool IsArrayForm = DelayedDeleteExprs[Idx++]; 7944 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm)); 7945 } 7946 } 7947 } 7948 7949 void ASTReader::ReadTentativeDefinitions( 7950 SmallVectorImpl<VarDecl *> &TentativeDefs) { 7951 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 7952 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 7953 if (Var) 7954 TentativeDefs.push_back(Var); 7955 } 7956 TentativeDefinitions.clear(); 7957 } 7958 7959 void ASTReader::ReadUnusedFileScopedDecls( 7960 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 7961 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 7962 DeclaratorDecl *D 7963 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 7964 if (D) 7965 Decls.push_back(D); 7966 } 7967 UnusedFileScopedDecls.clear(); 7968 } 7969 7970 void ASTReader::ReadDelegatingConstructors( 7971 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 7972 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 7973 CXXConstructorDecl *D 7974 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 7975 if (D) 7976 Decls.push_back(D); 7977 } 7978 DelegatingCtorDecls.clear(); 7979 } 7980 7981 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 7982 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 7983 TypedefNameDecl *D 7984 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 7985 if (D) 7986 Decls.push_back(D); 7987 } 7988 ExtVectorDecls.clear(); 7989 } 7990 7991 void ASTReader::ReadUnusedLocalTypedefNameCandidates( 7992 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 7993 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N; 7994 ++I) { 7995 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>( 7996 GetDecl(UnusedLocalTypedefNameCandidates[I])); 7997 if (D) 7998 Decls.insert(D); 7999 } 8000 UnusedLocalTypedefNameCandidates.clear(); 8001 } 8002 8003 void ASTReader::ReadReferencedSelectors( 8004 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) { 8005 if (ReferencedSelectorsData.empty()) 8006 return; 8007 8008 // If there are @selector references added them to its pool. This is for 8009 // implementation of -Wselector. 8010 unsigned int DataSize = ReferencedSelectorsData.size()-1; 8011 unsigned I = 0; 8012 while (I < DataSize) { 8013 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 8014 SourceLocation SelLoc 8015 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 8016 Sels.push_back(std::make_pair(Sel, SelLoc)); 8017 } 8018 ReferencedSelectorsData.clear(); 8019 } 8020 8021 void ASTReader::ReadWeakUndeclaredIdentifiers( 8022 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) { 8023 if (WeakUndeclaredIdentifiers.empty()) 8024 return; 8025 8026 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 8027 IdentifierInfo *WeakId 8028 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8029 IdentifierInfo *AliasId 8030 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8031 SourceLocation Loc 8032 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 8033 bool Used = WeakUndeclaredIdentifiers[I++]; 8034 WeakInfo WI(AliasId, Loc); 8035 WI.setUsed(Used); 8036 WeakIDs.push_back(std::make_pair(WeakId, WI)); 8037 } 8038 WeakUndeclaredIdentifiers.clear(); 8039 } 8040 8041 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 8042 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 8043 ExternalVTableUse VT; 8044 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 8045 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 8046 VT.DefinitionRequired = VTableUses[Idx++]; 8047 VTables.push_back(VT); 8048 } 8049 8050 VTableUses.clear(); 8051 } 8052 8053 void ASTReader::ReadPendingInstantiations( 8054 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) { 8055 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 8056 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 8057 SourceLocation Loc 8058 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 8059 8060 Pending.push_back(std::make_pair(D, Loc)); 8061 } 8062 PendingInstantiations.clear(); 8063 } 8064 8065 void ASTReader::ReadLateParsedTemplates( 8066 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>> 8067 &LPTMap) { 8068 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N; 8069 /* In loop */) { 8070 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++])); 8071 8072 auto LT = llvm::make_unique<LateParsedTemplate>(); 8073 LT->D = GetDecl(LateParsedTemplates[Idx++]); 8074 8075 ModuleFile *F = getOwningModuleFile(LT->D); 8076 assert(F && "No module"); 8077 8078 unsigned TokN = LateParsedTemplates[Idx++]; 8079 LT->Toks.reserve(TokN); 8080 for (unsigned T = 0; T < TokN; ++T) 8081 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx)); 8082 8083 LPTMap.insert(std::make_pair(FD, std::move(LT))); 8084 } 8085 8086 LateParsedTemplates.clear(); 8087 } 8088 8089 void ASTReader::LoadSelector(Selector Sel) { 8090 // It would be complicated to avoid reading the methods anyway. So don't. 8091 ReadMethodPool(Sel); 8092 } 8093 8094 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 8095 assert(ID && "Non-zero identifier ID required"); 8096 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 8097 IdentifiersLoaded[ID - 1] = II; 8098 if (DeserializationListener) 8099 DeserializationListener->IdentifierRead(ID, II); 8100 } 8101 8102 /// \brief Set the globally-visible declarations associated with the given 8103 /// identifier. 8104 /// 8105 /// If the AST reader is currently in a state where the given declaration IDs 8106 /// cannot safely be resolved, they are queued until it is safe to resolve 8107 /// them. 8108 /// 8109 /// \param II an IdentifierInfo that refers to one or more globally-visible 8110 /// declarations. 8111 /// 8112 /// \param DeclIDs the set of declaration IDs with the name @p II that are 8113 /// visible at global scope. 8114 /// 8115 /// \param Decls if non-null, this vector will be populated with the set of 8116 /// deserialized declarations. These declarations will not be pushed into 8117 /// scope. 8118 void 8119 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 8120 const SmallVectorImpl<uint32_t> &DeclIDs, 8121 SmallVectorImpl<Decl *> *Decls) { 8122 if (NumCurrentElementsDeserializing && !Decls) { 8123 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 8124 return; 8125 } 8126 8127 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 8128 if (!SemaObj) { 8129 // Queue this declaration so that it will be added to the 8130 // translation unit scope and identifier's declaration chain 8131 // once a Sema object is known. 8132 PreloadedDeclIDs.push_back(DeclIDs[I]); 8133 continue; 8134 } 8135 8136 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 8137 8138 // If we're simply supposed to record the declarations, do so now. 8139 if (Decls) { 8140 Decls->push_back(D); 8141 continue; 8142 } 8143 8144 // Introduce this declaration into the translation-unit scope 8145 // and add it to the declaration chain for this identifier, so 8146 // that (unqualified) name lookup will find it. 8147 pushExternalDeclIntoScope(D, II); 8148 } 8149 } 8150 8151 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 8152 if (ID == 0) 8153 return nullptr; 8154 8155 if (IdentifiersLoaded.empty()) { 8156 Error("no identifier table in AST file"); 8157 return nullptr; 8158 } 8159 8160 ID -= 1; 8161 if (!IdentifiersLoaded[ID]) { 8162 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 8163 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 8164 ModuleFile *M = I->second; 8165 unsigned Index = ID - M->BaseIdentifierID; 8166 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index]; 8167 8168 // All of the strings in the AST file are preceded by a 16-bit length. 8169 // Extract that 16-bit length to avoid having to execute strlen(). 8170 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as 8171 // unsigned integers. This is important to avoid integer overflow when 8172 // we cast them to 'unsigned'. 8173 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2; 8174 unsigned StrLen = (((unsigned) StrLenPtr[0]) 8175 | (((unsigned) StrLenPtr[1]) << 8)) - 1; 8176 auto &II = PP.getIdentifierTable().get(StringRef(Str, StrLen)); 8177 IdentifiersLoaded[ID] = &II; 8178 markIdentifierFromAST(*this, II); 8179 if (DeserializationListener) 8180 DeserializationListener->IdentifierRead(ID + 1, &II); 8181 } 8182 8183 return IdentifiersLoaded[ID]; 8184 } 8185 8186 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 8187 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 8188 } 8189 8190 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 8191 if (LocalID < NUM_PREDEF_IDENT_IDS) 8192 return LocalID; 8193 8194 if (!M.ModuleOffsetMap.empty()) 8195 ReadModuleOffsetMap(M); 8196 8197 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8198 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 8199 assert(I != M.IdentifierRemap.end() 8200 && "Invalid index into identifier index remap"); 8201 8202 return LocalID + I->second; 8203 } 8204 8205 MacroInfo *ASTReader::getMacro(MacroID ID) { 8206 if (ID == 0) 8207 return nullptr; 8208 8209 if (MacrosLoaded.empty()) { 8210 Error("no macro table in AST file"); 8211 return nullptr; 8212 } 8213 8214 ID -= NUM_PREDEF_MACRO_IDS; 8215 if (!MacrosLoaded[ID]) { 8216 GlobalMacroMapType::iterator I 8217 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 8218 assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 8219 ModuleFile *M = I->second; 8220 unsigned Index = ID - M->BaseMacroID; 8221 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]); 8222 8223 if (DeserializationListener) 8224 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 8225 MacrosLoaded[ID]); 8226 } 8227 8228 return MacrosLoaded[ID]; 8229 } 8230 8231 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 8232 if (LocalID < NUM_PREDEF_MACRO_IDS) 8233 return LocalID; 8234 8235 if (!M.ModuleOffsetMap.empty()) 8236 ReadModuleOffsetMap(M); 8237 8238 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8239 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 8240 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 8241 8242 return LocalID + I->second; 8243 } 8244 8245 serialization::SubmoduleID 8246 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 8247 if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 8248 return LocalID; 8249 8250 if (!M.ModuleOffsetMap.empty()) 8251 ReadModuleOffsetMap(M); 8252 8253 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8254 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 8255 assert(I != M.SubmoduleRemap.end() 8256 && "Invalid index into submodule index remap"); 8257 8258 return LocalID + I->second; 8259 } 8260 8261 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) { 8262 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 8263 assert(GlobalID == 0 && "Unhandled global submodule ID"); 8264 return nullptr; 8265 } 8266 8267 if (GlobalID > SubmodulesLoaded.size()) { 8268 Error("submodule ID out of range in AST file"); 8269 return nullptr; 8270 } 8271 8272 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 8273 } 8274 8275 Module *ASTReader::getModule(unsigned ID) { 8276 return getSubmodule(ID); 8277 } 8278 8279 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) { 8280 if (ID & 1) { 8281 // It's a module, look it up by submodule ID. 8282 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1)); 8283 return I == GlobalSubmoduleMap.end() ? nullptr : I->second; 8284 } else { 8285 // It's a prefix (preamble, PCH, ...). Look it up by index. 8286 unsigned IndexFromEnd = ID >> 1; 8287 assert(IndexFromEnd && "got reference to unknown module file"); 8288 return getModuleManager().pch_modules().end()[-IndexFromEnd]; 8289 } 8290 } 8291 8292 unsigned ASTReader::getModuleFileID(ModuleFile *F) { 8293 if (!F) 8294 return 1; 8295 8296 // For a file representing a module, use the submodule ID of the top-level 8297 // module as the file ID. For any other kind of file, the number of such 8298 // files loaded beforehand will be the same on reload. 8299 // FIXME: Is this true even if we have an explicit module file and a PCH? 8300 if (F->isModule()) 8301 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1; 8302 8303 auto PCHModules = getModuleManager().pch_modules(); 8304 auto I = std::find(PCHModules.begin(), PCHModules.end(), F); 8305 assert(I != PCHModules.end() && "emitting reference to unknown file"); 8306 return (I - PCHModules.end()) << 1; 8307 } 8308 8309 llvm::Optional<ExternalASTSource::ASTSourceDescriptor> 8310 ASTReader::getSourceDescriptor(unsigned ID) { 8311 if (const Module *M = getSubmodule(ID)) 8312 return ExternalASTSource::ASTSourceDescriptor(*M); 8313 8314 // If there is only a single PCH, return it instead. 8315 // Chained PCH are not supported. 8316 const auto &PCHChain = ModuleMgr.pch_modules(); 8317 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) { 8318 ModuleFile &MF = ModuleMgr.getPrimaryModule(); 8319 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName); 8320 StringRef FileName = llvm::sys::path::filename(MF.FileName); 8321 return ASTReader::ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName, 8322 MF.Signature); 8323 } 8324 return None; 8325 } 8326 8327 ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) { 8328 auto I = DefinitionSource.find(FD); 8329 if (I == DefinitionSource.end()) 8330 return EK_ReplyHazy; 8331 return I->second ? EK_Never : EK_Always; 8332 } 8333 8334 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 8335 return DecodeSelector(getGlobalSelectorID(M, LocalID)); 8336 } 8337 8338 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { 8339 if (ID == 0) 8340 return Selector(); 8341 8342 if (ID > SelectorsLoaded.size()) { 8343 Error("selector ID out of range in AST file"); 8344 return Selector(); 8345 } 8346 8347 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) { 8348 // Load this selector from the selector table. 8349 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 8350 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 8351 ModuleFile &M = *I->second; 8352 ASTSelectorLookupTrait Trait(*this, M); 8353 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 8354 SelectorsLoaded[ID - 1] = 8355 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 8356 if (DeserializationListener) 8357 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 8358 } 8359 8360 return SelectorsLoaded[ID - 1]; 8361 } 8362 8363 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 8364 return DecodeSelector(ID); 8365 } 8366 8367 uint32_t ASTReader::GetNumExternalSelectors() { 8368 // ID 0 (the null selector) is considered an external selector. 8369 return getTotalNumSelectors() + 1; 8370 } 8371 8372 serialization::SelectorID 8373 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 8374 if (LocalID < NUM_PREDEF_SELECTOR_IDS) 8375 return LocalID; 8376 8377 if (!M.ModuleOffsetMap.empty()) 8378 ReadModuleOffsetMap(M); 8379 8380 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8381 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 8382 assert(I != M.SelectorRemap.end() 8383 && "Invalid index into selector index remap"); 8384 8385 return LocalID + I->second; 8386 } 8387 8388 DeclarationName 8389 ASTReader::ReadDeclarationName(ModuleFile &F, 8390 const RecordData &Record, unsigned &Idx) { 8391 ASTContext &Context = getContext(); 8392 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++]; 8393 switch (Kind) { 8394 case DeclarationName::Identifier: 8395 return DeclarationName(GetIdentifierInfo(F, Record, Idx)); 8396 8397 case DeclarationName::ObjCZeroArgSelector: 8398 case DeclarationName::ObjCOneArgSelector: 8399 case DeclarationName::ObjCMultiArgSelector: 8400 return DeclarationName(ReadSelector(F, Record, Idx)); 8401 8402 case DeclarationName::CXXConstructorName: 8403 return Context.DeclarationNames.getCXXConstructorName( 8404 Context.getCanonicalType(readType(F, Record, Idx))); 8405 8406 case DeclarationName::CXXDestructorName: 8407 return Context.DeclarationNames.getCXXDestructorName( 8408 Context.getCanonicalType(readType(F, Record, Idx))); 8409 8410 case DeclarationName::CXXDeductionGuideName: 8411 return Context.DeclarationNames.getCXXDeductionGuideName( 8412 ReadDeclAs<TemplateDecl>(F, Record, Idx)); 8413 8414 case DeclarationName::CXXConversionFunctionName: 8415 return Context.DeclarationNames.getCXXConversionFunctionName( 8416 Context.getCanonicalType(readType(F, Record, Idx))); 8417 8418 case DeclarationName::CXXOperatorName: 8419 return Context.DeclarationNames.getCXXOperatorName( 8420 (OverloadedOperatorKind)Record[Idx++]); 8421 8422 case DeclarationName::CXXLiteralOperatorName: 8423 return Context.DeclarationNames.getCXXLiteralOperatorName( 8424 GetIdentifierInfo(F, Record, Idx)); 8425 8426 case DeclarationName::CXXUsingDirective: 8427 return DeclarationName::getUsingDirectiveName(); 8428 } 8429 8430 llvm_unreachable("Invalid NameKind!"); 8431 } 8432 8433 void ASTReader::ReadDeclarationNameLoc(ModuleFile &F, 8434 DeclarationNameLoc &DNLoc, 8435 DeclarationName Name, 8436 const RecordData &Record, unsigned &Idx) { 8437 switch (Name.getNameKind()) { 8438 case DeclarationName::CXXConstructorName: 8439 case DeclarationName::CXXDestructorName: 8440 case DeclarationName::CXXConversionFunctionName: 8441 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx); 8442 break; 8443 8444 case DeclarationName::CXXOperatorName: 8445 DNLoc.CXXOperatorName.BeginOpNameLoc 8446 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 8447 DNLoc.CXXOperatorName.EndOpNameLoc 8448 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 8449 break; 8450 8451 case DeclarationName::CXXLiteralOperatorName: 8452 DNLoc.CXXLiteralOperatorName.OpNameLoc 8453 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 8454 break; 8455 8456 case DeclarationName::Identifier: 8457 case DeclarationName::ObjCZeroArgSelector: 8458 case DeclarationName::ObjCOneArgSelector: 8459 case DeclarationName::ObjCMultiArgSelector: 8460 case DeclarationName::CXXUsingDirective: 8461 case DeclarationName::CXXDeductionGuideName: 8462 break; 8463 } 8464 } 8465 8466 void ASTReader::ReadDeclarationNameInfo(ModuleFile &F, 8467 DeclarationNameInfo &NameInfo, 8468 const RecordData &Record, unsigned &Idx) { 8469 NameInfo.setName(ReadDeclarationName(F, Record, Idx)); 8470 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx)); 8471 DeclarationNameLoc DNLoc; 8472 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx); 8473 NameInfo.setInfo(DNLoc); 8474 } 8475 8476 void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info, 8477 const RecordData &Record, unsigned &Idx) { 8478 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx); 8479 unsigned NumTPLists = Record[Idx++]; 8480 Info.NumTemplParamLists = NumTPLists; 8481 if (NumTPLists) { 8482 Info.TemplParamLists = 8483 new (getContext()) TemplateParameterList *[NumTPLists]; 8484 for (unsigned i = 0; i != NumTPLists; ++i) 8485 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx); 8486 } 8487 } 8488 8489 TemplateName 8490 ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record, 8491 unsigned &Idx) { 8492 ASTContext &Context = getContext(); 8493 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++]; 8494 switch (Kind) { 8495 case TemplateName::Template: 8496 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx)); 8497 8498 case TemplateName::OverloadedTemplate: { 8499 unsigned size = Record[Idx++]; 8500 UnresolvedSet<8> Decls; 8501 while (size--) 8502 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx)); 8503 8504 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end()); 8505 } 8506 8507 case TemplateName::QualifiedTemplate: { 8508 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 8509 bool hasTemplKeyword = Record[Idx++]; 8510 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx); 8511 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template); 8512 } 8513 8514 case TemplateName::DependentTemplate: { 8515 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 8516 if (Record[Idx++]) // isIdentifier 8517 return Context.getDependentTemplateName(NNS, 8518 GetIdentifierInfo(F, Record, 8519 Idx)); 8520 return Context.getDependentTemplateName(NNS, 8521 (OverloadedOperatorKind)Record[Idx++]); 8522 } 8523 8524 case TemplateName::SubstTemplateTemplateParm: { 8525 TemplateTemplateParmDecl *param 8526 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 8527 if (!param) return TemplateName(); 8528 TemplateName replacement = ReadTemplateName(F, Record, Idx); 8529 return Context.getSubstTemplateTemplateParm(param, replacement); 8530 } 8531 8532 case TemplateName::SubstTemplateTemplateParmPack: { 8533 TemplateTemplateParmDecl *Param 8534 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 8535 if (!Param) 8536 return TemplateName(); 8537 8538 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx); 8539 if (ArgPack.getKind() != TemplateArgument::Pack) 8540 return TemplateName(); 8541 8542 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 8543 } 8544 } 8545 8546 llvm_unreachable("Unhandled template name kind!"); 8547 } 8548 8549 TemplateArgument ASTReader::ReadTemplateArgument(ModuleFile &F, 8550 const RecordData &Record, 8551 unsigned &Idx, 8552 bool Canonicalize) { 8553 ASTContext &Context = getContext(); 8554 if (Canonicalize) { 8555 // The caller wants a canonical template argument. Sometimes the AST only 8556 // wants template arguments in canonical form (particularly as the template 8557 // argument lists of template specializations) so ensure we preserve that 8558 // canonical form across serialization. 8559 TemplateArgument Arg = ReadTemplateArgument(F, Record, Idx, false); 8560 return Context.getCanonicalTemplateArgument(Arg); 8561 } 8562 8563 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++]; 8564 switch (Kind) { 8565 case TemplateArgument::Null: 8566 return TemplateArgument(); 8567 case TemplateArgument::Type: 8568 return TemplateArgument(readType(F, Record, Idx)); 8569 case TemplateArgument::Declaration: { 8570 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx); 8571 return TemplateArgument(D, readType(F, Record, Idx)); 8572 } 8573 case TemplateArgument::NullPtr: 8574 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true); 8575 case TemplateArgument::Integral: { 8576 llvm::APSInt Value = ReadAPSInt(Record, Idx); 8577 QualType T = readType(F, Record, Idx); 8578 return TemplateArgument(Context, Value, T); 8579 } 8580 case TemplateArgument::Template: 8581 return TemplateArgument(ReadTemplateName(F, Record, Idx)); 8582 case TemplateArgument::TemplateExpansion: { 8583 TemplateName Name = ReadTemplateName(F, Record, Idx); 8584 Optional<unsigned> NumTemplateExpansions; 8585 if (unsigned NumExpansions = Record[Idx++]) 8586 NumTemplateExpansions = NumExpansions - 1; 8587 return TemplateArgument(Name, NumTemplateExpansions); 8588 } 8589 case TemplateArgument::Expression: 8590 return TemplateArgument(ReadExpr(F)); 8591 case TemplateArgument::Pack: { 8592 unsigned NumArgs = Record[Idx++]; 8593 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs]; 8594 for (unsigned I = 0; I != NumArgs; ++I) 8595 Args[I] = ReadTemplateArgument(F, Record, Idx); 8596 return TemplateArgument(llvm::makeArrayRef(Args, NumArgs)); 8597 } 8598 } 8599 8600 llvm_unreachable("Unhandled template argument kind!"); 8601 } 8602 8603 TemplateParameterList * 8604 ASTReader::ReadTemplateParameterList(ModuleFile &F, 8605 const RecordData &Record, unsigned &Idx) { 8606 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx); 8607 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx); 8608 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx); 8609 8610 unsigned NumParams = Record[Idx++]; 8611 SmallVector<NamedDecl *, 16> Params; 8612 Params.reserve(NumParams); 8613 while (NumParams--) 8614 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx)); 8615 8616 // TODO: Concepts 8617 TemplateParameterList *TemplateParams = TemplateParameterList::Create( 8618 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, nullptr); 8619 return TemplateParams; 8620 } 8621 8622 void 8623 ASTReader:: 8624 ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs, 8625 ModuleFile &F, const RecordData &Record, 8626 unsigned &Idx, bool Canonicalize) { 8627 unsigned NumTemplateArgs = Record[Idx++]; 8628 TemplArgs.reserve(NumTemplateArgs); 8629 while (NumTemplateArgs--) 8630 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx, Canonicalize)); 8631 } 8632 8633 /// \brief Read a UnresolvedSet structure. 8634 void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set, 8635 const RecordData &Record, unsigned &Idx) { 8636 unsigned NumDecls = Record[Idx++]; 8637 Set.reserve(getContext(), NumDecls); 8638 while (NumDecls--) { 8639 DeclID ID = ReadDeclID(F, Record, Idx); 8640 AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 8641 Set.addLazyDecl(getContext(), ID, AS); 8642 } 8643 } 8644 8645 CXXBaseSpecifier 8646 ASTReader::ReadCXXBaseSpecifier(ModuleFile &F, 8647 const RecordData &Record, unsigned &Idx) { 8648 bool isVirtual = static_cast<bool>(Record[Idx++]); 8649 bool isBaseOfClass = static_cast<bool>(Record[Idx++]); 8650 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]); 8651 bool inheritConstructors = static_cast<bool>(Record[Idx++]); 8652 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx); 8653 SourceRange Range = ReadSourceRange(F, Record, Idx); 8654 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx); 8655 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 8656 EllipsisLoc); 8657 Result.setInheritConstructors(inheritConstructors); 8658 return Result; 8659 } 8660 8661 CXXCtorInitializer ** 8662 ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record, 8663 unsigned &Idx) { 8664 ASTContext &Context = getContext(); 8665 unsigned NumInitializers = Record[Idx++]; 8666 assert(NumInitializers && "wrote ctor initializers but have no inits"); 8667 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers]; 8668 for (unsigned i = 0; i != NumInitializers; ++i) { 8669 TypeSourceInfo *TInfo = nullptr; 8670 bool IsBaseVirtual = false; 8671 FieldDecl *Member = nullptr; 8672 IndirectFieldDecl *IndirectMember = nullptr; 8673 8674 CtorInitializerType Type = (CtorInitializerType)Record[Idx++]; 8675 switch (Type) { 8676 case CTOR_INITIALIZER_BASE: 8677 TInfo = GetTypeSourceInfo(F, Record, Idx); 8678 IsBaseVirtual = Record[Idx++]; 8679 break; 8680 8681 case CTOR_INITIALIZER_DELEGATING: 8682 TInfo = GetTypeSourceInfo(F, Record, Idx); 8683 break; 8684 8685 case CTOR_INITIALIZER_MEMBER: 8686 Member = ReadDeclAs<FieldDecl>(F, Record, Idx); 8687 break; 8688 8689 case CTOR_INITIALIZER_INDIRECT_MEMBER: 8690 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx); 8691 break; 8692 } 8693 8694 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx); 8695 Expr *Init = ReadExpr(F); 8696 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx); 8697 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx); 8698 8699 CXXCtorInitializer *BOMInit; 8700 if (Type == CTOR_INITIALIZER_BASE) 8701 BOMInit = new (Context) 8702 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init, 8703 RParenLoc, MemberOrEllipsisLoc); 8704 else if (Type == CTOR_INITIALIZER_DELEGATING) 8705 BOMInit = new (Context) 8706 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc); 8707 else if (Member) 8708 BOMInit = new (Context) 8709 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc, 8710 Init, RParenLoc); 8711 else 8712 BOMInit = new (Context) 8713 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc, 8714 LParenLoc, Init, RParenLoc); 8715 8716 if (/*IsWritten*/Record[Idx++]) { 8717 unsigned SourceOrder = Record[Idx++]; 8718 BOMInit->setSourceOrder(SourceOrder); 8719 } 8720 8721 CtorInitializers[i] = BOMInit; 8722 } 8723 8724 return CtorInitializers; 8725 } 8726 8727 NestedNameSpecifier * 8728 ASTReader::ReadNestedNameSpecifier(ModuleFile &F, 8729 const RecordData &Record, unsigned &Idx) { 8730 ASTContext &Context = getContext(); 8731 unsigned N = Record[Idx++]; 8732 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr; 8733 for (unsigned I = 0; I != N; ++I) { 8734 NestedNameSpecifier::SpecifierKind Kind 8735 = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 8736 switch (Kind) { 8737 case NestedNameSpecifier::Identifier: { 8738 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 8739 NNS = NestedNameSpecifier::Create(Context, Prev, II); 8740 break; 8741 } 8742 8743 case NestedNameSpecifier::Namespace: { 8744 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 8745 NNS = NestedNameSpecifier::Create(Context, Prev, NS); 8746 break; 8747 } 8748 8749 case NestedNameSpecifier::NamespaceAlias: { 8750 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 8751 NNS = NestedNameSpecifier::Create(Context, Prev, Alias); 8752 break; 8753 } 8754 8755 case NestedNameSpecifier::TypeSpec: 8756 case NestedNameSpecifier::TypeSpecWithTemplate: { 8757 const Type *T = readType(F, Record, Idx).getTypePtrOrNull(); 8758 if (!T) 8759 return nullptr; 8760 8761 bool Template = Record[Idx++]; 8762 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T); 8763 break; 8764 } 8765 8766 case NestedNameSpecifier::Global: { 8767 NNS = NestedNameSpecifier::GlobalSpecifier(Context); 8768 // No associated value, and there can't be a prefix. 8769 break; 8770 } 8771 8772 case NestedNameSpecifier::Super: { 8773 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx); 8774 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD); 8775 break; 8776 } 8777 } 8778 Prev = NNS; 8779 } 8780 return NNS; 8781 } 8782 8783 NestedNameSpecifierLoc 8784 ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record, 8785 unsigned &Idx) { 8786 ASTContext &Context = getContext(); 8787 unsigned N = Record[Idx++]; 8788 NestedNameSpecifierLocBuilder Builder; 8789 for (unsigned I = 0; I != N; ++I) { 8790 NestedNameSpecifier::SpecifierKind Kind 8791 = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 8792 switch (Kind) { 8793 case NestedNameSpecifier::Identifier: { 8794 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 8795 SourceRange Range = ReadSourceRange(F, Record, Idx); 8796 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 8797 break; 8798 } 8799 8800 case NestedNameSpecifier::Namespace: { 8801 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 8802 SourceRange Range = ReadSourceRange(F, Record, Idx); 8803 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 8804 break; 8805 } 8806 8807 case NestedNameSpecifier::NamespaceAlias: { 8808 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 8809 SourceRange Range = ReadSourceRange(F, Record, Idx); 8810 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 8811 break; 8812 } 8813 8814 case NestedNameSpecifier::TypeSpec: 8815 case NestedNameSpecifier::TypeSpecWithTemplate: { 8816 bool Template = Record[Idx++]; 8817 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx); 8818 if (!T) 8819 return NestedNameSpecifierLoc(); 8820 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 8821 8822 // FIXME: 'template' keyword location not saved anywhere, so we fake it. 8823 Builder.Extend(Context, 8824 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 8825 T->getTypeLoc(), ColonColonLoc); 8826 break; 8827 } 8828 8829 case NestedNameSpecifier::Global: { 8830 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 8831 Builder.MakeGlobal(Context, ColonColonLoc); 8832 break; 8833 } 8834 8835 case NestedNameSpecifier::Super: { 8836 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx); 8837 SourceRange Range = ReadSourceRange(F, Record, Idx); 8838 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd()); 8839 break; 8840 } 8841 } 8842 } 8843 8844 return Builder.getWithLocInContext(Context); 8845 } 8846 8847 SourceRange 8848 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 8849 unsigned &Idx) { 8850 SourceLocation beg = ReadSourceLocation(F, Record, Idx); 8851 SourceLocation end = ReadSourceLocation(F, Record, Idx); 8852 return SourceRange(beg, end); 8853 } 8854 8855 /// \brief Read an integral value 8856 llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) { 8857 unsigned BitWidth = Record[Idx++]; 8858 unsigned NumWords = llvm::APInt::getNumWords(BitWidth); 8859 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]); 8860 Idx += NumWords; 8861 return Result; 8862 } 8863 8864 /// \brief Read a signed integral value 8865 llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) { 8866 bool isUnsigned = Record[Idx++]; 8867 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned); 8868 } 8869 8870 /// \brief Read a floating-point value 8871 llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record, 8872 const llvm::fltSemantics &Sem, 8873 unsigned &Idx) { 8874 return llvm::APFloat(Sem, ReadAPInt(Record, Idx)); 8875 } 8876 8877 // \brief Read a string 8878 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 8879 unsigned Len = Record[Idx++]; 8880 std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 8881 Idx += Len; 8882 return Result; 8883 } 8884 8885 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record, 8886 unsigned &Idx) { 8887 std::string Filename = ReadString(Record, Idx); 8888 ResolveImportedPath(F, Filename); 8889 return Filename; 8890 } 8891 8892 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 8893 unsigned &Idx) { 8894 unsigned Major = Record[Idx++]; 8895 unsigned Minor = Record[Idx++]; 8896 unsigned Subminor = Record[Idx++]; 8897 if (Minor == 0) 8898 return VersionTuple(Major); 8899 if (Subminor == 0) 8900 return VersionTuple(Major, Minor - 1); 8901 return VersionTuple(Major, Minor - 1, Subminor - 1); 8902 } 8903 8904 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 8905 const RecordData &Record, 8906 unsigned &Idx) { 8907 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 8908 return CXXTemporary::Create(getContext(), Decl); 8909 } 8910 8911 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const { 8912 return Diag(CurrentImportLoc, DiagID); 8913 } 8914 8915 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const { 8916 return Diags.Report(Loc, DiagID); 8917 } 8918 8919 /// \brief Retrieve the identifier table associated with the 8920 /// preprocessor. 8921 IdentifierTable &ASTReader::getIdentifierTable() { 8922 return PP.getIdentifierTable(); 8923 } 8924 8925 /// \brief Record that the given ID maps to the given switch-case 8926 /// statement. 8927 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 8928 assert((*CurrSwitchCaseStmts)[ID] == nullptr && 8929 "Already have a SwitchCase with this ID"); 8930 (*CurrSwitchCaseStmts)[ID] = SC; 8931 } 8932 8933 /// \brief Retrieve the switch-case statement with the given ID. 8934 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 8935 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID"); 8936 return (*CurrSwitchCaseStmts)[ID]; 8937 } 8938 8939 void ASTReader::ClearSwitchCaseIDs() { 8940 CurrSwitchCaseStmts->clear(); 8941 } 8942 8943 void ASTReader::ReadComments() { 8944 ASTContext &Context = getContext(); 8945 std::vector<RawComment *> Comments; 8946 for (SmallVectorImpl<std::pair<BitstreamCursor, 8947 serialization::ModuleFile *> >::iterator 8948 I = CommentsCursors.begin(), 8949 E = CommentsCursors.end(); 8950 I != E; ++I) { 8951 Comments.clear(); 8952 BitstreamCursor &Cursor = I->first; 8953 serialization::ModuleFile &F = *I->second; 8954 SavedStreamPosition SavedPosition(Cursor); 8955 8956 RecordData Record; 8957 while (true) { 8958 llvm::BitstreamEntry Entry = 8959 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd); 8960 8961 switch (Entry.Kind) { 8962 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 8963 case llvm::BitstreamEntry::Error: 8964 Error("malformed block record in AST file"); 8965 return; 8966 case llvm::BitstreamEntry::EndBlock: 8967 goto NextCursor; 8968 case llvm::BitstreamEntry::Record: 8969 // The interesting case. 8970 break; 8971 } 8972 8973 // Read a record. 8974 Record.clear(); 8975 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) { 8976 case COMMENTS_RAW_COMMENT: { 8977 unsigned Idx = 0; 8978 SourceRange SR = ReadSourceRange(F, Record, Idx); 8979 RawComment::CommentKind Kind = 8980 (RawComment::CommentKind) Record[Idx++]; 8981 bool IsTrailingComment = Record[Idx++]; 8982 bool IsAlmostTrailingComment = Record[Idx++]; 8983 Comments.push_back(new (Context) RawComment( 8984 SR, Kind, IsTrailingComment, IsAlmostTrailingComment, 8985 Context.getLangOpts().CommentOpts.ParseAllComments)); 8986 break; 8987 } 8988 } 8989 } 8990 NextCursor: 8991 // De-serialized SourceLocations get negative FileIDs for other modules, 8992 // potentially invalidating the original order. Sort it again. 8993 std::sort(Comments.begin(), Comments.end(), 8994 BeforeThanCompare<RawComment>(SourceMgr)); 8995 Context.Comments.addDeserializedComments(Comments); 8996 } 8997 } 8998 8999 void ASTReader::visitInputFiles(serialization::ModuleFile &MF, 9000 bool IncludeSystem, bool Complain, 9001 llvm::function_ref<void(const serialization::InputFile &IF, 9002 bool isSystem)> Visitor) { 9003 unsigned NumUserInputs = MF.NumUserInputFiles; 9004 unsigned NumInputs = MF.InputFilesLoaded.size(); 9005 assert(NumUserInputs <= NumInputs); 9006 unsigned N = IncludeSystem ? NumInputs : NumUserInputs; 9007 for (unsigned I = 0; I < N; ++I) { 9008 bool IsSystem = I >= NumUserInputs; 9009 InputFile IF = getInputFile(MF, I+1, Complain); 9010 Visitor(IF, IsSystem); 9011 } 9012 } 9013 9014 void ASTReader::visitTopLevelModuleMaps( 9015 serialization::ModuleFile &MF, 9016 llvm::function_ref<void(const FileEntry *FE)> Visitor) { 9017 unsigned NumInputs = MF.InputFilesLoaded.size(); 9018 for (unsigned I = 0; I < NumInputs; ++I) { 9019 InputFileInfo IFI = readInputFileInfo(MF, I + 1); 9020 if (IFI.TopLevelModuleMap) 9021 // FIXME: This unnecessarily re-reads the InputFileInfo. 9022 if (auto *FE = getInputFile(MF, I + 1).getFile()) 9023 Visitor(FE); 9024 } 9025 } 9026 9027 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) { 9028 // If we know the owning module, use it. 9029 if (Module *M = D->getImportedOwningModule()) 9030 return M->getFullModuleName(); 9031 9032 // Otherwise, use the name of the top-level module the decl is within. 9033 if (ModuleFile *M = getOwningModuleFile(D)) 9034 return M->ModuleName; 9035 9036 // Not from a module. 9037 return ""; 9038 } 9039 9040 void ASTReader::finishPendingActions() { 9041 while (!PendingIdentifierInfos.empty() || 9042 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() || 9043 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || 9044 !PendingUpdateRecords.empty()) { 9045 // If any identifiers with corresponding top-level declarations have 9046 // been loaded, load those declarations now. 9047 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> > 9048 TopLevelDeclsMap; 9049 TopLevelDeclsMap TopLevelDecls; 9050 9051 while (!PendingIdentifierInfos.empty()) { 9052 IdentifierInfo *II = PendingIdentifierInfos.back().first; 9053 SmallVector<uint32_t, 4> DeclIDs = 9054 std::move(PendingIdentifierInfos.back().second); 9055 PendingIdentifierInfos.pop_back(); 9056 9057 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 9058 } 9059 9060 // For each decl chain that we wanted to complete while deserializing, mark 9061 // it as "still needs to be completed". 9062 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) { 9063 markIncompleteDeclChain(PendingIncompleteDeclChains[I]); 9064 } 9065 PendingIncompleteDeclChains.clear(); 9066 9067 // Load pending declaration chains. 9068 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) 9069 loadPendingDeclChain(PendingDeclChains[I].first, PendingDeclChains[I].second); 9070 PendingDeclChains.clear(); 9071 9072 // Make the most recent of the top-level declarations visible. 9073 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 9074 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 9075 IdentifierInfo *II = TLD->first; 9076 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 9077 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 9078 } 9079 } 9080 9081 // Load any pending macro definitions. 9082 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 9083 IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 9084 SmallVector<PendingMacroInfo, 2> GlobalIDs; 9085 GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 9086 // Initialize the macro history from chained-PCHs ahead of module imports. 9087 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9088 ++IDIdx) { 9089 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9090 if (!Info.M->isModule()) 9091 resolvePendingMacro(II, Info); 9092 } 9093 // Handle module imports. 9094 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9095 ++IDIdx) { 9096 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9097 if (Info.M->isModule()) 9098 resolvePendingMacro(II, Info); 9099 } 9100 } 9101 PendingMacroIDs.clear(); 9102 9103 // Wire up the DeclContexts for Decls that we delayed setting until 9104 // recursive loading is completed. 9105 while (!PendingDeclContextInfos.empty()) { 9106 PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 9107 PendingDeclContextInfos.pop_front(); 9108 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 9109 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 9110 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 9111 } 9112 9113 // Perform any pending declaration updates. 9114 while (!PendingUpdateRecords.empty()) { 9115 auto Update = PendingUpdateRecords.pop_back_val(); 9116 ReadingKindTracker ReadingKind(Read_Decl, *this); 9117 loadDeclUpdateRecords(Update); 9118 } 9119 } 9120 9121 // At this point, all update records for loaded decls are in place, so any 9122 // fake class definitions should have become real. 9123 assert(PendingFakeDefinitionData.empty() && 9124 "faked up a class definition but never saw the real one"); 9125 9126 // If we deserialized any C++ or Objective-C class definitions, any 9127 // Objective-C protocol definitions, or any redeclarable templates, make sure 9128 // that all redeclarations point to the definitions. Note that this can only 9129 // happen now, after the redeclaration chains have been fully wired. 9130 for (Decl *D : PendingDefinitions) { 9131 if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 9132 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) { 9133 // Make sure that the TagType points at the definition. 9134 const_cast<TagType*>(TagT)->decl = TD; 9135 } 9136 9137 if (auto RD = dyn_cast<CXXRecordDecl>(D)) { 9138 for (auto *R = getMostRecentExistingDecl(RD); R; 9139 R = R->getPreviousDecl()) { 9140 assert((R == D) == 9141 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && 9142 "declaration thinks it's the definition but it isn't"); 9143 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData; 9144 } 9145 } 9146 9147 continue; 9148 } 9149 9150 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) { 9151 // Make sure that the ObjCInterfaceType points at the definition. 9152 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 9153 ->Decl = ID; 9154 9155 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl()) 9156 cast<ObjCInterfaceDecl>(R)->Data = ID->Data; 9157 9158 continue; 9159 } 9160 9161 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) { 9162 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl()) 9163 cast<ObjCProtocolDecl>(R)->Data = PD->Data; 9164 9165 continue; 9166 } 9167 9168 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl(); 9169 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl()) 9170 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common; 9171 } 9172 PendingDefinitions.clear(); 9173 9174 // Load the bodies of any functions or methods we've encountered. We do 9175 // this now (delayed) so that we can be sure that the declaration chains 9176 // have been fully wired up (hasBody relies on this). 9177 // FIXME: We shouldn't require complete redeclaration chains here. 9178 for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 9179 PBEnd = PendingBodies.end(); 9180 PB != PBEnd; ++PB) { 9181 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 9182 // FIXME: Check for =delete/=default? 9183 // FIXME: Complain about ODR violations here? 9184 const FunctionDecl *Defn = nullptr; 9185 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) { 9186 FD->setLazyBody(PB->second); 9187 } else 9188 mergeDefinitionVisibility(const_cast<FunctionDecl*>(Defn), FD); 9189 continue; 9190 } 9191 9192 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 9193 if (!getContext().getLangOpts().Modules || !MD->hasBody()) 9194 MD->setLazyBody(PB->second); 9195 } 9196 PendingBodies.clear(); 9197 9198 // Do some cleanup. 9199 for (auto *ND : PendingMergedDefinitionsToDeduplicate) 9200 getContext().deduplicateMergedDefinitonsFor(ND); 9201 PendingMergedDefinitionsToDeduplicate.clear(); 9202 } 9203 9204 void ASTReader::diagnoseOdrViolations() { 9205 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty()) 9206 return; 9207 9208 // Trigger the import of the full definition of each class that had any 9209 // odr-merging problems, so we can produce better diagnostics for them. 9210 // These updates may in turn find and diagnose some ODR failures, so take 9211 // ownership of the set first. 9212 auto OdrMergeFailures = std::move(PendingOdrMergeFailures); 9213 PendingOdrMergeFailures.clear(); 9214 for (auto &Merge : OdrMergeFailures) { 9215 Merge.first->buildLookup(); 9216 Merge.first->decls_begin(); 9217 Merge.first->bases_begin(); 9218 Merge.first->vbases_begin(); 9219 for (auto &RecordPair : Merge.second) { 9220 auto *RD = RecordPair.first; 9221 RD->decls_begin(); 9222 RD->bases_begin(); 9223 RD->vbases_begin(); 9224 } 9225 } 9226 9227 // For each declaration from a merged context, check that the canonical 9228 // definition of that context also contains a declaration of the same 9229 // entity. 9230 // 9231 // Caution: this loop does things that might invalidate iterators into 9232 // PendingOdrMergeChecks. Don't turn this into a range-based for loop! 9233 while (!PendingOdrMergeChecks.empty()) { 9234 NamedDecl *D = PendingOdrMergeChecks.pop_back_val(); 9235 9236 // FIXME: Skip over implicit declarations for now. This matters for things 9237 // like implicitly-declared special member functions. This isn't entirely 9238 // correct; we can end up with multiple unmerged declarations of the same 9239 // implicit entity. 9240 if (D->isImplicit()) 9241 continue; 9242 9243 DeclContext *CanonDef = D->getDeclContext(); 9244 9245 bool Found = false; 9246 const Decl *DCanon = D->getCanonicalDecl(); 9247 9248 for (auto RI : D->redecls()) { 9249 if (RI->getLexicalDeclContext() == CanonDef) { 9250 Found = true; 9251 break; 9252 } 9253 } 9254 if (Found) 9255 continue; 9256 9257 // Quick check failed, time to do the slow thing. Note, we can't just 9258 // look up the name of D in CanonDef here, because the member that is 9259 // in CanonDef might not be found by name lookup (it might have been 9260 // replaced by a more recent declaration in the lookup table), and we 9261 // can't necessarily find it in the redeclaration chain because it might 9262 // be merely mergeable, not redeclarable. 9263 llvm::SmallVector<const NamedDecl*, 4> Candidates; 9264 for (auto *CanonMember : CanonDef->decls()) { 9265 if (CanonMember->getCanonicalDecl() == DCanon) { 9266 // This can happen if the declaration is merely mergeable and not 9267 // actually redeclarable (we looked for redeclarations earlier). 9268 // 9269 // FIXME: We should be able to detect this more efficiently, without 9270 // pulling in all of the members of CanonDef. 9271 Found = true; 9272 break; 9273 } 9274 if (auto *ND = dyn_cast<NamedDecl>(CanonMember)) 9275 if (ND->getDeclName() == D->getDeclName()) 9276 Candidates.push_back(ND); 9277 } 9278 9279 if (!Found) { 9280 // The AST doesn't like TagDecls becoming invalid after they've been 9281 // completed. We only really need to mark FieldDecls as invalid here. 9282 if (!isa<TagDecl>(D)) 9283 D->setInvalidDecl(); 9284 9285 // Ensure we don't accidentally recursively enter deserialization while 9286 // we're producing our diagnostic. 9287 Deserializing RecursionGuard(this); 9288 9289 std::string CanonDefModule = 9290 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef)); 9291 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl) 9292 << D << getOwningModuleNameForDiagnostic(D) 9293 << CanonDef << CanonDefModule.empty() << CanonDefModule; 9294 9295 if (Candidates.empty()) 9296 Diag(cast<Decl>(CanonDef)->getLocation(), 9297 diag::note_module_odr_violation_no_possible_decls) << D; 9298 else { 9299 for (unsigned I = 0, N = Candidates.size(); I != N; ++I) 9300 Diag(Candidates[I]->getLocation(), 9301 diag::note_module_odr_violation_possible_decl) 9302 << Candidates[I]; 9303 } 9304 9305 DiagnosedOdrMergeFailures.insert(CanonDef); 9306 } 9307 } 9308 9309 if (OdrMergeFailures.empty()) 9310 return; 9311 9312 // Ensure we don't accidentally recursively enter deserialization while 9313 // we're producing our diagnostics. 9314 Deserializing RecursionGuard(this); 9315 9316 // Issue any pending ODR-failure diagnostics. 9317 for (auto &Merge : OdrMergeFailures) { 9318 // If we've already pointed out a specific problem with this class, don't 9319 // bother issuing a general "something's different" diagnostic. 9320 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 9321 continue; 9322 9323 bool Diagnosed = false; 9324 CXXRecordDecl *FirstRecord = Merge.first; 9325 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstRecord); 9326 for (auto &RecordPair : Merge.second) { 9327 CXXRecordDecl *SecondRecord = RecordPair.first; 9328 // Multiple different declarations got merged together; tell the user 9329 // where they came from. 9330 if (FirstRecord == SecondRecord) 9331 continue; 9332 9333 std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord); 9334 9335 auto *FirstDD = FirstRecord->DefinitionData; 9336 auto *SecondDD = RecordPair.second; 9337 9338 assert(FirstDD && SecondDD && "Definitions without DefinitionData"); 9339 9340 // Diagnostics from DefinitionData are emitted here. 9341 if (FirstDD != SecondDD) { 9342 enum ODRDefinitionDataDifference { 9343 NumBases, 9344 NumVBases, 9345 BaseType, 9346 BaseVirtual, 9347 BaseAccess, 9348 }; 9349 auto ODRDiagError = [FirstRecord, &FirstModule, 9350 this](SourceLocation Loc, SourceRange Range, 9351 ODRDefinitionDataDifference DiffType) { 9352 return Diag(Loc, diag::err_module_odr_violation_definition_data) 9353 << FirstRecord << FirstModule.empty() << FirstModule << Range 9354 << DiffType; 9355 }; 9356 auto ODRDiagNote = [&SecondModule, 9357 this](SourceLocation Loc, SourceRange Range, 9358 ODRDefinitionDataDifference DiffType) { 9359 return Diag(Loc, diag::note_module_odr_violation_definition_data) 9360 << SecondModule << Range << DiffType; 9361 }; 9362 9363 ODRHash Hash; 9364 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) { 9365 Hash.clear(); 9366 Hash.AddQualType(Ty); 9367 return Hash.CalculateHash(); 9368 }; 9369 9370 unsigned FirstNumBases = FirstDD->NumBases; 9371 unsigned FirstNumVBases = FirstDD->NumVBases; 9372 unsigned SecondNumBases = SecondDD->NumBases; 9373 unsigned SecondNumVBases = SecondDD->NumVBases; 9374 9375 auto GetSourceRange = [](struct CXXRecordDecl::DefinitionData *DD) { 9376 unsigned NumBases = DD->NumBases; 9377 if (NumBases == 0) return SourceRange(); 9378 auto bases = DD->bases(); 9379 return SourceRange(bases[0].getLocStart(), 9380 bases[NumBases - 1].getLocEnd()); 9381 }; 9382 9383 if (FirstNumBases != SecondNumBases) { 9384 ODRDiagError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 9385 NumBases) 9386 << FirstNumBases; 9387 ODRDiagNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 9388 NumBases) 9389 << SecondNumBases; 9390 Diagnosed = true; 9391 break; 9392 } 9393 9394 if (FirstNumVBases != SecondNumVBases) { 9395 ODRDiagError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 9396 NumVBases) 9397 << FirstNumVBases; 9398 ODRDiagNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 9399 NumVBases) 9400 << SecondNumVBases; 9401 Diagnosed = true; 9402 break; 9403 } 9404 9405 auto FirstBases = FirstDD->bases(); 9406 auto SecondBases = SecondDD->bases(); 9407 unsigned i = 0; 9408 for (i = 0; i < FirstNumBases; ++i) { 9409 auto FirstBase = FirstBases[i]; 9410 auto SecondBase = SecondBases[i]; 9411 if (ComputeQualTypeODRHash(FirstBase.getType()) != 9412 ComputeQualTypeODRHash(SecondBase.getType())) { 9413 ODRDiagError(FirstRecord->getLocation(), FirstBase.getSourceRange(), 9414 BaseType) 9415 << (i + 1) << FirstBase.getType(); 9416 ODRDiagNote(SecondRecord->getLocation(), 9417 SecondBase.getSourceRange(), BaseType) 9418 << (i + 1) << SecondBase.getType(); 9419 break; 9420 } 9421 9422 if (FirstBase.isVirtual() != SecondBase.isVirtual()) { 9423 ODRDiagError(FirstRecord->getLocation(), FirstBase.getSourceRange(), 9424 BaseVirtual) 9425 << (i + 1) << FirstBase.isVirtual() << FirstBase.getType(); 9426 ODRDiagNote(SecondRecord->getLocation(), 9427 SecondBase.getSourceRange(), BaseVirtual) 9428 << (i + 1) << SecondBase.isVirtual() << SecondBase.getType(); 9429 break; 9430 } 9431 9432 if (FirstBase.getAccessSpecifierAsWritten() != 9433 SecondBase.getAccessSpecifierAsWritten()) { 9434 ODRDiagError(FirstRecord->getLocation(), FirstBase.getSourceRange(), 9435 BaseAccess) 9436 << (i + 1) << FirstBase.getType() 9437 << (int)FirstBase.getAccessSpecifierAsWritten(); 9438 ODRDiagNote(SecondRecord->getLocation(), 9439 SecondBase.getSourceRange(), BaseAccess) 9440 << (i + 1) << SecondBase.getType() 9441 << (int)SecondBase.getAccessSpecifierAsWritten(); 9442 break; 9443 } 9444 } 9445 9446 if (i != FirstNumBases) { 9447 Diagnosed = true; 9448 break; 9449 } 9450 } 9451 9452 using DeclHashes = llvm::SmallVector<std::pair<Decl *, unsigned>, 4>; 9453 9454 const ClassTemplateDecl *FirstTemplate = 9455 FirstRecord->getDescribedClassTemplate(); 9456 const ClassTemplateDecl *SecondTemplate = 9457 SecondRecord->getDescribedClassTemplate(); 9458 9459 assert(!FirstTemplate == !SecondTemplate && 9460 "Both pointers should be null or non-null"); 9461 9462 enum ODRTemplateDifference { 9463 ParamEmptyName, 9464 ParamName, 9465 ParamSingleDefaultArgument, 9466 ParamDifferentDefaultArgument, 9467 }; 9468 9469 if (FirstTemplate && SecondTemplate) { 9470 DeclHashes FirstTemplateHashes; 9471 DeclHashes SecondTemplateHashes; 9472 ODRHash Hash; 9473 9474 auto PopulateTemplateParameterHashs = 9475 [&Hash](DeclHashes &Hashes, const ClassTemplateDecl *TD) { 9476 for (auto *D : TD->getTemplateParameters()->asArray()) { 9477 Hash.clear(); 9478 Hash.AddSubDecl(D); 9479 Hashes.emplace_back(D, Hash.CalculateHash()); 9480 } 9481 }; 9482 9483 PopulateTemplateParameterHashs(FirstTemplateHashes, FirstTemplate); 9484 PopulateTemplateParameterHashs(SecondTemplateHashes, SecondTemplate); 9485 9486 assert(FirstTemplateHashes.size() == SecondTemplateHashes.size() && 9487 "Number of template parameters should be equal."); 9488 9489 auto FirstIt = FirstTemplateHashes.begin(); 9490 auto FirstEnd = FirstTemplateHashes.end(); 9491 auto SecondIt = SecondTemplateHashes.begin(); 9492 for (; FirstIt != FirstEnd; ++FirstIt, ++SecondIt) { 9493 if (FirstIt->second == SecondIt->second) 9494 continue; 9495 9496 auto ODRDiagError = [FirstRecord, &FirstModule, 9497 this](SourceLocation Loc, SourceRange Range, 9498 ODRTemplateDifference DiffType) { 9499 return Diag(Loc, diag::err_module_odr_violation_template_parameter) 9500 << FirstRecord << FirstModule.empty() << FirstModule << Range 9501 << DiffType; 9502 }; 9503 auto ODRDiagNote = [&SecondModule, 9504 this](SourceLocation Loc, SourceRange Range, 9505 ODRTemplateDifference DiffType) { 9506 return Diag(Loc, diag::note_module_odr_violation_template_parameter) 9507 << SecondModule << Range << DiffType; 9508 }; 9509 9510 const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first); 9511 const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first); 9512 9513 assert(FirstDecl->getKind() == SecondDecl->getKind() && 9514 "Parameter Decl's should be the same kind."); 9515 9516 DeclarationName FirstName = FirstDecl->getDeclName(); 9517 DeclarationName SecondName = SecondDecl->getDeclName(); 9518 9519 if (FirstName != SecondName) { 9520 const bool FirstNameEmpty = 9521 FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo(); 9522 const bool SecondNameEmpty = 9523 SecondName.isIdentifier() && !SecondName.getAsIdentifierInfo(); 9524 assert((!FirstNameEmpty || !SecondNameEmpty) && 9525 "Both template parameters cannot be unnamed."); 9526 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(), 9527 FirstNameEmpty ? ParamEmptyName : ParamName) 9528 << FirstName; 9529 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(), 9530 SecondNameEmpty ? ParamEmptyName : ParamName) 9531 << SecondName; 9532 break; 9533 } 9534 9535 switch (FirstDecl->getKind()) { 9536 default: 9537 llvm_unreachable("Invalid template parameter type."); 9538 case Decl::TemplateTypeParm: { 9539 const auto *FirstParam = cast<TemplateTypeParmDecl>(FirstDecl); 9540 const auto *SecondParam = cast<TemplateTypeParmDecl>(SecondDecl); 9541 const bool HasFirstDefaultArgument = 9542 FirstParam->hasDefaultArgument() && 9543 !FirstParam->defaultArgumentWasInherited(); 9544 const bool HasSecondDefaultArgument = 9545 SecondParam->hasDefaultArgument() && 9546 !SecondParam->defaultArgumentWasInherited(); 9547 9548 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 9549 ODRDiagError(FirstDecl->getLocation(), 9550 FirstDecl->getSourceRange(), 9551 ParamSingleDefaultArgument) 9552 << HasFirstDefaultArgument; 9553 ODRDiagNote(SecondDecl->getLocation(), 9554 SecondDecl->getSourceRange(), 9555 ParamSingleDefaultArgument) 9556 << HasSecondDefaultArgument; 9557 break; 9558 } 9559 9560 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 9561 "Expecting default arguments."); 9562 9563 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(), 9564 ParamDifferentDefaultArgument); 9565 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(), 9566 ParamDifferentDefaultArgument); 9567 9568 break; 9569 } 9570 case Decl::NonTypeTemplateParm: { 9571 const auto *FirstParam = cast<NonTypeTemplateParmDecl>(FirstDecl); 9572 const auto *SecondParam = cast<NonTypeTemplateParmDecl>(SecondDecl); 9573 const bool HasFirstDefaultArgument = 9574 FirstParam->hasDefaultArgument() && 9575 !FirstParam->defaultArgumentWasInherited(); 9576 const bool HasSecondDefaultArgument = 9577 SecondParam->hasDefaultArgument() && 9578 !SecondParam->defaultArgumentWasInherited(); 9579 9580 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 9581 ODRDiagError(FirstDecl->getLocation(), 9582 FirstDecl->getSourceRange(), 9583 ParamSingleDefaultArgument) 9584 << HasFirstDefaultArgument; 9585 ODRDiagNote(SecondDecl->getLocation(), 9586 SecondDecl->getSourceRange(), 9587 ParamSingleDefaultArgument) 9588 << HasSecondDefaultArgument; 9589 break; 9590 } 9591 9592 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 9593 "Expecting default arguments."); 9594 9595 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(), 9596 ParamDifferentDefaultArgument); 9597 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(), 9598 ParamDifferentDefaultArgument); 9599 9600 break; 9601 } 9602 case Decl::TemplateTemplateParm: { 9603 const auto *FirstParam = cast<TemplateTemplateParmDecl>(FirstDecl); 9604 const auto *SecondParam = 9605 cast<TemplateTemplateParmDecl>(SecondDecl); 9606 const bool HasFirstDefaultArgument = 9607 FirstParam->hasDefaultArgument() && 9608 !FirstParam->defaultArgumentWasInherited(); 9609 const bool HasSecondDefaultArgument = 9610 SecondParam->hasDefaultArgument() && 9611 !SecondParam->defaultArgumentWasInherited(); 9612 9613 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 9614 ODRDiagError(FirstDecl->getLocation(), 9615 FirstDecl->getSourceRange(), 9616 ParamSingleDefaultArgument) 9617 << HasFirstDefaultArgument; 9618 ODRDiagNote(SecondDecl->getLocation(), 9619 SecondDecl->getSourceRange(), 9620 ParamSingleDefaultArgument) 9621 << HasSecondDefaultArgument; 9622 break; 9623 } 9624 9625 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 9626 "Expecting default arguments."); 9627 9628 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(), 9629 ParamDifferentDefaultArgument); 9630 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(), 9631 ParamDifferentDefaultArgument); 9632 9633 break; 9634 } 9635 } 9636 9637 break; 9638 } 9639 9640 if (FirstIt != FirstEnd) { 9641 Diagnosed = true; 9642 break; 9643 } 9644 } 9645 9646 DeclHashes FirstHashes; 9647 DeclHashes SecondHashes; 9648 ODRHash Hash; 9649 9650 auto PopulateHashes = [&Hash, FirstRecord](DeclHashes &Hashes, 9651 CXXRecordDecl *Record) { 9652 for (auto *D : Record->decls()) { 9653 // Due to decl merging, the first CXXRecordDecl is the parent of 9654 // Decls in both records. 9655 if (!ODRHash::isWhitelistedDecl(D, FirstRecord)) 9656 continue; 9657 Hash.clear(); 9658 Hash.AddSubDecl(D); 9659 Hashes.emplace_back(D, Hash.CalculateHash()); 9660 } 9661 }; 9662 PopulateHashes(FirstHashes, FirstRecord); 9663 PopulateHashes(SecondHashes, SecondRecord); 9664 9665 // Used with err_module_odr_violation_mismatch_decl and 9666 // note_module_odr_violation_mismatch_decl 9667 // This list should be the same Decl's as in ODRHash::isWhiteListedDecl 9668 enum { 9669 EndOfClass, 9670 PublicSpecifer, 9671 PrivateSpecifer, 9672 ProtectedSpecifer, 9673 StaticAssert, 9674 Field, 9675 CXXMethod, 9676 TypeAlias, 9677 TypeDef, 9678 Var, 9679 Friend, 9680 Other 9681 } FirstDiffType = Other, 9682 SecondDiffType = Other; 9683 9684 auto DifferenceSelector = [](Decl *D) { 9685 assert(D && "valid Decl required"); 9686 switch (D->getKind()) { 9687 default: 9688 return Other; 9689 case Decl::AccessSpec: 9690 switch (D->getAccess()) { 9691 case AS_public: 9692 return PublicSpecifer; 9693 case AS_private: 9694 return PrivateSpecifer; 9695 case AS_protected: 9696 return ProtectedSpecifer; 9697 case AS_none: 9698 break; 9699 } 9700 llvm_unreachable("Invalid access specifier"); 9701 case Decl::StaticAssert: 9702 return StaticAssert; 9703 case Decl::Field: 9704 return Field; 9705 case Decl::CXXMethod: 9706 case Decl::CXXConstructor: 9707 case Decl::CXXDestructor: 9708 return CXXMethod; 9709 case Decl::TypeAlias: 9710 return TypeAlias; 9711 case Decl::Typedef: 9712 return TypeDef; 9713 case Decl::Var: 9714 return Var; 9715 case Decl::Friend: 9716 return Friend; 9717 } 9718 }; 9719 9720 Decl *FirstDecl = nullptr; 9721 Decl *SecondDecl = nullptr; 9722 auto FirstIt = FirstHashes.begin(); 9723 auto SecondIt = SecondHashes.begin(); 9724 9725 // If there is a diagnoseable difference, FirstDiffType and 9726 // SecondDiffType will not be Other and FirstDecl and SecondDecl will be 9727 // filled in if not EndOfClass. 9728 while (FirstIt != FirstHashes.end() || SecondIt != SecondHashes.end()) { 9729 if (FirstIt != FirstHashes.end() && SecondIt != SecondHashes.end() && 9730 FirstIt->second == SecondIt->second) { 9731 ++FirstIt; 9732 ++SecondIt; 9733 continue; 9734 } 9735 9736 FirstDecl = FirstIt == FirstHashes.end() ? nullptr : FirstIt->first; 9737 SecondDecl = SecondIt == SecondHashes.end() ? nullptr : SecondIt->first; 9738 9739 FirstDiffType = FirstDecl ? DifferenceSelector(FirstDecl) : EndOfClass; 9740 SecondDiffType = 9741 SecondDecl ? DifferenceSelector(SecondDecl) : EndOfClass; 9742 9743 break; 9744 } 9745 9746 if (FirstDiffType == Other || SecondDiffType == Other) { 9747 // Reaching this point means an unexpected Decl was encountered 9748 // or no difference was detected. This causes a generic error 9749 // message to be emitted. 9750 Diag(FirstRecord->getLocation(), 9751 diag::err_module_odr_violation_different_definitions) 9752 << FirstRecord << FirstModule.empty() << FirstModule; 9753 9754 if (FirstDecl) { 9755 Diag(FirstDecl->getLocation(), diag::note_first_module_difference) 9756 << FirstRecord << FirstDecl->getSourceRange(); 9757 } 9758 9759 Diag(SecondRecord->getLocation(), 9760 diag::note_module_odr_violation_different_definitions) 9761 << SecondModule; 9762 9763 if (SecondDecl) { 9764 Diag(SecondDecl->getLocation(), diag::note_second_module_difference) 9765 << SecondDecl->getSourceRange(); 9766 } 9767 9768 Diagnosed = true; 9769 break; 9770 } 9771 9772 if (FirstDiffType != SecondDiffType) { 9773 SourceLocation FirstLoc; 9774 SourceRange FirstRange; 9775 if (FirstDiffType == EndOfClass) { 9776 FirstLoc = FirstRecord->getBraceRange().getEnd(); 9777 } else { 9778 FirstLoc = FirstIt->first->getLocation(); 9779 FirstRange = FirstIt->first->getSourceRange(); 9780 } 9781 Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl) 9782 << FirstRecord << FirstModule.empty() << FirstModule << FirstRange 9783 << FirstDiffType; 9784 9785 SourceLocation SecondLoc; 9786 SourceRange SecondRange; 9787 if (SecondDiffType == EndOfClass) { 9788 SecondLoc = SecondRecord->getBraceRange().getEnd(); 9789 } else { 9790 SecondLoc = SecondDecl->getLocation(); 9791 SecondRange = SecondDecl->getSourceRange(); 9792 } 9793 Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl) 9794 << SecondModule << SecondRange << SecondDiffType; 9795 Diagnosed = true; 9796 break; 9797 } 9798 9799 assert(FirstDiffType == SecondDiffType); 9800 9801 // Used with err_module_odr_violation_mismatch_decl_diff and 9802 // note_module_odr_violation_mismatch_decl_diff 9803 enum ODRDeclDifference{ 9804 StaticAssertCondition, 9805 StaticAssertMessage, 9806 StaticAssertOnlyMessage, 9807 FieldName, 9808 FieldTypeName, 9809 FieldSingleBitField, 9810 FieldDifferentWidthBitField, 9811 FieldSingleMutable, 9812 FieldSingleInitializer, 9813 FieldDifferentInitializers, 9814 MethodName, 9815 MethodDeleted, 9816 MethodVirtual, 9817 MethodStatic, 9818 MethodVolatile, 9819 MethodConst, 9820 MethodInline, 9821 MethodNumberParameters, 9822 MethodParameterType, 9823 MethodParameterName, 9824 MethodParameterSingleDefaultArgument, 9825 MethodParameterDifferentDefaultArgument, 9826 TypedefName, 9827 TypedefType, 9828 VarName, 9829 VarType, 9830 VarSingleInitializer, 9831 VarDifferentInitializer, 9832 VarConstexpr, 9833 FriendTypeFunction, 9834 FriendType, 9835 FriendFunction, 9836 }; 9837 9838 // These lambdas have the common portions of the ODR diagnostics. This 9839 // has the same return as Diag(), so addition parameters can be passed 9840 // in with operator<< 9841 auto ODRDiagError = [FirstRecord, &FirstModule, this]( 9842 SourceLocation Loc, SourceRange Range, ODRDeclDifference DiffType) { 9843 return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff) 9844 << FirstRecord << FirstModule.empty() << FirstModule << Range 9845 << DiffType; 9846 }; 9847 auto ODRDiagNote = [&SecondModule, this]( 9848 SourceLocation Loc, SourceRange Range, ODRDeclDifference DiffType) { 9849 return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff) 9850 << SecondModule << Range << DiffType; 9851 }; 9852 9853 auto ComputeODRHash = [&Hash](const Stmt* S) { 9854 assert(S); 9855 Hash.clear(); 9856 Hash.AddStmt(S); 9857 return Hash.CalculateHash(); 9858 }; 9859 9860 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) { 9861 Hash.clear(); 9862 Hash.AddQualType(Ty); 9863 return Hash.CalculateHash(); 9864 }; 9865 9866 switch (FirstDiffType) { 9867 case Other: 9868 case EndOfClass: 9869 case PublicSpecifer: 9870 case PrivateSpecifer: 9871 case ProtectedSpecifer: 9872 llvm_unreachable("Invalid diff type"); 9873 9874 case StaticAssert: { 9875 StaticAssertDecl *FirstSA = cast<StaticAssertDecl>(FirstDecl); 9876 StaticAssertDecl *SecondSA = cast<StaticAssertDecl>(SecondDecl); 9877 9878 Expr *FirstExpr = FirstSA->getAssertExpr(); 9879 Expr *SecondExpr = SecondSA->getAssertExpr(); 9880 unsigned FirstODRHash = ComputeODRHash(FirstExpr); 9881 unsigned SecondODRHash = ComputeODRHash(SecondExpr); 9882 if (FirstODRHash != SecondODRHash) { 9883 ODRDiagError(FirstExpr->getLocStart(), FirstExpr->getSourceRange(), 9884 StaticAssertCondition); 9885 ODRDiagNote(SecondExpr->getLocStart(), 9886 SecondExpr->getSourceRange(), StaticAssertCondition); 9887 Diagnosed = true; 9888 break; 9889 } 9890 9891 StringLiteral *FirstStr = FirstSA->getMessage(); 9892 StringLiteral *SecondStr = SecondSA->getMessage(); 9893 assert((FirstStr || SecondStr) && "Both messages cannot be empty"); 9894 if ((FirstStr && !SecondStr) || (!FirstStr && SecondStr)) { 9895 SourceLocation FirstLoc, SecondLoc; 9896 SourceRange FirstRange, SecondRange; 9897 if (FirstStr) { 9898 FirstLoc = FirstStr->getLocStart(); 9899 FirstRange = FirstStr->getSourceRange(); 9900 } else { 9901 FirstLoc = FirstSA->getLocStart(); 9902 FirstRange = FirstSA->getSourceRange(); 9903 } 9904 if (SecondStr) { 9905 SecondLoc = SecondStr->getLocStart(); 9906 SecondRange = SecondStr->getSourceRange(); 9907 } else { 9908 SecondLoc = SecondSA->getLocStart(); 9909 SecondRange = SecondSA->getSourceRange(); 9910 } 9911 ODRDiagError(FirstLoc, FirstRange, StaticAssertOnlyMessage) 9912 << (FirstStr == nullptr); 9913 ODRDiagNote(SecondLoc, SecondRange, StaticAssertOnlyMessage) 9914 << (SecondStr == nullptr); 9915 Diagnosed = true; 9916 break; 9917 } 9918 9919 if (FirstStr && SecondStr && 9920 FirstStr->getString() != SecondStr->getString()) { 9921 ODRDiagError(FirstStr->getLocStart(), FirstStr->getSourceRange(), 9922 StaticAssertMessage); 9923 ODRDiagNote(SecondStr->getLocStart(), SecondStr->getSourceRange(), 9924 StaticAssertMessage); 9925 Diagnosed = true; 9926 break; 9927 } 9928 break; 9929 } 9930 case Field: { 9931 FieldDecl *FirstField = cast<FieldDecl>(FirstDecl); 9932 FieldDecl *SecondField = cast<FieldDecl>(SecondDecl); 9933 IdentifierInfo *FirstII = FirstField->getIdentifier(); 9934 IdentifierInfo *SecondII = SecondField->getIdentifier(); 9935 if (FirstII->getName() != SecondII->getName()) { 9936 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), 9937 FieldName) 9938 << FirstII; 9939 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), 9940 FieldName) 9941 << SecondII; 9942 9943 Diagnosed = true; 9944 break; 9945 } 9946 9947 assert(getContext().hasSameType(FirstField->getType(), 9948 SecondField->getType())); 9949 9950 QualType FirstType = FirstField->getType(); 9951 QualType SecondType = SecondField->getType(); 9952 if (ComputeQualTypeODRHash(FirstType) != 9953 ComputeQualTypeODRHash(SecondType)) { 9954 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), 9955 FieldTypeName) 9956 << FirstII << FirstType; 9957 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), 9958 FieldTypeName) 9959 << SecondII << SecondType; 9960 9961 Diagnosed = true; 9962 break; 9963 } 9964 9965 const bool IsFirstBitField = FirstField->isBitField(); 9966 const bool IsSecondBitField = SecondField->isBitField(); 9967 if (IsFirstBitField != IsSecondBitField) { 9968 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), 9969 FieldSingleBitField) 9970 << FirstII << IsFirstBitField; 9971 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), 9972 FieldSingleBitField) 9973 << SecondII << IsSecondBitField; 9974 Diagnosed = true; 9975 break; 9976 } 9977 9978 if (IsFirstBitField && IsSecondBitField) { 9979 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), 9980 FieldDifferentWidthBitField) 9981 << FirstII << FirstField->getBitWidth()->getSourceRange(); 9982 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), 9983 FieldDifferentWidthBitField) 9984 << SecondII << SecondField->getBitWidth()->getSourceRange(); 9985 Diagnosed = true; 9986 break; 9987 } 9988 9989 const bool IsFirstMutable = FirstField->isMutable(); 9990 const bool IsSecondMutable = SecondField->isMutable(); 9991 if (IsFirstMutable != IsSecondMutable) { 9992 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), 9993 FieldSingleMutable) 9994 << FirstII << IsFirstMutable; 9995 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), 9996 FieldSingleMutable) 9997 << SecondII << IsSecondMutable; 9998 Diagnosed = true; 9999 break; 10000 } 10001 10002 const Expr *FirstInitializer = FirstField->getInClassInitializer(); 10003 const Expr *SecondInitializer = SecondField->getInClassInitializer(); 10004 if ((!FirstInitializer && SecondInitializer) || 10005 (FirstInitializer && !SecondInitializer)) { 10006 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), 10007 FieldSingleInitializer) 10008 << FirstII << (FirstInitializer != nullptr); 10009 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), 10010 FieldSingleInitializer) 10011 << SecondII << (SecondInitializer != nullptr); 10012 Diagnosed = true; 10013 break; 10014 } 10015 10016 if (FirstInitializer && SecondInitializer) { 10017 unsigned FirstInitHash = ComputeODRHash(FirstInitializer); 10018 unsigned SecondInitHash = ComputeODRHash(SecondInitializer); 10019 if (FirstInitHash != SecondInitHash) { 10020 ODRDiagError(FirstField->getLocation(), 10021 FirstField->getSourceRange(), 10022 FieldDifferentInitializers) 10023 << FirstII << FirstInitializer->getSourceRange(); 10024 ODRDiagNote(SecondField->getLocation(), 10025 SecondField->getSourceRange(), 10026 FieldDifferentInitializers) 10027 << SecondII << SecondInitializer->getSourceRange(); 10028 Diagnosed = true; 10029 break; 10030 } 10031 } 10032 10033 break; 10034 } 10035 case CXXMethod: { 10036 enum { 10037 DiagMethod, 10038 DiagConstructor, 10039 DiagDestructor, 10040 } FirstMethodType, 10041 SecondMethodType; 10042 auto GetMethodTypeForDiagnostics = [](const CXXMethodDecl* D) { 10043 if (isa<CXXConstructorDecl>(D)) return DiagConstructor; 10044 if (isa<CXXDestructorDecl>(D)) return DiagDestructor; 10045 return DiagMethod; 10046 }; 10047 const CXXMethodDecl *FirstMethod = cast<CXXMethodDecl>(FirstDecl); 10048 const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl); 10049 FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod); 10050 SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod); 10051 auto FirstName = FirstMethod->getDeclName(); 10052 auto SecondName = SecondMethod->getDeclName(); 10053 if (FirstMethodType != SecondMethodType || FirstName != SecondName) { 10054 ODRDiagError(FirstMethod->getLocation(), 10055 FirstMethod->getSourceRange(), MethodName) 10056 << FirstMethodType << FirstName; 10057 ODRDiagNote(SecondMethod->getLocation(), 10058 SecondMethod->getSourceRange(), MethodName) 10059 << SecondMethodType << SecondName; 10060 10061 Diagnosed = true; 10062 break; 10063 } 10064 10065 const bool FirstDeleted = FirstMethod->isDeleted(); 10066 const bool SecondDeleted = SecondMethod->isDeleted(); 10067 if (FirstDeleted != SecondDeleted) { 10068 ODRDiagError(FirstMethod->getLocation(), 10069 FirstMethod->getSourceRange(), MethodDeleted) 10070 << FirstMethodType << FirstName << FirstDeleted; 10071 10072 ODRDiagNote(SecondMethod->getLocation(), 10073 SecondMethod->getSourceRange(), MethodDeleted) 10074 << SecondMethodType << SecondName << SecondDeleted; 10075 Diagnosed = true; 10076 break; 10077 } 10078 10079 const bool FirstVirtual = FirstMethod->isVirtualAsWritten(); 10080 const bool SecondVirtual = SecondMethod->isVirtualAsWritten(); 10081 const bool FirstPure = FirstMethod->isPure(); 10082 const bool SecondPure = SecondMethod->isPure(); 10083 if ((FirstVirtual || SecondVirtual) && 10084 (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) { 10085 ODRDiagError(FirstMethod->getLocation(), 10086 FirstMethod->getSourceRange(), MethodVirtual) 10087 << FirstMethodType << FirstName << FirstPure << FirstVirtual; 10088 ODRDiagNote(SecondMethod->getLocation(), 10089 SecondMethod->getSourceRange(), MethodVirtual) 10090 << SecondMethodType << SecondName << SecondPure << SecondVirtual; 10091 Diagnosed = true; 10092 break; 10093 } 10094 10095 // CXXMethodDecl::isStatic uses the canonical Decl. With Decl merging, 10096 // FirstDecl is the canonical Decl of SecondDecl, so the storage 10097 // class needs to be checked instead. 10098 const auto FirstStorage = FirstMethod->getStorageClass(); 10099 const auto SecondStorage = SecondMethod->getStorageClass(); 10100 const bool FirstStatic = FirstStorage == SC_Static; 10101 const bool SecondStatic = SecondStorage == SC_Static; 10102 if (FirstStatic != SecondStatic) { 10103 ODRDiagError(FirstMethod->getLocation(), 10104 FirstMethod->getSourceRange(), MethodStatic) 10105 << FirstMethodType << FirstName << FirstStatic; 10106 ODRDiagNote(SecondMethod->getLocation(), 10107 SecondMethod->getSourceRange(), MethodStatic) 10108 << SecondMethodType << SecondName << SecondStatic; 10109 Diagnosed = true; 10110 break; 10111 } 10112 10113 const bool FirstVolatile = FirstMethod->isVolatile(); 10114 const bool SecondVolatile = SecondMethod->isVolatile(); 10115 if (FirstVolatile != SecondVolatile) { 10116 ODRDiagError(FirstMethod->getLocation(), 10117 FirstMethod->getSourceRange(), MethodVolatile) 10118 << FirstMethodType << FirstName << FirstVolatile; 10119 ODRDiagNote(SecondMethod->getLocation(), 10120 SecondMethod->getSourceRange(), MethodVolatile) 10121 << SecondMethodType << SecondName << SecondVolatile; 10122 Diagnosed = true; 10123 break; 10124 } 10125 10126 const bool FirstConst = FirstMethod->isConst(); 10127 const bool SecondConst = SecondMethod->isConst(); 10128 if (FirstConst != SecondConst) { 10129 ODRDiagError(FirstMethod->getLocation(), 10130 FirstMethod->getSourceRange(), MethodConst) 10131 << FirstMethodType << FirstName << FirstConst; 10132 ODRDiagNote(SecondMethod->getLocation(), 10133 SecondMethod->getSourceRange(), MethodConst) 10134 << SecondMethodType << SecondName << SecondConst; 10135 Diagnosed = true; 10136 break; 10137 } 10138 10139 const bool FirstInline = FirstMethod->isInlineSpecified(); 10140 const bool SecondInline = SecondMethod->isInlineSpecified(); 10141 if (FirstInline != SecondInline) { 10142 ODRDiagError(FirstMethod->getLocation(), 10143 FirstMethod->getSourceRange(), MethodInline) 10144 << FirstMethodType << FirstName << FirstInline; 10145 ODRDiagNote(SecondMethod->getLocation(), 10146 SecondMethod->getSourceRange(), MethodInline) 10147 << SecondMethodType << SecondName << SecondInline; 10148 Diagnosed = true; 10149 break; 10150 } 10151 10152 const unsigned FirstNumParameters = FirstMethod->param_size(); 10153 const unsigned SecondNumParameters = SecondMethod->param_size(); 10154 if (FirstNumParameters != SecondNumParameters) { 10155 ODRDiagError(FirstMethod->getLocation(), 10156 FirstMethod->getSourceRange(), MethodNumberParameters) 10157 << FirstMethodType << FirstName << FirstNumParameters; 10158 ODRDiagNote(SecondMethod->getLocation(), 10159 SecondMethod->getSourceRange(), MethodNumberParameters) 10160 << SecondMethodType << SecondName << SecondNumParameters; 10161 Diagnosed = true; 10162 break; 10163 } 10164 10165 // Need this status boolean to know when break out of the switch. 10166 bool ParameterMismatch = false; 10167 for (unsigned I = 0; I < FirstNumParameters; ++I) { 10168 const ParmVarDecl *FirstParam = FirstMethod->getParamDecl(I); 10169 const ParmVarDecl *SecondParam = SecondMethod->getParamDecl(I); 10170 10171 QualType FirstParamType = FirstParam->getType(); 10172 QualType SecondParamType = SecondParam->getType(); 10173 if (FirstParamType != SecondParamType && 10174 ComputeQualTypeODRHash(FirstParamType) != 10175 ComputeQualTypeODRHash(SecondParamType)) { 10176 if (const DecayedType *ParamDecayedType = 10177 FirstParamType->getAs<DecayedType>()) { 10178 ODRDiagError(FirstMethod->getLocation(), 10179 FirstMethod->getSourceRange(), MethodParameterType) 10180 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10181 << true << ParamDecayedType->getOriginalType(); 10182 } else { 10183 ODRDiagError(FirstMethod->getLocation(), 10184 FirstMethod->getSourceRange(), MethodParameterType) 10185 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10186 << false; 10187 } 10188 10189 if (const DecayedType *ParamDecayedType = 10190 SecondParamType->getAs<DecayedType>()) { 10191 ODRDiagNote(SecondMethod->getLocation(), 10192 SecondMethod->getSourceRange(), MethodParameterType) 10193 << SecondMethodType << SecondName << (I + 1) 10194 << SecondParamType << true 10195 << ParamDecayedType->getOriginalType(); 10196 } else { 10197 ODRDiagNote(SecondMethod->getLocation(), 10198 SecondMethod->getSourceRange(), MethodParameterType) 10199 << SecondMethodType << SecondName << (I + 1) 10200 << SecondParamType << false; 10201 } 10202 ParameterMismatch = true; 10203 break; 10204 } 10205 10206 DeclarationName FirstParamName = FirstParam->getDeclName(); 10207 DeclarationName SecondParamName = SecondParam->getDeclName(); 10208 if (FirstParamName != SecondParamName) { 10209 ODRDiagError(FirstMethod->getLocation(), 10210 FirstMethod->getSourceRange(), MethodParameterName) 10211 << FirstMethodType << FirstName << (I + 1) << FirstParamName; 10212 ODRDiagNote(SecondMethod->getLocation(), 10213 SecondMethod->getSourceRange(), MethodParameterName) 10214 << SecondMethodType << SecondName << (I + 1) << SecondParamName; 10215 ParameterMismatch = true; 10216 break; 10217 } 10218 10219 const Expr *FirstInit = FirstParam->getInit(); 10220 const Expr *SecondInit = SecondParam->getInit(); 10221 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 10222 ODRDiagError(FirstMethod->getLocation(), 10223 FirstMethod->getSourceRange(), 10224 MethodParameterSingleDefaultArgument) 10225 << FirstMethodType << FirstName << (I + 1) 10226 << (FirstInit == nullptr) 10227 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 10228 ODRDiagNote(SecondMethod->getLocation(), 10229 SecondMethod->getSourceRange(), 10230 MethodParameterSingleDefaultArgument) 10231 << SecondMethodType << SecondName << (I + 1) 10232 << (SecondInit == nullptr) 10233 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 10234 ParameterMismatch = true; 10235 break; 10236 } 10237 10238 if (FirstInit && SecondInit && 10239 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 10240 ODRDiagError(FirstMethod->getLocation(), 10241 FirstMethod->getSourceRange(), 10242 MethodParameterDifferentDefaultArgument) 10243 << FirstMethodType << FirstName << (I + 1) 10244 << FirstInit->getSourceRange(); 10245 ODRDiagNote(SecondMethod->getLocation(), 10246 SecondMethod->getSourceRange(), 10247 MethodParameterDifferentDefaultArgument) 10248 << SecondMethodType << SecondName << (I + 1) 10249 << SecondInit->getSourceRange(); 10250 ParameterMismatch = true; 10251 break; 10252 10253 } 10254 } 10255 10256 if (ParameterMismatch) { 10257 Diagnosed = true; 10258 break; 10259 } 10260 10261 break; 10262 } 10263 case TypeAlias: 10264 case TypeDef: { 10265 TypedefNameDecl *FirstTD = cast<TypedefNameDecl>(FirstDecl); 10266 TypedefNameDecl *SecondTD = cast<TypedefNameDecl>(SecondDecl); 10267 auto FirstName = FirstTD->getDeclName(); 10268 auto SecondName = SecondTD->getDeclName(); 10269 if (FirstName != SecondName) { 10270 ODRDiagError(FirstTD->getLocation(), FirstTD->getSourceRange(), 10271 TypedefName) 10272 << (FirstDiffType == TypeAlias) << FirstName; 10273 ODRDiagNote(SecondTD->getLocation(), SecondTD->getSourceRange(), 10274 TypedefName) 10275 << (FirstDiffType == TypeAlias) << SecondName; 10276 Diagnosed = true; 10277 break; 10278 } 10279 10280 QualType FirstType = FirstTD->getUnderlyingType(); 10281 QualType SecondType = SecondTD->getUnderlyingType(); 10282 if (ComputeQualTypeODRHash(FirstType) != 10283 ComputeQualTypeODRHash(SecondType)) { 10284 ODRDiagError(FirstTD->getLocation(), FirstTD->getSourceRange(), 10285 TypedefType) 10286 << (FirstDiffType == TypeAlias) << FirstName << FirstType; 10287 ODRDiagNote(SecondTD->getLocation(), SecondTD->getSourceRange(), 10288 TypedefType) 10289 << (FirstDiffType == TypeAlias) << SecondName << SecondType; 10290 Diagnosed = true; 10291 break; 10292 } 10293 break; 10294 } 10295 case Var: { 10296 VarDecl *FirstVD = cast<VarDecl>(FirstDecl); 10297 VarDecl *SecondVD = cast<VarDecl>(SecondDecl); 10298 auto FirstName = FirstVD->getDeclName(); 10299 auto SecondName = SecondVD->getDeclName(); 10300 if (FirstName != SecondName) { 10301 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(), 10302 VarName) 10303 << FirstName; 10304 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(), 10305 VarName) 10306 << SecondName; 10307 Diagnosed = true; 10308 break; 10309 } 10310 10311 QualType FirstType = FirstVD->getType(); 10312 QualType SecondType = SecondVD->getType(); 10313 if (ComputeQualTypeODRHash(FirstType) != 10314 ComputeQualTypeODRHash(SecondType)) { 10315 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(), 10316 VarType) 10317 << FirstName << FirstType; 10318 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(), 10319 VarType) 10320 << SecondName << SecondType; 10321 Diagnosed = true; 10322 break; 10323 } 10324 10325 const Expr *FirstInit = FirstVD->getInit(); 10326 const Expr *SecondInit = SecondVD->getInit(); 10327 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 10328 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(), 10329 VarSingleInitializer) 10330 << FirstName << (FirstInit == nullptr) 10331 << (FirstInit ? FirstInit->getSourceRange(): SourceRange()); 10332 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(), 10333 VarSingleInitializer) 10334 << SecondName << (SecondInit == nullptr) 10335 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 10336 Diagnosed = true; 10337 break; 10338 } 10339 10340 if (FirstInit && SecondInit && 10341 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 10342 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(), 10343 VarDifferentInitializer) 10344 << FirstName << FirstInit->getSourceRange(); 10345 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(), 10346 VarDifferentInitializer) 10347 << SecondName << SecondInit->getSourceRange(); 10348 Diagnosed = true; 10349 break; 10350 } 10351 10352 const bool FirstIsConstexpr = FirstVD->isConstexpr(); 10353 const bool SecondIsConstexpr = SecondVD->isConstexpr(); 10354 if (FirstIsConstexpr != SecondIsConstexpr) { 10355 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(), 10356 VarConstexpr) 10357 << FirstName << FirstIsConstexpr; 10358 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(), 10359 VarConstexpr) 10360 << SecondName << SecondIsConstexpr; 10361 Diagnosed = true; 10362 break; 10363 } 10364 break; 10365 } 10366 case Friend: { 10367 FriendDecl *FirstFriend = cast<FriendDecl>(FirstDecl); 10368 FriendDecl *SecondFriend = cast<FriendDecl>(SecondDecl); 10369 10370 NamedDecl *FirstND = FirstFriend->getFriendDecl(); 10371 NamedDecl *SecondND = SecondFriend->getFriendDecl(); 10372 10373 TypeSourceInfo *FirstTSI = FirstFriend->getFriendType(); 10374 TypeSourceInfo *SecondTSI = SecondFriend->getFriendType(); 10375 10376 if (FirstND && SecondND) { 10377 ODRDiagError(FirstFriend->getFriendLoc(), 10378 FirstFriend->getSourceRange(), FriendFunction) 10379 << FirstND; 10380 ODRDiagNote(SecondFriend->getFriendLoc(), 10381 SecondFriend->getSourceRange(), FriendFunction) 10382 << SecondND; 10383 10384 Diagnosed = true; 10385 break; 10386 } 10387 10388 if (FirstTSI && SecondTSI) { 10389 QualType FirstFriendType = FirstTSI->getType(); 10390 QualType SecondFriendType = SecondTSI->getType(); 10391 assert(ComputeQualTypeODRHash(FirstFriendType) != 10392 ComputeQualTypeODRHash(SecondFriendType)); 10393 ODRDiagError(FirstFriend->getFriendLoc(), 10394 FirstFriend->getSourceRange(), FriendType) 10395 << FirstFriendType; 10396 ODRDiagNote(SecondFriend->getFriendLoc(), 10397 SecondFriend->getSourceRange(), FriendType) 10398 << SecondFriendType; 10399 Diagnosed = true; 10400 break; 10401 } 10402 10403 ODRDiagError(FirstFriend->getFriendLoc(), FirstFriend->getSourceRange(), 10404 FriendTypeFunction) 10405 << (FirstTSI == nullptr); 10406 ODRDiagNote(SecondFriend->getFriendLoc(), 10407 SecondFriend->getSourceRange(), FriendTypeFunction) 10408 << (SecondTSI == nullptr); 10409 10410 Diagnosed = true; 10411 break; 10412 } 10413 } 10414 10415 if (Diagnosed == true) 10416 continue; 10417 10418 Diag(FirstDecl->getLocation(), 10419 diag::err_module_odr_violation_mismatch_decl_unknown) 10420 << FirstRecord << FirstModule.empty() << FirstModule << FirstDiffType 10421 << FirstDecl->getSourceRange(); 10422 Diag(SecondDecl->getLocation(), 10423 diag::note_module_odr_violation_mismatch_decl_unknown) 10424 << SecondModule << FirstDiffType << SecondDecl->getSourceRange(); 10425 Diagnosed = true; 10426 } 10427 10428 if (!Diagnosed) { 10429 // All definitions are updates to the same declaration. This happens if a 10430 // module instantiates the declaration of a class template specialization 10431 // and two or more other modules instantiate its definition. 10432 // 10433 // FIXME: Indicate which modules had instantiations of this definition. 10434 // FIXME: How can this even happen? 10435 Diag(Merge.first->getLocation(), 10436 diag::err_module_odr_violation_different_instantiations) 10437 << Merge.first; 10438 } 10439 } 10440 } 10441 10442 void ASTReader::StartedDeserializing() { 10443 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get()) 10444 ReadTimer->startTimer(); 10445 } 10446 10447 void ASTReader::FinishedDeserializing() { 10448 assert(NumCurrentElementsDeserializing && 10449 "FinishedDeserializing not paired with StartedDeserializing"); 10450 if (NumCurrentElementsDeserializing == 1) { 10451 // We decrease NumCurrentElementsDeserializing only after pending actions 10452 // are finished, to avoid recursively re-calling finishPendingActions(). 10453 finishPendingActions(); 10454 } 10455 --NumCurrentElementsDeserializing; 10456 10457 if (NumCurrentElementsDeserializing == 0) { 10458 // Propagate exception specification updates along redeclaration chains. 10459 while (!PendingExceptionSpecUpdates.empty()) { 10460 auto Updates = std::move(PendingExceptionSpecUpdates); 10461 PendingExceptionSpecUpdates.clear(); 10462 for (auto Update : Updates) { 10463 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 10464 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>(); 10465 auto ESI = FPT->getExtProtoInfo().ExceptionSpec; 10466 if (auto *Listener = getContext().getASTMutationListener()) 10467 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second)); 10468 for (auto *Redecl : Update.second->redecls()) 10469 getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI); 10470 } 10471 } 10472 10473 if (ReadTimer) 10474 ReadTimer->stopTimer(); 10475 10476 diagnoseOdrViolations(); 10477 10478 // We are not in recursive loading, so it's safe to pass the "interesting" 10479 // decls to the consumer. 10480 if (Consumer) 10481 PassInterestingDeclsToConsumer(); 10482 } 10483 } 10484 10485 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 10486 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { 10487 // Remove any fake results before adding any real ones. 10488 auto It = PendingFakeLookupResults.find(II); 10489 if (It != PendingFakeLookupResults.end()) { 10490 for (auto *ND : It->second) 10491 SemaObj->IdResolver.RemoveDecl(ND); 10492 // FIXME: this works around module+PCH performance issue. 10493 // Rather than erase the result from the map, which is O(n), just clear 10494 // the vector of NamedDecls. 10495 It->second.clear(); 10496 } 10497 } 10498 10499 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 10500 SemaObj->TUScope->AddDecl(D); 10501 } else if (SemaObj->TUScope) { 10502 // Adding the decl to IdResolver may have failed because it was already in 10503 // (even though it was not added in scope). If it is already in, make sure 10504 // it gets in the scope as well. 10505 if (std::find(SemaObj->IdResolver.begin(Name), 10506 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 10507 SemaObj->TUScope->AddDecl(D); 10508 } 10509 } 10510 10511 ASTReader::ASTReader(Preprocessor &PP, ASTContext *Context, 10512 const PCHContainerReader &PCHContainerRdr, 10513 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions, 10514 StringRef isysroot, bool DisableValidation, 10515 bool AllowASTWithCompilerErrors, 10516 bool AllowConfigurationMismatch, bool ValidateSystemInputs, 10517 bool UseGlobalIndex, 10518 std::unique_ptr<llvm::Timer> ReadTimer) 10519 : Listener(DisableValidation 10520 ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP)) 10521 : cast<ASTReaderListener>(new PCHValidator(PP, *this))), 10522 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), 10523 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP), 10524 ContextObj(Context), 10525 ModuleMgr(PP.getFileManager(), PP.getPCMCache(), PCHContainerRdr, 10526 PP.getHeaderSearchInfo()), 10527 PCMCache(PP.getPCMCache()), DummyIdResolver(PP), 10528 ReadTimer(std::move(ReadTimer)), isysroot(isysroot), 10529 DisableValidation(DisableValidation), 10530 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 10531 AllowConfigurationMismatch(AllowConfigurationMismatch), 10532 ValidateSystemInputs(ValidateSystemInputs), 10533 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) { 10534 SourceMgr.setExternalSLocEntrySource(this); 10535 10536 for (const auto &Ext : Extensions) { 10537 auto BlockName = Ext->getExtensionMetadata().BlockName; 10538 auto Known = ModuleFileExtensions.find(BlockName); 10539 if (Known != ModuleFileExtensions.end()) { 10540 Diags.Report(diag::warn_duplicate_module_file_extension) 10541 << BlockName; 10542 continue; 10543 } 10544 10545 ModuleFileExtensions.insert({BlockName, Ext}); 10546 } 10547 } 10548 10549 ASTReader::~ASTReader() { 10550 if (OwnsDeserializationListener) 10551 delete DeserializationListener; 10552 } 10553 10554 IdentifierResolver &ASTReader::getIdResolver() { 10555 return SemaObj ? SemaObj->IdResolver : DummyIdResolver; 10556 } 10557 10558 unsigned ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor, 10559 unsigned AbbrevID) { 10560 Idx = 0; 10561 Record.clear(); 10562 return Cursor.readRecord(AbbrevID, Record); 10563 } 10564