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