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