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