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