1 //===- ASTReader.cpp - AST File Reader ------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines the ASTReader class, which reads AST files. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "clang/Basic/OpenMPKinds.h" 14 #include "clang/Serialization/ASTRecordReader.h" 15 #include "ASTCommon.h" 16 #include "ASTReaderInternals.h" 17 #include "clang/AST/AbstractTypeReader.h" 18 #include "clang/AST/ASTConsumer.h" 19 #include "clang/AST/ASTContext.h" 20 #include "clang/AST/ASTMutationListener.h" 21 #include "clang/AST/ASTUnresolvedSet.h" 22 #include "clang/AST/Decl.h" 23 #include "clang/AST/DeclBase.h" 24 #include "clang/AST/DeclCXX.h" 25 #include "clang/AST/DeclFriend.h" 26 #include "clang/AST/DeclGroup.h" 27 #include "clang/AST/DeclObjC.h" 28 #include "clang/AST/DeclTemplate.h" 29 #include "clang/AST/DeclarationName.h" 30 #include "clang/AST/Expr.h" 31 #include "clang/AST/ExprCXX.h" 32 #include "clang/AST/ExternalASTSource.h" 33 #include "clang/AST/NestedNameSpecifier.h" 34 #include "clang/AST/OpenMPClause.h" 35 #include "clang/AST/ODRHash.h" 36 #include "clang/AST/RawCommentList.h" 37 #include "clang/AST/TemplateBase.h" 38 #include "clang/AST/TemplateName.h" 39 #include "clang/AST/Type.h" 40 #include "clang/AST/TypeLoc.h" 41 #include "clang/AST/TypeLocVisitor.h" 42 #include "clang/AST/UnresolvedSet.h" 43 #include "clang/Basic/CommentOptions.h" 44 #include "clang/Basic/Diagnostic.h" 45 #include "clang/Basic/DiagnosticOptions.h" 46 #include "clang/Basic/ExceptionSpecificationType.h" 47 #include "clang/Basic/FileManager.h" 48 #include "clang/Basic/FileSystemOptions.h" 49 #include "clang/Basic/IdentifierTable.h" 50 #include "clang/Basic/LLVM.h" 51 #include "clang/Basic/LangOptions.h" 52 #include "clang/Basic/Module.h" 53 #include "clang/Basic/ObjCRuntime.h" 54 #include "clang/Basic/OperatorKinds.h" 55 #include "clang/Basic/PragmaKinds.h" 56 #include "clang/Basic/Sanitizers.h" 57 #include "clang/Basic/SourceLocation.h" 58 #include "clang/Basic/SourceManager.h" 59 #include "clang/Basic/SourceManagerInternals.h" 60 #include "clang/Basic/Specifiers.h" 61 #include "clang/Basic/TargetInfo.h" 62 #include "clang/Basic/TargetOptions.h" 63 #include "clang/Basic/TokenKinds.h" 64 #include "clang/Basic/Version.h" 65 #include "clang/Lex/HeaderSearch.h" 66 #include "clang/Lex/HeaderSearchOptions.h" 67 #include "clang/Lex/MacroInfo.h" 68 #include "clang/Lex/ModuleMap.h" 69 #include "clang/Lex/PreprocessingRecord.h" 70 #include "clang/Lex/Preprocessor.h" 71 #include "clang/Lex/PreprocessorOptions.h" 72 #include "clang/Lex/Token.h" 73 #include "clang/Sema/ObjCMethodList.h" 74 #include "clang/Sema/Scope.h" 75 #include "clang/Sema/Sema.h" 76 #include "clang/Sema/Weak.h" 77 #include "clang/Serialization/ASTBitCodes.h" 78 #include "clang/Serialization/ASTDeserializationListener.h" 79 #include "clang/Serialization/ContinuousRangeMap.h" 80 #include "clang/Serialization/GlobalModuleIndex.h" 81 #include "clang/Serialization/InMemoryModuleCache.h" 82 #include "clang/Serialization/ModuleFile.h" 83 #include "clang/Serialization/ModuleFileExtension.h" 84 #include "clang/Serialization/ModuleManager.h" 85 #include "clang/Serialization/PCHContainerOperations.h" 86 #include "clang/Serialization/SerializationDiagnostic.h" 87 #include "llvm/ADT/APFloat.h" 88 #include "llvm/ADT/APInt.h" 89 #include "llvm/ADT/APSInt.h" 90 #include "llvm/ADT/ArrayRef.h" 91 #include "llvm/ADT/DenseMap.h" 92 #include "llvm/ADT/FoldingSet.h" 93 #include "llvm/ADT/Hashing.h" 94 #include "llvm/ADT/IntrusiveRefCntPtr.h" 95 #include "llvm/ADT/None.h" 96 #include "llvm/ADT/Optional.h" 97 #include "llvm/ADT/STLExtras.h" 98 #include "llvm/ADT/ScopeExit.h" 99 #include "llvm/ADT/SmallPtrSet.h" 100 #include "llvm/ADT/SmallString.h" 101 #include "llvm/ADT/SmallVector.h" 102 #include "llvm/ADT/StringExtras.h" 103 #include "llvm/ADT/StringMap.h" 104 #include "llvm/ADT/StringRef.h" 105 #include "llvm/ADT/Triple.h" 106 #include "llvm/ADT/iterator_range.h" 107 #include "llvm/Bitstream/BitstreamReader.h" 108 #include "llvm/Support/Casting.h" 109 #include "llvm/Support/Compiler.h" 110 #include "llvm/Support/Compression.h" 111 #include "llvm/Support/DJB.h" 112 #include "llvm/Support/Endian.h" 113 #include "llvm/Support/Error.h" 114 #include "llvm/Support/ErrorHandling.h" 115 #include "llvm/Support/FileSystem.h" 116 #include "llvm/Support/MemoryBuffer.h" 117 #include "llvm/Support/Path.h" 118 #include "llvm/Support/SaveAndRestore.h" 119 #include "llvm/Support/Timer.h" 120 #include "llvm/Support/VersionTuple.h" 121 #include "llvm/Support/raw_ostream.h" 122 #include <algorithm> 123 #include <cassert> 124 #include <cstddef> 125 #include <cstdint> 126 #include <cstdio> 127 #include <ctime> 128 #include <iterator> 129 #include <limits> 130 #include <map> 131 #include <memory> 132 #include <string> 133 #include <system_error> 134 #include <tuple> 135 #include <utility> 136 #include <vector> 137 138 using namespace clang; 139 using namespace clang::serialization; 140 using namespace clang::serialization::reader; 141 using llvm::BitstreamCursor; 142 143 //===----------------------------------------------------------------------===// 144 // ChainedASTReaderListener implementation 145 //===----------------------------------------------------------------------===// 146 147 bool 148 ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) { 149 return First->ReadFullVersionInformation(FullVersion) || 150 Second->ReadFullVersionInformation(FullVersion); 151 } 152 153 void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) { 154 First->ReadModuleName(ModuleName); 155 Second->ReadModuleName(ModuleName); 156 } 157 158 void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) { 159 First->ReadModuleMapFile(ModuleMapPath); 160 Second->ReadModuleMapFile(ModuleMapPath); 161 } 162 163 bool 164 ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts, 165 bool Complain, 166 bool AllowCompatibleDifferences) { 167 return First->ReadLanguageOptions(LangOpts, Complain, 168 AllowCompatibleDifferences) || 169 Second->ReadLanguageOptions(LangOpts, Complain, 170 AllowCompatibleDifferences); 171 } 172 173 bool ChainedASTReaderListener::ReadTargetOptions( 174 const TargetOptions &TargetOpts, bool Complain, 175 bool AllowCompatibleDifferences) { 176 return First->ReadTargetOptions(TargetOpts, Complain, 177 AllowCompatibleDifferences) || 178 Second->ReadTargetOptions(TargetOpts, Complain, 179 AllowCompatibleDifferences); 180 } 181 182 bool ChainedASTReaderListener::ReadDiagnosticOptions( 183 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 184 return First->ReadDiagnosticOptions(DiagOpts, Complain) || 185 Second->ReadDiagnosticOptions(DiagOpts, Complain); 186 } 187 188 bool 189 ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts, 190 bool Complain) { 191 return First->ReadFileSystemOptions(FSOpts, Complain) || 192 Second->ReadFileSystemOptions(FSOpts, Complain); 193 } 194 195 bool ChainedASTReaderListener::ReadHeaderSearchOptions( 196 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath, 197 bool Complain) { 198 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 199 Complain) || 200 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 201 Complain); 202 } 203 204 bool ChainedASTReaderListener::ReadPreprocessorOptions( 205 const PreprocessorOptions &PPOpts, bool Complain, 206 std::string &SuggestedPredefines) { 207 return First->ReadPreprocessorOptions(PPOpts, Complain, 208 SuggestedPredefines) || 209 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines); 210 } 211 212 void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M, 213 unsigned Value) { 214 First->ReadCounter(M, Value); 215 Second->ReadCounter(M, Value); 216 } 217 218 bool ChainedASTReaderListener::needsInputFileVisitation() { 219 return First->needsInputFileVisitation() || 220 Second->needsInputFileVisitation(); 221 } 222 223 bool ChainedASTReaderListener::needsSystemInputFileVisitation() { 224 return First->needsSystemInputFileVisitation() || 225 Second->needsSystemInputFileVisitation(); 226 } 227 228 void ChainedASTReaderListener::visitModuleFile(StringRef Filename, 229 ModuleKind Kind) { 230 First->visitModuleFile(Filename, Kind); 231 Second->visitModuleFile(Filename, Kind); 232 } 233 234 bool ChainedASTReaderListener::visitInputFile(StringRef Filename, 235 bool isSystem, 236 bool isOverridden, 237 bool isExplicitModule) { 238 bool Continue = false; 239 if (First->needsInputFileVisitation() && 240 (!isSystem || First->needsSystemInputFileVisitation())) 241 Continue |= First->visitInputFile(Filename, isSystem, isOverridden, 242 isExplicitModule); 243 if (Second->needsInputFileVisitation() && 244 (!isSystem || Second->needsSystemInputFileVisitation())) 245 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden, 246 isExplicitModule); 247 return Continue; 248 } 249 250 void ChainedASTReaderListener::readModuleFileExtension( 251 const ModuleFileExtensionMetadata &Metadata) { 252 First->readModuleFileExtension(Metadata); 253 Second->readModuleFileExtension(Metadata); 254 } 255 256 //===----------------------------------------------------------------------===// 257 // PCH validator implementation 258 //===----------------------------------------------------------------------===// 259 260 ASTReaderListener::~ASTReaderListener() = default; 261 262 /// Compare the given set of language options against an existing set of 263 /// language options. 264 /// 265 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 266 /// \param AllowCompatibleDifferences If true, differences between compatible 267 /// language options will be permitted. 268 /// 269 /// \returns true if the languagae options mis-match, false otherwise. 270 static bool checkLanguageOptions(const LangOptions &LangOpts, 271 const LangOptions &ExistingLangOpts, 272 DiagnosticsEngine *Diags, 273 bool AllowCompatibleDifferences = true) { 274 #define LANGOPT(Name, Bits, Default, Description) \ 275 if (ExistingLangOpts.Name != LangOpts.Name) { \ 276 if (Diags) \ 277 Diags->Report(diag::err_pch_langopt_mismatch) \ 278 << Description << LangOpts.Name << ExistingLangOpts.Name; \ 279 return true; \ 280 } 281 282 #define VALUE_LANGOPT(Name, Bits, Default, Description) \ 283 if (ExistingLangOpts.Name != LangOpts.Name) { \ 284 if (Diags) \ 285 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 286 << Description; \ 287 return true; \ 288 } 289 290 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 291 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ 292 if (Diags) \ 293 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 294 << Description; \ 295 return true; \ 296 } 297 298 #define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \ 299 if (!AllowCompatibleDifferences) \ 300 LANGOPT(Name, Bits, Default, Description) 301 302 #define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \ 303 if (!AllowCompatibleDifferences) \ 304 ENUM_LANGOPT(Name, Bits, Default, Description) 305 306 #define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \ 307 if (!AllowCompatibleDifferences) \ 308 VALUE_LANGOPT(Name, Bits, Default, Description) 309 310 #define BENIGN_LANGOPT(Name, Bits, Default, Description) 311 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) 312 #define BENIGN_VALUE_LANGOPT(Name, Type, Bits, Default, Description) 313 #include "clang/Basic/LangOptions.def" 314 315 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) { 316 if (Diags) 317 Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features"; 318 return true; 319 } 320 321 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) { 322 if (Diags) 323 Diags->Report(diag::err_pch_langopt_value_mismatch) 324 << "target Objective-C runtime"; 325 return true; 326 } 327 328 if (ExistingLangOpts.CommentOpts.BlockCommandNames != 329 LangOpts.CommentOpts.BlockCommandNames) { 330 if (Diags) 331 Diags->Report(diag::err_pch_langopt_value_mismatch) 332 << "block command names"; 333 return true; 334 } 335 336 // Sanitizer feature mismatches are treated as compatible differences. If 337 // compatible differences aren't allowed, we still only want to check for 338 // mismatches of non-modular sanitizers (the only ones which can affect AST 339 // generation). 340 if (!AllowCompatibleDifferences) { 341 SanitizerMask ModularSanitizers = getPPTransparentSanitizers(); 342 SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize; 343 SanitizerSet ImportedSanitizers = LangOpts.Sanitize; 344 ExistingSanitizers.clear(ModularSanitizers); 345 ImportedSanitizers.clear(ModularSanitizers); 346 if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) { 347 const std::string Flag = "-fsanitize="; 348 if (Diags) { 349 #define SANITIZER(NAME, ID) \ 350 { \ 351 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \ 352 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \ 353 if (InExistingModule != InImportedModule) \ 354 Diags->Report(diag::err_pch_targetopt_feature_mismatch) \ 355 << InExistingModule << (Flag + NAME); \ 356 } 357 #include "clang/Basic/Sanitizers.def" 358 } 359 return true; 360 } 361 } 362 363 return false; 364 } 365 366 /// Compare the given set of target options against an existing set of 367 /// target options. 368 /// 369 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 370 /// 371 /// \returns true if the target options mis-match, false otherwise. 372 static bool checkTargetOptions(const TargetOptions &TargetOpts, 373 const TargetOptions &ExistingTargetOpts, 374 DiagnosticsEngine *Diags, 375 bool AllowCompatibleDifferences = true) { 376 #define CHECK_TARGET_OPT(Field, Name) \ 377 if (TargetOpts.Field != ExistingTargetOpts.Field) { \ 378 if (Diags) \ 379 Diags->Report(diag::err_pch_targetopt_mismatch) \ 380 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \ 381 return true; \ 382 } 383 384 // The triple and ABI must match exactly. 385 CHECK_TARGET_OPT(Triple, "target"); 386 CHECK_TARGET_OPT(ABI, "target ABI"); 387 388 // We can tolerate different CPUs in many cases, notably when one CPU 389 // supports a strict superset of another. When allowing compatible 390 // differences skip this check. 391 if (!AllowCompatibleDifferences) 392 CHECK_TARGET_OPT(CPU, "target CPU"); 393 394 #undef CHECK_TARGET_OPT 395 396 // Compare feature sets. 397 SmallVector<StringRef, 4> ExistingFeatures( 398 ExistingTargetOpts.FeaturesAsWritten.begin(), 399 ExistingTargetOpts.FeaturesAsWritten.end()); 400 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(), 401 TargetOpts.FeaturesAsWritten.end()); 402 llvm::sort(ExistingFeatures); 403 llvm::sort(ReadFeatures); 404 405 // We compute the set difference in both directions explicitly so that we can 406 // diagnose the differences differently. 407 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures; 408 std::set_difference( 409 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(), 410 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures)); 411 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(), 412 ExistingFeatures.begin(), ExistingFeatures.end(), 413 std::back_inserter(UnmatchedReadFeatures)); 414 415 // If we are allowing compatible differences and the read feature set is 416 // a strict subset of the existing feature set, there is nothing to diagnose. 417 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty()) 418 return false; 419 420 if (Diags) { 421 for (StringRef Feature : UnmatchedReadFeatures) 422 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 423 << /* is-existing-feature */ false << Feature; 424 for (StringRef Feature : UnmatchedExistingFeatures) 425 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 426 << /* is-existing-feature */ true << Feature; 427 } 428 429 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty(); 430 } 431 432 bool 433 PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts, 434 bool Complain, 435 bool AllowCompatibleDifferences) { 436 const LangOptions &ExistingLangOpts = PP.getLangOpts(); 437 return checkLanguageOptions(LangOpts, ExistingLangOpts, 438 Complain ? &Reader.Diags : nullptr, 439 AllowCompatibleDifferences); 440 } 441 442 bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts, 443 bool Complain, 444 bool AllowCompatibleDifferences) { 445 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts(); 446 return checkTargetOptions(TargetOpts, ExistingTargetOpts, 447 Complain ? &Reader.Diags : nullptr, 448 AllowCompatibleDifferences); 449 } 450 451 namespace { 452 453 using MacroDefinitionsMap = 454 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>; 455 using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>; 456 457 } // namespace 458 459 static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, 460 DiagnosticsEngine &Diags, 461 bool Complain) { 462 using Level = DiagnosticsEngine::Level; 463 464 // Check current mappings for new -Werror mappings, and the stored mappings 465 // for cases that were explicitly mapped to *not* be errors that are now 466 // errors because of options like -Werror. 467 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags }; 468 469 for (DiagnosticsEngine *MappingSource : MappingSources) { 470 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) { 471 diag::kind DiagID = DiagIDMappingPair.first; 472 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation()); 473 if (CurLevel < DiagnosticsEngine::Error) 474 continue; // not significant 475 Level StoredLevel = 476 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation()); 477 if (StoredLevel < DiagnosticsEngine::Error) { 478 if (Complain) 479 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" + 480 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str(); 481 return true; 482 } 483 } 484 } 485 486 return false; 487 } 488 489 static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) { 490 diag::Severity Ext = Diags.getExtensionHandlingBehavior(); 491 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors()) 492 return true; 493 return Ext >= diag::Severity::Error; 494 } 495 496 static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, 497 DiagnosticsEngine &Diags, 498 bool IsSystem, bool Complain) { 499 // Top-level options 500 if (IsSystem) { 501 if (Diags.getSuppressSystemWarnings()) 502 return false; 503 // If -Wsystem-headers was not enabled before, be conservative 504 if (StoredDiags.getSuppressSystemWarnings()) { 505 if (Complain) 506 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers"; 507 return true; 508 } 509 } 510 511 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) { 512 if (Complain) 513 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror"; 514 return true; 515 } 516 517 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() && 518 !StoredDiags.getEnableAllWarnings()) { 519 if (Complain) 520 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror"; 521 return true; 522 } 523 524 if (isExtHandlingFromDiagsError(Diags) && 525 !isExtHandlingFromDiagsError(StoredDiags)) { 526 if (Complain) 527 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors"; 528 return true; 529 } 530 531 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain); 532 } 533 534 /// Return the top import module if it is implicit, nullptr otherwise. 535 static Module *getTopImportImplicitModule(ModuleManager &ModuleMgr, 536 Preprocessor &PP) { 537 // If the original import came from a file explicitly generated by the user, 538 // don't check the diagnostic mappings. 539 // FIXME: currently this is approximated by checking whether this is not a 540 // module import of an implicitly-loaded module file. 541 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in 542 // the transitive closure of its imports, since unrelated modules cannot be 543 // imported until after this module finishes validation. 544 ModuleFile *TopImport = &*ModuleMgr.rbegin(); 545 while (!TopImport->ImportedBy.empty()) 546 TopImport = TopImport->ImportedBy[0]; 547 if (TopImport->Kind != MK_ImplicitModule) 548 return nullptr; 549 550 StringRef ModuleName = TopImport->ModuleName; 551 assert(!ModuleName.empty() && "diagnostic options read before module name"); 552 553 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName); 554 assert(M && "missing module"); 555 return M; 556 } 557 558 bool PCHValidator::ReadDiagnosticOptions( 559 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 560 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics(); 561 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs()); 562 IntrusiveRefCntPtr<DiagnosticsEngine> Diags( 563 new DiagnosticsEngine(DiagIDs, DiagOpts.get())); 564 // This should never fail, because we would have processed these options 565 // before writing them to an ASTFile. 566 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false); 567 568 ModuleManager &ModuleMgr = Reader.getModuleManager(); 569 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then"); 570 571 Module *TopM = getTopImportImplicitModule(ModuleMgr, PP); 572 if (!TopM) 573 return false; 574 575 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that 576 // contains the union of their flags. 577 return checkDiagnosticMappings(*Diags, ExistingDiags, TopM->IsSystem, 578 Complain); 579 } 580 581 /// Collect the macro definitions provided by the given preprocessor 582 /// options. 583 static void 584 collectMacroDefinitions(const PreprocessorOptions &PPOpts, 585 MacroDefinitionsMap &Macros, 586 SmallVectorImpl<StringRef> *MacroNames = nullptr) { 587 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) { 588 StringRef Macro = PPOpts.Macros[I].first; 589 bool IsUndef = PPOpts.Macros[I].second; 590 591 std::pair<StringRef, StringRef> MacroPair = Macro.split('='); 592 StringRef MacroName = MacroPair.first; 593 StringRef MacroBody = MacroPair.second; 594 595 // For an #undef'd macro, we only care about the name. 596 if (IsUndef) { 597 if (MacroNames && !Macros.count(MacroName)) 598 MacroNames->push_back(MacroName); 599 600 Macros[MacroName] = std::make_pair("", true); 601 continue; 602 } 603 604 // For a #define'd macro, figure out the actual definition. 605 if (MacroName.size() == Macro.size()) 606 MacroBody = "1"; 607 else { 608 // Note: GCC drops anything following an end-of-line character. 609 StringRef::size_type End = MacroBody.find_first_of("\n\r"); 610 MacroBody = MacroBody.substr(0, End); 611 } 612 613 if (MacroNames && !Macros.count(MacroName)) 614 MacroNames->push_back(MacroName); 615 Macros[MacroName] = std::make_pair(MacroBody, false); 616 } 617 } 618 619 /// Check the preprocessor options deserialized from the control block 620 /// against the preprocessor options in an existing preprocessor. 621 /// 622 /// \param Diags If non-null, produce diagnostics for any mismatches incurred. 623 /// \param Validate If true, validate preprocessor options. If false, allow 624 /// macros defined by \p ExistingPPOpts to override those defined by 625 /// \p PPOpts in SuggestedPredefines. 626 static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, 627 const PreprocessorOptions &ExistingPPOpts, 628 DiagnosticsEngine *Diags, 629 FileManager &FileMgr, 630 std::string &SuggestedPredefines, 631 const LangOptions &LangOpts, 632 bool Validate = true) { 633 // Check macro definitions. 634 MacroDefinitionsMap ASTFileMacros; 635 collectMacroDefinitions(PPOpts, ASTFileMacros); 636 MacroDefinitionsMap ExistingMacros; 637 SmallVector<StringRef, 4> ExistingMacroNames; 638 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames); 639 640 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) { 641 // Dig out the macro definition in the existing preprocessor options. 642 StringRef MacroName = ExistingMacroNames[I]; 643 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName]; 644 645 // Check whether we know anything about this macro name or not. 646 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known = 647 ASTFileMacros.find(MacroName); 648 if (!Validate || Known == ASTFileMacros.end()) { 649 // FIXME: Check whether this identifier was referenced anywhere in the 650 // AST file. If so, we should reject the AST file. Unfortunately, this 651 // information isn't in the control block. What shall we do about it? 652 653 if (Existing.second) { 654 SuggestedPredefines += "#undef "; 655 SuggestedPredefines += MacroName.str(); 656 SuggestedPredefines += '\n'; 657 } else { 658 SuggestedPredefines += "#define "; 659 SuggestedPredefines += MacroName.str(); 660 SuggestedPredefines += ' '; 661 SuggestedPredefines += Existing.first.str(); 662 SuggestedPredefines += '\n'; 663 } 664 continue; 665 } 666 667 // If the macro was defined in one but undef'd in the other, we have a 668 // conflict. 669 if (Existing.second != Known->second.second) { 670 if (Diags) { 671 Diags->Report(diag::err_pch_macro_def_undef) 672 << MacroName << Known->second.second; 673 } 674 return true; 675 } 676 677 // If the macro was #undef'd in both, or if the macro bodies are identical, 678 // it's fine. 679 if (Existing.second || Existing.first == Known->second.first) 680 continue; 681 682 // The macro bodies differ; complain. 683 if (Diags) { 684 Diags->Report(diag::err_pch_macro_def_conflict) 685 << MacroName << Known->second.first << Existing.first; 686 } 687 return true; 688 } 689 690 // Check whether we're using predefines. 691 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines && Validate) { 692 if (Diags) { 693 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines; 694 } 695 return true; 696 } 697 698 // Detailed record is important since it is used for the module cache hash. 699 if (LangOpts.Modules && 700 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord && Validate) { 701 if (Diags) { 702 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord; 703 } 704 return true; 705 } 706 707 // Compute the #include and #include_macros lines we need. 708 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) { 709 StringRef File = ExistingPPOpts.Includes[I]; 710 711 if (!ExistingPPOpts.ImplicitPCHInclude.empty() && 712 !ExistingPPOpts.PCHThroughHeader.empty()) { 713 // In case the through header is an include, we must add all the includes 714 // to the predefines so the start point can be determined. 715 SuggestedPredefines += "#include \""; 716 SuggestedPredefines += File; 717 SuggestedPredefines += "\"\n"; 718 continue; 719 } 720 721 if (File == ExistingPPOpts.ImplicitPCHInclude) 722 continue; 723 724 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File) 725 != PPOpts.Includes.end()) 726 continue; 727 728 SuggestedPredefines += "#include \""; 729 SuggestedPredefines += File; 730 SuggestedPredefines += "\"\n"; 731 } 732 733 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) { 734 StringRef File = ExistingPPOpts.MacroIncludes[I]; 735 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(), 736 File) 737 != PPOpts.MacroIncludes.end()) 738 continue; 739 740 SuggestedPredefines += "#__include_macros \""; 741 SuggestedPredefines += File; 742 SuggestedPredefines += "\"\n##\n"; 743 } 744 745 return false; 746 } 747 748 bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 749 bool Complain, 750 std::string &SuggestedPredefines) { 751 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts(); 752 753 return checkPreprocessorOptions(PPOpts, ExistingPPOpts, 754 Complain? &Reader.Diags : nullptr, 755 PP.getFileManager(), 756 SuggestedPredefines, 757 PP.getLangOpts()); 758 } 759 760 bool SimpleASTReaderListener::ReadPreprocessorOptions( 761 const PreprocessorOptions &PPOpts, 762 bool Complain, 763 std::string &SuggestedPredefines) { 764 return checkPreprocessorOptions(PPOpts, 765 PP.getPreprocessorOpts(), 766 nullptr, 767 PP.getFileManager(), 768 SuggestedPredefines, 769 PP.getLangOpts(), 770 false); 771 } 772 773 /// Check the header search options deserialized from the control block 774 /// against the header search options in an existing preprocessor. 775 /// 776 /// \param Diags If non-null, produce diagnostics for any mismatches incurred. 777 static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 778 StringRef SpecificModuleCachePath, 779 StringRef ExistingModuleCachePath, 780 DiagnosticsEngine *Diags, 781 const LangOptions &LangOpts) { 782 if (LangOpts.Modules) { 783 if (SpecificModuleCachePath != ExistingModuleCachePath) { 784 if (Diags) 785 Diags->Report(diag::err_pch_modulecache_mismatch) 786 << SpecificModuleCachePath << ExistingModuleCachePath; 787 return true; 788 } 789 } 790 791 return false; 792 } 793 794 bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 795 StringRef SpecificModuleCachePath, 796 bool Complain) { 797 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 798 PP.getHeaderSearchInfo().getModuleCachePath(), 799 Complain ? &Reader.Diags : nullptr, 800 PP.getLangOpts()); 801 } 802 803 void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) { 804 PP.setCounterValue(Value); 805 } 806 807 //===----------------------------------------------------------------------===// 808 // AST reader implementation 809 //===----------------------------------------------------------------------===// 810 811 void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener, 812 bool TakeOwnership) { 813 DeserializationListener = Listener; 814 OwnsDeserializationListener = TakeOwnership; 815 } 816 817 unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) { 818 return serialization::ComputeHash(Sel); 819 } 820 821 std::pair<unsigned, unsigned> 822 ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) { 823 using namespace llvm::support; 824 825 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d); 826 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d); 827 return std::make_pair(KeyLen, DataLen); 828 } 829 830 ASTSelectorLookupTrait::internal_key_type 831 ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) { 832 using namespace llvm::support; 833 834 SelectorTable &SelTable = Reader.getContext().Selectors; 835 unsigned N = endian::readNext<uint16_t, little, unaligned>(d); 836 IdentifierInfo *FirstII = Reader.getLocalIdentifier( 837 F, endian::readNext<uint32_t, little, unaligned>(d)); 838 if (N == 0) 839 return SelTable.getNullarySelector(FirstII); 840 else if (N == 1) 841 return SelTable.getUnarySelector(FirstII); 842 843 SmallVector<IdentifierInfo *, 16> Args; 844 Args.push_back(FirstII); 845 for (unsigned I = 1; I != N; ++I) 846 Args.push_back(Reader.getLocalIdentifier( 847 F, endian::readNext<uint32_t, little, unaligned>(d))); 848 849 return SelTable.getSelector(N, Args.data()); 850 } 851 852 ASTSelectorLookupTrait::data_type 853 ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d, 854 unsigned DataLen) { 855 using namespace llvm::support; 856 857 data_type Result; 858 859 Result.ID = Reader.getGlobalSelectorID( 860 F, endian::readNext<uint32_t, little, unaligned>(d)); 861 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d); 862 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d); 863 Result.InstanceBits = FullInstanceBits & 0x3; 864 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1; 865 Result.FactoryBits = FullFactoryBits & 0x3; 866 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1; 867 unsigned NumInstanceMethods = FullInstanceBits >> 3; 868 unsigned NumFactoryMethods = FullFactoryBits >> 3; 869 870 // Load instance methods 871 for (unsigned I = 0; I != NumInstanceMethods; ++I) { 872 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 873 F, endian::readNext<uint32_t, little, unaligned>(d))) 874 Result.Instance.push_back(Method); 875 } 876 877 // Load factory methods 878 for (unsigned I = 0; I != NumFactoryMethods; ++I) { 879 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 880 F, endian::readNext<uint32_t, little, unaligned>(d))) 881 Result.Factory.push_back(Method); 882 } 883 884 return Result; 885 } 886 887 unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) { 888 return llvm::djbHash(a); 889 } 890 891 std::pair<unsigned, unsigned> 892 ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) { 893 using namespace llvm::support; 894 895 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d); 896 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d); 897 return std::make_pair(KeyLen, DataLen); 898 } 899 900 ASTIdentifierLookupTraitBase::internal_key_type 901 ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) { 902 assert(n >= 2 && d[n-1] == '\0'); 903 return StringRef((const char*) d, n-1); 904 } 905 906 /// Whether the given identifier is "interesting". 907 static bool isInterestingIdentifier(ASTReader &Reader, IdentifierInfo &II, 908 bool IsModule) { 909 return II.hadMacroDefinition() || 910 II.isPoisoned() || 911 (IsModule ? II.hasRevertedBuiltin() : II.getObjCOrBuiltinID()) || 912 II.hasRevertedTokenIDToIdentifier() || 913 (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) && 914 II.getFETokenInfo()); 915 } 916 917 static bool readBit(unsigned &Bits) { 918 bool Value = Bits & 0x1; 919 Bits >>= 1; 920 return Value; 921 } 922 923 IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) { 924 using namespace llvm::support; 925 926 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 927 return Reader.getGlobalIdentifierID(F, RawID >> 1); 928 } 929 930 static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II) { 931 if (!II.isFromAST()) { 932 II.setIsFromAST(); 933 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr; 934 if (isInterestingIdentifier(Reader, II, IsModule)) 935 II.setChangedSinceDeserialization(); 936 } 937 } 938 939 IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, 940 const unsigned char* d, 941 unsigned DataLen) { 942 using namespace llvm::support; 943 944 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 945 bool IsInteresting = RawID & 0x01; 946 947 // Wipe out the "is interesting" bit. 948 RawID = RawID >> 1; 949 950 // Build the IdentifierInfo and link the identifier ID with it. 951 IdentifierInfo *II = KnownII; 952 if (!II) { 953 II = &Reader.getIdentifierTable().getOwn(k); 954 KnownII = II; 955 } 956 markIdentifierFromAST(Reader, *II); 957 Reader.markIdentifierUpToDate(II); 958 959 IdentID ID = Reader.getGlobalIdentifierID(F, RawID); 960 if (!IsInteresting) { 961 // For uninteresting identifiers, there's nothing else to do. Just notify 962 // the reader that we've finished loading this identifier. 963 Reader.SetIdentifierInfo(ID, II); 964 return II; 965 } 966 967 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d); 968 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d); 969 bool CPlusPlusOperatorKeyword = readBit(Bits); 970 bool HasRevertedTokenIDToIdentifier = readBit(Bits); 971 bool HasRevertedBuiltin = readBit(Bits); 972 bool Poisoned = readBit(Bits); 973 bool ExtensionToken = readBit(Bits); 974 bool HadMacroDefinition = readBit(Bits); 975 976 assert(Bits == 0 && "Extra bits in the identifier?"); 977 DataLen -= 8; 978 979 // Set or check the various bits in the IdentifierInfo structure. 980 // Token IDs are read-only. 981 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier) 982 II->revertTokenIDToIdentifier(); 983 if (!F.isModule()) 984 II->setObjCOrBuiltinID(ObjCOrBuiltinID); 985 else if (HasRevertedBuiltin && II->getBuiltinID()) { 986 II->revertBuiltin(); 987 assert((II->hasRevertedBuiltin() || 988 II->getObjCOrBuiltinID() == ObjCOrBuiltinID) && 989 "Incorrect ObjC keyword or builtin ID"); 990 } 991 assert(II->isExtensionToken() == ExtensionToken && 992 "Incorrect extension token flag"); 993 (void)ExtensionToken; 994 if (Poisoned) 995 II->setIsPoisoned(true); 996 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword && 997 "Incorrect C++ operator keyword flag"); 998 (void)CPlusPlusOperatorKeyword; 999 1000 // If this identifier is a macro, deserialize the macro 1001 // definition. 1002 if (HadMacroDefinition) { 1003 uint32_t MacroDirectivesOffset = 1004 endian::readNext<uint32_t, little, unaligned>(d); 1005 DataLen -= 4; 1006 1007 Reader.addPendingMacro(II, &F, MacroDirectivesOffset); 1008 } 1009 1010 Reader.SetIdentifierInfo(ID, II); 1011 1012 // Read all of the declarations visible at global scope with this 1013 // name. 1014 if (DataLen > 0) { 1015 SmallVector<uint32_t, 4> DeclIDs; 1016 for (; DataLen > 0; DataLen -= 4) 1017 DeclIDs.push_back(Reader.getGlobalDeclID( 1018 F, endian::readNext<uint32_t, little, unaligned>(d))); 1019 Reader.SetGloballyVisibleDecls(II, DeclIDs); 1020 } 1021 1022 return II; 1023 } 1024 1025 DeclarationNameKey::DeclarationNameKey(DeclarationName Name) 1026 : Kind(Name.getNameKind()) { 1027 switch (Kind) { 1028 case DeclarationName::Identifier: 1029 Data = (uint64_t)Name.getAsIdentifierInfo(); 1030 break; 1031 case DeclarationName::ObjCZeroArgSelector: 1032 case DeclarationName::ObjCOneArgSelector: 1033 case DeclarationName::ObjCMultiArgSelector: 1034 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr(); 1035 break; 1036 case DeclarationName::CXXOperatorName: 1037 Data = Name.getCXXOverloadedOperator(); 1038 break; 1039 case DeclarationName::CXXLiteralOperatorName: 1040 Data = (uint64_t)Name.getCXXLiteralIdentifier(); 1041 break; 1042 case DeclarationName::CXXDeductionGuideName: 1043 Data = (uint64_t)Name.getCXXDeductionGuideTemplate() 1044 ->getDeclName().getAsIdentifierInfo(); 1045 break; 1046 case DeclarationName::CXXConstructorName: 1047 case DeclarationName::CXXDestructorName: 1048 case DeclarationName::CXXConversionFunctionName: 1049 case DeclarationName::CXXUsingDirective: 1050 Data = 0; 1051 break; 1052 } 1053 } 1054 1055 unsigned DeclarationNameKey::getHash() const { 1056 llvm::FoldingSetNodeID ID; 1057 ID.AddInteger(Kind); 1058 1059 switch (Kind) { 1060 case DeclarationName::Identifier: 1061 case DeclarationName::CXXLiteralOperatorName: 1062 case DeclarationName::CXXDeductionGuideName: 1063 ID.AddString(((IdentifierInfo*)Data)->getName()); 1064 break; 1065 case DeclarationName::ObjCZeroArgSelector: 1066 case DeclarationName::ObjCOneArgSelector: 1067 case DeclarationName::ObjCMultiArgSelector: 1068 ID.AddInteger(serialization::ComputeHash(Selector(Data))); 1069 break; 1070 case DeclarationName::CXXOperatorName: 1071 ID.AddInteger((OverloadedOperatorKind)Data); 1072 break; 1073 case DeclarationName::CXXConstructorName: 1074 case DeclarationName::CXXDestructorName: 1075 case DeclarationName::CXXConversionFunctionName: 1076 case DeclarationName::CXXUsingDirective: 1077 break; 1078 } 1079 1080 return ID.ComputeHash(); 1081 } 1082 1083 ModuleFile * 1084 ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) { 1085 using namespace llvm::support; 1086 1087 uint32_t ModuleFileID = endian::readNext<uint32_t, little, unaligned>(d); 1088 return Reader.getLocalModuleFile(F, ModuleFileID); 1089 } 1090 1091 std::pair<unsigned, unsigned> 1092 ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) { 1093 using namespace llvm::support; 1094 1095 unsigned KeyLen = endian::readNext<uint16_t, little, unaligned>(d); 1096 unsigned DataLen = endian::readNext<uint16_t, little, unaligned>(d); 1097 return std::make_pair(KeyLen, DataLen); 1098 } 1099 1100 ASTDeclContextNameLookupTrait::internal_key_type 1101 ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) { 1102 using namespace llvm::support; 1103 1104 auto Kind = (DeclarationName::NameKind)*d++; 1105 uint64_t Data; 1106 switch (Kind) { 1107 case DeclarationName::Identifier: 1108 case DeclarationName::CXXLiteralOperatorName: 1109 case DeclarationName::CXXDeductionGuideName: 1110 Data = (uint64_t)Reader.getLocalIdentifier( 1111 F, endian::readNext<uint32_t, little, unaligned>(d)); 1112 break; 1113 case DeclarationName::ObjCZeroArgSelector: 1114 case DeclarationName::ObjCOneArgSelector: 1115 case DeclarationName::ObjCMultiArgSelector: 1116 Data = 1117 (uint64_t)Reader.getLocalSelector( 1118 F, endian::readNext<uint32_t, little, unaligned>( 1119 d)).getAsOpaquePtr(); 1120 break; 1121 case DeclarationName::CXXOperatorName: 1122 Data = *d++; // OverloadedOperatorKind 1123 break; 1124 case DeclarationName::CXXConstructorName: 1125 case DeclarationName::CXXDestructorName: 1126 case DeclarationName::CXXConversionFunctionName: 1127 case DeclarationName::CXXUsingDirective: 1128 Data = 0; 1129 break; 1130 } 1131 1132 return DeclarationNameKey(Kind, Data); 1133 } 1134 1135 void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type, 1136 const unsigned char *d, 1137 unsigned DataLen, 1138 data_type_builder &Val) { 1139 using namespace llvm::support; 1140 1141 for (unsigned NumDecls = DataLen / 4; NumDecls; --NumDecls) { 1142 uint32_t LocalID = endian::readNext<uint32_t, little, unaligned>(d); 1143 Val.insert(Reader.getGlobalDeclID(F, LocalID)); 1144 } 1145 } 1146 1147 bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M, 1148 BitstreamCursor &Cursor, 1149 uint64_t Offset, 1150 DeclContext *DC) { 1151 assert(Offset != 0); 1152 1153 SavedStreamPosition SavedPosition(Cursor); 1154 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1155 Error(std::move(Err)); 1156 return true; 1157 } 1158 1159 RecordData Record; 1160 StringRef Blob; 1161 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1162 if (!MaybeCode) { 1163 Error(MaybeCode.takeError()); 1164 return true; 1165 } 1166 unsigned Code = MaybeCode.get(); 1167 1168 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob); 1169 if (!MaybeRecCode) { 1170 Error(MaybeRecCode.takeError()); 1171 return true; 1172 } 1173 unsigned RecCode = MaybeRecCode.get(); 1174 if (RecCode != DECL_CONTEXT_LEXICAL) { 1175 Error("Expected lexical block"); 1176 return true; 1177 } 1178 1179 assert(!isa<TranslationUnitDecl>(DC) && 1180 "expected a TU_UPDATE_LEXICAL record for TU"); 1181 // If we are handling a C++ class template instantiation, we can see multiple 1182 // lexical updates for the same record. It's important that we select only one 1183 // of them, so that field numbering works properly. Just pick the first one we 1184 // see. 1185 auto &Lex = LexicalDecls[DC]; 1186 if (!Lex.first) { 1187 Lex = std::make_pair( 1188 &M, llvm::makeArrayRef( 1189 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 1190 Blob.data()), 1191 Blob.size() / 4)); 1192 } 1193 DC->setHasExternalLexicalStorage(true); 1194 return false; 1195 } 1196 1197 bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M, 1198 BitstreamCursor &Cursor, 1199 uint64_t Offset, 1200 DeclID ID) { 1201 assert(Offset != 0); 1202 1203 SavedStreamPosition SavedPosition(Cursor); 1204 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1205 Error(std::move(Err)); 1206 return true; 1207 } 1208 1209 RecordData Record; 1210 StringRef Blob; 1211 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1212 if (!MaybeCode) { 1213 Error(MaybeCode.takeError()); 1214 return true; 1215 } 1216 unsigned Code = MaybeCode.get(); 1217 1218 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob); 1219 if (!MaybeRecCode) { 1220 Error(MaybeRecCode.takeError()); 1221 return true; 1222 } 1223 unsigned RecCode = MaybeRecCode.get(); 1224 if (RecCode != DECL_CONTEXT_VISIBLE) { 1225 Error("Expected visible lookup table block"); 1226 return true; 1227 } 1228 1229 // We can't safely determine the primary context yet, so delay attaching the 1230 // lookup table until we're done with recursive deserialization. 1231 auto *Data = (const unsigned char*)Blob.data(); 1232 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data}); 1233 return false; 1234 } 1235 1236 void ASTReader::Error(StringRef Msg) const { 1237 Error(diag::err_fe_pch_malformed, Msg); 1238 if (PP.getLangOpts().Modules && !Diags.isDiagnosticInFlight() && 1239 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) { 1240 Diag(diag::note_module_cache_path) 1241 << PP.getHeaderSearchInfo().getModuleCachePath(); 1242 } 1243 } 1244 1245 void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2, 1246 StringRef Arg3) const { 1247 if (Diags.isDiagnosticInFlight()) 1248 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2, Arg3); 1249 else 1250 Diag(DiagID) << Arg1 << Arg2 << Arg3; 1251 } 1252 1253 void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2, 1254 unsigned Select) const { 1255 if (!Diags.isDiagnosticInFlight()) 1256 Diag(DiagID) << Arg1 << Arg2 << Select; 1257 } 1258 1259 void ASTReader::Error(llvm::Error &&Err) const { 1260 Error(toString(std::move(Err))); 1261 } 1262 1263 //===----------------------------------------------------------------------===// 1264 // Source Manager Deserialization 1265 //===----------------------------------------------------------------------===// 1266 1267 /// Read the line table in the source manager block. 1268 /// \returns true if there was an error. 1269 bool ASTReader::ParseLineTable(ModuleFile &F, 1270 const RecordData &Record) { 1271 unsigned Idx = 0; 1272 LineTableInfo &LineTable = SourceMgr.getLineTable(); 1273 1274 // Parse the file names 1275 std::map<int, int> FileIDs; 1276 FileIDs[-1] = -1; // For unspecified filenames. 1277 for (unsigned I = 0; Record[Idx]; ++I) { 1278 // Extract the file name 1279 auto Filename = ReadPath(F, Record, Idx); 1280 FileIDs[I] = LineTable.getLineTableFilenameID(Filename); 1281 } 1282 ++Idx; 1283 1284 // Parse the line entries 1285 std::vector<LineEntry> Entries; 1286 while (Idx < Record.size()) { 1287 int FID = Record[Idx++]; 1288 assert(FID >= 0 && "Serialized line entries for non-local file."); 1289 // Remap FileID from 1-based old view. 1290 FID += F.SLocEntryBaseID - 1; 1291 1292 // Extract the line entries 1293 unsigned NumEntries = Record[Idx++]; 1294 assert(NumEntries && "no line entries for file ID"); 1295 Entries.clear(); 1296 Entries.reserve(NumEntries); 1297 for (unsigned I = 0; I != NumEntries; ++I) { 1298 unsigned FileOffset = Record[Idx++]; 1299 unsigned LineNo = Record[Idx++]; 1300 int FilenameID = FileIDs[Record[Idx++]]; 1301 SrcMgr::CharacteristicKind FileKind 1302 = (SrcMgr::CharacteristicKind)Record[Idx++]; 1303 unsigned IncludeOffset = Record[Idx++]; 1304 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID, 1305 FileKind, IncludeOffset)); 1306 } 1307 LineTable.AddEntry(FileID::get(FID), Entries); 1308 } 1309 1310 return false; 1311 } 1312 1313 /// Read a source manager block 1314 bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) { 1315 using namespace SrcMgr; 1316 1317 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor; 1318 1319 // Set the source-location entry cursor to the current position in 1320 // the stream. This cursor will be used to read the contents of the 1321 // source manager block initially, and then lazily read 1322 // source-location entries as needed. 1323 SLocEntryCursor = F.Stream; 1324 1325 // The stream itself is going to skip over the source manager block. 1326 if (llvm::Error Err = F.Stream.SkipBlock()) { 1327 Error(std::move(Err)); 1328 return true; 1329 } 1330 1331 // Enter the source manager block. 1332 if (llvm::Error Err = 1333 SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) { 1334 Error(std::move(Err)); 1335 return true; 1336 } 1337 1338 RecordData Record; 1339 while (true) { 1340 Expected<llvm::BitstreamEntry> MaybeE = 1341 SLocEntryCursor.advanceSkippingSubblocks(); 1342 if (!MaybeE) { 1343 Error(MaybeE.takeError()); 1344 return true; 1345 } 1346 llvm::BitstreamEntry E = MaybeE.get(); 1347 1348 switch (E.Kind) { 1349 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1350 case llvm::BitstreamEntry::Error: 1351 Error("malformed block record in AST file"); 1352 return true; 1353 case llvm::BitstreamEntry::EndBlock: 1354 return false; 1355 case llvm::BitstreamEntry::Record: 1356 // The interesting case. 1357 break; 1358 } 1359 1360 // Read a record. 1361 Record.clear(); 1362 StringRef Blob; 1363 Expected<unsigned> MaybeRecord = 1364 SLocEntryCursor.readRecord(E.ID, Record, &Blob); 1365 if (!MaybeRecord) { 1366 Error(MaybeRecord.takeError()); 1367 return true; 1368 } 1369 switch (MaybeRecord.get()) { 1370 default: // Default behavior: ignore. 1371 break; 1372 1373 case SM_SLOC_FILE_ENTRY: 1374 case SM_SLOC_BUFFER_ENTRY: 1375 case SM_SLOC_EXPANSION_ENTRY: 1376 // Once we hit one of the source location entries, we're done. 1377 return false; 1378 } 1379 } 1380 } 1381 1382 /// If a header file is not found at the path that we expect it to be 1383 /// and the PCH file was moved from its original location, try to resolve the 1384 /// file by assuming that header+PCH were moved together and the header is in 1385 /// the same place relative to the PCH. 1386 static std::string 1387 resolveFileRelativeToOriginalDir(const std::string &Filename, 1388 const std::string &OriginalDir, 1389 const std::string &CurrDir) { 1390 assert(OriginalDir != CurrDir && 1391 "No point trying to resolve the file if the PCH dir didn't change"); 1392 1393 using namespace llvm::sys; 1394 1395 SmallString<128> filePath(Filename); 1396 fs::make_absolute(filePath); 1397 assert(path::is_absolute(OriginalDir)); 1398 SmallString<128> currPCHPath(CurrDir); 1399 1400 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)), 1401 fileDirE = path::end(path::parent_path(filePath)); 1402 path::const_iterator origDirI = path::begin(OriginalDir), 1403 origDirE = path::end(OriginalDir); 1404 // Skip the common path components from filePath and OriginalDir. 1405 while (fileDirI != fileDirE && origDirI != origDirE && 1406 *fileDirI == *origDirI) { 1407 ++fileDirI; 1408 ++origDirI; 1409 } 1410 for (; origDirI != origDirE; ++origDirI) 1411 path::append(currPCHPath, ".."); 1412 path::append(currPCHPath, fileDirI, fileDirE); 1413 path::append(currPCHPath, path::filename(Filename)); 1414 return currPCHPath.str(); 1415 } 1416 1417 bool ASTReader::ReadSLocEntry(int ID) { 1418 if (ID == 0) 1419 return false; 1420 1421 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1422 Error("source location entry ID out-of-range for AST file"); 1423 return true; 1424 } 1425 1426 // Local helper to read the (possibly-compressed) buffer data following the 1427 // entry record. 1428 auto ReadBuffer = [this]( 1429 BitstreamCursor &SLocEntryCursor, 1430 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> { 1431 RecordData Record; 1432 StringRef Blob; 1433 Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode(); 1434 if (!MaybeCode) { 1435 Error(MaybeCode.takeError()); 1436 return nullptr; 1437 } 1438 unsigned Code = MaybeCode.get(); 1439 1440 Expected<unsigned> MaybeRecCode = 1441 SLocEntryCursor.readRecord(Code, Record, &Blob); 1442 if (!MaybeRecCode) { 1443 Error(MaybeRecCode.takeError()); 1444 return nullptr; 1445 } 1446 unsigned RecCode = MaybeRecCode.get(); 1447 1448 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) { 1449 if (!llvm::zlib::isAvailable()) { 1450 Error("zlib is not available"); 1451 return nullptr; 1452 } 1453 SmallString<0> Uncompressed; 1454 if (llvm::Error E = 1455 llvm::zlib::uncompress(Blob, Uncompressed, Record[0])) { 1456 Error("could not decompress embedded file contents: " + 1457 llvm::toString(std::move(E))); 1458 return nullptr; 1459 } 1460 return llvm::MemoryBuffer::getMemBufferCopy(Uncompressed, Name); 1461 } else if (RecCode == SM_SLOC_BUFFER_BLOB) { 1462 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true); 1463 } else { 1464 Error("AST record has invalid code"); 1465 return nullptr; 1466 } 1467 }; 1468 1469 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second; 1470 if (llvm::Error Err = F->SLocEntryCursor.JumpToBit( 1471 F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) { 1472 Error(std::move(Err)); 1473 return true; 1474 } 1475 1476 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor; 1477 unsigned BaseOffset = F->SLocEntryBaseOffset; 1478 1479 ++NumSLocEntriesRead; 1480 Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance(); 1481 if (!MaybeEntry) { 1482 Error(MaybeEntry.takeError()); 1483 return true; 1484 } 1485 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1486 1487 if (Entry.Kind != llvm::BitstreamEntry::Record) { 1488 Error("incorrectly-formatted source location entry in AST file"); 1489 return true; 1490 } 1491 1492 RecordData Record; 1493 StringRef Blob; 1494 Expected<unsigned> MaybeSLOC = 1495 SLocEntryCursor.readRecord(Entry.ID, Record, &Blob); 1496 if (!MaybeSLOC) { 1497 Error(MaybeSLOC.takeError()); 1498 return true; 1499 } 1500 switch (MaybeSLOC.get()) { 1501 default: 1502 Error("incorrectly-formatted source location entry in AST file"); 1503 return true; 1504 1505 case SM_SLOC_FILE_ENTRY: { 1506 // We will detect whether a file changed and return 'Failure' for it, but 1507 // we will also try to fail gracefully by setting up the SLocEntry. 1508 unsigned InputID = Record[4]; 1509 InputFile IF = getInputFile(*F, InputID); 1510 const FileEntry *File = IF.getFile(); 1511 bool OverriddenBuffer = IF.isOverridden(); 1512 1513 // Note that we only check if a File was returned. If it was out-of-date 1514 // we have complained but we will continue creating a FileID to recover 1515 // gracefully. 1516 if (!File) 1517 return true; 1518 1519 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1520 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) { 1521 // This is the module's main file. 1522 IncludeLoc = getImportLocation(F); 1523 } 1524 SrcMgr::CharacteristicKind 1525 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1526 // FIXME: The FileID should be created from the FileEntryRef. 1527 FileID FID = SourceMgr.createFileID(File, IncludeLoc, FileCharacter, 1528 ID, BaseOffset + Record[0]); 1529 SrcMgr::FileInfo &FileInfo = 1530 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile()); 1531 FileInfo.NumCreatedFIDs = Record[5]; 1532 if (Record[3]) 1533 FileInfo.setHasLineDirectives(); 1534 1535 unsigned NumFileDecls = Record[7]; 1536 if (NumFileDecls && ContextObj) { 1537 const DeclID *FirstDecl = F->FileSortedDecls + Record[6]; 1538 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?"); 1539 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl, 1540 NumFileDecls)); 1541 } 1542 1543 const SrcMgr::ContentCache *ContentCache 1544 = SourceMgr.getOrCreateContentCache(File, isSystem(FileCharacter)); 1545 if (OverriddenBuffer && !ContentCache->BufferOverridden && 1546 ContentCache->ContentsEntry == ContentCache->OrigEntry && 1547 !ContentCache->getRawBuffer()) { 1548 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName()); 1549 if (!Buffer) 1550 return true; 1551 SourceMgr.overrideFileContents(File, std::move(Buffer)); 1552 } 1553 1554 break; 1555 } 1556 1557 case SM_SLOC_BUFFER_ENTRY: { 1558 const char *Name = Blob.data(); 1559 unsigned Offset = Record[0]; 1560 SrcMgr::CharacteristicKind 1561 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1562 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1563 if (IncludeLoc.isInvalid() && F->isModule()) { 1564 IncludeLoc = getImportLocation(F); 1565 } 1566 1567 auto Buffer = ReadBuffer(SLocEntryCursor, Name); 1568 if (!Buffer) 1569 return true; 1570 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID, 1571 BaseOffset + Offset, IncludeLoc); 1572 break; 1573 } 1574 1575 case SM_SLOC_EXPANSION_ENTRY: { 1576 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]); 1577 SourceMgr.createExpansionLoc(SpellingLoc, 1578 ReadSourceLocation(*F, Record[2]), 1579 ReadSourceLocation(*F, Record[3]), 1580 Record[5], 1581 Record[4], 1582 ID, 1583 BaseOffset + Record[0]); 1584 break; 1585 } 1586 } 1587 1588 return false; 1589 } 1590 1591 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) { 1592 if (ID == 0) 1593 return std::make_pair(SourceLocation(), ""); 1594 1595 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1596 Error("source location entry ID out-of-range for AST file"); 1597 return std::make_pair(SourceLocation(), ""); 1598 } 1599 1600 // Find which module file this entry lands in. 1601 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second; 1602 if (!M->isModule()) 1603 return std::make_pair(SourceLocation(), ""); 1604 1605 // FIXME: Can we map this down to a particular submodule? That would be 1606 // ideal. 1607 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName)); 1608 } 1609 1610 /// Find the location where the module F is imported. 1611 SourceLocation ASTReader::getImportLocation(ModuleFile *F) { 1612 if (F->ImportLoc.isValid()) 1613 return F->ImportLoc; 1614 1615 // Otherwise we have a PCH. It's considered to be "imported" at the first 1616 // location of its includer. 1617 if (F->ImportedBy.empty() || !F->ImportedBy[0]) { 1618 // Main file is the importer. 1619 assert(SourceMgr.getMainFileID().isValid() && "missing main file"); 1620 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID()); 1621 } 1622 return F->ImportedBy[0]->FirstLoc; 1623 } 1624 1625 /// Enter a subblock of the specified BlockID with the specified cursor. Read 1626 /// the abbreviations that are at the top of the block and then leave the cursor 1627 /// pointing into the block. 1628 bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID) { 1629 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) { 1630 // FIXME this drops errors on the floor. 1631 consumeError(std::move(Err)); 1632 return true; 1633 } 1634 1635 while (true) { 1636 uint64_t Offset = Cursor.GetCurrentBitNo(); 1637 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1638 if (!MaybeCode) { 1639 // FIXME this drops errors on the floor. 1640 consumeError(MaybeCode.takeError()); 1641 return true; 1642 } 1643 unsigned Code = MaybeCode.get(); 1644 1645 // We expect all abbrevs to be at the start of the block. 1646 if (Code != llvm::bitc::DEFINE_ABBREV) { 1647 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1648 // FIXME this drops errors on the floor. 1649 consumeError(std::move(Err)); 1650 return true; 1651 } 1652 return false; 1653 } 1654 if (llvm::Error Err = Cursor.ReadAbbrevRecord()) { 1655 // FIXME this drops errors on the floor. 1656 consumeError(std::move(Err)); 1657 return true; 1658 } 1659 } 1660 } 1661 1662 Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record, 1663 unsigned &Idx) { 1664 Token Tok; 1665 Tok.startToken(); 1666 Tok.setLocation(ReadSourceLocation(F, Record, Idx)); 1667 Tok.setLength(Record[Idx++]); 1668 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++])) 1669 Tok.setIdentifierInfo(II); 1670 Tok.setKind((tok::TokenKind)Record[Idx++]); 1671 Tok.setFlag((Token::TokenFlags)Record[Idx++]); 1672 return Tok; 1673 } 1674 1675 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { 1676 BitstreamCursor &Stream = F.MacroCursor; 1677 1678 // Keep track of where we are in the stream, then jump back there 1679 // after reading this macro. 1680 SavedStreamPosition SavedPosition(Stream); 1681 1682 if (llvm::Error Err = Stream.JumpToBit(Offset)) { 1683 // FIXME this drops errors on the floor. 1684 consumeError(std::move(Err)); 1685 return nullptr; 1686 } 1687 RecordData Record; 1688 SmallVector<IdentifierInfo*, 16> MacroParams; 1689 MacroInfo *Macro = nullptr; 1690 1691 while (true) { 1692 // Advance to the next record, but if we get to the end of the block, don't 1693 // pop it (removing all the abbreviations from the cursor) since we want to 1694 // be able to reseek within the block and read entries. 1695 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd; 1696 Expected<llvm::BitstreamEntry> MaybeEntry = 1697 Stream.advanceSkippingSubblocks(Flags); 1698 if (!MaybeEntry) { 1699 Error(MaybeEntry.takeError()); 1700 return Macro; 1701 } 1702 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1703 1704 switch (Entry.Kind) { 1705 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1706 case llvm::BitstreamEntry::Error: 1707 Error("malformed block record in AST file"); 1708 return Macro; 1709 case llvm::BitstreamEntry::EndBlock: 1710 return Macro; 1711 case llvm::BitstreamEntry::Record: 1712 // The interesting case. 1713 break; 1714 } 1715 1716 // Read a record. 1717 Record.clear(); 1718 PreprocessorRecordTypes RecType; 1719 if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record)) 1720 RecType = (PreprocessorRecordTypes)MaybeRecType.get(); 1721 else { 1722 Error(MaybeRecType.takeError()); 1723 return Macro; 1724 } 1725 switch (RecType) { 1726 case PP_MODULE_MACRO: 1727 case PP_MACRO_DIRECTIVE_HISTORY: 1728 return Macro; 1729 1730 case PP_MACRO_OBJECT_LIKE: 1731 case PP_MACRO_FUNCTION_LIKE: { 1732 // If we already have a macro, that means that we've hit the end 1733 // of the definition of the macro we were looking for. We're 1734 // done. 1735 if (Macro) 1736 return Macro; 1737 1738 unsigned NextIndex = 1; // Skip identifier ID. 1739 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex); 1740 MacroInfo *MI = PP.AllocateMacroInfo(Loc); 1741 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex)); 1742 MI->setIsUsed(Record[NextIndex++]); 1743 MI->setUsedForHeaderGuard(Record[NextIndex++]); 1744 1745 if (RecType == PP_MACRO_FUNCTION_LIKE) { 1746 // Decode function-like macro info. 1747 bool isC99VarArgs = Record[NextIndex++]; 1748 bool isGNUVarArgs = Record[NextIndex++]; 1749 bool hasCommaPasting = Record[NextIndex++]; 1750 MacroParams.clear(); 1751 unsigned NumArgs = Record[NextIndex++]; 1752 for (unsigned i = 0; i != NumArgs; ++i) 1753 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++])); 1754 1755 // Install function-like macro info. 1756 MI->setIsFunctionLike(); 1757 if (isC99VarArgs) MI->setIsC99Varargs(); 1758 if (isGNUVarArgs) MI->setIsGNUVarargs(); 1759 if (hasCommaPasting) MI->setHasCommaPasting(); 1760 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator()); 1761 } 1762 1763 // Remember that we saw this macro last so that we add the tokens that 1764 // form its body to it. 1765 Macro = MI; 1766 1767 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() && 1768 Record[NextIndex]) { 1769 // We have a macro definition. Register the association 1770 PreprocessedEntityID 1771 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]); 1772 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 1773 PreprocessingRecord::PPEntityID PPID = 1774 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true); 1775 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>( 1776 PPRec.getPreprocessedEntity(PPID)); 1777 if (PPDef) 1778 PPRec.RegisterMacroDefinition(Macro, PPDef); 1779 } 1780 1781 ++NumMacrosRead; 1782 break; 1783 } 1784 1785 case PP_TOKEN: { 1786 // If we see a TOKEN before a PP_MACRO_*, then the file is 1787 // erroneous, just pretend we didn't see this. 1788 if (!Macro) break; 1789 1790 unsigned Idx = 0; 1791 Token Tok = ReadToken(F, Record, Idx); 1792 Macro->AddTokenToBody(Tok); 1793 break; 1794 } 1795 } 1796 } 1797 } 1798 1799 PreprocessedEntityID 1800 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, 1801 unsigned LocalID) const { 1802 if (!M.ModuleOffsetMap.empty()) 1803 ReadModuleOffsetMap(M); 1804 1805 ContinuousRangeMap<uint32_t, int, 2>::const_iterator 1806 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS); 1807 assert(I != M.PreprocessedEntityRemap.end() 1808 && "Invalid index into preprocessed entity index remap"); 1809 1810 return LocalID + I->second; 1811 } 1812 1813 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) { 1814 return llvm::hash_combine(ikey.Size, ikey.ModTime); 1815 } 1816 1817 HeaderFileInfoTrait::internal_key_type 1818 HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) { 1819 internal_key_type ikey = {FE->getSize(), 1820 M.HasTimestamps ? FE->getModificationTime() : 0, 1821 FE->getName(), /*Imported*/ false}; 1822 return ikey; 1823 } 1824 1825 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) { 1826 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime)) 1827 return false; 1828 1829 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename) 1830 return true; 1831 1832 // Determine whether the actual files are equivalent. 1833 FileManager &FileMgr = Reader.getFileManager(); 1834 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* { 1835 if (!Key.Imported) { 1836 if (auto File = FileMgr.getFile(Key.Filename)) 1837 return *File; 1838 return nullptr; 1839 } 1840 1841 std::string Resolved = Key.Filename; 1842 Reader.ResolveImportedPath(M, Resolved); 1843 if (auto File = FileMgr.getFile(Resolved)) 1844 return *File; 1845 return nullptr; 1846 }; 1847 1848 const FileEntry *FEA = GetFile(a); 1849 const FileEntry *FEB = GetFile(b); 1850 return FEA && FEA == FEB; 1851 } 1852 1853 std::pair<unsigned, unsigned> 1854 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) { 1855 using namespace llvm::support; 1856 1857 unsigned KeyLen = (unsigned) endian::readNext<uint16_t, little, unaligned>(d); 1858 unsigned DataLen = (unsigned) *d++; 1859 return std::make_pair(KeyLen, DataLen); 1860 } 1861 1862 HeaderFileInfoTrait::internal_key_type 1863 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) { 1864 using namespace llvm::support; 1865 1866 internal_key_type ikey; 1867 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d)); 1868 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d)); 1869 ikey.Filename = (const char *)d; 1870 ikey.Imported = true; 1871 return ikey; 1872 } 1873 1874 HeaderFileInfoTrait::data_type 1875 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d, 1876 unsigned DataLen) { 1877 using namespace llvm::support; 1878 1879 const unsigned char *End = d + DataLen; 1880 HeaderFileInfo HFI; 1881 unsigned Flags = *d++; 1882 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp. 1883 HFI.isImport |= (Flags >> 5) & 0x01; 1884 HFI.isPragmaOnce |= (Flags >> 4) & 0x01; 1885 HFI.DirInfo = (Flags >> 1) & 0x07; 1886 HFI.IndexHeaderMapHeader = Flags & 0x01; 1887 // FIXME: Find a better way to handle this. Maybe just store a 1888 // "has been included" flag? 1889 HFI.NumIncludes = std::max(endian::readNext<uint16_t, little, unaligned>(d), 1890 HFI.NumIncludes); 1891 HFI.ControllingMacroID = Reader.getGlobalIdentifierID( 1892 M, endian::readNext<uint32_t, little, unaligned>(d)); 1893 if (unsigned FrameworkOffset = 1894 endian::readNext<uint32_t, little, unaligned>(d)) { 1895 // The framework offset is 1 greater than the actual offset, 1896 // since 0 is used as an indicator for "no framework name". 1897 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1); 1898 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName); 1899 } 1900 1901 assert((End - d) % 4 == 0 && 1902 "Wrong data length in HeaderFileInfo deserialization"); 1903 while (d != End) { 1904 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d); 1905 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3); 1906 LocalSMID >>= 2; 1907 1908 // This header is part of a module. Associate it with the module to enable 1909 // implicit module import. 1910 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID); 1911 Module *Mod = Reader.getSubmodule(GlobalSMID); 1912 FileManager &FileMgr = Reader.getFileManager(); 1913 ModuleMap &ModMap = 1914 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap(); 1915 1916 std::string Filename = key.Filename; 1917 if (key.Imported) 1918 Reader.ResolveImportedPath(M, Filename); 1919 // FIXME: This is not always the right filename-as-written, but we're not 1920 // going to use this information to rebuild the module, so it doesn't make 1921 // a lot of difference. 1922 Module::Header H = { key.Filename, *FileMgr.getFile(Filename) }; 1923 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true); 1924 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader); 1925 } 1926 1927 // This HeaderFileInfo was externally loaded. 1928 HFI.External = true; 1929 HFI.IsValid = true; 1930 return HFI; 1931 } 1932 1933 void ASTReader::addPendingMacro(IdentifierInfo *II, 1934 ModuleFile *M, 1935 uint64_t MacroDirectivesOffset) { 1936 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"); 1937 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset)); 1938 } 1939 1940 void ASTReader::ReadDefinedMacros() { 1941 // Note that we are loading defined macros. 1942 Deserializing Macros(this); 1943 1944 for (ModuleFile &I : llvm::reverse(ModuleMgr)) { 1945 BitstreamCursor &MacroCursor = I.MacroCursor; 1946 1947 // If there was no preprocessor block, skip this file. 1948 if (MacroCursor.getBitcodeBytes().empty()) 1949 continue; 1950 1951 BitstreamCursor Cursor = MacroCursor; 1952 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) { 1953 Error(std::move(Err)); 1954 return; 1955 } 1956 1957 RecordData Record; 1958 while (true) { 1959 Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks(); 1960 if (!MaybeE) { 1961 Error(MaybeE.takeError()); 1962 return; 1963 } 1964 llvm::BitstreamEntry E = MaybeE.get(); 1965 1966 switch (E.Kind) { 1967 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1968 case llvm::BitstreamEntry::Error: 1969 Error("malformed block record in AST file"); 1970 return; 1971 case llvm::BitstreamEntry::EndBlock: 1972 goto NextCursor; 1973 1974 case llvm::BitstreamEntry::Record: { 1975 Record.clear(); 1976 Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record); 1977 if (!MaybeRecord) { 1978 Error(MaybeRecord.takeError()); 1979 return; 1980 } 1981 switch (MaybeRecord.get()) { 1982 default: // Default behavior: ignore. 1983 break; 1984 1985 case PP_MACRO_OBJECT_LIKE: 1986 case PP_MACRO_FUNCTION_LIKE: { 1987 IdentifierInfo *II = getLocalIdentifier(I, Record[0]); 1988 if (II->isOutOfDate()) 1989 updateOutOfDateIdentifier(*II); 1990 break; 1991 } 1992 1993 case PP_TOKEN: 1994 // Ignore tokens. 1995 break; 1996 } 1997 break; 1998 } 1999 } 2000 } 2001 NextCursor: ; 2002 } 2003 } 2004 2005 namespace { 2006 2007 /// Visitor class used to look up identifirs in an AST file. 2008 class IdentifierLookupVisitor { 2009 StringRef Name; 2010 unsigned NameHash; 2011 unsigned PriorGeneration; 2012 unsigned &NumIdentifierLookups; 2013 unsigned &NumIdentifierLookupHits; 2014 IdentifierInfo *Found = nullptr; 2015 2016 public: 2017 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration, 2018 unsigned &NumIdentifierLookups, 2019 unsigned &NumIdentifierLookupHits) 2020 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)), 2021 PriorGeneration(PriorGeneration), 2022 NumIdentifierLookups(NumIdentifierLookups), 2023 NumIdentifierLookupHits(NumIdentifierLookupHits) {} 2024 2025 bool operator()(ModuleFile &M) { 2026 // If we've already searched this module file, skip it now. 2027 if (M.Generation <= PriorGeneration) 2028 return true; 2029 2030 ASTIdentifierLookupTable *IdTable 2031 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable; 2032 if (!IdTable) 2033 return false; 2034 2035 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M, 2036 Found); 2037 ++NumIdentifierLookups; 2038 ASTIdentifierLookupTable::iterator Pos = 2039 IdTable->find_hashed(Name, NameHash, &Trait); 2040 if (Pos == IdTable->end()) 2041 return false; 2042 2043 // Dereferencing the iterator has the effect of building the 2044 // IdentifierInfo node and populating it with the various 2045 // declarations it needs. 2046 ++NumIdentifierLookupHits; 2047 Found = *Pos; 2048 return true; 2049 } 2050 2051 // Retrieve the identifier info found within the module 2052 // files. 2053 IdentifierInfo *getIdentifierInfo() const { return Found; } 2054 }; 2055 2056 } // namespace 2057 2058 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) { 2059 // Note that we are loading an identifier. 2060 Deserializing AnIdentifier(this); 2061 2062 unsigned PriorGeneration = 0; 2063 if (getContext().getLangOpts().Modules) 2064 PriorGeneration = IdentifierGeneration[&II]; 2065 2066 // If there is a global index, look there first to determine which modules 2067 // provably do not have any results for this identifier. 2068 GlobalModuleIndex::HitSet Hits; 2069 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 2070 if (!loadGlobalIndex()) { 2071 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) { 2072 HitsPtr = &Hits; 2073 } 2074 } 2075 2076 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration, 2077 NumIdentifierLookups, 2078 NumIdentifierLookupHits); 2079 ModuleMgr.visit(Visitor, HitsPtr); 2080 markIdentifierUpToDate(&II); 2081 } 2082 2083 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) { 2084 if (!II) 2085 return; 2086 2087 II->setOutOfDate(false); 2088 2089 // Update the generation for this identifier. 2090 if (getContext().getLangOpts().Modules) 2091 IdentifierGeneration[II] = getGeneration(); 2092 } 2093 2094 void ASTReader::resolvePendingMacro(IdentifierInfo *II, 2095 const PendingMacroInfo &PMInfo) { 2096 ModuleFile &M = *PMInfo.M; 2097 2098 BitstreamCursor &Cursor = M.MacroCursor; 2099 SavedStreamPosition SavedPosition(Cursor); 2100 if (llvm::Error Err = Cursor.JumpToBit(PMInfo.MacroDirectivesOffset)) { 2101 Error(std::move(Err)); 2102 return; 2103 } 2104 2105 struct ModuleMacroRecord { 2106 SubmoduleID SubModID; 2107 MacroInfo *MI; 2108 SmallVector<SubmoduleID, 8> Overrides; 2109 }; 2110 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros; 2111 2112 // We expect to see a sequence of PP_MODULE_MACRO records listing exported 2113 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete 2114 // macro histroy. 2115 RecordData Record; 2116 while (true) { 2117 Expected<llvm::BitstreamEntry> MaybeEntry = 2118 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 2119 if (!MaybeEntry) { 2120 Error(MaybeEntry.takeError()); 2121 return; 2122 } 2123 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2124 2125 if (Entry.Kind != llvm::BitstreamEntry::Record) { 2126 Error("malformed block record in AST file"); 2127 return; 2128 } 2129 2130 Record.clear(); 2131 Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record); 2132 if (!MaybePP) { 2133 Error(MaybePP.takeError()); 2134 return; 2135 } 2136 switch ((PreprocessorRecordTypes)MaybePP.get()) { 2137 case PP_MACRO_DIRECTIVE_HISTORY: 2138 break; 2139 2140 case PP_MODULE_MACRO: { 2141 ModuleMacros.push_back(ModuleMacroRecord()); 2142 auto &Info = ModuleMacros.back(); 2143 Info.SubModID = getGlobalSubmoduleID(M, Record[0]); 2144 Info.MI = getMacro(getGlobalMacroID(M, Record[1])); 2145 for (int I = 2, N = Record.size(); I != N; ++I) 2146 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I])); 2147 continue; 2148 } 2149 2150 default: 2151 Error("malformed block record in AST file"); 2152 return; 2153 } 2154 2155 // We found the macro directive history; that's the last record 2156 // for this macro. 2157 break; 2158 } 2159 2160 // Module macros are listed in reverse dependency order. 2161 { 2162 std::reverse(ModuleMacros.begin(), ModuleMacros.end()); 2163 llvm::SmallVector<ModuleMacro*, 8> Overrides; 2164 for (auto &MMR : ModuleMacros) { 2165 Overrides.clear(); 2166 for (unsigned ModID : MMR.Overrides) { 2167 Module *Mod = getSubmodule(ModID); 2168 auto *Macro = PP.getModuleMacro(Mod, II); 2169 assert(Macro && "missing definition for overridden macro"); 2170 Overrides.push_back(Macro); 2171 } 2172 2173 bool Inserted = false; 2174 Module *Owner = getSubmodule(MMR.SubModID); 2175 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted); 2176 } 2177 } 2178 2179 // Don't read the directive history for a module; we don't have anywhere 2180 // to put it. 2181 if (M.isModule()) 2182 return; 2183 2184 // Deserialize the macro directives history in reverse source-order. 2185 MacroDirective *Latest = nullptr, *Earliest = nullptr; 2186 unsigned Idx = 0, N = Record.size(); 2187 while (Idx < N) { 2188 MacroDirective *MD = nullptr; 2189 SourceLocation Loc = ReadSourceLocation(M, Record, Idx); 2190 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++]; 2191 switch (K) { 2192 case MacroDirective::MD_Define: { 2193 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++])); 2194 MD = PP.AllocateDefMacroDirective(MI, Loc); 2195 break; 2196 } 2197 case MacroDirective::MD_Undefine: 2198 MD = PP.AllocateUndefMacroDirective(Loc); 2199 break; 2200 case MacroDirective::MD_Visibility: 2201 bool isPublic = Record[Idx++]; 2202 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic); 2203 break; 2204 } 2205 2206 if (!Latest) 2207 Latest = MD; 2208 if (Earliest) 2209 Earliest->setPrevious(MD); 2210 Earliest = MD; 2211 } 2212 2213 if (Latest) 2214 PP.setLoadedMacroDirective(II, Earliest, Latest); 2215 } 2216 2217 ASTReader::InputFileInfo 2218 ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) { 2219 // Go find this input file. 2220 BitstreamCursor &Cursor = F.InputFilesCursor; 2221 SavedStreamPosition SavedPosition(Cursor); 2222 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2223 // FIXME this drops errors on the floor. 2224 consumeError(std::move(Err)); 2225 } 2226 2227 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 2228 if (!MaybeCode) { 2229 // FIXME this drops errors on the floor. 2230 consumeError(MaybeCode.takeError()); 2231 } 2232 unsigned Code = MaybeCode.get(); 2233 RecordData Record; 2234 StringRef Blob; 2235 2236 if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob)) 2237 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE && 2238 "invalid record type for input file"); 2239 else { 2240 // FIXME this drops errors on the floor. 2241 consumeError(Maybe.takeError()); 2242 } 2243 2244 assert(Record[0] == ID && "Bogus stored ID or offset"); 2245 InputFileInfo R; 2246 R.StoredSize = static_cast<off_t>(Record[1]); 2247 R.StoredTime = static_cast<time_t>(Record[2]); 2248 R.Overridden = static_cast<bool>(Record[3]); 2249 R.Transient = static_cast<bool>(Record[4]); 2250 R.TopLevelModuleMap = static_cast<bool>(Record[5]); 2251 R.Filename = Blob; 2252 ResolveImportedPath(F, R.Filename); 2253 2254 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 2255 if (!MaybeEntry) // FIXME this drops errors on the floor. 2256 consumeError(MaybeEntry.takeError()); 2257 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2258 assert(Entry.Kind == llvm::BitstreamEntry::Record && 2259 "expected record type for input file hash"); 2260 2261 Record.clear(); 2262 if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record)) 2263 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH && 2264 "invalid record type for input file hash"); 2265 else { 2266 // FIXME this drops errors on the floor. 2267 consumeError(Maybe.takeError()); 2268 } 2269 R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) | 2270 static_cast<uint64_t>(Record[0]); 2271 return R; 2272 } 2273 2274 static unsigned moduleKindForDiagnostic(ModuleKind Kind); 2275 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { 2276 // If this ID is bogus, just return an empty input file. 2277 if (ID == 0 || ID > F.InputFilesLoaded.size()) 2278 return InputFile(); 2279 2280 // If we've already loaded this input file, return it. 2281 if (F.InputFilesLoaded[ID-1].getFile()) 2282 return F.InputFilesLoaded[ID-1]; 2283 2284 if (F.InputFilesLoaded[ID-1].isNotFound()) 2285 return InputFile(); 2286 2287 // Go find this input file. 2288 BitstreamCursor &Cursor = F.InputFilesCursor; 2289 SavedStreamPosition SavedPosition(Cursor); 2290 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2291 // FIXME this drops errors on the floor. 2292 consumeError(std::move(Err)); 2293 } 2294 2295 InputFileInfo FI = readInputFileInfo(F, ID); 2296 off_t StoredSize = FI.StoredSize; 2297 time_t StoredTime = FI.StoredTime; 2298 bool Overridden = FI.Overridden; 2299 bool Transient = FI.Transient; 2300 StringRef Filename = FI.Filename; 2301 uint64_t StoredContentHash = FI.ContentHash; 2302 2303 const FileEntry *File = nullptr; 2304 if (auto FE = FileMgr.getFile(Filename, /*OpenFile=*/false)) 2305 File = *FE; 2306 2307 // If we didn't find the file, resolve it relative to the 2308 // original directory from which this AST file was created. 2309 if (File == nullptr && !F.OriginalDir.empty() && !F.BaseDirectory.empty() && 2310 F.OriginalDir != F.BaseDirectory) { 2311 std::string Resolved = resolveFileRelativeToOriginalDir( 2312 Filename, F.OriginalDir, F.BaseDirectory); 2313 if (!Resolved.empty()) 2314 if (auto FE = FileMgr.getFile(Resolved)) 2315 File = *FE; 2316 } 2317 2318 // For an overridden file, create a virtual file with the stored 2319 // size/timestamp. 2320 if ((Overridden || Transient) && File == nullptr) 2321 File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime); 2322 2323 if (File == nullptr) { 2324 if (Complain) { 2325 std::string ErrorStr = "could not find file '"; 2326 ErrorStr += Filename; 2327 ErrorStr += "' referenced by AST file '"; 2328 ErrorStr += F.FileName; 2329 ErrorStr += "'"; 2330 Error(ErrorStr); 2331 } 2332 // Record that we didn't find the file. 2333 F.InputFilesLoaded[ID-1] = InputFile::getNotFound(); 2334 return InputFile(); 2335 } 2336 2337 // Check if there was a request to override the contents of the file 2338 // that was part of the precompiled header. Overriding such a file 2339 // can lead to problems when lexing using the source locations from the 2340 // PCH. 2341 SourceManager &SM = getSourceManager(); 2342 // FIXME: Reject if the overrides are different. 2343 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) { 2344 if (Complain) 2345 Error(diag::err_fe_pch_file_overridden, Filename); 2346 2347 // After emitting the diagnostic, bypass the overriding file to recover 2348 // (this creates a separate FileEntry). 2349 File = SM.bypassFileContentsOverride(*File); 2350 if (!File) { 2351 F.InputFilesLoaded[ID - 1] = InputFile::getNotFound(); 2352 return InputFile(); 2353 } 2354 } 2355 2356 enum ModificationType { 2357 Size, 2358 ModTime, 2359 Content, 2360 None, 2361 }; 2362 auto HasInputFileChanged = [&]() { 2363 if (StoredSize != File->getSize()) 2364 return ModificationType::Size; 2365 if (!DisableValidation && StoredTime && 2366 StoredTime != File->getModificationTime()) { 2367 // In case the modification time changes but not the content, 2368 // accept the cached file as legit. 2369 if (ValidateASTInputFilesContent && 2370 StoredContentHash != static_cast<uint64_t>(llvm::hash_code(-1))) { 2371 auto MemBuffOrError = FileMgr.getBufferForFile(File); 2372 if (!MemBuffOrError) { 2373 if (!Complain) 2374 return ModificationType::ModTime; 2375 std::string ErrorStr = "could not get buffer for file '"; 2376 ErrorStr += File->getName(); 2377 ErrorStr += "'"; 2378 Error(ErrorStr); 2379 return ModificationType::ModTime; 2380 } 2381 2382 auto ContentHash = hash_value(MemBuffOrError.get()->getBuffer()); 2383 if (StoredContentHash == static_cast<uint64_t>(ContentHash)) 2384 return ModificationType::None; 2385 return ModificationType::Content; 2386 } 2387 return ModificationType::ModTime; 2388 } 2389 return ModificationType::None; 2390 }; 2391 2392 bool IsOutOfDate = false; 2393 auto FileChange = HasInputFileChanged(); 2394 // For an overridden file, there is nothing to validate. 2395 if (!Overridden && FileChange != ModificationType::None) { 2396 if (Complain) { 2397 // Build a list of the PCH imports that got us here (in reverse). 2398 SmallVector<ModuleFile *, 4> ImportStack(1, &F); 2399 while (!ImportStack.back()->ImportedBy.empty()) 2400 ImportStack.push_back(ImportStack.back()->ImportedBy[0]); 2401 2402 // The top-level PCH is stale. 2403 StringRef TopLevelPCHName(ImportStack.back()->FileName); 2404 unsigned DiagnosticKind = 2405 moduleKindForDiagnostic(ImportStack.back()->Kind); 2406 if (DiagnosticKind == 0) 2407 Error(diag::err_fe_pch_file_modified, Filename, TopLevelPCHName, 2408 (unsigned)FileChange); 2409 else if (DiagnosticKind == 1) 2410 Error(diag::err_fe_module_file_modified, Filename, TopLevelPCHName, 2411 (unsigned)FileChange); 2412 else 2413 Error(diag::err_fe_ast_file_modified, Filename, TopLevelPCHName, 2414 (unsigned)FileChange); 2415 2416 // Print the import stack. 2417 if (ImportStack.size() > 1 && !Diags.isDiagnosticInFlight()) { 2418 Diag(diag::note_pch_required_by) 2419 << Filename << ImportStack[0]->FileName; 2420 for (unsigned I = 1; I < ImportStack.size(); ++I) 2421 Diag(diag::note_pch_required_by) 2422 << ImportStack[I-1]->FileName << ImportStack[I]->FileName; 2423 } 2424 2425 if (!Diags.isDiagnosticInFlight()) 2426 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName; 2427 } 2428 2429 IsOutOfDate = true; 2430 } 2431 // FIXME: If the file is overridden and we've already opened it, 2432 // issue an error (or split it into a separate FileEntry). 2433 2434 InputFile IF = InputFile(File, Overridden || Transient, IsOutOfDate); 2435 2436 // Note that we've loaded this input file. 2437 F.InputFilesLoaded[ID-1] = IF; 2438 return IF; 2439 } 2440 2441 /// If we are loading a relocatable PCH or module file, and the filename 2442 /// is not an absolute path, add the system or module root to the beginning of 2443 /// the file name. 2444 void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) { 2445 // Resolve relative to the base directory, if we have one. 2446 if (!M.BaseDirectory.empty()) 2447 return ResolveImportedPath(Filename, M.BaseDirectory); 2448 } 2449 2450 void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) { 2451 if (Filename.empty() || llvm::sys::path::is_absolute(Filename)) 2452 return; 2453 2454 SmallString<128> Buffer; 2455 llvm::sys::path::append(Buffer, Prefix, Filename); 2456 Filename.assign(Buffer.begin(), Buffer.end()); 2457 } 2458 2459 static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) { 2460 switch (ARR) { 2461 case ASTReader::Failure: return true; 2462 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing); 2463 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate); 2464 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch); 2465 case ASTReader::ConfigurationMismatch: 2466 return !(Caps & ASTReader::ARR_ConfigurationMismatch); 2467 case ASTReader::HadErrors: return true; 2468 case ASTReader::Success: return false; 2469 } 2470 2471 llvm_unreachable("unknown ASTReadResult"); 2472 } 2473 2474 ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( 2475 BitstreamCursor &Stream, unsigned ClientLoadCapabilities, 2476 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener, 2477 std::string &SuggestedPredefines) { 2478 if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) { 2479 // FIXME this drops errors on the floor. 2480 consumeError(std::move(Err)); 2481 return Failure; 2482 } 2483 2484 // Read all of the records in the options block. 2485 RecordData Record; 2486 ASTReadResult Result = Success; 2487 while (true) { 2488 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2489 if (!MaybeEntry) { 2490 // FIXME this drops errors on the floor. 2491 consumeError(MaybeEntry.takeError()); 2492 return Failure; 2493 } 2494 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2495 2496 switch (Entry.Kind) { 2497 case llvm::BitstreamEntry::Error: 2498 case llvm::BitstreamEntry::SubBlock: 2499 return Failure; 2500 2501 case llvm::BitstreamEntry::EndBlock: 2502 return Result; 2503 2504 case llvm::BitstreamEntry::Record: 2505 // The interesting case. 2506 break; 2507 } 2508 2509 // Read and process a record. 2510 Record.clear(); 2511 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 2512 if (!MaybeRecordType) { 2513 // FIXME this drops errors on the floor. 2514 consumeError(MaybeRecordType.takeError()); 2515 return Failure; 2516 } 2517 switch ((OptionsRecordTypes)MaybeRecordType.get()) { 2518 case LANGUAGE_OPTIONS: { 2519 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2520 if (ParseLanguageOptions(Record, Complain, Listener, 2521 AllowCompatibleConfigurationMismatch)) 2522 Result = ConfigurationMismatch; 2523 break; 2524 } 2525 2526 case TARGET_OPTIONS: { 2527 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2528 if (ParseTargetOptions(Record, Complain, Listener, 2529 AllowCompatibleConfigurationMismatch)) 2530 Result = ConfigurationMismatch; 2531 break; 2532 } 2533 2534 case FILE_SYSTEM_OPTIONS: { 2535 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2536 if (!AllowCompatibleConfigurationMismatch && 2537 ParseFileSystemOptions(Record, Complain, Listener)) 2538 Result = ConfigurationMismatch; 2539 break; 2540 } 2541 2542 case HEADER_SEARCH_OPTIONS: { 2543 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2544 if (!AllowCompatibleConfigurationMismatch && 2545 ParseHeaderSearchOptions(Record, Complain, Listener)) 2546 Result = ConfigurationMismatch; 2547 break; 2548 } 2549 2550 case PREPROCESSOR_OPTIONS: 2551 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2552 if (!AllowCompatibleConfigurationMismatch && 2553 ParsePreprocessorOptions(Record, Complain, Listener, 2554 SuggestedPredefines)) 2555 Result = ConfigurationMismatch; 2556 break; 2557 } 2558 } 2559 } 2560 2561 ASTReader::ASTReadResult 2562 ASTReader::ReadControlBlock(ModuleFile &F, 2563 SmallVectorImpl<ImportedModule> &Loaded, 2564 const ModuleFile *ImportedBy, 2565 unsigned ClientLoadCapabilities) { 2566 BitstreamCursor &Stream = F.Stream; 2567 2568 if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) { 2569 Error(std::move(Err)); 2570 return Failure; 2571 } 2572 2573 // Lambda to read the unhashed control block the first time it's called. 2574 // 2575 // For PCM files, the unhashed control block cannot be read until after the 2576 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still 2577 // need to look ahead before reading the IMPORTS record. For consistency, 2578 // this block is always read somehow (see BitstreamEntry::EndBlock). 2579 bool HasReadUnhashedControlBlock = false; 2580 auto readUnhashedControlBlockOnce = [&]() { 2581 if (!HasReadUnhashedControlBlock) { 2582 HasReadUnhashedControlBlock = true; 2583 if (ASTReadResult Result = 2584 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities)) 2585 return Result; 2586 } 2587 return Success; 2588 }; 2589 2590 // Read all of the records and blocks in the control block. 2591 RecordData Record; 2592 unsigned NumInputs = 0; 2593 unsigned NumUserInputs = 0; 2594 StringRef BaseDirectoryAsWritten; 2595 while (true) { 2596 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2597 if (!MaybeEntry) { 2598 Error(MaybeEntry.takeError()); 2599 return Failure; 2600 } 2601 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2602 2603 switch (Entry.Kind) { 2604 case llvm::BitstreamEntry::Error: 2605 Error("malformed block record in AST file"); 2606 return Failure; 2607 case llvm::BitstreamEntry::EndBlock: { 2608 // Validate the module before returning. This call catches an AST with 2609 // no module name and no imports. 2610 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2611 return Result; 2612 2613 // Validate input files. 2614 const HeaderSearchOptions &HSOpts = 2615 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 2616 2617 // All user input files reside at the index range [0, NumUserInputs), and 2618 // system input files reside at [NumUserInputs, NumInputs). For explicitly 2619 // loaded module files, ignore missing inputs. 2620 if (!DisableValidation && F.Kind != MK_ExplicitModule && 2621 F.Kind != MK_PrebuiltModule) { 2622 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 2623 2624 // If we are reading a module, we will create a verification timestamp, 2625 // so we verify all input files. Otherwise, verify only user input 2626 // files. 2627 2628 unsigned N = NumUserInputs; 2629 if (ValidateSystemInputs || 2630 (HSOpts.ModulesValidateOncePerBuildSession && 2631 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp && 2632 F.Kind == MK_ImplicitModule)) 2633 N = NumInputs; 2634 2635 for (unsigned I = 0; I < N; ++I) { 2636 InputFile IF = getInputFile(F, I+1, Complain); 2637 if (!IF.getFile() || IF.isOutOfDate()) 2638 return OutOfDate; 2639 } 2640 } 2641 2642 if (Listener) 2643 Listener->visitModuleFile(F.FileName, F.Kind); 2644 2645 if (Listener && Listener->needsInputFileVisitation()) { 2646 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs 2647 : NumUserInputs; 2648 for (unsigned I = 0; I < N; ++I) { 2649 bool IsSystem = I >= NumUserInputs; 2650 InputFileInfo FI = readInputFileInfo(F, I+1); 2651 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden, 2652 F.Kind == MK_ExplicitModule || 2653 F.Kind == MK_PrebuiltModule); 2654 } 2655 } 2656 2657 return Success; 2658 } 2659 2660 case llvm::BitstreamEntry::SubBlock: 2661 switch (Entry.ID) { 2662 case INPUT_FILES_BLOCK_ID: 2663 F.InputFilesCursor = Stream; 2664 if (llvm::Error Err = Stream.SkipBlock()) { 2665 Error(std::move(Err)); 2666 return Failure; 2667 } 2668 if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) { 2669 Error("malformed block record in AST file"); 2670 return Failure; 2671 } 2672 continue; 2673 2674 case OPTIONS_BLOCK_ID: 2675 // If we're reading the first module for this group, check its options 2676 // are compatible with ours. For modules it imports, no further checking 2677 // is required, because we checked them when we built it. 2678 if (Listener && !ImportedBy) { 2679 // Should we allow the configuration of the module file to differ from 2680 // the configuration of the current translation unit in a compatible 2681 // way? 2682 // 2683 // FIXME: Allow this for files explicitly specified with -include-pch. 2684 bool AllowCompatibleConfigurationMismatch = 2685 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 2686 2687 ASTReadResult Result = 2688 ReadOptionsBlock(Stream, ClientLoadCapabilities, 2689 AllowCompatibleConfigurationMismatch, *Listener, 2690 SuggestedPredefines); 2691 if (Result == Failure) { 2692 Error("malformed block record in AST file"); 2693 return Result; 2694 } 2695 2696 if (DisableValidation || 2697 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 2698 Result = Success; 2699 2700 // If we can't load the module, exit early since we likely 2701 // will rebuild the module anyway. The stream may be in the 2702 // middle of a block. 2703 if (Result != Success) 2704 return Result; 2705 } else if (llvm::Error Err = Stream.SkipBlock()) { 2706 Error(std::move(Err)); 2707 return Failure; 2708 } 2709 continue; 2710 2711 default: 2712 if (llvm::Error Err = Stream.SkipBlock()) { 2713 Error(std::move(Err)); 2714 return Failure; 2715 } 2716 continue; 2717 } 2718 2719 case llvm::BitstreamEntry::Record: 2720 // The interesting case. 2721 break; 2722 } 2723 2724 // Read and process a record. 2725 Record.clear(); 2726 StringRef Blob; 2727 Expected<unsigned> MaybeRecordType = 2728 Stream.readRecord(Entry.ID, Record, &Blob); 2729 if (!MaybeRecordType) { 2730 Error(MaybeRecordType.takeError()); 2731 return Failure; 2732 } 2733 switch ((ControlRecordTypes)MaybeRecordType.get()) { 2734 case METADATA: { 2735 if (Record[0] != VERSION_MAJOR && !DisableValidation) { 2736 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2737 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old 2738 : diag::err_pch_version_too_new); 2739 return VersionMismatch; 2740 } 2741 2742 bool hasErrors = Record[7]; 2743 if (hasErrors && !DisableValidation && !AllowASTWithCompilerErrors) { 2744 Diag(diag::err_pch_with_compiler_errors); 2745 return HadErrors; 2746 } 2747 if (hasErrors) { 2748 Diags.ErrorOccurred = true; 2749 Diags.UncompilableErrorOccurred = true; 2750 Diags.UnrecoverableErrorOccurred = true; 2751 } 2752 2753 F.RelocatablePCH = Record[4]; 2754 // Relative paths in a relocatable PCH are relative to our sysroot. 2755 if (F.RelocatablePCH) 2756 F.BaseDirectory = isysroot.empty() ? "/" : isysroot; 2757 2758 F.HasTimestamps = Record[5]; 2759 2760 F.PCHHasObjectFile = Record[6]; 2761 2762 const std::string &CurBranch = getClangFullRepositoryVersion(); 2763 StringRef ASTBranch = Blob; 2764 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) { 2765 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2766 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch; 2767 return VersionMismatch; 2768 } 2769 break; 2770 } 2771 2772 case IMPORTS: { 2773 // Validate the AST before processing any imports (otherwise, untangling 2774 // them can be error-prone and expensive). A module will have a name and 2775 // will already have been validated, but this catches the PCH case. 2776 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2777 return Result; 2778 2779 // Load each of the imported PCH files. 2780 unsigned Idx = 0, N = Record.size(); 2781 while (Idx < N) { 2782 // Read information about the AST file. 2783 ModuleKind ImportedKind = (ModuleKind)Record[Idx++]; 2784 // The import location will be the local one for now; we will adjust 2785 // all import locations of module imports after the global source 2786 // location info are setup, in ReadAST. 2787 SourceLocation ImportLoc = 2788 ReadUntranslatedSourceLocation(Record[Idx++]); 2789 off_t StoredSize = (off_t)Record[Idx++]; 2790 time_t StoredModTime = (time_t)Record[Idx++]; 2791 ASTFileSignature StoredSignature = { 2792 {{(uint32_t)Record[Idx++], (uint32_t)Record[Idx++], 2793 (uint32_t)Record[Idx++], (uint32_t)Record[Idx++], 2794 (uint32_t)Record[Idx++]}}}; 2795 2796 std::string ImportedName = ReadString(Record, Idx); 2797 std::string ImportedFile; 2798 2799 // For prebuilt and explicit modules first consult the file map for 2800 // an override. Note that here we don't search prebuilt module 2801 // directories, only the explicit name to file mappings. Also, we will 2802 // still verify the size/signature making sure it is essentially the 2803 // same file but perhaps in a different location. 2804 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule) 2805 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName( 2806 ImportedName, /*FileMapOnly*/ true); 2807 2808 if (ImportedFile.empty()) 2809 // Use BaseDirectoryAsWritten to ensure we use the same path in the 2810 // ModuleCache as when writing. 2811 ImportedFile = ReadPath(BaseDirectoryAsWritten, Record, Idx); 2812 else 2813 SkipPath(Record, Idx); 2814 2815 // If our client can't cope with us being out of date, we can't cope with 2816 // our dependency being missing. 2817 unsigned Capabilities = ClientLoadCapabilities; 2818 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2819 Capabilities &= ~ARR_Missing; 2820 2821 // Load the AST file. 2822 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, 2823 Loaded, StoredSize, StoredModTime, 2824 StoredSignature, Capabilities); 2825 2826 // If we diagnosed a problem, produce a backtrace. 2827 if (isDiagnosedResult(Result, Capabilities)) 2828 Diag(diag::note_module_file_imported_by) 2829 << F.FileName << !F.ModuleName.empty() << F.ModuleName; 2830 2831 switch (Result) { 2832 case Failure: return Failure; 2833 // If we have to ignore the dependency, we'll have to ignore this too. 2834 case Missing: 2835 case OutOfDate: return OutOfDate; 2836 case VersionMismatch: return VersionMismatch; 2837 case ConfigurationMismatch: return ConfigurationMismatch; 2838 case HadErrors: return HadErrors; 2839 case Success: break; 2840 } 2841 } 2842 break; 2843 } 2844 2845 case ORIGINAL_FILE: 2846 F.OriginalSourceFileID = FileID::get(Record[0]); 2847 F.ActualOriginalSourceFileName = Blob; 2848 F.OriginalSourceFileName = F.ActualOriginalSourceFileName; 2849 ResolveImportedPath(F, F.OriginalSourceFileName); 2850 break; 2851 2852 case ORIGINAL_FILE_ID: 2853 F.OriginalSourceFileID = FileID::get(Record[0]); 2854 break; 2855 2856 case ORIGINAL_PCH_DIR: 2857 F.OriginalDir = Blob; 2858 break; 2859 2860 case MODULE_NAME: 2861 F.ModuleName = Blob; 2862 Diag(diag::remark_module_import) 2863 << F.ModuleName << F.FileName << (ImportedBy ? true : false) 2864 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 2865 if (Listener) 2866 Listener->ReadModuleName(F.ModuleName); 2867 2868 // Validate the AST as soon as we have a name so we can exit early on 2869 // failure. 2870 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2871 return Result; 2872 2873 break; 2874 2875 case MODULE_DIRECTORY: { 2876 // Save the BaseDirectory as written in the PCM for computing the module 2877 // filename for the ModuleCache. 2878 BaseDirectoryAsWritten = Blob; 2879 assert(!F.ModuleName.empty() && 2880 "MODULE_DIRECTORY found before MODULE_NAME"); 2881 // If we've already loaded a module map file covering this module, we may 2882 // have a better path for it (relative to the current build). 2883 Module *M = PP.getHeaderSearchInfo().lookupModule( 2884 F.ModuleName, /*AllowSearch*/ true, 2885 /*AllowExtraModuleMapSearch*/ true); 2886 if (M && M->Directory) { 2887 // If we're implicitly loading a module, the base directory can't 2888 // change between the build and use. 2889 // Don't emit module relocation error if we have -fno-validate-pch 2890 if (!PP.getPreprocessorOpts().DisablePCHValidation && 2891 F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) { 2892 auto BuildDir = PP.getFileManager().getDirectory(Blob); 2893 if (!BuildDir || *BuildDir != M->Directory) { 2894 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2895 Diag(diag::err_imported_module_relocated) 2896 << F.ModuleName << Blob << M->Directory->getName(); 2897 return OutOfDate; 2898 } 2899 } 2900 F.BaseDirectory = M->Directory->getName(); 2901 } else { 2902 F.BaseDirectory = Blob; 2903 } 2904 break; 2905 } 2906 2907 case MODULE_MAP_FILE: 2908 if (ASTReadResult Result = 2909 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities)) 2910 return Result; 2911 break; 2912 2913 case INPUT_FILE_OFFSETS: 2914 NumInputs = Record[0]; 2915 NumUserInputs = Record[1]; 2916 F.InputFileOffsets = 2917 (const llvm::support::unaligned_uint64_t *)Blob.data(); 2918 F.InputFilesLoaded.resize(NumInputs); 2919 F.NumUserInputFiles = NumUserInputs; 2920 break; 2921 } 2922 } 2923 } 2924 2925 ASTReader::ASTReadResult 2926 ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 2927 BitstreamCursor &Stream = F.Stream; 2928 2929 if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID)) { 2930 Error(std::move(Err)); 2931 return Failure; 2932 } 2933 2934 // Read all of the records and blocks for the AST file. 2935 RecordData Record; 2936 while (true) { 2937 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2938 if (!MaybeEntry) { 2939 Error(MaybeEntry.takeError()); 2940 return Failure; 2941 } 2942 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2943 2944 switch (Entry.Kind) { 2945 case llvm::BitstreamEntry::Error: 2946 Error("error at end of module block in AST file"); 2947 return Failure; 2948 case llvm::BitstreamEntry::EndBlock: 2949 // Outside of C++, we do not store a lookup map for the translation unit. 2950 // Instead, mark it as needing a lookup map to be built if this module 2951 // contains any declarations lexically within it (which it always does!). 2952 // This usually has no cost, since we very rarely need the lookup map for 2953 // the translation unit outside C++. 2954 if (ASTContext *Ctx = ContextObj) { 2955 DeclContext *DC = Ctx->getTranslationUnitDecl(); 2956 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus) 2957 DC->setMustBuildLookupTable(); 2958 } 2959 2960 return Success; 2961 case llvm::BitstreamEntry::SubBlock: 2962 switch (Entry.ID) { 2963 case DECLTYPES_BLOCK_ID: 2964 // We lazily load the decls block, but we want to set up the 2965 // DeclsCursor cursor to point into it. Clone our current bitcode 2966 // cursor to it, enter the block and read the abbrevs in that block. 2967 // With the main cursor, we just skip over it. 2968 F.DeclsCursor = Stream; 2969 if (llvm::Error Err = Stream.SkipBlock()) { 2970 Error(std::move(Err)); 2971 return Failure; 2972 } 2973 if (ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID)) { 2974 Error("malformed block record in AST file"); 2975 return Failure; 2976 } 2977 break; 2978 2979 case PREPROCESSOR_BLOCK_ID: 2980 F.MacroCursor = Stream; 2981 if (!PP.getExternalSource()) 2982 PP.setExternalSource(this); 2983 2984 if (llvm::Error Err = Stream.SkipBlock()) { 2985 Error(std::move(Err)); 2986 return Failure; 2987 } 2988 if (ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) { 2989 Error("malformed block record in AST file"); 2990 return Failure; 2991 } 2992 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo(); 2993 break; 2994 2995 case PREPROCESSOR_DETAIL_BLOCK_ID: 2996 F.PreprocessorDetailCursor = Stream; 2997 2998 if (llvm::Error Err = Stream.SkipBlock()) { 2999 Error(std::move(Err)); 3000 return Failure; 3001 } 3002 if (ReadBlockAbbrevs(F.PreprocessorDetailCursor, 3003 PREPROCESSOR_DETAIL_BLOCK_ID)) { 3004 Error("malformed preprocessor detail record in AST file"); 3005 return Failure; 3006 } 3007 F.PreprocessorDetailStartOffset 3008 = F.PreprocessorDetailCursor.GetCurrentBitNo(); 3009 3010 if (!PP.getPreprocessingRecord()) 3011 PP.createPreprocessingRecord(); 3012 if (!PP.getPreprocessingRecord()->getExternalSource()) 3013 PP.getPreprocessingRecord()->SetExternalSource(*this); 3014 break; 3015 3016 case SOURCE_MANAGER_BLOCK_ID: 3017 if (ReadSourceManagerBlock(F)) 3018 return Failure; 3019 break; 3020 3021 case SUBMODULE_BLOCK_ID: 3022 if (ASTReadResult Result = 3023 ReadSubmoduleBlock(F, ClientLoadCapabilities)) 3024 return Result; 3025 break; 3026 3027 case COMMENTS_BLOCK_ID: { 3028 BitstreamCursor C = Stream; 3029 3030 if (llvm::Error Err = Stream.SkipBlock()) { 3031 Error(std::move(Err)); 3032 return Failure; 3033 } 3034 if (ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) { 3035 Error("malformed comments block in AST file"); 3036 return Failure; 3037 } 3038 CommentsCursors.push_back(std::make_pair(C, &F)); 3039 break; 3040 } 3041 3042 default: 3043 if (llvm::Error Err = Stream.SkipBlock()) { 3044 Error(std::move(Err)); 3045 return Failure; 3046 } 3047 break; 3048 } 3049 continue; 3050 3051 case llvm::BitstreamEntry::Record: 3052 // The interesting case. 3053 break; 3054 } 3055 3056 // Read and process a record. 3057 Record.clear(); 3058 StringRef Blob; 3059 Expected<unsigned> MaybeRecordType = 3060 Stream.readRecord(Entry.ID, Record, &Blob); 3061 if (!MaybeRecordType) { 3062 Error(MaybeRecordType.takeError()); 3063 return Failure; 3064 } 3065 ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get(); 3066 3067 // If we're not loading an AST context, we don't care about most records. 3068 if (!ContextObj) { 3069 switch (RecordType) { 3070 case IDENTIFIER_TABLE: 3071 case IDENTIFIER_OFFSET: 3072 case INTERESTING_IDENTIFIERS: 3073 case STATISTICS: 3074 case PP_CONDITIONAL_STACK: 3075 case PP_COUNTER_VALUE: 3076 case SOURCE_LOCATION_OFFSETS: 3077 case MODULE_OFFSET_MAP: 3078 case SOURCE_MANAGER_LINE_TABLE: 3079 case SOURCE_LOCATION_PRELOADS: 3080 case PPD_ENTITIES_OFFSETS: 3081 case HEADER_SEARCH_TABLE: 3082 case IMPORTED_MODULES: 3083 case MACRO_OFFSET: 3084 break; 3085 default: 3086 continue; 3087 } 3088 } 3089 3090 switch (RecordType) { 3091 default: // Default behavior: ignore. 3092 break; 3093 3094 case TYPE_OFFSET: { 3095 if (F.LocalNumTypes != 0) { 3096 Error("duplicate TYPE_OFFSET record in AST file"); 3097 return Failure; 3098 } 3099 F.TypeOffsets = (const uint32_t *)Blob.data(); 3100 F.LocalNumTypes = Record[0]; 3101 unsigned LocalBaseTypeIndex = Record[1]; 3102 F.BaseTypeIndex = getTotalNumTypes(); 3103 3104 if (F.LocalNumTypes > 0) { 3105 // Introduce the global -> local mapping for types within this module. 3106 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F)); 3107 3108 // Introduce the local -> global mapping for types within this module. 3109 F.TypeRemap.insertOrReplace( 3110 std::make_pair(LocalBaseTypeIndex, 3111 F.BaseTypeIndex - LocalBaseTypeIndex)); 3112 3113 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes); 3114 } 3115 break; 3116 } 3117 3118 case DECL_OFFSET: { 3119 if (F.LocalNumDecls != 0) { 3120 Error("duplicate DECL_OFFSET record in AST file"); 3121 return Failure; 3122 } 3123 F.DeclOffsets = (const DeclOffset *)Blob.data(); 3124 F.LocalNumDecls = Record[0]; 3125 unsigned LocalBaseDeclID = Record[1]; 3126 F.BaseDeclID = getTotalNumDecls(); 3127 3128 if (F.LocalNumDecls > 0) { 3129 // Introduce the global -> local mapping for declarations within this 3130 // module. 3131 GlobalDeclMap.insert( 3132 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F)); 3133 3134 // Introduce the local -> global mapping for declarations within this 3135 // module. 3136 F.DeclRemap.insertOrReplace( 3137 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID)); 3138 3139 // Introduce the global -> local mapping for declarations within this 3140 // module. 3141 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID; 3142 3143 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls); 3144 } 3145 break; 3146 } 3147 3148 case TU_UPDATE_LEXICAL: { 3149 DeclContext *TU = ContextObj->getTranslationUnitDecl(); 3150 LexicalContents Contents( 3151 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 3152 Blob.data()), 3153 static_cast<unsigned int>(Blob.size() / 4)); 3154 TULexicalDecls.push_back(std::make_pair(&F, Contents)); 3155 TU->setHasExternalLexicalStorage(true); 3156 break; 3157 } 3158 3159 case UPDATE_VISIBLE: { 3160 unsigned Idx = 0; 3161 serialization::DeclID ID = ReadDeclID(F, Record, Idx); 3162 auto *Data = (const unsigned char*)Blob.data(); 3163 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data}); 3164 // If we've already loaded the decl, perform the updates when we finish 3165 // loading this block. 3166 if (Decl *D = GetExistingDecl(ID)) 3167 PendingUpdateRecords.push_back( 3168 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3169 break; 3170 } 3171 3172 case IDENTIFIER_TABLE: 3173 F.IdentifierTableData = Blob.data(); 3174 if (Record[0]) { 3175 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create( 3176 (const unsigned char *)F.IdentifierTableData + Record[0], 3177 (const unsigned char *)F.IdentifierTableData + sizeof(uint32_t), 3178 (const unsigned char *)F.IdentifierTableData, 3179 ASTIdentifierLookupTrait(*this, F)); 3180 3181 PP.getIdentifierTable().setExternalIdentifierLookup(this); 3182 } 3183 break; 3184 3185 case IDENTIFIER_OFFSET: { 3186 if (F.LocalNumIdentifiers != 0) { 3187 Error("duplicate IDENTIFIER_OFFSET record in AST file"); 3188 return Failure; 3189 } 3190 F.IdentifierOffsets = (const uint32_t *)Blob.data(); 3191 F.LocalNumIdentifiers = Record[0]; 3192 unsigned LocalBaseIdentifierID = Record[1]; 3193 F.BaseIdentifierID = getTotalNumIdentifiers(); 3194 3195 if (F.LocalNumIdentifiers > 0) { 3196 // Introduce the global -> local mapping for identifiers within this 3197 // module. 3198 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1, 3199 &F)); 3200 3201 // Introduce the local -> global mapping for identifiers within this 3202 // module. 3203 F.IdentifierRemap.insertOrReplace( 3204 std::make_pair(LocalBaseIdentifierID, 3205 F.BaseIdentifierID - LocalBaseIdentifierID)); 3206 3207 IdentifiersLoaded.resize(IdentifiersLoaded.size() 3208 + F.LocalNumIdentifiers); 3209 } 3210 break; 3211 } 3212 3213 case INTERESTING_IDENTIFIERS: 3214 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end()); 3215 break; 3216 3217 case EAGERLY_DESERIALIZED_DECLS: 3218 // FIXME: Skip reading this record if our ASTConsumer doesn't care 3219 // about "interesting" decls (for instance, if we're building a module). 3220 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3221 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3222 break; 3223 3224 case MODULAR_CODEGEN_DECLS: 3225 // FIXME: Skip reading this record if our ASTConsumer doesn't care about 3226 // them (ie: if we're not codegenerating this module). 3227 if (F.Kind == MK_MainFile) 3228 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3229 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3230 break; 3231 3232 case SPECIAL_TYPES: 3233 if (SpecialTypes.empty()) { 3234 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3235 SpecialTypes.push_back(getGlobalTypeID(F, Record[I])); 3236 break; 3237 } 3238 3239 if (SpecialTypes.size() != Record.size()) { 3240 Error("invalid special-types record"); 3241 return Failure; 3242 } 3243 3244 for (unsigned I = 0, N = Record.size(); I != N; ++I) { 3245 serialization::TypeID ID = getGlobalTypeID(F, Record[I]); 3246 if (!SpecialTypes[I]) 3247 SpecialTypes[I] = ID; 3248 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate 3249 // merge step? 3250 } 3251 break; 3252 3253 case STATISTICS: 3254 TotalNumStatements += Record[0]; 3255 TotalNumMacros += Record[1]; 3256 TotalLexicalDeclContexts += Record[2]; 3257 TotalVisibleDeclContexts += Record[3]; 3258 break; 3259 3260 case UNUSED_FILESCOPED_DECLS: 3261 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3262 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I])); 3263 break; 3264 3265 case DELEGATING_CTORS: 3266 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3267 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I])); 3268 break; 3269 3270 case WEAK_UNDECLARED_IDENTIFIERS: 3271 if (Record.size() % 4 != 0) { 3272 Error("invalid weak identifiers record"); 3273 return Failure; 3274 } 3275 3276 // FIXME: Ignore weak undeclared identifiers from non-original PCH 3277 // files. This isn't the way to do it :) 3278 WeakUndeclaredIdentifiers.clear(); 3279 3280 // Translate the weak, undeclared identifiers into global IDs. 3281 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) { 3282 WeakUndeclaredIdentifiers.push_back( 3283 getGlobalIdentifierID(F, Record[I++])); 3284 WeakUndeclaredIdentifiers.push_back( 3285 getGlobalIdentifierID(F, Record[I++])); 3286 WeakUndeclaredIdentifiers.push_back( 3287 ReadSourceLocation(F, Record, I).getRawEncoding()); 3288 WeakUndeclaredIdentifiers.push_back(Record[I++]); 3289 } 3290 break; 3291 3292 case SELECTOR_OFFSETS: { 3293 F.SelectorOffsets = (const uint32_t *)Blob.data(); 3294 F.LocalNumSelectors = Record[0]; 3295 unsigned LocalBaseSelectorID = Record[1]; 3296 F.BaseSelectorID = getTotalNumSelectors(); 3297 3298 if (F.LocalNumSelectors > 0) { 3299 // Introduce the global -> local mapping for selectors within this 3300 // module. 3301 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F)); 3302 3303 // Introduce the local -> global mapping for selectors within this 3304 // module. 3305 F.SelectorRemap.insertOrReplace( 3306 std::make_pair(LocalBaseSelectorID, 3307 F.BaseSelectorID - LocalBaseSelectorID)); 3308 3309 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors); 3310 } 3311 break; 3312 } 3313 3314 case METHOD_POOL: 3315 F.SelectorLookupTableData = (const unsigned char *)Blob.data(); 3316 if (Record[0]) 3317 F.SelectorLookupTable 3318 = ASTSelectorLookupTable::Create( 3319 F.SelectorLookupTableData + Record[0], 3320 F.SelectorLookupTableData, 3321 ASTSelectorLookupTrait(*this, F)); 3322 TotalNumMethodPoolEntries += Record[1]; 3323 break; 3324 3325 case REFERENCED_SELECTOR_POOL: 3326 if (!Record.empty()) { 3327 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) { 3328 ReferencedSelectorsData.push_back(getGlobalSelectorID(F, 3329 Record[Idx++])); 3330 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx). 3331 getRawEncoding()); 3332 } 3333 } 3334 break; 3335 3336 case PP_CONDITIONAL_STACK: 3337 if (!Record.empty()) { 3338 unsigned Idx = 0, End = Record.size() - 1; 3339 bool ReachedEOFWhileSkipping = Record[Idx++]; 3340 llvm::Optional<Preprocessor::PreambleSkipInfo> SkipInfo; 3341 if (ReachedEOFWhileSkipping) { 3342 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx); 3343 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx); 3344 bool FoundNonSkipPortion = Record[Idx++]; 3345 bool FoundElse = Record[Idx++]; 3346 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx); 3347 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion, 3348 FoundElse, ElseLoc); 3349 } 3350 SmallVector<PPConditionalInfo, 4> ConditionalStack; 3351 while (Idx < End) { 3352 auto Loc = ReadSourceLocation(F, Record, Idx); 3353 bool WasSkipping = Record[Idx++]; 3354 bool FoundNonSkip = Record[Idx++]; 3355 bool FoundElse = Record[Idx++]; 3356 ConditionalStack.push_back( 3357 {Loc, WasSkipping, FoundNonSkip, FoundElse}); 3358 } 3359 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo); 3360 } 3361 break; 3362 3363 case PP_COUNTER_VALUE: 3364 if (!Record.empty() && Listener) 3365 Listener->ReadCounter(F, Record[0]); 3366 break; 3367 3368 case FILE_SORTED_DECLS: 3369 F.FileSortedDecls = (const DeclID *)Blob.data(); 3370 F.NumFileSortedDecls = Record[0]; 3371 break; 3372 3373 case SOURCE_LOCATION_OFFSETS: { 3374 F.SLocEntryOffsets = (const uint32_t *)Blob.data(); 3375 F.LocalNumSLocEntries = Record[0]; 3376 unsigned SLocSpaceSize = Record[1]; 3377 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) = 3378 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries, 3379 SLocSpaceSize); 3380 if (!F.SLocEntryBaseID) { 3381 Error("ran out of source locations"); 3382 break; 3383 } 3384 // Make our entry in the range map. BaseID is negative and growing, so 3385 // we invert it. Because we invert it, though, we need the other end of 3386 // the range. 3387 unsigned RangeStart = 3388 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1; 3389 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F)); 3390 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset); 3391 3392 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing. 3393 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0); 3394 GlobalSLocOffsetMap.insert( 3395 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset 3396 - SLocSpaceSize,&F)); 3397 3398 // Initialize the remapping table. 3399 // Invalid stays invalid. 3400 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0)); 3401 // This module. Base was 2 when being compiled. 3402 F.SLocRemap.insertOrReplace(std::make_pair(2U, 3403 static_cast<int>(F.SLocEntryBaseOffset - 2))); 3404 3405 TotalNumSLocEntries += F.LocalNumSLocEntries; 3406 break; 3407 } 3408 3409 case MODULE_OFFSET_MAP: 3410 F.ModuleOffsetMap = Blob; 3411 break; 3412 3413 case SOURCE_MANAGER_LINE_TABLE: 3414 if (ParseLineTable(F, Record)) { 3415 Error("malformed SOURCE_MANAGER_LINE_TABLE in AST file"); 3416 return Failure; 3417 } 3418 break; 3419 3420 case SOURCE_LOCATION_PRELOADS: { 3421 // Need to transform from the local view (1-based IDs) to the global view, 3422 // which is based off F.SLocEntryBaseID. 3423 if (!F.PreloadSLocEntries.empty()) { 3424 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file"); 3425 return Failure; 3426 } 3427 3428 F.PreloadSLocEntries.swap(Record); 3429 break; 3430 } 3431 3432 case EXT_VECTOR_DECLS: 3433 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3434 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I])); 3435 break; 3436 3437 case VTABLE_USES: 3438 if (Record.size() % 3 != 0) { 3439 Error("Invalid VTABLE_USES record"); 3440 return Failure; 3441 } 3442 3443 // Later tables overwrite earlier ones. 3444 // FIXME: Modules will have some trouble with this. This is clearly not 3445 // the right way to do this. 3446 VTableUses.clear(); 3447 3448 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) { 3449 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++])); 3450 VTableUses.push_back( 3451 ReadSourceLocation(F, Record, Idx).getRawEncoding()); 3452 VTableUses.push_back(Record[Idx++]); 3453 } 3454 break; 3455 3456 case PENDING_IMPLICIT_INSTANTIATIONS: 3457 if (PendingInstantiations.size() % 2 != 0) { 3458 Error("Invalid existing PendingInstantiations"); 3459 return Failure; 3460 } 3461 3462 if (Record.size() % 2 != 0) { 3463 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block"); 3464 return Failure; 3465 } 3466 3467 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3468 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++])); 3469 PendingInstantiations.push_back( 3470 ReadSourceLocation(F, Record, I).getRawEncoding()); 3471 } 3472 break; 3473 3474 case SEMA_DECL_REFS: 3475 if (Record.size() != 3) { 3476 Error("Invalid SEMA_DECL_REFS block"); 3477 return Failure; 3478 } 3479 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3480 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3481 break; 3482 3483 case PPD_ENTITIES_OFFSETS: { 3484 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data(); 3485 assert(Blob.size() % sizeof(PPEntityOffset) == 0); 3486 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset); 3487 3488 unsigned LocalBasePreprocessedEntityID = Record[0]; 3489 3490 unsigned StartingID; 3491 if (!PP.getPreprocessingRecord()) 3492 PP.createPreprocessingRecord(); 3493 if (!PP.getPreprocessingRecord()->getExternalSource()) 3494 PP.getPreprocessingRecord()->SetExternalSource(*this); 3495 StartingID 3496 = PP.getPreprocessingRecord() 3497 ->allocateLoadedEntities(F.NumPreprocessedEntities); 3498 F.BasePreprocessedEntityID = StartingID; 3499 3500 if (F.NumPreprocessedEntities > 0) { 3501 // Introduce the global -> local mapping for preprocessed entities in 3502 // this module. 3503 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F)); 3504 3505 // Introduce the local -> global mapping for preprocessed entities in 3506 // this module. 3507 F.PreprocessedEntityRemap.insertOrReplace( 3508 std::make_pair(LocalBasePreprocessedEntityID, 3509 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID)); 3510 } 3511 3512 break; 3513 } 3514 3515 case PPD_SKIPPED_RANGES: { 3516 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data(); 3517 assert(Blob.size() % sizeof(PPSkippedRange) == 0); 3518 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange); 3519 3520 if (!PP.getPreprocessingRecord()) 3521 PP.createPreprocessingRecord(); 3522 if (!PP.getPreprocessingRecord()->getExternalSource()) 3523 PP.getPreprocessingRecord()->SetExternalSource(*this); 3524 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord() 3525 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges); 3526 3527 if (F.NumPreprocessedSkippedRanges > 0) 3528 GlobalSkippedRangeMap.insert( 3529 std::make_pair(F.BasePreprocessedSkippedRangeID, &F)); 3530 break; 3531 } 3532 3533 case DECL_UPDATE_OFFSETS: 3534 if (Record.size() % 2 != 0) { 3535 Error("invalid DECL_UPDATE_OFFSETS block in AST file"); 3536 return Failure; 3537 } 3538 for (unsigned I = 0, N = Record.size(); I != N; I += 2) { 3539 GlobalDeclID ID = getGlobalDeclID(F, Record[I]); 3540 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1])); 3541 3542 // If we've already loaded the decl, perform the updates when we finish 3543 // loading this block. 3544 if (Decl *D = GetExistingDecl(ID)) 3545 PendingUpdateRecords.push_back( 3546 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3547 } 3548 break; 3549 3550 case OBJC_CATEGORIES_MAP: 3551 if (F.LocalNumObjCCategoriesInMap != 0) { 3552 Error("duplicate OBJC_CATEGORIES_MAP record in AST file"); 3553 return Failure; 3554 } 3555 3556 F.LocalNumObjCCategoriesInMap = Record[0]; 3557 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data(); 3558 break; 3559 3560 case OBJC_CATEGORIES: 3561 F.ObjCCategories.swap(Record); 3562 break; 3563 3564 case CUDA_SPECIAL_DECL_REFS: 3565 // Later tables overwrite earlier ones. 3566 // FIXME: Modules will have trouble with this. 3567 CUDASpecialDeclRefs.clear(); 3568 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3569 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3570 break; 3571 3572 case HEADER_SEARCH_TABLE: 3573 F.HeaderFileInfoTableData = Blob.data(); 3574 F.LocalNumHeaderFileInfos = Record[1]; 3575 if (Record[0]) { 3576 F.HeaderFileInfoTable 3577 = HeaderFileInfoLookupTable::Create( 3578 (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 3579 (const unsigned char *)F.HeaderFileInfoTableData, 3580 HeaderFileInfoTrait(*this, F, 3581 &PP.getHeaderSearchInfo(), 3582 Blob.data() + Record[2])); 3583 3584 PP.getHeaderSearchInfo().SetExternalSource(this); 3585 if (!PP.getHeaderSearchInfo().getExternalLookup()) 3586 PP.getHeaderSearchInfo().SetExternalLookup(this); 3587 } 3588 break; 3589 3590 case FP_PRAGMA_OPTIONS: 3591 // Later tables overwrite earlier ones. 3592 FPPragmaOptions.swap(Record); 3593 break; 3594 3595 case OPENCL_EXTENSIONS: 3596 for (unsigned I = 0, E = Record.size(); I != E; ) { 3597 auto Name = ReadString(Record, I); 3598 auto &Opt = OpenCLExtensions.OptMap[Name]; 3599 Opt.Supported = Record[I++] != 0; 3600 Opt.Enabled = Record[I++] != 0; 3601 Opt.Avail = Record[I++]; 3602 Opt.Core = Record[I++]; 3603 } 3604 break; 3605 3606 case OPENCL_EXTENSION_TYPES: 3607 for (unsigned I = 0, E = Record.size(); I != E;) { 3608 auto TypeID = static_cast<::TypeID>(Record[I++]); 3609 auto *Type = GetType(TypeID).getTypePtr(); 3610 auto NumExt = static_cast<unsigned>(Record[I++]); 3611 for (unsigned II = 0; II != NumExt; ++II) { 3612 auto Ext = ReadString(Record, I); 3613 OpenCLTypeExtMap[Type].insert(Ext); 3614 } 3615 } 3616 break; 3617 3618 case OPENCL_EXTENSION_DECLS: 3619 for (unsigned I = 0, E = Record.size(); I != E;) { 3620 auto DeclID = static_cast<::DeclID>(Record[I++]); 3621 auto *Decl = GetDecl(DeclID); 3622 auto NumExt = static_cast<unsigned>(Record[I++]); 3623 for (unsigned II = 0; II != NumExt; ++II) { 3624 auto Ext = ReadString(Record, I); 3625 OpenCLDeclExtMap[Decl].insert(Ext); 3626 } 3627 } 3628 break; 3629 3630 case TENTATIVE_DEFINITIONS: 3631 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3632 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 3633 break; 3634 3635 case KNOWN_NAMESPACES: 3636 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3637 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 3638 break; 3639 3640 case UNDEFINED_BUT_USED: 3641 if (UndefinedButUsed.size() % 2 != 0) { 3642 Error("Invalid existing UndefinedButUsed"); 3643 return Failure; 3644 } 3645 3646 if (Record.size() % 2 != 0) { 3647 Error("invalid undefined-but-used record"); 3648 return Failure; 3649 } 3650 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3651 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 3652 UndefinedButUsed.push_back( 3653 ReadSourceLocation(F, Record, I).getRawEncoding()); 3654 } 3655 break; 3656 3657 case DELETE_EXPRS_TO_ANALYZE: 3658 for (unsigned I = 0, N = Record.size(); I != N;) { 3659 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++])); 3660 const uint64_t Count = Record[I++]; 3661 DelayedDeleteExprs.push_back(Count); 3662 for (uint64_t C = 0; C < Count; ++C) { 3663 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding()); 3664 bool IsArrayForm = Record[I++] == 1; 3665 DelayedDeleteExprs.push_back(IsArrayForm); 3666 } 3667 } 3668 break; 3669 3670 case IMPORTED_MODULES: 3671 if (!F.isModule()) { 3672 // If we aren't loading a module (which has its own exports), make 3673 // all of the imported modules visible. 3674 // FIXME: Deal with macros-only imports. 3675 for (unsigned I = 0, N = Record.size(); I != N; /**/) { 3676 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]); 3677 SourceLocation Loc = ReadSourceLocation(F, Record, I); 3678 if (GlobalID) { 3679 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc)); 3680 if (DeserializationListener) 3681 DeserializationListener->ModuleImportRead(GlobalID, Loc); 3682 } 3683 } 3684 } 3685 break; 3686 3687 case MACRO_OFFSET: { 3688 if (F.LocalNumMacros != 0) { 3689 Error("duplicate MACRO_OFFSET record in AST file"); 3690 return Failure; 3691 } 3692 F.MacroOffsets = (const uint32_t *)Blob.data(); 3693 F.LocalNumMacros = Record[0]; 3694 unsigned LocalBaseMacroID = Record[1]; 3695 F.BaseMacroID = getTotalNumMacros(); 3696 3697 if (F.LocalNumMacros > 0) { 3698 // Introduce the global -> local mapping for macros within this module. 3699 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 3700 3701 // Introduce the local -> global mapping for macros within this module. 3702 F.MacroRemap.insertOrReplace( 3703 std::make_pair(LocalBaseMacroID, 3704 F.BaseMacroID - LocalBaseMacroID)); 3705 3706 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 3707 } 3708 break; 3709 } 3710 3711 case LATE_PARSED_TEMPLATE: 3712 LateParsedTemplates.append(Record.begin(), Record.end()); 3713 break; 3714 3715 case OPTIMIZE_PRAGMA_OPTIONS: 3716 if (Record.size() != 1) { 3717 Error("invalid pragma optimize record"); 3718 return Failure; 3719 } 3720 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]); 3721 break; 3722 3723 case MSSTRUCT_PRAGMA_OPTIONS: 3724 if (Record.size() != 1) { 3725 Error("invalid pragma ms_struct record"); 3726 return Failure; 3727 } 3728 PragmaMSStructState = Record[0]; 3729 break; 3730 3731 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS: 3732 if (Record.size() != 2) { 3733 Error("invalid pragma ms_struct record"); 3734 return Failure; 3735 } 3736 PragmaMSPointersToMembersState = Record[0]; 3737 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]); 3738 break; 3739 3740 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES: 3741 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3742 UnusedLocalTypedefNameCandidates.push_back( 3743 getGlobalDeclID(F, Record[I])); 3744 break; 3745 3746 case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH: 3747 if (Record.size() != 1) { 3748 Error("invalid cuda pragma options record"); 3749 return Failure; 3750 } 3751 ForceCUDAHostDeviceDepth = Record[0]; 3752 break; 3753 3754 case PACK_PRAGMA_OPTIONS: { 3755 if (Record.size() < 3) { 3756 Error("invalid pragma pack record"); 3757 return Failure; 3758 } 3759 PragmaPackCurrentValue = Record[0]; 3760 PragmaPackCurrentLocation = ReadSourceLocation(F, Record[1]); 3761 unsigned NumStackEntries = Record[2]; 3762 unsigned Idx = 3; 3763 // Reset the stack when importing a new module. 3764 PragmaPackStack.clear(); 3765 for (unsigned I = 0; I < NumStackEntries; ++I) { 3766 PragmaPackStackEntry Entry; 3767 Entry.Value = Record[Idx++]; 3768 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3769 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3770 PragmaPackStrings.push_back(ReadString(Record, Idx)); 3771 Entry.SlotLabel = PragmaPackStrings.back(); 3772 PragmaPackStack.push_back(Entry); 3773 } 3774 break; 3775 } 3776 } 3777 } 3778 } 3779 3780 void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const { 3781 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read"); 3782 3783 // Additional remapping information. 3784 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data(); 3785 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size(); 3786 F.ModuleOffsetMap = StringRef(); 3787 3788 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders. 3789 if (F.SLocRemap.find(0) == F.SLocRemap.end()) { 3790 F.SLocRemap.insert(std::make_pair(0U, 0)); 3791 F.SLocRemap.insert(std::make_pair(2U, 1)); 3792 } 3793 3794 // Continuous range maps we may be updating in our module. 3795 using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder; 3796 RemapBuilder SLocRemap(F.SLocRemap); 3797 RemapBuilder IdentifierRemap(F.IdentifierRemap); 3798 RemapBuilder MacroRemap(F.MacroRemap); 3799 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap); 3800 RemapBuilder SubmoduleRemap(F.SubmoduleRemap); 3801 RemapBuilder SelectorRemap(F.SelectorRemap); 3802 RemapBuilder DeclRemap(F.DeclRemap); 3803 RemapBuilder TypeRemap(F.TypeRemap); 3804 3805 while (Data < DataEnd) { 3806 // FIXME: Looking up dependency modules by filename is horrible. Let's 3807 // start fixing this with prebuilt and explicit modules and see how it 3808 // goes... 3809 using namespace llvm::support; 3810 ModuleKind Kind = static_cast<ModuleKind>( 3811 endian::readNext<uint8_t, little, unaligned>(Data)); 3812 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data); 3813 StringRef Name = StringRef((const char*)Data, Len); 3814 Data += Len; 3815 ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule 3816 ? ModuleMgr.lookupByModuleName(Name) 3817 : ModuleMgr.lookupByFileName(Name)); 3818 if (!OM) { 3819 std::string Msg = 3820 "SourceLocation remap refers to unknown module, cannot find "; 3821 Msg.append(Name); 3822 Error(Msg); 3823 return; 3824 } 3825 3826 uint32_t SLocOffset = 3827 endian::readNext<uint32_t, little, unaligned>(Data); 3828 uint32_t IdentifierIDOffset = 3829 endian::readNext<uint32_t, little, unaligned>(Data); 3830 uint32_t MacroIDOffset = 3831 endian::readNext<uint32_t, little, unaligned>(Data); 3832 uint32_t PreprocessedEntityIDOffset = 3833 endian::readNext<uint32_t, little, unaligned>(Data); 3834 uint32_t SubmoduleIDOffset = 3835 endian::readNext<uint32_t, little, unaligned>(Data); 3836 uint32_t SelectorIDOffset = 3837 endian::readNext<uint32_t, little, unaligned>(Data); 3838 uint32_t DeclIDOffset = 3839 endian::readNext<uint32_t, little, unaligned>(Data); 3840 uint32_t TypeIndexOffset = 3841 endian::readNext<uint32_t, little, unaligned>(Data); 3842 3843 uint32_t None = std::numeric_limits<uint32_t>::max(); 3844 3845 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset, 3846 RemapBuilder &Remap) { 3847 if (Offset != None) 3848 Remap.insert(std::make_pair(Offset, 3849 static_cast<int>(BaseOffset - Offset))); 3850 }; 3851 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap); 3852 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap); 3853 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap); 3854 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID, 3855 PreprocessedEntityRemap); 3856 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap); 3857 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap); 3858 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap); 3859 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap); 3860 3861 // Global -> local mappings. 3862 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset; 3863 } 3864 } 3865 3866 ASTReader::ASTReadResult 3867 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F, 3868 const ModuleFile *ImportedBy, 3869 unsigned ClientLoadCapabilities) { 3870 unsigned Idx = 0; 3871 F.ModuleMapPath = ReadPath(F, Record, Idx); 3872 3873 // Try to resolve ModuleName in the current header search context and 3874 // verify that it is found in the same module map file as we saved. If the 3875 // top-level AST file is a main file, skip this check because there is no 3876 // usable header search context. 3877 assert(!F.ModuleName.empty() && 3878 "MODULE_NAME should come before MODULE_MAP_FILE"); 3879 if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) { 3880 // An implicitly-loaded module file should have its module listed in some 3881 // module map file that we've already loaded. 3882 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName); 3883 auto &Map = PP.getHeaderSearchInfo().getModuleMap(); 3884 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr; 3885 // Don't emit module relocation error if we have -fno-validate-pch 3886 if (!PP.getPreprocessorOpts().DisablePCHValidation && !ModMap) { 3887 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) { 3888 if (auto *ASTFE = M ? M->getASTFile() : nullptr) { 3889 // This module was defined by an imported (explicit) module. 3890 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName 3891 << ASTFE->getName(); 3892 } else { 3893 // This module was built with a different module map. 3894 Diag(diag::err_imported_module_not_found) 3895 << F.ModuleName << F.FileName 3896 << (ImportedBy ? ImportedBy->FileName : "") << F.ModuleMapPath 3897 << !ImportedBy; 3898 // In case it was imported by a PCH, there's a chance the user is 3899 // just missing to include the search path to the directory containing 3900 // the modulemap. 3901 if (ImportedBy && ImportedBy->Kind == MK_PCH) 3902 Diag(diag::note_imported_by_pch_module_not_found) 3903 << llvm::sys::path::parent_path(F.ModuleMapPath); 3904 } 3905 } 3906 return OutOfDate; 3907 } 3908 3909 assert(M->Name == F.ModuleName && "found module with different name"); 3910 3911 // Check the primary module map file. 3912 auto StoredModMap = FileMgr.getFile(F.ModuleMapPath); 3913 if (!StoredModMap || *StoredModMap != ModMap) { 3914 assert(ModMap && "found module is missing module map file"); 3915 assert((ImportedBy || F.Kind == MK_ImplicitModule) && 3916 "top-level import should be verified"); 3917 bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy; 3918 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3919 Diag(diag::err_imported_module_modmap_changed) 3920 << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName) 3921 << ModMap->getName() << F.ModuleMapPath << NotImported; 3922 return OutOfDate; 3923 } 3924 3925 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps; 3926 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) { 3927 // FIXME: we should use input files rather than storing names. 3928 std::string Filename = ReadPath(F, Record, Idx); 3929 auto F = FileMgr.getFile(Filename, false, false); 3930 if (!F) { 3931 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3932 Error("could not find file '" + Filename +"' referenced by AST file"); 3933 return OutOfDate; 3934 } 3935 AdditionalStoredMaps.insert(*F); 3936 } 3937 3938 // Check any additional module map files (e.g. module.private.modulemap) 3939 // that are not in the pcm. 3940 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) { 3941 for (const FileEntry *ModMap : *AdditionalModuleMaps) { 3942 // Remove files that match 3943 // Note: SmallPtrSet::erase is really remove 3944 if (!AdditionalStoredMaps.erase(ModMap)) { 3945 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3946 Diag(diag::err_module_different_modmap) 3947 << F.ModuleName << /*new*/0 << ModMap->getName(); 3948 return OutOfDate; 3949 } 3950 } 3951 } 3952 3953 // Check any additional module map files that are in the pcm, but not 3954 // found in header search. Cases that match are already removed. 3955 for (const FileEntry *ModMap : AdditionalStoredMaps) { 3956 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3957 Diag(diag::err_module_different_modmap) 3958 << F.ModuleName << /*not new*/1 << ModMap->getName(); 3959 return OutOfDate; 3960 } 3961 } 3962 3963 if (Listener) 3964 Listener->ReadModuleMapFile(F.ModuleMapPath); 3965 return Success; 3966 } 3967 3968 /// Move the given method to the back of the global list of methods. 3969 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 3970 // Find the entry for this selector in the method pool. 3971 Sema::GlobalMethodPool::iterator Known 3972 = S.MethodPool.find(Method->getSelector()); 3973 if (Known == S.MethodPool.end()) 3974 return; 3975 3976 // Retrieve the appropriate method list. 3977 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 3978 : Known->second.second; 3979 bool Found = false; 3980 for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 3981 if (!Found) { 3982 if (List->getMethod() == Method) { 3983 Found = true; 3984 } else { 3985 // Keep searching. 3986 continue; 3987 } 3988 } 3989 3990 if (List->getNext()) 3991 List->setMethod(List->getNext()->getMethod()); 3992 else 3993 List->setMethod(Method); 3994 } 3995 } 3996 3997 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) { 3998 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?"); 3999 for (Decl *D : Names) { 4000 bool wasHidden = D->isHidden(); 4001 D->setVisibleDespiteOwningModule(); 4002 4003 if (wasHidden && SemaObj) { 4004 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 4005 moveMethodToBackOfGlobalList(*SemaObj, Method); 4006 } 4007 } 4008 } 4009 } 4010 4011 void ASTReader::makeModuleVisible(Module *Mod, 4012 Module::NameVisibilityKind NameVisibility, 4013 SourceLocation ImportLoc) { 4014 llvm::SmallPtrSet<Module *, 4> Visited; 4015 SmallVector<Module *, 4> Stack; 4016 Stack.push_back(Mod); 4017 while (!Stack.empty()) { 4018 Mod = Stack.pop_back_val(); 4019 4020 if (NameVisibility <= Mod->NameVisibility) { 4021 // This module already has this level of visibility (or greater), so 4022 // there is nothing more to do. 4023 continue; 4024 } 4025 4026 if (!Mod->isAvailable()) { 4027 // Modules that aren't available cannot be made visible. 4028 continue; 4029 } 4030 4031 // Update the module's name visibility. 4032 Mod->NameVisibility = NameVisibility; 4033 4034 // If we've already deserialized any names from this module, 4035 // mark them as visible. 4036 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 4037 if (Hidden != HiddenNamesMap.end()) { 4038 auto HiddenNames = std::move(*Hidden); 4039 HiddenNamesMap.erase(Hidden); 4040 makeNamesVisible(HiddenNames.second, HiddenNames.first); 4041 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && 4042 "making names visible added hidden names"); 4043 } 4044 4045 // Push any exported modules onto the stack to be marked as visible. 4046 SmallVector<Module *, 16> Exports; 4047 Mod->getExportedModules(Exports); 4048 for (SmallVectorImpl<Module *>::iterator 4049 I = Exports.begin(), E = Exports.end(); I != E; ++I) { 4050 Module *Exported = *I; 4051 if (Visited.insert(Exported).second) 4052 Stack.push_back(Exported); 4053 } 4054 } 4055 } 4056 4057 /// We've merged the definition \p MergedDef into the existing definition 4058 /// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made 4059 /// visible. 4060 void ASTReader::mergeDefinitionVisibility(NamedDecl *Def, 4061 NamedDecl *MergedDef) { 4062 if (Def->isHidden()) { 4063 // If MergedDef is visible or becomes visible, make the definition visible. 4064 if (!MergedDef->isHidden()) 4065 Def->setVisibleDespiteOwningModule(); 4066 else { 4067 getContext().mergeDefinitionIntoModule( 4068 Def, MergedDef->getImportedOwningModule(), 4069 /*NotifyListeners*/ false); 4070 PendingMergedDefinitionsToDeduplicate.insert(Def); 4071 } 4072 } 4073 } 4074 4075 bool ASTReader::loadGlobalIndex() { 4076 if (GlobalIndex) 4077 return false; 4078 4079 if (TriedLoadingGlobalIndex || !UseGlobalIndex || 4080 !PP.getLangOpts().Modules) 4081 return true; 4082 4083 // Try to load the global index. 4084 TriedLoadingGlobalIndex = true; 4085 StringRef ModuleCachePath 4086 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 4087 std::pair<GlobalModuleIndex *, llvm::Error> Result = 4088 GlobalModuleIndex::readIndex(ModuleCachePath); 4089 if (llvm::Error Err = std::move(Result.second)) { 4090 assert(!Result.first); 4091 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 4092 return true; 4093 } 4094 4095 GlobalIndex.reset(Result.first); 4096 ModuleMgr.setGlobalIndex(GlobalIndex.get()); 4097 return false; 4098 } 4099 4100 bool ASTReader::isGlobalIndexUnavailable() const { 4101 return PP.getLangOpts().Modules && UseGlobalIndex && 4102 !hasGlobalIndex() && TriedLoadingGlobalIndex; 4103 } 4104 4105 static void updateModuleTimestamp(ModuleFile &MF) { 4106 // Overwrite the timestamp file contents so that file's mtime changes. 4107 std::string TimestampFilename = MF.getTimestampFilename(); 4108 std::error_code EC; 4109 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::OF_Text); 4110 if (EC) 4111 return; 4112 OS << "Timestamp file\n"; 4113 OS.close(); 4114 OS.clear_error(); // Avoid triggering a fatal error. 4115 } 4116 4117 /// Given a cursor at the start of an AST file, scan ahead and drop the 4118 /// cursor into the start of the given block ID, returning false on success and 4119 /// true on failure. 4120 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 4121 while (true) { 4122 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 4123 if (!MaybeEntry) { 4124 // FIXME this drops errors on the floor. 4125 consumeError(MaybeEntry.takeError()); 4126 return true; 4127 } 4128 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4129 4130 switch (Entry.Kind) { 4131 case llvm::BitstreamEntry::Error: 4132 case llvm::BitstreamEntry::EndBlock: 4133 return true; 4134 4135 case llvm::BitstreamEntry::Record: 4136 // Ignore top-level records. 4137 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID)) 4138 break; 4139 else { 4140 // FIXME this drops errors on the floor. 4141 consumeError(Skipped.takeError()); 4142 return true; 4143 } 4144 4145 case llvm::BitstreamEntry::SubBlock: 4146 if (Entry.ID == BlockID) { 4147 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) { 4148 // FIXME this drops the error on the floor. 4149 consumeError(std::move(Err)); 4150 return true; 4151 } 4152 // Found it! 4153 return false; 4154 } 4155 4156 if (llvm::Error Err = Cursor.SkipBlock()) { 4157 // FIXME this drops the error on the floor. 4158 consumeError(std::move(Err)); 4159 return true; 4160 } 4161 } 4162 } 4163 } 4164 4165 ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, 4166 ModuleKind Type, 4167 SourceLocation ImportLoc, 4168 unsigned ClientLoadCapabilities, 4169 SmallVectorImpl<ImportedSubmodule> *Imported) { 4170 llvm::SaveAndRestore<SourceLocation> 4171 SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 4172 4173 // Defer any pending actions until we get to the end of reading the AST file. 4174 Deserializing AnASTFile(this); 4175 4176 // Bump the generation number. 4177 unsigned PreviousGeneration = 0; 4178 if (ContextObj) 4179 PreviousGeneration = incrementGeneration(*ContextObj); 4180 4181 unsigned NumModules = ModuleMgr.size(); 4182 auto removeModulesAndReturn = [&](ASTReadResult ReadResult) { 4183 assert(ReadResult && "expected to return error"); 4184 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, 4185 PP.getLangOpts().Modules 4186 ? &PP.getHeaderSearchInfo().getModuleMap() 4187 : nullptr); 4188 4189 // If we find that any modules are unusable, the global index is going 4190 // to be out-of-date. Just remove it. 4191 GlobalIndex.reset(); 4192 ModuleMgr.setGlobalIndex(nullptr); 4193 return ReadResult; 4194 }; 4195 4196 SmallVector<ImportedModule, 4> Loaded; 4197 switch (ASTReadResult ReadResult = 4198 ReadASTCore(FileName, Type, ImportLoc, 4199 /*ImportedBy=*/nullptr, Loaded, 0, 0, 4200 ASTFileSignature(), ClientLoadCapabilities)) { 4201 case Failure: 4202 case Missing: 4203 case OutOfDate: 4204 case VersionMismatch: 4205 case ConfigurationMismatch: 4206 case HadErrors: 4207 return removeModulesAndReturn(ReadResult); 4208 case Success: 4209 break; 4210 } 4211 4212 // Here comes stuff that we only do once the entire chain is loaded. 4213 4214 // Load the AST blocks of all of the modules that we loaded. We can still 4215 // hit errors parsing the ASTs at this point. 4216 for (ImportedModule &M : Loaded) { 4217 ModuleFile &F = *M.Mod; 4218 4219 // Read the AST block. 4220 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities)) 4221 return removeModulesAndReturn(Result); 4222 4223 // The AST block should always have a definition for the main module. 4224 if (F.isModule() && !F.DidReadTopLevelSubmodule) { 4225 Error(diag::err_module_file_missing_top_level_submodule, F.FileName); 4226 return removeModulesAndReturn(Failure); 4227 } 4228 4229 // Read the extension blocks. 4230 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) { 4231 if (ASTReadResult Result = ReadExtensionBlock(F)) 4232 return removeModulesAndReturn(Result); 4233 } 4234 4235 // Once read, set the ModuleFile bit base offset and update the size in 4236 // bits of all files we've seen. 4237 F.GlobalBitOffset = TotalModulesSizeInBits; 4238 TotalModulesSizeInBits += F.SizeInBits; 4239 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 4240 } 4241 4242 // Preload source locations and interesting indentifiers. 4243 for (ImportedModule &M : Loaded) { 4244 ModuleFile &F = *M.Mod; 4245 4246 // Preload SLocEntries. 4247 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 4248 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 4249 // Load it through the SourceManager and don't call ReadSLocEntry() 4250 // directly because the entry may have already been loaded in which case 4251 // calling ReadSLocEntry() directly would trigger an assertion in 4252 // SourceManager. 4253 SourceMgr.getLoadedSLocEntryByID(Index); 4254 } 4255 4256 // Map the original source file ID into the ID space of the current 4257 // compilation. 4258 if (F.OriginalSourceFileID.isValid()) { 4259 F.OriginalSourceFileID = FileID::get( 4260 F.SLocEntryBaseID + F.OriginalSourceFileID.getOpaqueValue() - 1); 4261 } 4262 4263 // Preload all the pending interesting identifiers by marking them out of 4264 // date. 4265 for (auto Offset : F.PreloadIdentifierOffsets) { 4266 const unsigned char *Data = reinterpret_cast<const unsigned char *>( 4267 F.IdentifierTableData + Offset); 4268 4269 ASTIdentifierLookupTrait Trait(*this, F); 4270 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 4271 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 4272 auto &II = PP.getIdentifierTable().getOwn(Key); 4273 II.setOutOfDate(true); 4274 4275 // Mark this identifier as being from an AST file so that we can track 4276 // whether we need to serialize it. 4277 markIdentifierFromAST(*this, II); 4278 4279 // Associate the ID with the identifier so that the writer can reuse it. 4280 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first); 4281 SetIdentifierInfo(ID, &II); 4282 } 4283 } 4284 4285 // Setup the import locations and notify the module manager that we've 4286 // committed to these module files. 4287 for (ImportedModule &M : Loaded) { 4288 ModuleFile &F = *M.Mod; 4289 4290 ModuleMgr.moduleFileAccepted(&F); 4291 4292 // Set the import location. 4293 F.DirectImportLoc = ImportLoc; 4294 // FIXME: We assume that locations from PCH / preamble do not need 4295 // any translation. 4296 if (!M.ImportedBy) 4297 F.ImportLoc = M.ImportLoc; 4298 else 4299 F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc); 4300 } 4301 4302 if (!PP.getLangOpts().CPlusPlus || 4303 (Type != MK_ImplicitModule && Type != MK_ExplicitModule && 4304 Type != MK_PrebuiltModule)) { 4305 // Mark all of the identifiers in the identifier table as being out of date, 4306 // so that various accessors know to check the loaded modules when the 4307 // identifier is used. 4308 // 4309 // For C++ modules, we don't need information on many identifiers (just 4310 // those that provide macros or are poisoned), so we mark all of 4311 // the interesting ones via PreloadIdentifierOffsets. 4312 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 4313 IdEnd = PP.getIdentifierTable().end(); 4314 Id != IdEnd; ++Id) 4315 Id->second->setOutOfDate(true); 4316 } 4317 // Mark selectors as out of date. 4318 for (auto Sel : SelectorGeneration) 4319 SelectorOutOfDate[Sel.first] = true; 4320 4321 // Resolve any unresolved module exports. 4322 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) { 4323 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I]; 4324 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 4325 Module *ResolvedMod = getSubmodule(GlobalID); 4326 4327 switch (Unresolved.Kind) { 4328 case UnresolvedModuleRef::Conflict: 4329 if (ResolvedMod) { 4330 Module::Conflict Conflict; 4331 Conflict.Other = ResolvedMod; 4332 Conflict.Message = Unresolved.String.str(); 4333 Unresolved.Mod->Conflicts.push_back(Conflict); 4334 } 4335 continue; 4336 4337 case UnresolvedModuleRef::Import: 4338 if (ResolvedMod) 4339 Unresolved.Mod->Imports.insert(ResolvedMod); 4340 continue; 4341 4342 case UnresolvedModuleRef::Export: 4343 if (ResolvedMod || Unresolved.IsWildcard) 4344 Unresolved.Mod->Exports.push_back( 4345 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 4346 continue; 4347 } 4348 } 4349 UnresolvedModuleRefs.clear(); 4350 4351 if (Imported) 4352 Imported->append(ImportedModules.begin(), 4353 ImportedModules.end()); 4354 4355 // FIXME: How do we load the 'use'd modules? They may not be submodules. 4356 // Might be unnecessary as use declarations are only used to build the 4357 // module itself. 4358 4359 if (ContextObj) 4360 InitializeContext(); 4361 4362 if (SemaObj) 4363 UpdateSema(); 4364 4365 if (DeserializationListener) 4366 DeserializationListener->ReaderInitialized(this); 4367 4368 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 4369 if (PrimaryModule.OriginalSourceFileID.isValid()) { 4370 // If this AST file is a precompiled preamble, then set the 4371 // preamble file ID of the source manager to the file source file 4372 // from which the preamble was built. 4373 if (Type == MK_Preamble) { 4374 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 4375 } else if (Type == MK_MainFile) { 4376 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 4377 } 4378 } 4379 4380 // For any Objective-C class definitions we have already loaded, make sure 4381 // that we load any additional categories. 4382 if (ContextObj) { 4383 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 4384 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 4385 ObjCClassesLoaded[I], 4386 PreviousGeneration); 4387 } 4388 } 4389 4390 if (PP.getHeaderSearchInfo() 4391 .getHeaderSearchOpts() 4392 .ModulesValidateOncePerBuildSession) { 4393 // Now we are certain that the module and all modules it depends on are 4394 // up to date. Create or update timestamp files for modules that are 4395 // located in the module cache (not for PCH files that could be anywhere 4396 // in the filesystem). 4397 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) { 4398 ImportedModule &M = Loaded[I]; 4399 if (M.Mod->Kind == MK_ImplicitModule) { 4400 updateModuleTimestamp(*M.Mod); 4401 } 4402 } 4403 } 4404 4405 return Success; 4406 } 4407 4408 static ASTFileSignature readASTFileSignature(StringRef PCH); 4409 4410 /// Whether \p Stream doesn't start with the AST/PCH file magic number 'CPCH'. 4411 static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) { 4412 // FIXME checking magic headers is done in other places such as 4413 // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't 4414 // always done the same. Unify it all with a helper. 4415 if (!Stream.canSkipToPos(4)) 4416 return llvm::createStringError(std::errc::illegal_byte_sequence, 4417 "file too small to contain AST file magic"); 4418 for (unsigned C : {'C', 'P', 'C', 'H'}) 4419 if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) { 4420 if (Res.get() != C) 4421 return llvm::createStringError( 4422 std::errc::illegal_byte_sequence, 4423 "file doesn't start with AST file magic"); 4424 } else 4425 return Res.takeError(); 4426 return llvm::Error::success(); 4427 } 4428 4429 static unsigned moduleKindForDiagnostic(ModuleKind Kind) { 4430 switch (Kind) { 4431 case MK_PCH: 4432 return 0; // PCH 4433 case MK_ImplicitModule: 4434 case MK_ExplicitModule: 4435 case MK_PrebuiltModule: 4436 return 1; // module 4437 case MK_MainFile: 4438 case MK_Preamble: 4439 return 2; // main source file 4440 } 4441 llvm_unreachable("unknown module kind"); 4442 } 4443 4444 ASTReader::ASTReadResult 4445 ASTReader::ReadASTCore(StringRef FileName, 4446 ModuleKind Type, 4447 SourceLocation ImportLoc, 4448 ModuleFile *ImportedBy, 4449 SmallVectorImpl<ImportedModule> &Loaded, 4450 off_t ExpectedSize, time_t ExpectedModTime, 4451 ASTFileSignature ExpectedSignature, 4452 unsigned ClientLoadCapabilities) { 4453 ModuleFile *M; 4454 std::string ErrorStr; 4455 ModuleManager::AddModuleResult AddResult 4456 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy, 4457 getGeneration(), ExpectedSize, ExpectedModTime, 4458 ExpectedSignature, readASTFileSignature, 4459 M, ErrorStr); 4460 4461 switch (AddResult) { 4462 case ModuleManager::AlreadyLoaded: 4463 Diag(diag::remark_module_import) 4464 << M->ModuleName << M->FileName << (ImportedBy ? true : false) 4465 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 4466 return Success; 4467 4468 case ModuleManager::NewlyLoaded: 4469 // Load module file below. 4470 break; 4471 4472 case ModuleManager::Missing: 4473 // The module file was missing; if the client can handle that, return 4474 // it. 4475 if (ClientLoadCapabilities & ARR_Missing) 4476 return Missing; 4477 4478 // Otherwise, return an error. 4479 Diag(diag::err_module_file_not_found) << moduleKindForDiagnostic(Type) 4480 << FileName << !ErrorStr.empty() 4481 << ErrorStr; 4482 return Failure; 4483 4484 case ModuleManager::OutOfDate: 4485 // We couldn't load the module file because it is out-of-date. If the 4486 // client can handle out-of-date, return it. 4487 if (ClientLoadCapabilities & ARR_OutOfDate) 4488 return OutOfDate; 4489 4490 // Otherwise, return an error. 4491 Diag(diag::err_module_file_out_of_date) << moduleKindForDiagnostic(Type) 4492 << FileName << !ErrorStr.empty() 4493 << ErrorStr; 4494 return Failure; 4495 } 4496 4497 assert(M && "Missing module file"); 4498 4499 bool ShouldFinalizePCM = false; 4500 auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() { 4501 auto &MC = getModuleManager().getModuleCache(); 4502 if (ShouldFinalizePCM) 4503 MC.finalizePCM(FileName); 4504 else 4505 MC.tryToDropPCM(FileName); 4506 }); 4507 ModuleFile &F = *M; 4508 BitstreamCursor &Stream = F.Stream; 4509 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer)); 4510 F.SizeInBits = F.Buffer->getBufferSize() * 8; 4511 4512 // Sniff for the signature. 4513 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4514 Diag(diag::err_module_file_invalid) 4515 << moduleKindForDiagnostic(Type) << FileName << std::move(Err); 4516 return Failure; 4517 } 4518 4519 // This is used for compatibility with older PCH formats. 4520 bool HaveReadControlBlock = false; 4521 while (true) { 4522 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4523 if (!MaybeEntry) { 4524 Error(MaybeEntry.takeError()); 4525 return Failure; 4526 } 4527 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4528 4529 switch (Entry.Kind) { 4530 case llvm::BitstreamEntry::Error: 4531 case llvm::BitstreamEntry::Record: 4532 case llvm::BitstreamEntry::EndBlock: 4533 Error("invalid record at top-level of AST file"); 4534 return Failure; 4535 4536 case llvm::BitstreamEntry::SubBlock: 4537 break; 4538 } 4539 4540 switch (Entry.ID) { 4541 case CONTROL_BLOCK_ID: 4542 HaveReadControlBlock = true; 4543 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) { 4544 case Success: 4545 // Check that we didn't try to load a non-module AST file as a module. 4546 // 4547 // FIXME: Should we also perform the converse check? Loading a module as 4548 // a PCH file sort of works, but it's a bit wonky. 4549 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule || 4550 Type == MK_PrebuiltModule) && 4551 F.ModuleName.empty()) { 4552 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure; 4553 if (Result != OutOfDate || 4554 (ClientLoadCapabilities & ARR_OutOfDate) == 0) 4555 Diag(diag::err_module_file_not_module) << FileName; 4556 return Result; 4557 } 4558 break; 4559 4560 case Failure: return Failure; 4561 case Missing: return Missing; 4562 case OutOfDate: return OutOfDate; 4563 case VersionMismatch: return VersionMismatch; 4564 case ConfigurationMismatch: return ConfigurationMismatch; 4565 case HadErrors: return HadErrors; 4566 } 4567 break; 4568 4569 case AST_BLOCK_ID: 4570 if (!HaveReadControlBlock) { 4571 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 4572 Diag(diag::err_pch_version_too_old); 4573 return VersionMismatch; 4574 } 4575 4576 // Record that we've loaded this module. 4577 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 4578 ShouldFinalizePCM = true; 4579 return Success; 4580 4581 case UNHASHED_CONTROL_BLOCK_ID: 4582 // This block is handled using look-ahead during ReadControlBlock. We 4583 // shouldn't get here! 4584 Error("malformed block record in AST file"); 4585 return Failure; 4586 4587 default: 4588 if (llvm::Error Err = Stream.SkipBlock()) { 4589 Error(std::move(Err)); 4590 return Failure; 4591 } 4592 break; 4593 } 4594 } 4595 4596 llvm_unreachable("unexpected break; expected return"); 4597 } 4598 4599 ASTReader::ASTReadResult 4600 ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy, 4601 unsigned ClientLoadCapabilities) { 4602 const HeaderSearchOptions &HSOpts = 4603 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 4604 bool AllowCompatibleConfigurationMismatch = 4605 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 4606 4607 ASTReadResult Result = readUnhashedControlBlockImpl( 4608 &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch, 4609 Listener.get(), 4610 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions); 4611 4612 // If F was directly imported by another module, it's implicitly validated by 4613 // the importing module. 4614 if (DisableValidation || WasImportedBy || 4615 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 4616 return Success; 4617 4618 if (Result == Failure) { 4619 Error("malformed block record in AST file"); 4620 return Failure; 4621 } 4622 4623 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) { 4624 // If this module has already been finalized in the ModuleCache, we're stuck 4625 // with it; we can only load a single version of each module. 4626 // 4627 // This can happen when a module is imported in two contexts: in one, as a 4628 // user module; in another, as a system module (due to an import from 4629 // another module marked with the [system] flag). It usually indicates a 4630 // bug in the module map: this module should also be marked with [system]. 4631 // 4632 // If -Wno-system-headers (the default), and the first import is as a 4633 // system module, then validation will fail during the as-user import, 4634 // since -Werror flags won't have been validated. However, it's reasonable 4635 // to treat this consistently as a system module. 4636 // 4637 // If -Wsystem-headers, the PCM on disk was built with 4638 // -Wno-system-headers, and the first import is as a user module, then 4639 // validation will fail during the as-system import since the PCM on disk 4640 // doesn't guarantee that -Werror was respected. However, the -Werror 4641 // flags were checked during the initial as-user import. 4642 if (getModuleManager().getModuleCache().isPCMFinal(F.FileName)) { 4643 Diag(diag::warn_module_system_bit_conflict) << F.FileName; 4644 return Success; 4645 } 4646 } 4647 4648 return Result; 4649 } 4650 4651 ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl( 4652 ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities, 4653 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener, 4654 bool ValidateDiagnosticOptions) { 4655 // Initialize a stream. 4656 BitstreamCursor Stream(StreamData); 4657 4658 // Sniff for the signature. 4659 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4660 // FIXME this drops the error on the floor. 4661 consumeError(std::move(Err)); 4662 return Failure; 4663 } 4664 4665 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 4666 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 4667 return Failure; 4668 4669 // Read all of the records in the options block. 4670 RecordData Record; 4671 ASTReadResult Result = Success; 4672 while (true) { 4673 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4674 if (!MaybeEntry) { 4675 // FIXME this drops the error on the floor. 4676 consumeError(MaybeEntry.takeError()); 4677 return Failure; 4678 } 4679 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4680 4681 switch (Entry.Kind) { 4682 case llvm::BitstreamEntry::Error: 4683 case llvm::BitstreamEntry::SubBlock: 4684 return Failure; 4685 4686 case llvm::BitstreamEntry::EndBlock: 4687 return Result; 4688 4689 case llvm::BitstreamEntry::Record: 4690 // The interesting case. 4691 break; 4692 } 4693 4694 // Read and process a record. 4695 Record.clear(); 4696 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 4697 if (!MaybeRecordType) { 4698 // FIXME this drops the error. 4699 return Failure; 4700 } 4701 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) { 4702 case SIGNATURE: 4703 if (F) 4704 std::copy(Record.begin(), Record.end(), F->Signature.data()); 4705 break; 4706 case DIAGNOSTIC_OPTIONS: { 4707 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 4708 if (Listener && ValidateDiagnosticOptions && 4709 !AllowCompatibleConfigurationMismatch && 4710 ParseDiagnosticOptions(Record, Complain, *Listener)) 4711 Result = OutOfDate; // Don't return early. Read the signature. 4712 break; 4713 } 4714 case DIAG_PRAGMA_MAPPINGS: 4715 if (!F) 4716 break; 4717 if (F->PragmaDiagMappings.empty()) 4718 F->PragmaDiagMappings.swap(Record); 4719 else 4720 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(), 4721 Record.begin(), Record.end()); 4722 break; 4723 } 4724 } 4725 } 4726 4727 /// Parse a record and blob containing module file extension metadata. 4728 static bool parseModuleFileExtensionMetadata( 4729 const SmallVectorImpl<uint64_t> &Record, 4730 StringRef Blob, 4731 ModuleFileExtensionMetadata &Metadata) { 4732 if (Record.size() < 4) return true; 4733 4734 Metadata.MajorVersion = Record[0]; 4735 Metadata.MinorVersion = Record[1]; 4736 4737 unsigned BlockNameLen = Record[2]; 4738 unsigned UserInfoLen = Record[3]; 4739 4740 if (BlockNameLen + UserInfoLen > Blob.size()) return true; 4741 4742 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen); 4743 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen, 4744 Blob.data() + BlockNameLen + UserInfoLen); 4745 return false; 4746 } 4747 4748 ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) { 4749 BitstreamCursor &Stream = F.Stream; 4750 4751 RecordData Record; 4752 while (true) { 4753 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4754 if (!MaybeEntry) { 4755 Error(MaybeEntry.takeError()); 4756 return Failure; 4757 } 4758 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4759 4760 switch (Entry.Kind) { 4761 case llvm::BitstreamEntry::SubBlock: 4762 if (llvm::Error Err = Stream.SkipBlock()) { 4763 Error(std::move(Err)); 4764 return Failure; 4765 } 4766 continue; 4767 4768 case llvm::BitstreamEntry::EndBlock: 4769 return Success; 4770 4771 case llvm::BitstreamEntry::Error: 4772 return HadErrors; 4773 4774 case llvm::BitstreamEntry::Record: 4775 break; 4776 } 4777 4778 Record.clear(); 4779 StringRef Blob; 4780 Expected<unsigned> MaybeRecCode = 4781 Stream.readRecord(Entry.ID, Record, &Blob); 4782 if (!MaybeRecCode) { 4783 Error(MaybeRecCode.takeError()); 4784 return Failure; 4785 } 4786 switch (MaybeRecCode.get()) { 4787 case EXTENSION_METADATA: { 4788 ModuleFileExtensionMetadata Metadata; 4789 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) { 4790 Error("malformed EXTENSION_METADATA in AST file"); 4791 return Failure; 4792 } 4793 4794 // Find a module file extension with this block name. 4795 auto Known = ModuleFileExtensions.find(Metadata.BlockName); 4796 if (Known == ModuleFileExtensions.end()) break; 4797 4798 // Form a reader. 4799 if (auto Reader = Known->second->createExtensionReader(Metadata, *this, 4800 F, Stream)) { 4801 F.ExtensionReaders.push_back(std::move(Reader)); 4802 } 4803 4804 break; 4805 } 4806 } 4807 } 4808 4809 return Success; 4810 } 4811 4812 void ASTReader::InitializeContext() { 4813 assert(ContextObj && "no context to initialize"); 4814 ASTContext &Context = *ContextObj; 4815 4816 // If there's a listener, notify them that we "read" the translation unit. 4817 if (DeserializationListener) 4818 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 4819 Context.getTranslationUnitDecl()); 4820 4821 // FIXME: Find a better way to deal with collisions between these 4822 // built-in types. Right now, we just ignore the problem. 4823 4824 // Load the special types. 4825 if (SpecialTypes.size() >= NumSpecialTypeIDs) { 4826 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 4827 if (!Context.CFConstantStringTypeDecl) 4828 Context.setCFConstantStringType(GetType(String)); 4829 } 4830 4831 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 4832 QualType FileType = GetType(File); 4833 if (FileType.isNull()) { 4834 Error("FILE type is NULL"); 4835 return; 4836 } 4837 4838 if (!Context.FILEDecl) { 4839 if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 4840 Context.setFILEDecl(Typedef->getDecl()); 4841 else { 4842 const TagType *Tag = FileType->getAs<TagType>(); 4843 if (!Tag) { 4844 Error("Invalid FILE type in AST file"); 4845 return; 4846 } 4847 Context.setFILEDecl(Tag->getDecl()); 4848 } 4849 } 4850 } 4851 4852 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 4853 QualType Jmp_bufType = GetType(Jmp_buf); 4854 if (Jmp_bufType.isNull()) { 4855 Error("jmp_buf type is NULL"); 4856 return; 4857 } 4858 4859 if (!Context.jmp_bufDecl) { 4860 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 4861 Context.setjmp_bufDecl(Typedef->getDecl()); 4862 else { 4863 const TagType *Tag = Jmp_bufType->getAs<TagType>(); 4864 if (!Tag) { 4865 Error("Invalid jmp_buf type in AST file"); 4866 return; 4867 } 4868 Context.setjmp_bufDecl(Tag->getDecl()); 4869 } 4870 } 4871 } 4872 4873 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 4874 QualType Sigjmp_bufType = GetType(Sigjmp_buf); 4875 if (Sigjmp_bufType.isNull()) { 4876 Error("sigjmp_buf type is NULL"); 4877 return; 4878 } 4879 4880 if (!Context.sigjmp_bufDecl) { 4881 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 4882 Context.setsigjmp_bufDecl(Typedef->getDecl()); 4883 else { 4884 const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 4885 assert(Tag && "Invalid sigjmp_buf type in AST file"); 4886 Context.setsigjmp_bufDecl(Tag->getDecl()); 4887 } 4888 } 4889 } 4890 4891 if (unsigned ObjCIdRedef 4892 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 4893 if (Context.ObjCIdRedefinitionType.isNull()) 4894 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 4895 } 4896 4897 if (unsigned ObjCClassRedef 4898 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 4899 if (Context.ObjCClassRedefinitionType.isNull()) 4900 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 4901 } 4902 4903 if (unsigned ObjCSelRedef 4904 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 4905 if (Context.ObjCSelRedefinitionType.isNull()) 4906 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 4907 } 4908 4909 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 4910 QualType Ucontext_tType = GetType(Ucontext_t); 4911 if (Ucontext_tType.isNull()) { 4912 Error("ucontext_t type is NULL"); 4913 return; 4914 } 4915 4916 if (!Context.ucontext_tDecl) { 4917 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 4918 Context.setucontext_tDecl(Typedef->getDecl()); 4919 else { 4920 const TagType *Tag = Ucontext_tType->getAs<TagType>(); 4921 assert(Tag && "Invalid ucontext_t type in AST file"); 4922 Context.setucontext_tDecl(Tag->getDecl()); 4923 } 4924 } 4925 } 4926 } 4927 4928 ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 4929 4930 // If there were any CUDA special declarations, deserialize them. 4931 if (!CUDASpecialDeclRefs.empty()) { 4932 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 4933 Context.setcudaConfigureCallDecl( 4934 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 4935 } 4936 4937 // Re-export any modules that were imported by a non-module AST file. 4938 // FIXME: This does not make macro-only imports visible again. 4939 for (auto &Import : ImportedModules) { 4940 if (Module *Imported = getSubmodule(Import.ID)) { 4941 makeModuleVisible(Imported, Module::AllVisible, 4942 /*ImportLoc=*/Import.ImportLoc); 4943 if (Import.ImportLoc.isValid()) 4944 PP.makeModuleVisible(Imported, Import.ImportLoc); 4945 // FIXME: should we tell Sema to make the module visible too? 4946 } 4947 } 4948 ImportedModules.clear(); 4949 } 4950 4951 void ASTReader::finalizeForWriting() { 4952 // Nothing to do for now. 4953 } 4954 4955 /// Reads and return the signature record from \p PCH's control block, or 4956 /// else returns 0. 4957 static ASTFileSignature readASTFileSignature(StringRef PCH) { 4958 BitstreamCursor Stream(PCH); 4959 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4960 // FIXME this drops the error on the floor. 4961 consumeError(std::move(Err)); 4962 return ASTFileSignature(); 4963 } 4964 4965 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 4966 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 4967 return ASTFileSignature(); 4968 4969 // Scan for SIGNATURE inside the diagnostic options block. 4970 ASTReader::RecordData Record; 4971 while (true) { 4972 Expected<llvm::BitstreamEntry> MaybeEntry = 4973 Stream.advanceSkippingSubblocks(); 4974 if (!MaybeEntry) { 4975 // FIXME this drops the error on the floor. 4976 consumeError(MaybeEntry.takeError()); 4977 return ASTFileSignature(); 4978 } 4979 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4980 4981 if (Entry.Kind != llvm::BitstreamEntry::Record) 4982 return ASTFileSignature(); 4983 4984 Record.clear(); 4985 StringRef Blob; 4986 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 4987 if (!MaybeRecord) { 4988 // FIXME this drops the error on the floor. 4989 consumeError(MaybeRecord.takeError()); 4990 return ASTFileSignature(); 4991 } 4992 if (SIGNATURE == MaybeRecord.get()) 4993 return {{{(uint32_t)Record[0], (uint32_t)Record[1], (uint32_t)Record[2], 4994 (uint32_t)Record[3], (uint32_t)Record[4]}}}; 4995 } 4996 } 4997 4998 /// Retrieve the name of the original source file name 4999 /// directly from the AST file, without actually loading the AST 5000 /// file. 5001 std::string ASTReader::getOriginalSourceFile( 5002 const std::string &ASTFileName, FileManager &FileMgr, 5003 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) { 5004 // Open the AST file. 5005 auto Buffer = FileMgr.getBufferForFile(ASTFileName); 5006 if (!Buffer) { 5007 Diags.Report(diag::err_fe_unable_to_read_pch_file) 5008 << ASTFileName << Buffer.getError().message(); 5009 return std::string(); 5010 } 5011 5012 // Initialize the stream 5013 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer)); 5014 5015 // Sniff for the signature. 5016 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5017 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err); 5018 return std::string(); 5019 } 5020 5021 // Scan for the CONTROL_BLOCK_ID block. 5022 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 5023 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5024 return std::string(); 5025 } 5026 5027 // Scan for ORIGINAL_FILE inside the control block. 5028 RecordData Record; 5029 while (true) { 5030 Expected<llvm::BitstreamEntry> MaybeEntry = 5031 Stream.advanceSkippingSubblocks(); 5032 if (!MaybeEntry) { 5033 // FIXME this drops errors on the floor. 5034 consumeError(MaybeEntry.takeError()); 5035 return std::string(); 5036 } 5037 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5038 5039 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 5040 return std::string(); 5041 5042 if (Entry.Kind != llvm::BitstreamEntry::Record) { 5043 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5044 return std::string(); 5045 } 5046 5047 Record.clear(); 5048 StringRef Blob; 5049 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5050 if (!MaybeRecord) { 5051 // FIXME this drops the errors on the floor. 5052 consumeError(MaybeRecord.takeError()); 5053 return std::string(); 5054 } 5055 if (ORIGINAL_FILE == MaybeRecord.get()) 5056 return Blob.str(); 5057 } 5058 } 5059 5060 namespace { 5061 5062 class SimplePCHValidator : public ASTReaderListener { 5063 const LangOptions &ExistingLangOpts; 5064 const TargetOptions &ExistingTargetOpts; 5065 const PreprocessorOptions &ExistingPPOpts; 5066 std::string ExistingModuleCachePath; 5067 FileManager &FileMgr; 5068 5069 public: 5070 SimplePCHValidator(const LangOptions &ExistingLangOpts, 5071 const TargetOptions &ExistingTargetOpts, 5072 const PreprocessorOptions &ExistingPPOpts, 5073 StringRef ExistingModuleCachePath, 5074 FileManager &FileMgr) 5075 : ExistingLangOpts(ExistingLangOpts), 5076 ExistingTargetOpts(ExistingTargetOpts), 5077 ExistingPPOpts(ExistingPPOpts), 5078 ExistingModuleCachePath(ExistingModuleCachePath), 5079 FileMgr(FileMgr) {} 5080 5081 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, 5082 bool AllowCompatibleDifferences) override { 5083 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr, 5084 AllowCompatibleDifferences); 5085 } 5086 5087 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, 5088 bool AllowCompatibleDifferences) override { 5089 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr, 5090 AllowCompatibleDifferences); 5091 } 5092 5093 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 5094 StringRef SpecificModuleCachePath, 5095 bool Complain) override { 5096 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5097 ExistingModuleCachePath, 5098 nullptr, ExistingLangOpts); 5099 } 5100 5101 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 5102 bool Complain, 5103 std::string &SuggestedPredefines) override { 5104 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr, 5105 SuggestedPredefines, ExistingLangOpts); 5106 } 5107 }; 5108 5109 } // namespace 5110 5111 bool ASTReader::readASTFileControlBlock( 5112 StringRef Filename, FileManager &FileMgr, 5113 const PCHContainerReader &PCHContainerRdr, 5114 bool FindModuleFileExtensions, 5115 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) { 5116 // Open the AST file. 5117 // FIXME: This allows use of the VFS; we do not allow use of the 5118 // VFS when actually loading a module. 5119 auto Buffer = FileMgr.getBufferForFile(Filename); 5120 if (!Buffer) { 5121 return true; 5122 } 5123 5124 // Initialize the stream 5125 StringRef Bytes = PCHContainerRdr.ExtractPCH(**Buffer); 5126 BitstreamCursor Stream(Bytes); 5127 5128 // Sniff for the signature. 5129 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5130 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 5131 return true; 5132 } 5133 5134 // Scan for the CONTROL_BLOCK_ID block. 5135 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 5136 return true; 5137 5138 bool NeedsInputFiles = Listener.needsInputFileVisitation(); 5139 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation(); 5140 bool NeedsImports = Listener.needsImportVisitation(); 5141 BitstreamCursor InputFilesCursor; 5142 5143 RecordData Record; 5144 std::string ModuleDir; 5145 bool DoneWithControlBlock = false; 5146 while (!DoneWithControlBlock) { 5147 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5148 if (!MaybeEntry) { 5149 // FIXME this drops the error on the floor. 5150 consumeError(MaybeEntry.takeError()); 5151 return true; 5152 } 5153 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5154 5155 switch (Entry.Kind) { 5156 case llvm::BitstreamEntry::SubBlock: { 5157 switch (Entry.ID) { 5158 case OPTIONS_BLOCK_ID: { 5159 std::string IgnoredSuggestedPredefines; 5160 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate, 5161 /*AllowCompatibleConfigurationMismatch*/ false, 5162 Listener, IgnoredSuggestedPredefines) != Success) 5163 return true; 5164 break; 5165 } 5166 5167 case INPUT_FILES_BLOCK_ID: 5168 InputFilesCursor = Stream; 5169 if (llvm::Error Err = Stream.SkipBlock()) { 5170 // FIXME this drops the error on the floor. 5171 consumeError(std::move(Err)); 5172 return true; 5173 } 5174 if (NeedsInputFiles && 5175 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID)) 5176 return true; 5177 break; 5178 5179 default: 5180 if (llvm::Error Err = Stream.SkipBlock()) { 5181 // FIXME this drops the error on the floor. 5182 consumeError(std::move(Err)); 5183 return true; 5184 } 5185 break; 5186 } 5187 5188 continue; 5189 } 5190 5191 case llvm::BitstreamEntry::EndBlock: 5192 DoneWithControlBlock = true; 5193 break; 5194 5195 case llvm::BitstreamEntry::Error: 5196 return true; 5197 5198 case llvm::BitstreamEntry::Record: 5199 break; 5200 } 5201 5202 if (DoneWithControlBlock) break; 5203 5204 Record.clear(); 5205 StringRef Blob; 5206 Expected<unsigned> MaybeRecCode = 5207 Stream.readRecord(Entry.ID, Record, &Blob); 5208 if (!MaybeRecCode) { 5209 // FIXME this drops the error. 5210 return Failure; 5211 } 5212 switch ((ControlRecordTypes)MaybeRecCode.get()) { 5213 case METADATA: 5214 if (Record[0] != VERSION_MAJOR) 5215 return true; 5216 if (Listener.ReadFullVersionInformation(Blob)) 5217 return true; 5218 break; 5219 case MODULE_NAME: 5220 Listener.ReadModuleName(Blob); 5221 break; 5222 case MODULE_DIRECTORY: 5223 ModuleDir = Blob; 5224 break; 5225 case MODULE_MAP_FILE: { 5226 unsigned Idx = 0; 5227 auto Path = ReadString(Record, Idx); 5228 ResolveImportedPath(Path, ModuleDir); 5229 Listener.ReadModuleMapFile(Path); 5230 break; 5231 } 5232 case INPUT_FILE_OFFSETS: { 5233 if (!NeedsInputFiles) 5234 break; 5235 5236 unsigned NumInputFiles = Record[0]; 5237 unsigned NumUserFiles = Record[1]; 5238 const llvm::support::unaligned_uint64_t *InputFileOffs = 5239 (const llvm::support::unaligned_uint64_t *)Blob.data(); 5240 for (unsigned I = 0; I != NumInputFiles; ++I) { 5241 // Go find this input file. 5242 bool isSystemFile = I >= NumUserFiles; 5243 5244 if (isSystemFile && !NeedsSystemInputFiles) 5245 break; // the rest are system input files 5246 5247 BitstreamCursor &Cursor = InputFilesCursor; 5248 SavedStreamPosition SavedPosition(Cursor); 5249 if (llvm::Error Err = Cursor.JumpToBit(InputFileOffs[I])) { 5250 // FIXME this drops errors on the floor. 5251 consumeError(std::move(Err)); 5252 } 5253 5254 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 5255 if (!MaybeCode) { 5256 // FIXME this drops errors on the floor. 5257 consumeError(MaybeCode.takeError()); 5258 } 5259 unsigned Code = MaybeCode.get(); 5260 5261 RecordData Record; 5262 StringRef Blob; 5263 bool shouldContinue = false; 5264 Expected<unsigned> MaybeRecordType = 5265 Cursor.readRecord(Code, Record, &Blob); 5266 if (!MaybeRecordType) { 5267 // FIXME this drops errors on the floor. 5268 consumeError(MaybeRecordType.takeError()); 5269 } 5270 switch ((InputFileRecordTypes)MaybeRecordType.get()) { 5271 case INPUT_FILE_HASH: 5272 break; 5273 case INPUT_FILE: 5274 bool Overridden = static_cast<bool>(Record[3]); 5275 std::string Filename = Blob; 5276 ResolveImportedPath(Filename, ModuleDir); 5277 shouldContinue = Listener.visitInputFile( 5278 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false); 5279 break; 5280 } 5281 if (!shouldContinue) 5282 break; 5283 } 5284 break; 5285 } 5286 5287 case IMPORTS: { 5288 if (!NeedsImports) 5289 break; 5290 5291 unsigned Idx = 0, N = Record.size(); 5292 while (Idx < N) { 5293 // Read information about the AST file. 5294 Idx += 1+1+1+1+5; // Kind, ImportLoc, Size, ModTime, Signature 5295 std::string ModuleName = ReadString(Record, Idx); 5296 std::string Filename = ReadString(Record, Idx); 5297 ResolveImportedPath(Filename, ModuleDir); 5298 Listener.visitImport(ModuleName, Filename); 5299 } 5300 break; 5301 } 5302 5303 default: 5304 // No other validation to perform. 5305 break; 5306 } 5307 } 5308 5309 // Look for module file extension blocks, if requested. 5310 if (FindModuleFileExtensions) { 5311 BitstreamCursor SavedStream = Stream; 5312 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) { 5313 bool DoneWithExtensionBlock = false; 5314 while (!DoneWithExtensionBlock) { 5315 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5316 if (!MaybeEntry) { 5317 // FIXME this drops the error. 5318 return true; 5319 } 5320 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5321 5322 switch (Entry.Kind) { 5323 case llvm::BitstreamEntry::SubBlock: 5324 if (llvm::Error Err = Stream.SkipBlock()) { 5325 // FIXME this drops the error on the floor. 5326 consumeError(std::move(Err)); 5327 return true; 5328 } 5329 continue; 5330 5331 case llvm::BitstreamEntry::EndBlock: 5332 DoneWithExtensionBlock = true; 5333 continue; 5334 5335 case llvm::BitstreamEntry::Error: 5336 return true; 5337 5338 case llvm::BitstreamEntry::Record: 5339 break; 5340 } 5341 5342 Record.clear(); 5343 StringRef Blob; 5344 Expected<unsigned> MaybeRecCode = 5345 Stream.readRecord(Entry.ID, Record, &Blob); 5346 if (!MaybeRecCode) { 5347 // FIXME this drops the error. 5348 return true; 5349 } 5350 switch (MaybeRecCode.get()) { 5351 case EXTENSION_METADATA: { 5352 ModuleFileExtensionMetadata Metadata; 5353 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 5354 return true; 5355 5356 Listener.readModuleFileExtension(Metadata); 5357 break; 5358 } 5359 } 5360 } 5361 } 5362 Stream = SavedStream; 5363 } 5364 5365 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 5366 if (readUnhashedControlBlockImpl( 5367 nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate, 5368 /*AllowCompatibleConfigurationMismatch*/ false, &Listener, 5369 ValidateDiagnosticOptions) != Success) 5370 return true; 5371 5372 return false; 5373 } 5374 5375 bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, 5376 const PCHContainerReader &PCHContainerRdr, 5377 const LangOptions &LangOpts, 5378 const TargetOptions &TargetOpts, 5379 const PreprocessorOptions &PPOpts, 5380 StringRef ExistingModuleCachePath) { 5381 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, 5382 ExistingModuleCachePath, FileMgr); 5383 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr, 5384 /*FindModuleFileExtensions=*/false, 5385 validator, 5386 /*ValidateDiagnosticOptions=*/true); 5387 } 5388 5389 ASTReader::ASTReadResult 5390 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 5391 // Enter the submodule block. 5392 if (llvm::Error Err = F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) { 5393 Error(std::move(Err)); 5394 return Failure; 5395 } 5396 5397 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 5398 bool First = true; 5399 Module *CurrentModule = nullptr; 5400 RecordData Record; 5401 while (true) { 5402 Expected<llvm::BitstreamEntry> MaybeEntry = 5403 F.Stream.advanceSkippingSubblocks(); 5404 if (!MaybeEntry) { 5405 Error(MaybeEntry.takeError()); 5406 return Failure; 5407 } 5408 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5409 5410 switch (Entry.Kind) { 5411 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 5412 case llvm::BitstreamEntry::Error: 5413 Error("malformed block record in AST file"); 5414 return Failure; 5415 case llvm::BitstreamEntry::EndBlock: 5416 return Success; 5417 case llvm::BitstreamEntry::Record: 5418 // The interesting case. 5419 break; 5420 } 5421 5422 // Read a record. 5423 StringRef Blob; 5424 Record.clear(); 5425 Expected<unsigned> MaybeKind = F.Stream.readRecord(Entry.ID, Record, &Blob); 5426 if (!MaybeKind) { 5427 Error(MaybeKind.takeError()); 5428 return Failure; 5429 } 5430 unsigned Kind = MaybeKind.get(); 5431 5432 if ((Kind == SUBMODULE_METADATA) != First) { 5433 Error("submodule metadata record should be at beginning of block"); 5434 return Failure; 5435 } 5436 First = false; 5437 5438 // Submodule information is only valid if we have a current module. 5439 // FIXME: Should we error on these cases? 5440 if (!CurrentModule && Kind != SUBMODULE_METADATA && 5441 Kind != SUBMODULE_DEFINITION) 5442 continue; 5443 5444 switch (Kind) { 5445 default: // Default behavior: ignore. 5446 break; 5447 5448 case SUBMODULE_DEFINITION: { 5449 if (Record.size() < 12) { 5450 Error("malformed module definition"); 5451 return Failure; 5452 } 5453 5454 StringRef Name = Blob; 5455 unsigned Idx = 0; 5456 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]); 5457 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]); 5458 Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++]; 5459 bool IsFramework = Record[Idx++]; 5460 bool IsExplicit = Record[Idx++]; 5461 bool IsSystem = Record[Idx++]; 5462 bool IsExternC = Record[Idx++]; 5463 bool InferSubmodules = Record[Idx++]; 5464 bool InferExplicitSubmodules = Record[Idx++]; 5465 bool InferExportWildcard = Record[Idx++]; 5466 bool ConfigMacrosExhaustive = Record[Idx++]; 5467 bool ModuleMapIsPrivate = Record[Idx++]; 5468 5469 Module *ParentModule = nullptr; 5470 if (Parent) 5471 ParentModule = getSubmodule(Parent); 5472 5473 // Retrieve this (sub)module from the module map, creating it if 5474 // necessary. 5475 CurrentModule = 5476 ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit) 5477 .first; 5478 5479 // FIXME: set the definition loc for CurrentModule, or call 5480 // ModMap.setInferredModuleAllowedBy() 5481 5482 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 5483 if (GlobalIndex >= SubmodulesLoaded.size() || 5484 SubmodulesLoaded[GlobalIndex]) { 5485 Error("too many submodules"); 5486 return Failure; 5487 } 5488 5489 if (!ParentModule) { 5490 if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 5491 // Don't emit module relocation error if we have -fno-validate-pch 5492 if (!PP.getPreprocessorOpts().DisablePCHValidation && 5493 CurFile != F.File) { 5494 Error(diag::err_module_file_conflict, 5495 CurrentModule->getTopLevelModuleName(), CurFile->getName(), 5496 F.File->getName()); 5497 return Failure; 5498 } 5499 } 5500 5501 F.DidReadTopLevelSubmodule = true; 5502 CurrentModule->setASTFile(F.File); 5503 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath; 5504 } 5505 5506 CurrentModule->Kind = Kind; 5507 CurrentModule->Signature = F.Signature; 5508 CurrentModule->IsFromModuleFile = true; 5509 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 5510 CurrentModule->IsExternC = IsExternC; 5511 CurrentModule->InferSubmodules = InferSubmodules; 5512 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 5513 CurrentModule->InferExportWildcard = InferExportWildcard; 5514 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive; 5515 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate; 5516 if (DeserializationListener) 5517 DeserializationListener->ModuleRead(GlobalID, CurrentModule); 5518 5519 SubmodulesLoaded[GlobalIndex] = CurrentModule; 5520 5521 // Clear out data that will be replaced by what is in the module file. 5522 CurrentModule->LinkLibraries.clear(); 5523 CurrentModule->ConfigMacros.clear(); 5524 CurrentModule->UnresolvedConflicts.clear(); 5525 CurrentModule->Conflicts.clear(); 5526 5527 // The module is available unless it's missing a requirement; relevant 5528 // requirements will be (re-)added by SUBMODULE_REQUIRES records. 5529 // Missing headers that were present when the module was built do not 5530 // make it unavailable -- if we got this far, this must be an explicitly 5531 // imported module file. 5532 CurrentModule->Requirements.clear(); 5533 CurrentModule->MissingHeaders.clear(); 5534 CurrentModule->IsMissingRequirement = 5535 ParentModule && ParentModule->IsMissingRequirement; 5536 CurrentModule->IsAvailable = !CurrentModule->IsMissingRequirement; 5537 break; 5538 } 5539 5540 case SUBMODULE_UMBRELLA_HEADER: { 5541 std::string Filename = Blob; 5542 ResolveImportedPath(F, Filename); 5543 if (auto Umbrella = PP.getFileManager().getFile(Filename)) { 5544 if (!CurrentModule->getUmbrellaHeader()) 5545 ModMap.setUmbrellaHeader(CurrentModule, *Umbrella, Blob); 5546 else if (CurrentModule->getUmbrellaHeader().Entry != *Umbrella) { 5547 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 5548 Error("mismatched umbrella headers in submodule"); 5549 return OutOfDate; 5550 } 5551 } 5552 break; 5553 } 5554 5555 case SUBMODULE_HEADER: 5556 case SUBMODULE_EXCLUDED_HEADER: 5557 case SUBMODULE_PRIVATE_HEADER: 5558 // We lazily associate headers with their modules via the HeaderInfo table. 5559 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 5560 // of complete filenames or remove it entirely. 5561 break; 5562 5563 case SUBMODULE_TEXTUAL_HEADER: 5564 case SUBMODULE_PRIVATE_TEXTUAL_HEADER: 5565 // FIXME: Textual headers are not marked in the HeaderInfo table. Load 5566 // them here. 5567 break; 5568 5569 case SUBMODULE_TOPHEADER: 5570 CurrentModule->addTopHeaderFilename(Blob); 5571 break; 5572 5573 case SUBMODULE_UMBRELLA_DIR: { 5574 std::string Dirname = Blob; 5575 ResolveImportedPath(F, Dirname); 5576 if (auto Umbrella = PP.getFileManager().getDirectory(Dirname)) { 5577 if (!CurrentModule->getUmbrellaDir()) 5578 ModMap.setUmbrellaDir(CurrentModule, *Umbrella, Blob); 5579 else if (CurrentModule->getUmbrellaDir().Entry != *Umbrella) { 5580 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 5581 Error("mismatched umbrella directories in submodule"); 5582 return OutOfDate; 5583 } 5584 } 5585 break; 5586 } 5587 5588 case SUBMODULE_METADATA: { 5589 F.BaseSubmoduleID = getTotalNumSubmodules(); 5590 F.LocalNumSubmodules = Record[0]; 5591 unsigned LocalBaseSubmoduleID = Record[1]; 5592 if (F.LocalNumSubmodules > 0) { 5593 // Introduce the global -> local mapping for submodules within this 5594 // module. 5595 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 5596 5597 // Introduce the local -> global mapping for submodules within this 5598 // module. 5599 F.SubmoduleRemap.insertOrReplace( 5600 std::make_pair(LocalBaseSubmoduleID, 5601 F.BaseSubmoduleID - LocalBaseSubmoduleID)); 5602 5603 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 5604 } 5605 break; 5606 } 5607 5608 case SUBMODULE_IMPORTS: 5609 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 5610 UnresolvedModuleRef Unresolved; 5611 Unresolved.File = &F; 5612 Unresolved.Mod = CurrentModule; 5613 Unresolved.ID = Record[Idx]; 5614 Unresolved.Kind = UnresolvedModuleRef::Import; 5615 Unresolved.IsWildcard = false; 5616 UnresolvedModuleRefs.push_back(Unresolved); 5617 } 5618 break; 5619 5620 case SUBMODULE_EXPORTS: 5621 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 5622 UnresolvedModuleRef Unresolved; 5623 Unresolved.File = &F; 5624 Unresolved.Mod = CurrentModule; 5625 Unresolved.ID = Record[Idx]; 5626 Unresolved.Kind = UnresolvedModuleRef::Export; 5627 Unresolved.IsWildcard = Record[Idx + 1]; 5628 UnresolvedModuleRefs.push_back(Unresolved); 5629 } 5630 5631 // Once we've loaded the set of exports, there's no reason to keep 5632 // the parsed, unresolved exports around. 5633 CurrentModule->UnresolvedExports.clear(); 5634 break; 5635 5636 case SUBMODULE_REQUIRES: 5637 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(), 5638 PP.getTargetInfo()); 5639 break; 5640 5641 case SUBMODULE_LINK_LIBRARY: 5642 ModMap.resolveLinkAsDependencies(CurrentModule); 5643 CurrentModule->LinkLibraries.push_back( 5644 Module::LinkLibrary(Blob, Record[0])); 5645 break; 5646 5647 case SUBMODULE_CONFIG_MACRO: 5648 CurrentModule->ConfigMacros.push_back(Blob.str()); 5649 break; 5650 5651 case SUBMODULE_CONFLICT: { 5652 UnresolvedModuleRef Unresolved; 5653 Unresolved.File = &F; 5654 Unresolved.Mod = CurrentModule; 5655 Unresolved.ID = Record[0]; 5656 Unresolved.Kind = UnresolvedModuleRef::Conflict; 5657 Unresolved.IsWildcard = false; 5658 Unresolved.String = Blob; 5659 UnresolvedModuleRefs.push_back(Unresolved); 5660 break; 5661 } 5662 5663 case SUBMODULE_INITIALIZERS: { 5664 if (!ContextObj) 5665 break; 5666 SmallVector<uint32_t, 16> Inits; 5667 for (auto &ID : Record) 5668 Inits.push_back(getGlobalDeclID(F, ID)); 5669 ContextObj->addLazyModuleInitializers(CurrentModule, Inits); 5670 break; 5671 } 5672 5673 case SUBMODULE_EXPORT_AS: 5674 CurrentModule->ExportAsModule = Blob.str(); 5675 ModMap.addLinkAsDependency(CurrentModule); 5676 break; 5677 } 5678 } 5679 } 5680 5681 /// Parse the record that corresponds to a LangOptions data 5682 /// structure. 5683 /// 5684 /// This routine parses the language options from the AST file and then gives 5685 /// them to the AST listener if one is set. 5686 /// 5687 /// \returns true if the listener deems the file unacceptable, false otherwise. 5688 bool ASTReader::ParseLanguageOptions(const RecordData &Record, 5689 bool Complain, 5690 ASTReaderListener &Listener, 5691 bool AllowCompatibleDifferences) { 5692 LangOptions LangOpts; 5693 unsigned Idx = 0; 5694 #define LANGOPT(Name, Bits, Default, Description) \ 5695 LangOpts.Name = Record[Idx++]; 5696 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 5697 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 5698 #include "clang/Basic/LangOptions.def" 5699 #define SANITIZER(NAME, ID) \ 5700 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]); 5701 #include "clang/Basic/Sanitizers.def" 5702 5703 for (unsigned N = Record[Idx++]; N; --N) 5704 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx)); 5705 5706 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 5707 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 5708 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 5709 5710 LangOpts.CurrentModule = ReadString(Record, Idx); 5711 5712 // Comment options. 5713 for (unsigned N = Record[Idx++]; N; --N) { 5714 LangOpts.CommentOpts.BlockCommandNames.push_back( 5715 ReadString(Record, Idx)); 5716 } 5717 LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 5718 5719 // OpenMP offloading options. 5720 for (unsigned N = Record[Idx++]; N; --N) { 5721 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx))); 5722 } 5723 5724 LangOpts.OMPHostIRFile = ReadString(Record, Idx); 5725 5726 return Listener.ReadLanguageOptions(LangOpts, Complain, 5727 AllowCompatibleDifferences); 5728 } 5729 5730 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain, 5731 ASTReaderListener &Listener, 5732 bool AllowCompatibleDifferences) { 5733 unsigned Idx = 0; 5734 TargetOptions TargetOpts; 5735 TargetOpts.Triple = ReadString(Record, Idx); 5736 TargetOpts.CPU = ReadString(Record, Idx); 5737 TargetOpts.ABI = ReadString(Record, Idx); 5738 for (unsigned N = Record[Idx++]; N; --N) { 5739 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 5740 } 5741 for (unsigned N = Record[Idx++]; N; --N) { 5742 TargetOpts.Features.push_back(ReadString(Record, Idx)); 5743 } 5744 5745 return Listener.ReadTargetOptions(TargetOpts, Complain, 5746 AllowCompatibleDifferences); 5747 } 5748 5749 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 5750 ASTReaderListener &Listener) { 5751 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); 5752 unsigned Idx = 0; 5753 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++]; 5754 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 5755 DiagOpts->set##Name(static_cast<Type>(Record[Idx++])); 5756 #include "clang/Basic/DiagnosticOptions.def" 5757 5758 for (unsigned N = Record[Idx++]; N; --N) 5759 DiagOpts->Warnings.push_back(ReadString(Record, Idx)); 5760 for (unsigned N = Record[Idx++]; N; --N) 5761 DiagOpts->Remarks.push_back(ReadString(Record, Idx)); 5762 5763 return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 5764 } 5765 5766 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 5767 ASTReaderListener &Listener) { 5768 FileSystemOptions FSOpts; 5769 unsigned Idx = 0; 5770 FSOpts.WorkingDir = ReadString(Record, Idx); 5771 return Listener.ReadFileSystemOptions(FSOpts, Complain); 5772 } 5773 5774 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 5775 bool Complain, 5776 ASTReaderListener &Listener) { 5777 HeaderSearchOptions HSOpts; 5778 unsigned Idx = 0; 5779 HSOpts.Sysroot = ReadString(Record, Idx); 5780 5781 // Include entries. 5782 for (unsigned N = Record[Idx++]; N; --N) { 5783 std::string Path = ReadString(Record, Idx); 5784 frontend::IncludeDirGroup Group 5785 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 5786 bool IsFramework = Record[Idx++]; 5787 bool IgnoreSysRoot = Record[Idx++]; 5788 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework, 5789 IgnoreSysRoot); 5790 } 5791 5792 // System header prefixes. 5793 for (unsigned N = Record[Idx++]; N; --N) { 5794 std::string Prefix = ReadString(Record, Idx); 5795 bool IsSystemHeader = Record[Idx++]; 5796 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader); 5797 } 5798 5799 HSOpts.ResourceDir = ReadString(Record, Idx); 5800 HSOpts.ModuleCachePath = ReadString(Record, Idx); 5801 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx); 5802 HSOpts.DisableModuleHash = Record[Idx++]; 5803 HSOpts.ImplicitModuleMaps = Record[Idx++]; 5804 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++]; 5805 HSOpts.UseBuiltinIncludes = Record[Idx++]; 5806 HSOpts.UseStandardSystemIncludes = Record[Idx++]; 5807 HSOpts.UseStandardCXXIncludes = Record[Idx++]; 5808 HSOpts.UseLibcxx = Record[Idx++]; 5809 std::string SpecificModuleCachePath = ReadString(Record, Idx); 5810 5811 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5812 Complain); 5813 } 5814 5815 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 5816 bool Complain, 5817 ASTReaderListener &Listener, 5818 std::string &SuggestedPredefines) { 5819 PreprocessorOptions PPOpts; 5820 unsigned Idx = 0; 5821 5822 // Macro definitions/undefs 5823 for (unsigned N = Record[Idx++]; N; --N) { 5824 std::string Macro = ReadString(Record, Idx); 5825 bool IsUndef = Record[Idx++]; 5826 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 5827 } 5828 5829 // Includes 5830 for (unsigned N = Record[Idx++]; N; --N) { 5831 PPOpts.Includes.push_back(ReadString(Record, Idx)); 5832 } 5833 5834 // Macro Includes 5835 for (unsigned N = Record[Idx++]; N; --N) { 5836 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 5837 } 5838 5839 PPOpts.UsePredefines = Record[Idx++]; 5840 PPOpts.DetailedRecord = Record[Idx++]; 5841 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 5842 PPOpts.ObjCXXARCStandardLibrary = 5843 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 5844 SuggestedPredefines.clear(); 5845 return Listener.ReadPreprocessorOptions(PPOpts, Complain, 5846 SuggestedPredefines); 5847 } 5848 5849 std::pair<ModuleFile *, unsigned> 5850 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 5851 GlobalPreprocessedEntityMapType::iterator 5852 I = GlobalPreprocessedEntityMap.find(GlobalIndex); 5853 assert(I != GlobalPreprocessedEntityMap.end() && 5854 "Corrupted global preprocessed entity map"); 5855 ModuleFile *M = I->second; 5856 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 5857 return std::make_pair(M, LocalIndex); 5858 } 5859 5860 llvm::iterator_range<PreprocessingRecord::iterator> 5861 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 5862 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 5863 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 5864 Mod.NumPreprocessedEntities); 5865 5866 return llvm::make_range(PreprocessingRecord::iterator(), 5867 PreprocessingRecord::iterator()); 5868 } 5869 5870 llvm::iterator_range<ASTReader::ModuleDeclIterator> 5871 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 5872 return llvm::make_range( 5873 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 5874 ModuleDeclIterator(this, &Mod, 5875 Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 5876 } 5877 5878 SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) { 5879 auto I = GlobalSkippedRangeMap.find(GlobalIndex); 5880 assert(I != GlobalSkippedRangeMap.end() && 5881 "Corrupted global skipped range map"); 5882 ModuleFile *M = I->second; 5883 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID; 5884 assert(LocalIndex < M->NumPreprocessedSkippedRanges); 5885 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex]; 5886 SourceRange Range(TranslateSourceLocation(*M, RawRange.getBegin()), 5887 TranslateSourceLocation(*M, RawRange.getEnd())); 5888 assert(Range.isValid()); 5889 return Range; 5890 } 5891 5892 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 5893 PreprocessedEntityID PPID = Index+1; 5894 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 5895 ModuleFile &M = *PPInfo.first; 5896 unsigned LocalIndex = PPInfo.second; 5897 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 5898 5899 if (!PP.getPreprocessingRecord()) { 5900 Error("no preprocessing record"); 5901 return nullptr; 5902 } 5903 5904 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 5905 if (llvm::Error Err = 5906 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset)) { 5907 Error(std::move(Err)); 5908 return nullptr; 5909 } 5910 5911 Expected<llvm::BitstreamEntry> MaybeEntry = 5912 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 5913 if (!MaybeEntry) { 5914 Error(MaybeEntry.takeError()); 5915 return nullptr; 5916 } 5917 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5918 5919 if (Entry.Kind != llvm::BitstreamEntry::Record) 5920 return nullptr; 5921 5922 // Read the record. 5923 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()), 5924 TranslateSourceLocation(M, PPOffs.getEnd())); 5925 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 5926 StringRef Blob; 5927 RecordData Record; 5928 Expected<unsigned> MaybeRecType = 5929 M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob); 5930 if (!MaybeRecType) { 5931 Error(MaybeRecType.takeError()); 5932 return nullptr; 5933 } 5934 switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) { 5935 case PPD_MACRO_EXPANSION: { 5936 bool isBuiltin = Record[0]; 5937 IdentifierInfo *Name = nullptr; 5938 MacroDefinitionRecord *Def = nullptr; 5939 if (isBuiltin) 5940 Name = getLocalIdentifier(M, Record[1]); 5941 else { 5942 PreprocessedEntityID GlobalID = 5943 getGlobalPreprocessedEntityID(M, Record[1]); 5944 Def = cast<MacroDefinitionRecord>( 5945 PPRec.getLoadedPreprocessedEntity(GlobalID - 1)); 5946 } 5947 5948 MacroExpansion *ME; 5949 if (isBuiltin) 5950 ME = new (PPRec) MacroExpansion(Name, Range); 5951 else 5952 ME = new (PPRec) MacroExpansion(Def, Range); 5953 5954 return ME; 5955 } 5956 5957 case PPD_MACRO_DEFINITION: { 5958 // Decode the identifier info and then check again; if the macro is 5959 // still defined and associated with the identifier, 5960 IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 5961 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range); 5962 5963 if (DeserializationListener) 5964 DeserializationListener->MacroDefinitionRead(PPID, MD); 5965 5966 return MD; 5967 } 5968 5969 case PPD_INCLUSION_DIRECTIVE: { 5970 const char *FullFileNameStart = Blob.data() + Record[0]; 5971 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 5972 const FileEntry *File = nullptr; 5973 if (!FullFileName.empty()) 5974 if (auto FE = PP.getFileManager().getFile(FullFileName)) 5975 File = *FE; 5976 5977 // FIXME: Stable encoding 5978 InclusionDirective::InclusionKind Kind 5979 = static_cast<InclusionDirective::InclusionKind>(Record[2]); 5980 InclusionDirective *ID 5981 = new (PPRec) InclusionDirective(PPRec, Kind, 5982 StringRef(Blob.data(), Record[0]), 5983 Record[1], Record[3], 5984 File, 5985 Range); 5986 return ID; 5987 } 5988 } 5989 5990 llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 5991 } 5992 5993 /// Find the next module that contains entities and return the ID 5994 /// of the first entry. 5995 /// 5996 /// \param SLocMapI points at a chunk of a module that contains no 5997 /// preprocessed entities or the entities it contains are not the ones we are 5998 /// looking for. 5999 PreprocessedEntityID ASTReader::findNextPreprocessedEntity( 6000 GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 6001 ++SLocMapI; 6002 for (GlobalSLocOffsetMapType::const_iterator 6003 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 6004 ModuleFile &M = *SLocMapI->second; 6005 if (M.NumPreprocessedEntities) 6006 return M.BasePreprocessedEntityID; 6007 } 6008 6009 return getTotalNumPreprocessedEntities(); 6010 } 6011 6012 namespace { 6013 6014 struct PPEntityComp { 6015 const ASTReader &Reader; 6016 ModuleFile &M; 6017 6018 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {} 6019 6020 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 6021 SourceLocation LHS = getLoc(L); 6022 SourceLocation RHS = getLoc(R); 6023 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6024 } 6025 6026 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 6027 SourceLocation LHS = getLoc(L); 6028 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6029 } 6030 6031 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 6032 SourceLocation RHS = getLoc(R); 6033 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6034 } 6035 6036 SourceLocation getLoc(const PPEntityOffset &PPE) const { 6037 return Reader.TranslateSourceLocation(M, PPE.getBegin()); 6038 } 6039 }; 6040 6041 } // namespace 6042 6043 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc, 6044 bool EndsAfter) const { 6045 if (SourceMgr.isLocalSourceLocation(Loc)) 6046 return getTotalNumPreprocessedEntities(); 6047 6048 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find( 6049 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1); 6050 assert(SLocMapI != GlobalSLocOffsetMap.end() && 6051 "Corrupted global sloc offset map"); 6052 6053 if (SLocMapI->second->NumPreprocessedEntities == 0) 6054 return findNextPreprocessedEntity(SLocMapI); 6055 6056 ModuleFile &M = *SLocMapI->second; 6057 6058 using pp_iterator = const PPEntityOffset *; 6059 6060 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 6061 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 6062 6063 size_t Count = M.NumPreprocessedEntities; 6064 size_t Half; 6065 pp_iterator First = pp_begin; 6066 pp_iterator PPI; 6067 6068 if (EndsAfter) { 6069 PPI = std::upper_bound(pp_begin, pp_end, Loc, 6070 PPEntityComp(*this, M)); 6071 } else { 6072 // Do a binary search manually instead of using std::lower_bound because 6073 // The end locations of entities may be unordered (when a macro expansion 6074 // is inside another macro argument), but for this case it is not important 6075 // whether we get the first macro expansion or its containing macro. 6076 while (Count > 0) { 6077 Half = Count / 2; 6078 PPI = First; 6079 std::advance(PPI, Half); 6080 if (SourceMgr.isBeforeInTranslationUnit( 6081 TranslateSourceLocation(M, PPI->getEnd()), Loc)) { 6082 First = PPI; 6083 ++First; 6084 Count = Count - Half - 1; 6085 } else 6086 Count = Half; 6087 } 6088 } 6089 6090 if (PPI == pp_end) 6091 return findNextPreprocessedEntity(SLocMapI); 6092 6093 return M.BasePreprocessedEntityID + (PPI - pp_begin); 6094 } 6095 6096 /// Returns a pair of [Begin, End) indices of preallocated 6097 /// preprocessed entities that \arg Range encompasses. 6098 std::pair<unsigned, unsigned> 6099 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 6100 if (Range.isInvalid()) 6101 return std::make_pair(0,0); 6102 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 6103 6104 PreprocessedEntityID BeginID = 6105 findPreprocessedEntity(Range.getBegin(), false); 6106 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true); 6107 return std::make_pair(BeginID, EndID); 6108 } 6109 6110 /// Optionally returns true or false if the preallocated preprocessed 6111 /// entity with index \arg Index came from file \arg FID. 6112 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 6113 FileID FID) { 6114 if (FID.isInvalid()) 6115 return false; 6116 6117 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 6118 ModuleFile &M = *PPInfo.first; 6119 unsigned LocalIndex = PPInfo.second; 6120 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 6121 6122 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin()); 6123 if (Loc.isInvalid()) 6124 return false; 6125 6126 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 6127 return true; 6128 else 6129 return false; 6130 } 6131 6132 namespace { 6133 6134 /// Visitor used to search for information about a header file. 6135 class HeaderFileInfoVisitor { 6136 const FileEntry *FE; 6137 Optional<HeaderFileInfo> HFI; 6138 6139 public: 6140 explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {} 6141 6142 bool operator()(ModuleFile &M) { 6143 HeaderFileInfoLookupTable *Table 6144 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 6145 if (!Table) 6146 return false; 6147 6148 // Look in the on-disk hash table for an entry for this file name. 6149 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE); 6150 if (Pos == Table->end()) 6151 return false; 6152 6153 HFI = *Pos; 6154 return true; 6155 } 6156 6157 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 6158 }; 6159 6160 } // namespace 6161 6162 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 6163 HeaderFileInfoVisitor Visitor(FE); 6164 ModuleMgr.visit(Visitor); 6165 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 6166 return *HFI; 6167 6168 return HeaderFileInfo(); 6169 } 6170 6171 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 6172 using DiagState = DiagnosticsEngine::DiagState; 6173 SmallVector<DiagState *, 32> DiagStates; 6174 6175 for (ModuleFile &F : ModuleMgr) { 6176 unsigned Idx = 0; 6177 auto &Record = F.PragmaDiagMappings; 6178 if (Record.empty()) 6179 continue; 6180 6181 DiagStates.clear(); 6182 6183 auto ReadDiagState = 6184 [&](const DiagState &BasedOn, SourceLocation Loc, 6185 bool IncludeNonPragmaStates) -> DiagnosticsEngine::DiagState * { 6186 unsigned BackrefID = Record[Idx++]; 6187 if (BackrefID != 0) 6188 return DiagStates[BackrefID - 1]; 6189 6190 // A new DiagState was created here. 6191 Diag.DiagStates.push_back(BasedOn); 6192 DiagState *NewState = &Diag.DiagStates.back(); 6193 DiagStates.push_back(NewState); 6194 unsigned Size = Record[Idx++]; 6195 assert(Idx + Size * 2 <= Record.size() && 6196 "Invalid data, not enough diag/map pairs"); 6197 while (Size--) { 6198 unsigned DiagID = Record[Idx++]; 6199 DiagnosticMapping NewMapping = 6200 DiagnosticMapping::deserialize(Record[Idx++]); 6201 if (!NewMapping.isPragma() && !IncludeNonPragmaStates) 6202 continue; 6203 6204 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID); 6205 6206 // If this mapping was specified as a warning but the severity was 6207 // upgraded due to diagnostic settings, simulate the current diagnostic 6208 // settings (and use a warning). 6209 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) { 6210 NewMapping.setSeverity(diag::Severity::Warning); 6211 NewMapping.setUpgradedFromWarning(false); 6212 } 6213 6214 Mapping = NewMapping; 6215 } 6216 return NewState; 6217 }; 6218 6219 // Read the first state. 6220 DiagState *FirstState; 6221 if (F.Kind == MK_ImplicitModule) { 6222 // Implicitly-built modules are reused with different diagnostic 6223 // settings. Use the initial diagnostic state from Diag to simulate this 6224 // compilation's diagnostic settings. 6225 FirstState = Diag.DiagStatesByLoc.FirstDiagState; 6226 DiagStates.push_back(FirstState); 6227 6228 // Skip the initial diagnostic state from the serialized module. 6229 assert(Record[1] == 0 && 6230 "Invalid data, unexpected backref in initial state"); 6231 Idx = 3 + Record[2] * 2; 6232 assert(Idx < Record.size() && 6233 "Invalid data, not enough state change pairs in initial state"); 6234 } else if (F.isModule()) { 6235 // For an explicit module, preserve the flags from the module build 6236 // command line (-w, -Weverything, -Werror, ...) along with any explicit 6237 // -Wblah flags. 6238 unsigned Flags = Record[Idx++]; 6239 DiagState Initial; 6240 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1; 6241 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1; 6242 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1; 6243 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1; 6244 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1; 6245 Initial.ExtBehavior = (diag::Severity)Flags; 6246 FirstState = ReadDiagState(Initial, SourceLocation(), true); 6247 6248 assert(F.OriginalSourceFileID.isValid()); 6249 6250 // Set up the root buffer of the module to start with the initial 6251 // diagnostic state of the module itself, to cover files that contain no 6252 // explicit transitions (for which we did not serialize anything). 6253 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID] 6254 .StateTransitions.push_back({FirstState, 0}); 6255 } else { 6256 // For prefix ASTs, start with whatever the user configured on the 6257 // command line. 6258 Idx++; // Skip flags. 6259 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, 6260 SourceLocation(), false); 6261 } 6262 6263 // Read the state transitions. 6264 unsigned NumLocations = Record[Idx++]; 6265 while (NumLocations--) { 6266 assert(Idx < Record.size() && 6267 "Invalid data, missing pragma diagnostic states"); 6268 SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]); 6269 auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc); 6270 assert(IDAndOffset.first.isValid() && "invalid FileID for transition"); 6271 assert(IDAndOffset.second == 0 && "not a start location for a FileID"); 6272 unsigned Transitions = Record[Idx++]; 6273 6274 // Note that we don't need to set up Parent/ParentOffset here, because 6275 // we won't be changing the diagnostic state within imported FileIDs 6276 // (other than perhaps appending to the main source file, which has no 6277 // parent). 6278 auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first]; 6279 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions); 6280 for (unsigned I = 0; I != Transitions; ++I) { 6281 unsigned Offset = Record[Idx++]; 6282 auto *State = 6283 ReadDiagState(*FirstState, Loc.getLocWithOffset(Offset), false); 6284 F.StateTransitions.push_back({State, Offset}); 6285 } 6286 } 6287 6288 // Read the final state. 6289 assert(Idx < Record.size() && 6290 "Invalid data, missing final pragma diagnostic state"); 6291 SourceLocation CurStateLoc = 6292 ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 6293 auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false); 6294 6295 if (!F.isModule()) { 6296 Diag.DiagStatesByLoc.CurDiagState = CurState; 6297 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc; 6298 6299 // Preserve the property that the imaginary root file describes the 6300 // current state. 6301 FileID NullFile; 6302 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions; 6303 if (T.empty()) 6304 T.push_back({CurState, 0}); 6305 else 6306 T[0].State = CurState; 6307 } 6308 6309 // Don't try to read these mappings again. 6310 Record.clear(); 6311 } 6312 } 6313 6314 /// Get the correct cursor and offset for loading a type. 6315 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 6316 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 6317 assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 6318 ModuleFile *M = I->second; 6319 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]); 6320 } 6321 6322 static llvm::Optional<Type::TypeClass> getTypeClassForCode(TypeCode code) { 6323 switch (code) { 6324 #define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \ 6325 case TYPE_##CODE_ID: return Type::CLASS_ID; 6326 #include "clang/Serialization/TypeBitCodes.def" 6327 default: return llvm::None; 6328 } 6329 } 6330 6331 /// Read and return the type with the given index.. 6332 /// 6333 /// The index is the type ID, shifted and minus the number of predefs. This 6334 /// routine actually reads the record corresponding to the type at the given 6335 /// location. It is a helper routine for GetType, which deals with reading type 6336 /// IDs. 6337 QualType ASTReader::readTypeRecord(unsigned Index) { 6338 assert(ContextObj && "reading type with no AST context"); 6339 ASTContext &Context = *ContextObj; 6340 RecordLocation Loc = TypeCursorForIndex(Index); 6341 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 6342 6343 // Keep track of where we are in the stream, then jump back there 6344 // after reading this type. 6345 SavedStreamPosition SavedPosition(DeclsCursor); 6346 6347 ReadingKindTracker ReadingKind(Read_Type, *this); 6348 6349 // Note that we are loading a type record. 6350 Deserializing AType(this); 6351 6352 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) { 6353 Error(std::move(Err)); 6354 return QualType(); 6355 } 6356 Expected<unsigned> RawCode = DeclsCursor.ReadCode(); 6357 if (!RawCode) { 6358 Error(RawCode.takeError()); 6359 return QualType(); 6360 } 6361 6362 ASTRecordReader Record(*this, *Loc.F); 6363 Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get()); 6364 if (!Code) { 6365 Error(Code.takeError()); 6366 return QualType(); 6367 } 6368 if (Code.get() == TYPE_EXT_QUAL) { 6369 QualType baseType = Record.readQualType(); 6370 Qualifiers quals = Record.readQualifiers(); 6371 return Context.getQualifiedType(baseType, quals); 6372 } 6373 6374 auto maybeClass = getTypeClassForCode((TypeCode) Code.get()); 6375 if (!maybeClass) { 6376 Error("Unexpected code for type"); 6377 return QualType(); 6378 } 6379 6380 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record); 6381 return TypeReader.read(*maybeClass); 6382 } 6383 6384 namespace clang { 6385 6386 class TypeLocReader : public TypeLocVisitor<TypeLocReader> { 6387 ASTRecordReader &Reader; 6388 6389 SourceLocation readSourceLocation() { 6390 return Reader.readSourceLocation(); 6391 } 6392 6393 TypeSourceInfo *GetTypeSourceInfo() { 6394 return Reader.readTypeSourceInfo(); 6395 } 6396 6397 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() { 6398 return Reader.readNestedNameSpecifierLoc(); 6399 } 6400 6401 Attr *ReadAttr() { 6402 return Reader.readAttr(); 6403 } 6404 6405 public: 6406 TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {} 6407 6408 // We want compile-time assurance that we've enumerated all of 6409 // these, so unfortunately we have to declare them first, then 6410 // define them out-of-line. 6411 #define ABSTRACT_TYPELOC(CLASS, PARENT) 6412 #define TYPELOC(CLASS, PARENT) \ 6413 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 6414 #include "clang/AST/TypeLocNodes.def" 6415 6416 void VisitFunctionTypeLoc(FunctionTypeLoc); 6417 void VisitArrayTypeLoc(ArrayTypeLoc); 6418 }; 6419 6420 } // namespace clang 6421 6422 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 6423 // nothing to do 6424 } 6425 6426 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 6427 TL.setBuiltinLoc(readSourceLocation()); 6428 if (TL.needsExtraLocalData()) { 6429 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt())); 6430 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Reader.readInt())); 6431 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Reader.readInt())); 6432 TL.setModeAttr(Reader.readInt()); 6433 } 6434 } 6435 6436 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 6437 TL.setNameLoc(readSourceLocation()); 6438 } 6439 6440 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 6441 TL.setStarLoc(readSourceLocation()); 6442 } 6443 6444 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 6445 // nothing to do 6446 } 6447 6448 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 6449 // nothing to do 6450 } 6451 6452 void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) { 6453 TL.setExpansionLoc(readSourceLocation()); 6454 } 6455 6456 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 6457 TL.setCaretLoc(readSourceLocation()); 6458 } 6459 6460 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 6461 TL.setAmpLoc(readSourceLocation()); 6462 } 6463 6464 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 6465 TL.setAmpAmpLoc(readSourceLocation()); 6466 } 6467 6468 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 6469 TL.setStarLoc(readSourceLocation()); 6470 TL.setClassTInfo(GetTypeSourceInfo()); 6471 } 6472 6473 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 6474 TL.setLBracketLoc(readSourceLocation()); 6475 TL.setRBracketLoc(readSourceLocation()); 6476 if (Reader.readBool()) 6477 TL.setSizeExpr(Reader.readExpr()); 6478 else 6479 TL.setSizeExpr(nullptr); 6480 } 6481 6482 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 6483 VisitArrayTypeLoc(TL); 6484 } 6485 6486 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 6487 VisitArrayTypeLoc(TL); 6488 } 6489 6490 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 6491 VisitArrayTypeLoc(TL); 6492 } 6493 6494 void TypeLocReader::VisitDependentSizedArrayTypeLoc( 6495 DependentSizedArrayTypeLoc TL) { 6496 VisitArrayTypeLoc(TL); 6497 } 6498 6499 void TypeLocReader::VisitDependentAddressSpaceTypeLoc( 6500 DependentAddressSpaceTypeLoc TL) { 6501 6502 TL.setAttrNameLoc(readSourceLocation()); 6503 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6504 TL.setAttrExprOperand(Reader.readExpr()); 6505 } 6506 6507 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 6508 DependentSizedExtVectorTypeLoc TL) { 6509 TL.setNameLoc(readSourceLocation()); 6510 } 6511 6512 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 6513 TL.setNameLoc(readSourceLocation()); 6514 } 6515 6516 void TypeLocReader::VisitDependentVectorTypeLoc( 6517 DependentVectorTypeLoc TL) { 6518 TL.setNameLoc(readSourceLocation()); 6519 } 6520 6521 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 6522 TL.setNameLoc(readSourceLocation()); 6523 } 6524 6525 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 6526 TL.setLocalRangeBegin(readSourceLocation()); 6527 TL.setLParenLoc(readSourceLocation()); 6528 TL.setRParenLoc(readSourceLocation()); 6529 TL.setExceptionSpecRange(Reader.readSourceRange()); 6530 TL.setLocalRangeEnd(readSourceLocation()); 6531 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) { 6532 TL.setParam(i, Reader.readDeclAs<ParmVarDecl>()); 6533 } 6534 } 6535 6536 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 6537 VisitFunctionTypeLoc(TL); 6538 } 6539 6540 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 6541 VisitFunctionTypeLoc(TL); 6542 } 6543 6544 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 6545 TL.setNameLoc(readSourceLocation()); 6546 } 6547 6548 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 6549 TL.setNameLoc(readSourceLocation()); 6550 } 6551 6552 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 6553 TL.setTypeofLoc(readSourceLocation()); 6554 TL.setLParenLoc(readSourceLocation()); 6555 TL.setRParenLoc(readSourceLocation()); 6556 } 6557 6558 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 6559 TL.setTypeofLoc(readSourceLocation()); 6560 TL.setLParenLoc(readSourceLocation()); 6561 TL.setRParenLoc(readSourceLocation()); 6562 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6563 } 6564 6565 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 6566 TL.setNameLoc(readSourceLocation()); 6567 } 6568 6569 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 6570 TL.setKWLoc(readSourceLocation()); 6571 TL.setLParenLoc(readSourceLocation()); 6572 TL.setRParenLoc(readSourceLocation()); 6573 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6574 } 6575 6576 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 6577 TL.setNameLoc(readSourceLocation()); 6578 } 6579 6580 void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc( 6581 DeducedTemplateSpecializationTypeLoc TL) { 6582 TL.setTemplateNameLoc(readSourceLocation()); 6583 } 6584 6585 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 6586 TL.setNameLoc(readSourceLocation()); 6587 } 6588 6589 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 6590 TL.setNameLoc(readSourceLocation()); 6591 } 6592 6593 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 6594 TL.setAttr(ReadAttr()); 6595 } 6596 6597 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 6598 TL.setNameLoc(readSourceLocation()); 6599 } 6600 6601 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 6602 SubstTemplateTypeParmTypeLoc TL) { 6603 TL.setNameLoc(readSourceLocation()); 6604 } 6605 6606 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 6607 SubstTemplateTypeParmPackTypeLoc TL) { 6608 TL.setNameLoc(readSourceLocation()); 6609 } 6610 6611 void TypeLocReader::VisitTemplateSpecializationTypeLoc( 6612 TemplateSpecializationTypeLoc TL) { 6613 TL.setTemplateKeywordLoc(readSourceLocation()); 6614 TL.setTemplateNameLoc(readSourceLocation()); 6615 TL.setLAngleLoc(readSourceLocation()); 6616 TL.setRAngleLoc(readSourceLocation()); 6617 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6618 TL.setArgLocInfo( 6619 i, 6620 Reader.readTemplateArgumentLocInfo( 6621 TL.getTypePtr()->getArg(i).getKind())); 6622 } 6623 6624 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 6625 TL.setLParenLoc(readSourceLocation()); 6626 TL.setRParenLoc(readSourceLocation()); 6627 } 6628 6629 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 6630 TL.setElaboratedKeywordLoc(readSourceLocation()); 6631 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6632 } 6633 6634 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 6635 TL.setNameLoc(readSourceLocation()); 6636 } 6637 6638 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 6639 TL.setElaboratedKeywordLoc(readSourceLocation()); 6640 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6641 TL.setNameLoc(readSourceLocation()); 6642 } 6643 6644 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 6645 DependentTemplateSpecializationTypeLoc TL) { 6646 TL.setElaboratedKeywordLoc(readSourceLocation()); 6647 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6648 TL.setTemplateKeywordLoc(readSourceLocation()); 6649 TL.setTemplateNameLoc(readSourceLocation()); 6650 TL.setLAngleLoc(readSourceLocation()); 6651 TL.setRAngleLoc(readSourceLocation()); 6652 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 6653 TL.setArgLocInfo( 6654 I, 6655 Reader.readTemplateArgumentLocInfo( 6656 TL.getTypePtr()->getArg(I).getKind())); 6657 } 6658 6659 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 6660 TL.setEllipsisLoc(readSourceLocation()); 6661 } 6662 6663 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 6664 TL.setNameLoc(readSourceLocation()); 6665 } 6666 6667 void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) { 6668 if (TL.getNumProtocols()) { 6669 TL.setProtocolLAngleLoc(readSourceLocation()); 6670 TL.setProtocolRAngleLoc(readSourceLocation()); 6671 } 6672 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6673 TL.setProtocolLoc(i, readSourceLocation()); 6674 } 6675 6676 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 6677 TL.setHasBaseTypeAsWritten(Reader.readBool()); 6678 TL.setTypeArgsLAngleLoc(readSourceLocation()); 6679 TL.setTypeArgsRAngleLoc(readSourceLocation()); 6680 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i) 6681 TL.setTypeArgTInfo(i, GetTypeSourceInfo()); 6682 TL.setProtocolLAngleLoc(readSourceLocation()); 6683 TL.setProtocolRAngleLoc(readSourceLocation()); 6684 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6685 TL.setProtocolLoc(i, readSourceLocation()); 6686 } 6687 6688 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 6689 TL.setStarLoc(readSourceLocation()); 6690 } 6691 6692 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 6693 TL.setKWLoc(readSourceLocation()); 6694 TL.setLParenLoc(readSourceLocation()); 6695 TL.setRParenLoc(readSourceLocation()); 6696 } 6697 6698 void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) { 6699 TL.setKWLoc(readSourceLocation()); 6700 } 6701 6702 void ASTRecordReader::readTypeLoc(TypeLoc TL) { 6703 TypeLocReader TLR(*this); 6704 for (; !TL.isNull(); TL = TL.getNextTypeLoc()) 6705 TLR.Visit(TL); 6706 } 6707 6708 TypeSourceInfo *ASTRecordReader::readTypeSourceInfo() { 6709 QualType InfoTy = readType(); 6710 if (InfoTy.isNull()) 6711 return nullptr; 6712 6713 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 6714 readTypeLoc(TInfo->getTypeLoc()); 6715 return TInfo; 6716 } 6717 6718 QualType ASTReader::GetType(TypeID ID) { 6719 assert(ContextObj && "reading type with no AST context"); 6720 ASTContext &Context = *ContextObj; 6721 6722 unsigned FastQuals = ID & Qualifiers::FastMask; 6723 unsigned Index = ID >> Qualifiers::FastWidth; 6724 6725 if (Index < NUM_PREDEF_TYPE_IDS) { 6726 QualType T; 6727 switch ((PredefinedTypeIDs)Index) { 6728 case PREDEF_TYPE_NULL_ID: 6729 return QualType(); 6730 case PREDEF_TYPE_VOID_ID: 6731 T = Context.VoidTy; 6732 break; 6733 case PREDEF_TYPE_BOOL_ID: 6734 T = Context.BoolTy; 6735 break; 6736 case PREDEF_TYPE_CHAR_U_ID: 6737 case PREDEF_TYPE_CHAR_S_ID: 6738 // FIXME: Check that the signedness of CharTy is correct! 6739 T = Context.CharTy; 6740 break; 6741 case PREDEF_TYPE_UCHAR_ID: 6742 T = Context.UnsignedCharTy; 6743 break; 6744 case PREDEF_TYPE_USHORT_ID: 6745 T = Context.UnsignedShortTy; 6746 break; 6747 case PREDEF_TYPE_UINT_ID: 6748 T = Context.UnsignedIntTy; 6749 break; 6750 case PREDEF_TYPE_ULONG_ID: 6751 T = Context.UnsignedLongTy; 6752 break; 6753 case PREDEF_TYPE_ULONGLONG_ID: 6754 T = Context.UnsignedLongLongTy; 6755 break; 6756 case PREDEF_TYPE_UINT128_ID: 6757 T = Context.UnsignedInt128Ty; 6758 break; 6759 case PREDEF_TYPE_SCHAR_ID: 6760 T = Context.SignedCharTy; 6761 break; 6762 case PREDEF_TYPE_WCHAR_ID: 6763 T = Context.WCharTy; 6764 break; 6765 case PREDEF_TYPE_SHORT_ID: 6766 T = Context.ShortTy; 6767 break; 6768 case PREDEF_TYPE_INT_ID: 6769 T = Context.IntTy; 6770 break; 6771 case PREDEF_TYPE_LONG_ID: 6772 T = Context.LongTy; 6773 break; 6774 case PREDEF_TYPE_LONGLONG_ID: 6775 T = Context.LongLongTy; 6776 break; 6777 case PREDEF_TYPE_INT128_ID: 6778 T = Context.Int128Ty; 6779 break; 6780 case PREDEF_TYPE_HALF_ID: 6781 T = Context.HalfTy; 6782 break; 6783 case PREDEF_TYPE_FLOAT_ID: 6784 T = Context.FloatTy; 6785 break; 6786 case PREDEF_TYPE_DOUBLE_ID: 6787 T = Context.DoubleTy; 6788 break; 6789 case PREDEF_TYPE_LONGDOUBLE_ID: 6790 T = Context.LongDoubleTy; 6791 break; 6792 case PREDEF_TYPE_SHORT_ACCUM_ID: 6793 T = Context.ShortAccumTy; 6794 break; 6795 case PREDEF_TYPE_ACCUM_ID: 6796 T = Context.AccumTy; 6797 break; 6798 case PREDEF_TYPE_LONG_ACCUM_ID: 6799 T = Context.LongAccumTy; 6800 break; 6801 case PREDEF_TYPE_USHORT_ACCUM_ID: 6802 T = Context.UnsignedShortAccumTy; 6803 break; 6804 case PREDEF_TYPE_UACCUM_ID: 6805 T = Context.UnsignedAccumTy; 6806 break; 6807 case PREDEF_TYPE_ULONG_ACCUM_ID: 6808 T = Context.UnsignedLongAccumTy; 6809 break; 6810 case PREDEF_TYPE_SHORT_FRACT_ID: 6811 T = Context.ShortFractTy; 6812 break; 6813 case PREDEF_TYPE_FRACT_ID: 6814 T = Context.FractTy; 6815 break; 6816 case PREDEF_TYPE_LONG_FRACT_ID: 6817 T = Context.LongFractTy; 6818 break; 6819 case PREDEF_TYPE_USHORT_FRACT_ID: 6820 T = Context.UnsignedShortFractTy; 6821 break; 6822 case PREDEF_TYPE_UFRACT_ID: 6823 T = Context.UnsignedFractTy; 6824 break; 6825 case PREDEF_TYPE_ULONG_FRACT_ID: 6826 T = Context.UnsignedLongFractTy; 6827 break; 6828 case PREDEF_TYPE_SAT_SHORT_ACCUM_ID: 6829 T = Context.SatShortAccumTy; 6830 break; 6831 case PREDEF_TYPE_SAT_ACCUM_ID: 6832 T = Context.SatAccumTy; 6833 break; 6834 case PREDEF_TYPE_SAT_LONG_ACCUM_ID: 6835 T = Context.SatLongAccumTy; 6836 break; 6837 case PREDEF_TYPE_SAT_USHORT_ACCUM_ID: 6838 T = Context.SatUnsignedShortAccumTy; 6839 break; 6840 case PREDEF_TYPE_SAT_UACCUM_ID: 6841 T = Context.SatUnsignedAccumTy; 6842 break; 6843 case PREDEF_TYPE_SAT_ULONG_ACCUM_ID: 6844 T = Context.SatUnsignedLongAccumTy; 6845 break; 6846 case PREDEF_TYPE_SAT_SHORT_FRACT_ID: 6847 T = Context.SatShortFractTy; 6848 break; 6849 case PREDEF_TYPE_SAT_FRACT_ID: 6850 T = Context.SatFractTy; 6851 break; 6852 case PREDEF_TYPE_SAT_LONG_FRACT_ID: 6853 T = Context.SatLongFractTy; 6854 break; 6855 case PREDEF_TYPE_SAT_USHORT_FRACT_ID: 6856 T = Context.SatUnsignedShortFractTy; 6857 break; 6858 case PREDEF_TYPE_SAT_UFRACT_ID: 6859 T = Context.SatUnsignedFractTy; 6860 break; 6861 case PREDEF_TYPE_SAT_ULONG_FRACT_ID: 6862 T = Context.SatUnsignedLongFractTy; 6863 break; 6864 case PREDEF_TYPE_FLOAT16_ID: 6865 T = Context.Float16Ty; 6866 break; 6867 case PREDEF_TYPE_FLOAT128_ID: 6868 T = Context.Float128Ty; 6869 break; 6870 case PREDEF_TYPE_OVERLOAD_ID: 6871 T = Context.OverloadTy; 6872 break; 6873 case PREDEF_TYPE_BOUND_MEMBER: 6874 T = Context.BoundMemberTy; 6875 break; 6876 case PREDEF_TYPE_PSEUDO_OBJECT: 6877 T = Context.PseudoObjectTy; 6878 break; 6879 case PREDEF_TYPE_DEPENDENT_ID: 6880 T = Context.DependentTy; 6881 break; 6882 case PREDEF_TYPE_UNKNOWN_ANY: 6883 T = Context.UnknownAnyTy; 6884 break; 6885 case PREDEF_TYPE_NULLPTR_ID: 6886 T = Context.NullPtrTy; 6887 break; 6888 case PREDEF_TYPE_CHAR8_ID: 6889 T = Context.Char8Ty; 6890 break; 6891 case PREDEF_TYPE_CHAR16_ID: 6892 T = Context.Char16Ty; 6893 break; 6894 case PREDEF_TYPE_CHAR32_ID: 6895 T = Context.Char32Ty; 6896 break; 6897 case PREDEF_TYPE_OBJC_ID: 6898 T = Context.ObjCBuiltinIdTy; 6899 break; 6900 case PREDEF_TYPE_OBJC_CLASS: 6901 T = Context.ObjCBuiltinClassTy; 6902 break; 6903 case PREDEF_TYPE_OBJC_SEL: 6904 T = Context.ObjCBuiltinSelTy; 6905 break; 6906 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 6907 case PREDEF_TYPE_##Id##_ID: \ 6908 T = Context.SingletonId; \ 6909 break; 6910 #include "clang/Basic/OpenCLImageTypes.def" 6911 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 6912 case PREDEF_TYPE_##Id##_ID: \ 6913 T = Context.Id##Ty; \ 6914 break; 6915 #include "clang/Basic/OpenCLExtensionTypes.def" 6916 case PREDEF_TYPE_SAMPLER_ID: 6917 T = Context.OCLSamplerTy; 6918 break; 6919 case PREDEF_TYPE_EVENT_ID: 6920 T = Context.OCLEventTy; 6921 break; 6922 case PREDEF_TYPE_CLK_EVENT_ID: 6923 T = Context.OCLClkEventTy; 6924 break; 6925 case PREDEF_TYPE_QUEUE_ID: 6926 T = Context.OCLQueueTy; 6927 break; 6928 case PREDEF_TYPE_RESERVE_ID_ID: 6929 T = Context.OCLReserveIDTy; 6930 break; 6931 case PREDEF_TYPE_AUTO_DEDUCT: 6932 T = Context.getAutoDeductType(); 6933 break; 6934 case PREDEF_TYPE_AUTO_RREF_DEDUCT: 6935 T = Context.getAutoRRefDeductType(); 6936 break; 6937 case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 6938 T = Context.ARCUnbridgedCastTy; 6939 break; 6940 case PREDEF_TYPE_BUILTIN_FN: 6941 T = Context.BuiltinFnTy; 6942 break; 6943 case PREDEF_TYPE_OMP_ARRAY_SECTION: 6944 T = Context.OMPArraySectionTy; 6945 break; 6946 #define SVE_TYPE(Name, Id, SingletonId) \ 6947 case PREDEF_TYPE_##Id##_ID: \ 6948 T = Context.SingletonId; \ 6949 break; 6950 #include "clang/Basic/AArch64SVEACLETypes.def" 6951 } 6952 6953 assert(!T.isNull() && "Unknown predefined type"); 6954 return T.withFastQualifiers(FastQuals); 6955 } 6956 6957 Index -= NUM_PREDEF_TYPE_IDS; 6958 assert(Index < TypesLoaded.size() && "Type index out-of-range"); 6959 if (TypesLoaded[Index].isNull()) { 6960 TypesLoaded[Index] = readTypeRecord(Index); 6961 if (TypesLoaded[Index].isNull()) 6962 return QualType(); 6963 6964 TypesLoaded[Index]->setFromAST(); 6965 if (DeserializationListener) 6966 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 6967 TypesLoaded[Index]); 6968 } 6969 6970 return TypesLoaded[Index].withFastQualifiers(FastQuals); 6971 } 6972 6973 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 6974 return GetType(getGlobalTypeID(F, LocalID)); 6975 } 6976 6977 serialization::TypeID 6978 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 6979 unsigned FastQuals = LocalID & Qualifiers::FastMask; 6980 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 6981 6982 if (LocalIndex < NUM_PREDEF_TYPE_IDS) 6983 return LocalID; 6984 6985 if (!F.ModuleOffsetMap.empty()) 6986 ReadModuleOffsetMap(F); 6987 6988 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6989 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 6990 assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 6991 6992 unsigned GlobalIndex = LocalIndex + I->second; 6993 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 6994 } 6995 6996 TemplateArgumentLocInfo 6997 ASTRecordReader::readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind) { 6998 switch (Kind) { 6999 case TemplateArgument::Expression: 7000 return readExpr(); 7001 case TemplateArgument::Type: 7002 return readTypeSourceInfo(); 7003 case TemplateArgument::Template: { 7004 NestedNameSpecifierLoc QualifierLoc = 7005 readNestedNameSpecifierLoc(); 7006 SourceLocation TemplateNameLoc = readSourceLocation(); 7007 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 7008 SourceLocation()); 7009 } 7010 case TemplateArgument::TemplateExpansion: { 7011 NestedNameSpecifierLoc QualifierLoc = readNestedNameSpecifierLoc(); 7012 SourceLocation TemplateNameLoc = readSourceLocation(); 7013 SourceLocation EllipsisLoc = readSourceLocation(); 7014 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 7015 EllipsisLoc); 7016 } 7017 case TemplateArgument::Null: 7018 case TemplateArgument::Integral: 7019 case TemplateArgument::Declaration: 7020 case TemplateArgument::NullPtr: 7021 case TemplateArgument::Pack: 7022 // FIXME: Is this right? 7023 return TemplateArgumentLocInfo(); 7024 } 7025 llvm_unreachable("unexpected template argument loc"); 7026 } 7027 7028 TemplateArgumentLoc ASTRecordReader::readTemplateArgumentLoc() { 7029 TemplateArgument Arg = readTemplateArgument(); 7030 7031 if (Arg.getKind() == TemplateArgument::Expression) { 7032 if (readBool()) // bool InfoHasSameExpr. 7033 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 7034 } 7035 return TemplateArgumentLoc(Arg, readTemplateArgumentLocInfo(Arg.getKind())); 7036 } 7037 7038 const ASTTemplateArgumentListInfo * 7039 ASTRecordReader::readASTTemplateArgumentListInfo() { 7040 SourceLocation LAngleLoc = readSourceLocation(); 7041 SourceLocation RAngleLoc = readSourceLocation(); 7042 unsigned NumArgsAsWritten = readInt(); 7043 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 7044 for (unsigned i = 0; i != NumArgsAsWritten; ++i) 7045 TemplArgsInfo.addArgument(readTemplateArgumentLoc()); 7046 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 7047 } 7048 7049 Decl *ASTReader::GetExternalDecl(uint32_t ID) { 7050 return GetDecl(ID); 7051 } 7052 7053 void ASTReader::CompleteRedeclChain(const Decl *D) { 7054 if (NumCurrentElementsDeserializing) { 7055 // We arrange to not care about the complete redeclaration chain while we're 7056 // deserializing. Just remember that the AST has marked this one as complete 7057 // but that it's not actually complete yet, so we know we still need to 7058 // complete it later. 7059 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D)); 7060 return; 7061 } 7062 7063 const DeclContext *DC = D->getDeclContext()->getRedeclContext(); 7064 7065 // If this is a named declaration, complete it by looking it up 7066 // within its context. 7067 // 7068 // FIXME: Merging a function definition should merge 7069 // all mergeable entities within it. 7070 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) || 7071 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) { 7072 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) { 7073 if (!getContext().getLangOpts().CPlusPlus && 7074 isa<TranslationUnitDecl>(DC)) { 7075 // Outside of C++, we don't have a lookup table for the TU, so update 7076 // the identifier instead. (For C++ modules, we don't store decls 7077 // in the serialized identifier table, so we do the lookup in the TU.) 7078 auto *II = Name.getAsIdentifierInfo(); 7079 assert(II && "non-identifier name in C?"); 7080 if (II->isOutOfDate()) 7081 updateOutOfDateIdentifier(*II); 7082 } else 7083 DC->lookup(Name); 7084 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) { 7085 // Find all declarations of this kind from the relevant context. 7086 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) { 7087 auto *DC = cast<DeclContext>(DCDecl); 7088 SmallVector<Decl*, 8> Decls; 7089 FindExternalLexicalDecls( 7090 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls); 7091 } 7092 } 7093 } 7094 7095 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) 7096 CTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7097 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) 7098 VTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7099 if (auto *FD = dyn_cast<FunctionDecl>(D)) { 7100 if (auto *Template = FD->getPrimaryTemplate()) 7101 Template->LoadLazySpecializations(); 7102 } 7103 } 7104 7105 CXXCtorInitializer ** 7106 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) { 7107 RecordLocation Loc = getLocalBitOffset(Offset); 7108 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7109 SavedStreamPosition SavedPosition(Cursor); 7110 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7111 Error(std::move(Err)); 7112 return nullptr; 7113 } 7114 ReadingKindTracker ReadingKind(Read_Decl, *this); 7115 7116 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7117 if (!MaybeCode) { 7118 Error(MaybeCode.takeError()); 7119 return nullptr; 7120 } 7121 unsigned Code = MaybeCode.get(); 7122 7123 ASTRecordReader Record(*this, *Loc.F); 7124 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7125 if (!MaybeRecCode) { 7126 Error(MaybeRecCode.takeError()); 7127 return nullptr; 7128 } 7129 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) { 7130 Error("malformed AST file: missing C++ ctor initializers"); 7131 return nullptr; 7132 } 7133 7134 return Record.readCXXCtorInitializers(); 7135 } 7136 7137 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 7138 assert(ContextObj && "reading base specifiers with no AST context"); 7139 ASTContext &Context = *ContextObj; 7140 7141 RecordLocation Loc = getLocalBitOffset(Offset); 7142 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7143 SavedStreamPosition SavedPosition(Cursor); 7144 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7145 Error(std::move(Err)); 7146 return nullptr; 7147 } 7148 ReadingKindTracker ReadingKind(Read_Decl, *this); 7149 7150 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7151 if (!MaybeCode) { 7152 Error(MaybeCode.takeError()); 7153 return nullptr; 7154 } 7155 unsigned Code = MaybeCode.get(); 7156 7157 ASTRecordReader Record(*this, *Loc.F); 7158 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7159 if (!MaybeRecCode) { 7160 Error(MaybeCode.takeError()); 7161 return nullptr; 7162 } 7163 unsigned RecCode = MaybeRecCode.get(); 7164 7165 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 7166 Error("malformed AST file: missing C++ base specifiers"); 7167 return nullptr; 7168 } 7169 7170 unsigned NumBases = Record.readInt(); 7171 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 7172 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 7173 for (unsigned I = 0; I != NumBases; ++I) 7174 Bases[I] = Record.readCXXBaseSpecifier(); 7175 return Bases; 7176 } 7177 7178 serialization::DeclID 7179 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 7180 if (LocalID < NUM_PREDEF_DECL_IDS) 7181 return LocalID; 7182 7183 if (!F.ModuleOffsetMap.empty()) 7184 ReadModuleOffsetMap(F); 7185 7186 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7187 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 7188 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 7189 7190 return LocalID + I->second; 7191 } 7192 7193 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 7194 ModuleFile &M) const { 7195 // Predefined decls aren't from any module. 7196 if (ID < NUM_PREDEF_DECL_IDS) 7197 return false; 7198 7199 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID && 7200 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls; 7201 } 7202 7203 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 7204 if (!D->isFromASTFile()) 7205 return nullptr; 7206 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 7207 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7208 return I->second; 7209 } 7210 7211 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 7212 if (ID < NUM_PREDEF_DECL_IDS) 7213 return SourceLocation(); 7214 7215 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7216 7217 if (Index > DeclsLoaded.size()) { 7218 Error("declaration ID out-of-range for AST file"); 7219 return SourceLocation(); 7220 } 7221 7222 if (Decl *D = DeclsLoaded[Index]) 7223 return D->getLocation(); 7224 7225 SourceLocation Loc; 7226 DeclCursorForID(ID, Loc); 7227 return Loc; 7228 } 7229 7230 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) { 7231 switch (ID) { 7232 case PREDEF_DECL_NULL_ID: 7233 return nullptr; 7234 7235 case PREDEF_DECL_TRANSLATION_UNIT_ID: 7236 return Context.getTranslationUnitDecl(); 7237 7238 case PREDEF_DECL_OBJC_ID_ID: 7239 return Context.getObjCIdDecl(); 7240 7241 case PREDEF_DECL_OBJC_SEL_ID: 7242 return Context.getObjCSelDecl(); 7243 7244 case PREDEF_DECL_OBJC_CLASS_ID: 7245 return Context.getObjCClassDecl(); 7246 7247 case PREDEF_DECL_OBJC_PROTOCOL_ID: 7248 return Context.getObjCProtocolDecl(); 7249 7250 case PREDEF_DECL_INT_128_ID: 7251 return Context.getInt128Decl(); 7252 7253 case PREDEF_DECL_UNSIGNED_INT_128_ID: 7254 return Context.getUInt128Decl(); 7255 7256 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 7257 return Context.getObjCInstanceTypeDecl(); 7258 7259 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 7260 return Context.getBuiltinVaListDecl(); 7261 7262 case PREDEF_DECL_VA_LIST_TAG: 7263 return Context.getVaListTagDecl(); 7264 7265 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID: 7266 return Context.getBuiltinMSVaListDecl(); 7267 7268 case PREDEF_DECL_EXTERN_C_CONTEXT_ID: 7269 return Context.getExternCContextDecl(); 7270 7271 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID: 7272 return Context.getMakeIntegerSeqDecl(); 7273 7274 case PREDEF_DECL_CF_CONSTANT_STRING_ID: 7275 return Context.getCFConstantStringDecl(); 7276 7277 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID: 7278 return Context.getCFConstantStringTagDecl(); 7279 7280 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID: 7281 return Context.getTypePackElementDecl(); 7282 } 7283 llvm_unreachable("PredefinedDeclIDs unknown enum value"); 7284 } 7285 7286 Decl *ASTReader::GetExistingDecl(DeclID ID) { 7287 assert(ContextObj && "reading decl with no AST context"); 7288 if (ID < NUM_PREDEF_DECL_IDS) { 7289 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID); 7290 if (D) { 7291 // Track that we have merged the declaration with ID \p ID into the 7292 // pre-existing predefined declaration \p D. 7293 auto &Merged = KeyDecls[D->getCanonicalDecl()]; 7294 if (Merged.empty()) 7295 Merged.push_back(ID); 7296 } 7297 return D; 7298 } 7299 7300 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7301 7302 if (Index >= DeclsLoaded.size()) { 7303 assert(0 && "declaration ID out-of-range for AST file"); 7304 Error("declaration ID out-of-range for AST file"); 7305 return nullptr; 7306 } 7307 7308 return DeclsLoaded[Index]; 7309 } 7310 7311 Decl *ASTReader::GetDecl(DeclID ID) { 7312 if (ID < NUM_PREDEF_DECL_IDS) 7313 return GetExistingDecl(ID); 7314 7315 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7316 7317 if (Index >= DeclsLoaded.size()) { 7318 assert(0 && "declaration ID out-of-range for AST file"); 7319 Error("declaration ID out-of-range for AST file"); 7320 return nullptr; 7321 } 7322 7323 if (!DeclsLoaded[Index]) { 7324 ReadDeclRecord(ID); 7325 if (DeserializationListener) 7326 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 7327 } 7328 7329 return DeclsLoaded[Index]; 7330 } 7331 7332 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 7333 DeclID GlobalID) { 7334 if (GlobalID < NUM_PREDEF_DECL_IDS) 7335 return GlobalID; 7336 7337 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 7338 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7339 ModuleFile *Owner = I->second; 7340 7341 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 7342 = M.GlobalToLocalDeclIDs.find(Owner); 7343 if (Pos == M.GlobalToLocalDeclIDs.end()) 7344 return 0; 7345 7346 return GlobalID - Owner->BaseDeclID + Pos->second; 7347 } 7348 7349 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 7350 const RecordData &Record, 7351 unsigned &Idx) { 7352 if (Idx >= Record.size()) { 7353 Error("Corrupted AST file"); 7354 return 0; 7355 } 7356 7357 return getGlobalDeclID(F, Record[Idx++]); 7358 } 7359 7360 /// Resolve the offset of a statement into a statement. 7361 /// 7362 /// This operation will read a new statement from the external 7363 /// source each time it is called, and is meant to be used via a 7364 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 7365 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 7366 // Switch case IDs are per Decl. 7367 ClearSwitchCaseIDs(); 7368 7369 // Offset here is a global offset across the entire chain. 7370 RecordLocation Loc = getLocalBitOffset(Offset); 7371 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) { 7372 Error(std::move(Err)); 7373 return nullptr; 7374 } 7375 assert(NumCurrentElementsDeserializing == 0 && 7376 "should not be called while already deserializing"); 7377 Deserializing D(this); 7378 return ReadStmtFromStream(*Loc.F); 7379 } 7380 7381 void ASTReader::FindExternalLexicalDecls( 7382 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 7383 SmallVectorImpl<Decl *> &Decls) { 7384 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {}; 7385 7386 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) { 7387 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries"); 7388 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) { 7389 auto K = (Decl::Kind)+LexicalDecls[I]; 7390 if (!IsKindWeWant(K)) 7391 continue; 7392 7393 auto ID = (serialization::DeclID)+LexicalDecls[I + 1]; 7394 7395 // Don't add predefined declarations to the lexical context more 7396 // than once. 7397 if (ID < NUM_PREDEF_DECL_IDS) { 7398 if (PredefsVisited[ID]) 7399 continue; 7400 7401 PredefsVisited[ID] = true; 7402 } 7403 7404 if (Decl *D = GetLocalDecl(*M, ID)) { 7405 assert(D->getKind() == K && "wrong kind for lexical decl"); 7406 if (!DC->isDeclInLexicalTraversal(D)) 7407 Decls.push_back(D); 7408 } 7409 } 7410 }; 7411 7412 if (isa<TranslationUnitDecl>(DC)) { 7413 for (auto Lexical : TULexicalDecls) 7414 Visit(Lexical.first, Lexical.second); 7415 } else { 7416 auto I = LexicalDecls.find(DC); 7417 if (I != LexicalDecls.end()) 7418 Visit(I->second.first, I->second.second); 7419 } 7420 7421 ++NumLexicalDeclContextsRead; 7422 } 7423 7424 namespace { 7425 7426 class DeclIDComp { 7427 ASTReader &Reader; 7428 ModuleFile &Mod; 7429 7430 public: 7431 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 7432 7433 bool operator()(LocalDeclID L, LocalDeclID R) const { 7434 SourceLocation LHS = getLocation(L); 7435 SourceLocation RHS = getLocation(R); 7436 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7437 } 7438 7439 bool operator()(SourceLocation LHS, LocalDeclID R) const { 7440 SourceLocation RHS = getLocation(R); 7441 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7442 } 7443 7444 bool operator()(LocalDeclID L, SourceLocation RHS) const { 7445 SourceLocation LHS = getLocation(L); 7446 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7447 } 7448 7449 SourceLocation getLocation(LocalDeclID ID) const { 7450 return Reader.getSourceManager().getFileLoc( 7451 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 7452 } 7453 }; 7454 7455 } // namespace 7456 7457 void ASTReader::FindFileRegionDecls(FileID File, 7458 unsigned Offset, unsigned Length, 7459 SmallVectorImpl<Decl *> &Decls) { 7460 SourceManager &SM = getSourceManager(); 7461 7462 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 7463 if (I == FileDeclIDs.end()) 7464 return; 7465 7466 FileDeclsInfo &DInfo = I->second; 7467 if (DInfo.Decls.empty()) 7468 return; 7469 7470 SourceLocation 7471 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 7472 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 7473 7474 DeclIDComp DIDComp(*this, *DInfo.Mod); 7475 ArrayRef<serialization::LocalDeclID>::iterator BeginIt = 7476 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp); 7477 if (BeginIt != DInfo.Decls.begin()) 7478 --BeginIt; 7479 7480 // If we are pointing at a top-level decl inside an objc container, we need 7481 // to backtrack until we find it otherwise we will fail to report that the 7482 // region overlaps with an objc container. 7483 while (BeginIt != DInfo.Decls.begin() && 7484 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 7485 ->isTopLevelDeclInObjCContainer()) 7486 --BeginIt; 7487 7488 ArrayRef<serialization::LocalDeclID>::iterator EndIt = 7489 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp); 7490 if (EndIt != DInfo.Decls.end()) 7491 ++EndIt; 7492 7493 for (ArrayRef<serialization::LocalDeclID>::iterator 7494 DIt = BeginIt; DIt != EndIt; ++DIt) 7495 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 7496 } 7497 7498 bool 7499 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 7500 DeclarationName Name) { 7501 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && 7502 "DeclContext has no visible decls in storage"); 7503 if (!Name) 7504 return false; 7505 7506 auto It = Lookups.find(DC); 7507 if (It == Lookups.end()) 7508 return false; 7509 7510 Deserializing LookupResults(this); 7511 7512 // Load the list of declarations. 7513 SmallVector<NamedDecl *, 64> Decls; 7514 for (DeclID ID : It->second.Table.find(Name)) { 7515 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7516 if (ND->getDeclName() == Name) 7517 Decls.push_back(ND); 7518 } 7519 7520 ++NumVisibleDeclContextsRead; 7521 SetExternalVisibleDeclsForName(DC, Name, Decls); 7522 return !Decls.empty(); 7523 } 7524 7525 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 7526 if (!DC->hasExternalVisibleStorage()) 7527 return; 7528 7529 auto It = Lookups.find(DC); 7530 assert(It != Lookups.end() && 7531 "have external visible storage but no lookup tables"); 7532 7533 DeclsMap Decls; 7534 7535 for (DeclID ID : It->second.Table.findAll()) { 7536 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7537 Decls[ND->getDeclName()].push_back(ND); 7538 } 7539 7540 ++NumVisibleDeclContextsRead; 7541 7542 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 7543 SetExternalVisibleDeclsForName(DC, I->first, I->second); 7544 } 7545 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 7546 } 7547 7548 const serialization::reader::DeclContextLookupTable * 7549 ASTReader::getLoadedLookupTables(DeclContext *Primary) const { 7550 auto I = Lookups.find(Primary); 7551 return I == Lookups.end() ? nullptr : &I->second; 7552 } 7553 7554 /// Under non-PCH compilation the consumer receives the objc methods 7555 /// before receiving the implementation, and codegen depends on this. 7556 /// We simulate this by deserializing and passing to consumer the methods of the 7557 /// implementation before passing the deserialized implementation decl. 7558 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 7559 ASTConsumer *Consumer) { 7560 assert(ImplD && Consumer); 7561 7562 for (auto *I : ImplD->methods()) 7563 Consumer->HandleInterestingDecl(DeclGroupRef(I)); 7564 7565 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 7566 } 7567 7568 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 7569 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 7570 PassObjCImplDeclToConsumer(ImplD, Consumer); 7571 else 7572 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 7573 } 7574 7575 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 7576 this->Consumer = Consumer; 7577 7578 if (Consumer) 7579 PassInterestingDeclsToConsumer(); 7580 7581 if (DeserializationListener) 7582 DeserializationListener->ReaderInitialized(this); 7583 } 7584 7585 void ASTReader::PrintStats() { 7586 std::fprintf(stderr, "*** AST File Statistics:\n"); 7587 7588 unsigned NumTypesLoaded 7589 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 7590 QualType()); 7591 unsigned NumDeclsLoaded 7592 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 7593 (Decl *)nullptr); 7594 unsigned NumIdentifiersLoaded 7595 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 7596 IdentifiersLoaded.end(), 7597 (IdentifierInfo *)nullptr); 7598 unsigned NumMacrosLoaded 7599 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 7600 MacrosLoaded.end(), 7601 (MacroInfo *)nullptr); 7602 unsigned NumSelectorsLoaded 7603 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 7604 SelectorsLoaded.end(), 7605 Selector()); 7606 7607 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 7608 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 7609 NumSLocEntriesRead, TotalNumSLocEntries, 7610 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 7611 if (!TypesLoaded.empty()) 7612 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 7613 NumTypesLoaded, (unsigned)TypesLoaded.size(), 7614 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 7615 if (!DeclsLoaded.empty()) 7616 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 7617 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 7618 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 7619 if (!IdentifiersLoaded.empty()) 7620 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 7621 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 7622 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 7623 if (!MacrosLoaded.empty()) 7624 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7625 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 7626 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 7627 if (!SelectorsLoaded.empty()) 7628 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 7629 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 7630 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 7631 if (TotalNumStatements) 7632 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 7633 NumStatementsRead, TotalNumStatements, 7634 ((float)NumStatementsRead/TotalNumStatements * 100)); 7635 if (TotalNumMacros) 7636 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7637 NumMacrosRead, TotalNumMacros, 7638 ((float)NumMacrosRead/TotalNumMacros * 100)); 7639 if (TotalLexicalDeclContexts) 7640 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 7641 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 7642 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 7643 * 100)); 7644 if (TotalVisibleDeclContexts) 7645 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 7646 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 7647 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 7648 * 100)); 7649 if (TotalNumMethodPoolEntries) 7650 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 7651 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 7652 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 7653 * 100)); 7654 if (NumMethodPoolLookups) 7655 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 7656 NumMethodPoolHits, NumMethodPoolLookups, 7657 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 7658 if (NumMethodPoolTableLookups) 7659 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 7660 NumMethodPoolTableHits, NumMethodPoolTableLookups, 7661 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 7662 * 100.0)); 7663 if (NumIdentifierLookupHits) 7664 std::fprintf(stderr, 7665 " %u / %u identifier table lookups succeeded (%f%%)\n", 7666 NumIdentifierLookupHits, NumIdentifierLookups, 7667 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 7668 7669 if (GlobalIndex) { 7670 std::fprintf(stderr, "\n"); 7671 GlobalIndex->printStats(); 7672 } 7673 7674 std::fprintf(stderr, "\n"); 7675 dump(); 7676 std::fprintf(stderr, "\n"); 7677 } 7678 7679 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 7680 LLVM_DUMP_METHOD static void 7681 dumpModuleIDMap(StringRef Name, 7682 const ContinuousRangeMap<Key, ModuleFile *, 7683 InitialCapacity> &Map) { 7684 if (Map.begin() == Map.end()) 7685 return; 7686 7687 using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>; 7688 7689 llvm::errs() << Name << ":\n"; 7690 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 7691 I != IEnd; ++I) { 7692 llvm::errs() << " " << I->first << " -> " << I->second->FileName 7693 << "\n"; 7694 } 7695 } 7696 7697 LLVM_DUMP_METHOD void ASTReader::dump() { 7698 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 7699 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 7700 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 7701 dumpModuleIDMap("Global type map", GlobalTypeMap); 7702 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 7703 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 7704 dumpModuleIDMap("Global macro map", GlobalMacroMap); 7705 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 7706 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 7707 dumpModuleIDMap("Global preprocessed entity map", 7708 GlobalPreprocessedEntityMap); 7709 7710 llvm::errs() << "\n*** PCH/Modules Loaded:"; 7711 for (ModuleFile &M : ModuleMgr) 7712 M.dump(); 7713 } 7714 7715 /// Return the amount of memory used by memory buffers, breaking down 7716 /// by heap-backed versus mmap'ed memory. 7717 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 7718 for (ModuleFile &I : ModuleMgr) { 7719 if (llvm::MemoryBuffer *buf = I.Buffer) { 7720 size_t bytes = buf->getBufferSize(); 7721 switch (buf->getBufferKind()) { 7722 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 7723 sizes.malloc_bytes += bytes; 7724 break; 7725 case llvm::MemoryBuffer::MemoryBuffer_MMap: 7726 sizes.mmap_bytes += bytes; 7727 break; 7728 } 7729 } 7730 } 7731 } 7732 7733 void ASTReader::InitializeSema(Sema &S) { 7734 SemaObj = &S; 7735 S.addExternalSource(this); 7736 7737 // Makes sure any declarations that were deserialized "too early" 7738 // still get added to the identifier's declaration chains. 7739 for (uint64_t ID : PreloadedDeclIDs) { 7740 NamedDecl *D = cast<NamedDecl>(GetDecl(ID)); 7741 pushExternalDeclIntoScope(D, D->getDeclName()); 7742 } 7743 PreloadedDeclIDs.clear(); 7744 7745 // FIXME: What happens if these are changed by a module import? 7746 if (!FPPragmaOptions.empty()) { 7747 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 7748 SemaObj->FPFeatures = FPOptions(FPPragmaOptions[0]); 7749 } 7750 7751 SemaObj->OpenCLFeatures.copy(OpenCLExtensions); 7752 SemaObj->OpenCLTypeExtMap = OpenCLTypeExtMap; 7753 SemaObj->OpenCLDeclExtMap = OpenCLDeclExtMap; 7754 7755 UpdateSema(); 7756 } 7757 7758 void ASTReader::UpdateSema() { 7759 assert(SemaObj && "no Sema to update"); 7760 7761 // Load the offsets of the declarations that Sema references. 7762 // They will be lazily deserialized when needed. 7763 if (!SemaDeclRefs.empty()) { 7764 assert(SemaDeclRefs.size() % 3 == 0); 7765 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) { 7766 if (!SemaObj->StdNamespace) 7767 SemaObj->StdNamespace = SemaDeclRefs[I]; 7768 if (!SemaObj->StdBadAlloc) 7769 SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 7770 if (!SemaObj->StdAlignValT) 7771 SemaObj->StdAlignValT = SemaDeclRefs[I+2]; 7772 } 7773 SemaDeclRefs.clear(); 7774 } 7775 7776 // Update the state of pragmas. Use the same API as if we had encountered the 7777 // pragma in the source. 7778 if(OptimizeOffPragmaLocation.isValid()) 7779 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation); 7780 if (PragmaMSStructState != -1) 7781 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState); 7782 if (PointersToMembersPragmaLocation.isValid()) { 7783 SemaObj->ActOnPragmaMSPointersToMembers( 7784 (LangOptions::PragmaMSPointersToMembersKind) 7785 PragmaMSPointersToMembersState, 7786 PointersToMembersPragmaLocation); 7787 } 7788 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth; 7789 7790 if (PragmaPackCurrentValue) { 7791 // The bottom of the stack might have a default value. It must be adjusted 7792 // to the current value to ensure that the packing state is preserved after 7793 // popping entries that were included/imported from a PCH/module. 7794 bool DropFirst = false; 7795 if (!PragmaPackStack.empty() && 7796 PragmaPackStack.front().Location.isInvalid()) { 7797 assert(PragmaPackStack.front().Value == SemaObj->PackStack.DefaultValue && 7798 "Expected a default alignment value"); 7799 SemaObj->PackStack.Stack.emplace_back( 7800 PragmaPackStack.front().SlotLabel, SemaObj->PackStack.CurrentValue, 7801 SemaObj->PackStack.CurrentPragmaLocation, 7802 PragmaPackStack.front().PushLocation); 7803 DropFirst = true; 7804 } 7805 for (const auto &Entry : 7806 llvm::makeArrayRef(PragmaPackStack).drop_front(DropFirst ? 1 : 0)) 7807 SemaObj->PackStack.Stack.emplace_back(Entry.SlotLabel, Entry.Value, 7808 Entry.Location, Entry.PushLocation); 7809 if (PragmaPackCurrentLocation.isInvalid()) { 7810 assert(*PragmaPackCurrentValue == SemaObj->PackStack.DefaultValue && 7811 "Expected a default alignment value"); 7812 // Keep the current values. 7813 } else { 7814 SemaObj->PackStack.CurrentValue = *PragmaPackCurrentValue; 7815 SemaObj->PackStack.CurrentPragmaLocation = PragmaPackCurrentLocation; 7816 } 7817 } 7818 } 7819 7820 IdentifierInfo *ASTReader::get(StringRef Name) { 7821 // Note that we are loading an identifier. 7822 Deserializing AnIdentifier(this); 7823 7824 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 7825 NumIdentifierLookups, 7826 NumIdentifierLookupHits); 7827 7828 // We don't need to do identifier table lookups in C++ modules (we preload 7829 // all interesting declarations, and don't need to use the scope for name 7830 // lookups). Perform the lookup in PCH files, though, since we don't build 7831 // a complete initial identifier table if we're carrying on from a PCH. 7832 if (PP.getLangOpts().CPlusPlus) { 7833 for (auto F : ModuleMgr.pch_modules()) 7834 if (Visitor(*F)) 7835 break; 7836 } else { 7837 // If there is a global index, look there first to determine which modules 7838 // provably do not have any results for this identifier. 7839 GlobalModuleIndex::HitSet Hits; 7840 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 7841 if (!loadGlobalIndex()) { 7842 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 7843 HitsPtr = &Hits; 7844 } 7845 } 7846 7847 ModuleMgr.visit(Visitor, HitsPtr); 7848 } 7849 7850 IdentifierInfo *II = Visitor.getIdentifierInfo(); 7851 markIdentifierUpToDate(II); 7852 return II; 7853 } 7854 7855 namespace clang { 7856 7857 /// An identifier-lookup iterator that enumerates all of the 7858 /// identifiers stored within a set of AST files. 7859 class ASTIdentifierIterator : public IdentifierIterator { 7860 /// The AST reader whose identifiers are being enumerated. 7861 const ASTReader &Reader; 7862 7863 /// The current index into the chain of AST files stored in 7864 /// the AST reader. 7865 unsigned Index; 7866 7867 /// The current position within the identifier lookup table 7868 /// of the current AST file. 7869 ASTIdentifierLookupTable::key_iterator Current; 7870 7871 /// The end position within the identifier lookup table of 7872 /// the current AST file. 7873 ASTIdentifierLookupTable::key_iterator End; 7874 7875 /// Whether to skip any modules in the ASTReader. 7876 bool SkipModules; 7877 7878 public: 7879 explicit ASTIdentifierIterator(const ASTReader &Reader, 7880 bool SkipModules = false); 7881 7882 StringRef Next() override; 7883 }; 7884 7885 } // namespace clang 7886 7887 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader, 7888 bool SkipModules) 7889 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) { 7890 } 7891 7892 StringRef ASTIdentifierIterator::Next() { 7893 while (Current == End) { 7894 // If we have exhausted all of our AST files, we're done. 7895 if (Index == 0) 7896 return StringRef(); 7897 7898 --Index; 7899 ModuleFile &F = Reader.ModuleMgr[Index]; 7900 if (SkipModules && F.isModule()) 7901 continue; 7902 7903 ASTIdentifierLookupTable *IdTable = 7904 (ASTIdentifierLookupTable *)F.IdentifierLookupTable; 7905 Current = IdTable->key_begin(); 7906 End = IdTable->key_end(); 7907 } 7908 7909 // We have any identifiers remaining in the current AST file; return 7910 // the next one. 7911 StringRef Result = *Current; 7912 ++Current; 7913 return Result; 7914 } 7915 7916 namespace { 7917 7918 /// A utility for appending two IdentifierIterators. 7919 class ChainedIdentifierIterator : public IdentifierIterator { 7920 std::unique_ptr<IdentifierIterator> Current; 7921 std::unique_ptr<IdentifierIterator> Queued; 7922 7923 public: 7924 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First, 7925 std::unique_ptr<IdentifierIterator> Second) 7926 : Current(std::move(First)), Queued(std::move(Second)) {} 7927 7928 StringRef Next() override { 7929 if (!Current) 7930 return StringRef(); 7931 7932 StringRef result = Current->Next(); 7933 if (!result.empty()) 7934 return result; 7935 7936 // Try the queued iterator, which may itself be empty. 7937 Current.reset(); 7938 std::swap(Current, Queued); 7939 return Next(); 7940 } 7941 }; 7942 7943 } // namespace 7944 7945 IdentifierIterator *ASTReader::getIdentifiers() { 7946 if (!loadGlobalIndex()) { 7947 std::unique_ptr<IdentifierIterator> ReaderIter( 7948 new ASTIdentifierIterator(*this, /*SkipModules=*/true)); 7949 std::unique_ptr<IdentifierIterator> ModulesIter( 7950 GlobalIndex->createIdentifierIterator()); 7951 return new ChainedIdentifierIterator(std::move(ReaderIter), 7952 std::move(ModulesIter)); 7953 } 7954 7955 return new ASTIdentifierIterator(*this); 7956 } 7957 7958 namespace clang { 7959 namespace serialization { 7960 7961 class ReadMethodPoolVisitor { 7962 ASTReader &Reader; 7963 Selector Sel; 7964 unsigned PriorGeneration; 7965 unsigned InstanceBits = 0; 7966 unsigned FactoryBits = 0; 7967 bool InstanceHasMoreThanOneDecl = false; 7968 bool FactoryHasMoreThanOneDecl = false; 7969 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 7970 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 7971 7972 public: 7973 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 7974 unsigned PriorGeneration) 7975 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {} 7976 7977 bool operator()(ModuleFile &M) { 7978 if (!M.SelectorLookupTable) 7979 return false; 7980 7981 // If we've already searched this module file, skip it now. 7982 if (M.Generation <= PriorGeneration) 7983 return true; 7984 7985 ++Reader.NumMethodPoolTableLookups; 7986 ASTSelectorLookupTable *PoolTable 7987 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 7988 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel); 7989 if (Pos == PoolTable->end()) 7990 return false; 7991 7992 ++Reader.NumMethodPoolTableHits; 7993 ++Reader.NumSelectorsRead; 7994 // FIXME: Not quite happy with the statistics here. We probably should 7995 // disable this tracking when called via LoadSelector. 7996 // Also, should entries without methods count as misses? 7997 ++Reader.NumMethodPoolEntriesRead; 7998 ASTSelectorLookupTrait::data_type Data = *Pos; 7999 if (Reader.DeserializationListener) 8000 Reader.DeserializationListener->SelectorRead(Data.ID, Sel); 8001 8002 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 8003 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 8004 InstanceBits = Data.InstanceBits; 8005 FactoryBits = Data.FactoryBits; 8006 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl; 8007 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl; 8008 return true; 8009 } 8010 8011 /// Retrieve the instance methods found by this visitor. 8012 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 8013 return InstanceMethods; 8014 } 8015 8016 /// Retrieve the instance methods found by this visitor. 8017 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 8018 return FactoryMethods; 8019 } 8020 8021 unsigned getInstanceBits() const { return InstanceBits; } 8022 unsigned getFactoryBits() const { return FactoryBits; } 8023 8024 bool instanceHasMoreThanOneDecl() const { 8025 return InstanceHasMoreThanOneDecl; 8026 } 8027 8028 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; } 8029 }; 8030 8031 } // namespace serialization 8032 } // namespace clang 8033 8034 /// Add the given set of methods to the method list. 8035 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 8036 ObjCMethodList &List) { 8037 for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 8038 S.addMethodToGlobalList(&List, Methods[I]); 8039 } 8040 } 8041 8042 void ASTReader::ReadMethodPool(Selector Sel) { 8043 // Get the selector generation and update it to the current generation. 8044 unsigned &Generation = SelectorGeneration[Sel]; 8045 unsigned PriorGeneration = Generation; 8046 Generation = getGeneration(); 8047 SelectorOutOfDate[Sel] = false; 8048 8049 // Search for methods defined with this selector. 8050 ++NumMethodPoolLookups; 8051 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 8052 ModuleMgr.visit(Visitor); 8053 8054 if (Visitor.getInstanceMethods().empty() && 8055 Visitor.getFactoryMethods().empty()) 8056 return; 8057 8058 ++NumMethodPoolHits; 8059 8060 if (!getSema()) 8061 return; 8062 8063 Sema &S = *getSema(); 8064 Sema::GlobalMethodPool::iterator Pos 8065 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first; 8066 8067 Pos->second.first.setBits(Visitor.getInstanceBits()); 8068 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl()); 8069 Pos->second.second.setBits(Visitor.getFactoryBits()); 8070 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl()); 8071 8072 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since 8073 // when building a module we keep every method individually and may need to 8074 // update hasMoreThanOneDecl as we add the methods. 8075 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 8076 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 8077 } 8078 8079 void ASTReader::updateOutOfDateSelector(Selector Sel) { 8080 if (SelectorOutOfDate[Sel]) 8081 ReadMethodPool(Sel); 8082 } 8083 8084 void ASTReader::ReadKnownNamespaces( 8085 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 8086 Namespaces.clear(); 8087 8088 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 8089 if (NamespaceDecl *Namespace 8090 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 8091 Namespaces.push_back(Namespace); 8092 } 8093 } 8094 8095 void ASTReader::ReadUndefinedButUsed( 8096 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) { 8097 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 8098 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 8099 SourceLocation Loc = 8100 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 8101 Undefined.insert(std::make_pair(D, Loc)); 8102 } 8103 } 8104 8105 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector< 8106 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> & 8107 Exprs) { 8108 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) { 8109 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++])); 8110 uint64_t Count = DelayedDeleteExprs[Idx++]; 8111 for (uint64_t C = 0; C < Count; ++C) { 8112 SourceLocation DeleteLoc = 8113 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]); 8114 const bool IsArrayForm = DelayedDeleteExprs[Idx++]; 8115 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm)); 8116 } 8117 } 8118 } 8119 8120 void ASTReader::ReadTentativeDefinitions( 8121 SmallVectorImpl<VarDecl *> &TentativeDefs) { 8122 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 8123 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 8124 if (Var) 8125 TentativeDefs.push_back(Var); 8126 } 8127 TentativeDefinitions.clear(); 8128 } 8129 8130 void ASTReader::ReadUnusedFileScopedDecls( 8131 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 8132 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 8133 DeclaratorDecl *D 8134 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 8135 if (D) 8136 Decls.push_back(D); 8137 } 8138 UnusedFileScopedDecls.clear(); 8139 } 8140 8141 void ASTReader::ReadDelegatingConstructors( 8142 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 8143 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 8144 CXXConstructorDecl *D 8145 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 8146 if (D) 8147 Decls.push_back(D); 8148 } 8149 DelegatingCtorDecls.clear(); 8150 } 8151 8152 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 8153 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 8154 TypedefNameDecl *D 8155 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 8156 if (D) 8157 Decls.push_back(D); 8158 } 8159 ExtVectorDecls.clear(); 8160 } 8161 8162 void ASTReader::ReadUnusedLocalTypedefNameCandidates( 8163 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 8164 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N; 8165 ++I) { 8166 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>( 8167 GetDecl(UnusedLocalTypedefNameCandidates[I])); 8168 if (D) 8169 Decls.insert(D); 8170 } 8171 UnusedLocalTypedefNameCandidates.clear(); 8172 } 8173 8174 void ASTReader::ReadReferencedSelectors( 8175 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) { 8176 if (ReferencedSelectorsData.empty()) 8177 return; 8178 8179 // If there are @selector references added them to its pool. This is for 8180 // implementation of -Wselector. 8181 unsigned int DataSize = ReferencedSelectorsData.size()-1; 8182 unsigned I = 0; 8183 while (I < DataSize) { 8184 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 8185 SourceLocation SelLoc 8186 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 8187 Sels.push_back(std::make_pair(Sel, SelLoc)); 8188 } 8189 ReferencedSelectorsData.clear(); 8190 } 8191 8192 void ASTReader::ReadWeakUndeclaredIdentifiers( 8193 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) { 8194 if (WeakUndeclaredIdentifiers.empty()) 8195 return; 8196 8197 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 8198 IdentifierInfo *WeakId 8199 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8200 IdentifierInfo *AliasId 8201 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8202 SourceLocation Loc 8203 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 8204 bool Used = WeakUndeclaredIdentifiers[I++]; 8205 WeakInfo WI(AliasId, Loc); 8206 WI.setUsed(Used); 8207 WeakIDs.push_back(std::make_pair(WeakId, WI)); 8208 } 8209 WeakUndeclaredIdentifiers.clear(); 8210 } 8211 8212 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 8213 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 8214 ExternalVTableUse VT; 8215 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 8216 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 8217 VT.DefinitionRequired = VTableUses[Idx++]; 8218 VTables.push_back(VT); 8219 } 8220 8221 VTableUses.clear(); 8222 } 8223 8224 void ASTReader::ReadPendingInstantiations( 8225 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) { 8226 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 8227 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 8228 SourceLocation Loc 8229 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 8230 8231 Pending.push_back(std::make_pair(D, Loc)); 8232 } 8233 PendingInstantiations.clear(); 8234 } 8235 8236 void ASTReader::ReadLateParsedTemplates( 8237 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>> 8238 &LPTMap) { 8239 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N; 8240 /* In loop */) { 8241 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++])); 8242 8243 auto LT = std::make_unique<LateParsedTemplate>(); 8244 LT->D = GetDecl(LateParsedTemplates[Idx++]); 8245 8246 ModuleFile *F = getOwningModuleFile(LT->D); 8247 assert(F && "No module"); 8248 8249 unsigned TokN = LateParsedTemplates[Idx++]; 8250 LT->Toks.reserve(TokN); 8251 for (unsigned T = 0; T < TokN; ++T) 8252 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx)); 8253 8254 LPTMap.insert(std::make_pair(FD, std::move(LT))); 8255 } 8256 8257 LateParsedTemplates.clear(); 8258 } 8259 8260 void ASTReader::LoadSelector(Selector Sel) { 8261 // It would be complicated to avoid reading the methods anyway. So don't. 8262 ReadMethodPool(Sel); 8263 } 8264 8265 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 8266 assert(ID && "Non-zero identifier ID required"); 8267 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 8268 IdentifiersLoaded[ID - 1] = II; 8269 if (DeserializationListener) 8270 DeserializationListener->IdentifierRead(ID, II); 8271 } 8272 8273 /// Set the globally-visible declarations associated with the given 8274 /// identifier. 8275 /// 8276 /// If the AST reader is currently in a state where the given declaration IDs 8277 /// cannot safely be resolved, they are queued until it is safe to resolve 8278 /// them. 8279 /// 8280 /// \param II an IdentifierInfo that refers to one or more globally-visible 8281 /// declarations. 8282 /// 8283 /// \param DeclIDs the set of declaration IDs with the name @p II that are 8284 /// visible at global scope. 8285 /// 8286 /// \param Decls if non-null, this vector will be populated with the set of 8287 /// deserialized declarations. These declarations will not be pushed into 8288 /// scope. 8289 void 8290 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 8291 const SmallVectorImpl<uint32_t> &DeclIDs, 8292 SmallVectorImpl<Decl *> *Decls) { 8293 if (NumCurrentElementsDeserializing && !Decls) { 8294 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 8295 return; 8296 } 8297 8298 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 8299 if (!SemaObj) { 8300 // Queue this declaration so that it will be added to the 8301 // translation unit scope and identifier's declaration chain 8302 // once a Sema object is known. 8303 PreloadedDeclIDs.push_back(DeclIDs[I]); 8304 continue; 8305 } 8306 8307 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 8308 8309 // If we're simply supposed to record the declarations, do so now. 8310 if (Decls) { 8311 Decls->push_back(D); 8312 continue; 8313 } 8314 8315 // Introduce this declaration into the translation-unit scope 8316 // and add it to the declaration chain for this identifier, so 8317 // that (unqualified) name lookup will find it. 8318 pushExternalDeclIntoScope(D, II); 8319 } 8320 } 8321 8322 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 8323 if (ID == 0) 8324 return nullptr; 8325 8326 if (IdentifiersLoaded.empty()) { 8327 Error("no identifier table in AST file"); 8328 return nullptr; 8329 } 8330 8331 ID -= 1; 8332 if (!IdentifiersLoaded[ID]) { 8333 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 8334 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 8335 ModuleFile *M = I->second; 8336 unsigned Index = ID - M->BaseIdentifierID; 8337 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index]; 8338 8339 // All of the strings in the AST file are preceded by a 16-bit length. 8340 // Extract that 16-bit length to avoid having to execute strlen(). 8341 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as 8342 // unsigned integers. This is important to avoid integer overflow when 8343 // we cast them to 'unsigned'. 8344 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2; 8345 unsigned StrLen = (((unsigned) StrLenPtr[0]) 8346 | (((unsigned) StrLenPtr[1]) << 8)) - 1; 8347 auto &II = PP.getIdentifierTable().get(StringRef(Str, StrLen)); 8348 IdentifiersLoaded[ID] = &II; 8349 markIdentifierFromAST(*this, II); 8350 if (DeserializationListener) 8351 DeserializationListener->IdentifierRead(ID + 1, &II); 8352 } 8353 8354 return IdentifiersLoaded[ID]; 8355 } 8356 8357 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 8358 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 8359 } 8360 8361 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 8362 if (LocalID < NUM_PREDEF_IDENT_IDS) 8363 return LocalID; 8364 8365 if (!M.ModuleOffsetMap.empty()) 8366 ReadModuleOffsetMap(M); 8367 8368 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8369 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 8370 assert(I != M.IdentifierRemap.end() 8371 && "Invalid index into identifier index remap"); 8372 8373 return LocalID + I->second; 8374 } 8375 8376 MacroInfo *ASTReader::getMacro(MacroID ID) { 8377 if (ID == 0) 8378 return nullptr; 8379 8380 if (MacrosLoaded.empty()) { 8381 Error("no macro table in AST file"); 8382 return nullptr; 8383 } 8384 8385 ID -= NUM_PREDEF_MACRO_IDS; 8386 if (!MacrosLoaded[ID]) { 8387 GlobalMacroMapType::iterator I 8388 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 8389 assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 8390 ModuleFile *M = I->second; 8391 unsigned Index = ID - M->BaseMacroID; 8392 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]); 8393 8394 if (DeserializationListener) 8395 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 8396 MacrosLoaded[ID]); 8397 } 8398 8399 return MacrosLoaded[ID]; 8400 } 8401 8402 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 8403 if (LocalID < NUM_PREDEF_MACRO_IDS) 8404 return LocalID; 8405 8406 if (!M.ModuleOffsetMap.empty()) 8407 ReadModuleOffsetMap(M); 8408 8409 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8410 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 8411 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 8412 8413 return LocalID + I->second; 8414 } 8415 8416 serialization::SubmoduleID 8417 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 8418 if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 8419 return LocalID; 8420 8421 if (!M.ModuleOffsetMap.empty()) 8422 ReadModuleOffsetMap(M); 8423 8424 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8425 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 8426 assert(I != M.SubmoduleRemap.end() 8427 && "Invalid index into submodule index remap"); 8428 8429 return LocalID + I->second; 8430 } 8431 8432 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) { 8433 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 8434 assert(GlobalID == 0 && "Unhandled global submodule ID"); 8435 return nullptr; 8436 } 8437 8438 if (GlobalID > SubmodulesLoaded.size()) { 8439 Error("submodule ID out of range in AST file"); 8440 return nullptr; 8441 } 8442 8443 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 8444 } 8445 8446 Module *ASTReader::getModule(unsigned ID) { 8447 return getSubmodule(ID); 8448 } 8449 8450 bool ASTReader::DeclIsFromPCHWithObjectFile(const Decl *D) { 8451 ModuleFile *MF = getOwningModuleFile(D); 8452 return MF && MF->PCHHasObjectFile; 8453 } 8454 8455 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) { 8456 if (ID & 1) { 8457 // It's a module, look it up by submodule ID. 8458 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1)); 8459 return I == GlobalSubmoduleMap.end() ? nullptr : I->second; 8460 } else { 8461 // It's a prefix (preamble, PCH, ...). Look it up by index. 8462 unsigned IndexFromEnd = ID >> 1; 8463 assert(IndexFromEnd && "got reference to unknown module file"); 8464 return getModuleManager().pch_modules().end()[-IndexFromEnd]; 8465 } 8466 } 8467 8468 unsigned ASTReader::getModuleFileID(ModuleFile *F) { 8469 if (!F) 8470 return 1; 8471 8472 // For a file representing a module, use the submodule ID of the top-level 8473 // module as the file ID. For any other kind of file, the number of such 8474 // files loaded beforehand will be the same on reload. 8475 // FIXME: Is this true even if we have an explicit module file and a PCH? 8476 if (F->isModule()) 8477 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1; 8478 8479 auto PCHModules = getModuleManager().pch_modules(); 8480 auto I = llvm::find(PCHModules, F); 8481 assert(I != PCHModules.end() && "emitting reference to unknown file"); 8482 return (I - PCHModules.end()) << 1; 8483 } 8484 8485 llvm::Optional<ExternalASTSource::ASTSourceDescriptor> 8486 ASTReader::getSourceDescriptor(unsigned ID) { 8487 if (const Module *M = getSubmodule(ID)) 8488 return ExternalASTSource::ASTSourceDescriptor(*M); 8489 8490 // If there is only a single PCH, return it instead. 8491 // Chained PCH are not supported. 8492 const auto &PCHChain = ModuleMgr.pch_modules(); 8493 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) { 8494 ModuleFile &MF = ModuleMgr.getPrimaryModule(); 8495 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName); 8496 StringRef FileName = llvm::sys::path::filename(MF.FileName); 8497 return ASTReader::ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName, 8498 MF.Signature); 8499 } 8500 return None; 8501 } 8502 8503 ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) { 8504 auto I = DefinitionSource.find(FD); 8505 if (I == DefinitionSource.end()) 8506 return EK_ReplyHazy; 8507 return I->second ? EK_Never : EK_Always; 8508 } 8509 8510 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 8511 return DecodeSelector(getGlobalSelectorID(M, LocalID)); 8512 } 8513 8514 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { 8515 if (ID == 0) 8516 return Selector(); 8517 8518 if (ID > SelectorsLoaded.size()) { 8519 Error("selector ID out of range in AST file"); 8520 return Selector(); 8521 } 8522 8523 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) { 8524 // Load this selector from the selector table. 8525 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 8526 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 8527 ModuleFile &M = *I->second; 8528 ASTSelectorLookupTrait Trait(*this, M); 8529 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 8530 SelectorsLoaded[ID - 1] = 8531 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 8532 if (DeserializationListener) 8533 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 8534 } 8535 8536 return SelectorsLoaded[ID - 1]; 8537 } 8538 8539 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 8540 return DecodeSelector(ID); 8541 } 8542 8543 uint32_t ASTReader::GetNumExternalSelectors() { 8544 // ID 0 (the null selector) is considered an external selector. 8545 return getTotalNumSelectors() + 1; 8546 } 8547 8548 serialization::SelectorID 8549 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 8550 if (LocalID < NUM_PREDEF_SELECTOR_IDS) 8551 return LocalID; 8552 8553 if (!M.ModuleOffsetMap.empty()) 8554 ReadModuleOffsetMap(M); 8555 8556 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8557 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 8558 assert(I != M.SelectorRemap.end() 8559 && "Invalid index into selector index remap"); 8560 8561 return LocalID + I->second; 8562 } 8563 8564 DeclarationNameLoc 8565 ASTRecordReader::readDeclarationNameLoc(DeclarationName Name) { 8566 DeclarationNameLoc DNLoc; 8567 switch (Name.getNameKind()) { 8568 case DeclarationName::CXXConstructorName: 8569 case DeclarationName::CXXDestructorName: 8570 case DeclarationName::CXXConversionFunctionName: 8571 DNLoc.NamedType.TInfo = readTypeSourceInfo(); 8572 break; 8573 8574 case DeclarationName::CXXOperatorName: 8575 DNLoc.CXXOperatorName.BeginOpNameLoc 8576 = readSourceLocation().getRawEncoding(); 8577 DNLoc.CXXOperatorName.EndOpNameLoc 8578 = readSourceLocation().getRawEncoding(); 8579 break; 8580 8581 case DeclarationName::CXXLiteralOperatorName: 8582 DNLoc.CXXLiteralOperatorName.OpNameLoc 8583 = readSourceLocation().getRawEncoding(); 8584 break; 8585 8586 case DeclarationName::Identifier: 8587 case DeclarationName::ObjCZeroArgSelector: 8588 case DeclarationName::ObjCOneArgSelector: 8589 case DeclarationName::ObjCMultiArgSelector: 8590 case DeclarationName::CXXUsingDirective: 8591 case DeclarationName::CXXDeductionGuideName: 8592 break; 8593 } 8594 return DNLoc; 8595 } 8596 8597 DeclarationNameInfo ASTRecordReader::readDeclarationNameInfo() { 8598 DeclarationNameInfo NameInfo; 8599 NameInfo.setName(readDeclarationName()); 8600 NameInfo.setLoc(readSourceLocation()); 8601 NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName())); 8602 return NameInfo; 8603 } 8604 8605 void ASTRecordReader::readQualifierInfo(QualifierInfo &Info) { 8606 Info.QualifierLoc = readNestedNameSpecifierLoc(); 8607 unsigned NumTPLists = readInt(); 8608 Info.NumTemplParamLists = NumTPLists; 8609 if (NumTPLists) { 8610 Info.TemplParamLists = 8611 new (getContext()) TemplateParameterList *[NumTPLists]; 8612 for (unsigned i = 0; i != NumTPLists; ++i) 8613 Info.TemplParamLists[i] = readTemplateParameterList(); 8614 } 8615 } 8616 8617 TemplateParameterList * 8618 ASTRecordReader::readTemplateParameterList() { 8619 SourceLocation TemplateLoc = readSourceLocation(); 8620 SourceLocation LAngleLoc = readSourceLocation(); 8621 SourceLocation RAngleLoc = readSourceLocation(); 8622 8623 unsigned NumParams = readInt(); 8624 SmallVector<NamedDecl *, 16> Params; 8625 Params.reserve(NumParams); 8626 while (NumParams--) 8627 Params.push_back(readDeclAs<NamedDecl>()); 8628 8629 bool HasRequiresClause = readBool(); 8630 Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr; 8631 8632 TemplateParameterList *TemplateParams = TemplateParameterList::Create( 8633 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause); 8634 return TemplateParams; 8635 } 8636 8637 void ASTRecordReader::readTemplateArgumentList( 8638 SmallVectorImpl<TemplateArgument> &TemplArgs, 8639 bool Canonicalize) { 8640 unsigned NumTemplateArgs = readInt(); 8641 TemplArgs.reserve(NumTemplateArgs); 8642 while (NumTemplateArgs--) 8643 TemplArgs.push_back(readTemplateArgument(Canonicalize)); 8644 } 8645 8646 /// Read a UnresolvedSet structure. 8647 void ASTRecordReader::readUnresolvedSet(LazyASTUnresolvedSet &Set) { 8648 unsigned NumDecls = readInt(); 8649 Set.reserve(getContext(), NumDecls); 8650 while (NumDecls--) { 8651 DeclID ID = readDeclID(); 8652 AccessSpecifier AS = (AccessSpecifier) readInt(); 8653 Set.addLazyDecl(getContext(), ID, AS); 8654 } 8655 } 8656 8657 CXXBaseSpecifier 8658 ASTRecordReader::readCXXBaseSpecifier() { 8659 bool isVirtual = readBool(); 8660 bool isBaseOfClass = readBool(); 8661 AccessSpecifier AS = static_cast<AccessSpecifier>(readInt()); 8662 bool inheritConstructors = readBool(); 8663 TypeSourceInfo *TInfo = readTypeSourceInfo(); 8664 SourceRange Range = readSourceRange(); 8665 SourceLocation EllipsisLoc = readSourceLocation(); 8666 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 8667 EllipsisLoc); 8668 Result.setInheritConstructors(inheritConstructors); 8669 return Result; 8670 } 8671 8672 CXXCtorInitializer ** 8673 ASTRecordReader::readCXXCtorInitializers() { 8674 ASTContext &Context = getContext(); 8675 unsigned NumInitializers = readInt(); 8676 assert(NumInitializers && "wrote ctor initializers but have no inits"); 8677 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers]; 8678 for (unsigned i = 0; i != NumInitializers; ++i) { 8679 TypeSourceInfo *TInfo = nullptr; 8680 bool IsBaseVirtual = false; 8681 FieldDecl *Member = nullptr; 8682 IndirectFieldDecl *IndirectMember = nullptr; 8683 8684 CtorInitializerType Type = (CtorInitializerType) readInt(); 8685 switch (Type) { 8686 case CTOR_INITIALIZER_BASE: 8687 TInfo = readTypeSourceInfo(); 8688 IsBaseVirtual = readBool(); 8689 break; 8690 8691 case CTOR_INITIALIZER_DELEGATING: 8692 TInfo = readTypeSourceInfo(); 8693 break; 8694 8695 case CTOR_INITIALIZER_MEMBER: 8696 Member = readDeclAs<FieldDecl>(); 8697 break; 8698 8699 case CTOR_INITIALIZER_INDIRECT_MEMBER: 8700 IndirectMember = readDeclAs<IndirectFieldDecl>(); 8701 break; 8702 } 8703 8704 SourceLocation MemberOrEllipsisLoc = readSourceLocation(); 8705 Expr *Init = readExpr(); 8706 SourceLocation LParenLoc = readSourceLocation(); 8707 SourceLocation RParenLoc = readSourceLocation(); 8708 8709 CXXCtorInitializer *BOMInit; 8710 if (Type == CTOR_INITIALIZER_BASE) 8711 BOMInit = new (Context) 8712 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init, 8713 RParenLoc, MemberOrEllipsisLoc); 8714 else if (Type == CTOR_INITIALIZER_DELEGATING) 8715 BOMInit = new (Context) 8716 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc); 8717 else if (Member) 8718 BOMInit = new (Context) 8719 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc, 8720 Init, RParenLoc); 8721 else 8722 BOMInit = new (Context) 8723 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc, 8724 LParenLoc, Init, RParenLoc); 8725 8726 if (/*IsWritten*/readBool()) { 8727 unsigned SourceOrder = readInt(); 8728 BOMInit->setSourceOrder(SourceOrder); 8729 } 8730 8731 CtorInitializers[i] = BOMInit; 8732 } 8733 8734 return CtorInitializers; 8735 } 8736 8737 NestedNameSpecifierLoc 8738 ASTRecordReader::readNestedNameSpecifierLoc() { 8739 ASTContext &Context = getContext(); 8740 unsigned N = readInt(); 8741 NestedNameSpecifierLocBuilder Builder; 8742 for (unsigned I = 0; I != N; ++I) { 8743 auto Kind = readNestedNameSpecifierKind(); 8744 switch (Kind) { 8745 case NestedNameSpecifier::Identifier: { 8746 IdentifierInfo *II = readIdentifier(); 8747 SourceRange Range = readSourceRange(); 8748 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 8749 break; 8750 } 8751 8752 case NestedNameSpecifier::Namespace: { 8753 NamespaceDecl *NS = readDeclAs<NamespaceDecl>(); 8754 SourceRange Range = readSourceRange(); 8755 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 8756 break; 8757 } 8758 8759 case NestedNameSpecifier::NamespaceAlias: { 8760 NamespaceAliasDecl *Alias = readDeclAs<NamespaceAliasDecl>(); 8761 SourceRange Range = readSourceRange(); 8762 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 8763 break; 8764 } 8765 8766 case NestedNameSpecifier::TypeSpec: 8767 case NestedNameSpecifier::TypeSpecWithTemplate: { 8768 bool Template = readBool(); 8769 TypeSourceInfo *T = readTypeSourceInfo(); 8770 if (!T) 8771 return NestedNameSpecifierLoc(); 8772 SourceLocation ColonColonLoc = readSourceLocation(); 8773 8774 // FIXME: 'template' keyword location not saved anywhere, so we fake it. 8775 Builder.Extend(Context, 8776 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 8777 T->getTypeLoc(), ColonColonLoc); 8778 break; 8779 } 8780 8781 case NestedNameSpecifier::Global: { 8782 SourceLocation ColonColonLoc = readSourceLocation(); 8783 Builder.MakeGlobal(Context, ColonColonLoc); 8784 break; 8785 } 8786 8787 case NestedNameSpecifier::Super: { 8788 CXXRecordDecl *RD = readDeclAs<CXXRecordDecl>(); 8789 SourceRange Range = readSourceRange(); 8790 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd()); 8791 break; 8792 } 8793 } 8794 } 8795 8796 return Builder.getWithLocInContext(Context); 8797 } 8798 8799 SourceRange 8800 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 8801 unsigned &Idx) { 8802 SourceLocation beg = ReadSourceLocation(F, Record, Idx); 8803 SourceLocation end = ReadSourceLocation(F, Record, Idx); 8804 return SourceRange(beg, end); 8805 } 8806 8807 static FixedPointSemantics 8808 ReadFixedPointSemantics(const SmallVectorImpl<uint64_t> &Record, 8809 unsigned &Idx) { 8810 unsigned Width = Record[Idx++]; 8811 unsigned Scale = Record[Idx++]; 8812 uint64_t Tmp = Record[Idx++]; 8813 bool IsSigned = Tmp & 0x1; 8814 bool IsSaturated = Tmp & 0x2; 8815 bool HasUnsignedPadding = Tmp & 0x4; 8816 return FixedPointSemantics(Width, Scale, IsSigned, IsSaturated, 8817 HasUnsignedPadding); 8818 } 8819 8820 static const llvm::fltSemantics & 8821 readAPFloatSemantics(ASTRecordReader &reader) { 8822 return llvm::APFloatBase::EnumToSemantics( 8823 static_cast<llvm::APFloatBase::Semantics>(reader.readInt())); 8824 } 8825 8826 APValue ASTRecordReader::readAPValue() { 8827 unsigned Kind = readInt(); 8828 switch ((APValue::ValueKind) Kind) { 8829 case APValue::None: 8830 return APValue(); 8831 case APValue::Indeterminate: 8832 return APValue::IndeterminateValue(); 8833 case APValue::Int: 8834 return APValue(readAPSInt()); 8835 case APValue::Float: { 8836 const llvm::fltSemantics &FloatSema = readAPFloatSemantics(*this); 8837 return APValue(readAPFloat(FloatSema)); 8838 } 8839 case APValue::FixedPoint: { 8840 FixedPointSemantics FPSema = ReadFixedPointSemantics(Record, Idx); 8841 return APValue(APFixedPoint(readAPInt(), FPSema)); 8842 } 8843 case APValue::ComplexInt: { 8844 llvm::APSInt First = readAPSInt(); 8845 return APValue(std::move(First), readAPSInt()); 8846 } 8847 case APValue::ComplexFloat: { 8848 const llvm::fltSemantics &FloatSema1 = readAPFloatSemantics(*this); 8849 llvm::APFloat First = readAPFloat(FloatSema1); 8850 const llvm::fltSemantics &FloatSema2 = readAPFloatSemantics(*this); 8851 return APValue(std::move(First), readAPFloat(FloatSema2)); 8852 } 8853 case APValue::LValue: 8854 case APValue::Vector: 8855 case APValue::Array: 8856 case APValue::Struct: 8857 case APValue::Union: 8858 case APValue::MemberPointer: 8859 case APValue::AddrLabelDiff: 8860 // TODO : Handle all these APValue::ValueKind. 8861 return APValue(); 8862 } 8863 llvm_unreachable("Invalid APValue::ValueKind"); 8864 } 8865 8866 /// Read a floating-point value 8867 llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) { 8868 return llvm::APFloat(Sem, readAPInt()); 8869 } 8870 8871 // Read a string 8872 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 8873 unsigned Len = Record[Idx++]; 8874 std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 8875 Idx += Len; 8876 return Result; 8877 } 8878 8879 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record, 8880 unsigned &Idx) { 8881 std::string Filename = ReadString(Record, Idx); 8882 ResolveImportedPath(F, Filename); 8883 return Filename; 8884 } 8885 8886 std::string ASTReader::ReadPath(StringRef BaseDirectory, 8887 const RecordData &Record, unsigned &Idx) { 8888 std::string Filename = ReadString(Record, Idx); 8889 if (!BaseDirectory.empty()) 8890 ResolveImportedPath(Filename, BaseDirectory); 8891 return Filename; 8892 } 8893 8894 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 8895 unsigned &Idx) { 8896 unsigned Major = Record[Idx++]; 8897 unsigned Minor = Record[Idx++]; 8898 unsigned Subminor = Record[Idx++]; 8899 if (Minor == 0) 8900 return VersionTuple(Major); 8901 if (Subminor == 0) 8902 return VersionTuple(Major, Minor - 1); 8903 return VersionTuple(Major, Minor - 1, Subminor - 1); 8904 } 8905 8906 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 8907 const RecordData &Record, 8908 unsigned &Idx) { 8909 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 8910 return CXXTemporary::Create(getContext(), Decl); 8911 } 8912 8913 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const { 8914 return Diag(CurrentImportLoc, DiagID); 8915 } 8916 8917 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const { 8918 return Diags.Report(Loc, DiagID); 8919 } 8920 8921 /// Retrieve the identifier table associated with the 8922 /// preprocessor. 8923 IdentifierTable &ASTReader::getIdentifierTable() { 8924 return PP.getIdentifierTable(); 8925 } 8926 8927 /// Record that the given ID maps to the given switch-case 8928 /// statement. 8929 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 8930 assert((*CurrSwitchCaseStmts)[ID] == nullptr && 8931 "Already have a SwitchCase with this ID"); 8932 (*CurrSwitchCaseStmts)[ID] = SC; 8933 } 8934 8935 /// Retrieve the switch-case statement with the given ID. 8936 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 8937 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID"); 8938 return (*CurrSwitchCaseStmts)[ID]; 8939 } 8940 8941 void ASTReader::ClearSwitchCaseIDs() { 8942 CurrSwitchCaseStmts->clear(); 8943 } 8944 8945 void ASTReader::ReadComments() { 8946 ASTContext &Context = getContext(); 8947 std::vector<RawComment *> Comments; 8948 for (SmallVectorImpl<std::pair<BitstreamCursor, 8949 serialization::ModuleFile *>>::iterator 8950 I = CommentsCursors.begin(), 8951 E = CommentsCursors.end(); 8952 I != E; ++I) { 8953 Comments.clear(); 8954 BitstreamCursor &Cursor = I->first; 8955 serialization::ModuleFile &F = *I->second; 8956 SavedStreamPosition SavedPosition(Cursor); 8957 8958 RecordData Record; 8959 while (true) { 8960 Expected<llvm::BitstreamEntry> MaybeEntry = 8961 Cursor.advanceSkippingSubblocks( 8962 BitstreamCursor::AF_DontPopBlockAtEnd); 8963 if (!MaybeEntry) { 8964 Error(MaybeEntry.takeError()); 8965 return; 8966 } 8967 llvm::BitstreamEntry Entry = MaybeEntry.get(); 8968 8969 switch (Entry.Kind) { 8970 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 8971 case llvm::BitstreamEntry::Error: 8972 Error("malformed block record in AST file"); 8973 return; 8974 case llvm::BitstreamEntry::EndBlock: 8975 goto NextCursor; 8976 case llvm::BitstreamEntry::Record: 8977 // The interesting case. 8978 break; 8979 } 8980 8981 // Read a record. 8982 Record.clear(); 8983 Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record); 8984 if (!MaybeComment) { 8985 Error(MaybeComment.takeError()); 8986 return; 8987 } 8988 switch ((CommentRecordTypes)MaybeComment.get()) { 8989 case COMMENTS_RAW_COMMENT: { 8990 unsigned Idx = 0; 8991 SourceRange SR = ReadSourceRange(F, Record, Idx); 8992 RawComment::CommentKind Kind = 8993 (RawComment::CommentKind) Record[Idx++]; 8994 bool IsTrailingComment = Record[Idx++]; 8995 bool IsAlmostTrailingComment = Record[Idx++]; 8996 Comments.push_back(new (Context) RawComment( 8997 SR, Kind, IsTrailingComment, IsAlmostTrailingComment)); 8998 break; 8999 } 9000 } 9001 } 9002 NextCursor: 9003 llvm::DenseMap<FileID, std::map<unsigned, RawComment *>> 9004 FileToOffsetToComment; 9005 for (RawComment *C : Comments) { 9006 SourceLocation CommentLoc = C->getBeginLoc(); 9007 if (CommentLoc.isValid()) { 9008 std::pair<FileID, unsigned> Loc = 9009 SourceMgr.getDecomposedLoc(CommentLoc); 9010 if (Loc.first.isValid()) 9011 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C); 9012 } 9013 } 9014 } 9015 } 9016 9017 void ASTReader::visitInputFiles(serialization::ModuleFile &MF, 9018 bool IncludeSystem, bool Complain, 9019 llvm::function_ref<void(const serialization::InputFile &IF, 9020 bool isSystem)> Visitor) { 9021 unsigned NumUserInputs = MF.NumUserInputFiles; 9022 unsigned NumInputs = MF.InputFilesLoaded.size(); 9023 assert(NumUserInputs <= NumInputs); 9024 unsigned N = IncludeSystem ? NumInputs : NumUserInputs; 9025 for (unsigned I = 0; I < N; ++I) { 9026 bool IsSystem = I >= NumUserInputs; 9027 InputFile IF = getInputFile(MF, I+1, Complain); 9028 Visitor(IF, IsSystem); 9029 } 9030 } 9031 9032 void ASTReader::visitTopLevelModuleMaps( 9033 serialization::ModuleFile &MF, 9034 llvm::function_ref<void(const FileEntry *FE)> Visitor) { 9035 unsigned NumInputs = MF.InputFilesLoaded.size(); 9036 for (unsigned I = 0; I < NumInputs; ++I) { 9037 InputFileInfo IFI = readInputFileInfo(MF, I + 1); 9038 if (IFI.TopLevelModuleMap) 9039 // FIXME: This unnecessarily re-reads the InputFileInfo. 9040 if (auto *FE = getInputFile(MF, I + 1).getFile()) 9041 Visitor(FE); 9042 } 9043 } 9044 9045 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) { 9046 // If we know the owning module, use it. 9047 if (Module *M = D->getImportedOwningModule()) 9048 return M->getFullModuleName(); 9049 9050 // Otherwise, use the name of the top-level module the decl is within. 9051 if (ModuleFile *M = getOwningModuleFile(D)) 9052 return M->ModuleName; 9053 9054 // Not from a module. 9055 return {}; 9056 } 9057 9058 void ASTReader::finishPendingActions() { 9059 while (!PendingIdentifierInfos.empty() || !PendingFunctionTypes.empty() || 9060 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() || 9061 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || 9062 !PendingUpdateRecords.empty()) { 9063 // If any identifiers with corresponding top-level declarations have 9064 // been loaded, load those declarations now. 9065 using TopLevelDeclsMap = 9066 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>; 9067 TopLevelDeclsMap TopLevelDecls; 9068 9069 while (!PendingIdentifierInfos.empty()) { 9070 IdentifierInfo *II = PendingIdentifierInfos.back().first; 9071 SmallVector<uint32_t, 4> DeclIDs = 9072 std::move(PendingIdentifierInfos.back().second); 9073 PendingIdentifierInfos.pop_back(); 9074 9075 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 9076 } 9077 9078 // Load each function type that we deferred loading because it was a 9079 // deduced type that might refer to a local type declared within itself. 9080 for (unsigned I = 0; I != PendingFunctionTypes.size(); ++I) { 9081 auto *FD = PendingFunctionTypes[I].first; 9082 FD->setType(GetType(PendingFunctionTypes[I].second)); 9083 9084 // If we gave a function a deduced return type, remember that we need to 9085 // propagate that along the redeclaration chain. 9086 auto *DT = FD->getReturnType()->getContainedDeducedType(); 9087 if (DT && DT->isDeduced()) 9088 PendingDeducedTypeUpdates.insert( 9089 {FD->getCanonicalDecl(), FD->getReturnType()}); 9090 } 9091 PendingFunctionTypes.clear(); 9092 9093 // For each decl chain that we wanted to complete while deserializing, mark 9094 // it as "still needs to be completed". 9095 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) { 9096 markIncompleteDeclChain(PendingIncompleteDeclChains[I]); 9097 } 9098 PendingIncompleteDeclChains.clear(); 9099 9100 // Load pending declaration chains. 9101 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) 9102 loadPendingDeclChain(PendingDeclChains[I].first, 9103 PendingDeclChains[I].second); 9104 PendingDeclChains.clear(); 9105 9106 // Make the most recent of the top-level declarations visible. 9107 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 9108 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 9109 IdentifierInfo *II = TLD->first; 9110 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 9111 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 9112 } 9113 } 9114 9115 // Load any pending macro definitions. 9116 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 9117 IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 9118 SmallVector<PendingMacroInfo, 2> GlobalIDs; 9119 GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 9120 // Initialize the macro history from chained-PCHs ahead of module imports. 9121 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9122 ++IDIdx) { 9123 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9124 if (!Info.M->isModule()) 9125 resolvePendingMacro(II, Info); 9126 } 9127 // Handle module imports. 9128 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9129 ++IDIdx) { 9130 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9131 if (Info.M->isModule()) 9132 resolvePendingMacro(II, Info); 9133 } 9134 } 9135 PendingMacroIDs.clear(); 9136 9137 // Wire up the DeclContexts for Decls that we delayed setting until 9138 // recursive loading is completed. 9139 while (!PendingDeclContextInfos.empty()) { 9140 PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 9141 PendingDeclContextInfos.pop_front(); 9142 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 9143 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 9144 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 9145 } 9146 9147 // Perform any pending declaration updates. 9148 while (!PendingUpdateRecords.empty()) { 9149 auto Update = PendingUpdateRecords.pop_back_val(); 9150 ReadingKindTracker ReadingKind(Read_Decl, *this); 9151 loadDeclUpdateRecords(Update); 9152 } 9153 } 9154 9155 // At this point, all update records for loaded decls are in place, so any 9156 // fake class definitions should have become real. 9157 assert(PendingFakeDefinitionData.empty() && 9158 "faked up a class definition but never saw the real one"); 9159 9160 // If we deserialized any C++ or Objective-C class definitions, any 9161 // Objective-C protocol definitions, or any redeclarable templates, make sure 9162 // that all redeclarations point to the definitions. Note that this can only 9163 // happen now, after the redeclaration chains have been fully wired. 9164 for (Decl *D : PendingDefinitions) { 9165 if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 9166 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) { 9167 // Make sure that the TagType points at the definition. 9168 const_cast<TagType*>(TagT)->decl = TD; 9169 } 9170 9171 if (auto RD = dyn_cast<CXXRecordDecl>(D)) { 9172 for (auto *R = getMostRecentExistingDecl(RD); R; 9173 R = R->getPreviousDecl()) { 9174 assert((R == D) == 9175 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && 9176 "declaration thinks it's the definition but it isn't"); 9177 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData; 9178 } 9179 } 9180 9181 continue; 9182 } 9183 9184 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) { 9185 // Make sure that the ObjCInterfaceType points at the definition. 9186 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 9187 ->Decl = ID; 9188 9189 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl()) 9190 cast<ObjCInterfaceDecl>(R)->Data = ID->Data; 9191 9192 continue; 9193 } 9194 9195 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) { 9196 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl()) 9197 cast<ObjCProtocolDecl>(R)->Data = PD->Data; 9198 9199 continue; 9200 } 9201 9202 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl(); 9203 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl()) 9204 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common; 9205 } 9206 PendingDefinitions.clear(); 9207 9208 // Load the bodies of any functions or methods we've encountered. We do 9209 // this now (delayed) so that we can be sure that the declaration chains 9210 // have been fully wired up (hasBody relies on this). 9211 // FIXME: We shouldn't require complete redeclaration chains here. 9212 for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 9213 PBEnd = PendingBodies.end(); 9214 PB != PBEnd; ++PB) { 9215 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 9216 // For a function defined inline within a class template, force the 9217 // canonical definition to be the one inside the canonical definition of 9218 // the template. This ensures that we instantiate from a correct view 9219 // of the template. 9220 // 9221 // Sadly we can't do this more generally: we can't be sure that all 9222 // copies of an arbitrary class definition will have the same members 9223 // defined (eg, some member functions may not be instantiated, and some 9224 // special members may or may not have been implicitly defined). 9225 if (auto *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalParent())) 9226 if (RD->isDependentContext() && !RD->isThisDeclarationADefinition()) 9227 continue; 9228 9229 // FIXME: Check for =delete/=default? 9230 // FIXME: Complain about ODR violations here? 9231 const FunctionDecl *Defn = nullptr; 9232 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) { 9233 FD->setLazyBody(PB->second); 9234 } else { 9235 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn); 9236 mergeDefinitionVisibility(NonConstDefn, FD); 9237 9238 if (!FD->isLateTemplateParsed() && 9239 !NonConstDefn->isLateTemplateParsed() && 9240 FD->getODRHash() != NonConstDefn->getODRHash()) { 9241 if (!isa<CXXMethodDecl>(FD)) { 9242 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9243 } else if (FD->getLexicalParent()->isFileContext() && 9244 NonConstDefn->getLexicalParent()->isFileContext()) { 9245 // Only diagnose out-of-line method definitions. If they are 9246 // in class definitions, then an error will be generated when 9247 // processing the class bodies. 9248 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9249 } 9250 } 9251 } 9252 continue; 9253 } 9254 9255 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 9256 if (!getContext().getLangOpts().Modules || !MD->hasBody()) 9257 MD->setLazyBody(PB->second); 9258 } 9259 PendingBodies.clear(); 9260 9261 // Do some cleanup. 9262 for (auto *ND : PendingMergedDefinitionsToDeduplicate) 9263 getContext().deduplicateMergedDefinitonsFor(ND); 9264 PendingMergedDefinitionsToDeduplicate.clear(); 9265 } 9266 9267 void ASTReader::diagnoseOdrViolations() { 9268 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() && 9269 PendingFunctionOdrMergeFailures.empty() && 9270 PendingEnumOdrMergeFailures.empty()) 9271 return; 9272 9273 // Trigger the import of the full definition of each class that had any 9274 // odr-merging problems, so we can produce better diagnostics for them. 9275 // These updates may in turn find and diagnose some ODR failures, so take 9276 // ownership of the set first. 9277 auto OdrMergeFailures = std::move(PendingOdrMergeFailures); 9278 PendingOdrMergeFailures.clear(); 9279 for (auto &Merge : OdrMergeFailures) { 9280 Merge.first->buildLookup(); 9281 Merge.first->decls_begin(); 9282 Merge.first->bases_begin(); 9283 Merge.first->vbases_begin(); 9284 for (auto &RecordPair : Merge.second) { 9285 auto *RD = RecordPair.first; 9286 RD->decls_begin(); 9287 RD->bases_begin(); 9288 RD->vbases_begin(); 9289 } 9290 } 9291 9292 // Trigger the import of functions. 9293 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures); 9294 PendingFunctionOdrMergeFailures.clear(); 9295 for (auto &Merge : FunctionOdrMergeFailures) { 9296 Merge.first->buildLookup(); 9297 Merge.first->decls_begin(); 9298 Merge.first->getBody(); 9299 for (auto &FD : Merge.second) { 9300 FD->buildLookup(); 9301 FD->decls_begin(); 9302 FD->getBody(); 9303 } 9304 } 9305 9306 // Trigger the import of enums. 9307 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures); 9308 PendingEnumOdrMergeFailures.clear(); 9309 for (auto &Merge : EnumOdrMergeFailures) { 9310 Merge.first->decls_begin(); 9311 for (auto &Enum : Merge.second) { 9312 Enum->decls_begin(); 9313 } 9314 } 9315 9316 // For each declaration from a merged context, check that the canonical 9317 // definition of that context also contains a declaration of the same 9318 // entity. 9319 // 9320 // Caution: this loop does things that might invalidate iterators into 9321 // PendingOdrMergeChecks. Don't turn this into a range-based for loop! 9322 while (!PendingOdrMergeChecks.empty()) { 9323 NamedDecl *D = PendingOdrMergeChecks.pop_back_val(); 9324 9325 // FIXME: Skip over implicit declarations for now. This matters for things 9326 // like implicitly-declared special member functions. This isn't entirely 9327 // correct; we can end up with multiple unmerged declarations of the same 9328 // implicit entity. 9329 if (D->isImplicit()) 9330 continue; 9331 9332 DeclContext *CanonDef = D->getDeclContext(); 9333 9334 bool Found = false; 9335 const Decl *DCanon = D->getCanonicalDecl(); 9336 9337 for (auto RI : D->redecls()) { 9338 if (RI->getLexicalDeclContext() == CanonDef) { 9339 Found = true; 9340 break; 9341 } 9342 } 9343 if (Found) 9344 continue; 9345 9346 // Quick check failed, time to do the slow thing. Note, we can't just 9347 // look up the name of D in CanonDef here, because the member that is 9348 // in CanonDef might not be found by name lookup (it might have been 9349 // replaced by a more recent declaration in the lookup table), and we 9350 // can't necessarily find it in the redeclaration chain because it might 9351 // be merely mergeable, not redeclarable. 9352 llvm::SmallVector<const NamedDecl*, 4> Candidates; 9353 for (auto *CanonMember : CanonDef->decls()) { 9354 if (CanonMember->getCanonicalDecl() == DCanon) { 9355 // This can happen if the declaration is merely mergeable and not 9356 // actually redeclarable (we looked for redeclarations earlier). 9357 // 9358 // FIXME: We should be able to detect this more efficiently, without 9359 // pulling in all of the members of CanonDef. 9360 Found = true; 9361 break; 9362 } 9363 if (auto *ND = dyn_cast<NamedDecl>(CanonMember)) 9364 if (ND->getDeclName() == D->getDeclName()) 9365 Candidates.push_back(ND); 9366 } 9367 9368 if (!Found) { 9369 // The AST doesn't like TagDecls becoming invalid after they've been 9370 // completed. We only really need to mark FieldDecls as invalid here. 9371 if (!isa<TagDecl>(D)) 9372 D->setInvalidDecl(); 9373 9374 // Ensure we don't accidentally recursively enter deserialization while 9375 // we're producing our diagnostic. 9376 Deserializing RecursionGuard(this); 9377 9378 std::string CanonDefModule = 9379 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef)); 9380 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl) 9381 << D << getOwningModuleNameForDiagnostic(D) 9382 << CanonDef << CanonDefModule.empty() << CanonDefModule; 9383 9384 if (Candidates.empty()) 9385 Diag(cast<Decl>(CanonDef)->getLocation(), 9386 diag::note_module_odr_violation_no_possible_decls) << D; 9387 else { 9388 for (unsigned I = 0, N = Candidates.size(); I != N; ++I) 9389 Diag(Candidates[I]->getLocation(), 9390 diag::note_module_odr_violation_possible_decl) 9391 << Candidates[I]; 9392 } 9393 9394 DiagnosedOdrMergeFailures.insert(CanonDef); 9395 } 9396 } 9397 9398 if (OdrMergeFailures.empty() && FunctionOdrMergeFailures.empty() && 9399 EnumOdrMergeFailures.empty()) 9400 return; 9401 9402 // Ensure we don't accidentally recursively enter deserialization while 9403 // we're producing our diagnostics. 9404 Deserializing RecursionGuard(this); 9405 9406 // Common code for hashing helpers. 9407 ODRHash Hash; 9408 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) { 9409 Hash.clear(); 9410 Hash.AddQualType(Ty); 9411 return Hash.CalculateHash(); 9412 }; 9413 9414 auto ComputeODRHash = [&Hash](const Stmt *S) { 9415 assert(S); 9416 Hash.clear(); 9417 Hash.AddStmt(S); 9418 return Hash.CalculateHash(); 9419 }; 9420 9421 auto ComputeSubDeclODRHash = [&Hash](const Decl *D) { 9422 assert(D); 9423 Hash.clear(); 9424 Hash.AddSubDecl(D); 9425 return Hash.CalculateHash(); 9426 }; 9427 9428 auto ComputeTemplateArgumentODRHash = [&Hash](const TemplateArgument &TA) { 9429 Hash.clear(); 9430 Hash.AddTemplateArgument(TA); 9431 return Hash.CalculateHash(); 9432 }; 9433 9434 auto ComputeTemplateParameterListODRHash = 9435 [&Hash](const TemplateParameterList *TPL) { 9436 assert(TPL); 9437 Hash.clear(); 9438 Hash.AddTemplateParameterList(TPL); 9439 return Hash.CalculateHash(); 9440 }; 9441 9442 // Issue any pending ODR-failure diagnostics. 9443 for (auto &Merge : OdrMergeFailures) { 9444 // If we've already pointed out a specific problem with this class, don't 9445 // bother issuing a general "something's different" diagnostic. 9446 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 9447 continue; 9448 9449 bool Diagnosed = false; 9450 CXXRecordDecl *FirstRecord = Merge.first; 9451 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstRecord); 9452 for (auto &RecordPair : Merge.second) { 9453 CXXRecordDecl *SecondRecord = RecordPair.first; 9454 // Multiple different declarations got merged together; tell the user 9455 // where they came from. 9456 if (FirstRecord == SecondRecord) 9457 continue; 9458 9459 std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord); 9460 9461 auto *FirstDD = FirstRecord->DefinitionData; 9462 auto *SecondDD = RecordPair.second; 9463 9464 assert(FirstDD && SecondDD && "Definitions without DefinitionData"); 9465 9466 // Diagnostics from DefinitionData are emitted here. 9467 if (FirstDD != SecondDD) { 9468 enum ODRDefinitionDataDifference { 9469 NumBases, 9470 NumVBases, 9471 BaseType, 9472 BaseVirtual, 9473 BaseAccess, 9474 }; 9475 auto ODRDiagError = [FirstRecord, &FirstModule, 9476 this](SourceLocation Loc, SourceRange Range, 9477 ODRDefinitionDataDifference DiffType) { 9478 return Diag(Loc, diag::err_module_odr_violation_definition_data) 9479 << FirstRecord << FirstModule.empty() << FirstModule << Range 9480 << DiffType; 9481 }; 9482 auto ODRDiagNote = [&SecondModule, 9483 this](SourceLocation Loc, SourceRange Range, 9484 ODRDefinitionDataDifference DiffType) { 9485 return Diag(Loc, diag::note_module_odr_violation_definition_data) 9486 << SecondModule << Range << DiffType; 9487 }; 9488 9489 unsigned FirstNumBases = FirstDD->NumBases; 9490 unsigned FirstNumVBases = FirstDD->NumVBases; 9491 unsigned SecondNumBases = SecondDD->NumBases; 9492 unsigned SecondNumVBases = SecondDD->NumVBases; 9493 9494 auto GetSourceRange = [](struct CXXRecordDecl::DefinitionData *DD) { 9495 unsigned NumBases = DD->NumBases; 9496 if (NumBases == 0) return SourceRange(); 9497 auto bases = DD->bases(); 9498 return SourceRange(bases[0].getBeginLoc(), 9499 bases[NumBases - 1].getEndLoc()); 9500 }; 9501 9502 if (FirstNumBases != SecondNumBases) { 9503 ODRDiagError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 9504 NumBases) 9505 << FirstNumBases; 9506 ODRDiagNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 9507 NumBases) 9508 << SecondNumBases; 9509 Diagnosed = true; 9510 break; 9511 } 9512 9513 if (FirstNumVBases != SecondNumVBases) { 9514 ODRDiagError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 9515 NumVBases) 9516 << FirstNumVBases; 9517 ODRDiagNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 9518 NumVBases) 9519 << SecondNumVBases; 9520 Diagnosed = true; 9521 break; 9522 } 9523 9524 auto FirstBases = FirstDD->bases(); 9525 auto SecondBases = SecondDD->bases(); 9526 unsigned i = 0; 9527 for (i = 0; i < FirstNumBases; ++i) { 9528 auto FirstBase = FirstBases[i]; 9529 auto SecondBase = SecondBases[i]; 9530 if (ComputeQualTypeODRHash(FirstBase.getType()) != 9531 ComputeQualTypeODRHash(SecondBase.getType())) { 9532 ODRDiagError(FirstRecord->getLocation(), FirstBase.getSourceRange(), 9533 BaseType) 9534 << (i + 1) << FirstBase.getType(); 9535 ODRDiagNote(SecondRecord->getLocation(), 9536 SecondBase.getSourceRange(), BaseType) 9537 << (i + 1) << SecondBase.getType(); 9538 break; 9539 } 9540 9541 if (FirstBase.isVirtual() != SecondBase.isVirtual()) { 9542 ODRDiagError(FirstRecord->getLocation(), FirstBase.getSourceRange(), 9543 BaseVirtual) 9544 << (i + 1) << FirstBase.isVirtual() << FirstBase.getType(); 9545 ODRDiagNote(SecondRecord->getLocation(), 9546 SecondBase.getSourceRange(), BaseVirtual) 9547 << (i + 1) << SecondBase.isVirtual() << SecondBase.getType(); 9548 break; 9549 } 9550 9551 if (FirstBase.getAccessSpecifierAsWritten() != 9552 SecondBase.getAccessSpecifierAsWritten()) { 9553 ODRDiagError(FirstRecord->getLocation(), FirstBase.getSourceRange(), 9554 BaseAccess) 9555 << (i + 1) << FirstBase.getType() 9556 << (int)FirstBase.getAccessSpecifierAsWritten(); 9557 ODRDiagNote(SecondRecord->getLocation(), 9558 SecondBase.getSourceRange(), BaseAccess) 9559 << (i + 1) << SecondBase.getType() 9560 << (int)SecondBase.getAccessSpecifierAsWritten(); 9561 break; 9562 } 9563 } 9564 9565 if (i != FirstNumBases) { 9566 Diagnosed = true; 9567 break; 9568 } 9569 } 9570 9571 using DeclHashes = llvm::SmallVector<std::pair<Decl *, unsigned>, 4>; 9572 9573 const ClassTemplateDecl *FirstTemplate = 9574 FirstRecord->getDescribedClassTemplate(); 9575 const ClassTemplateDecl *SecondTemplate = 9576 SecondRecord->getDescribedClassTemplate(); 9577 9578 assert(!FirstTemplate == !SecondTemplate && 9579 "Both pointers should be null or non-null"); 9580 9581 enum ODRTemplateDifference { 9582 ParamEmptyName, 9583 ParamName, 9584 ParamSingleDefaultArgument, 9585 ParamDifferentDefaultArgument, 9586 }; 9587 9588 if (FirstTemplate && SecondTemplate) { 9589 DeclHashes FirstTemplateHashes; 9590 DeclHashes SecondTemplateHashes; 9591 9592 auto PopulateTemplateParameterHashs = 9593 [&ComputeSubDeclODRHash](DeclHashes &Hashes, 9594 const ClassTemplateDecl *TD) { 9595 for (auto *D : TD->getTemplateParameters()->asArray()) { 9596 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 9597 } 9598 }; 9599 9600 PopulateTemplateParameterHashs(FirstTemplateHashes, FirstTemplate); 9601 PopulateTemplateParameterHashs(SecondTemplateHashes, SecondTemplate); 9602 9603 assert(FirstTemplateHashes.size() == SecondTemplateHashes.size() && 9604 "Number of template parameters should be equal."); 9605 9606 auto FirstIt = FirstTemplateHashes.begin(); 9607 auto FirstEnd = FirstTemplateHashes.end(); 9608 auto SecondIt = SecondTemplateHashes.begin(); 9609 for (; FirstIt != FirstEnd; ++FirstIt, ++SecondIt) { 9610 if (FirstIt->second == SecondIt->second) 9611 continue; 9612 9613 auto ODRDiagError = [FirstRecord, &FirstModule, 9614 this](SourceLocation Loc, SourceRange Range, 9615 ODRTemplateDifference DiffType) { 9616 return Diag(Loc, diag::err_module_odr_violation_template_parameter) 9617 << FirstRecord << FirstModule.empty() << FirstModule << Range 9618 << DiffType; 9619 }; 9620 auto ODRDiagNote = [&SecondModule, 9621 this](SourceLocation Loc, SourceRange Range, 9622 ODRTemplateDifference DiffType) { 9623 return Diag(Loc, diag::note_module_odr_violation_template_parameter) 9624 << SecondModule << Range << DiffType; 9625 }; 9626 9627 const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first); 9628 const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first); 9629 9630 assert(FirstDecl->getKind() == SecondDecl->getKind() && 9631 "Parameter Decl's should be the same kind."); 9632 9633 DeclarationName FirstName = FirstDecl->getDeclName(); 9634 DeclarationName SecondName = SecondDecl->getDeclName(); 9635 9636 if (FirstName != SecondName) { 9637 const bool FirstNameEmpty = 9638 FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo(); 9639 const bool SecondNameEmpty = 9640 SecondName.isIdentifier() && !SecondName.getAsIdentifierInfo(); 9641 assert((!FirstNameEmpty || !SecondNameEmpty) && 9642 "Both template parameters cannot be unnamed."); 9643 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(), 9644 FirstNameEmpty ? ParamEmptyName : ParamName) 9645 << FirstName; 9646 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(), 9647 SecondNameEmpty ? ParamEmptyName : ParamName) 9648 << SecondName; 9649 break; 9650 } 9651 9652 switch (FirstDecl->getKind()) { 9653 default: 9654 llvm_unreachable("Invalid template parameter type."); 9655 case Decl::TemplateTypeParm: { 9656 const auto *FirstParam = cast<TemplateTypeParmDecl>(FirstDecl); 9657 const auto *SecondParam = cast<TemplateTypeParmDecl>(SecondDecl); 9658 const bool HasFirstDefaultArgument = 9659 FirstParam->hasDefaultArgument() && 9660 !FirstParam->defaultArgumentWasInherited(); 9661 const bool HasSecondDefaultArgument = 9662 SecondParam->hasDefaultArgument() && 9663 !SecondParam->defaultArgumentWasInherited(); 9664 9665 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 9666 ODRDiagError(FirstDecl->getLocation(), 9667 FirstDecl->getSourceRange(), 9668 ParamSingleDefaultArgument) 9669 << HasFirstDefaultArgument; 9670 ODRDiagNote(SecondDecl->getLocation(), 9671 SecondDecl->getSourceRange(), 9672 ParamSingleDefaultArgument) 9673 << HasSecondDefaultArgument; 9674 break; 9675 } 9676 9677 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 9678 "Expecting default arguments."); 9679 9680 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(), 9681 ParamDifferentDefaultArgument); 9682 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(), 9683 ParamDifferentDefaultArgument); 9684 9685 break; 9686 } 9687 case Decl::NonTypeTemplateParm: { 9688 const auto *FirstParam = cast<NonTypeTemplateParmDecl>(FirstDecl); 9689 const auto *SecondParam = cast<NonTypeTemplateParmDecl>(SecondDecl); 9690 const bool HasFirstDefaultArgument = 9691 FirstParam->hasDefaultArgument() && 9692 !FirstParam->defaultArgumentWasInherited(); 9693 const bool HasSecondDefaultArgument = 9694 SecondParam->hasDefaultArgument() && 9695 !SecondParam->defaultArgumentWasInherited(); 9696 9697 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 9698 ODRDiagError(FirstDecl->getLocation(), 9699 FirstDecl->getSourceRange(), 9700 ParamSingleDefaultArgument) 9701 << HasFirstDefaultArgument; 9702 ODRDiagNote(SecondDecl->getLocation(), 9703 SecondDecl->getSourceRange(), 9704 ParamSingleDefaultArgument) 9705 << HasSecondDefaultArgument; 9706 break; 9707 } 9708 9709 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 9710 "Expecting default arguments."); 9711 9712 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(), 9713 ParamDifferentDefaultArgument); 9714 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(), 9715 ParamDifferentDefaultArgument); 9716 9717 break; 9718 } 9719 case Decl::TemplateTemplateParm: { 9720 const auto *FirstParam = cast<TemplateTemplateParmDecl>(FirstDecl); 9721 const auto *SecondParam = 9722 cast<TemplateTemplateParmDecl>(SecondDecl); 9723 const bool HasFirstDefaultArgument = 9724 FirstParam->hasDefaultArgument() && 9725 !FirstParam->defaultArgumentWasInherited(); 9726 const bool HasSecondDefaultArgument = 9727 SecondParam->hasDefaultArgument() && 9728 !SecondParam->defaultArgumentWasInherited(); 9729 9730 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 9731 ODRDiagError(FirstDecl->getLocation(), 9732 FirstDecl->getSourceRange(), 9733 ParamSingleDefaultArgument) 9734 << HasFirstDefaultArgument; 9735 ODRDiagNote(SecondDecl->getLocation(), 9736 SecondDecl->getSourceRange(), 9737 ParamSingleDefaultArgument) 9738 << HasSecondDefaultArgument; 9739 break; 9740 } 9741 9742 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 9743 "Expecting default arguments."); 9744 9745 ODRDiagError(FirstDecl->getLocation(), FirstDecl->getSourceRange(), 9746 ParamDifferentDefaultArgument); 9747 ODRDiagNote(SecondDecl->getLocation(), SecondDecl->getSourceRange(), 9748 ParamDifferentDefaultArgument); 9749 9750 break; 9751 } 9752 } 9753 9754 break; 9755 } 9756 9757 if (FirstIt != FirstEnd) { 9758 Diagnosed = true; 9759 break; 9760 } 9761 } 9762 9763 DeclHashes FirstHashes; 9764 DeclHashes SecondHashes; 9765 9766 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstRecord]( 9767 DeclHashes &Hashes, CXXRecordDecl *Record) { 9768 for (auto *D : Record->decls()) { 9769 // Due to decl merging, the first CXXRecordDecl is the parent of 9770 // Decls in both records. 9771 if (!ODRHash::isWhitelistedDecl(D, FirstRecord)) 9772 continue; 9773 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 9774 } 9775 }; 9776 PopulateHashes(FirstHashes, FirstRecord); 9777 PopulateHashes(SecondHashes, SecondRecord); 9778 9779 // Used with err_module_odr_violation_mismatch_decl and 9780 // note_module_odr_violation_mismatch_decl 9781 // This list should be the same Decl's as in ODRHash::isWhiteListedDecl 9782 enum { 9783 EndOfClass, 9784 PublicSpecifer, 9785 PrivateSpecifer, 9786 ProtectedSpecifer, 9787 StaticAssert, 9788 Field, 9789 CXXMethod, 9790 TypeAlias, 9791 TypeDef, 9792 Var, 9793 Friend, 9794 FunctionTemplate, 9795 Other 9796 } FirstDiffType = Other, 9797 SecondDiffType = Other; 9798 9799 auto DifferenceSelector = [](Decl *D) { 9800 assert(D && "valid Decl required"); 9801 switch (D->getKind()) { 9802 default: 9803 return Other; 9804 case Decl::AccessSpec: 9805 switch (D->getAccess()) { 9806 case AS_public: 9807 return PublicSpecifer; 9808 case AS_private: 9809 return PrivateSpecifer; 9810 case AS_protected: 9811 return ProtectedSpecifer; 9812 case AS_none: 9813 break; 9814 } 9815 llvm_unreachable("Invalid access specifier"); 9816 case Decl::StaticAssert: 9817 return StaticAssert; 9818 case Decl::Field: 9819 return Field; 9820 case Decl::CXXMethod: 9821 case Decl::CXXConstructor: 9822 case Decl::CXXDestructor: 9823 return CXXMethod; 9824 case Decl::TypeAlias: 9825 return TypeAlias; 9826 case Decl::Typedef: 9827 return TypeDef; 9828 case Decl::Var: 9829 return Var; 9830 case Decl::Friend: 9831 return Friend; 9832 case Decl::FunctionTemplate: 9833 return FunctionTemplate; 9834 } 9835 }; 9836 9837 Decl *FirstDecl = nullptr; 9838 Decl *SecondDecl = nullptr; 9839 auto FirstIt = FirstHashes.begin(); 9840 auto SecondIt = SecondHashes.begin(); 9841 9842 // If there is a diagnoseable difference, FirstDiffType and 9843 // SecondDiffType will not be Other and FirstDecl and SecondDecl will be 9844 // filled in if not EndOfClass. 9845 while (FirstIt != FirstHashes.end() || SecondIt != SecondHashes.end()) { 9846 if (FirstIt != FirstHashes.end() && SecondIt != SecondHashes.end() && 9847 FirstIt->second == SecondIt->second) { 9848 ++FirstIt; 9849 ++SecondIt; 9850 continue; 9851 } 9852 9853 FirstDecl = FirstIt == FirstHashes.end() ? nullptr : FirstIt->first; 9854 SecondDecl = SecondIt == SecondHashes.end() ? nullptr : SecondIt->first; 9855 9856 FirstDiffType = FirstDecl ? DifferenceSelector(FirstDecl) : EndOfClass; 9857 SecondDiffType = 9858 SecondDecl ? DifferenceSelector(SecondDecl) : EndOfClass; 9859 9860 break; 9861 } 9862 9863 if (FirstDiffType == Other || SecondDiffType == Other) { 9864 // Reaching this point means an unexpected Decl was encountered 9865 // or no difference was detected. This causes a generic error 9866 // message to be emitted. 9867 Diag(FirstRecord->getLocation(), 9868 diag::err_module_odr_violation_different_definitions) 9869 << FirstRecord << FirstModule.empty() << FirstModule; 9870 9871 if (FirstDecl) { 9872 Diag(FirstDecl->getLocation(), diag::note_first_module_difference) 9873 << FirstRecord << FirstDecl->getSourceRange(); 9874 } 9875 9876 Diag(SecondRecord->getLocation(), 9877 diag::note_module_odr_violation_different_definitions) 9878 << SecondModule; 9879 9880 if (SecondDecl) { 9881 Diag(SecondDecl->getLocation(), diag::note_second_module_difference) 9882 << SecondDecl->getSourceRange(); 9883 } 9884 9885 Diagnosed = true; 9886 break; 9887 } 9888 9889 if (FirstDiffType != SecondDiffType) { 9890 SourceLocation FirstLoc; 9891 SourceRange FirstRange; 9892 if (FirstDiffType == EndOfClass) { 9893 FirstLoc = FirstRecord->getBraceRange().getEnd(); 9894 } else { 9895 FirstLoc = FirstIt->first->getLocation(); 9896 FirstRange = FirstIt->first->getSourceRange(); 9897 } 9898 Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl) 9899 << FirstRecord << FirstModule.empty() << FirstModule << FirstRange 9900 << FirstDiffType; 9901 9902 SourceLocation SecondLoc; 9903 SourceRange SecondRange; 9904 if (SecondDiffType == EndOfClass) { 9905 SecondLoc = SecondRecord->getBraceRange().getEnd(); 9906 } else { 9907 SecondLoc = SecondDecl->getLocation(); 9908 SecondRange = SecondDecl->getSourceRange(); 9909 } 9910 Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl) 9911 << SecondModule << SecondRange << SecondDiffType; 9912 Diagnosed = true; 9913 break; 9914 } 9915 9916 assert(FirstDiffType == SecondDiffType); 9917 9918 // Used with err_module_odr_violation_mismatch_decl_diff and 9919 // note_module_odr_violation_mismatch_decl_diff 9920 enum ODRDeclDifference { 9921 StaticAssertCondition, 9922 StaticAssertMessage, 9923 StaticAssertOnlyMessage, 9924 FieldName, 9925 FieldTypeName, 9926 FieldSingleBitField, 9927 FieldDifferentWidthBitField, 9928 FieldSingleMutable, 9929 FieldSingleInitializer, 9930 FieldDifferentInitializers, 9931 MethodName, 9932 MethodDeleted, 9933 MethodDefaulted, 9934 MethodVirtual, 9935 MethodStatic, 9936 MethodVolatile, 9937 MethodConst, 9938 MethodInline, 9939 MethodNumberParameters, 9940 MethodParameterType, 9941 MethodParameterName, 9942 MethodParameterSingleDefaultArgument, 9943 MethodParameterDifferentDefaultArgument, 9944 MethodNoTemplateArguments, 9945 MethodDifferentNumberTemplateArguments, 9946 MethodDifferentTemplateArgument, 9947 MethodSingleBody, 9948 MethodDifferentBody, 9949 TypedefName, 9950 TypedefType, 9951 VarName, 9952 VarType, 9953 VarSingleInitializer, 9954 VarDifferentInitializer, 9955 VarConstexpr, 9956 FriendTypeFunction, 9957 FriendType, 9958 FriendFunction, 9959 FunctionTemplateDifferentNumberParameters, 9960 FunctionTemplateParameterDifferentKind, 9961 FunctionTemplateParameterName, 9962 FunctionTemplateParameterSingleDefaultArgument, 9963 FunctionTemplateParameterDifferentDefaultArgument, 9964 FunctionTemplateParameterDifferentType, 9965 FunctionTemplatePackParameter, 9966 }; 9967 9968 // These lambdas have the common portions of the ODR diagnostics. This 9969 // has the same return as Diag(), so addition parameters can be passed 9970 // in with operator<< 9971 auto ODRDiagError = [FirstRecord, &FirstModule, this]( 9972 SourceLocation Loc, SourceRange Range, ODRDeclDifference DiffType) { 9973 return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff) 9974 << FirstRecord << FirstModule.empty() << FirstModule << Range 9975 << DiffType; 9976 }; 9977 auto ODRDiagNote = [&SecondModule, this]( 9978 SourceLocation Loc, SourceRange Range, ODRDeclDifference DiffType) { 9979 return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff) 9980 << SecondModule << Range << DiffType; 9981 }; 9982 9983 switch (FirstDiffType) { 9984 case Other: 9985 case EndOfClass: 9986 case PublicSpecifer: 9987 case PrivateSpecifer: 9988 case ProtectedSpecifer: 9989 llvm_unreachable("Invalid diff type"); 9990 9991 case StaticAssert: { 9992 StaticAssertDecl *FirstSA = cast<StaticAssertDecl>(FirstDecl); 9993 StaticAssertDecl *SecondSA = cast<StaticAssertDecl>(SecondDecl); 9994 9995 Expr *FirstExpr = FirstSA->getAssertExpr(); 9996 Expr *SecondExpr = SecondSA->getAssertExpr(); 9997 unsigned FirstODRHash = ComputeODRHash(FirstExpr); 9998 unsigned SecondODRHash = ComputeODRHash(SecondExpr); 9999 if (FirstODRHash != SecondODRHash) { 10000 ODRDiagError(FirstExpr->getBeginLoc(), FirstExpr->getSourceRange(), 10001 StaticAssertCondition); 10002 ODRDiagNote(SecondExpr->getBeginLoc(), SecondExpr->getSourceRange(), 10003 StaticAssertCondition); 10004 Diagnosed = true; 10005 break; 10006 } 10007 10008 StringLiteral *FirstStr = FirstSA->getMessage(); 10009 StringLiteral *SecondStr = SecondSA->getMessage(); 10010 assert((FirstStr || SecondStr) && "Both messages cannot be empty"); 10011 if ((FirstStr && !SecondStr) || (!FirstStr && SecondStr)) { 10012 SourceLocation FirstLoc, SecondLoc; 10013 SourceRange FirstRange, SecondRange; 10014 if (FirstStr) { 10015 FirstLoc = FirstStr->getBeginLoc(); 10016 FirstRange = FirstStr->getSourceRange(); 10017 } else { 10018 FirstLoc = FirstSA->getBeginLoc(); 10019 FirstRange = FirstSA->getSourceRange(); 10020 } 10021 if (SecondStr) { 10022 SecondLoc = SecondStr->getBeginLoc(); 10023 SecondRange = SecondStr->getSourceRange(); 10024 } else { 10025 SecondLoc = SecondSA->getBeginLoc(); 10026 SecondRange = SecondSA->getSourceRange(); 10027 } 10028 ODRDiagError(FirstLoc, FirstRange, StaticAssertOnlyMessage) 10029 << (FirstStr == nullptr); 10030 ODRDiagNote(SecondLoc, SecondRange, StaticAssertOnlyMessage) 10031 << (SecondStr == nullptr); 10032 Diagnosed = true; 10033 break; 10034 } 10035 10036 if (FirstStr && SecondStr && 10037 FirstStr->getString() != SecondStr->getString()) { 10038 ODRDiagError(FirstStr->getBeginLoc(), FirstStr->getSourceRange(), 10039 StaticAssertMessage); 10040 ODRDiagNote(SecondStr->getBeginLoc(), SecondStr->getSourceRange(), 10041 StaticAssertMessage); 10042 Diagnosed = true; 10043 break; 10044 } 10045 break; 10046 } 10047 case Field: { 10048 FieldDecl *FirstField = cast<FieldDecl>(FirstDecl); 10049 FieldDecl *SecondField = cast<FieldDecl>(SecondDecl); 10050 IdentifierInfo *FirstII = FirstField->getIdentifier(); 10051 IdentifierInfo *SecondII = SecondField->getIdentifier(); 10052 if (FirstII->getName() != SecondII->getName()) { 10053 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), 10054 FieldName) 10055 << FirstII; 10056 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), 10057 FieldName) 10058 << SecondII; 10059 10060 Diagnosed = true; 10061 break; 10062 } 10063 10064 assert(getContext().hasSameType(FirstField->getType(), 10065 SecondField->getType())); 10066 10067 QualType FirstType = FirstField->getType(); 10068 QualType SecondType = SecondField->getType(); 10069 if (ComputeQualTypeODRHash(FirstType) != 10070 ComputeQualTypeODRHash(SecondType)) { 10071 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), 10072 FieldTypeName) 10073 << FirstII << FirstType; 10074 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), 10075 FieldTypeName) 10076 << SecondII << SecondType; 10077 10078 Diagnosed = true; 10079 break; 10080 } 10081 10082 const bool IsFirstBitField = FirstField->isBitField(); 10083 const bool IsSecondBitField = SecondField->isBitField(); 10084 if (IsFirstBitField != IsSecondBitField) { 10085 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), 10086 FieldSingleBitField) 10087 << FirstII << IsFirstBitField; 10088 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), 10089 FieldSingleBitField) 10090 << SecondII << IsSecondBitField; 10091 Diagnosed = true; 10092 break; 10093 } 10094 10095 if (IsFirstBitField && IsSecondBitField) { 10096 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), 10097 FieldDifferentWidthBitField) 10098 << FirstII << FirstField->getBitWidth()->getSourceRange(); 10099 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), 10100 FieldDifferentWidthBitField) 10101 << SecondII << SecondField->getBitWidth()->getSourceRange(); 10102 Diagnosed = true; 10103 break; 10104 } 10105 10106 const bool IsFirstMutable = FirstField->isMutable(); 10107 const bool IsSecondMutable = SecondField->isMutable(); 10108 if (IsFirstMutable != IsSecondMutable) { 10109 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), 10110 FieldSingleMutable) 10111 << FirstII << IsFirstMutable; 10112 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), 10113 FieldSingleMutable) 10114 << SecondII << IsSecondMutable; 10115 Diagnosed = true; 10116 break; 10117 } 10118 10119 const Expr *FirstInitializer = FirstField->getInClassInitializer(); 10120 const Expr *SecondInitializer = SecondField->getInClassInitializer(); 10121 if ((!FirstInitializer && SecondInitializer) || 10122 (FirstInitializer && !SecondInitializer)) { 10123 ODRDiagError(FirstField->getLocation(), FirstField->getSourceRange(), 10124 FieldSingleInitializer) 10125 << FirstII << (FirstInitializer != nullptr); 10126 ODRDiagNote(SecondField->getLocation(), SecondField->getSourceRange(), 10127 FieldSingleInitializer) 10128 << SecondII << (SecondInitializer != nullptr); 10129 Diagnosed = true; 10130 break; 10131 } 10132 10133 if (FirstInitializer && SecondInitializer) { 10134 unsigned FirstInitHash = ComputeODRHash(FirstInitializer); 10135 unsigned SecondInitHash = ComputeODRHash(SecondInitializer); 10136 if (FirstInitHash != SecondInitHash) { 10137 ODRDiagError(FirstField->getLocation(), 10138 FirstField->getSourceRange(), 10139 FieldDifferentInitializers) 10140 << FirstII << FirstInitializer->getSourceRange(); 10141 ODRDiagNote(SecondField->getLocation(), 10142 SecondField->getSourceRange(), 10143 FieldDifferentInitializers) 10144 << SecondII << SecondInitializer->getSourceRange(); 10145 Diagnosed = true; 10146 break; 10147 } 10148 } 10149 10150 break; 10151 } 10152 case CXXMethod: { 10153 enum { 10154 DiagMethod, 10155 DiagConstructor, 10156 DiagDestructor, 10157 } FirstMethodType, 10158 SecondMethodType; 10159 auto GetMethodTypeForDiagnostics = [](const CXXMethodDecl* D) { 10160 if (isa<CXXConstructorDecl>(D)) return DiagConstructor; 10161 if (isa<CXXDestructorDecl>(D)) return DiagDestructor; 10162 return DiagMethod; 10163 }; 10164 const CXXMethodDecl *FirstMethod = cast<CXXMethodDecl>(FirstDecl); 10165 const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl); 10166 FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod); 10167 SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod); 10168 auto FirstName = FirstMethod->getDeclName(); 10169 auto SecondName = SecondMethod->getDeclName(); 10170 if (FirstMethodType != SecondMethodType || FirstName != SecondName) { 10171 ODRDiagError(FirstMethod->getLocation(), 10172 FirstMethod->getSourceRange(), MethodName) 10173 << FirstMethodType << FirstName; 10174 ODRDiagNote(SecondMethod->getLocation(), 10175 SecondMethod->getSourceRange(), MethodName) 10176 << SecondMethodType << SecondName; 10177 10178 Diagnosed = true; 10179 break; 10180 } 10181 10182 const bool FirstDeleted = FirstMethod->isDeletedAsWritten(); 10183 const bool SecondDeleted = SecondMethod->isDeletedAsWritten(); 10184 if (FirstDeleted != SecondDeleted) { 10185 ODRDiagError(FirstMethod->getLocation(), 10186 FirstMethod->getSourceRange(), MethodDeleted) 10187 << FirstMethodType << FirstName << FirstDeleted; 10188 10189 ODRDiagNote(SecondMethod->getLocation(), 10190 SecondMethod->getSourceRange(), MethodDeleted) 10191 << SecondMethodType << SecondName << SecondDeleted; 10192 Diagnosed = true; 10193 break; 10194 } 10195 10196 const bool FirstDefaulted = FirstMethod->isExplicitlyDefaulted(); 10197 const bool SecondDefaulted = SecondMethod->isExplicitlyDefaulted(); 10198 if (FirstDefaulted != SecondDefaulted) { 10199 ODRDiagError(FirstMethod->getLocation(), 10200 FirstMethod->getSourceRange(), MethodDefaulted) 10201 << FirstMethodType << FirstName << FirstDefaulted; 10202 10203 ODRDiagNote(SecondMethod->getLocation(), 10204 SecondMethod->getSourceRange(), MethodDefaulted) 10205 << SecondMethodType << SecondName << SecondDefaulted; 10206 Diagnosed = true; 10207 break; 10208 } 10209 10210 const bool FirstVirtual = FirstMethod->isVirtualAsWritten(); 10211 const bool SecondVirtual = SecondMethod->isVirtualAsWritten(); 10212 const bool FirstPure = FirstMethod->isPure(); 10213 const bool SecondPure = SecondMethod->isPure(); 10214 if ((FirstVirtual || SecondVirtual) && 10215 (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) { 10216 ODRDiagError(FirstMethod->getLocation(), 10217 FirstMethod->getSourceRange(), MethodVirtual) 10218 << FirstMethodType << FirstName << FirstPure << FirstVirtual; 10219 ODRDiagNote(SecondMethod->getLocation(), 10220 SecondMethod->getSourceRange(), MethodVirtual) 10221 << SecondMethodType << SecondName << SecondPure << SecondVirtual; 10222 Diagnosed = true; 10223 break; 10224 } 10225 10226 // CXXMethodDecl::isStatic uses the canonical Decl. With Decl merging, 10227 // FirstDecl is the canonical Decl of SecondDecl, so the storage 10228 // class needs to be checked instead. 10229 const auto FirstStorage = FirstMethod->getStorageClass(); 10230 const auto SecondStorage = SecondMethod->getStorageClass(); 10231 const bool FirstStatic = FirstStorage == SC_Static; 10232 const bool SecondStatic = SecondStorage == SC_Static; 10233 if (FirstStatic != SecondStatic) { 10234 ODRDiagError(FirstMethod->getLocation(), 10235 FirstMethod->getSourceRange(), MethodStatic) 10236 << FirstMethodType << FirstName << FirstStatic; 10237 ODRDiagNote(SecondMethod->getLocation(), 10238 SecondMethod->getSourceRange(), MethodStatic) 10239 << SecondMethodType << SecondName << SecondStatic; 10240 Diagnosed = true; 10241 break; 10242 } 10243 10244 const bool FirstVolatile = FirstMethod->isVolatile(); 10245 const bool SecondVolatile = SecondMethod->isVolatile(); 10246 if (FirstVolatile != SecondVolatile) { 10247 ODRDiagError(FirstMethod->getLocation(), 10248 FirstMethod->getSourceRange(), MethodVolatile) 10249 << FirstMethodType << FirstName << FirstVolatile; 10250 ODRDiagNote(SecondMethod->getLocation(), 10251 SecondMethod->getSourceRange(), MethodVolatile) 10252 << SecondMethodType << SecondName << SecondVolatile; 10253 Diagnosed = true; 10254 break; 10255 } 10256 10257 const bool FirstConst = FirstMethod->isConst(); 10258 const bool SecondConst = SecondMethod->isConst(); 10259 if (FirstConst != SecondConst) { 10260 ODRDiagError(FirstMethod->getLocation(), 10261 FirstMethod->getSourceRange(), MethodConst) 10262 << FirstMethodType << FirstName << FirstConst; 10263 ODRDiagNote(SecondMethod->getLocation(), 10264 SecondMethod->getSourceRange(), MethodConst) 10265 << SecondMethodType << SecondName << SecondConst; 10266 Diagnosed = true; 10267 break; 10268 } 10269 10270 const bool FirstInline = FirstMethod->isInlineSpecified(); 10271 const bool SecondInline = SecondMethod->isInlineSpecified(); 10272 if (FirstInline != SecondInline) { 10273 ODRDiagError(FirstMethod->getLocation(), 10274 FirstMethod->getSourceRange(), MethodInline) 10275 << FirstMethodType << FirstName << FirstInline; 10276 ODRDiagNote(SecondMethod->getLocation(), 10277 SecondMethod->getSourceRange(), MethodInline) 10278 << SecondMethodType << SecondName << SecondInline; 10279 Diagnosed = true; 10280 break; 10281 } 10282 10283 const unsigned FirstNumParameters = FirstMethod->param_size(); 10284 const unsigned SecondNumParameters = SecondMethod->param_size(); 10285 if (FirstNumParameters != SecondNumParameters) { 10286 ODRDiagError(FirstMethod->getLocation(), 10287 FirstMethod->getSourceRange(), MethodNumberParameters) 10288 << FirstMethodType << FirstName << FirstNumParameters; 10289 ODRDiagNote(SecondMethod->getLocation(), 10290 SecondMethod->getSourceRange(), MethodNumberParameters) 10291 << SecondMethodType << SecondName << SecondNumParameters; 10292 Diagnosed = true; 10293 break; 10294 } 10295 10296 // Need this status boolean to know when break out of the switch. 10297 bool ParameterMismatch = false; 10298 for (unsigned I = 0; I < FirstNumParameters; ++I) { 10299 const ParmVarDecl *FirstParam = FirstMethod->getParamDecl(I); 10300 const ParmVarDecl *SecondParam = SecondMethod->getParamDecl(I); 10301 10302 QualType FirstParamType = FirstParam->getType(); 10303 QualType SecondParamType = SecondParam->getType(); 10304 if (FirstParamType != SecondParamType && 10305 ComputeQualTypeODRHash(FirstParamType) != 10306 ComputeQualTypeODRHash(SecondParamType)) { 10307 if (const DecayedType *ParamDecayedType = 10308 FirstParamType->getAs<DecayedType>()) { 10309 ODRDiagError(FirstMethod->getLocation(), 10310 FirstMethod->getSourceRange(), MethodParameterType) 10311 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10312 << true << ParamDecayedType->getOriginalType(); 10313 } else { 10314 ODRDiagError(FirstMethod->getLocation(), 10315 FirstMethod->getSourceRange(), MethodParameterType) 10316 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10317 << false; 10318 } 10319 10320 if (const DecayedType *ParamDecayedType = 10321 SecondParamType->getAs<DecayedType>()) { 10322 ODRDiagNote(SecondMethod->getLocation(), 10323 SecondMethod->getSourceRange(), MethodParameterType) 10324 << SecondMethodType << SecondName << (I + 1) 10325 << SecondParamType << true 10326 << ParamDecayedType->getOriginalType(); 10327 } else { 10328 ODRDiagNote(SecondMethod->getLocation(), 10329 SecondMethod->getSourceRange(), MethodParameterType) 10330 << SecondMethodType << SecondName << (I + 1) 10331 << SecondParamType << false; 10332 } 10333 ParameterMismatch = true; 10334 break; 10335 } 10336 10337 DeclarationName FirstParamName = FirstParam->getDeclName(); 10338 DeclarationName SecondParamName = SecondParam->getDeclName(); 10339 if (FirstParamName != SecondParamName) { 10340 ODRDiagError(FirstMethod->getLocation(), 10341 FirstMethod->getSourceRange(), MethodParameterName) 10342 << FirstMethodType << FirstName << (I + 1) << FirstParamName; 10343 ODRDiagNote(SecondMethod->getLocation(), 10344 SecondMethod->getSourceRange(), MethodParameterName) 10345 << SecondMethodType << SecondName << (I + 1) << SecondParamName; 10346 ParameterMismatch = true; 10347 break; 10348 } 10349 10350 const Expr *FirstInit = FirstParam->getInit(); 10351 const Expr *SecondInit = SecondParam->getInit(); 10352 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 10353 ODRDiagError(FirstMethod->getLocation(), 10354 FirstMethod->getSourceRange(), 10355 MethodParameterSingleDefaultArgument) 10356 << FirstMethodType << FirstName << (I + 1) 10357 << (FirstInit == nullptr) 10358 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 10359 ODRDiagNote(SecondMethod->getLocation(), 10360 SecondMethod->getSourceRange(), 10361 MethodParameterSingleDefaultArgument) 10362 << SecondMethodType << SecondName << (I + 1) 10363 << (SecondInit == nullptr) 10364 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 10365 ParameterMismatch = true; 10366 break; 10367 } 10368 10369 if (FirstInit && SecondInit && 10370 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 10371 ODRDiagError(FirstMethod->getLocation(), 10372 FirstMethod->getSourceRange(), 10373 MethodParameterDifferentDefaultArgument) 10374 << FirstMethodType << FirstName << (I + 1) 10375 << FirstInit->getSourceRange(); 10376 ODRDiagNote(SecondMethod->getLocation(), 10377 SecondMethod->getSourceRange(), 10378 MethodParameterDifferentDefaultArgument) 10379 << SecondMethodType << SecondName << (I + 1) 10380 << SecondInit->getSourceRange(); 10381 ParameterMismatch = true; 10382 break; 10383 10384 } 10385 } 10386 10387 if (ParameterMismatch) { 10388 Diagnosed = true; 10389 break; 10390 } 10391 10392 const auto *FirstTemplateArgs = 10393 FirstMethod->getTemplateSpecializationArgs(); 10394 const auto *SecondTemplateArgs = 10395 SecondMethod->getTemplateSpecializationArgs(); 10396 10397 if ((FirstTemplateArgs && !SecondTemplateArgs) || 10398 (!FirstTemplateArgs && SecondTemplateArgs)) { 10399 ODRDiagError(FirstMethod->getLocation(), 10400 FirstMethod->getSourceRange(), MethodNoTemplateArguments) 10401 << FirstMethodType << FirstName << (FirstTemplateArgs != nullptr); 10402 ODRDiagNote(SecondMethod->getLocation(), 10403 SecondMethod->getSourceRange(), MethodNoTemplateArguments) 10404 << SecondMethodType << SecondName 10405 << (SecondTemplateArgs != nullptr); 10406 10407 Diagnosed = true; 10408 break; 10409 } 10410 10411 if (FirstTemplateArgs && SecondTemplateArgs) { 10412 // Remove pack expansions from argument list. 10413 auto ExpandTemplateArgumentList = 10414 [](const TemplateArgumentList *TAL) { 10415 llvm::SmallVector<const TemplateArgument *, 8> ExpandedList; 10416 for (const TemplateArgument &TA : TAL->asArray()) { 10417 if (TA.getKind() != TemplateArgument::Pack) { 10418 ExpandedList.push_back(&TA); 10419 continue; 10420 } 10421 for (const TemplateArgument &PackTA : TA.getPackAsArray()) { 10422 ExpandedList.push_back(&PackTA); 10423 } 10424 } 10425 return ExpandedList; 10426 }; 10427 llvm::SmallVector<const TemplateArgument *, 8> FirstExpandedList = 10428 ExpandTemplateArgumentList(FirstTemplateArgs); 10429 llvm::SmallVector<const TemplateArgument *, 8> SecondExpandedList = 10430 ExpandTemplateArgumentList(SecondTemplateArgs); 10431 10432 if (FirstExpandedList.size() != SecondExpandedList.size()) { 10433 ODRDiagError(FirstMethod->getLocation(), 10434 FirstMethod->getSourceRange(), 10435 MethodDifferentNumberTemplateArguments) 10436 << FirstMethodType << FirstName 10437 << (unsigned)FirstExpandedList.size(); 10438 ODRDiagNote(SecondMethod->getLocation(), 10439 SecondMethod->getSourceRange(), 10440 MethodDifferentNumberTemplateArguments) 10441 << SecondMethodType << SecondName 10442 << (unsigned)SecondExpandedList.size(); 10443 10444 Diagnosed = true; 10445 break; 10446 } 10447 10448 bool TemplateArgumentMismatch = false; 10449 for (unsigned i = 0, e = FirstExpandedList.size(); i != e; ++i) { 10450 const TemplateArgument &FirstTA = *FirstExpandedList[i], 10451 &SecondTA = *SecondExpandedList[i]; 10452 if (ComputeTemplateArgumentODRHash(FirstTA) == 10453 ComputeTemplateArgumentODRHash(SecondTA)) { 10454 continue; 10455 } 10456 10457 ODRDiagError(FirstMethod->getLocation(), 10458 FirstMethod->getSourceRange(), 10459 MethodDifferentTemplateArgument) 10460 << FirstMethodType << FirstName << FirstTA << i + 1; 10461 ODRDiagNote(SecondMethod->getLocation(), 10462 SecondMethod->getSourceRange(), 10463 MethodDifferentTemplateArgument) 10464 << SecondMethodType << SecondName << SecondTA << i + 1; 10465 10466 TemplateArgumentMismatch = true; 10467 break; 10468 } 10469 10470 if (TemplateArgumentMismatch) { 10471 Diagnosed = true; 10472 break; 10473 } 10474 } 10475 10476 // Compute the hash of the method as if it has no body. 10477 auto ComputeCXXMethodODRHash = [&Hash](const CXXMethodDecl *D) { 10478 Hash.clear(); 10479 Hash.AddFunctionDecl(D, true /*SkipBody*/); 10480 return Hash.CalculateHash(); 10481 }; 10482 10483 // Compare the hash generated to the hash stored. A difference means 10484 // that a body was present in the original source. Due to merging, 10485 // the stardard way of detecting a body will not work. 10486 const bool HasFirstBody = 10487 ComputeCXXMethodODRHash(FirstMethod) != FirstMethod->getODRHash(); 10488 const bool HasSecondBody = 10489 ComputeCXXMethodODRHash(SecondMethod) != SecondMethod->getODRHash(); 10490 10491 if (HasFirstBody != HasSecondBody) { 10492 ODRDiagError(FirstMethod->getLocation(), 10493 FirstMethod->getSourceRange(), MethodSingleBody) 10494 << FirstMethodType << FirstName << HasFirstBody; 10495 ODRDiagNote(SecondMethod->getLocation(), 10496 SecondMethod->getSourceRange(), MethodSingleBody) 10497 << SecondMethodType << SecondName << HasSecondBody; 10498 Diagnosed = true; 10499 break; 10500 } 10501 10502 if (HasFirstBody && HasSecondBody) { 10503 ODRDiagError(FirstMethod->getLocation(), 10504 FirstMethod->getSourceRange(), MethodDifferentBody) 10505 << FirstMethodType << FirstName; 10506 ODRDiagNote(SecondMethod->getLocation(), 10507 SecondMethod->getSourceRange(), MethodDifferentBody) 10508 << SecondMethodType << SecondName; 10509 Diagnosed = true; 10510 break; 10511 } 10512 10513 break; 10514 } 10515 case TypeAlias: 10516 case TypeDef: { 10517 TypedefNameDecl *FirstTD = cast<TypedefNameDecl>(FirstDecl); 10518 TypedefNameDecl *SecondTD = cast<TypedefNameDecl>(SecondDecl); 10519 auto FirstName = FirstTD->getDeclName(); 10520 auto SecondName = SecondTD->getDeclName(); 10521 if (FirstName != SecondName) { 10522 ODRDiagError(FirstTD->getLocation(), FirstTD->getSourceRange(), 10523 TypedefName) 10524 << (FirstDiffType == TypeAlias) << FirstName; 10525 ODRDiagNote(SecondTD->getLocation(), SecondTD->getSourceRange(), 10526 TypedefName) 10527 << (FirstDiffType == TypeAlias) << SecondName; 10528 Diagnosed = true; 10529 break; 10530 } 10531 10532 QualType FirstType = FirstTD->getUnderlyingType(); 10533 QualType SecondType = SecondTD->getUnderlyingType(); 10534 if (ComputeQualTypeODRHash(FirstType) != 10535 ComputeQualTypeODRHash(SecondType)) { 10536 ODRDiagError(FirstTD->getLocation(), FirstTD->getSourceRange(), 10537 TypedefType) 10538 << (FirstDiffType == TypeAlias) << FirstName << FirstType; 10539 ODRDiagNote(SecondTD->getLocation(), SecondTD->getSourceRange(), 10540 TypedefType) 10541 << (FirstDiffType == TypeAlias) << SecondName << SecondType; 10542 Diagnosed = true; 10543 break; 10544 } 10545 break; 10546 } 10547 case Var: { 10548 VarDecl *FirstVD = cast<VarDecl>(FirstDecl); 10549 VarDecl *SecondVD = cast<VarDecl>(SecondDecl); 10550 auto FirstName = FirstVD->getDeclName(); 10551 auto SecondName = SecondVD->getDeclName(); 10552 if (FirstName != SecondName) { 10553 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(), 10554 VarName) 10555 << FirstName; 10556 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(), 10557 VarName) 10558 << SecondName; 10559 Diagnosed = true; 10560 break; 10561 } 10562 10563 QualType FirstType = FirstVD->getType(); 10564 QualType SecondType = SecondVD->getType(); 10565 if (ComputeQualTypeODRHash(FirstType) != 10566 ComputeQualTypeODRHash(SecondType)) { 10567 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(), 10568 VarType) 10569 << FirstName << FirstType; 10570 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(), 10571 VarType) 10572 << SecondName << SecondType; 10573 Diagnosed = true; 10574 break; 10575 } 10576 10577 const Expr *FirstInit = FirstVD->getInit(); 10578 const Expr *SecondInit = SecondVD->getInit(); 10579 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 10580 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(), 10581 VarSingleInitializer) 10582 << FirstName << (FirstInit == nullptr) 10583 << (FirstInit ? FirstInit->getSourceRange(): SourceRange()); 10584 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(), 10585 VarSingleInitializer) 10586 << SecondName << (SecondInit == nullptr) 10587 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 10588 Diagnosed = true; 10589 break; 10590 } 10591 10592 if (FirstInit && SecondInit && 10593 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 10594 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(), 10595 VarDifferentInitializer) 10596 << FirstName << FirstInit->getSourceRange(); 10597 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(), 10598 VarDifferentInitializer) 10599 << SecondName << SecondInit->getSourceRange(); 10600 Diagnosed = true; 10601 break; 10602 } 10603 10604 const bool FirstIsConstexpr = FirstVD->isConstexpr(); 10605 const bool SecondIsConstexpr = SecondVD->isConstexpr(); 10606 if (FirstIsConstexpr != SecondIsConstexpr) { 10607 ODRDiagError(FirstVD->getLocation(), FirstVD->getSourceRange(), 10608 VarConstexpr) 10609 << FirstName << FirstIsConstexpr; 10610 ODRDiagNote(SecondVD->getLocation(), SecondVD->getSourceRange(), 10611 VarConstexpr) 10612 << SecondName << SecondIsConstexpr; 10613 Diagnosed = true; 10614 break; 10615 } 10616 break; 10617 } 10618 case Friend: { 10619 FriendDecl *FirstFriend = cast<FriendDecl>(FirstDecl); 10620 FriendDecl *SecondFriend = cast<FriendDecl>(SecondDecl); 10621 10622 NamedDecl *FirstND = FirstFriend->getFriendDecl(); 10623 NamedDecl *SecondND = SecondFriend->getFriendDecl(); 10624 10625 TypeSourceInfo *FirstTSI = FirstFriend->getFriendType(); 10626 TypeSourceInfo *SecondTSI = SecondFriend->getFriendType(); 10627 10628 if (FirstND && SecondND) { 10629 ODRDiagError(FirstFriend->getFriendLoc(), 10630 FirstFriend->getSourceRange(), FriendFunction) 10631 << FirstND; 10632 ODRDiagNote(SecondFriend->getFriendLoc(), 10633 SecondFriend->getSourceRange(), FriendFunction) 10634 << SecondND; 10635 10636 Diagnosed = true; 10637 break; 10638 } 10639 10640 if (FirstTSI && SecondTSI) { 10641 QualType FirstFriendType = FirstTSI->getType(); 10642 QualType SecondFriendType = SecondTSI->getType(); 10643 assert(ComputeQualTypeODRHash(FirstFriendType) != 10644 ComputeQualTypeODRHash(SecondFriendType)); 10645 ODRDiagError(FirstFriend->getFriendLoc(), 10646 FirstFriend->getSourceRange(), FriendType) 10647 << FirstFriendType; 10648 ODRDiagNote(SecondFriend->getFriendLoc(), 10649 SecondFriend->getSourceRange(), FriendType) 10650 << SecondFriendType; 10651 Diagnosed = true; 10652 break; 10653 } 10654 10655 ODRDiagError(FirstFriend->getFriendLoc(), FirstFriend->getSourceRange(), 10656 FriendTypeFunction) 10657 << (FirstTSI == nullptr); 10658 ODRDiagNote(SecondFriend->getFriendLoc(), 10659 SecondFriend->getSourceRange(), FriendTypeFunction) 10660 << (SecondTSI == nullptr); 10661 10662 Diagnosed = true; 10663 break; 10664 } 10665 case FunctionTemplate: { 10666 FunctionTemplateDecl *FirstTemplate = 10667 cast<FunctionTemplateDecl>(FirstDecl); 10668 FunctionTemplateDecl *SecondTemplate = 10669 cast<FunctionTemplateDecl>(SecondDecl); 10670 10671 TemplateParameterList *FirstTPL = 10672 FirstTemplate->getTemplateParameters(); 10673 TemplateParameterList *SecondTPL = 10674 SecondTemplate->getTemplateParameters(); 10675 10676 if (FirstTPL->size() != SecondTPL->size()) { 10677 ODRDiagError(FirstTemplate->getLocation(), 10678 FirstTemplate->getSourceRange(), 10679 FunctionTemplateDifferentNumberParameters) 10680 << FirstTemplate << FirstTPL->size(); 10681 ODRDiagNote(SecondTemplate->getLocation(), 10682 SecondTemplate->getSourceRange(), 10683 FunctionTemplateDifferentNumberParameters) 10684 << SecondTemplate << SecondTPL->size(); 10685 10686 Diagnosed = true; 10687 break; 10688 } 10689 10690 bool ParameterMismatch = false; 10691 for (unsigned i = 0, e = FirstTPL->size(); i != e; ++i) { 10692 NamedDecl *FirstParam = FirstTPL->getParam(i); 10693 NamedDecl *SecondParam = SecondTPL->getParam(i); 10694 10695 if (FirstParam->getKind() != SecondParam->getKind()) { 10696 enum { 10697 TemplateTypeParameter, 10698 NonTypeTemplateParameter, 10699 TemplateTemplateParameter, 10700 }; 10701 auto GetParamType = [](NamedDecl *D) { 10702 switch (D->getKind()) { 10703 default: 10704 llvm_unreachable("Unexpected template parameter type"); 10705 case Decl::TemplateTypeParm: 10706 return TemplateTypeParameter; 10707 case Decl::NonTypeTemplateParm: 10708 return NonTypeTemplateParameter; 10709 case Decl::TemplateTemplateParm: 10710 return TemplateTemplateParameter; 10711 } 10712 }; 10713 10714 ODRDiagError(FirstTemplate->getLocation(), 10715 FirstTemplate->getSourceRange(), 10716 FunctionTemplateParameterDifferentKind) 10717 << FirstTemplate << (i + 1) << GetParamType(FirstParam); 10718 ODRDiagNote(SecondTemplate->getLocation(), 10719 SecondTemplate->getSourceRange(), 10720 FunctionTemplateParameterDifferentKind) 10721 << SecondTemplate << (i + 1) << GetParamType(SecondParam); 10722 10723 ParameterMismatch = true; 10724 break; 10725 } 10726 10727 if (FirstParam->getName() != SecondParam->getName()) { 10728 ODRDiagError(FirstTemplate->getLocation(), 10729 FirstTemplate->getSourceRange(), 10730 FunctionTemplateParameterName) 10731 << FirstTemplate << (i + 1) << (bool)FirstParam->getIdentifier() 10732 << FirstParam; 10733 ODRDiagNote(SecondTemplate->getLocation(), 10734 SecondTemplate->getSourceRange(), 10735 FunctionTemplateParameterName) 10736 << SecondTemplate << (i + 1) 10737 << (bool)SecondParam->getIdentifier() << SecondParam; 10738 ParameterMismatch = true; 10739 break; 10740 } 10741 10742 if (isa<TemplateTypeParmDecl>(FirstParam) && 10743 isa<TemplateTypeParmDecl>(SecondParam)) { 10744 TemplateTypeParmDecl *FirstTTPD = 10745 cast<TemplateTypeParmDecl>(FirstParam); 10746 TemplateTypeParmDecl *SecondTTPD = 10747 cast<TemplateTypeParmDecl>(SecondParam); 10748 bool HasFirstDefaultArgument = 10749 FirstTTPD->hasDefaultArgument() && 10750 !FirstTTPD->defaultArgumentWasInherited(); 10751 bool HasSecondDefaultArgument = 10752 SecondTTPD->hasDefaultArgument() && 10753 !SecondTTPD->defaultArgumentWasInherited(); 10754 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10755 ODRDiagError(FirstTemplate->getLocation(), 10756 FirstTemplate->getSourceRange(), 10757 FunctionTemplateParameterSingleDefaultArgument) 10758 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 10759 ODRDiagNote(SecondTemplate->getLocation(), 10760 SecondTemplate->getSourceRange(), 10761 FunctionTemplateParameterSingleDefaultArgument) 10762 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 10763 ParameterMismatch = true; 10764 break; 10765 } 10766 10767 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 10768 QualType FirstType = FirstTTPD->getDefaultArgument(); 10769 QualType SecondType = SecondTTPD->getDefaultArgument(); 10770 if (ComputeQualTypeODRHash(FirstType) != 10771 ComputeQualTypeODRHash(SecondType)) { 10772 ODRDiagError(FirstTemplate->getLocation(), 10773 FirstTemplate->getSourceRange(), 10774 FunctionTemplateParameterDifferentDefaultArgument) 10775 << FirstTemplate << (i + 1) << FirstType; 10776 ODRDiagNote(SecondTemplate->getLocation(), 10777 SecondTemplate->getSourceRange(), 10778 FunctionTemplateParameterDifferentDefaultArgument) 10779 << SecondTemplate << (i + 1) << SecondType; 10780 ParameterMismatch = true; 10781 break; 10782 } 10783 } 10784 10785 if (FirstTTPD->isParameterPack() != 10786 SecondTTPD->isParameterPack()) { 10787 ODRDiagError(FirstTemplate->getLocation(), 10788 FirstTemplate->getSourceRange(), 10789 FunctionTemplatePackParameter) 10790 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 10791 ODRDiagNote(SecondTemplate->getLocation(), 10792 SecondTemplate->getSourceRange(), 10793 FunctionTemplatePackParameter) 10794 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 10795 ParameterMismatch = true; 10796 break; 10797 } 10798 } 10799 10800 if (isa<TemplateTemplateParmDecl>(FirstParam) && 10801 isa<TemplateTemplateParmDecl>(SecondParam)) { 10802 TemplateTemplateParmDecl *FirstTTPD = 10803 cast<TemplateTemplateParmDecl>(FirstParam); 10804 TemplateTemplateParmDecl *SecondTTPD = 10805 cast<TemplateTemplateParmDecl>(SecondParam); 10806 10807 TemplateParameterList *FirstTPL = 10808 FirstTTPD->getTemplateParameters(); 10809 TemplateParameterList *SecondTPL = 10810 SecondTTPD->getTemplateParameters(); 10811 10812 if (ComputeTemplateParameterListODRHash(FirstTPL) != 10813 ComputeTemplateParameterListODRHash(SecondTPL)) { 10814 ODRDiagError(FirstTemplate->getLocation(), 10815 FirstTemplate->getSourceRange(), 10816 FunctionTemplateParameterDifferentType) 10817 << FirstTemplate << (i + 1); 10818 ODRDiagNote(SecondTemplate->getLocation(), 10819 SecondTemplate->getSourceRange(), 10820 FunctionTemplateParameterDifferentType) 10821 << SecondTemplate << (i + 1); 10822 ParameterMismatch = true; 10823 break; 10824 } 10825 10826 bool HasFirstDefaultArgument = 10827 FirstTTPD->hasDefaultArgument() && 10828 !FirstTTPD->defaultArgumentWasInherited(); 10829 bool HasSecondDefaultArgument = 10830 SecondTTPD->hasDefaultArgument() && 10831 !SecondTTPD->defaultArgumentWasInherited(); 10832 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10833 ODRDiagError(FirstTemplate->getLocation(), 10834 FirstTemplate->getSourceRange(), 10835 FunctionTemplateParameterSingleDefaultArgument) 10836 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 10837 ODRDiagNote(SecondTemplate->getLocation(), 10838 SecondTemplate->getSourceRange(), 10839 FunctionTemplateParameterSingleDefaultArgument) 10840 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 10841 ParameterMismatch = true; 10842 break; 10843 } 10844 10845 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 10846 TemplateArgument FirstTA = 10847 FirstTTPD->getDefaultArgument().getArgument(); 10848 TemplateArgument SecondTA = 10849 SecondTTPD->getDefaultArgument().getArgument(); 10850 if (ComputeTemplateArgumentODRHash(FirstTA) != 10851 ComputeTemplateArgumentODRHash(SecondTA)) { 10852 ODRDiagError(FirstTemplate->getLocation(), 10853 FirstTemplate->getSourceRange(), 10854 FunctionTemplateParameterDifferentDefaultArgument) 10855 << FirstTemplate << (i + 1) << FirstTA; 10856 ODRDiagNote(SecondTemplate->getLocation(), 10857 SecondTemplate->getSourceRange(), 10858 FunctionTemplateParameterDifferentDefaultArgument) 10859 << SecondTemplate << (i + 1) << SecondTA; 10860 ParameterMismatch = true; 10861 break; 10862 } 10863 } 10864 10865 if (FirstTTPD->isParameterPack() != 10866 SecondTTPD->isParameterPack()) { 10867 ODRDiagError(FirstTemplate->getLocation(), 10868 FirstTemplate->getSourceRange(), 10869 FunctionTemplatePackParameter) 10870 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 10871 ODRDiagNote(SecondTemplate->getLocation(), 10872 SecondTemplate->getSourceRange(), 10873 FunctionTemplatePackParameter) 10874 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 10875 ParameterMismatch = true; 10876 break; 10877 } 10878 } 10879 10880 if (isa<NonTypeTemplateParmDecl>(FirstParam) && 10881 isa<NonTypeTemplateParmDecl>(SecondParam)) { 10882 NonTypeTemplateParmDecl *FirstNTTPD = 10883 cast<NonTypeTemplateParmDecl>(FirstParam); 10884 NonTypeTemplateParmDecl *SecondNTTPD = 10885 cast<NonTypeTemplateParmDecl>(SecondParam); 10886 10887 QualType FirstType = FirstNTTPD->getType(); 10888 QualType SecondType = SecondNTTPD->getType(); 10889 if (ComputeQualTypeODRHash(FirstType) != 10890 ComputeQualTypeODRHash(SecondType)) { 10891 ODRDiagError(FirstTemplate->getLocation(), 10892 FirstTemplate->getSourceRange(), 10893 FunctionTemplateParameterDifferentType) 10894 << FirstTemplate << (i + 1); 10895 ODRDiagNote(SecondTemplate->getLocation(), 10896 SecondTemplate->getSourceRange(), 10897 FunctionTemplateParameterDifferentType) 10898 << SecondTemplate << (i + 1); 10899 ParameterMismatch = true; 10900 break; 10901 } 10902 10903 bool HasFirstDefaultArgument = 10904 FirstNTTPD->hasDefaultArgument() && 10905 !FirstNTTPD->defaultArgumentWasInherited(); 10906 bool HasSecondDefaultArgument = 10907 SecondNTTPD->hasDefaultArgument() && 10908 !SecondNTTPD->defaultArgumentWasInherited(); 10909 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10910 ODRDiagError(FirstTemplate->getLocation(), 10911 FirstTemplate->getSourceRange(), 10912 FunctionTemplateParameterSingleDefaultArgument) 10913 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 10914 ODRDiagNote(SecondTemplate->getLocation(), 10915 SecondTemplate->getSourceRange(), 10916 FunctionTemplateParameterSingleDefaultArgument) 10917 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 10918 ParameterMismatch = true; 10919 break; 10920 } 10921 10922 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 10923 Expr *FirstDefaultArgument = FirstNTTPD->getDefaultArgument(); 10924 Expr *SecondDefaultArgument = SecondNTTPD->getDefaultArgument(); 10925 if (ComputeODRHash(FirstDefaultArgument) != 10926 ComputeODRHash(SecondDefaultArgument)) { 10927 ODRDiagError(FirstTemplate->getLocation(), 10928 FirstTemplate->getSourceRange(), 10929 FunctionTemplateParameterDifferentDefaultArgument) 10930 << FirstTemplate << (i + 1) << FirstDefaultArgument; 10931 ODRDiagNote(SecondTemplate->getLocation(), 10932 SecondTemplate->getSourceRange(), 10933 FunctionTemplateParameterDifferentDefaultArgument) 10934 << SecondTemplate << (i + 1) << SecondDefaultArgument; 10935 ParameterMismatch = true; 10936 break; 10937 } 10938 } 10939 10940 if (FirstNTTPD->isParameterPack() != 10941 SecondNTTPD->isParameterPack()) { 10942 ODRDiagError(FirstTemplate->getLocation(), 10943 FirstTemplate->getSourceRange(), 10944 FunctionTemplatePackParameter) 10945 << FirstTemplate << (i + 1) << FirstNTTPD->isParameterPack(); 10946 ODRDiagNote(SecondTemplate->getLocation(), 10947 SecondTemplate->getSourceRange(), 10948 FunctionTemplatePackParameter) 10949 << SecondTemplate << (i + 1) 10950 << SecondNTTPD->isParameterPack(); 10951 ParameterMismatch = true; 10952 break; 10953 } 10954 } 10955 } 10956 10957 if (ParameterMismatch) { 10958 Diagnosed = true; 10959 break; 10960 } 10961 10962 break; 10963 } 10964 } 10965 10966 if (Diagnosed) 10967 continue; 10968 10969 Diag(FirstDecl->getLocation(), 10970 diag::err_module_odr_violation_mismatch_decl_unknown) 10971 << FirstRecord << FirstModule.empty() << FirstModule << FirstDiffType 10972 << FirstDecl->getSourceRange(); 10973 Diag(SecondDecl->getLocation(), 10974 diag::note_module_odr_violation_mismatch_decl_unknown) 10975 << SecondModule << FirstDiffType << SecondDecl->getSourceRange(); 10976 Diagnosed = true; 10977 } 10978 10979 if (!Diagnosed) { 10980 // All definitions are updates to the same declaration. This happens if a 10981 // module instantiates the declaration of a class template specialization 10982 // and two or more other modules instantiate its definition. 10983 // 10984 // FIXME: Indicate which modules had instantiations of this definition. 10985 // FIXME: How can this even happen? 10986 Diag(Merge.first->getLocation(), 10987 diag::err_module_odr_violation_different_instantiations) 10988 << Merge.first; 10989 } 10990 } 10991 10992 // Issue ODR failures diagnostics for functions. 10993 for (auto &Merge : FunctionOdrMergeFailures) { 10994 enum ODRFunctionDifference { 10995 ReturnType, 10996 ParameterName, 10997 ParameterType, 10998 ParameterSingleDefaultArgument, 10999 ParameterDifferentDefaultArgument, 11000 FunctionBody, 11001 }; 11002 11003 FunctionDecl *FirstFunction = Merge.first; 11004 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstFunction); 11005 11006 bool Diagnosed = false; 11007 for (auto &SecondFunction : Merge.second) { 11008 11009 if (FirstFunction == SecondFunction) 11010 continue; 11011 11012 std::string SecondModule = 11013 getOwningModuleNameForDiagnostic(SecondFunction); 11014 11015 auto ODRDiagError = [FirstFunction, &FirstModule, 11016 this](SourceLocation Loc, SourceRange Range, 11017 ODRFunctionDifference DiffType) { 11018 return Diag(Loc, diag::err_module_odr_violation_function) 11019 << FirstFunction << FirstModule.empty() << FirstModule << Range 11020 << DiffType; 11021 }; 11022 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11023 SourceRange Range, 11024 ODRFunctionDifference DiffType) { 11025 return Diag(Loc, diag::note_module_odr_violation_function) 11026 << SecondModule << Range << DiffType; 11027 }; 11028 11029 if (ComputeQualTypeODRHash(FirstFunction->getReturnType()) != 11030 ComputeQualTypeODRHash(SecondFunction->getReturnType())) { 11031 ODRDiagError(FirstFunction->getReturnTypeSourceRange().getBegin(), 11032 FirstFunction->getReturnTypeSourceRange(), ReturnType) 11033 << FirstFunction->getReturnType(); 11034 ODRDiagNote(SecondFunction->getReturnTypeSourceRange().getBegin(), 11035 SecondFunction->getReturnTypeSourceRange(), ReturnType) 11036 << SecondFunction->getReturnType(); 11037 Diagnosed = true; 11038 break; 11039 } 11040 11041 assert(FirstFunction->param_size() == SecondFunction->param_size() && 11042 "Merged functions with different number of parameters"); 11043 11044 auto ParamSize = FirstFunction->param_size(); 11045 bool ParameterMismatch = false; 11046 for (unsigned I = 0; I < ParamSize; ++I) { 11047 auto *FirstParam = FirstFunction->getParamDecl(I); 11048 auto *SecondParam = SecondFunction->getParamDecl(I); 11049 11050 assert(getContext().hasSameType(FirstParam->getType(), 11051 SecondParam->getType()) && 11052 "Merged function has different parameter types."); 11053 11054 if (FirstParam->getDeclName() != SecondParam->getDeclName()) { 11055 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11056 ParameterName) 11057 << I + 1 << FirstParam->getDeclName(); 11058 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11059 ParameterName) 11060 << I + 1 << SecondParam->getDeclName(); 11061 ParameterMismatch = true; 11062 break; 11063 }; 11064 11065 QualType FirstParamType = FirstParam->getType(); 11066 QualType SecondParamType = SecondParam->getType(); 11067 if (FirstParamType != SecondParamType && 11068 ComputeQualTypeODRHash(FirstParamType) != 11069 ComputeQualTypeODRHash(SecondParamType)) { 11070 if (const DecayedType *ParamDecayedType = 11071 FirstParamType->getAs<DecayedType>()) { 11072 ODRDiagError(FirstParam->getLocation(), 11073 FirstParam->getSourceRange(), ParameterType) 11074 << (I + 1) << FirstParamType << true 11075 << ParamDecayedType->getOriginalType(); 11076 } else { 11077 ODRDiagError(FirstParam->getLocation(), 11078 FirstParam->getSourceRange(), ParameterType) 11079 << (I + 1) << FirstParamType << false; 11080 } 11081 11082 if (const DecayedType *ParamDecayedType = 11083 SecondParamType->getAs<DecayedType>()) { 11084 ODRDiagNote(SecondParam->getLocation(), 11085 SecondParam->getSourceRange(), ParameterType) 11086 << (I + 1) << SecondParamType << true 11087 << ParamDecayedType->getOriginalType(); 11088 } else { 11089 ODRDiagNote(SecondParam->getLocation(), 11090 SecondParam->getSourceRange(), ParameterType) 11091 << (I + 1) << SecondParamType << false; 11092 } 11093 ParameterMismatch = true; 11094 break; 11095 } 11096 11097 const Expr *FirstInit = FirstParam->getInit(); 11098 const Expr *SecondInit = SecondParam->getInit(); 11099 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 11100 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11101 ParameterSingleDefaultArgument) 11102 << (I + 1) << (FirstInit == nullptr) 11103 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 11104 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11105 ParameterSingleDefaultArgument) 11106 << (I + 1) << (SecondInit == nullptr) 11107 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 11108 ParameterMismatch = true; 11109 break; 11110 } 11111 11112 if (FirstInit && SecondInit && 11113 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11114 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11115 ParameterDifferentDefaultArgument) 11116 << (I + 1) << FirstInit->getSourceRange(); 11117 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11118 ParameterDifferentDefaultArgument) 11119 << (I + 1) << SecondInit->getSourceRange(); 11120 ParameterMismatch = true; 11121 break; 11122 } 11123 11124 assert(ComputeSubDeclODRHash(FirstParam) == 11125 ComputeSubDeclODRHash(SecondParam) && 11126 "Undiagnosed parameter difference."); 11127 } 11128 11129 if (ParameterMismatch) { 11130 Diagnosed = true; 11131 break; 11132 } 11133 11134 // If no error has been generated before now, assume the problem is in 11135 // the body and generate a message. 11136 ODRDiagError(FirstFunction->getLocation(), 11137 FirstFunction->getSourceRange(), FunctionBody); 11138 ODRDiagNote(SecondFunction->getLocation(), 11139 SecondFunction->getSourceRange(), FunctionBody); 11140 Diagnosed = true; 11141 break; 11142 } 11143 (void)Diagnosed; 11144 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11145 } 11146 11147 // Issue ODR failures diagnostics for enums. 11148 for (auto &Merge : EnumOdrMergeFailures) { 11149 enum ODREnumDifference { 11150 SingleScopedEnum, 11151 EnumTagKeywordMismatch, 11152 SingleSpecifiedType, 11153 DifferentSpecifiedTypes, 11154 DifferentNumberEnumConstants, 11155 EnumConstantName, 11156 EnumConstantSingleInitilizer, 11157 EnumConstantDifferentInitilizer, 11158 }; 11159 11160 // If we've already pointed out a specific problem with this enum, don't 11161 // bother issuing a general "something's different" diagnostic. 11162 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 11163 continue; 11164 11165 EnumDecl *FirstEnum = Merge.first; 11166 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstEnum); 11167 11168 using DeclHashes = 11169 llvm::SmallVector<std::pair<EnumConstantDecl *, unsigned>, 4>; 11170 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstEnum]( 11171 DeclHashes &Hashes, EnumDecl *Enum) { 11172 for (auto *D : Enum->decls()) { 11173 // Due to decl merging, the first EnumDecl is the parent of 11174 // Decls in both records. 11175 if (!ODRHash::isWhitelistedDecl(D, FirstEnum)) 11176 continue; 11177 assert(isa<EnumConstantDecl>(D) && "Unexpected Decl kind"); 11178 Hashes.emplace_back(cast<EnumConstantDecl>(D), 11179 ComputeSubDeclODRHash(D)); 11180 } 11181 }; 11182 DeclHashes FirstHashes; 11183 PopulateHashes(FirstHashes, FirstEnum); 11184 bool Diagnosed = false; 11185 for (auto &SecondEnum : Merge.second) { 11186 11187 if (FirstEnum == SecondEnum) 11188 continue; 11189 11190 std::string SecondModule = 11191 getOwningModuleNameForDiagnostic(SecondEnum); 11192 11193 auto ODRDiagError = [FirstEnum, &FirstModule, 11194 this](SourceLocation Loc, SourceRange Range, 11195 ODREnumDifference DiffType) { 11196 return Diag(Loc, diag::err_module_odr_violation_enum) 11197 << FirstEnum << FirstModule.empty() << FirstModule << Range 11198 << DiffType; 11199 }; 11200 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11201 SourceRange Range, 11202 ODREnumDifference DiffType) { 11203 return Diag(Loc, diag::note_module_odr_violation_enum) 11204 << SecondModule << Range << DiffType; 11205 }; 11206 11207 if (FirstEnum->isScoped() != SecondEnum->isScoped()) { 11208 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11209 SingleScopedEnum) 11210 << FirstEnum->isScoped(); 11211 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11212 SingleScopedEnum) 11213 << SecondEnum->isScoped(); 11214 Diagnosed = true; 11215 continue; 11216 } 11217 11218 if (FirstEnum->isScoped() && SecondEnum->isScoped()) { 11219 if (FirstEnum->isScopedUsingClassTag() != 11220 SecondEnum->isScopedUsingClassTag()) { 11221 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11222 EnumTagKeywordMismatch) 11223 << FirstEnum->isScopedUsingClassTag(); 11224 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11225 EnumTagKeywordMismatch) 11226 << SecondEnum->isScopedUsingClassTag(); 11227 Diagnosed = true; 11228 continue; 11229 } 11230 } 11231 11232 QualType FirstUnderlyingType = 11233 FirstEnum->getIntegerTypeSourceInfo() 11234 ? FirstEnum->getIntegerTypeSourceInfo()->getType() 11235 : QualType(); 11236 QualType SecondUnderlyingType = 11237 SecondEnum->getIntegerTypeSourceInfo() 11238 ? SecondEnum->getIntegerTypeSourceInfo()->getType() 11239 : QualType(); 11240 if (FirstUnderlyingType.isNull() != SecondUnderlyingType.isNull()) { 11241 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11242 SingleSpecifiedType) 11243 << !FirstUnderlyingType.isNull(); 11244 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11245 SingleSpecifiedType) 11246 << !SecondUnderlyingType.isNull(); 11247 Diagnosed = true; 11248 continue; 11249 } 11250 11251 if (!FirstUnderlyingType.isNull() && !SecondUnderlyingType.isNull()) { 11252 if (ComputeQualTypeODRHash(FirstUnderlyingType) != 11253 ComputeQualTypeODRHash(SecondUnderlyingType)) { 11254 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11255 DifferentSpecifiedTypes) 11256 << FirstUnderlyingType; 11257 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11258 DifferentSpecifiedTypes) 11259 << SecondUnderlyingType; 11260 Diagnosed = true; 11261 continue; 11262 } 11263 } 11264 11265 DeclHashes SecondHashes; 11266 PopulateHashes(SecondHashes, SecondEnum); 11267 11268 if (FirstHashes.size() != SecondHashes.size()) { 11269 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11270 DifferentNumberEnumConstants) 11271 << (int)FirstHashes.size(); 11272 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11273 DifferentNumberEnumConstants) 11274 << (int)SecondHashes.size(); 11275 Diagnosed = true; 11276 continue; 11277 } 11278 11279 for (unsigned I = 0; I < FirstHashes.size(); ++I) { 11280 if (FirstHashes[I].second == SecondHashes[I].second) 11281 continue; 11282 const EnumConstantDecl *FirstEnumConstant = FirstHashes[I].first; 11283 const EnumConstantDecl *SecondEnumConstant = SecondHashes[I].first; 11284 11285 if (FirstEnumConstant->getDeclName() != 11286 SecondEnumConstant->getDeclName()) { 11287 11288 ODRDiagError(FirstEnumConstant->getLocation(), 11289 FirstEnumConstant->getSourceRange(), EnumConstantName) 11290 << I + 1 << FirstEnumConstant; 11291 ODRDiagNote(SecondEnumConstant->getLocation(), 11292 SecondEnumConstant->getSourceRange(), EnumConstantName) 11293 << I + 1 << SecondEnumConstant; 11294 Diagnosed = true; 11295 break; 11296 } 11297 11298 const Expr *FirstInit = FirstEnumConstant->getInitExpr(); 11299 const Expr *SecondInit = SecondEnumConstant->getInitExpr(); 11300 if (!FirstInit && !SecondInit) 11301 continue; 11302 11303 if (!FirstInit || !SecondInit) { 11304 ODRDiagError(FirstEnumConstant->getLocation(), 11305 FirstEnumConstant->getSourceRange(), 11306 EnumConstantSingleInitilizer) 11307 << I + 1 << FirstEnumConstant << (FirstInit != nullptr); 11308 ODRDiagNote(SecondEnumConstant->getLocation(), 11309 SecondEnumConstant->getSourceRange(), 11310 EnumConstantSingleInitilizer) 11311 << I + 1 << SecondEnumConstant << (SecondInit != nullptr); 11312 Diagnosed = true; 11313 break; 11314 } 11315 11316 if (ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11317 ODRDiagError(FirstEnumConstant->getLocation(), 11318 FirstEnumConstant->getSourceRange(), 11319 EnumConstantDifferentInitilizer) 11320 << I + 1 << FirstEnumConstant; 11321 ODRDiagNote(SecondEnumConstant->getLocation(), 11322 SecondEnumConstant->getSourceRange(), 11323 EnumConstantDifferentInitilizer) 11324 << I + 1 << SecondEnumConstant; 11325 Diagnosed = true; 11326 break; 11327 } 11328 } 11329 } 11330 11331 (void)Diagnosed; 11332 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11333 } 11334 } 11335 11336 void ASTReader::StartedDeserializing() { 11337 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get()) 11338 ReadTimer->startTimer(); 11339 } 11340 11341 void ASTReader::FinishedDeserializing() { 11342 assert(NumCurrentElementsDeserializing && 11343 "FinishedDeserializing not paired with StartedDeserializing"); 11344 if (NumCurrentElementsDeserializing == 1) { 11345 // We decrease NumCurrentElementsDeserializing only after pending actions 11346 // are finished, to avoid recursively re-calling finishPendingActions(). 11347 finishPendingActions(); 11348 } 11349 --NumCurrentElementsDeserializing; 11350 11351 if (NumCurrentElementsDeserializing == 0) { 11352 // Propagate exception specification and deduced type updates along 11353 // redeclaration chains. 11354 // 11355 // We do this now rather than in finishPendingActions because we want to 11356 // be able to walk the complete redeclaration chains of the updated decls. 11357 while (!PendingExceptionSpecUpdates.empty() || 11358 !PendingDeducedTypeUpdates.empty()) { 11359 auto ESUpdates = std::move(PendingExceptionSpecUpdates); 11360 PendingExceptionSpecUpdates.clear(); 11361 for (auto Update : ESUpdates) { 11362 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11363 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>(); 11364 auto ESI = FPT->getExtProtoInfo().ExceptionSpec; 11365 if (auto *Listener = getContext().getASTMutationListener()) 11366 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second)); 11367 for (auto *Redecl : Update.second->redecls()) 11368 getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI); 11369 } 11370 11371 auto DTUpdates = std::move(PendingDeducedTypeUpdates); 11372 PendingDeducedTypeUpdates.clear(); 11373 for (auto Update : DTUpdates) { 11374 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11375 // FIXME: If the return type is already deduced, check that it matches. 11376 getContext().adjustDeducedFunctionResultType(Update.first, 11377 Update.second); 11378 } 11379 } 11380 11381 if (ReadTimer) 11382 ReadTimer->stopTimer(); 11383 11384 diagnoseOdrViolations(); 11385 11386 // We are not in recursive loading, so it's safe to pass the "interesting" 11387 // decls to the consumer. 11388 if (Consumer) 11389 PassInterestingDeclsToConsumer(); 11390 } 11391 } 11392 11393 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 11394 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { 11395 // Remove any fake results before adding any real ones. 11396 auto It = PendingFakeLookupResults.find(II); 11397 if (It != PendingFakeLookupResults.end()) { 11398 for (auto *ND : It->second) 11399 SemaObj->IdResolver.RemoveDecl(ND); 11400 // FIXME: this works around module+PCH performance issue. 11401 // Rather than erase the result from the map, which is O(n), just clear 11402 // the vector of NamedDecls. 11403 It->second.clear(); 11404 } 11405 } 11406 11407 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 11408 SemaObj->TUScope->AddDecl(D); 11409 } else if (SemaObj->TUScope) { 11410 // Adding the decl to IdResolver may have failed because it was already in 11411 // (even though it was not added in scope). If it is already in, make sure 11412 // it gets in the scope as well. 11413 if (std::find(SemaObj->IdResolver.begin(Name), 11414 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 11415 SemaObj->TUScope->AddDecl(D); 11416 } 11417 } 11418 11419 ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache, 11420 ASTContext *Context, 11421 const PCHContainerReader &PCHContainerRdr, 11422 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions, 11423 StringRef isysroot, bool DisableValidation, 11424 bool AllowASTWithCompilerErrors, 11425 bool AllowConfigurationMismatch, bool ValidateSystemInputs, 11426 bool ValidateASTInputFilesContent, bool UseGlobalIndex, 11427 std::unique_ptr<llvm::Timer> ReadTimer) 11428 : Listener(DisableValidation 11429 ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP)) 11430 : cast<ASTReaderListener>(new PCHValidator(PP, *this))), 11431 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), 11432 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP), 11433 ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache, 11434 PCHContainerRdr, PP.getHeaderSearchInfo()), 11435 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot), 11436 DisableValidation(DisableValidation), 11437 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 11438 AllowConfigurationMismatch(AllowConfigurationMismatch), 11439 ValidateSystemInputs(ValidateSystemInputs), 11440 ValidateASTInputFilesContent(ValidateASTInputFilesContent), 11441 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) { 11442 SourceMgr.setExternalSLocEntrySource(this); 11443 11444 for (const auto &Ext : Extensions) { 11445 auto BlockName = Ext->getExtensionMetadata().BlockName; 11446 auto Known = ModuleFileExtensions.find(BlockName); 11447 if (Known != ModuleFileExtensions.end()) { 11448 Diags.Report(diag::warn_duplicate_module_file_extension) 11449 << BlockName; 11450 continue; 11451 } 11452 11453 ModuleFileExtensions.insert({BlockName, Ext}); 11454 } 11455 } 11456 11457 ASTReader::~ASTReader() { 11458 if (OwnsDeserializationListener) 11459 delete DeserializationListener; 11460 } 11461 11462 IdentifierResolver &ASTReader::getIdResolver() { 11463 return SemaObj ? SemaObj->IdResolver : DummyIdResolver; 11464 } 11465 11466 Expected<unsigned> ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor, 11467 unsigned AbbrevID) { 11468 Idx = 0; 11469 Record.clear(); 11470 return Cursor.readRecord(AbbrevID, Record); 11471 } 11472 //===----------------------------------------------------------------------===// 11473 //// OMPClauseReader implementation 11474 ////===----------------------------------------------------------------------===// 11475 11476 // This has to be in namespace clang because it's friended by all 11477 // of the OMP clauses. 11478 namespace clang { 11479 11480 class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> { 11481 ASTRecordReader &Record; 11482 ASTContext &Context; 11483 11484 public: 11485 OMPClauseReader(ASTRecordReader &Record) 11486 : Record(Record), Context(Record.getContext()) {} 11487 11488 #define OPENMP_CLAUSE(Name, Class) void Visit##Class(Class *C); 11489 #include "clang/Basic/OpenMPKinds.def" 11490 OMPClause *readClause(); 11491 void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C); 11492 void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C); 11493 }; 11494 11495 } // end namespace clang 11496 11497 OMPClause *ASTRecordReader::readOMPClause() { 11498 return OMPClauseReader(*this).readClause(); 11499 } 11500 11501 OMPClause *OMPClauseReader::readClause() { 11502 OMPClause *C = nullptr; 11503 switch (Record.readInt()) { 11504 case OMPC_if: 11505 C = new (Context) OMPIfClause(); 11506 break; 11507 case OMPC_final: 11508 C = new (Context) OMPFinalClause(); 11509 break; 11510 case OMPC_num_threads: 11511 C = new (Context) OMPNumThreadsClause(); 11512 break; 11513 case OMPC_safelen: 11514 C = new (Context) OMPSafelenClause(); 11515 break; 11516 case OMPC_simdlen: 11517 C = new (Context) OMPSimdlenClause(); 11518 break; 11519 case OMPC_allocator: 11520 C = new (Context) OMPAllocatorClause(); 11521 break; 11522 case OMPC_collapse: 11523 C = new (Context) OMPCollapseClause(); 11524 break; 11525 case OMPC_default: 11526 C = new (Context) OMPDefaultClause(); 11527 break; 11528 case OMPC_proc_bind: 11529 C = new (Context) OMPProcBindClause(); 11530 break; 11531 case OMPC_schedule: 11532 C = new (Context) OMPScheduleClause(); 11533 break; 11534 case OMPC_ordered: 11535 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt()); 11536 break; 11537 case OMPC_nowait: 11538 C = new (Context) OMPNowaitClause(); 11539 break; 11540 case OMPC_untied: 11541 C = new (Context) OMPUntiedClause(); 11542 break; 11543 case OMPC_mergeable: 11544 C = new (Context) OMPMergeableClause(); 11545 break; 11546 case OMPC_read: 11547 C = new (Context) OMPReadClause(); 11548 break; 11549 case OMPC_write: 11550 C = new (Context) OMPWriteClause(); 11551 break; 11552 case OMPC_update: 11553 C = new (Context) OMPUpdateClause(); 11554 break; 11555 case OMPC_capture: 11556 C = new (Context) OMPCaptureClause(); 11557 break; 11558 case OMPC_seq_cst: 11559 C = new (Context) OMPSeqCstClause(); 11560 break; 11561 case OMPC_threads: 11562 C = new (Context) OMPThreadsClause(); 11563 break; 11564 case OMPC_simd: 11565 C = new (Context) OMPSIMDClause(); 11566 break; 11567 case OMPC_nogroup: 11568 C = new (Context) OMPNogroupClause(); 11569 break; 11570 case OMPC_unified_address: 11571 C = new (Context) OMPUnifiedAddressClause(); 11572 break; 11573 case OMPC_unified_shared_memory: 11574 C = new (Context) OMPUnifiedSharedMemoryClause(); 11575 break; 11576 case OMPC_reverse_offload: 11577 C = new (Context) OMPReverseOffloadClause(); 11578 break; 11579 case OMPC_dynamic_allocators: 11580 C = new (Context) OMPDynamicAllocatorsClause(); 11581 break; 11582 case OMPC_atomic_default_mem_order: 11583 C = new (Context) OMPAtomicDefaultMemOrderClause(); 11584 break; 11585 case OMPC_private: 11586 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt()); 11587 break; 11588 case OMPC_firstprivate: 11589 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt()); 11590 break; 11591 case OMPC_lastprivate: 11592 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt()); 11593 break; 11594 case OMPC_shared: 11595 C = OMPSharedClause::CreateEmpty(Context, Record.readInt()); 11596 break; 11597 case OMPC_reduction: 11598 C = OMPReductionClause::CreateEmpty(Context, Record.readInt()); 11599 break; 11600 case OMPC_task_reduction: 11601 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt()); 11602 break; 11603 case OMPC_in_reduction: 11604 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt()); 11605 break; 11606 case OMPC_linear: 11607 C = OMPLinearClause::CreateEmpty(Context, Record.readInt()); 11608 break; 11609 case OMPC_aligned: 11610 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt()); 11611 break; 11612 case OMPC_copyin: 11613 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt()); 11614 break; 11615 case OMPC_copyprivate: 11616 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt()); 11617 break; 11618 case OMPC_flush: 11619 C = OMPFlushClause::CreateEmpty(Context, Record.readInt()); 11620 break; 11621 case OMPC_depend: { 11622 unsigned NumVars = Record.readInt(); 11623 unsigned NumLoops = Record.readInt(); 11624 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops); 11625 break; 11626 } 11627 case OMPC_device: 11628 C = new (Context) OMPDeviceClause(); 11629 break; 11630 case OMPC_map: { 11631 OMPMappableExprListSizeTy Sizes; 11632 Sizes.NumVars = Record.readInt(); 11633 Sizes.NumUniqueDeclarations = Record.readInt(); 11634 Sizes.NumComponentLists = Record.readInt(); 11635 Sizes.NumComponents = Record.readInt(); 11636 C = OMPMapClause::CreateEmpty(Context, Sizes); 11637 break; 11638 } 11639 case OMPC_num_teams: 11640 C = new (Context) OMPNumTeamsClause(); 11641 break; 11642 case OMPC_thread_limit: 11643 C = new (Context) OMPThreadLimitClause(); 11644 break; 11645 case OMPC_priority: 11646 C = new (Context) OMPPriorityClause(); 11647 break; 11648 case OMPC_grainsize: 11649 C = new (Context) OMPGrainsizeClause(); 11650 break; 11651 case OMPC_num_tasks: 11652 C = new (Context) OMPNumTasksClause(); 11653 break; 11654 case OMPC_hint: 11655 C = new (Context) OMPHintClause(); 11656 break; 11657 case OMPC_dist_schedule: 11658 C = new (Context) OMPDistScheduleClause(); 11659 break; 11660 case OMPC_defaultmap: 11661 C = new (Context) OMPDefaultmapClause(); 11662 break; 11663 case OMPC_to: { 11664 OMPMappableExprListSizeTy Sizes; 11665 Sizes.NumVars = Record.readInt(); 11666 Sizes.NumUniqueDeclarations = Record.readInt(); 11667 Sizes.NumComponentLists = Record.readInt(); 11668 Sizes.NumComponents = Record.readInt(); 11669 C = OMPToClause::CreateEmpty(Context, Sizes); 11670 break; 11671 } 11672 case OMPC_from: { 11673 OMPMappableExprListSizeTy Sizes; 11674 Sizes.NumVars = Record.readInt(); 11675 Sizes.NumUniqueDeclarations = Record.readInt(); 11676 Sizes.NumComponentLists = Record.readInt(); 11677 Sizes.NumComponents = Record.readInt(); 11678 C = OMPFromClause::CreateEmpty(Context, Sizes); 11679 break; 11680 } 11681 case OMPC_use_device_ptr: { 11682 OMPMappableExprListSizeTy Sizes; 11683 Sizes.NumVars = Record.readInt(); 11684 Sizes.NumUniqueDeclarations = Record.readInt(); 11685 Sizes.NumComponentLists = Record.readInt(); 11686 Sizes.NumComponents = Record.readInt(); 11687 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes); 11688 break; 11689 } 11690 case OMPC_is_device_ptr: { 11691 OMPMappableExprListSizeTy Sizes; 11692 Sizes.NumVars = Record.readInt(); 11693 Sizes.NumUniqueDeclarations = Record.readInt(); 11694 Sizes.NumComponentLists = Record.readInt(); 11695 Sizes.NumComponents = Record.readInt(); 11696 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes); 11697 break; 11698 } 11699 case OMPC_allocate: 11700 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt()); 11701 break; 11702 case OMPC_nontemporal: 11703 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt()); 11704 break; 11705 } 11706 assert(C && "Unknown OMPClause type"); 11707 11708 Visit(C); 11709 C->setLocStart(Record.readSourceLocation()); 11710 C->setLocEnd(Record.readSourceLocation()); 11711 11712 return C; 11713 } 11714 11715 void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) { 11716 C->setPreInitStmt(Record.readSubStmt(), 11717 static_cast<OpenMPDirectiveKind>(Record.readInt())); 11718 } 11719 11720 void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) { 11721 VisitOMPClauseWithPreInit(C); 11722 C->setPostUpdateExpr(Record.readSubExpr()); 11723 } 11724 11725 void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) { 11726 VisitOMPClauseWithPreInit(C); 11727 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt())); 11728 C->setNameModifierLoc(Record.readSourceLocation()); 11729 C->setColonLoc(Record.readSourceLocation()); 11730 C->setCondition(Record.readSubExpr()); 11731 C->setLParenLoc(Record.readSourceLocation()); 11732 } 11733 11734 void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) { 11735 VisitOMPClauseWithPreInit(C); 11736 C->setCondition(Record.readSubExpr()); 11737 C->setLParenLoc(Record.readSourceLocation()); 11738 } 11739 11740 void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) { 11741 VisitOMPClauseWithPreInit(C); 11742 C->setNumThreads(Record.readSubExpr()); 11743 C->setLParenLoc(Record.readSourceLocation()); 11744 } 11745 11746 void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) { 11747 C->setSafelen(Record.readSubExpr()); 11748 C->setLParenLoc(Record.readSourceLocation()); 11749 } 11750 11751 void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) { 11752 C->setSimdlen(Record.readSubExpr()); 11753 C->setLParenLoc(Record.readSourceLocation()); 11754 } 11755 11756 void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) { 11757 C->setAllocator(Record.readExpr()); 11758 C->setLParenLoc(Record.readSourceLocation()); 11759 } 11760 11761 void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) { 11762 C->setNumForLoops(Record.readSubExpr()); 11763 C->setLParenLoc(Record.readSourceLocation()); 11764 } 11765 11766 void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) { 11767 C->setDefaultKind( 11768 static_cast<OpenMPDefaultClauseKind>(Record.readInt())); 11769 C->setLParenLoc(Record.readSourceLocation()); 11770 C->setDefaultKindKwLoc(Record.readSourceLocation()); 11771 } 11772 11773 void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) { 11774 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt())); 11775 C->setLParenLoc(Record.readSourceLocation()); 11776 C->setProcBindKindKwLoc(Record.readSourceLocation()); 11777 } 11778 11779 void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) { 11780 VisitOMPClauseWithPreInit(C); 11781 C->setScheduleKind( 11782 static_cast<OpenMPScheduleClauseKind>(Record.readInt())); 11783 C->setFirstScheduleModifier( 11784 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 11785 C->setSecondScheduleModifier( 11786 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 11787 C->setChunkSize(Record.readSubExpr()); 11788 C->setLParenLoc(Record.readSourceLocation()); 11789 C->setFirstScheduleModifierLoc(Record.readSourceLocation()); 11790 C->setSecondScheduleModifierLoc(Record.readSourceLocation()); 11791 C->setScheduleKindLoc(Record.readSourceLocation()); 11792 C->setCommaLoc(Record.readSourceLocation()); 11793 } 11794 11795 void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) { 11796 C->setNumForLoops(Record.readSubExpr()); 11797 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 11798 C->setLoopNumIterations(I, Record.readSubExpr()); 11799 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 11800 C->setLoopCounter(I, Record.readSubExpr()); 11801 C->setLParenLoc(Record.readSourceLocation()); 11802 } 11803 11804 void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {} 11805 11806 void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {} 11807 11808 void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {} 11809 11810 void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {} 11811 11812 void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {} 11813 11814 void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *) {} 11815 11816 void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {} 11817 11818 void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {} 11819 11820 void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {} 11821 11822 void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {} 11823 11824 void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {} 11825 11826 void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {} 11827 11828 void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause( 11829 OMPUnifiedSharedMemoryClause *) {} 11830 11831 void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {} 11832 11833 void 11834 OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) { 11835 } 11836 11837 void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause( 11838 OMPAtomicDefaultMemOrderClause *C) { 11839 C->setAtomicDefaultMemOrderKind( 11840 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt())); 11841 C->setLParenLoc(Record.readSourceLocation()); 11842 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation()); 11843 } 11844 11845 void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) { 11846 C->setLParenLoc(Record.readSourceLocation()); 11847 unsigned NumVars = C->varlist_size(); 11848 SmallVector<Expr *, 16> Vars; 11849 Vars.reserve(NumVars); 11850 for (unsigned i = 0; i != NumVars; ++i) 11851 Vars.push_back(Record.readSubExpr()); 11852 C->setVarRefs(Vars); 11853 Vars.clear(); 11854 for (unsigned i = 0; i != NumVars; ++i) 11855 Vars.push_back(Record.readSubExpr()); 11856 C->setPrivateCopies(Vars); 11857 } 11858 11859 void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) { 11860 VisitOMPClauseWithPreInit(C); 11861 C->setLParenLoc(Record.readSourceLocation()); 11862 unsigned NumVars = C->varlist_size(); 11863 SmallVector<Expr *, 16> Vars; 11864 Vars.reserve(NumVars); 11865 for (unsigned i = 0; i != NumVars; ++i) 11866 Vars.push_back(Record.readSubExpr()); 11867 C->setVarRefs(Vars); 11868 Vars.clear(); 11869 for (unsigned i = 0; i != NumVars; ++i) 11870 Vars.push_back(Record.readSubExpr()); 11871 C->setPrivateCopies(Vars); 11872 Vars.clear(); 11873 for (unsigned i = 0; i != NumVars; ++i) 11874 Vars.push_back(Record.readSubExpr()); 11875 C->setInits(Vars); 11876 } 11877 11878 void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) { 11879 VisitOMPClauseWithPostUpdate(C); 11880 C->setLParenLoc(Record.readSourceLocation()); 11881 C->setKind(Record.readEnum<OpenMPLastprivateModifier>()); 11882 C->setKindLoc(Record.readSourceLocation()); 11883 C->setColonLoc(Record.readSourceLocation()); 11884 unsigned NumVars = C->varlist_size(); 11885 SmallVector<Expr *, 16> Vars; 11886 Vars.reserve(NumVars); 11887 for (unsigned i = 0; i != NumVars; ++i) 11888 Vars.push_back(Record.readSubExpr()); 11889 C->setVarRefs(Vars); 11890 Vars.clear(); 11891 for (unsigned i = 0; i != NumVars; ++i) 11892 Vars.push_back(Record.readSubExpr()); 11893 C->setPrivateCopies(Vars); 11894 Vars.clear(); 11895 for (unsigned i = 0; i != NumVars; ++i) 11896 Vars.push_back(Record.readSubExpr()); 11897 C->setSourceExprs(Vars); 11898 Vars.clear(); 11899 for (unsigned i = 0; i != NumVars; ++i) 11900 Vars.push_back(Record.readSubExpr()); 11901 C->setDestinationExprs(Vars); 11902 Vars.clear(); 11903 for (unsigned i = 0; i != NumVars; ++i) 11904 Vars.push_back(Record.readSubExpr()); 11905 C->setAssignmentOps(Vars); 11906 } 11907 11908 void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) { 11909 C->setLParenLoc(Record.readSourceLocation()); 11910 unsigned NumVars = C->varlist_size(); 11911 SmallVector<Expr *, 16> Vars; 11912 Vars.reserve(NumVars); 11913 for (unsigned i = 0; i != NumVars; ++i) 11914 Vars.push_back(Record.readSubExpr()); 11915 C->setVarRefs(Vars); 11916 } 11917 11918 void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) { 11919 VisitOMPClauseWithPostUpdate(C); 11920 C->setLParenLoc(Record.readSourceLocation()); 11921 C->setColonLoc(Record.readSourceLocation()); 11922 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 11923 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 11924 C->setQualifierLoc(NNSL); 11925 C->setNameInfo(DNI); 11926 11927 unsigned NumVars = C->varlist_size(); 11928 SmallVector<Expr *, 16> Vars; 11929 Vars.reserve(NumVars); 11930 for (unsigned i = 0; i != NumVars; ++i) 11931 Vars.push_back(Record.readSubExpr()); 11932 C->setVarRefs(Vars); 11933 Vars.clear(); 11934 for (unsigned i = 0; i != NumVars; ++i) 11935 Vars.push_back(Record.readSubExpr()); 11936 C->setPrivates(Vars); 11937 Vars.clear(); 11938 for (unsigned i = 0; i != NumVars; ++i) 11939 Vars.push_back(Record.readSubExpr()); 11940 C->setLHSExprs(Vars); 11941 Vars.clear(); 11942 for (unsigned i = 0; i != NumVars; ++i) 11943 Vars.push_back(Record.readSubExpr()); 11944 C->setRHSExprs(Vars); 11945 Vars.clear(); 11946 for (unsigned i = 0; i != NumVars; ++i) 11947 Vars.push_back(Record.readSubExpr()); 11948 C->setReductionOps(Vars); 11949 } 11950 11951 void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) { 11952 VisitOMPClauseWithPostUpdate(C); 11953 C->setLParenLoc(Record.readSourceLocation()); 11954 C->setColonLoc(Record.readSourceLocation()); 11955 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 11956 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 11957 C->setQualifierLoc(NNSL); 11958 C->setNameInfo(DNI); 11959 11960 unsigned NumVars = C->varlist_size(); 11961 SmallVector<Expr *, 16> Vars; 11962 Vars.reserve(NumVars); 11963 for (unsigned I = 0; I != NumVars; ++I) 11964 Vars.push_back(Record.readSubExpr()); 11965 C->setVarRefs(Vars); 11966 Vars.clear(); 11967 for (unsigned I = 0; I != NumVars; ++I) 11968 Vars.push_back(Record.readSubExpr()); 11969 C->setPrivates(Vars); 11970 Vars.clear(); 11971 for (unsigned I = 0; I != NumVars; ++I) 11972 Vars.push_back(Record.readSubExpr()); 11973 C->setLHSExprs(Vars); 11974 Vars.clear(); 11975 for (unsigned I = 0; I != NumVars; ++I) 11976 Vars.push_back(Record.readSubExpr()); 11977 C->setRHSExprs(Vars); 11978 Vars.clear(); 11979 for (unsigned I = 0; I != NumVars; ++I) 11980 Vars.push_back(Record.readSubExpr()); 11981 C->setReductionOps(Vars); 11982 } 11983 11984 void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) { 11985 VisitOMPClauseWithPostUpdate(C); 11986 C->setLParenLoc(Record.readSourceLocation()); 11987 C->setColonLoc(Record.readSourceLocation()); 11988 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 11989 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 11990 C->setQualifierLoc(NNSL); 11991 C->setNameInfo(DNI); 11992 11993 unsigned NumVars = C->varlist_size(); 11994 SmallVector<Expr *, 16> Vars; 11995 Vars.reserve(NumVars); 11996 for (unsigned I = 0; I != NumVars; ++I) 11997 Vars.push_back(Record.readSubExpr()); 11998 C->setVarRefs(Vars); 11999 Vars.clear(); 12000 for (unsigned I = 0; I != NumVars; ++I) 12001 Vars.push_back(Record.readSubExpr()); 12002 C->setPrivates(Vars); 12003 Vars.clear(); 12004 for (unsigned I = 0; I != NumVars; ++I) 12005 Vars.push_back(Record.readSubExpr()); 12006 C->setLHSExprs(Vars); 12007 Vars.clear(); 12008 for (unsigned I = 0; I != NumVars; ++I) 12009 Vars.push_back(Record.readSubExpr()); 12010 C->setRHSExprs(Vars); 12011 Vars.clear(); 12012 for (unsigned I = 0; I != NumVars; ++I) 12013 Vars.push_back(Record.readSubExpr()); 12014 C->setReductionOps(Vars); 12015 Vars.clear(); 12016 for (unsigned I = 0; I != NumVars; ++I) 12017 Vars.push_back(Record.readSubExpr()); 12018 C->setTaskgroupDescriptors(Vars); 12019 } 12020 12021 void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) { 12022 VisitOMPClauseWithPostUpdate(C); 12023 C->setLParenLoc(Record.readSourceLocation()); 12024 C->setColonLoc(Record.readSourceLocation()); 12025 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt())); 12026 C->setModifierLoc(Record.readSourceLocation()); 12027 unsigned NumVars = C->varlist_size(); 12028 SmallVector<Expr *, 16> Vars; 12029 Vars.reserve(NumVars); 12030 for (unsigned i = 0; i != NumVars; ++i) 12031 Vars.push_back(Record.readSubExpr()); 12032 C->setVarRefs(Vars); 12033 Vars.clear(); 12034 for (unsigned i = 0; i != NumVars; ++i) 12035 Vars.push_back(Record.readSubExpr()); 12036 C->setPrivates(Vars); 12037 Vars.clear(); 12038 for (unsigned i = 0; i != NumVars; ++i) 12039 Vars.push_back(Record.readSubExpr()); 12040 C->setInits(Vars); 12041 Vars.clear(); 12042 for (unsigned i = 0; i != NumVars; ++i) 12043 Vars.push_back(Record.readSubExpr()); 12044 C->setUpdates(Vars); 12045 Vars.clear(); 12046 for (unsigned i = 0; i != NumVars; ++i) 12047 Vars.push_back(Record.readSubExpr()); 12048 C->setFinals(Vars); 12049 C->setStep(Record.readSubExpr()); 12050 C->setCalcStep(Record.readSubExpr()); 12051 Vars.clear(); 12052 for (unsigned I = 0; I != NumVars + 1; ++I) 12053 Vars.push_back(Record.readSubExpr()); 12054 C->setUsedExprs(Vars); 12055 } 12056 12057 void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) { 12058 C->setLParenLoc(Record.readSourceLocation()); 12059 C->setColonLoc(Record.readSourceLocation()); 12060 unsigned NumVars = C->varlist_size(); 12061 SmallVector<Expr *, 16> Vars; 12062 Vars.reserve(NumVars); 12063 for (unsigned i = 0; i != NumVars; ++i) 12064 Vars.push_back(Record.readSubExpr()); 12065 C->setVarRefs(Vars); 12066 C->setAlignment(Record.readSubExpr()); 12067 } 12068 12069 void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) { 12070 C->setLParenLoc(Record.readSourceLocation()); 12071 unsigned NumVars = C->varlist_size(); 12072 SmallVector<Expr *, 16> Exprs; 12073 Exprs.reserve(NumVars); 12074 for (unsigned i = 0; i != NumVars; ++i) 12075 Exprs.push_back(Record.readSubExpr()); 12076 C->setVarRefs(Exprs); 12077 Exprs.clear(); 12078 for (unsigned i = 0; i != NumVars; ++i) 12079 Exprs.push_back(Record.readSubExpr()); 12080 C->setSourceExprs(Exprs); 12081 Exprs.clear(); 12082 for (unsigned i = 0; i != NumVars; ++i) 12083 Exprs.push_back(Record.readSubExpr()); 12084 C->setDestinationExprs(Exprs); 12085 Exprs.clear(); 12086 for (unsigned i = 0; i != NumVars; ++i) 12087 Exprs.push_back(Record.readSubExpr()); 12088 C->setAssignmentOps(Exprs); 12089 } 12090 12091 void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) { 12092 C->setLParenLoc(Record.readSourceLocation()); 12093 unsigned NumVars = C->varlist_size(); 12094 SmallVector<Expr *, 16> Exprs; 12095 Exprs.reserve(NumVars); 12096 for (unsigned i = 0; i != NumVars; ++i) 12097 Exprs.push_back(Record.readSubExpr()); 12098 C->setVarRefs(Exprs); 12099 Exprs.clear(); 12100 for (unsigned i = 0; i != NumVars; ++i) 12101 Exprs.push_back(Record.readSubExpr()); 12102 C->setSourceExprs(Exprs); 12103 Exprs.clear(); 12104 for (unsigned i = 0; i != NumVars; ++i) 12105 Exprs.push_back(Record.readSubExpr()); 12106 C->setDestinationExprs(Exprs); 12107 Exprs.clear(); 12108 for (unsigned i = 0; i != NumVars; ++i) 12109 Exprs.push_back(Record.readSubExpr()); 12110 C->setAssignmentOps(Exprs); 12111 } 12112 12113 void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) { 12114 C->setLParenLoc(Record.readSourceLocation()); 12115 unsigned NumVars = C->varlist_size(); 12116 SmallVector<Expr *, 16> Vars; 12117 Vars.reserve(NumVars); 12118 for (unsigned i = 0; i != NumVars; ++i) 12119 Vars.push_back(Record.readSubExpr()); 12120 C->setVarRefs(Vars); 12121 } 12122 12123 void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) { 12124 C->setLParenLoc(Record.readSourceLocation()); 12125 C->setDependencyKind( 12126 static_cast<OpenMPDependClauseKind>(Record.readInt())); 12127 C->setDependencyLoc(Record.readSourceLocation()); 12128 C->setColonLoc(Record.readSourceLocation()); 12129 unsigned NumVars = C->varlist_size(); 12130 SmallVector<Expr *, 16> Vars; 12131 Vars.reserve(NumVars); 12132 for (unsigned I = 0; I != NumVars; ++I) 12133 Vars.push_back(Record.readSubExpr()); 12134 C->setVarRefs(Vars); 12135 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I) 12136 C->setLoopData(I, Record.readSubExpr()); 12137 } 12138 12139 void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) { 12140 VisitOMPClauseWithPreInit(C); 12141 C->setDevice(Record.readSubExpr()); 12142 C->setLParenLoc(Record.readSourceLocation()); 12143 } 12144 12145 void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) { 12146 C->setLParenLoc(Record.readSourceLocation()); 12147 for (unsigned I = 0; I < OMPMapClause::NumberOfModifiers; ++I) { 12148 C->setMapTypeModifier( 12149 I, static_cast<OpenMPMapModifierKind>(Record.readInt())); 12150 C->setMapTypeModifierLoc(I, Record.readSourceLocation()); 12151 } 12152 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12153 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12154 C->setMapType( 12155 static_cast<OpenMPMapClauseKind>(Record.readInt())); 12156 C->setMapLoc(Record.readSourceLocation()); 12157 C->setColonLoc(Record.readSourceLocation()); 12158 auto NumVars = C->varlist_size(); 12159 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12160 auto TotalLists = C->getTotalComponentListNum(); 12161 auto TotalComponents = C->getTotalComponentsNum(); 12162 12163 SmallVector<Expr *, 16> Vars; 12164 Vars.reserve(NumVars); 12165 for (unsigned i = 0; i != NumVars; ++i) 12166 Vars.push_back(Record.readExpr()); 12167 C->setVarRefs(Vars); 12168 12169 SmallVector<Expr *, 16> UDMappers; 12170 UDMappers.reserve(NumVars); 12171 for (unsigned I = 0; I < NumVars; ++I) 12172 UDMappers.push_back(Record.readExpr()); 12173 C->setUDMapperRefs(UDMappers); 12174 12175 SmallVector<ValueDecl *, 16> Decls; 12176 Decls.reserve(UniqueDecls); 12177 for (unsigned i = 0; i < UniqueDecls; ++i) 12178 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12179 C->setUniqueDecls(Decls); 12180 12181 SmallVector<unsigned, 16> ListsPerDecl; 12182 ListsPerDecl.reserve(UniqueDecls); 12183 for (unsigned i = 0; i < UniqueDecls; ++i) 12184 ListsPerDecl.push_back(Record.readInt()); 12185 C->setDeclNumLists(ListsPerDecl); 12186 12187 SmallVector<unsigned, 32> ListSizes; 12188 ListSizes.reserve(TotalLists); 12189 for (unsigned i = 0; i < TotalLists; ++i) 12190 ListSizes.push_back(Record.readInt()); 12191 C->setComponentListSizes(ListSizes); 12192 12193 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12194 Components.reserve(TotalComponents); 12195 for (unsigned i = 0; i < TotalComponents; ++i) { 12196 Expr *AssociatedExpr = Record.readExpr(); 12197 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12198 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12199 AssociatedExpr, AssociatedDecl)); 12200 } 12201 C->setComponents(Components, ListSizes); 12202 } 12203 12204 void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) { 12205 C->setLParenLoc(Record.readSourceLocation()); 12206 C->setColonLoc(Record.readSourceLocation()); 12207 C->setAllocator(Record.readSubExpr()); 12208 unsigned NumVars = C->varlist_size(); 12209 SmallVector<Expr *, 16> Vars; 12210 Vars.reserve(NumVars); 12211 for (unsigned i = 0; i != NumVars; ++i) 12212 Vars.push_back(Record.readSubExpr()); 12213 C->setVarRefs(Vars); 12214 } 12215 12216 void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) { 12217 VisitOMPClauseWithPreInit(C); 12218 C->setNumTeams(Record.readSubExpr()); 12219 C->setLParenLoc(Record.readSourceLocation()); 12220 } 12221 12222 void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) { 12223 VisitOMPClauseWithPreInit(C); 12224 C->setThreadLimit(Record.readSubExpr()); 12225 C->setLParenLoc(Record.readSourceLocation()); 12226 } 12227 12228 void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) { 12229 VisitOMPClauseWithPreInit(C); 12230 C->setPriority(Record.readSubExpr()); 12231 C->setLParenLoc(Record.readSourceLocation()); 12232 } 12233 12234 void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) { 12235 VisitOMPClauseWithPreInit(C); 12236 C->setGrainsize(Record.readSubExpr()); 12237 C->setLParenLoc(Record.readSourceLocation()); 12238 } 12239 12240 void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) { 12241 VisitOMPClauseWithPreInit(C); 12242 C->setNumTasks(Record.readSubExpr()); 12243 C->setLParenLoc(Record.readSourceLocation()); 12244 } 12245 12246 void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) { 12247 C->setHint(Record.readSubExpr()); 12248 C->setLParenLoc(Record.readSourceLocation()); 12249 } 12250 12251 void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) { 12252 VisitOMPClauseWithPreInit(C); 12253 C->setDistScheduleKind( 12254 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt())); 12255 C->setChunkSize(Record.readSubExpr()); 12256 C->setLParenLoc(Record.readSourceLocation()); 12257 C->setDistScheduleKindLoc(Record.readSourceLocation()); 12258 C->setCommaLoc(Record.readSourceLocation()); 12259 } 12260 12261 void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) { 12262 C->setDefaultmapKind( 12263 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt())); 12264 C->setDefaultmapModifier( 12265 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt())); 12266 C->setLParenLoc(Record.readSourceLocation()); 12267 C->setDefaultmapModifierLoc(Record.readSourceLocation()); 12268 C->setDefaultmapKindLoc(Record.readSourceLocation()); 12269 } 12270 12271 void OMPClauseReader::VisitOMPToClause(OMPToClause *C) { 12272 C->setLParenLoc(Record.readSourceLocation()); 12273 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12274 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12275 auto NumVars = C->varlist_size(); 12276 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12277 auto TotalLists = C->getTotalComponentListNum(); 12278 auto TotalComponents = C->getTotalComponentsNum(); 12279 12280 SmallVector<Expr *, 16> Vars; 12281 Vars.reserve(NumVars); 12282 for (unsigned i = 0; i != NumVars; ++i) 12283 Vars.push_back(Record.readSubExpr()); 12284 C->setVarRefs(Vars); 12285 12286 SmallVector<Expr *, 16> UDMappers; 12287 UDMappers.reserve(NumVars); 12288 for (unsigned I = 0; I < NumVars; ++I) 12289 UDMappers.push_back(Record.readSubExpr()); 12290 C->setUDMapperRefs(UDMappers); 12291 12292 SmallVector<ValueDecl *, 16> Decls; 12293 Decls.reserve(UniqueDecls); 12294 for (unsigned i = 0; i < UniqueDecls; ++i) 12295 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12296 C->setUniqueDecls(Decls); 12297 12298 SmallVector<unsigned, 16> ListsPerDecl; 12299 ListsPerDecl.reserve(UniqueDecls); 12300 for (unsigned i = 0; i < UniqueDecls; ++i) 12301 ListsPerDecl.push_back(Record.readInt()); 12302 C->setDeclNumLists(ListsPerDecl); 12303 12304 SmallVector<unsigned, 32> ListSizes; 12305 ListSizes.reserve(TotalLists); 12306 for (unsigned i = 0; i < TotalLists; ++i) 12307 ListSizes.push_back(Record.readInt()); 12308 C->setComponentListSizes(ListSizes); 12309 12310 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12311 Components.reserve(TotalComponents); 12312 for (unsigned i = 0; i < TotalComponents; ++i) { 12313 Expr *AssociatedExpr = Record.readSubExpr(); 12314 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12315 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12316 AssociatedExpr, AssociatedDecl)); 12317 } 12318 C->setComponents(Components, ListSizes); 12319 } 12320 12321 void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) { 12322 C->setLParenLoc(Record.readSourceLocation()); 12323 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12324 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12325 auto NumVars = C->varlist_size(); 12326 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12327 auto TotalLists = C->getTotalComponentListNum(); 12328 auto TotalComponents = C->getTotalComponentsNum(); 12329 12330 SmallVector<Expr *, 16> Vars; 12331 Vars.reserve(NumVars); 12332 for (unsigned i = 0; i != NumVars; ++i) 12333 Vars.push_back(Record.readSubExpr()); 12334 C->setVarRefs(Vars); 12335 12336 SmallVector<Expr *, 16> UDMappers; 12337 UDMappers.reserve(NumVars); 12338 for (unsigned I = 0; I < NumVars; ++I) 12339 UDMappers.push_back(Record.readSubExpr()); 12340 C->setUDMapperRefs(UDMappers); 12341 12342 SmallVector<ValueDecl *, 16> Decls; 12343 Decls.reserve(UniqueDecls); 12344 for (unsigned i = 0; i < UniqueDecls; ++i) 12345 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12346 C->setUniqueDecls(Decls); 12347 12348 SmallVector<unsigned, 16> ListsPerDecl; 12349 ListsPerDecl.reserve(UniqueDecls); 12350 for (unsigned i = 0; i < UniqueDecls; ++i) 12351 ListsPerDecl.push_back(Record.readInt()); 12352 C->setDeclNumLists(ListsPerDecl); 12353 12354 SmallVector<unsigned, 32> ListSizes; 12355 ListSizes.reserve(TotalLists); 12356 for (unsigned i = 0; i < TotalLists; ++i) 12357 ListSizes.push_back(Record.readInt()); 12358 C->setComponentListSizes(ListSizes); 12359 12360 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12361 Components.reserve(TotalComponents); 12362 for (unsigned i = 0; i < TotalComponents; ++i) { 12363 Expr *AssociatedExpr = Record.readSubExpr(); 12364 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12365 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12366 AssociatedExpr, AssociatedDecl)); 12367 } 12368 C->setComponents(Components, ListSizes); 12369 } 12370 12371 void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) { 12372 C->setLParenLoc(Record.readSourceLocation()); 12373 auto NumVars = C->varlist_size(); 12374 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12375 auto TotalLists = C->getTotalComponentListNum(); 12376 auto TotalComponents = C->getTotalComponentsNum(); 12377 12378 SmallVector<Expr *, 16> Vars; 12379 Vars.reserve(NumVars); 12380 for (unsigned i = 0; i != NumVars; ++i) 12381 Vars.push_back(Record.readSubExpr()); 12382 C->setVarRefs(Vars); 12383 Vars.clear(); 12384 for (unsigned i = 0; i != NumVars; ++i) 12385 Vars.push_back(Record.readSubExpr()); 12386 C->setPrivateCopies(Vars); 12387 Vars.clear(); 12388 for (unsigned i = 0; i != NumVars; ++i) 12389 Vars.push_back(Record.readSubExpr()); 12390 C->setInits(Vars); 12391 12392 SmallVector<ValueDecl *, 16> Decls; 12393 Decls.reserve(UniqueDecls); 12394 for (unsigned i = 0; i < UniqueDecls; ++i) 12395 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12396 C->setUniqueDecls(Decls); 12397 12398 SmallVector<unsigned, 16> ListsPerDecl; 12399 ListsPerDecl.reserve(UniqueDecls); 12400 for (unsigned i = 0; i < UniqueDecls; ++i) 12401 ListsPerDecl.push_back(Record.readInt()); 12402 C->setDeclNumLists(ListsPerDecl); 12403 12404 SmallVector<unsigned, 32> ListSizes; 12405 ListSizes.reserve(TotalLists); 12406 for (unsigned i = 0; i < TotalLists; ++i) 12407 ListSizes.push_back(Record.readInt()); 12408 C->setComponentListSizes(ListSizes); 12409 12410 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12411 Components.reserve(TotalComponents); 12412 for (unsigned i = 0; i < TotalComponents; ++i) { 12413 Expr *AssociatedExpr = Record.readSubExpr(); 12414 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12415 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12416 AssociatedExpr, AssociatedDecl)); 12417 } 12418 C->setComponents(Components, ListSizes); 12419 } 12420 12421 void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 12422 C->setLParenLoc(Record.readSourceLocation()); 12423 auto NumVars = C->varlist_size(); 12424 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12425 auto TotalLists = C->getTotalComponentListNum(); 12426 auto TotalComponents = C->getTotalComponentsNum(); 12427 12428 SmallVector<Expr *, 16> Vars; 12429 Vars.reserve(NumVars); 12430 for (unsigned i = 0; i != NumVars; ++i) 12431 Vars.push_back(Record.readSubExpr()); 12432 C->setVarRefs(Vars); 12433 Vars.clear(); 12434 12435 SmallVector<ValueDecl *, 16> Decls; 12436 Decls.reserve(UniqueDecls); 12437 for (unsigned i = 0; i < UniqueDecls; ++i) 12438 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12439 C->setUniqueDecls(Decls); 12440 12441 SmallVector<unsigned, 16> ListsPerDecl; 12442 ListsPerDecl.reserve(UniqueDecls); 12443 for (unsigned i = 0; i < UniqueDecls; ++i) 12444 ListsPerDecl.push_back(Record.readInt()); 12445 C->setDeclNumLists(ListsPerDecl); 12446 12447 SmallVector<unsigned, 32> ListSizes; 12448 ListSizes.reserve(TotalLists); 12449 for (unsigned i = 0; i < TotalLists; ++i) 12450 ListSizes.push_back(Record.readInt()); 12451 C->setComponentListSizes(ListSizes); 12452 12453 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12454 Components.reserve(TotalComponents); 12455 for (unsigned i = 0; i < TotalComponents; ++i) { 12456 Expr *AssociatedExpr = Record.readSubExpr(); 12457 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12458 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 12459 AssociatedExpr, AssociatedDecl)); 12460 } 12461 C->setComponents(Components, ListSizes); 12462 } 12463 12464 void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) { 12465 C->setLParenLoc(Record.readSourceLocation()); 12466 unsigned NumVars = C->varlist_size(); 12467 SmallVector<Expr *, 16> Vars; 12468 Vars.reserve(NumVars); 12469 for (unsigned i = 0; i != NumVars; ++i) 12470 Vars.push_back(Record.readSubExpr()); 12471 C->setVarRefs(Vars); 12472 Vars.clear(); 12473 Vars.reserve(NumVars); 12474 for (unsigned i = 0; i != NumVars; ++i) 12475 Vars.push_back(Record.readSubExpr()); 12476 C->setPrivateRefs(Vars); 12477 } 12478