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