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