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 DYNAMIC_CLASSES: 3103 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3104 DynamicClasses.push_back(getGlobalDeclID(F, Record[I])); 3105 break; 3106 3107 case PENDING_IMPLICIT_INSTANTIATIONS: 3108 if (PendingInstantiations.size() % 2 != 0) { 3109 Error("Invalid existing PendingInstantiations"); 3110 return Failure; 3111 } 3112 3113 if (Record.size() % 2 != 0) { 3114 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block"); 3115 return Failure; 3116 } 3117 3118 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3119 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++])); 3120 PendingInstantiations.push_back( 3121 ReadSourceLocation(F, Record, I).getRawEncoding()); 3122 } 3123 break; 3124 3125 case SEMA_DECL_REFS: 3126 if (Record.size() != 2) { 3127 Error("Invalid SEMA_DECL_REFS block"); 3128 return Failure; 3129 } 3130 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3131 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3132 break; 3133 3134 case PPD_ENTITIES_OFFSETS: { 3135 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data(); 3136 assert(Blob.size() % sizeof(PPEntityOffset) == 0); 3137 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset); 3138 3139 unsigned LocalBasePreprocessedEntityID = Record[0]; 3140 3141 unsigned StartingID; 3142 if (!PP.getPreprocessingRecord()) 3143 PP.createPreprocessingRecord(); 3144 if (!PP.getPreprocessingRecord()->getExternalSource()) 3145 PP.getPreprocessingRecord()->SetExternalSource(*this); 3146 StartingID 3147 = PP.getPreprocessingRecord() 3148 ->allocateLoadedEntities(F.NumPreprocessedEntities); 3149 F.BasePreprocessedEntityID = StartingID; 3150 3151 if (F.NumPreprocessedEntities > 0) { 3152 // Introduce the global -> local mapping for preprocessed entities in 3153 // this module. 3154 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F)); 3155 3156 // Introduce the local -> global mapping for preprocessed entities in 3157 // this module. 3158 F.PreprocessedEntityRemap.insertOrReplace( 3159 std::make_pair(LocalBasePreprocessedEntityID, 3160 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID)); 3161 } 3162 3163 break; 3164 } 3165 3166 case DECL_UPDATE_OFFSETS: { 3167 if (Record.size() % 2 != 0) { 3168 Error("invalid DECL_UPDATE_OFFSETS block in AST file"); 3169 return Failure; 3170 } 3171 for (unsigned I = 0, N = Record.size(); I != N; I += 2) { 3172 GlobalDeclID ID = getGlobalDeclID(F, Record[I]); 3173 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1])); 3174 3175 // If we've already loaded the decl, perform the updates when we finish 3176 // loading this block. 3177 if (Decl *D = GetExistingDecl(ID)) 3178 PendingUpdateRecords.push_back(std::make_pair(ID, D)); 3179 } 3180 break; 3181 } 3182 3183 case DECL_REPLACEMENTS: { 3184 if (Record.size() % 3 != 0) { 3185 Error("invalid DECL_REPLACEMENTS block in AST file"); 3186 return Failure; 3187 } 3188 for (unsigned I = 0, N = Record.size(); I != N; I += 3) 3189 ReplacedDecls[getGlobalDeclID(F, Record[I])] 3190 = ReplacedDeclInfo(&F, Record[I+1], Record[I+2]); 3191 break; 3192 } 3193 3194 case OBJC_CATEGORIES_MAP: { 3195 if (F.LocalNumObjCCategoriesInMap != 0) { 3196 Error("duplicate OBJC_CATEGORIES_MAP record in AST file"); 3197 return Failure; 3198 } 3199 3200 F.LocalNumObjCCategoriesInMap = Record[0]; 3201 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data(); 3202 break; 3203 } 3204 3205 case OBJC_CATEGORIES: 3206 F.ObjCCategories.swap(Record); 3207 break; 3208 3209 case CXX_BASE_SPECIFIER_OFFSETS: { 3210 if (F.LocalNumCXXBaseSpecifiers != 0) { 3211 Error("duplicate CXX_BASE_SPECIFIER_OFFSETS record in AST file"); 3212 return Failure; 3213 } 3214 3215 F.LocalNumCXXBaseSpecifiers = Record[0]; 3216 F.CXXBaseSpecifiersOffsets = (const uint32_t *)Blob.data(); 3217 NumCXXBaseSpecifiersLoaded += F.LocalNumCXXBaseSpecifiers; 3218 break; 3219 } 3220 3221 case DIAG_PRAGMA_MAPPINGS: 3222 if (F.PragmaDiagMappings.empty()) 3223 F.PragmaDiagMappings.swap(Record); 3224 else 3225 F.PragmaDiagMappings.insert(F.PragmaDiagMappings.end(), 3226 Record.begin(), Record.end()); 3227 break; 3228 3229 case CUDA_SPECIAL_DECL_REFS: 3230 // Later tables overwrite earlier ones. 3231 // FIXME: Modules will have trouble with this. 3232 CUDASpecialDeclRefs.clear(); 3233 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3234 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3235 break; 3236 3237 case HEADER_SEARCH_TABLE: { 3238 F.HeaderFileInfoTableData = Blob.data(); 3239 F.LocalNumHeaderFileInfos = Record[1]; 3240 if (Record[0]) { 3241 F.HeaderFileInfoTable 3242 = HeaderFileInfoLookupTable::Create( 3243 (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 3244 (const unsigned char *)F.HeaderFileInfoTableData, 3245 HeaderFileInfoTrait(*this, F, 3246 &PP.getHeaderSearchInfo(), 3247 Blob.data() + Record[2])); 3248 3249 PP.getHeaderSearchInfo().SetExternalSource(this); 3250 if (!PP.getHeaderSearchInfo().getExternalLookup()) 3251 PP.getHeaderSearchInfo().SetExternalLookup(this); 3252 } 3253 break; 3254 } 3255 3256 case FP_PRAGMA_OPTIONS: 3257 // Later tables overwrite earlier ones. 3258 FPPragmaOptions.swap(Record); 3259 break; 3260 3261 case OPENCL_EXTENSIONS: 3262 // Later tables overwrite earlier ones. 3263 OpenCLExtensions.swap(Record); 3264 break; 3265 3266 case TENTATIVE_DEFINITIONS: 3267 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3268 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 3269 break; 3270 3271 case KNOWN_NAMESPACES: 3272 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3273 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 3274 break; 3275 3276 case UNDEFINED_BUT_USED: 3277 if (UndefinedButUsed.size() % 2 != 0) { 3278 Error("Invalid existing UndefinedButUsed"); 3279 return Failure; 3280 } 3281 3282 if (Record.size() % 2 != 0) { 3283 Error("invalid undefined-but-used record"); 3284 return Failure; 3285 } 3286 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3287 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 3288 UndefinedButUsed.push_back( 3289 ReadSourceLocation(F, Record, I).getRawEncoding()); 3290 } 3291 break; 3292 3293 case IMPORTED_MODULES: { 3294 if (F.Kind != MK_ImplicitModule && F.Kind != MK_ExplicitModule) { 3295 // If we aren't loading a module (which has its own exports), make 3296 // all of the imported modules visible. 3297 // FIXME: Deal with macros-only imports. 3298 for (unsigned I = 0, N = Record.size(); I != N; /**/) { 3299 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]); 3300 SourceLocation Loc = ReadSourceLocation(F, Record, I); 3301 if (GlobalID) 3302 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc)); 3303 } 3304 } 3305 break; 3306 } 3307 3308 case LOCAL_REDECLARATIONS: { 3309 F.RedeclarationChains.swap(Record); 3310 break; 3311 } 3312 3313 case LOCAL_REDECLARATIONS_MAP: { 3314 if (F.LocalNumRedeclarationsInMap != 0) { 3315 Error("duplicate LOCAL_REDECLARATIONS_MAP record in AST file"); 3316 return Failure; 3317 } 3318 3319 F.LocalNumRedeclarationsInMap = Record[0]; 3320 F.RedeclarationsMap = (const LocalRedeclarationsInfo *)Blob.data(); 3321 break; 3322 } 3323 3324 case MERGED_DECLARATIONS: { 3325 for (unsigned Idx = 0; Idx < Record.size(); /* increment in loop */) { 3326 GlobalDeclID CanonID = getGlobalDeclID(F, Record[Idx++]); 3327 SmallVectorImpl<GlobalDeclID> &Decls = StoredMergedDecls[CanonID]; 3328 for (unsigned N = Record[Idx++]; N > 0; --N) 3329 Decls.push_back(getGlobalDeclID(F, Record[Idx++])); 3330 } 3331 break; 3332 } 3333 3334 case MACRO_OFFSET: { 3335 if (F.LocalNumMacros != 0) { 3336 Error("duplicate MACRO_OFFSET record in AST file"); 3337 return Failure; 3338 } 3339 F.MacroOffsets = (const uint32_t *)Blob.data(); 3340 F.LocalNumMacros = Record[0]; 3341 unsigned LocalBaseMacroID = Record[1]; 3342 F.BaseMacroID = getTotalNumMacros(); 3343 3344 if (F.LocalNumMacros > 0) { 3345 // Introduce the global -> local mapping for macros within this module. 3346 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 3347 3348 // Introduce the local -> global mapping for macros within this module. 3349 F.MacroRemap.insertOrReplace( 3350 std::make_pair(LocalBaseMacroID, 3351 F.BaseMacroID - LocalBaseMacroID)); 3352 3353 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 3354 } 3355 break; 3356 } 3357 3358 case MACRO_TABLE: { 3359 // FIXME: Not used yet. 3360 break; 3361 } 3362 3363 case LATE_PARSED_TEMPLATE: { 3364 LateParsedTemplates.append(Record.begin(), Record.end()); 3365 break; 3366 } 3367 3368 case OPTIMIZE_PRAGMA_OPTIONS: 3369 if (Record.size() != 1) { 3370 Error("invalid pragma optimize record"); 3371 return Failure; 3372 } 3373 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]); 3374 break; 3375 3376 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES: 3377 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3378 UnusedLocalTypedefNameCandidates.push_back( 3379 getGlobalDeclID(F, Record[I])); 3380 break; 3381 } 3382 } 3383 } 3384 3385 ASTReader::ASTReadResult 3386 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F, 3387 const ModuleFile *ImportedBy, 3388 unsigned ClientLoadCapabilities) { 3389 unsigned Idx = 0; 3390 F.ModuleMapPath = ReadPath(F, Record, Idx); 3391 3392 if (F.Kind == MK_ExplicitModule) { 3393 // For an explicitly-loaded module, we don't care whether the original 3394 // module map file exists or matches. 3395 return Success; 3396 } 3397 3398 // Try to resolve ModuleName in the current header search context and 3399 // verify that it is found in the same module map file as we saved. If the 3400 // top-level AST file is a main file, skip this check because there is no 3401 // usable header search context. 3402 assert(!F.ModuleName.empty() && 3403 "MODULE_NAME should come before MODULE_MAP_FILE"); 3404 if (F.Kind == MK_ImplicitModule && 3405 (*ModuleMgr.begin())->Kind != MK_MainFile) { 3406 // An implicitly-loaded module file should have its module listed in some 3407 // module map file that we've already loaded. 3408 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName); 3409 auto &Map = PP.getHeaderSearchInfo().getModuleMap(); 3410 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr; 3411 if (!ModMap) { 3412 assert(ImportedBy && "top-level import should be verified"); 3413 if ((ClientLoadCapabilities & ARR_Missing) == 0) 3414 Diag(diag::err_imported_module_not_found) << F.ModuleName << F.FileName 3415 << ImportedBy->FileName 3416 << F.ModuleMapPath; 3417 return Missing; 3418 } 3419 3420 assert(M->Name == F.ModuleName && "found module with different name"); 3421 3422 // Check the primary module map file. 3423 const FileEntry *StoredModMap = FileMgr.getFile(F.ModuleMapPath); 3424 if (StoredModMap == nullptr || StoredModMap != ModMap) { 3425 assert(ModMap && "found module is missing module map file"); 3426 assert(ImportedBy && "top-level import should be verified"); 3427 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3428 Diag(diag::err_imported_module_modmap_changed) 3429 << F.ModuleName << ImportedBy->FileName 3430 << ModMap->getName() << F.ModuleMapPath; 3431 return OutOfDate; 3432 } 3433 3434 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps; 3435 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) { 3436 // FIXME: we should use input files rather than storing names. 3437 std::string Filename = ReadPath(F, Record, Idx); 3438 const FileEntry *F = 3439 FileMgr.getFile(Filename, false, false); 3440 if (F == nullptr) { 3441 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3442 Error("could not find file '" + Filename +"' referenced by AST file"); 3443 return OutOfDate; 3444 } 3445 AdditionalStoredMaps.insert(F); 3446 } 3447 3448 // Check any additional module map files (e.g. module.private.modulemap) 3449 // that are not in the pcm. 3450 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) { 3451 for (const FileEntry *ModMap : *AdditionalModuleMaps) { 3452 // Remove files that match 3453 // Note: SmallPtrSet::erase is really remove 3454 if (!AdditionalStoredMaps.erase(ModMap)) { 3455 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3456 Diag(diag::err_module_different_modmap) 3457 << F.ModuleName << /*new*/0 << ModMap->getName(); 3458 return OutOfDate; 3459 } 3460 } 3461 } 3462 3463 // Check any additional module map files that are in the pcm, but not 3464 // found in header search. Cases that match are already removed. 3465 for (const FileEntry *ModMap : AdditionalStoredMaps) { 3466 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3467 Diag(diag::err_module_different_modmap) 3468 << F.ModuleName << /*not new*/1 << ModMap->getName(); 3469 return OutOfDate; 3470 } 3471 } 3472 3473 if (Listener) 3474 Listener->ReadModuleMapFile(F.ModuleMapPath); 3475 return Success; 3476 } 3477 3478 3479 /// \brief Move the given method to the back of the global list of methods. 3480 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 3481 // Find the entry for this selector in the method pool. 3482 Sema::GlobalMethodPool::iterator Known 3483 = S.MethodPool.find(Method->getSelector()); 3484 if (Known == S.MethodPool.end()) 3485 return; 3486 3487 // Retrieve the appropriate method list. 3488 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 3489 : Known->second.second; 3490 bool Found = false; 3491 for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 3492 if (!Found) { 3493 if (List->getMethod() == Method) { 3494 Found = true; 3495 } else { 3496 // Keep searching. 3497 continue; 3498 } 3499 } 3500 3501 if (List->getNext()) 3502 List->setMethod(List->getNext()->getMethod()); 3503 else 3504 List->setMethod(Method); 3505 } 3506 } 3507 3508 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner, 3509 bool FromFinalization) { 3510 // FIXME: Only do this if Owner->NameVisibility == AllVisible. 3511 for (Decl *D : Names.HiddenDecls) { 3512 bool wasHidden = D->Hidden; 3513 D->Hidden = false; 3514 3515 if (wasHidden && SemaObj) { 3516 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 3517 moveMethodToBackOfGlobalList(*SemaObj, Method); 3518 } 3519 } 3520 } 3521 3522 assert((FromFinalization || Owner->NameVisibility >= Module::MacrosVisible) && 3523 "nothing to make visible?"); 3524 for (const auto &Macro : Names.HiddenMacros) { 3525 if (FromFinalization) 3526 PP.appendMacroDirective(Macro.first, 3527 Macro.second->import(PP, SourceLocation())); 3528 else 3529 installImportedMacro(Macro.first, Macro.second, Owner); 3530 } 3531 } 3532 3533 void ASTReader::makeModuleVisible(Module *Mod, 3534 Module::NameVisibilityKind NameVisibility, 3535 SourceLocation ImportLoc, 3536 bool Complain) { 3537 llvm::SmallPtrSet<Module *, 4> Visited; 3538 SmallVector<Module *, 4> Stack; 3539 Stack.push_back(Mod); 3540 while (!Stack.empty()) { 3541 Mod = Stack.pop_back_val(); 3542 3543 if (NameVisibility <= Mod->NameVisibility) { 3544 // This module already has this level of visibility (or greater), so 3545 // there is nothing more to do. 3546 continue; 3547 } 3548 3549 if (!Mod->isAvailable()) { 3550 // Modules that aren't available cannot be made visible. 3551 continue; 3552 } 3553 3554 // Update the module's name visibility. 3555 if (NameVisibility >= Module::MacrosVisible && 3556 Mod->NameVisibility < Module::MacrosVisible) 3557 Mod->MacroVisibilityLoc = ImportLoc; 3558 Mod->NameVisibility = NameVisibility; 3559 3560 // If we've already deserialized any names from this module, 3561 // mark them as visible. 3562 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 3563 if (Hidden != HiddenNamesMap.end()) { 3564 auto HiddenNames = std::move(*Hidden); 3565 HiddenNamesMap.erase(Hidden); 3566 makeNamesVisible(HiddenNames.second, HiddenNames.first, 3567 /*FromFinalization*/false); 3568 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && 3569 "making names visible added hidden names"); 3570 } 3571 3572 // Push any exported modules onto the stack to be marked as visible. 3573 SmallVector<Module *, 16> Exports; 3574 Mod->getExportedModules(Exports); 3575 for (SmallVectorImpl<Module *>::iterator 3576 I = Exports.begin(), E = Exports.end(); I != E; ++I) { 3577 Module *Exported = *I; 3578 if (Visited.insert(Exported).second) 3579 Stack.push_back(Exported); 3580 } 3581 3582 // Detect any conflicts. 3583 if (Complain) { 3584 assert(ImportLoc.isValid() && "Missing import location"); 3585 for (unsigned I = 0, N = Mod->Conflicts.size(); I != N; ++I) { 3586 if (Mod->Conflicts[I].Other->NameVisibility >= NameVisibility) { 3587 Diag(ImportLoc, diag::warn_module_conflict) 3588 << Mod->getFullModuleName() 3589 << Mod->Conflicts[I].Other->getFullModuleName() 3590 << Mod->Conflicts[I].Message; 3591 // FIXME: Need note where the other module was imported. 3592 } 3593 } 3594 } 3595 } 3596 } 3597 3598 bool ASTReader::loadGlobalIndex() { 3599 if (GlobalIndex) 3600 return false; 3601 3602 if (TriedLoadingGlobalIndex || !UseGlobalIndex || 3603 !Context.getLangOpts().Modules) 3604 return true; 3605 3606 // Try to load the global index. 3607 TriedLoadingGlobalIndex = true; 3608 StringRef ModuleCachePath 3609 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 3610 std::pair<GlobalModuleIndex *, GlobalModuleIndex::ErrorCode> Result 3611 = GlobalModuleIndex::readIndex(ModuleCachePath); 3612 if (!Result.first) 3613 return true; 3614 3615 GlobalIndex.reset(Result.first); 3616 ModuleMgr.setGlobalIndex(GlobalIndex.get()); 3617 return false; 3618 } 3619 3620 bool ASTReader::isGlobalIndexUnavailable() const { 3621 return Context.getLangOpts().Modules && UseGlobalIndex && 3622 !hasGlobalIndex() && TriedLoadingGlobalIndex; 3623 } 3624 3625 static void updateModuleTimestamp(ModuleFile &MF) { 3626 // Overwrite the timestamp file contents so that file's mtime changes. 3627 std::string TimestampFilename = MF.getTimestampFilename(); 3628 std::error_code EC; 3629 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::F_Text); 3630 if (EC) 3631 return; 3632 OS << "Timestamp file\n"; 3633 } 3634 3635 ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName, 3636 ModuleKind Type, 3637 SourceLocation ImportLoc, 3638 unsigned ClientLoadCapabilities) { 3639 llvm::SaveAndRestore<SourceLocation> 3640 SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 3641 3642 // Defer any pending actions until we get to the end of reading the AST file. 3643 Deserializing AnASTFile(this); 3644 3645 // Bump the generation number. 3646 unsigned PreviousGeneration = incrementGeneration(Context); 3647 3648 unsigned NumModules = ModuleMgr.size(); 3649 SmallVector<ImportedModule, 4> Loaded; 3650 switch(ASTReadResult ReadResult = ReadASTCore(FileName, Type, ImportLoc, 3651 /*ImportedBy=*/nullptr, Loaded, 3652 0, 0, 0, 3653 ClientLoadCapabilities)) { 3654 case Failure: 3655 case Missing: 3656 case OutOfDate: 3657 case VersionMismatch: 3658 case ConfigurationMismatch: 3659 case HadErrors: { 3660 llvm::SmallPtrSet<ModuleFile *, 4> LoadedSet; 3661 for (const ImportedModule &IM : Loaded) 3662 LoadedSet.insert(IM.Mod); 3663 3664 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, ModuleMgr.end(), 3665 LoadedSet, 3666 Context.getLangOpts().Modules 3667 ? &PP.getHeaderSearchInfo().getModuleMap() 3668 : nullptr); 3669 3670 // If we find that any modules are unusable, the global index is going 3671 // to be out-of-date. Just remove it. 3672 GlobalIndex.reset(); 3673 ModuleMgr.setGlobalIndex(nullptr); 3674 return ReadResult; 3675 } 3676 case Success: 3677 break; 3678 } 3679 3680 // Here comes stuff that we only do once the entire chain is loaded. 3681 3682 // Load the AST blocks of all of the modules that we loaded. 3683 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), 3684 MEnd = Loaded.end(); 3685 M != MEnd; ++M) { 3686 ModuleFile &F = *M->Mod; 3687 3688 // Read the AST block. 3689 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities)) 3690 return Result; 3691 3692 // Once read, set the ModuleFile bit base offset and update the size in 3693 // bits of all files we've seen. 3694 F.GlobalBitOffset = TotalModulesSizeInBits; 3695 TotalModulesSizeInBits += F.SizeInBits; 3696 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 3697 3698 // Preload SLocEntries. 3699 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 3700 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 3701 // Load it through the SourceManager and don't call ReadSLocEntry() 3702 // directly because the entry may have already been loaded in which case 3703 // calling ReadSLocEntry() directly would trigger an assertion in 3704 // SourceManager. 3705 SourceMgr.getLoadedSLocEntryByID(Index); 3706 } 3707 } 3708 3709 // Setup the import locations and notify the module manager that we've 3710 // committed to these module files. 3711 for (SmallVectorImpl<ImportedModule>::iterator M = Loaded.begin(), 3712 MEnd = Loaded.end(); 3713 M != MEnd; ++M) { 3714 ModuleFile &F = *M->Mod; 3715 3716 ModuleMgr.moduleFileAccepted(&F); 3717 3718 // Set the import location. 3719 F.DirectImportLoc = ImportLoc; 3720 if (!M->ImportedBy) 3721 F.ImportLoc = M->ImportLoc; 3722 else 3723 F.ImportLoc = ReadSourceLocation(*M->ImportedBy, 3724 M->ImportLoc.getRawEncoding()); 3725 } 3726 3727 // Mark all of the identifiers in the identifier table as being out of date, 3728 // so that various accessors know to check the loaded modules when the 3729 // identifier is used. 3730 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 3731 IdEnd = PP.getIdentifierTable().end(); 3732 Id != IdEnd; ++Id) 3733 Id->second->setOutOfDate(true); 3734 3735 // Resolve any unresolved module exports. 3736 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) { 3737 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I]; 3738 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 3739 Module *ResolvedMod = getSubmodule(GlobalID); 3740 3741 switch (Unresolved.Kind) { 3742 case UnresolvedModuleRef::Conflict: 3743 if (ResolvedMod) { 3744 Module::Conflict Conflict; 3745 Conflict.Other = ResolvedMod; 3746 Conflict.Message = Unresolved.String.str(); 3747 Unresolved.Mod->Conflicts.push_back(Conflict); 3748 } 3749 continue; 3750 3751 case UnresolvedModuleRef::Import: 3752 if (ResolvedMod) 3753 Unresolved.Mod->Imports.push_back(ResolvedMod); 3754 continue; 3755 3756 case UnresolvedModuleRef::Export: 3757 if (ResolvedMod || Unresolved.IsWildcard) 3758 Unresolved.Mod->Exports.push_back( 3759 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 3760 continue; 3761 } 3762 } 3763 UnresolvedModuleRefs.clear(); 3764 3765 // FIXME: How do we load the 'use'd modules? They may not be submodules. 3766 // Might be unnecessary as use declarations are only used to build the 3767 // module itself. 3768 3769 InitializeContext(); 3770 3771 if (SemaObj) 3772 UpdateSema(); 3773 3774 if (DeserializationListener) 3775 DeserializationListener->ReaderInitialized(this); 3776 3777 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 3778 if (!PrimaryModule.OriginalSourceFileID.isInvalid()) { 3779 PrimaryModule.OriginalSourceFileID 3780 = FileID::get(PrimaryModule.SLocEntryBaseID 3781 + PrimaryModule.OriginalSourceFileID.getOpaqueValue() - 1); 3782 3783 // If this AST file is a precompiled preamble, then set the 3784 // preamble file ID of the source manager to the file source file 3785 // from which the preamble was built. 3786 if (Type == MK_Preamble) { 3787 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 3788 } else if (Type == MK_MainFile) { 3789 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 3790 } 3791 } 3792 3793 // For any Objective-C class definitions we have already loaded, make sure 3794 // that we load any additional categories. 3795 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 3796 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 3797 ObjCClassesLoaded[I], 3798 PreviousGeneration); 3799 } 3800 3801 if (PP.getHeaderSearchInfo() 3802 .getHeaderSearchOpts() 3803 .ModulesValidateOncePerBuildSession) { 3804 // Now we are certain that the module and all modules it depends on are 3805 // up to date. Create or update timestamp files for modules that are 3806 // located in the module cache (not for PCH files that could be anywhere 3807 // in the filesystem). 3808 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) { 3809 ImportedModule &M = Loaded[I]; 3810 if (M.Mod->Kind == MK_ImplicitModule) { 3811 updateModuleTimestamp(*M.Mod); 3812 } 3813 } 3814 } 3815 3816 return Success; 3817 } 3818 3819 static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile); 3820 3821 ASTReader::ASTReadResult 3822 ASTReader::ReadASTCore(StringRef FileName, 3823 ModuleKind Type, 3824 SourceLocation ImportLoc, 3825 ModuleFile *ImportedBy, 3826 SmallVectorImpl<ImportedModule> &Loaded, 3827 off_t ExpectedSize, time_t ExpectedModTime, 3828 ASTFileSignature ExpectedSignature, 3829 unsigned ClientLoadCapabilities) { 3830 ModuleFile *M; 3831 std::string ErrorStr; 3832 ModuleManager::AddModuleResult AddResult 3833 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy, 3834 getGeneration(), ExpectedSize, ExpectedModTime, 3835 ExpectedSignature, readASTFileSignature, 3836 M, ErrorStr); 3837 3838 switch (AddResult) { 3839 case ModuleManager::AlreadyLoaded: 3840 return Success; 3841 3842 case ModuleManager::NewlyLoaded: 3843 // Load module file below. 3844 break; 3845 3846 case ModuleManager::Missing: 3847 // The module file was missing; if the client can handle that, return 3848 // it. 3849 if (ClientLoadCapabilities & ARR_Missing) 3850 return Missing; 3851 3852 // Otherwise, return an error. 3853 { 3854 std::string Msg = "Unable to load module \"" + FileName.str() + "\": " 3855 + ErrorStr; 3856 Error(Msg); 3857 } 3858 return Failure; 3859 3860 case ModuleManager::OutOfDate: 3861 // We couldn't load the module file because it is out-of-date. If the 3862 // client can handle out-of-date, return it. 3863 if (ClientLoadCapabilities & ARR_OutOfDate) 3864 return OutOfDate; 3865 3866 // Otherwise, return an error. 3867 { 3868 std::string Msg = "Unable to load module \"" + FileName.str() + "\": " 3869 + ErrorStr; 3870 Error(Msg); 3871 } 3872 return Failure; 3873 } 3874 3875 assert(M && "Missing module file"); 3876 3877 // FIXME: This seems rather a hack. Should CurrentDir be part of the 3878 // module? 3879 if (FileName != "-") { 3880 CurrentDir = llvm::sys::path::parent_path(FileName); 3881 if (CurrentDir.empty()) CurrentDir = "."; 3882 } 3883 3884 ModuleFile &F = *M; 3885 BitstreamCursor &Stream = F.Stream; 3886 Stream.init(&F.StreamFile); 3887 F.SizeInBits = F.Buffer->getBufferSize() * 8; 3888 3889 // Sniff for the signature. 3890 if (Stream.Read(8) != 'C' || 3891 Stream.Read(8) != 'P' || 3892 Stream.Read(8) != 'C' || 3893 Stream.Read(8) != 'H') { 3894 Diag(diag::err_not_a_pch_file) << FileName; 3895 return Failure; 3896 } 3897 3898 // This is used for compatibility with older PCH formats. 3899 bool HaveReadControlBlock = false; 3900 3901 while (1) { 3902 llvm::BitstreamEntry Entry = Stream.advance(); 3903 3904 switch (Entry.Kind) { 3905 case llvm::BitstreamEntry::Error: 3906 case llvm::BitstreamEntry::EndBlock: 3907 case llvm::BitstreamEntry::Record: 3908 Error("invalid record at top-level of AST file"); 3909 return Failure; 3910 3911 case llvm::BitstreamEntry::SubBlock: 3912 break; 3913 } 3914 3915 // We only know the control subblock ID. 3916 switch (Entry.ID) { 3917 case llvm::bitc::BLOCKINFO_BLOCK_ID: 3918 if (Stream.ReadBlockInfoBlock()) { 3919 Error("malformed BlockInfoBlock in AST file"); 3920 return Failure; 3921 } 3922 break; 3923 case CONTROL_BLOCK_ID: 3924 HaveReadControlBlock = true; 3925 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) { 3926 case Success: 3927 break; 3928 3929 case Failure: return Failure; 3930 case Missing: return Missing; 3931 case OutOfDate: return OutOfDate; 3932 case VersionMismatch: return VersionMismatch; 3933 case ConfigurationMismatch: return ConfigurationMismatch; 3934 case HadErrors: return HadErrors; 3935 } 3936 break; 3937 case AST_BLOCK_ID: 3938 if (!HaveReadControlBlock) { 3939 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 3940 Diag(diag::err_pch_version_too_old); 3941 return VersionMismatch; 3942 } 3943 3944 // Record that we've loaded this module. 3945 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 3946 return Success; 3947 3948 default: 3949 if (Stream.SkipBlock()) { 3950 Error("malformed block record in AST file"); 3951 return Failure; 3952 } 3953 break; 3954 } 3955 } 3956 3957 return Success; 3958 } 3959 3960 void ASTReader::InitializeContext() { 3961 // If there's a listener, notify them that we "read" the translation unit. 3962 if (DeserializationListener) 3963 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 3964 Context.getTranslationUnitDecl()); 3965 3966 // FIXME: Find a better way to deal with collisions between these 3967 // built-in types. Right now, we just ignore the problem. 3968 3969 // Load the special types. 3970 if (SpecialTypes.size() >= NumSpecialTypeIDs) { 3971 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 3972 if (!Context.CFConstantStringTypeDecl) 3973 Context.setCFConstantStringType(GetType(String)); 3974 } 3975 3976 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 3977 QualType FileType = GetType(File); 3978 if (FileType.isNull()) { 3979 Error("FILE type is NULL"); 3980 return; 3981 } 3982 3983 if (!Context.FILEDecl) { 3984 if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 3985 Context.setFILEDecl(Typedef->getDecl()); 3986 else { 3987 const TagType *Tag = FileType->getAs<TagType>(); 3988 if (!Tag) { 3989 Error("Invalid FILE type in AST file"); 3990 return; 3991 } 3992 Context.setFILEDecl(Tag->getDecl()); 3993 } 3994 } 3995 } 3996 3997 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 3998 QualType Jmp_bufType = GetType(Jmp_buf); 3999 if (Jmp_bufType.isNull()) { 4000 Error("jmp_buf type is NULL"); 4001 return; 4002 } 4003 4004 if (!Context.jmp_bufDecl) { 4005 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 4006 Context.setjmp_bufDecl(Typedef->getDecl()); 4007 else { 4008 const TagType *Tag = Jmp_bufType->getAs<TagType>(); 4009 if (!Tag) { 4010 Error("Invalid jmp_buf type in AST file"); 4011 return; 4012 } 4013 Context.setjmp_bufDecl(Tag->getDecl()); 4014 } 4015 } 4016 } 4017 4018 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 4019 QualType Sigjmp_bufType = GetType(Sigjmp_buf); 4020 if (Sigjmp_bufType.isNull()) { 4021 Error("sigjmp_buf type is NULL"); 4022 return; 4023 } 4024 4025 if (!Context.sigjmp_bufDecl) { 4026 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 4027 Context.setsigjmp_bufDecl(Typedef->getDecl()); 4028 else { 4029 const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 4030 assert(Tag && "Invalid sigjmp_buf type in AST file"); 4031 Context.setsigjmp_bufDecl(Tag->getDecl()); 4032 } 4033 } 4034 } 4035 4036 if (unsigned ObjCIdRedef 4037 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 4038 if (Context.ObjCIdRedefinitionType.isNull()) 4039 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 4040 } 4041 4042 if (unsigned ObjCClassRedef 4043 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 4044 if (Context.ObjCClassRedefinitionType.isNull()) 4045 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 4046 } 4047 4048 if (unsigned ObjCSelRedef 4049 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 4050 if (Context.ObjCSelRedefinitionType.isNull()) 4051 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 4052 } 4053 4054 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 4055 QualType Ucontext_tType = GetType(Ucontext_t); 4056 if (Ucontext_tType.isNull()) { 4057 Error("ucontext_t type is NULL"); 4058 return; 4059 } 4060 4061 if (!Context.ucontext_tDecl) { 4062 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 4063 Context.setucontext_tDecl(Typedef->getDecl()); 4064 else { 4065 const TagType *Tag = Ucontext_tType->getAs<TagType>(); 4066 assert(Tag && "Invalid ucontext_t type in AST file"); 4067 Context.setucontext_tDecl(Tag->getDecl()); 4068 } 4069 } 4070 } 4071 } 4072 4073 ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 4074 4075 // If there were any CUDA special declarations, deserialize them. 4076 if (!CUDASpecialDeclRefs.empty()) { 4077 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 4078 Context.setcudaConfigureCallDecl( 4079 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 4080 } 4081 4082 // Re-export any modules that were imported by a non-module AST file. 4083 // FIXME: This does not make macro-only imports visible again. It also doesn't 4084 // make #includes mapped to module imports visible. 4085 for (auto &Import : ImportedModules) { 4086 if (Module *Imported = getSubmodule(Import.ID)) 4087 makeModuleVisible(Imported, Module::AllVisible, 4088 /*ImportLoc=*/Import.ImportLoc, 4089 /*Complain=*/false); 4090 } 4091 ImportedModules.clear(); 4092 } 4093 4094 void ASTReader::finalizeForWriting() { 4095 while (!HiddenNamesMap.empty()) { 4096 auto HiddenNames = std::move(*HiddenNamesMap.begin()); 4097 HiddenNamesMap.erase(HiddenNamesMap.begin()); 4098 makeNamesVisible(HiddenNames.second, HiddenNames.first, 4099 /*FromFinalization*/true); 4100 } 4101 } 4102 4103 /// \brief Given a cursor at the start of an AST file, scan ahead and drop the 4104 /// cursor into the start of the given block ID, returning false on success and 4105 /// true on failure. 4106 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 4107 while (1) { 4108 llvm::BitstreamEntry Entry = Cursor.advance(); 4109 switch (Entry.Kind) { 4110 case llvm::BitstreamEntry::Error: 4111 case llvm::BitstreamEntry::EndBlock: 4112 return true; 4113 4114 case llvm::BitstreamEntry::Record: 4115 // Ignore top-level records. 4116 Cursor.skipRecord(Entry.ID); 4117 break; 4118 4119 case llvm::BitstreamEntry::SubBlock: 4120 if (Entry.ID == BlockID) { 4121 if (Cursor.EnterSubBlock(BlockID)) 4122 return true; 4123 // Found it! 4124 return false; 4125 } 4126 4127 if (Cursor.SkipBlock()) 4128 return true; 4129 } 4130 } 4131 } 4132 4133 static ASTFileSignature readASTFileSignature(llvm::BitstreamReader &StreamFile){ 4134 BitstreamCursor Stream(StreamFile); 4135 if (Stream.Read(8) != 'C' || 4136 Stream.Read(8) != 'P' || 4137 Stream.Read(8) != 'C' || 4138 Stream.Read(8) != 'H') { 4139 return 0; 4140 } 4141 4142 // Scan for the CONTROL_BLOCK_ID block. 4143 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 4144 return 0; 4145 4146 // Scan for SIGNATURE inside the control block. 4147 ASTReader::RecordData Record; 4148 while (1) { 4149 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 4150 if (Entry.Kind == llvm::BitstreamEntry::EndBlock || 4151 Entry.Kind != llvm::BitstreamEntry::Record) 4152 return 0; 4153 4154 Record.clear(); 4155 StringRef Blob; 4156 if (SIGNATURE == Stream.readRecord(Entry.ID, Record, &Blob)) 4157 return Record[0]; 4158 } 4159 } 4160 4161 /// \brief Retrieve the name of the original source file name 4162 /// directly from the AST file, without actually loading the AST 4163 /// file. 4164 std::string ASTReader::getOriginalSourceFile(const std::string &ASTFileName, 4165 FileManager &FileMgr, 4166 DiagnosticsEngine &Diags) { 4167 // Open the AST file. 4168 auto Buffer = FileMgr.getBufferForFile(ASTFileName); 4169 if (!Buffer) { 4170 Diags.Report(diag::err_fe_unable_to_read_pch_file) 4171 << ASTFileName << Buffer.getError().message(); 4172 return std::string(); 4173 } 4174 4175 // Initialize the stream 4176 llvm::BitstreamReader StreamFile; 4177 StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(), 4178 (const unsigned char *)(*Buffer)->getBufferEnd()); 4179 BitstreamCursor Stream(StreamFile); 4180 4181 // Sniff for the signature. 4182 if (Stream.Read(8) != 'C' || 4183 Stream.Read(8) != 'P' || 4184 Stream.Read(8) != 'C' || 4185 Stream.Read(8) != 'H') { 4186 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName; 4187 return std::string(); 4188 } 4189 4190 // Scan for the CONTROL_BLOCK_ID block. 4191 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 4192 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 4193 return std::string(); 4194 } 4195 4196 // Scan for ORIGINAL_FILE inside the control block. 4197 RecordData Record; 4198 while (1) { 4199 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 4200 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 4201 return std::string(); 4202 4203 if (Entry.Kind != llvm::BitstreamEntry::Record) { 4204 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 4205 return std::string(); 4206 } 4207 4208 Record.clear(); 4209 StringRef Blob; 4210 if (Stream.readRecord(Entry.ID, Record, &Blob) == ORIGINAL_FILE) 4211 return Blob.str(); 4212 } 4213 } 4214 4215 namespace { 4216 class SimplePCHValidator : public ASTReaderListener { 4217 const LangOptions &ExistingLangOpts; 4218 const TargetOptions &ExistingTargetOpts; 4219 const PreprocessorOptions &ExistingPPOpts; 4220 std::string ExistingModuleCachePath; 4221 FileManager &FileMgr; 4222 4223 public: 4224 SimplePCHValidator(const LangOptions &ExistingLangOpts, 4225 const TargetOptions &ExistingTargetOpts, 4226 const PreprocessorOptions &ExistingPPOpts, 4227 StringRef ExistingModuleCachePath, 4228 FileManager &FileMgr) 4229 : ExistingLangOpts(ExistingLangOpts), 4230 ExistingTargetOpts(ExistingTargetOpts), 4231 ExistingPPOpts(ExistingPPOpts), 4232 ExistingModuleCachePath(ExistingModuleCachePath), 4233 FileMgr(FileMgr) 4234 { 4235 } 4236 4237 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, 4238 bool AllowCompatibleDifferences) override { 4239 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr, 4240 AllowCompatibleDifferences); 4241 } 4242 bool ReadTargetOptions(const TargetOptions &TargetOpts, 4243 bool Complain) override { 4244 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr); 4245 } 4246 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 4247 StringRef SpecificModuleCachePath, 4248 bool Complain) override { 4249 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 4250 ExistingModuleCachePath, 4251 nullptr, ExistingLangOpts); 4252 } 4253 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 4254 bool Complain, 4255 std::string &SuggestedPredefines) override { 4256 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr, 4257 SuggestedPredefines, ExistingLangOpts); 4258 } 4259 }; 4260 } 4261 4262 bool ASTReader::readASTFileControlBlock(StringRef Filename, 4263 FileManager &FileMgr, 4264 ASTReaderListener &Listener) { 4265 // Open the AST file. 4266 auto Buffer = FileMgr.getBufferForFile(Filename); 4267 if (!Buffer) { 4268 return true; 4269 } 4270 4271 // Initialize the stream 4272 llvm::BitstreamReader StreamFile; 4273 StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(), 4274 (const unsigned char *)(*Buffer)->getBufferEnd()); 4275 BitstreamCursor Stream(StreamFile); 4276 4277 // Sniff for the signature. 4278 if (Stream.Read(8) != 'C' || 4279 Stream.Read(8) != 'P' || 4280 Stream.Read(8) != 'C' || 4281 Stream.Read(8) != 'H') { 4282 return true; 4283 } 4284 4285 // Scan for the CONTROL_BLOCK_ID block. 4286 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 4287 return true; 4288 4289 bool NeedsInputFiles = Listener.needsInputFileVisitation(); 4290 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation(); 4291 bool NeedsImports = Listener.needsImportVisitation(); 4292 BitstreamCursor InputFilesCursor; 4293 if (NeedsInputFiles) { 4294 InputFilesCursor = Stream; 4295 if (SkipCursorToBlock(InputFilesCursor, INPUT_FILES_BLOCK_ID)) 4296 return true; 4297 4298 // Read the abbreviations 4299 while (true) { 4300 uint64_t Offset = InputFilesCursor.GetCurrentBitNo(); 4301 unsigned Code = InputFilesCursor.ReadCode(); 4302 4303 // We expect all abbrevs to be at the start of the block. 4304 if (Code != llvm::bitc::DEFINE_ABBREV) { 4305 InputFilesCursor.JumpToBit(Offset); 4306 break; 4307 } 4308 InputFilesCursor.ReadAbbrevRecord(); 4309 } 4310 } 4311 4312 // Scan for ORIGINAL_FILE inside the control block. 4313 RecordData Record; 4314 std::string ModuleDir; 4315 while (1) { 4316 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); 4317 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 4318 return false; 4319 4320 if (Entry.Kind != llvm::BitstreamEntry::Record) 4321 return true; 4322 4323 Record.clear(); 4324 StringRef Blob; 4325 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob); 4326 switch ((ControlRecordTypes)RecCode) { 4327 case METADATA: { 4328 if (Record[0] != VERSION_MAJOR) 4329 return true; 4330 4331 if (Listener.ReadFullVersionInformation(Blob)) 4332 return true; 4333 4334 break; 4335 } 4336 case MODULE_NAME: 4337 Listener.ReadModuleName(Blob); 4338 break; 4339 case MODULE_DIRECTORY: 4340 ModuleDir = Blob; 4341 break; 4342 case MODULE_MAP_FILE: { 4343 unsigned Idx = 0; 4344 auto Path = ReadString(Record, Idx); 4345 ResolveImportedPath(Path, ModuleDir); 4346 Listener.ReadModuleMapFile(Path); 4347 break; 4348 } 4349 case LANGUAGE_OPTIONS: 4350 if (ParseLanguageOptions(Record, false, Listener, 4351 /*AllowCompatibleConfigurationMismatch*/false)) 4352 return true; 4353 break; 4354 4355 case TARGET_OPTIONS: 4356 if (ParseTargetOptions(Record, false, Listener)) 4357 return true; 4358 break; 4359 4360 case DIAGNOSTIC_OPTIONS: 4361 if (ParseDiagnosticOptions(Record, false, Listener)) 4362 return true; 4363 break; 4364 4365 case FILE_SYSTEM_OPTIONS: 4366 if (ParseFileSystemOptions(Record, false, Listener)) 4367 return true; 4368 break; 4369 4370 case HEADER_SEARCH_OPTIONS: 4371 if (ParseHeaderSearchOptions(Record, false, Listener)) 4372 return true; 4373 break; 4374 4375 case PREPROCESSOR_OPTIONS: { 4376 std::string IgnoredSuggestedPredefines; 4377 if (ParsePreprocessorOptions(Record, false, Listener, 4378 IgnoredSuggestedPredefines)) 4379 return true; 4380 break; 4381 } 4382 4383 case INPUT_FILE_OFFSETS: { 4384 if (!NeedsInputFiles) 4385 break; 4386 4387 unsigned NumInputFiles = Record[0]; 4388 unsigned NumUserFiles = Record[1]; 4389 const uint64_t *InputFileOffs = (const uint64_t *)Blob.data(); 4390 for (unsigned I = 0; I != NumInputFiles; ++I) { 4391 // Go find this input file. 4392 bool isSystemFile = I >= NumUserFiles; 4393 4394 if (isSystemFile && !NeedsSystemInputFiles) 4395 break; // the rest are system input files 4396 4397 BitstreamCursor &Cursor = InputFilesCursor; 4398 SavedStreamPosition SavedPosition(Cursor); 4399 Cursor.JumpToBit(InputFileOffs[I]); 4400 4401 unsigned Code = Cursor.ReadCode(); 4402 RecordData Record; 4403 StringRef Blob; 4404 bool shouldContinue = false; 4405 switch ((InputFileRecordTypes)Cursor.readRecord(Code, Record, &Blob)) { 4406 case INPUT_FILE: 4407 bool Overridden = static_cast<bool>(Record[3]); 4408 std::string Filename = Blob; 4409 ResolveImportedPath(Filename, ModuleDir); 4410 shouldContinue = 4411 Listener.visitInputFile(Filename, isSystemFile, Overridden); 4412 break; 4413 } 4414 if (!shouldContinue) 4415 break; 4416 } 4417 break; 4418 } 4419 4420 case IMPORTS: { 4421 if (!NeedsImports) 4422 break; 4423 4424 unsigned Idx = 0, N = Record.size(); 4425 while (Idx < N) { 4426 // Read information about the AST file. 4427 Idx += 5; // ImportLoc, Size, ModTime, Signature 4428 std::string Filename = ReadString(Record, Idx); 4429 ResolveImportedPath(Filename, ModuleDir); 4430 Listener.visitImport(Filename); 4431 } 4432 break; 4433 } 4434 4435 default: 4436 // No other validation to perform. 4437 break; 4438 } 4439 } 4440 } 4441 4442 4443 bool ASTReader::isAcceptableASTFile(StringRef Filename, 4444 FileManager &FileMgr, 4445 const LangOptions &LangOpts, 4446 const TargetOptions &TargetOpts, 4447 const PreprocessorOptions &PPOpts, 4448 std::string ExistingModuleCachePath) { 4449 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, 4450 ExistingModuleCachePath, FileMgr); 4451 return !readASTFileControlBlock(Filename, FileMgr, validator); 4452 } 4453 4454 ASTReader::ASTReadResult 4455 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 4456 // Enter the submodule block. 4457 if (F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) { 4458 Error("malformed submodule block record in AST file"); 4459 return Failure; 4460 } 4461 4462 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 4463 bool First = true; 4464 Module *CurrentModule = nullptr; 4465 RecordData Record; 4466 while (true) { 4467 llvm::BitstreamEntry Entry = F.Stream.advanceSkippingSubblocks(); 4468 4469 switch (Entry.Kind) { 4470 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 4471 case llvm::BitstreamEntry::Error: 4472 Error("malformed block record in AST file"); 4473 return Failure; 4474 case llvm::BitstreamEntry::EndBlock: 4475 return Success; 4476 case llvm::BitstreamEntry::Record: 4477 // The interesting case. 4478 break; 4479 } 4480 4481 // Read a record. 4482 StringRef Blob; 4483 Record.clear(); 4484 auto Kind = F.Stream.readRecord(Entry.ID, Record, &Blob); 4485 4486 if ((Kind == SUBMODULE_METADATA) != First) { 4487 Error("submodule metadata record should be at beginning of block"); 4488 return Failure; 4489 } 4490 First = false; 4491 4492 // Submodule information is only valid if we have a current module. 4493 // FIXME: Should we error on these cases? 4494 if (!CurrentModule && Kind != SUBMODULE_METADATA && 4495 Kind != SUBMODULE_DEFINITION) 4496 continue; 4497 4498 switch (Kind) { 4499 default: // Default behavior: ignore. 4500 break; 4501 4502 case SUBMODULE_DEFINITION: { 4503 if (Record.size() < 8) { 4504 Error("malformed module definition"); 4505 return Failure; 4506 } 4507 4508 StringRef Name = Blob; 4509 unsigned Idx = 0; 4510 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]); 4511 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]); 4512 bool IsFramework = Record[Idx++]; 4513 bool IsExplicit = Record[Idx++]; 4514 bool IsSystem = Record[Idx++]; 4515 bool IsExternC = Record[Idx++]; 4516 bool InferSubmodules = Record[Idx++]; 4517 bool InferExplicitSubmodules = Record[Idx++]; 4518 bool InferExportWildcard = Record[Idx++]; 4519 bool ConfigMacrosExhaustive = Record[Idx++]; 4520 4521 Module *ParentModule = nullptr; 4522 if (Parent) 4523 ParentModule = getSubmodule(Parent); 4524 4525 // Retrieve this (sub)module from the module map, creating it if 4526 // necessary. 4527 CurrentModule = ModMap.findOrCreateModule(Name, ParentModule, IsFramework, 4528 IsExplicit).first; 4529 4530 // FIXME: set the definition loc for CurrentModule, or call 4531 // ModMap.setInferredModuleAllowedBy() 4532 4533 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 4534 if (GlobalIndex >= SubmodulesLoaded.size() || 4535 SubmodulesLoaded[GlobalIndex]) { 4536 Error("too many submodules"); 4537 return Failure; 4538 } 4539 4540 if (!ParentModule) { 4541 if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 4542 if (CurFile != F.File) { 4543 if (!Diags.isDiagnosticInFlight()) { 4544 Diag(diag::err_module_file_conflict) 4545 << CurrentModule->getTopLevelModuleName() 4546 << CurFile->getName() 4547 << F.File->getName(); 4548 } 4549 return Failure; 4550 } 4551 } 4552 4553 CurrentModule->setASTFile(F.File); 4554 } 4555 4556 CurrentModule->IsFromModuleFile = true; 4557 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 4558 CurrentModule->IsExternC = IsExternC; 4559 CurrentModule->InferSubmodules = InferSubmodules; 4560 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 4561 CurrentModule->InferExportWildcard = InferExportWildcard; 4562 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive; 4563 if (DeserializationListener) 4564 DeserializationListener->ModuleRead(GlobalID, CurrentModule); 4565 4566 SubmodulesLoaded[GlobalIndex] = CurrentModule; 4567 4568 // Clear out data that will be replaced by what is the module file. 4569 CurrentModule->LinkLibraries.clear(); 4570 CurrentModule->ConfigMacros.clear(); 4571 CurrentModule->UnresolvedConflicts.clear(); 4572 CurrentModule->Conflicts.clear(); 4573 break; 4574 } 4575 4576 case SUBMODULE_UMBRELLA_HEADER: { 4577 if (const FileEntry *Umbrella = PP.getFileManager().getFile(Blob)) { 4578 if (!CurrentModule->getUmbrellaHeader()) 4579 ModMap.setUmbrellaHeader(CurrentModule, Umbrella); 4580 else if (CurrentModule->getUmbrellaHeader() != Umbrella) { 4581 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 4582 Error("mismatched umbrella headers in submodule"); 4583 return OutOfDate; 4584 } 4585 } 4586 break; 4587 } 4588 4589 case SUBMODULE_HEADER: 4590 case SUBMODULE_EXCLUDED_HEADER: 4591 case SUBMODULE_PRIVATE_HEADER: 4592 // We lazily associate headers with their modules via the HeaderInfo table. 4593 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 4594 // of complete filenames or remove it entirely. 4595 break; 4596 4597 case SUBMODULE_TEXTUAL_HEADER: 4598 case SUBMODULE_PRIVATE_TEXTUAL_HEADER: 4599 // FIXME: Textual headers are not marked in the HeaderInfo table. Load 4600 // them here. 4601 break; 4602 4603 case SUBMODULE_TOPHEADER: { 4604 CurrentModule->addTopHeaderFilename(Blob); 4605 break; 4606 } 4607 4608 case SUBMODULE_UMBRELLA_DIR: { 4609 if (const DirectoryEntry *Umbrella 4610 = PP.getFileManager().getDirectory(Blob)) { 4611 if (!CurrentModule->getUmbrellaDir()) 4612 ModMap.setUmbrellaDir(CurrentModule, Umbrella); 4613 else if (CurrentModule->getUmbrellaDir() != Umbrella) { 4614 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 4615 Error("mismatched umbrella directories in submodule"); 4616 return OutOfDate; 4617 } 4618 } 4619 break; 4620 } 4621 4622 case SUBMODULE_METADATA: { 4623 F.BaseSubmoduleID = getTotalNumSubmodules(); 4624 F.LocalNumSubmodules = Record[0]; 4625 unsigned LocalBaseSubmoduleID = Record[1]; 4626 if (F.LocalNumSubmodules > 0) { 4627 // Introduce the global -> local mapping for submodules within this 4628 // module. 4629 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 4630 4631 // Introduce the local -> global mapping for submodules within this 4632 // module. 4633 F.SubmoduleRemap.insertOrReplace( 4634 std::make_pair(LocalBaseSubmoduleID, 4635 F.BaseSubmoduleID - LocalBaseSubmoduleID)); 4636 4637 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 4638 } 4639 break; 4640 } 4641 4642 case SUBMODULE_IMPORTS: { 4643 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 4644 UnresolvedModuleRef Unresolved; 4645 Unresolved.File = &F; 4646 Unresolved.Mod = CurrentModule; 4647 Unresolved.ID = Record[Idx]; 4648 Unresolved.Kind = UnresolvedModuleRef::Import; 4649 Unresolved.IsWildcard = false; 4650 UnresolvedModuleRefs.push_back(Unresolved); 4651 } 4652 break; 4653 } 4654 4655 case SUBMODULE_EXPORTS: { 4656 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 4657 UnresolvedModuleRef Unresolved; 4658 Unresolved.File = &F; 4659 Unresolved.Mod = CurrentModule; 4660 Unresolved.ID = Record[Idx]; 4661 Unresolved.Kind = UnresolvedModuleRef::Export; 4662 Unresolved.IsWildcard = Record[Idx + 1]; 4663 UnresolvedModuleRefs.push_back(Unresolved); 4664 } 4665 4666 // Once we've loaded the set of exports, there's no reason to keep 4667 // the parsed, unresolved exports around. 4668 CurrentModule->UnresolvedExports.clear(); 4669 break; 4670 } 4671 case SUBMODULE_REQUIRES: { 4672 CurrentModule->addRequirement(Blob, Record[0], Context.getLangOpts(), 4673 Context.getTargetInfo()); 4674 break; 4675 } 4676 4677 case SUBMODULE_LINK_LIBRARY: 4678 CurrentModule->LinkLibraries.push_back( 4679 Module::LinkLibrary(Blob, Record[0])); 4680 break; 4681 4682 case SUBMODULE_CONFIG_MACRO: 4683 CurrentModule->ConfigMacros.push_back(Blob.str()); 4684 break; 4685 4686 case SUBMODULE_CONFLICT: { 4687 UnresolvedModuleRef Unresolved; 4688 Unresolved.File = &F; 4689 Unresolved.Mod = CurrentModule; 4690 Unresolved.ID = Record[0]; 4691 Unresolved.Kind = UnresolvedModuleRef::Conflict; 4692 Unresolved.IsWildcard = false; 4693 Unresolved.String = Blob; 4694 UnresolvedModuleRefs.push_back(Unresolved); 4695 break; 4696 } 4697 } 4698 } 4699 } 4700 4701 /// \brief Parse the record that corresponds to a LangOptions data 4702 /// structure. 4703 /// 4704 /// This routine parses the language options from the AST file and then gives 4705 /// them to the AST listener if one is set. 4706 /// 4707 /// \returns true if the listener deems the file unacceptable, false otherwise. 4708 bool ASTReader::ParseLanguageOptions(const RecordData &Record, 4709 bool Complain, 4710 ASTReaderListener &Listener, 4711 bool AllowCompatibleDifferences) { 4712 LangOptions LangOpts; 4713 unsigned Idx = 0; 4714 #define LANGOPT(Name, Bits, Default, Description) \ 4715 LangOpts.Name = Record[Idx++]; 4716 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 4717 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 4718 #include "clang/Basic/LangOptions.def" 4719 #define SANITIZER(NAME, ID) \ 4720 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]); 4721 #include "clang/Basic/Sanitizers.def" 4722 4723 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 4724 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 4725 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 4726 4727 unsigned Length = Record[Idx++]; 4728 LangOpts.CurrentModule.assign(Record.begin() + Idx, 4729 Record.begin() + Idx + Length); 4730 4731 Idx += Length; 4732 4733 // Comment options. 4734 for (unsigned N = Record[Idx++]; N; --N) { 4735 LangOpts.CommentOpts.BlockCommandNames.push_back( 4736 ReadString(Record, Idx)); 4737 } 4738 LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 4739 4740 return Listener.ReadLanguageOptions(LangOpts, Complain, 4741 AllowCompatibleDifferences); 4742 } 4743 4744 bool ASTReader::ParseTargetOptions(const RecordData &Record, 4745 bool Complain, 4746 ASTReaderListener &Listener) { 4747 unsigned Idx = 0; 4748 TargetOptions TargetOpts; 4749 TargetOpts.Triple = ReadString(Record, Idx); 4750 TargetOpts.CPU = ReadString(Record, Idx); 4751 TargetOpts.ABI = ReadString(Record, Idx); 4752 for (unsigned N = Record[Idx++]; N; --N) { 4753 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 4754 } 4755 for (unsigned N = Record[Idx++]; N; --N) { 4756 TargetOpts.Features.push_back(ReadString(Record, Idx)); 4757 } 4758 4759 return Listener.ReadTargetOptions(TargetOpts, Complain); 4760 } 4761 4762 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 4763 ASTReaderListener &Listener) { 4764 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); 4765 unsigned Idx = 0; 4766 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++]; 4767 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 4768 DiagOpts->set##Name(static_cast<Type>(Record[Idx++])); 4769 #include "clang/Basic/DiagnosticOptions.def" 4770 4771 for (unsigned N = Record[Idx++]; N; --N) 4772 DiagOpts->Warnings.push_back(ReadString(Record, Idx)); 4773 for (unsigned N = Record[Idx++]; N; --N) 4774 DiagOpts->Remarks.push_back(ReadString(Record, Idx)); 4775 4776 return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 4777 } 4778 4779 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 4780 ASTReaderListener &Listener) { 4781 FileSystemOptions FSOpts; 4782 unsigned Idx = 0; 4783 FSOpts.WorkingDir = ReadString(Record, Idx); 4784 return Listener.ReadFileSystemOptions(FSOpts, Complain); 4785 } 4786 4787 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 4788 bool Complain, 4789 ASTReaderListener &Listener) { 4790 HeaderSearchOptions HSOpts; 4791 unsigned Idx = 0; 4792 HSOpts.Sysroot = ReadString(Record, Idx); 4793 4794 // Include entries. 4795 for (unsigned N = Record[Idx++]; N; --N) { 4796 std::string Path = ReadString(Record, Idx); 4797 frontend::IncludeDirGroup Group 4798 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 4799 bool IsFramework = Record[Idx++]; 4800 bool IgnoreSysRoot = Record[Idx++]; 4801 HSOpts.UserEntries.push_back( 4802 HeaderSearchOptions::Entry(Path, Group, IsFramework, IgnoreSysRoot)); 4803 } 4804 4805 // System header prefixes. 4806 for (unsigned N = Record[Idx++]; N; --N) { 4807 std::string Prefix = ReadString(Record, Idx); 4808 bool IsSystemHeader = Record[Idx++]; 4809 HSOpts.SystemHeaderPrefixes.push_back( 4810 HeaderSearchOptions::SystemHeaderPrefix(Prefix, IsSystemHeader)); 4811 } 4812 4813 HSOpts.ResourceDir = ReadString(Record, Idx); 4814 HSOpts.ModuleCachePath = ReadString(Record, Idx); 4815 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx); 4816 HSOpts.DisableModuleHash = Record[Idx++]; 4817 HSOpts.UseBuiltinIncludes = Record[Idx++]; 4818 HSOpts.UseStandardSystemIncludes = Record[Idx++]; 4819 HSOpts.UseStandardCXXIncludes = Record[Idx++]; 4820 HSOpts.UseLibcxx = Record[Idx++]; 4821 std::string SpecificModuleCachePath = ReadString(Record, Idx); 4822 4823 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 4824 Complain); 4825 } 4826 4827 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 4828 bool Complain, 4829 ASTReaderListener &Listener, 4830 std::string &SuggestedPredefines) { 4831 PreprocessorOptions PPOpts; 4832 unsigned Idx = 0; 4833 4834 // Macro definitions/undefs 4835 for (unsigned N = Record[Idx++]; N; --N) { 4836 std::string Macro = ReadString(Record, Idx); 4837 bool IsUndef = Record[Idx++]; 4838 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 4839 } 4840 4841 // Includes 4842 for (unsigned N = Record[Idx++]; N; --N) { 4843 PPOpts.Includes.push_back(ReadString(Record, Idx)); 4844 } 4845 4846 // Macro Includes 4847 for (unsigned N = Record[Idx++]; N; --N) { 4848 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 4849 } 4850 4851 PPOpts.UsePredefines = Record[Idx++]; 4852 PPOpts.DetailedRecord = Record[Idx++]; 4853 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 4854 PPOpts.ImplicitPTHInclude = ReadString(Record, Idx); 4855 PPOpts.ObjCXXARCStandardLibrary = 4856 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 4857 SuggestedPredefines.clear(); 4858 return Listener.ReadPreprocessorOptions(PPOpts, Complain, 4859 SuggestedPredefines); 4860 } 4861 4862 std::pair<ModuleFile *, unsigned> 4863 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 4864 GlobalPreprocessedEntityMapType::iterator 4865 I = GlobalPreprocessedEntityMap.find(GlobalIndex); 4866 assert(I != GlobalPreprocessedEntityMap.end() && 4867 "Corrupted global preprocessed entity map"); 4868 ModuleFile *M = I->second; 4869 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 4870 return std::make_pair(M, LocalIndex); 4871 } 4872 4873 llvm::iterator_range<PreprocessingRecord::iterator> 4874 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 4875 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 4876 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 4877 Mod.NumPreprocessedEntities); 4878 4879 return llvm::make_range(PreprocessingRecord::iterator(), 4880 PreprocessingRecord::iterator()); 4881 } 4882 4883 llvm::iterator_range<ASTReader::ModuleDeclIterator> 4884 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 4885 return llvm::make_range( 4886 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 4887 ModuleDeclIterator(this, &Mod, 4888 Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 4889 } 4890 4891 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 4892 PreprocessedEntityID PPID = Index+1; 4893 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 4894 ModuleFile &M = *PPInfo.first; 4895 unsigned LocalIndex = PPInfo.second; 4896 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 4897 4898 if (!PP.getPreprocessingRecord()) { 4899 Error("no preprocessing record"); 4900 return nullptr; 4901 } 4902 4903 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 4904 M.PreprocessorDetailCursor.JumpToBit(PPOffs.BitOffset); 4905 4906 llvm::BitstreamEntry Entry = 4907 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 4908 if (Entry.Kind != llvm::BitstreamEntry::Record) 4909 return nullptr; 4910 4911 // Read the record. 4912 SourceRange Range(ReadSourceLocation(M, PPOffs.Begin), 4913 ReadSourceLocation(M, PPOffs.End)); 4914 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 4915 StringRef Blob; 4916 RecordData Record; 4917 PreprocessorDetailRecordTypes RecType = 4918 (PreprocessorDetailRecordTypes)M.PreprocessorDetailCursor.readRecord( 4919 Entry.ID, Record, &Blob); 4920 switch (RecType) { 4921 case PPD_MACRO_EXPANSION: { 4922 bool isBuiltin = Record[0]; 4923 IdentifierInfo *Name = nullptr; 4924 MacroDefinition *Def = nullptr; 4925 if (isBuiltin) 4926 Name = getLocalIdentifier(M, Record[1]); 4927 else { 4928 PreprocessedEntityID 4929 GlobalID = getGlobalPreprocessedEntityID(M, Record[1]); 4930 Def =cast<MacroDefinition>(PPRec.getLoadedPreprocessedEntity(GlobalID-1)); 4931 } 4932 4933 MacroExpansion *ME; 4934 if (isBuiltin) 4935 ME = new (PPRec) MacroExpansion(Name, Range); 4936 else 4937 ME = new (PPRec) MacroExpansion(Def, Range); 4938 4939 return ME; 4940 } 4941 4942 case PPD_MACRO_DEFINITION: { 4943 // Decode the identifier info and then check again; if the macro is 4944 // still defined and associated with the identifier, 4945 IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 4946 MacroDefinition *MD 4947 = new (PPRec) MacroDefinition(II, Range); 4948 4949 if (DeserializationListener) 4950 DeserializationListener->MacroDefinitionRead(PPID, MD); 4951 4952 return MD; 4953 } 4954 4955 case PPD_INCLUSION_DIRECTIVE: { 4956 const char *FullFileNameStart = Blob.data() + Record[0]; 4957 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 4958 const FileEntry *File = nullptr; 4959 if (!FullFileName.empty()) 4960 File = PP.getFileManager().getFile(FullFileName); 4961 4962 // FIXME: Stable encoding 4963 InclusionDirective::InclusionKind Kind 4964 = static_cast<InclusionDirective::InclusionKind>(Record[2]); 4965 InclusionDirective *ID 4966 = new (PPRec) InclusionDirective(PPRec, Kind, 4967 StringRef(Blob.data(), Record[0]), 4968 Record[1], Record[3], 4969 File, 4970 Range); 4971 return ID; 4972 } 4973 } 4974 4975 llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 4976 } 4977 4978 /// \brief \arg SLocMapI points at a chunk of a module that contains no 4979 /// preprocessed entities or the entities it contains are not the ones we are 4980 /// looking for. Find the next module that contains entities and return the ID 4981 /// of the first entry. 4982 PreprocessedEntityID ASTReader::findNextPreprocessedEntity( 4983 GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 4984 ++SLocMapI; 4985 for (GlobalSLocOffsetMapType::const_iterator 4986 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 4987 ModuleFile &M = *SLocMapI->second; 4988 if (M.NumPreprocessedEntities) 4989 return M.BasePreprocessedEntityID; 4990 } 4991 4992 return getTotalNumPreprocessedEntities(); 4993 } 4994 4995 namespace { 4996 4997 template <unsigned PPEntityOffset::*PPLoc> 4998 struct PPEntityComp { 4999 const ASTReader &Reader; 5000 ModuleFile &M; 5001 5002 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) { } 5003 5004 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 5005 SourceLocation LHS = getLoc(L); 5006 SourceLocation RHS = getLoc(R); 5007 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5008 } 5009 5010 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 5011 SourceLocation LHS = getLoc(L); 5012 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5013 } 5014 5015 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 5016 SourceLocation RHS = getLoc(R); 5017 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 5018 } 5019 5020 SourceLocation getLoc(const PPEntityOffset &PPE) const { 5021 return Reader.ReadSourceLocation(M, PPE.*PPLoc); 5022 } 5023 }; 5024 5025 } 5026 5027 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc, 5028 bool EndsAfter) const { 5029 if (SourceMgr.isLocalSourceLocation(Loc)) 5030 return getTotalNumPreprocessedEntities(); 5031 5032 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find( 5033 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1); 5034 assert(SLocMapI != GlobalSLocOffsetMap.end() && 5035 "Corrupted global sloc offset map"); 5036 5037 if (SLocMapI->second->NumPreprocessedEntities == 0) 5038 return findNextPreprocessedEntity(SLocMapI); 5039 5040 ModuleFile &M = *SLocMapI->second; 5041 typedef const PPEntityOffset *pp_iterator; 5042 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 5043 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 5044 5045 size_t Count = M.NumPreprocessedEntities; 5046 size_t Half; 5047 pp_iterator First = pp_begin; 5048 pp_iterator PPI; 5049 5050 if (EndsAfter) { 5051 PPI = std::upper_bound(pp_begin, pp_end, Loc, 5052 PPEntityComp<&PPEntityOffset::Begin>(*this, M)); 5053 } else { 5054 // Do a binary search manually instead of using std::lower_bound because 5055 // The end locations of entities may be unordered (when a macro expansion 5056 // is inside another macro argument), but for this case it is not important 5057 // whether we get the first macro expansion or its containing macro. 5058 while (Count > 0) { 5059 Half = Count / 2; 5060 PPI = First; 5061 std::advance(PPI, Half); 5062 if (SourceMgr.isBeforeInTranslationUnit(ReadSourceLocation(M, PPI->End), 5063 Loc)) { 5064 First = PPI; 5065 ++First; 5066 Count = Count - Half - 1; 5067 } else 5068 Count = Half; 5069 } 5070 } 5071 5072 if (PPI == pp_end) 5073 return findNextPreprocessedEntity(SLocMapI); 5074 5075 return M.BasePreprocessedEntityID + (PPI - pp_begin); 5076 } 5077 5078 /// \brief Returns a pair of [Begin, End) indices of preallocated 5079 /// preprocessed entities that \arg Range encompasses. 5080 std::pair<unsigned, unsigned> 5081 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 5082 if (Range.isInvalid()) 5083 return std::make_pair(0,0); 5084 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 5085 5086 PreprocessedEntityID BeginID = 5087 findPreprocessedEntity(Range.getBegin(), false); 5088 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true); 5089 return std::make_pair(BeginID, EndID); 5090 } 5091 5092 /// \brief Optionally returns true or false if the preallocated preprocessed 5093 /// entity with index \arg Index came from file \arg FID. 5094 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 5095 FileID FID) { 5096 if (FID.isInvalid()) 5097 return false; 5098 5099 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 5100 ModuleFile &M = *PPInfo.first; 5101 unsigned LocalIndex = PPInfo.second; 5102 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 5103 5104 SourceLocation Loc = ReadSourceLocation(M, PPOffs.Begin); 5105 if (Loc.isInvalid()) 5106 return false; 5107 5108 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 5109 return true; 5110 else 5111 return false; 5112 } 5113 5114 namespace { 5115 /// \brief Visitor used to search for information about a header file. 5116 class HeaderFileInfoVisitor { 5117 const FileEntry *FE; 5118 5119 Optional<HeaderFileInfo> HFI; 5120 5121 public: 5122 explicit HeaderFileInfoVisitor(const FileEntry *FE) 5123 : FE(FE) { } 5124 5125 static bool visit(ModuleFile &M, void *UserData) { 5126 HeaderFileInfoVisitor *This 5127 = static_cast<HeaderFileInfoVisitor *>(UserData); 5128 5129 HeaderFileInfoLookupTable *Table 5130 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 5131 if (!Table) 5132 return false; 5133 5134 // Look in the on-disk hash table for an entry for this file name. 5135 HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE); 5136 if (Pos == Table->end()) 5137 return false; 5138 5139 This->HFI = *Pos; 5140 return true; 5141 } 5142 5143 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 5144 }; 5145 } 5146 5147 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 5148 HeaderFileInfoVisitor Visitor(FE); 5149 ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor); 5150 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 5151 return *HFI; 5152 5153 return HeaderFileInfo(); 5154 } 5155 5156 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 5157 // FIXME: Make it work properly with modules. 5158 SmallVector<DiagnosticsEngine::DiagState *, 32> DiagStates; 5159 for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) { 5160 ModuleFile &F = *(*I); 5161 unsigned Idx = 0; 5162 DiagStates.clear(); 5163 assert(!Diag.DiagStates.empty()); 5164 DiagStates.push_back(&Diag.DiagStates.front()); // the command-line one. 5165 while (Idx < F.PragmaDiagMappings.size()) { 5166 SourceLocation Loc = ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 5167 unsigned DiagStateID = F.PragmaDiagMappings[Idx++]; 5168 if (DiagStateID != 0) { 5169 Diag.DiagStatePoints.push_back( 5170 DiagnosticsEngine::DiagStatePoint(DiagStates[DiagStateID-1], 5171 FullSourceLoc(Loc, SourceMgr))); 5172 continue; 5173 } 5174 5175 assert(DiagStateID == 0); 5176 // A new DiagState was created here. 5177 Diag.DiagStates.push_back(*Diag.GetCurDiagState()); 5178 DiagnosticsEngine::DiagState *NewState = &Diag.DiagStates.back(); 5179 DiagStates.push_back(NewState); 5180 Diag.DiagStatePoints.push_back( 5181 DiagnosticsEngine::DiagStatePoint(NewState, 5182 FullSourceLoc(Loc, SourceMgr))); 5183 while (1) { 5184 assert(Idx < F.PragmaDiagMappings.size() && 5185 "Invalid data, didn't find '-1' marking end of diag/map pairs"); 5186 if (Idx >= F.PragmaDiagMappings.size()) { 5187 break; // Something is messed up but at least avoid infinite loop in 5188 // release build. 5189 } 5190 unsigned DiagID = F.PragmaDiagMappings[Idx++]; 5191 if (DiagID == (unsigned)-1) { 5192 break; // no more diag/map pairs for this location. 5193 } 5194 diag::Severity Map = (diag::Severity)F.PragmaDiagMappings[Idx++]; 5195 DiagnosticMapping Mapping = Diag.makeUserMapping(Map, Loc); 5196 Diag.GetCurDiagState()->setMapping(DiagID, Mapping); 5197 } 5198 } 5199 } 5200 } 5201 5202 /// \brief Get the correct cursor and offset for loading a type. 5203 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 5204 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 5205 assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 5206 ModuleFile *M = I->second; 5207 return RecordLocation(M, M->TypeOffsets[Index - M->BaseTypeIndex]); 5208 } 5209 5210 /// \brief Read and return the type with the given index.. 5211 /// 5212 /// The index is the type ID, shifted and minus the number of predefs. This 5213 /// routine actually reads the record corresponding to the type at the given 5214 /// location. It is a helper routine for GetType, which deals with reading type 5215 /// IDs. 5216 QualType ASTReader::readTypeRecord(unsigned Index) { 5217 RecordLocation Loc = TypeCursorForIndex(Index); 5218 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 5219 5220 // Keep track of where we are in the stream, then jump back there 5221 // after reading this type. 5222 SavedStreamPosition SavedPosition(DeclsCursor); 5223 5224 ReadingKindTracker ReadingKind(Read_Type, *this); 5225 5226 // Note that we are loading a type record. 5227 Deserializing AType(this); 5228 5229 unsigned Idx = 0; 5230 DeclsCursor.JumpToBit(Loc.Offset); 5231 RecordData Record; 5232 unsigned Code = DeclsCursor.ReadCode(); 5233 switch ((TypeCode)DeclsCursor.readRecord(Code, Record)) { 5234 case TYPE_EXT_QUAL: { 5235 if (Record.size() != 2) { 5236 Error("Incorrect encoding of extended qualifier type"); 5237 return QualType(); 5238 } 5239 QualType Base = readType(*Loc.F, Record, Idx); 5240 Qualifiers Quals = Qualifiers::fromOpaqueValue(Record[Idx++]); 5241 return Context.getQualifiedType(Base, Quals); 5242 } 5243 5244 case TYPE_COMPLEX: { 5245 if (Record.size() != 1) { 5246 Error("Incorrect encoding of complex type"); 5247 return QualType(); 5248 } 5249 QualType ElemType = readType(*Loc.F, Record, Idx); 5250 return Context.getComplexType(ElemType); 5251 } 5252 5253 case TYPE_POINTER: { 5254 if (Record.size() != 1) { 5255 Error("Incorrect encoding of pointer type"); 5256 return QualType(); 5257 } 5258 QualType PointeeType = readType(*Loc.F, Record, Idx); 5259 return Context.getPointerType(PointeeType); 5260 } 5261 5262 case TYPE_DECAYED: { 5263 if (Record.size() != 1) { 5264 Error("Incorrect encoding of decayed type"); 5265 return QualType(); 5266 } 5267 QualType OriginalType = readType(*Loc.F, Record, Idx); 5268 QualType DT = Context.getAdjustedParameterType(OriginalType); 5269 if (!isa<DecayedType>(DT)) 5270 Error("Decayed type does not decay"); 5271 return DT; 5272 } 5273 5274 case TYPE_ADJUSTED: { 5275 if (Record.size() != 2) { 5276 Error("Incorrect encoding of adjusted type"); 5277 return QualType(); 5278 } 5279 QualType OriginalTy = readType(*Loc.F, Record, Idx); 5280 QualType AdjustedTy = readType(*Loc.F, Record, Idx); 5281 return Context.getAdjustedType(OriginalTy, AdjustedTy); 5282 } 5283 5284 case TYPE_BLOCK_POINTER: { 5285 if (Record.size() != 1) { 5286 Error("Incorrect encoding of block pointer type"); 5287 return QualType(); 5288 } 5289 QualType PointeeType = readType(*Loc.F, Record, Idx); 5290 return Context.getBlockPointerType(PointeeType); 5291 } 5292 5293 case TYPE_LVALUE_REFERENCE: { 5294 if (Record.size() != 2) { 5295 Error("Incorrect encoding of lvalue reference type"); 5296 return QualType(); 5297 } 5298 QualType PointeeType = readType(*Loc.F, Record, Idx); 5299 return Context.getLValueReferenceType(PointeeType, Record[1]); 5300 } 5301 5302 case TYPE_RVALUE_REFERENCE: { 5303 if (Record.size() != 1) { 5304 Error("Incorrect encoding of rvalue reference type"); 5305 return QualType(); 5306 } 5307 QualType PointeeType = readType(*Loc.F, Record, Idx); 5308 return Context.getRValueReferenceType(PointeeType); 5309 } 5310 5311 case TYPE_MEMBER_POINTER: { 5312 if (Record.size() != 2) { 5313 Error("Incorrect encoding of member pointer type"); 5314 return QualType(); 5315 } 5316 QualType PointeeType = readType(*Loc.F, Record, Idx); 5317 QualType ClassType = readType(*Loc.F, Record, Idx); 5318 if (PointeeType.isNull() || ClassType.isNull()) 5319 return QualType(); 5320 5321 return Context.getMemberPointerType(PointeeType, ClassType.getTypePtr()); 5322 } 5323 5324 case TYPE_CONSTANT_ARRAY: { 5325 QualType ElementType = readType(*Loc.F, Record, Idx); 5326 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 5327 unsigned IndexTypeQuals = Record[2]; 5328 unsigned Idx = 3; 5329 llvm::APInt Size = ReadAPInt(Record, Idx); 5330 return Context.getConstantArrayType(ElementType, Size, 5331 ASM, IndexTypeQuals); 5332 } 5333 5334 case TYPE_INCOMPLETE_ARRAY: { 5335 QualType ElementType = readType(*Loc.F, Record, Idx); 5336 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 5337 unsigned IndexTypeQuals = Record[2]; 5338 return Context.getIncompleteArrayType(ElementType, ASM, IndexTypeQuals); 5339 } 5340 5341 case TYPE_VARIABLE_ARRAY: { 5342 QualType ElementType = readType(*Loc.F, Record, Idx); 5343 ArrayType::ArraySizeModifier ASM = (ArrayType::ArraySizeModifier)Record[1]; 5344 unsigned IndexTypeQuals = Record[2]; 5345 SourceLocation LBLoc = ReadSourceLocation(*Loc.F, Record[3]); 5346 SourceLocation RBLoc = ReadSourceLocation(*Loc.F, Record[4]); 5347 return Context.getVariableArrayType(ElementType, ReadExpr(*Loc.F), 5348 ASM, IndexTypeQuals, 5349 SourceRange(LBLoc, RBLoc)); 5350 } 5351 5352 case TYPE_VECTOR: { 5353 if (Record.size() != 3) { 5354 Error("incorrect encoding of vector type in AST file"); 5355 return QualType(); 5356 } 5357 5358 QualType ElementType = readType(*Loc.F, Record, Idx); 5359 unsigned NumElements = Record[1]; 5360 unsigned VecKind = Record[2]; 5361 return Context.getVectorType(ElementType, NumElements, 5362 (VectorType::VectorKind)VecKind); 5363 } 5364 5365 case TYPE_EXT_VECTOR: { 5366 if (Record.size() != 3) { 5367 Error("incorrect encoding of extended vector type in AST file"); 5368 return QualType(); 5369 } 5370 5371 QualType ElementType = readType(*Loc.F, Record, Idx); 5372 unsigned NumElements = Record[1]; 5373 return Context.getExtVectorType(ElementType, NumElements); 5374 } 5375 5376 case TYPE_FUNCTION_NO_PROTO: { 5377 if (Record.size() != 6) { 5378 Error("incorrect encoding of no-proto function type"); 5379 return QualType(); 5380 } 5381 QualType ResultType = readType(*Loc.F, Record, Idx); 5382 FunctionType::ExtInfo Info(Record[1], Record[2], Record[3], 5383 (CallingConv)Record[4], Record[5]); 5384 return Context.getFunctionNoProtoType(ResultType, Info); 5385 } 5386 5387 case TYPE_FUNCTION_PROTO: { 5388 QualType ResultType = readType(*Loc.F, Record, Idx); 5389 5390 FunctionProtoType::ExtProtoInfo EPI; 5391 EPI.ExtInfo = FunctionType::ExtInfo(/*noreturn*/ Record[1], 5392 /*hasregparm*/ Record[2], 5393 /*regparm*/ Record[3], 5394 static_cast<CallingConv>(Record[4]), 5395 /*produces*/ Record[5]); 5396 5397 unsigned Idx = 6; 5398 5399 EPI.Variadic = Record[Idx++]; 5400 EPI.HasTrailingReturn = Record[Idx++]; 5401 EPI.TypeQuals = Record[Idx++]; 5402 EPI.RefQualifier = static_cast<RefQualifierKind>(Record[Idx++]); 5403 SmallVector<QualType, 8> ExceptionStorage; 5404 readExceptionSpec(*Loc.F, ExceptionStorage, EPI.ExceptionSpec, Record, Idx); 5405 5406 unsigned NumParams = Record[Idx++]; 5407 SmallVector<QualType, 16> ParamTypes; 5408 for (unsigned I = 0; I != NumParams; ++I) 5409 ParamTypes.push_back(readType(*Loc.F, Record, Idx)); 5410 5411 return Context.getFunctionType(ResultType, ParamTypes, EPI); 5412 } 5413 5414 case TYPE_UNRESOLVED_USING: { 5415 unsigned Idx = 0; 5416 return Context.getTypeDeclType( 5417 ReadDeclAs<UnresolvedUsingTypenameDecl>(*Loc.F, Record, Idx)); 5418 } 5419 5420 case TYPE_TYPEDEF: { 5421 if (Record.size() != 2) { 5422 Error("incorrect encoding of typedef type"); 5423 return QualType(); 5424 } 5425 unsigned Idx = 0; 5426 TypedefNameDecl *Decl = ReadDeclAs<TypedefNameDecl>(*Loc.F, Record, Idx); 5427 QualType Canonical = readType(*Loc.F, Record, Idx); 5428 if (!Canonical.isNull()) 5429 Canonical = Context.getCanonicalType(Canonical); 5430 return Context.getTypedefType(Decl, Canonical); 5431 } 5432 5433 case TYPE_TYPEOF_EXPR: 5434 return Context.getTypeOfExprType(ReadExpr(*Loc.F)); 5435 5436 case TYPE_TYPEOF: { 5437 if (Record.size() != 1) { 5438 Error("incorrect encoding of typeof(type) in AST file"); 5439 return QualType(); 5440 } 5441 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 5442 return Context.getTypeOfType(UnderlyingType); 5443 } 5444 5445 case TYPE_DECLTYPE: { 5446 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 5447 return Context.getDecltypeType(ReadExpr(*Loc.F), UnderlyingType); 5448 } 5449 5450 case TYPE_UNARY_TRANSFORM: { 5451 QualType BaseType = readType(*Loc.F, Record, Idx); 5452 QualType UnderlyingType = readType(*Loc.F, Record, Idx); 5453 UnaryTransformType::UTTKind UKind = (UnaryTransformType::UTTKind)Record[2]; 5454 return Context.getUnaryTransformType(BaseType, UnderlyingType, UKind); 5455 } 5456 5457 case TYPE_AUTO: { 5458 QualType Deduced = readType(*Loc.F, Record, Idx); 5459 bool IsDecltypeAuto = Record[Idx++]; 5460 bool IsDependent = Deduced.isNull() ? Record[Idx++] : false; 5461 return Context.getAutoType(Deduced, IsDecltypeAuto, IsDependent); 5462 } 5463 5464 case TYPE_RECORD: { 5465 if (Record.size() != 2) { 5466 Error("incorrect encoding of record type"); 5467 return QualType(); 5468 } 5469 unsigned Idx = 0; 5470 bool IsDependent = Record[Idx++]; 5471 RecordDecl *RD = ReadDeclAs<RecordDecl>(*Loc.F, Record, Idx); 5472 RD = cast_or_null<RecordDecl>(RD->getCanonicalDecl()); 5473 QualType T = Context.getRecordType(RD); 5474 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 5475 return T; 5476 } 5477 5478 case TYPE_ENUM: { 5479 if (Record.size() != 2) { 5480 Error("incorrect encoding of enum type"); 5481 return QualType(); 5482 } 5483 unsigned Idx = 0; 5484 bool IsDependent = Record[Idx++]; 5485 QualType T 5486 = Context.getEnumType(ReadDeclAs<EnumDecl>(*Loc.F, Record, Idx)); 5487 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 5488 return T; 5489 } 5490 5491 case TYPE_ATTRIBUTED: { 5492 if (Record.size() != 3) { 5493 Error("incorrect encoding of attributed type"); 5494 return QualType(); 5495 } 5496 QualType modifiedType = readType(*Loc.F, Record, Idx); 5497 QualType equivalentType = readType(*Loc.F, Record, Idx); 5498 AttributedType::Kind kind = static_cast<AttributedType::Kind>(Record[2]); 5499 return Context.getAttributedType(kind, modifiedType, equivalentType); 5500 } 5501 5502 case TYPE_PAREN: { 5503 if (Record.size() != 1) { 5504 Error("incorrect encoding of paren type"); 5505 return QualType(); 5506 } 5507 QualType InnerType = readType(*Loc.F, Record, Idx); 5508 return Context.getParenType(InnerType); 5509 } 5510 5511 case TYPE_PACK_EXPANSION: { 5512 if (Record.size() != 2) { 5513 Error("incorrect encoding of pack expansion type"); 5514 return QualType(); 5515 } 5516 QualType Pattern = readType(*Loc.F, Record, Idx); 5517 if (Pattern.isNull()) 5518 return QualType(); 5519 Optional<unsigned> NumExpansions; 5520 if (Record[1]) 5521 NumExpansions = Record[1] - 1; 5522 return Context.getPackExpansionType(Pattern, NumExpansions); 5523 } 5524 5525 case TYPE_ELABORATED: { 5526 unsigned Idx = 0; 5527 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 5528 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 5529 QualType NamedType = readType(*Loc.F, Record, Idx); 5530 return Context.getElaboratedType(Keyword, NNS, NamedType); 5531 } 5532 5533 case TYPE_OBJC_INTERFACE: { 5534 unsigned Idx = 0; 5535 ObjCInterfaceDecl *ItfD 5536 = ReadDeclAs<ObjCInterfaceDecl>(*Loc.F, Record, Idx); 5537 return Context.getObjCInterfaceType(ItfD->getCanonicalDecl()); 5538 } 5539 5540 case TYPE_OBJC_OBJECT: { 5541 unsigned Idx = 0; 5542 QualType Base = readType(*Loc.F, Record, Idx); 5543 unsigned NumProtos = Record[Idx++]; 5544 SmallVector<ObjCProtocolDecl*, 4> Protos; 5545 for (unsigned I = 0; I != NumProtos; ++I) 5546 Protos.push_back(ReadDeclAs<ObjCProtocolDecl>(*Loc.F, Record, Idx)); 5547 return Context.getObjCObjectType(Base, Protos.data(), NumProtos); 5548 } 5549 5550 case TYPE_OBJC_OBJECT_POINTER: { 5551 unsigned Idx = 0; 5552 QualType Pointee = readType(*Loc.F, Record, Idx); 5553 return Context.getObjCObjectPointerType(Pointee); 5554 } 5555 5556 case TYPE_SUBST_TEMPLATE_TYPE_PARM: { 5557 unsigned Idx = 0; 5558 QualType Parm = readType(*Loc.F, Record, Idx); 5559 QualType Replacement = readType(*Loc.F, Record, Idx); 5560 return Context.getSubstTemplateTypeParmType( 5561 cast<TemplateTypeParmType>(Parm), 5562 Context.getCanonicalType(Replacement)); 5563 } 5564 5565 case TYPE_SUBST_TEMPLATE_TYPE_PARM_PACK: { 5566 unsigned Idx = 0; 5567 QualType Parm = readType(*Loc.F, Record, Idx); 5568 TemplateArgument ArgPack = ReadTemplateArgument(*Loc.F, Record, Idx); 5569 return Context.getSubstTemplateTypeParmPackType( 5570 cast<TemplateTypeParmType>(Parm), 5571 ArgPack); 5572 } 5573 5574 case TYPE_INJECTED_CLASS_NAME: { 5575 CXXRecordDecl *D = ReadDeclAs<CXXRecordDecl>(*Loc.F, Record, Idx); 5576 QualType TST = readType(*Loc.F, Record, Idx); // probably derivable 5577 // FIXME: ASTContext::getInjectedClassNameType is not currently suitable 5578 // for AST reading, too much interdependencies. 5579 const Type *T = nullptr; 5580 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) { 5581 if (const Type *Existing = DI->getTypeForDecl()) { 5582 T = Existing; 5583 break; 5584 } 5585 } 5586 if (!T) { 5587 T = new (Context, TypeAlignment) InjectedClassNameType(D, TST); 5588 for (auto *DI = D; DI; DI = DI->getPreviousDecl()) 5589 DI->setTypeForDecl(T); 5590 } 5591 return QualType(T, 0); 5592 } 5593 5594 case TYPE_TEMPLATE_TYPE_PARM: { 5595 unsigned Idx = 0; 5596 unsigned Depth = Record[Idx++]; 5597 unsigned Index = Record[Idx++]; 5598 bool Pack = Record[Idx++]; 5599 TemplateTypeParmDecl *D 5600 = ReadDeclAs<TemplateTypeParmDecl>(*Loc.F, Record, Idx); 5601 return Context.getTemplateTypeParmType(Depth, Index, Pack, D); 5602 } 5603 5604 case TYPE_DEPENDENT_NAME: { 5605 unsigned Idx = 0; 5606 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 5607 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 5608 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx); 5609 QualType Canon = readType(*Loc.F, Record, Idx); 5610 if (!Canon.isNull()) 5611 Canon = Context.getCanonicalType(Canon); 5612 return Context.getDependentNameType(Keyword, NNS, Name, Canon); 5613 } 5614 5615 case TYPE_DEPENDENT_TEMPLATE_SPECIALIZATION: { 5616 unsigned Idx = 0; 5617 ElaboratedTypeKeyword Keyword = (ElaboratedTypeKeyword)Record[Idx++]; 5618 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(*Loc.F, Record, Idx); 5619 const IdentifierInfo *Name = this->GetIdentifierInfo(*Loc.F, Record, Idx); 5620 unsigned NumArgs = Record[Idx++]; 5621 SmallVector<TemplateArgument, 8> Args; 5622 Args.reserve(NumArgs); 5623 while (NumArgs--) 5624 Args.push_back(ReadTemplateArgument(*Loc.F, Record, Idx)); 5625 return Context.getDependentTemplateSpecializationType(Keyword, NNS, Name, 5626 Args.size(), Args.data()); 5627 } 5628 5629 case TYPE_DEPENDENT_SIZED_ARRAY: { 5630 unsigned Idx = 0; 5631 5632 // ArrayType 5633 QualType ElementType = readType(*Loc.F, Record, Idx); 5634 ArrayType::ArraySizeModifier ASM 5635 = (ArrayType::ArraySizeModifier)Record[Idx++]; 5636 unsigned IndexTypeQuals = Record[Idx++]; 5637 5638 // DependentSizedArrayType 5639 Expr *NumElts = ReadExpr(*Loc.F); 5640 SourceRange Brackets = ReadSourceRange(*Loc.F, Record, Idx); 5641 5642 return Context.getDependentSizedArrayType(ElementType, NumElts, ASM, 5643 IndexTypeQuals, Brackets); 5644 } 5645 5646 case TYPE_TEMPLATE_SPECIALIZATION: { 5647 unsigned Idx = 0; 5648 bool IsDependent = Record[Idx++]; 5649 TemplateName Name = ReadTemplateName(*Loc.F, Record, Idx); 5650 SmallVector<TemplateArgument, 8> Args; 5651 ReadTemplateArgumentList(Args, *Loc.F, Record, Idx); 5652 QualType Underlying = readType(*Loc.F, Record, Idx); 5653 QualType T; 5654 if (Underlying.isNull()) 5655 T = Context.getCanonicalTemplateSpecializationType(Name, Args.data(), 5656 Args.size()); 5657 else 5658 T = Context.getTemplateSpecializationType(Name, Args.data(), 5659 Args.size(), Underlying); 5660 const_cast<Type*>(T.getTypePtr())->setDependent(IsDependent); 5661 return T; 5662 } 5663 5664 case TYPE_ATOMIC: { 5665 if (Record.size() != 1) { 5666 Error("Incorrect encoding of atomic type"); 5667 return QualType(); 5668 } 5669 QualType ValueType = readType(*Loc.F, Record, Idx); 5670 return Context.getAtomicType(ValueType); 5671 } 5672 } 5673 llvm_unreachable("Invalid TypeCode!"); 5674 } 5675 5676 void ASTReader::readExceptionSpec(ModuleFile &ModuleFile, 5677 SmallVectorImpl<QualType> &Exceptions, 5678 FunctionProtoType::ExceptionSpecInfo &ESI, 5679 const RecordData &Record, unsigned &Idx) { 5680 ExceptionSpecificationType EST = 5681 static_cast<ExceptionSpecificationType>(Record[Idx++]); 5682 ESI.Type = EST; 5683 if (EST == EST_Dynamic) { 5684 for (unsigned I = 0, N = Record[Idx++]; I != N; ++I) 5685 Exceptions.push_back(readType(ModuleFile, Record, Idx)); 5686 ESI.Exceptions = Exceptions; 5687 } else if (EST == EST_ComputedNoexcept) { 5688 ESI.NoexceptExpr = ReadExpr(ModuleFile); 5689 } else if (EST == EST_Uninstantiated) { 5690 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx); 5691 ESI.SourceTemplate = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx); 5692 } else if (EST == EST_Unevaluated) { 5693 ESI.SourceDecl = ReadDeclAs<FunctionDecl>(ModuleFile, Record, Idx); 5694 } 5695 } 5696 5697 class clang::TypeLocReader : public TypeLocVisitor<TypeLocReader> { 5698 ASTReader &Reader; 5699 ModuleFile &F; 5700 const ASTReader::RecordData &Record; 5701 unsigned &Idx; 5702 5703 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R, 5704 unsigned &I) { 5705 return Reader.ReadSourceLocation(F, R, I); 5706 } 5707 5708 template<typename T> 5709 T *ReadDeclAs(const ASTReader::RecordData &Record, unsigned &Idx) { 5710 return Reader.ReadDeclAs<T>(F, Record, Idx); 5711 } 5712 5713 public: 5714 TypeLocReader(ASTReader &Reader, ModuleFile &F, 5715 const ASTReader::RecordData &Record, unsigned &Idx) 5716 : Reader(Reader), F(F), Record(Record), Idx(Idx) 5717 { } 5718 5719 // We want compile-time assurance that we've enumerated all of 5720 // these, so unfortunately we have to declare them first, then 5721 // define them out-of-line. 5722 #define ABSTRACT_TYPELOC(CLASS, PARENT) 5723 #define TYPELOC(CLASS, PARENT) \ 5724 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 5725 #include "clang/AST/TypeLocNodes.def" 5726 5727 void VisitFunctionTypeLoc(FunctionTypeLoc); 5728 void VisitArrayTypeLoc(ArrayTypeLoc); 5729 }; 5730 5731 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 5732 // nothing to do 5733 } 5734 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 5735 TL.setBuiltinLoc(ReadSourceLocation(Record, Idx)); 5736 if (TL.needsExtraLocalData()) { 5737 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Record[Idx++])); 5738 TL.setWrittenSignSpec(static_cast<DeclSpec::TSS>(Record[Idx++])); 5739 TL.setWrittenWidthSpec(static_cast<DeclSpec::TSW>(Record[Idx++])); 5740 TL.setModeAttr(Record[Idx++]); 5741 } 5742 } 5743 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 5744 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5745 } 5746 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 5747 TL.setStarLoc(ReadSourceLocation(Record, Idx)); 5748 } 5749 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 5750 // nothing to do 5751 } 5752 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 5753 // nothing to do 5754 } 5755 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 5756 TL.setCaretLoc(ReadSourceLocation(Record, Idx)); 5757 } 5758 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 5759 TL.setAmpLoc(ReadSourceLocation(Record, Idx)); 5760 } 5761 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 5762 TL.setAmpAmpLoc(ReadSourceLocation(Record, Idx)); 5763 } 5764 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 5765 TL.setStarLoc(ReadSourceLocation(Record, Idx)); 5766 TL.setClassTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 5767 } 5768 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 5769 TL.setLBracketLoc(ReadSourceLocation(Record, Idx)); 5770 TL.setRBracketLoc(ReadSourceLocation(Record, Idx)); 5771 if (Record[Idx++]) 5772 TL.setSizeExpr(Reader.ReadExpr(F)); 5773 else 5774 TL.setSizeExpr(nullptr); 5775 } 5776 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 5777 VisitArrayTypeLoc(TL); 5778 } 5779 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 5780 VisitArrayTypeLoc(TL); 5781 } 5782 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 5783 VisitArrayTypeLoc(TL); 5784 } 5785 void TypeLocReader::VisitDependentSizedArrayTypeLoc( 5786 DependentSizedArrayTypeLoc TL) { 5787 VisitArrayTypeLoc(TL); 5788 } 5789 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 5790 DependentSizedExtVectorTypeLoc TL) { 5791 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5792 } 5793 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 5794 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5795 } 5796 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 5797 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5798 } 5799 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 5800 TL.setLocalRangeBegin(ReadSourceLocation(Record, Idx)); 5801 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5802 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5803 TL.setLocalRangeEnd(ReadSourceLocation(Record, Idx)); 5804 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) { 5805 TL.setParam(i, ReadDeclAs<ParmVarDecl>(Record, Idx)); 5806 } 5807 } 5808 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 5809 VisitFunctionTypeLoc(TL); 5810 } 5811 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 5812 VisitFunctionTypeLoc(TL); 5813 } 5814 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 5815 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5816 } 5817 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 5818 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5819 } 5820 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 5821 TL.setTypeofLoc(ReadSourceLocation(Record, Idx)); 5822 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5823 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5824 } 5825 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 5826 TL.setTypeofLoc(ReadSourceLocation(Record, Idx)); 5827 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5828 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5829 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 5830 } 5831 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 5832 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5833 } 5834 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 5835 TL.setKWLoc(ReadSourceLocation(Record, Idx)); 5836 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5837 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5838 TL.setUnderlyingTInfo(Reader.GetTypeSourceInfo(F, Record, Idx)); 5839 } 5840 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 5841 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5842 } 5843 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 5844 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5845 } 5846 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 5847 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5848 } 5849 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 5850 TL.setAttrNameLoc(ReadSourceLocation(Record, Idx)); 5851 if (TL.hasAttrOperand()) { 5852 SourceRange range; 5853 range.setBegin(ReadSourceLocation(Record, Idx)); 5854 range.setEnd(ReadSourceLocation(Record, Idx)); 5855 TL.setAttrOperandParensRange(range); 5856 } 5857 if (TL.hasAttrExprOperand()) { 5858 if (Record[Idx++]) 5859 TL.setAttrExprOperand(Reader.ReadExpr(F)); 5860 else 5861 TL.setAttrExprOperand(nullptr); 5862 } else if (TL.hasAttrEnumOperand()) 5863 TL.setAttrEnumOperandLoc(ReadSourceLocation(Record, Idx)); 5864 } 5865 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 5866 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5867 } 5868 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 5869 SubstTemplateTypeParmTypeLoc TL) { 5870 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5871 } 5872 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 5873 SubstTemplateTypeParmPackTypeLoc TL) { 5874 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5875 } 5876 void TypeLocReader::VisitTemplateSpecializationTypeLoc( 5877 TemplateSpecializationTypeLoc TL) { 5878 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx)); 5879 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx)); 5880 TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 5881 TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 5882 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 5883 TL.setArgLocInfo(i, 5884 Reader.GetTemplateArgumentLocInfo(F, 5885 TL.getTypePtr()->getArg(i).getKind(), 5886 Record, Idx)); 5887 } 5888 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 5889 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5890 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5891 } 5892 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 5893 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 5894 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 5895 } 5896 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 5897 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5898 } 5899 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 5900 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 5901 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 5902 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5903 } 5904 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 5905 DependentTemplateSpecializationTypeLoc TL) { 5906 TL.setElaboratedKeywordLoc(ReadSourceLocation(Record, Idx)); 5907 TL.setQualifierLoc(Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 5908 TL.setTemplateKeywordLoc(ReadSourceLocation(Record, Idx)); 5909 TL.setTemplateNameLoc(ReadSourceLocation(Record, Idx)); 5910 TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 5911 TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 5912 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 5913 TL.setArgLocInfo(I, 5914 Reader.GetTemplateArgumentLocInfo(F, 5915 TL.getTypePtr()->getArg(I).getKind(), 5916 Record, Idx)); 5917 } 5918 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 5919 TL.setEllipsisLoc(ReadSourceLocation(Record, Idx)); 5920 } 5921 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 5922 TL.setNameLoc(ReadSourceLocation(Record, Idx)); 5923 } 5924 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 5925 TL.setHasBaseTypeAsWritten(Record[Idx++]); 5926 TL.setLAngleLoc(ReadSourceLocation(Record, Idx)); 5927 TL.setRAngleLoc(ReadSourceLocation(Record, Idx)); 5928 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 5929 TL.setProtocolLoc(i, ReadSourceLocation(Record, Idx)); 5930 } 5931 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 5932 TL.setStarLoc(ReadSourceLocation(Record, Idx)); 5933 } 5934 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 5935 TL.setKWLoc(ReadSourceLocation(Record, Idx)); 5936 TL.setLParenLoc(ReadSourceLocation(Record, Idx)); 5937 TL.setRParenLoc(ReadSourceLocation(Record, Idx)); 5938 } 5939 5940 TypeSourceInfo *ASTReader::GetTypeSourceInfo(ModuleFile &F, 5941 const RecordData &Record, 5942 unsigned &Idx) { 5943 QualType InfoTy = readType(F, Record, Idx); 5944 if (InfoTy.isNull()) 5945 return nullptr; 5946 5947 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 5948 TypeLocReader TLR(*this, F, Record, Idx); 5949 for (TypeLoc TL = TInfo->getTypeLoc(); !TL.isNull(); TL = TL.getNextTypeLoc()) 5950 TLR.Visit(TL); 5951 return TInfo; 5952 } 5953 5954 QualType ASTReader::GetType(TypeID ID) { 5955 unsigned FastQuals = ID & Qualifiers::FastMask; 5956 unsigned Index = ID >> Qualifiers::FastWidth; 5957 5958 if (Index < NUM_PREDEF_TYPE_IDS) { 5959 QualType T; 5960 switch ((PredefinedTypeIDs)Index) { 5961 case PREDEF_TYPE_NULL_ID: return QualType(); 5962 case PREDEF_TYPE_VOID_ID: T = Context.VoidTy; break; 5963 case PREDEF_TYPE_BOOL_ID: T = Context.BoolTy; break; 5964 5965 case PREDEF_TYPE_CHAR_U_ID: 5966 case PREDEF_TYPE_CHAR_S_ID: 5967 // FIXME: Check that the signedness of CharTy is correct! 5968 T = Context.CharTy; 5969 break; 5970 5971 case PREDEF_TYPE_UCHAR_ID: T = Context.UnsignedCharTy; break; 5972 case PREDEF_TYPE_USHORT_ID: T = Context.UnsignedShortTy; break; 5973 case PREDEF_TYPE_UINT_ID: T = Context.UnsignedIntTy; break; 5974 case PREDEF_TYPE_ULONG_ID: T = Context.UnsignedLongTy; break; 5975 case PREDEF_TYPE_ULONGLONG_ID: T = Context.UnsignedLongLongTy; break; 5976 case PREDEF_TYPE_UINT128_ID: T = Context.UnsignedInt128Ty; break; 5977 case PREDEF_TYPE_SCHAR_ID: T = Context.SignedCharTy; break; 5978 case PREDEF_TYPE_WCHAR_ID: T = Context.WCharTy; break; 5979 case PREDEF_TYPE_SHORT_ID: T = Context.ShortTy; break; 5980 case PREDEF_TYPE_INT_ID: T = Context.IntTy; break; 5981 case PREDEF_TYPE_LONG_ID: T = Context.LongTy; break; 5982 case PREDEF_TYPE_LONGLONG_ID: T = Context.LongLongTy; break; 5983 case PREDEF_TYPE_INT128_ID: T = Context.Int128Ty; break; 5984 case PREDEF_TYPE_HALF_ID: T = Context.HalfTy; break; 5985 case PREDEF_TYPE_FLOAT_ID: T = Context.FloatTy; break; 5986 case PREDEF_TYPE_DOUBLE_ID: T = Context.DoubleTy; break; 5987 case PREDEF_TYPE_LONGDOUBLE_ID: T = Context.LongDoubleTy; break; 5988 case PREDEF_TYPE_OVERLOAD_ID: T = Context.OverloadTy; break; 5989 case PREDEF_TYPE_BOUND_MEMBER: T = Context.BoundMemberTy; break; 5990 case PREDEF_TYPE_PSEUDO_OBJECT: T = Context.PseudoObjectTy; break; 5991 case PREDEF_TYPE_DEPENDENT_ID: T = Context.DependentTy; break; 5992 case PREDEF_TYPE_UNKNOWN_ANY: T = Context.UnknownAnyTy; break; 5993 case PREDEF_TYPE_NULLPTR_ID: T = Context.NullPtrTy; break; 5994 case PREDEF_TYPE_CHAR16_ID: T = Context.Char16Ty; break; 5995 case PREDEF_TYPE_CHAR32_ID: T = Context.Char32Ty; break; 5996 case PREDEF_TYPE_OBJC_ID: T = Context.ObjCBuiltinIdTy; break; 5997 case PREDEF_TYPE_OBJC_CLASS: T = Context.ObjCBuiltinClassTy; break; 5998 case PREDEF_TYPE_OBJC_SEL: T = Context.ObjCBuiltinSelTy; break; 5999 case PREDEF_TYPE_IMAGE1D_ID: T = Context.OCLImage1dTy; break; 6000 case PREDEF_TYPE_IMAGE1D_ARR_ID: T = Context.OCLImage1dArrayTy; break; 6001 case PREDEF_TYPE_IMAGE1D_BUFF_ID: T = Context.OCLImage1dBufferTy; break; 6002 case PREDEF_TYPE_IMAGE2D_ID: T = Context.OCLImage2dTy; break; 6003 case PREDEF_TYPE_IMAGE2D_ARR_ID: T = Context.OCLImage2dArrayTy; break; 6004 case PREDEF_TYPE_IMAGE3D_ID: T = Context.OCLImage3dTy; break; 6005 case PREDEF_TYPE_SAMPLER_ID: T = Context.OCLSamplerTy; break; 6006 case PREDEF_TYPE_EVENT_ID: T = Context.OCLEventTy; break; 6007 case PREDEF_TYPE_AUTO_DEDUCT: T = Context.getAutoDeductType(); break; 6008 6009 case PREDEF_TYPE_AUTO_RREF_DEDUCT: 6010 T = Context.getAutoRRefDeductType(); 6011 break; 6012 6013 case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 6014 T = Context.ARCUnbridgedCastTy; 6015 break; 6016 6017 case PREDEF_TYPE_VA_LIST_TAG: 6018 T = Context.getVaListTagType(); 6019 break; 6020 6021 case PREDEF_TYPE_BUILTIN_FN: 6022 T = Context.BuiltinFnTy; 6023 break; 6024 } 6025 6026 assert(!T.isNull() && "Unknown predefined type"); 6027 return T.withFastQualifiers(FastQuals); 6028 } 6029 6030 Index -= NUM_PREDEF_TYPE_IDS; 6031 assert(Index < TypesLoaded.size() && "Type index out-of-range"); 6032 if (TypesLoaded[Index].isNull()) { 6033 TypesLoaded[Index] = readTypeRecord(Index); 6034 if (TypesLoaded[Index].isNull()) 6035 return QualType(); 6036 6037 TypesLoaded[Index]->setFromAST(); 6038 if (DeserializationListener) 6039 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 6040 TypesLoaded[Index]); 6041 } 6042 6043 return TypesLoaded[Index].withFastQualifiers(FastQuals); 6044 } 6045 6046 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 6047 return GetType(getGlobalTypeID(F, LocalID)); 6048 } 6049 6050 serialization::TypeID 6051 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 6052 unsigned FastQuals = LocalID & Qualifiers::FastMask; 6053 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 6054 6055 if (LocalIndex < NUM_PREDEF_TYPE_IDS) 6056 return LocalID; 6057 6058 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6059 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 6060 assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 6061 6062 unsigned GlobalIndex = LocalIndex + I->second; 6063 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 6064 } 6065 6066 TemplateArgumentLocInfo 6067 ASTReader::GetTemplateArgumentLocInfo(ModuleFile &F, 6068 TemplateArgument::ArgKind Kind, 6069 const RecordData &Record, 6070 unsigned &Index) { 6071 switch (Kind) { 6072 case TemplateArgument::Expression: 6073 return ReadExpr(F); 6074 case TemplateArgument::Type: 6075 return GetTypeSourceInfo(F, Record, Index); 6076 case TemplateArgument::Template: { 6077 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 6078 Index); 6079 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 6080 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 6081 SourceLocation()); 6082 } 6083 case TemplateArgument::TemplateExpansion: { 6084 NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, 6085 Index); 6086 SourceLocation TemplateNameLoc = ReadSourceLocation(F, Record, Index); 6087 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Index); 6088 return TemplateArgumentLocInfo(QualifierLoc, TemplateNameLoc, 6089 EllipsisLoc); 6090 } 6091 case TemplateArgument::Null: 6092 case TemplateArgument::Integral: 6093 case TemplateArgument::Declaration: 6094 case TemplateArgument::NullPtr: 6095 case TemplateArgument::Pack: 6096 // FIXME: Is this right? 6097 return TemplateArgumentLocInfo(); 6098 } 6099 llvm_unreachable("unexpected template argument loc"); 6100 } 6101 6102 TemplateArgumentLoc 6103 ASTReader::ReadTemplateArgumentLoc(ModuleFile &F, 6104 const RecordData &Record, unsigned &Index) { 6105 TemplateArgument Arg = ReadTemplateArgument(F, Record, Index); 6106 6107 if (Arg.getKind() == TemplateArgument::Expression) { 6108 if (Record[Index++]) // bool InfoHasSameExpr. 6109 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 6110 } 6111 return TemplateArgumentLoc(Arg, GetTemplateArgumentLocInfo(F, Arg.getKind(), 6112 Record, Index)); 6113 } 6114 6115 const ASTTemplateArgumentListInfo* 6116 ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F, 6117 const RecordData &Record, 6118 unsigned &Index) { 6119 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index); 6120 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index); 6121 unsigned NumArgsAsWritten = Record[Index++]; 6122 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 6123 for (unsigned i = 0; i != NumArgsAsWritten; ++i) 6124 TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index)); 6125 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 6126 } 6127 6128 Decl *ASTReader::GetExternalDecl(uint32_t ID) { 6129 return GetDecl(ID); 6130 } 6131 6132 template<typename TemplateSpecializationDecl> 6133 static void completeRedeclChainForTemplateSpecialization(Decl *D) { 6134 if (auto *TSD = dyn_cast<TemplateSpecializationDecl>(D)) 6135 TSD->getSpecializedTemplate()->LoadLazySpecializations(); 6136 } 6137 6138 void ASTReader::CompleteRedeclChain(const Decl *D) { 6139 if (NumCurrentElementsDeserializing) { 6140 // We arrange to not care about the complete redeclaration chain while we're 6141 // deserializing. Just remember that the AST has marked this one as complete 6142 // but that it's not actually complete yet, so we know we still need to 6143 // complete it later. 6144 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D)); 6145 return; 6146 } 6147 6148 const DeclContext *DC = D->getDeclContext()->getRedeclContext(); 6149 6150 // If this is a named declaration, complete it by looking it up 6151 // within its context. 6152 // 6153 // FIXME: Merging a function definition should merge 6154 // all mergeable entities within it. 6155 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) || 6156 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) { 6157 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) { 6158 auto *II = Name.getAsIdentifierInfo(); 6159 if (isa<TranslationUnitDecl>(DC) && II) { 6160 // Outside of C++, we don't have a lookup table for the TU, so update 6161 // the identifier instead. In C++, either way should work fine. 6162 if (II->isOutOfDate()) 6163 updateOutOfDateIdentifier(*II); 6164 } else 6165 DC->lookup(Name); 6166 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) { 6167 // FIXME: It'd be nice to do something a bit more targeted here. 6168 D->getDeclContext()->decls_begin(); 6169 } 6170 } 6171 6172 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) 6173 CTSD->getSpecializedTemplate()->LoadLazySpecializations(); 6174 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) 6175 VTSD->getSpecializedTemplate()->LoadLazySpecializations(); 6176 if (auto *FD = dyn_cast<FunctionDecl>(D)) { 6177 if (auto *Template = FD->getPrimaryTemplate()) 6178 Template->LoadLazySpecializations(); 6179 } 6180 } 6181 6182 uint64_t ASTReader::readCXXBaseSpecifiers(ModuleFile &M, 6183 const RecordData &Record, 6184 unsigned &Idx) { 6185 if (Idx >= Record.size() || Record[Idx] > M.LocalNumCXXBaseSpecifiers) { 6186 Error("malformed AST file: missing C++ base specifier"); 6187 return 0; 6188 } 6189 6190 unsigned LocalID = Record[Idx++]; 6191 return getGlobalBitOffset(M, M.CXXBaseSpecifiersOffsets[LocalID - 1]); 6192 } 6193 6194 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 6195 RecordLocation Loc = getLocalBitOffset(Offset); 6196 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 6197 SavedStreamPosition SavedPosition(Cursor); 6198 Cursor.JumpToBit(Loc.Offset); 6199 ReadingKindTracker ReadingKind(Read_Decl, *this); 6200 RecordData Record; 6201 unsigned Code = Cursor.ReadCode(); 6202 unsigned RecCode = Cursor.readRecord(Code, Record); 6203 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 6204 Error("malformed AST file: missing C++ base specifiers"); 6205 return nullptr; 6206 } 6207 6208 unsigned Idx = 0; 6209 unsigned NumBases = Record[Idx++]; 6210 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 6211 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 6212 for (unsigned I = 0; I != NumBases; ++I) 6213 Bases[I] = ReadCXXBaseSpecifier(*Loc.F, Record, Idx); 6214 return Bases; 6215 } 6216 6217 serialization::DeclID 6218 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 6219 if (LocalID < NUM_PREDEF_DECL_IDS) 6220 return LocalID; 6221 6222 ContinuousRangeMap<uint32_t, int, 2>::iterator I 6223 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 6224 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 6225 6226 return LocalID + I->second; 6227 } 6228 6229 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 6230 ModuleFile &M) const { 6231 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(ID); 6232 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 6233 return &M == I->second; 6234 } 6235 6236 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 6237 if (!D->isFromASTFile()) 6238 return nullptr; 6239 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 6240 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 6241 return I->second; 6242 } 6243 6244 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 6245 if (ID < NUM_PREDEF_DECL_IDS) 6246 return SourceLocation(); 6247 6248 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 6249 6250 if (Index > DeclsLoaded.size()) { 6251 Error("declaration ID out-of-range for AST file"); 6252 return SourceLocation(); 6253 } 6254 6255 if (Decl *D = DeclsLoaded[Index]) 6256 return D->getLocation(); 6257 6258 unsigned RawLocation = 0; 6259 RecordLocation Rec = DeclCursorForID(ID, RawLocation); 6260 return ReadSourceLocation(*Rec.F, RawLocation); 6261 } 6262 6263 Decl *ASTReader::GetExistingDecl(DeclID ID) { 6264 if (ID < NUM_PREDEF_DECL_IDS) { 6265 switch ((PredefinedDeclIDs)ID) { 6266 case PREDEF_DECL_NULL_ID: 6267 return nullptr; 6268 6269 case PREDEF_DECL_TRANSLATION_UNIT_ID: 6270 return Context.getTranslationUnitDecl(); 6271 6272 case PREDEF_DECL_OBJC_ID_ID: 6273 return Context.getObjCIdDecl(); 6274 6275 case PREDEF_DECL_OBJC_SEL_ID: 6276 return Context.getObjCSelDecl(); 6277 6278 case PREDEF_DECL_OBJC_CLASS_ID: 6279 return Context.getObjCClassDecl(); 6280 6281 case PREDEF_DECL_OBJC_PROTOCOL_ID: 6282 return Context.getObjCProtocolDecl(); 6283 6284 case PREDEF_DECL_INT_128_ID: 6285 return Context.getInt128Decl(); 6286 6287 case PREDEF_DECL_UNSIGNED_INT_128_ID: 6288 return Context.getUInt128Decl(); 6289 6290 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 6291 return Context.getObjCInstanceTypeDecl(); 6292 6293 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 6294 return Context.getBuiltinVaListDecl(); 6295 } 6296 } 6297 6298 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 6299 6300 if (Index >= DeclsLoaded.size()) { 6301 assert(0 && "declaration ID out-of-range for AST file"); 6302 Error("declaration ID out-of-range for AST file"); 6303 return nullptr; 6304 } 6305 6306 return DeclsLoaded[Index]; 6307 } 6308 6309 Decl *ASTReader::GetDecl(DeclID ID) { 6310 if (ID < NUM_PREDEF_DECL_IDS) 6311 return GetExistingDecl(ID); 6312 6313 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 6314 6315 if (Index >= DeclsLoaded.size()) { 6316 assert(0 && "declaration ID out-of-range for AST file"); 6317 Error("declaration ID out-of-range for AST file"); 6318 return nullptr; 6319 } 6320 6321 if (!DeclsLoaded[Index]) { 6322 ReadDeclRecord(ID); 6323 if (DeserializationListener) 6324 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 6325 } 6326 6327 return DeclsLoaded[Index]; 6328 } 6329 6330 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 6331 DeclID GlobalID) { 6332 if (GlobalID < NUM_PREDEF_DECL_IDS) 6333 return GlobalID; 6334 6335 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 6336 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 6337 ModuleFile *Owner = I->second; 6338 6339 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 6340 = M.GlobalToLocalDeclIDs.find(Owner); 6341 if (Pos == M.GlobalToLocalDeclIDs.end()) 6342 return 0; 6343 6344 return GlobalID - Owner->BaseDeclID + Pos->second; 6345 } 6346 6347 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 6348 const RecordData &Record, 6349 unsigned &Idx) { 6350 if (Idx >= Record.size()) { 6351 Error("Corrupted AST file"); 6352 return 0; 6353 } 6354 6355 return getGlobalDeclID(F, Record[Idx++]); 6356 } 6357 6358 /// \brief Resolve the offset of a statement into a statement. 6359 /// 6360 /// This operation will read a new statement from the external 6361 /// source each time it is called, and is meant to be used via a 6362 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 6363 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 6364 // Switch case IDs are per Decl. 6365 ClearSwitchCaseIDs(); 6366 6367 // Offset here is a global offset across the entire chain. 6368 RecordLocation Loc = getLocalBitOffset(Offset); 6369 Loc.F->DeclsCursor.JumpToBit(Loc.Offset); 6370 return ReadStmtFromStream(*Loc.F); 6371 } 6372 6373 namespace { 6374 class FindExternalLexicalDeclsVisitor { 6375 ASTReader &Reader; 6376 const DeclContext *DC; 6377 bool (*isKindWeWant)(Decl::Kind); 6378 6379 SmallVectorImpl<Decl*> &Decls; 6380 bool PredefsVisited[NUM_PREDEF_DECL_IDS]; 6381 6382 public: 6383 FindExternalLexicalDeclsVisitor(ASTReader &Reader, const DeclContext *DC, 6384 bool (*isKindWeWant)(Decl::Kind), 6385 SmallVectorImpl<Decl*> &Decls) 6386 : Reader(Reader), DC(DC), isKindWeWant(isKindWeWant), Decls(Decls) 6387 { 6388 for (unsigned I = 0; I != NUM_PREDEF_DECL_IDS; ++I) 6389 PredefsVisited[I] = false; 6390 } 6391 6392 static bool visit(ModuleFile &M, bool Preorder, void *UserData) { 6393 if (Preorder) 6394 return false; 6395 6396 FindExternalLexicalDeclsVisitor *This 6397 = static_cast<FindExternalLexicalDeclsVisitor *>(UserData); 6398 6399 ModuleFile::DeclContextInfosMap::iterator Info 6400 = M.DeclContextInfos.find(This->DC); 6401 if (Info == M.DeclContextInfos.end() || !Info->second.LexicalDecls) 6402 return false; 6403 6404 // Load all of the declaration IDs 6405 for (const KindDeclIDPair *ID = Info->second.LexicalDecls, 6406 *IDE = ID + Info->second.NumLexicalDecls; 6407 ID != IDE; ++ID) { 6408 if (This->isKindWeWant && !This->isKindWeWant((Decl::Kind)ID->first)) 6409 continue; 6410 6411 // Don't add predefined declarations to the lexical context more 6412 // than once. 6413 if (ID->second < NUM_PREDEF_DECL_IDS) { 6414 if (This->PredefsVisited[ID->second]) 6415 continue; 6416 6417 This->PredefsVisited[ID->second] = true; 6418 } 6419 6420 if (Decl *D = This->Reader.GetLocalDecl(M, ID->second)) { 6421 if (!This->DC->isDeclInLexicalTraversal(D)) 6422 This->Decls.push_back(D); 6423 } 6424 } 6425 6426 return false; 6427 } 6428 }; 6429 } 6430 6431 ExternalLoadResult ASTReader::FindExternalLexicalDecls(const DeclContext *DC, 6432 bool (*isKindWeWant)(Decl::Kind), 6433 SmallVectorImpl<Decl*> &Decls) { 6434 // There might be lexical decls in multiple modules, for the TU at 6435 // least. Walk all of the modules in the order they were loaded. 6436 FindExternalLexicalDeclsVisitor Visitor(*this, DC, isKindWeWant, Decls); 6437 ModuleMgr.visitDepthFirst(&FindExternalLexicalDeclsVisitor::visit, &Visitor); 6438 ++NumLexicalDeclContextsRead; 6439 return ELR_Success; 6440 } 6441 6442 namespace { 6443 6444 class DeclIDComp { 6445 ASTReader &Reader; 6446 ModuleFile &Mod; 6447 6448 public: 6449 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 6450 6451 bool operator()(LocalDeclID L, LocalDeclID R) const { 6452 SourceLocation LHS = getLocation(L); 6453 SourceLocation RHS = getLocation(R); 6454 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6455 } 6456 6457 bool operator()(SourceLocation LHS, LocalDeclID R) const { 6458 SourceLocation RHS = getLocation(R); 6459 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6460 } 6461 6462 bool operator()(LocalDeclID L, SourceLocation RHS) const { 6463 SourceLocation LHS = getLocation(L); 6464 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6465 } 6466 6467 SourceLocation getLocation(LocalDeclID ID) const { 6468 return Reader.getSourceManager().getFileLoc( 6469 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 6470 } 6471 }; 6472 6473 } 6474 6475 void ASTReader::FindFileRegionDecls(FileID File, 6476 unsigned Offset, unsigned Length, 6477 SmallVectorImpl<Decl *> &Decls) { 6478 SourceManager &SM = getSourceManager(); 6479 6480 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 6481 if (I == FileDeclIDs.end()) 6482 return; 6483 6484 FileDeclsInfo &DInfo = I->second; 6485 if (DInfo.Decls.empty()) 6486 return; 6487 6488 SourceLocation 6489 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 6490 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 6491 6492 DeclIDComp DIDComp(*this, *DInfo.Mod); 6493 ArrayRef<serialization::LocalDeclID>::iterator 6494 BeginIt = std::lower_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 6495 BeginLoc, DIDComp); 6496 if (BeginIt != DInfo.Decls.begin()) 6497 --BeginIt; 6498 6499 // If we are pointing at a top-level decl inside an objc container, we need 6500 // to backtrack until we find it otherwise we will fail to report that the 6501 // region overlaps with an objc container. 6502 while (BeginIt != DInfo.Decls.begin() && 6503 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 6504 ->isTopLevelDeclInObjCContainer()) 6505 --BeginIt; 6506 6507 ArrayRef<serialization::LocalDeclID>::iterator 6508 EndIt = std::upper_bound(DInfo.Decls.begin(), DInfo.Decls.end(), 6509 EndLoc, DIDComp); 6510 if (EndIt != DInfo.Decls.end()) 6511 ++EndIt; 6512 6513 for (ArrayRef<serialization::LocalDeclID>::iterator 6514 DIt = BeginIt; DIt != EndIt; ++DIt) 6515 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 6516 } 6517 6518 namespace { 6519 /// \brief ModuleFile visitor used to perform name lookup into a 6520 /// declaration context. 6521 class DeclContextNameLookupVisitor { 6522 ASTReader &Reader; 6523 ArrayRef<const DeclContext *> Contexts; 6524 DeclarationName Name; 6525 SmallVectorImpl<NamedDecl *> &Decls; 6526 llvm::SmallPtrSetImpl<NamedDecl *> &DeclSet; 6527 6528 public: 6529 DeclContextNameLookupVisitor(ASTReader &Reader, 6530 ArrayRef<const DeclContext *> Contexts, 6531 DeclarationName Name, 6532 SmallVectorImpl<NamedDecl *> &Decls, 6533 llvm::SmallPtrSetImpl<NamedDecl *> &DeclSet) 6534 : Reader(Reader), Contexts(Contexts), Name(Name), Decls(Decls), 6535 DeclSet(DeclSet) { } 6536 6537 static bool visit(ModuleFile &M, void *UserData) { 6538 DeclContextNameLookupVisitor *This 6539 = static_cast<DeclContextNameLookupVisitor *>(UserData); 6540 6541 // Check whether we have any visible declaration information for 6542 // this context in this module. 6543 ModuleFile::DeclContextInfosMap::iterator Info; 6544 bool FoundInfo = false; 6545 for (auto *DC : This->Contexts) { 6546 Info = M.DeclContextInfos.find(DC); 6547 if (Info != M.DeclContextInfos.end() && 6548 Info->second.NameLookupTableData) { 6549 FoundInfo = true; 6550 break; 6551 } 6552 } 6553 6554 if (!FoundInfo) 6555 return false; 6556 6557 // Look for this name within this module. 6558 ASTDeclContextNameLookupTable *LookupTable = 6559 Info->second.NameLookupTableData; 6560 ASTDeclContextNameLookupTable::iterator Pos 6561 = LookupTable->find(This->Name); 6562 if (Pos == LookupTable->end()) 6563 return false; 6564 6565 bool FoundAnything = false; 6566 ASTDeclContextNameLookupTrait::data_type Data = *Pos; 6567 for (; Data.first != Data.second; ++Data.first) { 6568 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, *Data.first); 6569 if (!ND) 6570 continue; 6571 6572 if (ND->getDeclName() != This->Name) { 6573 // A name might be null because the decl's redeclarable part is 6574 // currently read before reading its name. The lookup is triggered by 6575 // building that decl (likely indirectly), and so it is later in the 6576 // sense of "already existing" and can be ignored here. 6577 // FIXME: This should not happen; deserializing declarations should 6578 // not perform lookups since that can lead to deserialization cycles. 6579 continue; 6580 } 6581 6582 // Record this declaration. 6583 FoundAnything = true; 6584 if (This->DeclSet.insert(ND).second) 6585 This->Decls.push_back(ND); 6586 } 6587 6588 return FoundAnything; 6589 } 6590 }; 6591 } 6592 6593 /// \brief Retrieve the "definitive" module file for the definition of the 6594 /// given declaration context, if there is one. 6595 /// 6596 /// The "definitive" module file is the only place where we need to look to 6597 /// find information about the declarations within the given declaration 6598 /// context. For example, C++ and Objective-C classes, C structs/unions, and 6599 /// Objective-C protocols, categories, and extensions are all defined in a 6600 /// single place in the source code, so they have definitive module files 6601 /// associated with them. C++ namespaces, on the other hand, can have 6602 /// definitions in multiple different module files. 6603 /// 6604 /// Note: this needs to be kept in sync with ASTWriter::AddedVisibleDecl's 6605 /// NDEBUG checking. 6606 static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC, 6607 ASTReader &Reader) { 6608 if (const DeclContext *DefDC = getDefinitiveDeclContext(DC)) 6609 return Reader.getOwningModuleFile(cast<Decl>(DefDC)); 6610 6611 return nullptr; 6612 } 6613 6614 bool 6615 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 6616 DeclarationName Name) { 6617 assert(DC->hasExternalVisibleStorage() && 6618 "DeclContext has no visible decls in storage"); 6619 if (!Name) 6620 return false; 6621 6622 Deserializing LookupResults(this); 6623 6624 SmallVector<NamedDecl *, 64> Decls; 6625 llvm::SmallPtrSet<NamedDecl*, 64> DeclSet; 6626 6627 // Compute the declaration contexts we need to look into. Multiple such 6628 // declaration contexts occur when two declaration contexts from disjoint 6629 // modules get merged, e.g., when two namespaces with the same name are 6630 // independently defined in separate modules. 6631 SmallVector<const DeclContext *, 2> Contexts; 6632 Contexts.push_back(DC); 6633 6634 if (DC->isNamespace()) { 6635 auto Merged = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC))); 6636 if (Merged != MergedDecls.end()) { 6637 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I) 6638 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I]))); 6639 } 6640 } 6641 6642 auto LookUpInContexts = [&](ArrayRef<const DeclContext*> Contexts) { 6643 DeclContextNameLookupVisitor Visitor(*this, Contexts, Name, Decls, DeclSet); 6644 6645 // If we can definitively determine which module file to look into, 6646 // only look there. Otherwise, look in all module files. 6647 ModuleFile *Definitive; 6648 if (Contexts.size() == 1 && 6649 (Definitive = getDefinitiveModuleFileFor(Contexts[0], *this))) { 6650 DeclContextNameLookupVisitor::visit(*Definitive, &Visitor); 6651 } else { 6652 ModuleMgr.visit(&DeclContextNameLookupVisitor::visit, &Visitor); 6653 } 6654 }; 6655 6656 LookUpInContexts(Contexts); 6657 6658 // If this might be an implicit special member function, then also search 6659 // all merged definitions of the surrounding class. We need to search them 6660 // individually, because finding an entity in one of them doesn't imply that 6661 // we can't find a different entity in another one. 6662 if (isa<CXXRecordDecl>(DC)) { 6663 auto Kind = Name.getNameKind(); 6664 if (Kind == DeclarationName::CXXConstructorName || 6665 Kind == DeclarationName::CXXDestructorName || 6666 (Kind == DeclarationName::CXXOperatorName && 6667 Name.getCXXOverloadedOperator() == OO_Equal)) { 6668 auto Merged = MergedLookups.find(DC); 6669 if (Merged != MergedLookups.end()) { 6670 for (unsigned I = 0; I != Merged->second.size(); ++I) { 6671 const DeclContext *Context = Merged->second[I]; 6672 LookUpInContexts(Context); 6673 // We might have just added some more merged lookups. If so, our 6674 // iterator is now invalid, so grab a fresh one before continuing. 6675 Merged = MergedLookups.find(DC); 6676 } 6677 } 6678 } 6679 } 6680 6681 ++NumVisibleDeclContextsRead; 6682 SetExternalVisibleDeclsForName(DC, Name, Decls); 6683 return !Decls.empty(); 6684 } 6685 6686 namespace { 6687 /// \brief ModuleFile visitor used to retrieve all visible names in a 6688 /// declaration context. 6689 class DeclContextAllNamesVisitor { 6690 ASTReader &Reader; 6691 SmallVectorImpl<const DeclContext *> &Contexts; 6692 DeclsMap &Decls; 6693 llvm::SmallPtrSet<NamedDecl *, 256> DeclSet; 6694 bool VisitAll; 6695 6696 public: 6697 DeclContextAllNamesVisitor(ASTReader &Reader, 6698 SmallVectorImpl<const DeclContext *> &Contexts, 6699 DeclsMap &Decls, bool VisitAll) 6700 : Reader(Reader), Contexts(Contexts), Decls(Decls), VisitAll(VisitAll) { } 6701 6702 static bool visit(ModuleFile &M, void *UserData) { 6703 DeclContextAllNamesVisitor *This 6704 = static_cast<DeclContextAllNamesVisitor *>(UserData); 6705 6706 // Check whether we have any visible declaration information for 6707 // this context in this module. 6708 ModuleFile::DeclContextInfosMap::iterator Info; 6709 bool FoundInfo = false; 6710 for (unsigned I = 0, N = This->Contexts.size(); I != N; ++I) { 6711 Info = M.DeclContextInfos.find(This->Contexts[I]); 6712 if (Info != M.DeclContextInfos.end() && 6713 Info->second.NameLookupTableData) { 6714 FoundInfo = true; 6715 break; 6716 } 6717 } 6718 6719 if (!FoundInfo) 6720 return false; 6721 6722 ASTDeclContextNameLookupTable *LookupTable = 6723 Info->second.NameLookupTableData; 6724 bool FoundAnything = false; 6725 for (ASTDeclContextNameLookupTable::data_iterator 6726 I = LookupTable->data_begin(), E = LookupTable->data_end(); 6727 I != E; 6728 ++I) { 6729 ASTDeclContextNameLookupTrait::data_type Data = *I; 6730 for (; Data.first != Data.second; ++Data.first) { 6731 NamedDecl *ND = This->Reader.GetLocalDeclAs<NamedDecl>(M, 6732 *Data.first); 6733 if (!ND) 6734 continue; 6735 6736 // Record this declaration. 6737 FoundAnything = true; 6738 if (This->DeclSet.insert(ND).second) 6739 This->Decls[ND->getDeclName()].push_back(ND); 6740 } 6741 } 6742 6743 return FoundAnything && !This->VisitAll; 6744 } 6745 }; 6746 } 6747 6748 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 6749 if (!DC->hasExternalVisibleStorage()) 6750 return; 6751 DeclsMap Decls; 6752 6753 // Compute the declaration contexts we need to look into. Multiple such 6754 // declaration contexts occur when two declaration contexts from disjoint 6755 // modules get merged, e.g., when two namespaces with the same name are 6756 // independently defined in separate modules. 6757 SmallVector<const DeclContext *, 2> Contexts; 6758 Contexts.push_back(DC); 6759 6760 if (DC->isNamespace()) { 6761 MergedDeclsMap::iterator Merged 6762 = MergedDecls.find(const_cast<Decl *>(cast<Decl>(DC))); 6763 if (Merged != MergedDecls.end()) { 6764 for (unsigned I = 0, N = Merged->second.size(); I != N; ++I) 6765 Contexts.push_back(cast<DeclContext>(GetDecl(Merged->second[I]))); 6766 } 6767 } 6768 6769 DeclContextAllNamesVisitor Visitor(*this, Contexts, Decls, 6770 /*VisitAll=*/DC->isFileContext()); 6771 ModuleMgr.visit(&DeclContextAllNamesVisitor::visit, &Visitor); 6772 ++NumVisibleDeclContextsRead; 6773 6774 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 6775 SetExternalVisibleDeclsForName(DC, I->first, I->second); 6776 } 6777 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 6778 } 6779 6780 /// \brief Under non-PCH compilation the consumer receives the objc methods 6781 /// before receiving the implementation, and codegen depends on this. 6782 /// We simulate this by deserializing and passing to consumer the methods of the 6783 /// implementation before passing the deserialized implementation decl. 6784 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 6785 ASTConsumer *Consumer) { 6786 assert(ImplD && Consumer); 6787 6788 for (auto *I : ImplD->methods()) 6789 Consumer->HandleInterestingDecl(DeclGroupRef(I)); 6790 6791 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 6792 } 6793 6794 void ASTReader::PassInterestingDeclsToConsumer() { 6795 assert(Consumer); 6796 6797 if (PassingDeclsToConsumer) 6798 return; 6799 6800 // Guard variable to avoid recursively redoing the process of passing 6801 // decls to consumer. 6802 SaveAndRestore<bool> GuardPassingDeclsToConsumer(PassingDeclsToConsumer, 6803 true); 6804 6805 while (!InterestingDecls.empty()) { 6806 Decl *D = InterestingDecls.front(); 6807 InterestingDecls.pop_front(); 6808 6809 PassInterestingDeclToConsumer(D); 6810 } 6811 } 6812 6813 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 6814 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 6815 PassObjCImplDeclToConsumer(ImplD, Consumer); 6816 else 6817 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 6818 } 6819 6820 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 6821 this->Consumer = Consumer; 6822 6823 if (!Consumer) 6824 return; 6825 6826 for (unsigned I = 0, N = EagerlyDeserializedDecls.size(); I != N; ++I) { 6827 // Force deserialization of this decl, which will cause it to be queued for 6828 // passing to the consumer. 6829 GetDecl(EagerlyDeserializedDecls[I]); 6830 } 6831 EagerlyDeserializedDecls.clear(); 6832 6833 PassInterestingDeclsToConsumer(); 6834 } 6835 6836 void ASTReader::PrintStats() { 6837 std::fprintf(stderr, "*** AST File Statistics:\n"); 6838 6839 unsigned NumTypesLoaded 6840 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 6841 QualType()); 6842 unsigned NumDeclsLoaded 6843 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 6844 (Decl *)nullptr); 6845 unsigned NumIdentifiersLoaded 6846 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 6847 IdentifiersLoaded.end(), 6848 (IdentifierInfo *)nullptr); 6849 unsigned NumMacrosLoaded 6850 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 6851 MacrosLoaded.end(), 6852 (MacroInfo *)nullptr); 6853 unsigned NumSelectorsLoaded 6854 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 6855 SelectorsLoaded.end(), 6856 Selector()); 6857 6858 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 6859 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 6860 NumSLocEntriesRead, TotalNumSLocEntries, 6861 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 6862 if (!TypesLoaded.empty()) 6863 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 6864 NumTypesLoaded, (unsigned)TypesLoaded.size(), 6865 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 6866 if (!DeclsLoaded.empty()) 6867 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 6868 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 6869 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 6870 if (!IdentifiersLoaded.empty()) 6871 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 6872 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 6873 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 6874 if (!MacrosLoaded.empty()) 6875 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 6876 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 6877 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 6878 if (!SelectorsLoaded.empty()) 6879 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 6880 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 6881 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 6882 if (TotalNumStatements) 6883 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 6884 NumStatementsRead, TotalNumStatements, 6885 ((float)NumStatementsRead/TotalNumStatements * 100)); 6886 if (TotalNumMacros) 6887 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 6888 NumMacrosRead, TotalNumMacros, 6889 ((float)NumMacrosRead/TotalNumMacros * 100)); 6890 if (TotalLexicalDeclContexts) 6891 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 6892 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 6893 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 6894 * 100)); 6895 if (TotalVisibleDeclContexts) 6896 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 6897 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 6898 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 6899 * 100)); 6900 if (TotalNumMethodPoolEntries) { 6901 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 6902 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 6903 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 6904 * 100)); 6905 } 6906 if (NumMethodPoolLookups) { 6907 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 6908 NumMethodPoolHits, NumMethodPoolLookups, 6909 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 6910 } 6911 if (NumMethodPoolTableLookups) { 6912 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 6913 NumMethodPoolTableHits, NumMethodPoolTableLookups, 6914 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 6915 * 100.0)); 6916 } 6917 6918 if (NumIdentifierLookupHits) { 6919 std::fprintf(stderr, 6920 " %u / %u identifier table lookups succeeded (%f%%)\n", 6921 NumIdentifierLookupHits, NumIdentifierLookups, 6922 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 6923 } 6924 6925 if (GlobalIndex) { 6926 std::fprintf(stderr, "\n"); 6927 GlobalIndex->printStats(); 6928 } 6929 6930 std::fprintf(stderr, "\n"); 6931 dump(); 6932 std::fprintf(stderr, "\n"); 6933 } 6934 6935 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 6936 static void 6937 dumpModuleIDMap(StringRef Name, 6938 const ContinuousRangeMap<Key, ModuleFile *, 6939 InitialCapacity> &Map) { 6940 if (Map.begin() == Map.end()) 6941 return; 6942 6943 typedef ContinuousRangeMap<Key, ModuleFile *, InitialCapacity> MapType; 6944 llvm::errs() << Name << ":\n"; 6945 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 6946 I != IEnd; ++I) { 6947 llvm::errs() << " " << I->first << " -> " << I->second->FileName 6948 << "\n"; 6949 } 6950 } 6951 6952 void ASTReader::dump() { 6953 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 6954 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 6955 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 6956 dumpModuleIDMap("Global type map", GlobalTypeMap); 6957 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 6958 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 6959 dumpModuleIDMap("Global macro map", GlobalMacroMap); 6960 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 6961 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 6962 dumpModuleIDMap("Global preprocessed entity map", 6963 GlobalPreprocessedEntityMap); 6964 6965 llvm::errs() << "\n*** PCH/Modules Loaded:"; 6966 for (ModuleManager::ModuleConstIterator M = ModuleMgr.begin(), 6967 MEnd = ModuleMgr.end(); 6968 M != MEnd; ++M) 6969 (*M)->dump(); 6970 } 6971 6972 /// Return the amount of memory used by memory buffers, breaking down 6973 /// by heap-backed versus mmap'ed memory. 6974 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 6975 for (ModuleConstIterator I = ModuleMgr.begin(), 6976 E = ModuleMgr.end(); I != E; ++I) { 6977 if (llvm::MemoryBuffer *buf = (*I)->Buffer.get()) { 6978 size_t bytes = buf->getBufferSize(); 6979 switch (buf->getBufferKind()) { 6980 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 6981 sizes.malloc_bytes += bytes; 6982 break; 6983 case llvm::MemoryBuffer::MemoryBuffer_MMap: 6984 sizes.mmap_bytes += bytes; 6985 break; 6986 } 6987 } 6988 } 6989 } 6990 6991 void ASTReader::InitializeSema(Sema &S) { 6992 SemaObj = &S; 6993 S.addExternalSource(this); 6994 6995 // Makes sure any declarations that were deserialized "too early" 6996 // still get added to the identifier's declaration chains. 6997 for (uint64_t ID : PreloadedDeclIDs) { 6998 NamedDecl *D = cast<NamedDecl>(GetDecl(ID)); 6999 pushExternalDeclIntoScope(D, D->getDeclName()); 7000 } 7001 PreloadedDeclIDs.clear(); 7002 7003 // FIXME: What happens if these are changed by a module import? 7004 if (!FPPragmaOptions.empty()) { 7005 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 7006 SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0]; 7007 } 7008 7009 // FIXME: What happens if these are changed by a module import? 7010 if (!OpenCLExtensions.empty()) { 7011 unsigned I = 0; 7012 #define OPENCLEXT(nm) SemaObj->OpenCLFeatures.nm = OpenCLExtensions[I++]; 7013 #include "clang/Basic/OpenCLExtensions.def" 7014 7015 assert(OpenCLExtensions.size() == I && "Wrong number of OPENCL_EXTENSIONS"); 7016 } 7017 7018 UpdateSema(); 7019 } 7020 7021 void ASTReader::UpdateSema() { 7022 assert(SemaObj && "no Sema to update"); 7023 7024 // Load the offsets of the declarations that Sema references. 7025 // They will be lazily deserialized when needed. 7026 if (!SemaDeclRefs.empty()) { 7027 assert(SemaDeclRefs.size() % 2 == 0); 7028 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 2) { 7029 if (!SemaObj->StdNamespace) 7030 SemaObj->StdNamespace = SemaDeclRefs[I]; 7031 if (!SemaObj->StdBadAlloc) 7032 SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 7033 } 7034 SemaDeclRefs.clear(); 7035 } 7036 7037 // Update the state of 'pragma clang optimize'. Use the same API as if we had 7038 // encountered the pragma in the source. 7039 if(OptimizeOffPragmaLocation.isValid()) 7040 SemaObj->ActOnPragmaOptimize(/* IsOn = */ false, OptimizeOffPragmaLocation); 7041 } 7042 7043 IdentifierInfo* ASTReader::get(const char *NameStart, const char *NameEnd) { 7044 // Note that we are loading an identifier. 7045 Deserializing AnIdentifier(this); 7046 StringRef Name(NameStart, NameEnd - NameStart); 7047 7048 // If there is a global index, look there first to determine which modules 7049 // provably do not have any results for this identifier. 7050 GlobalModuleIndex::HitSet Hits; 7051 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 7052 if (!loadGlobalIndex()) { 7053 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 7054 HitsPtr = &Hits; 7055 } 7056 } 7057 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 7058 NumIdentifierLookups, 7059 NumIdentifierLookupHits); 7060 ModuleMgr.visit(IdentifierLookupVisitor::visit, &Visitor, HitsPtr); 7061 IdentifierInfo *II = Visitor.getIdentifierInfo(); 7062 markIdentifierUpToDate(II); 7063 return II; 7064 } 7065 7066 namespace clang { 7067 /// \brief An identifier-lookup iterator that enumerates all of the 7068 /// identifiers stored within a set of AST files. 7069 class ASTIdentifierIterator : public IdentifierIterator { 7070 /// \brief The AST reader whose identifiers are being enumerated. 7071 const ASTReader &Reader; 7072 7073 /// \brief The current index into the chain of AST files stored in 7074 /// the AST reader. 7075 unsigned Index; 7076 7077 /// \brief The current position within the identifier lookup table 7078 /// of the current AST file. 7079 ASTIdentifierLookupTable::key_iterator Current; 7080 7081 /// \brief The end position within the identifier lookup table of 7082 /// the current AST file. 7083 ASTIdentifierLookupTable::key_iterator End; 7084 7085 public: 7086 explicit ASTIdentifierIterator(const ASTReader &Reader); 7087 7088 StringRef Next() override; 7089 }; 7090 } 7091 7092 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader) 7093 : Reader(Reader), Index(Reader.ModuleMgr.size() - 1) { 7094 ASTIdentifierLookupTable *IdTable 7095 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index].IdentifierLookupTable; 7096 Current = IdTable->key_begin(); 7097 End = IdTable->key_end(); 7098 } 7099 7100 StringRef ASTIdentifierIterator::Next() { 7101 while (Current == End) { 7102 // If we have exhausted all of our AST files, we're done. 7103 if (Index == 0) 7104 return StringRef(); 7105 7106 --Index; 7107 ASTIdentifierLookupTable *IdTable 7108 = (ASTIdentifierLookupTable *)Reader.ModuleMgr[Index]. 7109 IdentifierLookupTable; 7110 Current = IdTable->key_begin(); 7111 End = IdTable->key_end(); 7112 } 7113 7114 // We have any identifiers remaining in the current AST file; return 7115 // the next one. 7116 StringRef Result = *Current; 7117 ++Current; 7118 return Result; 7119 } 7120 7121 IdentifierIterator *ASTReader::getIdentifiers() { 7122 if (!loadGlobalIndex()) 7123 return GlobalIndex->createIdentifierIterator(); 7124 7125 return new ASTIdentifierIterator(*this); 7126 } 7127 7128 namespace clang { namespace serialization { 7129 class ReadMethodPoolVisitor { 7130 ASTReader &Reader; 7131 Selector Sel; 7132 unsigned PriorGeneration; 7133 unsigned InstanceBits; 7134 unsigned FactoryBits; 7135 bool InstanceHasMoreThanOneDecl; 7136 bool FactoryHasMoreThanOneDecl; 7137 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 7138 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 7139 7140 public: 7141 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 7142 unsigned PriorGeneration) 7143 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration), 7144 InstanceBits(0), FactoryBits(0), InstanceHasMoreThanOneDecl(false), 7145 FactoryHasMoreThanOneDecl(false) {} 7146 7147 static bool visit(ModuleFile &M, void *UserData) { 7148 ReadMethodPoolVisitor *This 7149 = static_cast<ReadMethodPoolVisitor *>(UserData); 7150 7151 if (!M.SelectorLookupTable) 7152 return false; 7153 7154 // If we've already searched this module file, skip it now. 7155 if (M.Generation <= This->PriorGeneration) 7156 return true; 7157 7158 ++This->Reader.NumMethodPoolTableLookups; 7159 ASTSelectorLookupTable *PoolTable 7160 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 7161 ASTSelectorLookupTable::iterator Pos = PoolTable->find(This->Sel); 7162 if (Pos == PoolTable->end()) 7163 return false; 7164 7165 ++This->Reader.NumMethodPoolTableHits; 7166 ++This->Reader.NumSelectorsRead; 7167 // FIXME: Not quite happy with the statistics here. We probably should 7168 // disable this tracking when called via LoadSelector. 7169 // Also, should entries without methods count as misses? 7170 ++This->Reader.NumMethodPoolEntriesRead; 7171 ASTSelectorLookupTrait::data_type Data = *Pos; 7172 if (This->Reader.DeserializationListener) 7173 This->Reader.DeserializationListener->SelectorRead(Data.ID, 7174 This->Sel); 7175 7176 This->InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 7177 This->FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 7178 This->InstanceBits = Data.InstanceBits; 7179 This->FactoryBits = Data.FactoryBits; 7180 This->InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl; 7181 This->FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl; 7182 return true; 7183 } 7184 7185 /// \brief Retrieve the instance methods found by this visitor. 7186 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 7187 return InstanceMethods; 7188 } 7189 7190 /// \brief Retrieve the instance methods found by this visitor. 7191 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 7192 return FactoryMethods; 7193 } 7194 7195 unsigned getInstanceBits() const { return InstanceBits; } 7196 unsigned getFactoryBits() const { return FactoryBits; } 7197 bool instanceHasMoreThanOneDecl() const { 7198 return InstanceHasMoreThanOneDecl; 7199 } 7200 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; } 7201 }; 7202 } } // end namespace clang::serialization 7203 7204 /// \brief Add the given set of methods to the method list. 7205 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 7206 ObjCMethodList &List) { 7207 for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 7208 S.addMethodToGlobalList(&List, Methods[I]); 7209 } 7210 } 7211 7212 void ASTReader::ReadMethodPool(Selector Sel) { 7213 // Get the selector generation and update it to the current generation. 7214 unsigned &Generation = SelectorGeneration[Sel]; 7215 unsigned PriorGeneration = Generation; 7216 Generation = getGeneration(); 7217 7218 // Search for methods defined with this selector. 7219 ++NumMethodPoolLookups; 7220 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 7221 ModuleMgr.visit(&ReadMethodPoolVisitor::visit, &Visitor); 7222 7223 if (Visitor.getInstanceMethods().empty() && 7224 Visitor.getFactoryMethods().empty()) 7225 return; 7226 7227 ++NumMethodPoolHits; 7228 7229 if (!getSema()) 7230 return; 7231 7232 Sema &S = *getSema(); 7233 Sema::GlobalMethodPool::iterator Pos 7234 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first; 7235 7236 Pos->second.first.setBits(Visitor.getInstanceBits()); 7237 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl()); 7238 Pos->second.second.setBits(Visitor.getFactoryBits()); 7239 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl()); 7240 7241 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since 7242 // when building a module we keep every method individually and may need to 7243 // update hasMoreThanOneDecl as we add the methods. 7244 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 7245 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 7246 } 7247 7248 void ASTReader::ReadKnownNamespaces( 7249 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 7250 Namespaces.clear(); 7251 7252 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 7253 if (NamespaceDecl *Namespace 7254 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 7255 Namespaces.push_back(Namespace); 7256 } 7257 } 7258 7259 void ASTReader::ReadUndefinedButUsed( 7260 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined) { 7261 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 7262 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 7263 SourceLocation Loc = 7264 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 7265 Undefined.insert(std::make_pair(D, Loc)); 7266 } 7267 } 7268 7269 void ASTReader::ReadTentativeDefinitions( 7270 SmallVectorImpl<VarDecl *> &TentativeDefs) { 7271 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 7272 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 7273 if (Var) 7274 TentativeDefs.push_back(Var); 7275 } 7276 TentativeDefinitions.clear(); 7277 } 7278 7279 void ASTReader::ReadUnusedFileScopedDecls( 7280 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 7281 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 7282 DeclaratorDecl *D 7283 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 7284 if (D) 7285 Decls.push_back(D); 7286 } 7287 UnusedFileScopedDecls.clear(); 7288 } 7289 7290 void ASTReader::ReadDelegatingConstructors( 7291 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 7292 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 7293 CXXConstructorDecl *D 7294 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 7295 if (D) 7296 Decls.push_back(D); 7297 } 7298 DelegatingCtorDecls.clear(); 7299 } 7300 7301 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 7302 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 7303 TypedefNameDecl *D 7304 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 7305 if (D) 7306 Decls.push_back(D); 7307 } 7308 ExtVectorDecls.clear(); 7309 } 7310 7311 void ASTReader::ReadDynamicClasses(SmallVectorImpl<CXXRecordDecl *> &Decls) { 7312 for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) { 7313 CXXRecordDecl *D 7314 = dyn_cast_or_null<CXXRecordDecl>(GetDecl(DynamicClasses[I])); 7315 if (D) 7316 Decls.push_back(D); 7317 } 7318 DynamicClasses.clear(); 7319 } 7320 7321 void ASTReader::ReadUnusedLocalTypedefNameCandidates( 7322 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 7323 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N; 7324 ++I) { 7325 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>( 7326 GetDecl(UnusedLocalTypedefNameCandidates[I])); 7327 if (D) 7328 Decls.insert(D); 7329 } 7330 UnusedLocalTypedefNameCandidates.clear(); 7331 } 7332 7333 void 7334 ASTReader::ReadLocallyScopedExternCDecls(SmallVectorImpl<NamedDecl *> &Decls) { 7335 for (unsigned I = 0, N = LocallyScopedExternCDecls.size(); I != N; ++I) { 7336 NamedDecl *D 7337 = dyn_cast_or_null<NamedDecl>(GetDecl(LocallyScopedExternCDecls[I])); 7338 if (D) 7339 Decls.push_back(D); 7340 } 7341 LocallyScopedExternCDecls.clear(); 7342 } 7343 7344 void ASTReader::ReadReferencedSelectors( 7345 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) { 7346 if (ReferencedSelectorsData.empty()) 7347 return; 7348 7349 // If there are @selector references added them to its pool. This is for 7350 // implementation of -Wselector. 7351 unsigned int DataSize = ReferencedSelectorsData.size()-1; 7352 unsigned I = 0; 7353 while (I < DataSize) { 7354 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 7355 SourceLocation SelLoc 7356 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 7357 Sels.push_back(std::make_pair(Sel, SelLoc)); 7358 } 7359 ReferencedSelectorsData.clear(); 7360 } 7361 7362 void ASTReader::ReadWeakUndeclaredIdentifiers( 7363 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo> > &WeakIDs) { 7364 if (WeakUndeclaredIdentifiers.empty()) 7365 return; 7366 7367 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 7368 IdentifierInfo *WeakId 7369 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 7370 IdentifierInfo *AliasId 7371 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 7372 SourceLocation Loc 7373 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 7374 bool Used = WeakUndeclaredIdentifiers[I++]; 7375 WeakInfo WI(AliasId, Loc); 7376 WI.setUsed(Used); 7377 WeakIDs.push_back(std::make_pair(WeakId, WI)); 7378 } 7379 WeakUndeclaredIdentifiers.clear(); 7380 } 7381 7382 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 7383 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 7384 ExternalVTableUse VT; 7385 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 7386 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 7387 VT.DefinitionRequired = VTableUses[Idx++]; 7388 VTables.push_back(VT); 7389 } 7390 7391 VTableUses.clear(); 7392 } 7393 7394 void ASTReader::ReadPendingInstantiations( 7395 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) { 7396 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 7397 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 7398 SourceLocation Loc 7399 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 7400 7401 Pending.push_back(std::make_pair(D, Loc)); 7402 } 7403 PendingInstantiations.clear(); 7404 } 7405 7406 void ASTReader::ReadLateParsedTemplates( 7407 llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) { 7408 for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N; 7409 /* In loop */) { 7410 FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++])); 7411 7412 LateParsedTemplate *LT = new LateParsedTemplate; 7413 LT->D = GetDecl(LateParsedTemplates[Idx++]); 7414 7415 ModuleFile *F = getOwningModuleFile(LT->D); 7416 assert(F && "No module"); 7417 7418 unsigned TokN = LateParsedTemplates[Idx++]; 7419 LT->Toks.reserve(TokN); 7420 for (unsigned T = 0; T < TokN; ++T) 7421 LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx)); 7422 7423 LPTMap[FD] = LT; 7424 } 7425 7426 LateParsedTemplates.clear(); 7427 } 7428 7429 void ASTReader::LoadSelector(Selector Sel) { 7430 // It would be complicated to avoid reading the methods anyway. So don't. 7431 ReadMethodPool(Sel); 7432 } 7433 7434 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 7435 assert(ID && "Non-zero identifier ID required"); 7436 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 7437 IdentifiersLoaded[ID - 1] = II; 7438 if (DeserializationListener) 7439 DeserializationListener->IdentifierRead(ID, II); 7440 } 7441 7442 /// \brief Set the globally-visible declarations associated with the given 7443 /// identifier. 7444 /// 7445 /// If the AST reader is currently in a state where the given declaration IDs 7446 /// cannot safely be resolved, they are queued until it is safe to resolve 7447 /// them. 7448 /// 7449 /// \param II an IdentifierInfo that refers to one or more globally-visible 7450 /// declarations. 7451 /// 7452 /// \param DeclIDs the set of declaration IDs with the name @p II that are 7453 /// visible at global scope. 7454 /// 7455 /// \param Decls if non-null, this vector will be populated with the set of 7456 /// deserialized declarations. These declarations will not be pushed into 7457 /// scope. 7458 void 7459 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 7460 const SmallVectorImpl<uint32_t> &DeclIDs, 7461 SmallVectorImpl<Decl *> *Decls) { 7462 if (NumCurrentElementsDeserializing && !Decls) { 7463 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 7464 return; 7465 } 7466 7467 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 7468 if (!SemaObj) { 7469 // Queue this declaration so that it will be added to the 7470 // translation unit scope and identifier's declaration chain 7471 // once a Sema object is known. 7472 PreloadedDeclIDs.push_back(DeclIDs[I]); 7473 continue; 7474 } 7475 7476 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 7477 7478 // If we're simply supposed to record the declarations, do so now. 7479 if (Decls) { 7480 Decls->push_back(D); 7481 continue; 7482 } 7483 7484 // Introduce this declaration into the translation-unit scope 7485 // and add it to the declaration chain for this identifier, so 7486 // that (unqualified) name lookup will find it. 7487 pushExternalDeclIntoScope(D, II); 7488 } 7489 } 7490 7491 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 7492 if (ID == 0) 7493 return nullptr; 7494 7495 if (IdentifiersLoaded.empty()) { 7496 Error("no identifier table in AST file"); 7497 return nullptr; 7498 } 7499 7500 ID -= 1; 7501 if (!IdentifiersLoaded[ID]) { 7502 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 7503 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 7504 ModuleFile *M = I->second; 7505 unsigned Index = ID - M->BaseIdentifierID; 7506 const char *Str = M->IdentifierTableData + M->IdentifierOffsets[Index]; 7507 7508 // All of the strings in the AST file are preceded by a 16-bit length. 7509 // Extract that 16-bit length to avoid having to execute strlen(). 7510 // NOTE: 'StrLenPtr' is an 'unsigned char*' so that we load bytes as 7511 // unsigned integers. This is important to avoid integer overflow when 7512 // we cast them to 'unsigned'. 7513 const unsigned char *StrLenPtr = (const unsigned char*) Str - 2; 7514 unsigned StrLen = (((unsigned) StrLenPtr[0]) 7515 | (((unsigned) StrLenPtr[1]) << 8)) - 1; 7516 IdentifiersLoaded[ID] 7517 = &PP.getIdentifierTable().get(StringRef(Str, StrLen)); 7518 if (DeserializationListener) 7519 DeserializationListener->IdentifierRead(ID + 1, IdentifiersLoaded[ID]); 7520 } 7521 7522 return IdentifiersLoaded[ID]; 7523 } 7524 7525 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 7526 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 7527 } 7528 7529 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 7530 if (LocalID < NUM_PREDEF_IDENT_IDS) 7531 return LocalID; 7532 7533 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7534 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 7535 assert(I != M.IdentifierRemap.end() 7536 && "Invalid index into identifier index remap"); 7537 7538 return LocalID + I->second; 7539 } 7540 7541 MacroInfo *ASTReader::getMacro(MacroID ID) { 7542 if (ID == 0) 7543 return nullptr; 7544 7545 if (MacrosLoaded.empty()) { 7546 Error("no macro table in AST file"); 7547 return nullptr; 7548 } 7549 7550 ID -= NUM_PREDEF_MACRO_IDS; 7551 if (!MacrosLoaded[ID]) { 7552 GlobalMacroMapType::iterator I 7553 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 7554 assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 7555 ModuleFile *M = I->second; 7556 unsigned Index = ID - M->BaseMacroID; 7557 MacrosLoaded[ID] = ReadMacroRecord(*M, M->MacroOffsets[Index]); 7558 7559 if (DeserializationListener) 7560 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 7561 MacrosLoaded[ID]); 7562 } 7563 7564 return MacrosLoaded[ID]; 7565 } 7566 7567 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 7568 if (LocalID < NUM_PREDEF_MACRO_IDS) 7569 return LocalID; 7570 7571 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7572 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 7573 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 7574 7575 return LocalID + I->second; 7576 } 7577 7578 serialization::SubmoduleID 7579 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 7580 if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 7581 return LocalID; 7582 7583 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7584 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 7585 assert(I != M.SubmoduleRemap.end() 7586 && "Invalid index into submodule index remap"); 7587 7588 return LocalID + I->second; 7589 } 7590 7591 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) { 7592 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 7593 assert(GlobalID == 0 && "Unhandled global submodule ID"); 7594 return nullptr; 7595 } 7596 7597 if (GlobalID > SubmodulesLoaded.size()) { 7598 Error("submodule ID out of range in AST file"); 7599 return nullptr; 7600 } 7601 7602 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 7603 } 7604 7605 Module *ASTReader::getModule(unsigned ID) { 7606 return getSubmodule(ID); 7607 } 7608 7609 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 7610 return DecodeSelector(getGlobalSelectorID(M, LocalID)); 7611 } 7612 7613 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { 7614 if (ID == 0) 7615 return Selector(); 7616 7617 if (ID > SelectorsLoaded.size()) { 7618 Error("selector ID out of range in AST file"); 7619 return Selector(); 7620 } 7621 7622 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) { 7623 // Load this selector from the selector table. 7624 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 7625 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 7626 ModuleFile &M = *I->second; 7627 ASTSelectorLookupTrait Trait(*this, M); 7628 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 7629 SelectorsLoaded[ID - 1] = 7630 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 7631 if (DeserializationListener) 7632 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 7633 } 7634 7635 return SelectorsLoaded[ID - 1]; 7636 } 7637 7638 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 7639 return DecodeSelector(ID); 7640 } 7641 7642 uint32_t ASTReader::GetNumExternalSelectors() { 7643 // ID 0 (the null selector) is considered an external selector. 7644 return getTotalNumSelectors() + 1; 7645 } 7646 7647 serialization::SelectorID 7648 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 7649 if (LocalID < NUM_PREDEF_SELECTOR_IDS) 7650 return LocalID; 7651 7652 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7653 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 7654 assert(I != M.SelectorRemap.end() 7655 && "Invalid index into selector index remap"); 7656 7657 return LocalID + I->second; 7658 } 7659 7660 DeclarationName 7661 ASTReader::ReadDeclarationName(ModuleFile &F, 7662 const RecordData &Record, unsigned &Idx) { 7663 DeclarationName::NameKind Kind = (DeclarationName::NameKind)Record[Idx++]; 7664 switch (Kind) { 7665 case DeclarationName::Identifier: 7666 return DeclarationName(GetIdentifierInfo(F, Record, Idx)); 7667 7668 case DeclarationName::ObjCZeroArgSelector: 7669 case DeclarationName::ObjCOneArgSelector: 7670 case DeclarationName::ObjCMultiArgSelector: 7671 return DeclarationName(ReadSelector(F, Record, Idx)); 7672 7673 case DeclarationName::CXXConstructorName: 7674 return Context.DeclarationNames.getCXXConstructorName( 7675 Context.getCanonicalType(readType(F, Record, Idx))); 7676 7677 case DeclarationName::CXXDestructorName: 7678 return Context.DeclarationNames.getCXXDestructorName( 7679 Context.getCanonicalType(readType(F, Record, Idx))); 7680 7681 case DeclarationName::CXXConversionFunctionName: 7682 return Context.DeclarationNames.getCXXConversionFunctionName( 7683 Context.getCanonicalType(readType(F, Record, Idx))); 7684 7685 case DeclarationName::CXXOperatorName: 7686 return Context.DeclarationNames.getCXXOperatorName( 7687 (OverloadedOperatorKind)Record[Idx++]); 7688 7689 case DeclarationName::CXXLiteralOperatorName: 7690 return Context.DeclarationNames.getCXXLiteralOperatorName( 7691 GetIdentifierInfo(F, Record, Idx)); 7692 7693 case DeclarationName::CXXUsingDirective: 7694 return DeclarationName::getUsingDirectiveName(); 7695 } 7696 7697 llvm_unreachable("Invalid NameKind!"); 7698 } 7699 7700 void ASTReader::ReadDeclarationNameLoc(ModuleFile &F, 7701 DeclarationNameLoc &DNLoc, 7702 DeclarationName Name, 7703 const RecordData &Record, unsigned &Idx) { 7704 switch (Name.getNameKind()) { 7705 case DeclarationName::CXXConstructorName: 7706 case DeclarationName::CXXDestructorName: 7707 case DeclarationName::CXXConversionFunctionName: 7708 DNLoc.NamedType.TInfo = GetTypeSourceInfo(F, Record, Idx); 7709 break; 7710 7711 case DeclarationName::CXXOperatorName: 7712 DNLoc.CXXOperatorName.BeginOpNameLoc 7713 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 7714 DNLoc.CXXOperatorName.EndOpNameLoc 7715 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 7716 break; 7717 7718 case DeclarationName::CXXLiteralOperatorName: 7719 DNLoc.CXXLiteralOperatorName.OpNameLoc 7720 = ReadSourceLocation(F, Record, Idx).getRawEncoding(); 7721 break; 7722 7723 case DeclarationName::Identifier: 7724 case DeclarationName::ObjCZeroArgSelector: 7725 case DeclarationName::ObjCOneArgSelector: 7726 case DeclarationName::ObjCMultiArgSelector: 7727 case DeclarationName::CXXUsingDirective: 7728 break; 7729 } 7730 } 7731 7732 void ASTReader::ReadDeclarationNameInfo(ModuleFile &F, 7733 DeclarationNameInfo &NameInfo, 7734 const RecordData &Record, unsigned &Idx) { 7735 NameInfo.setName(ReadDeclarationName(F, Record, Idx)); 7736 NameInfo.setLoc(ReadSourceLocation(F, Record, Idx)); 7737 DeclarationNameLoc DNLoc; 7738 ReadDeclarationNameLoc(F, DNLoc, NameInfo.getName(), Record, Idx); 7739 NameInfo.setInfo(DNLoc); 7740 } 7741 7742 void ASTReader::ReadQualifierInfo(ModuleFile &F, QualifierInfo &Info, 7743 const RecordData &Record, unsigned &Idx) { 7744 Info.QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx); 7745 unsigned NumTPLists = Record[Idx++]; 7746 Info.NumTemplParamLists = NumTPLists; 7747 if (NumTPLists) { 7748 Info.TemplParamLists = new (Context) TemplateParameterList*[NumTPLists]; 7749 for (unsigned i=0; i != NumTPLists; ++i) 7750 Info.TemplParamLists[i] = ReadTemplateParameterList(F, Record, Idx); 7751 } 7752 } 7753 7754 TemplateName 7755 ASTReader::ReadTemplateName(ModuleFile &F, const RecordData &Record, 7756 unsigned &Idx) { 7757 TemplateName::NameKind Kind = (TemplateName::NameKind)Record[Idx++]; 7758 switch (Kind) { 7759 case TemplateName::Template: 7760 return TemplateName(ReadDeclAs<TemplateDecl>(F, Record, Idx)); 7761 7762 case TemplateName::OverloadedTemplate: { 7763 unsigned size = Record[Idx++]; 7764 UnresolvedSet<8> Decls; 7765 while (size--) 7766 Decls.addDecl(ReadDeclAs<NamedDecl>(F, Record, Idx)); 7767 7768 return Context.getOverloadedTemplateName(Decls.begin(), Decls.end()); 7769 } 7770 7771 case TemplateName::QualifiedTemplate: { 7772 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 7773 bool hasTemplKeyword = Record[Idx++]; 7774 TemplateDecl *Template = ReadDeclAs<TemplateDecl>(F, Record, Idx); 7775 return Context.getQualifiedTemplateName(NNS, hasTemplKeyword, Template); 7776 } 7777 7778 case TemplateName::DependentTemplate: { 7779 NestedNameSpecifier *NNS = ReadNestedNameSpecifier(F, Record, Idx); 7780 if (Record[Idx++]) // isIdentifier 7781 return Context.getDependentTemplateName(NNS, 7782 GetIdentifierInfo(F, Record, 7783 Idx)); 7784 return Context.getDependentTemplateName(NNS, 7785 (OverloadedOperatorKind)Record[Idx++]); 7786 } 7787 7788 case TemplateName::SubstTemplateTemplateParm: { 7789 TemplateTemplateParmDecl *param 7790 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 7791 if (!param) return TemplateName(); 7792 TemplateName replacement = ReadTemplateName(F, Record, Idx); 7793 return Context.getSubstTemplateTemplateParm(param, replacement); 7794 } 7795 7796 case TemplateName::SubstTemplateTemplateParmPack: { 7797 TemplateTemplateParmDecl *Param 7798 = ReadDeclAs<TemplateTemplateParmDecl>(F, Record, Idx); 7799 if (!Param) 7800 return TemplateName(); 7801 7802 TemplateArgument ArgPack = ReadTemplateArgument(F, Record, Idx); 7803 if (ArgPack.getKind() != TemplateArgument::Pack) 7804 return TemplateName(); 7805 7806 return Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 7807 } 7808 } 7809 7810 llvm_unreachable("Unhandled template name kind!"); 7811 } 7812 7813 TemplateArgument 7814 ASTReader::ReadTemplateArgument(ModuleFile &F, 7815 const RecordData &Record, unsigned &Idx) { 7816 TemplateArgument::ArgKind Kind = (TemplateArgument::ArgKind)Record[Idx++]; 7817 switch (Kind) { 7818 case TemplateArgument::Null: 7819 return TemplateArgument(); 7820 case TemplateArgument::Type: 7821 return TemplateArgument(readType(F, Record, Idx)); 7822 case TemplateArgument::Declaration: { 7823 ValueDecl *D = ReadDeclAs<ValueDecl>(F, Record, Idx); 7824 return TemplateArgument(D, readType(F, Record, Idx)); 7825 } 7826 case TemplateArgument::NullPtr: 7827 return TemplateArgument(readType(F, Record, Idx), /*isNullPtr*/true); 7828 case TemplateArgument::Integral: { 7829 llvm::APSInt Value = ReadAPSInt(Record, Idx); 7830 QualType T = readType(F, Record, Idx); 7831 return TemplateArgument(Context, Value, T); 7832 } 7833 case TemplateArgument::Template: 7834 return TemplateArgument(ReadTemplateName(F, Record, Idx)); 7835 case TemplateArgument::TemplateExpansion: { 7836 TemplateName Name = ReadTemplateName(F, Record, Idx); 7837 Optional<unsigned> NumTemplateExpansions; 7838 if (unsigned NumExpansions = Record[Idx++]) 7839 NumTemplateExpansions = NumExpansions - 1; 7840 return TemplateArgument(Name, NumTemplateExpansions); 7841 } 7842 case TemplateArgument::Expression: 7843 return TemplateArgument(ReadExpr(F)); 7844 case TemplateArgument::Pack: { 7845 unsigned NumArgs = Record[Idx++]; 7846 TemplateArgument *Args = new (Context) TemplateArgument[NumArgs]; 7847 for (unsigned I = 0; I != NumArgs; ++I) 7848 Args[I] = ReadTemplateArgument(F, Record, Idx); 7849 return TemplateArgument(Args, NumArgs); 7850 } 7851 } 7852 7853 llvm_unreachable("Unhandled template argument kind!"); 7854 } 7855 7856 TemplateParameterList * 7857 ASTReader::ReadTemplateParameterList(ModuleFile &F, 7858 const RecordData &Record, unsigned &Idx) { 7859 SourceLocation TemplateLoc = ReadSourceLocation(F, Record, Idx); 7860 SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Idx); 7861 SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Idx); 7862 7863 unsigned NumParams = Record[Idx++]; 7864 SmallVector<NamedDecl *, 16> Params; 7865 Params.reserve(NumParams); 7866 while (NumParams--) 7867 Params.push_back(ReadDeclAs<NamedDecl>(F, Record, Idx)); 7868 7869 TemplateParameterList* TemplateParams = 7870 TemplateParameterList::Create(Context, TemplateLoc, LAngleLoc, 7871 Params.data(), Params.size(), RAngleLoc); 7872 return TemplateParams; 7873 } 7874 7875 void 7876 ASTReader:: 7877 ReadTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs, 7878 ModuleFile &F, const RecordData &Record, 7879 unsigned &Idx) { 7880 unsigned NumTemplateArgs = Record[Idx++]; 7881 TemplArgs.reserve(NumTemplateArgs); 7882 while (NumTemplateArgs--) 7883 TemplArgs.push_back(ReadTemplateArgument(F, Record, Idx)); 7884 } 7885 7886 /// \brief Read a UnresolvedSet structure. 7887 void ASTReader::ReadUnresolvedSet(ModuleFile &F, LazyASTUnresolvedSet &Set, 7888 const RecordData &Record, unsigned &Idx) { 7889 unsigned NumDecls = Record[Idx++]; 7890 Set.reserve(Context, NumDecls); 7891 while (NumDecls--) { 7892 DeclID ID = ReadDeclID(F, Record, Idx); 7893 AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 7894 Set.addLazyDecl(Context, ID, AS); 7895 } 7896 } 7897 7898 CXXBaseSpecifier 7899 ASTReader::ReadCXXBaseSpecifier(ModuleFile &F, 7900 const RecordData &Record, unsigned &Idx) { 7901 bool isVirtual = static_cast<bool>(Record[Idx++]); 7902 bool isBaseOfClass = static_cast<bool>(Record[Idx++]); 7903 AccessSpecifier AS = static_cast<AccessSpecifier>(Record[Idx++]); 7904 bool inheritConstructors = static_cast<bool>(Record[Idx++]); 7905 TypeSourceInfo *TInfo = GetTypeSourceInfo(F, Record, Idx); 7906 SourceRange Range = ReadSourceRange(F, Record, Idx); 7907 SourceLocation EllipsisLoc = ReadSourceLocation(F, Record, Idx); 7908 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 7909 EllipsisLoc); 7910 Result.setInheritConstructors(inheritConstructors); 7911 return Result; 7912 } 7913 7914 std::pair<CXXCtorInitializer **, unsigned> 7915 ASTReader::ReadCXXCtorInitializers(ModuleFile &F, const RecordData &Record, 7916 unsigned &Idx) { 7917 CXXCtorInitializer **CtorInitializers = nullptr; 7918 unsigned NumInitializers = Record[Idx++]; 7919 if (NumInitializers) { 7920 CtorInitializers 7921 = new (Context) CXXCtorInitializer*[NumInitializers]; 7922 for (unsigned i=0; i != NumInitializers; ++i) { 7923 TypeSourceInfo *TInfo = nullptr; 7924 bool IsBaseVirtual = false; 7925 FieldDecl *Member = nullptr; 7926 IndirectFieldDecl *IndirectMember = nullptr; 7927 7928 CtorInitializerType Type = (CtorInitializerType)Record[Idx++]; 7929 switch (Type) { 7930 case CTOR_INITIALIZER_BASE: 7931 TInfo = GetTypeSourceInfo(F, Record, Idx); 7932 IsBaseVirtual = Record[Idx++]; 7933 break; 7934 7935 case CTOR_INITIALIZER_DELEGATING: 7936 TInfo = GetTypeSourceInfo(F, Record, Idx); 7937 break; 7938 7939 case CTOR_INITIALIZER_MEMBER: 7940 Member = ReadDeclAs<FieldDecl>(F, Record, Idx); 7941 break; 7942 7943 case CTOR_INITIALIZER_INDIRECT_MEMBER: 7944 IndirectMember = ReadDeclAs<IndirectFieldDecl>(F, Record, Idx); 7945 break; 7946 } 7947 7948 SourceLocation MemberOrEllipsisLoc = ReadSourceLocation(F, Record, Idx); 7949 Expr *Init = ReadExpr(F); 7950 SourceLocation LParenLoc = ReadSourceLocation(F, Record, Idx); 7951 SourceLocation RParenLoc = ReadSourceLocation(F, Record, Idx); 7952 bool IsWritten = Record[Idx++]; 7953 unsigned SourceOrderOrNumArrayIndices; 7954 SmallVector<VarDecl *, 8> Indices; 7955 if (IsWritten) { 7956 SourceOrderOrNumArrayIndices = Record[Idx++]; 7957 } else { 7958 SourceOrderOrNumArrayIndices = Record[Idx++]; 7959 Indices.reserve(SourceOrderOrNumArrayIndices); 7960 for (unsigned i=0; i != SourceOrderOrNumArrayIndices; ++i) 7961 Indices.push_back(ReadDeclAs<VarDecl>(F, Record, Idx)); 7962 } 7963 7964 CXXCtorInitializer *BOMInit; 7965 if (Type == CTOR_INITIALIZER_BASE) { 7966 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, IsBaseVirtual, 7967 LParenLoc, Init, RParenLoc, 7968 MemberOrEllipsisLoc); 7969 } else if (Type == CTOR_INITIALIZER_DELEGATING) { 7970 BOMInit = new (Context) CXXCtorInitializer(Context, TInfo, LParenLoc, 7971 Init, RParenLoc); 7972 } else if (IsWritten) { 7973 if (Member) 7974 BOMInit = new (Context) CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, 7975 LParenLoc, Init, RParenLoc); 7976 else 7977 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember, 7978 MemberOrEllipsisLoc, LParenLoc, 7979 Init, RParenLoc); 7980 } else { 7981 if (IndirectMember) { 7982 assert(Indices.empty() && "Indirect field improperly initialized"); 7983 BOMInit = new (Context) CXXCtorInitializer(Context, IndirectMember, 7984 MemberOrEllipsisLoc, LParenLoc, 7985 Init, RParenLoc); 7986 } else { 7987 BOMInit = CXXCtorInitializer::Create(Context, Member, MemberOrEllipsisLoc, 7988 LParenLoc, Init, RParenLoc, 7989 Indices.data(), Indices.size()); 7990 } 7991 } 7992 7993 if (IsWritten) 7994 BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices); 7995 CtorInitializers[i] = BOMInit; 7996 } 7997 } 7998 7999 return std::make_pair(CtorInitializers, NumInitializers); 8000 } 8001 8002 NestedNameSpecifier * 8003 ASTReader::ReadNestedNameSpecifier(ModuleFile &F, 8004 const RecordData &Record, unsigned &Idx) { 8005 unsigned N = Record[Idx++]; 8006 NestedNameSpecifier *NNS = nullptr, *Prev = nullptr; 8007 for (unsigned I = 0; I != N; ++I) { 8008 NestedNameSpecifier::SpecifierKind Kind 8009 = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 8010 switch (Kind) { 8011 case NestedNameSpecifier::Identifier: { 8012 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 8013 NNS = NestedNameSpecifier::Create(Context, Prev, II); 8014 break; 8015 } 8016 8017 case NestedNameSpecifier::Namespace: { 8018 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 8019 NNS = NestedNameSpecifier::Create(Context, Prev, NS); 8020 break; 8021 } 8022 8023 case NestedNameSpecifier::NamespaceAlias: { 8024 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 8025 NNS = NestedNameSpecifier::Create(Context, Prev, Alias); 8026 break; 8027 } 8028 8029 case NestedNameSpecifier::TypeSpec: 8030 case NestedNameSpecifier::TypeSpecWithTemplate: { 8031 const Type *T = readType(F, Record, Idx).getTypePtrOrNull(); 8032 if (!T) 8033 return nullptr; 8034 8035 bool Template = Record[Idx++]; 8036 NNS = NestedNameSpecifier::Create(Context, Prev, Template, T); 8037 break; 8038 } 8039 8040 case NestedNameSpecifier::Global: { 8041 NNS = NestedNameSpecifier::GlobalSpecifier(Context); 8042 // No associated value, and there can't be a prefix. 8043 break; 8044 } 8045 8046 case NestedNameSpecifier::Super: { 8047 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx); 8048 NNS = NestedNameSpecifier::SuperSpecifier(Context, RD); 8049 break; 8050 } 8051 } 8052 Prev = NNS; 8053 } 8054 return NNS; 8055 } 8056 8057 NestedNameSpecifierLoc 8058 ASTReader::ReadNestedNameSpecifierLoc(ModuleFile &F, const RecordData &Record, 8059 unsigned &Idx) { 8060 unsigned N = Record[Idx++]; 8061 NestedNameSpecifierLocBuilder Builder; 8062 for (unsigned I = 0; I != N; ++I) { 8063 NestedNameSpecifier::SpecifierKind Kind 8064 = (NestedNameSpecifier::SpecifierKind)Record[Idx++]; 8065 switch (Kind) { 8066 case NestedNameSpecifier::Identifier: { 8067 IdentifierInfo *II = GetIdentifierInfo(F, Record, Idx); 8068 SourceRange Range = ReadSourceRange(F, Record, Idx); 8069 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 8070 break; 8071 } 8072 8073 case NestedNameSpecifier::Namespace: { 8074 NamespaceDecl *NS = ReadDeclAs<NamespaceDecl>(F, Record, Idx); 8075 SourceRange Range = ReadSourceRange(F, Record, Idx); 8076 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 8077 break; 8078 } 8079 8080 case NestedNameSpecifier::NamespaceAlias: { 8081 NamespaceAliasDecl *Alias =ReadDeclAs<NamespaceAliasDecl>(F, Record, Idx); 8082 SourceRange Range = ReadSourceRange(F, Record, Idx); 8083 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 8084 break; 8085 } 8086 8087 case NestedNameSpecifier::TypeSpec: 8088 case NestedNameSpecifier::TypeSpecWithTemplate: { 8089 bool Template = Record[Idx++]; 8090 TypeSourceInfo *T = GetTypeSourceInfo(F, Record, Idx); 8091 if (!T) 8092 return NestedNameSpecifierLoc(); 8093 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 8094 8095 // FIXME: 'template' keyword location not saved anywhere, so we fake it. 8096 Builder.Extend(Context, 8097 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 8098 T->getTypeLoc(), ColonColonLoc); 8099 break; 8100 } 8101 8102 case NestedNameSpecifier::Global: { 8103 SourceLocation ColonColonLoc = ReadSourceLocation(F, Record, Idx); 8104 Builder.MakeGlobal(Context, ColonColonLoc); 8105 break; 8106 } 8107 8108 case NestedNameSpecifier::Super: { 8109 CXXRecordDecl *RD = ReadDeclAs<CXXRecordDecl>(F, Record, Idx); 8110 SourceRange Range = ReadSourceRange(F, Record, Idx); 8111 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd()); 8112 break; 8113 } 8114 } 8115 } 8116 8117 return Builder.getWithLocInContext(Context); 8118 } 8119 8120 SourceRange 8121 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 8122 unsigned &Idx) { 8123 SourceLocation beg = ReadSourceLocation(F, Record, Idx); 8124 SourceLocation end = ReadSourceLocation(F, Record, Idx); 8125 return SourceRange(beg, end); 8126 } 8127 8128 /// \brief Read an integral value 8129 llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) { 8130 unsigned BitWidth = Record[Idx++]; 8131 unsigned NumWords = llvm::APInt::getNumWords(BitWidth); 8132 llvm::APInt Result(BitWidth, NumWords, &Record[Idx]); 8133 Idx += NumWords; 8134 return Result; 8135 } 8136 8137 /// \brief Read a signed integral value 8138 llvm::APSInt ASTReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) { 8139 bool isUnsigned = Record[Idx++]; 8140 return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned); 8141 } 8142 8143 /// \brief Read a floating-point value 8144 llvm::APFloat ASTReader::ReadAPFloat(const RecordData &Record, 8145 const llvm::fltSemantics &Sem, 8146 unsigned &Idx) { 8147 return llvm::APFloat(Sem, ReadAPInt(Record, Idx)); 8148 } 8149 8150 // \brief Read a string 8151 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 8152 unsigned Len = Record[Idx++]; 8153 std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 8154 Idx += Len; 8155 return Result; 8156 } 8157 8158 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record, 8159 unsigned &Idx) { 8160 std::string Filename = ReadString(Record, Idx); 8161 ResolveImportedPath(F, Filename); 8162 return Filename; 8163 } 8164 8165 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 8166 unsigned &Idx) { 8167 unsigned Major = Record[Idx++]; 8168 unsigned Minor = Record[Idx++]; 8169 unsigned Subminor = Record[Idx++]; 8170 if (Minor == 0) 8171 return VersionTuple(Major); 8172 if (Subminor == 0) 8173 return VersionTuple(Major, Minor - 1); 8174 return VersionTuple(Major, Minor - 1, Subminor - 1); 8175 } 8176 8177 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 8178 const RecordData &Record, 8179 unsigned &Idx) { 8180 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 8181 return CXXTemporary::Create(Context, Decl); 8182 } 8183 8184 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) { 8185 return Diag(CurrentImportLoc, DiagID); 8186 } 8187 8188 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) { 8189 return Diags.Report(Loc, DiagID); 8190 } 8191 8192 /// \brief Retrieve the identifier table associated with the 8193 /// preprocessor. 8194 IdentifierTable &ASTReader::getIdentifierTable() { 8195 return PP.getIdentifierTable(); 8196 } 8197 8198 /// \brief Record that the given ID maps to the given switch-case 8199 /// statement. 8200 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 8201 assert((*CurrSwitchCaseStmts)[ID] == nullptr && 8202 "Already have a SwitchCase with this ID"); 8203 (*CurrSwitchCaseStmts)[ID] = SC; 8204 } 8205 8206 /// \brief Retrieve the switch-case statement with the given ID. 8207 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 8208 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID"); 8209 return (*CurrSwitchCaseStmts)[ID]; 8210 } 8211 8212 void ASTReader::ClearSwitchCaseIDs() { 8213 CurrSwitchCaseStmts->clear(); 8214 } 8215 8216 void ASTReader::ReadComments() { 8217 std::vector<RawComment *> Comments; 8218 for (SmallVectorImpl<std::pair<BitstreamCursor, 8219 serialization::ModuleFile *> >::iterator 8220 I = CommentsCursors.begin(), 8221 E = CommentsCursors.end(); 8222 I != E; ++I) { 8223 Comments.clear(); 8224 BitstreamCursor &Cursor = I->first; 8225 serialization::ModuleFile &F = *I->second; 8226 SavedStreamPosition SavedPosition(Cursor); 8227 8228 RecordData Record; 8229 while (true) { 8230 llvm::BitstreamEntry Entry = 8231 Cursor.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd); 8232 8233 switch (Entry.Kind) { 8234 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 8235 case llvm::BitstreamEntry::Error: 8236 Error("malformed block record in AST file"); 8237 return; 8238 case llvm::BitstreamEntry::EndBlock: 8239 goto NextCursor; 8240 case llvm::BitstreamEntry::Record: 8241 // The interesting case. 8242 break; 8243 } 8244 8245 // Read a record. 8246 Record.clear(); 8247 switch ((CommentRecordTypes)Cursor.readRecord(Entry.ID, Record)) { 8248 case COMMENTS_RAW_COMMENT: { 8249 unsigned Idx = 0; 8250 SourceRange SR = ReadSourceRange(F, Record, Idx); 8251 RawComment::CommentKind Kind = 8252 (RawComment::CommentKind) Record[Idx++]; 8253 bool IsTrailingComment = Record[Idx++]; 8254 bool IsAlmostTrailingComment = Record[Idx++]; 8255 Comments.push_back(new (Context) RawComment( 8256 SR, Kind, IsTrailingComment, IsAlmostTrailingComment, 8257 Context.getLangOpts().CommentOpts.ParseAllComments)); 8258 break; 8259 } 8260 } 8261 } 8262 NextCursor: 8263 Context.Comments.addDeserializedComments(Comments); 8264 } 8265 } 8266 8267 void ASTReader::getInputFiles(ModuleFile &F, 8268 SmallVectorImpl<serialization::InputFile> &Files) { 8269 for (unsigned I = 0, E = F.InputFilesLoaded.size(); I != E; ++I) { 8270 unsigned ID = I+1; 8271 Files.push_back(getInputFile(F, ID)); 8272 } 8273 } 8274 8275 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) { 8276 // If we know the owning module, use it. 8277 if (Module *M = D->getOwningModule()) 8278 return M->getFullModuleName(); 8279 8280 // Otherwise, use the name of the top-level module the decl is within. 8281 if (ModuleFile *M = getOwningModuleFile(D)) 8282 return M->ModuleName; 8283 8284 // Not from a module. 8285 return ""; 8286 } 8287 8288 void ASTReader::finishPendingActions() { 8289 while (!PendingIdentifierInfos.empty() || 8290 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() || 8291 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || 8292 !PendingUpdateRecords.empty()) { 8293 // If any identifiers with corresponding top-level declarations have 8294 // been loaded, load those declarations now. 8295 typedef llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2> > 8296 TopLevelDeclsMap; 8297 TopLevelDeclsMap TopLevelDecls; 8298 8299 while (!PendingIdentifierInfos.empty()) { 8300 IdentifierInfo *II = PendingIdentifierInfos.back().first; 8301 SmallVector<uint32_t, 4> DeclIDs = 8302 std::move(PendingIdentifierInfos.back().second); 8303 PendingIdentifierInfos.pop_back(); 8304 8305 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 8306 } 8307 8308 // For each decl chain that we wanted to complete while deserializing, mark 8309 // it as "still needs to be completed". 8310 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) { 8311 markIncompleteDeclChain(PendingIncompleteDeclChains[I]); 8312 } 8313 PendingIncompleteDeclChains.clear(); 8314 8315 // Load pending declaration chains. 8316 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) { 8317 loadPendingDeclChain(PendingDeclChains[I]); 8318 PendingDeclChainsKnown.erase(PendingDeclChains[I]); 8319 } 8320 PendingDeclChains.clear(); 8321 8322 // Make the most recent of the top-level declarations visible. 8323 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 8324 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 8325 IdentifierInfo *II = TLD->first; 8326 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 8327 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 8328 } 8329 } 8330 8331 // Load any pending macro definitions. 8332 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 8333 IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 8334 SmallVector<PendingMacroInfo, 2> GlobalIDs; 8335 GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 8336 // Initialize the macro history from chained-PCHs ahead of module imports. 8337 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 8338 ++IDIdx) { 8339 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 8340 if (Info.M->Kind != MK_ImplicitModule && 8341 Info.M->Kind != MK_ExplicitModule) 8342 resolvePendingMacro(II, Info); 8343 } 8344 // Handle module imports. 8345 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 8346 ++IDIdx) { 8347 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 8348 if (Info.M->Kind == MK_ImplicitModule || 8349 Info.M->Kind == MK_ExplicitModule) 8350 resolvePendingMacro(II, Info); 8351 } 8352 } 8353 PendingMacroIDs.clear(); 8354 8355 // Wire up the DeclContexts for Decls that we delayed setting until 8356 // recursive loading is completed. 8357 while (!PendingDeclContextInfos.empty()) { 8358 PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 8359 PendingDeclContextInfos.pop_front(); 8360 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 8361 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 8362 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 8363 } 8364 8365 // Perform any pending declaration updates. 8366 while (!PendingUpdateRecords.empty()) { 8367 auto Update = PendingUpdateRecords.pop_back_val(); 8368 ReadingKindTracker ReadingKind(Read_Decl, *this); 8369 loadDeclUpdateRecords(Update.first, Update.second); 8370 } 8371 } 8372 8373 // At this point, all update records for loaded decls are in place, so any 8374 // fake class definitions should have become real. 8375 assert(PendingFakeDefinitionData.empty() && 8376 "faked up a class definition but never saw the real one"); 8377 8378 // If we deserialized any C++ or Objective-C class definitions, any 8379 // Objective-C protocol definitions, or any redeclarable templates, make sure 8380 // that all redeclarations point to the definitions. Note that this can only 8381 // happen now, after the redeclaration chains have been fully wired. 8382 for (Decl *D : PendingDefinitions) { 8383 if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 8384 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) { 8385 // Make sure that the TagType points at the definition. 8386 const_cast<TagType*>(TagT)->decl = TD; 8387 } 8388 8389 if (auto RD = dyn_cast<CXXRecordDecl>(D)) { 8390 for (auto R : RD->redecls()) { 8391 assert((R == D) == R->isThisDeclarationADefinition() && 8392 "declaration thinks it's the definition but it isn't"); 8393 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData; 8394 } 8395 } 8396 8397 continue; 8398 } 8399 8400 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) { 8401 // Make sure that the ObjCInterfaceType points at the definition. 8402 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 8403 ->Decl = ID; 8404 8405 for (auto R : ID->redecls()) 8406 R->Data = ID->Data; 8407 8408 continue; 8409 } 8410 8411 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) { 8412 for (auto R : PD->redecls()) 8413 R->Data = PD->Data; 8414 8415 continue; 8416 } 8417 8418 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl(); 8419 for (auto R : RTD->redecls()) 8420 R->Common = RTD->Common; 8421 } 8422 PendingDefinitions.clear(); 8423 8424 // Load the bodies of any functions or methods we've encountered. We do 8425 // this now (delayed) so that we can be sure that the declaration chains 8426 // have been fully wired up. 8427 for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 8428 PBEnd = PendingBodies.end(); 8429 PB != PBEnd; ++PB) { 8430 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 8431 // FIXME: Check for =delete/=default? 8432 // FIXME: Complain about ODR violations here? 8433 if (!getContext().getLangOpts().Modules || !FD->hasBody()) 8434 FD->setLazyBody(PB->second); 8435 continue; 8436 } 8437 8438 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 8439 if (!getContext().getLangOpts().Modules || !MD->hasBody()) 8440 MD->setLazyBody(PB->second); 8441 } 8442 PendingBodies.clear(); 8443 } 8444 8445 void ASTReader::diagnoseOdrViolations() { 8446 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty()) 8447 return; 8448 8449 // Trigger the import of the full definition of each class that had any 8450 // odr-merging problems, so we can produce better diagnostics for them. 8451 // These updates may in turn find and diagnose some ODR failures, so take 8452 // ownership of the set first. 8453 auto OdrMergeFailures = std::move(PendingOdrMergeFailures); 8454 PendingOdrMergeFailures.clear(); 8455 for (auto &Merge : OdrMergeFailures) { 8456 Merge.first->buildLookup(); 8457 Merge.first->decls_begin(); 8458 Merge.first->bases_begin(); 8459 Merge.first->vbases_begin(); 8460 for (auto *RD : Merge.second) { 8461 RD->decls_begin(); 8462 RD->bases_begin(); 8463 RD->vbases_begin(); 8464 } 8465 } 8466 8467 // For each declaration from a merged context, check that the canonical 8468 // definition of that context also contains a declaration of the same 8469 // entity. 8470 // 8471 // Caution: this loop does things that might invalidate iterators into 8472 // PendingOdrMergeChecks. Don't turn this into a range-based for loop! 8473 while (!PendingOdrMergeChecks.empty()) { 8474 NamedDecl *D = PendingOdrMergeChecks.pop_back_val(); 8475 8476 // FIXME: Skip over implicit declarations for now. This matters for things 8477 // like implicitly-declared special member functions. This isn't entirely 8478 // correct; we can end up with multiple unmerged declarations of the same 8479 // implicit entity. 8480 if (D->isImplicit()) 8481 continue; 8482 8483 DeclContext *CanonDef = D->getDeclContext(); 8484 8485 bool Found = false; 8486 const Decl *DCanon = D->getCanonicalDecl(); 8487 8488 for (auto RI : D->redecls()) { 8489 if (RI->getLexicalDeclContext() == CanonDef) { 8490 Found = true; 8491 break; 8492 } 8493 } 8494 if (Found) 8495 continue; 8496 8497 llvm::SmallVector<const NamedDecl*, 4> Candidates; 8498 DeclContext::lookup_result R = CanonDef->lookup(D->getDeclName()); 8499 for (DeclContext::lookup_iterator I = R.begin(), E = R.end(); 8500 !Found && I != E; ++I) { 8501 for (auto RI : (*I)->redecls()) { 8502 if (RI->getLexicalDeclContext() == CanonDef) { 8503 // This declaration is present in the canonical definition. If it's 8504 // in the same redecl chain, it's the one we're looking for. 8505 if (RI->getCanonicalDecl() == DCanon) 8506 Found = true; 8507 else 8508 Candidates.push_back(cast<NamedDecl>(RI)); 8509 break; 8510 } 8511 } 8512 } 8513 8514 if (!Found) { 8515 // The AST doesn't like TagDecls becoming invalid after they've been 8516 // completed. We only really need to mark FieldDecls as invalid here. 8517 if (!isa<TagDecl>(D)) 8518 D->setInvalidDecl(); 8519 8520 // Ensure we don't accidentally recursively enter deserialization while 8521 // we're producing our diagnostic. 8522 Deserializing RecursionGuard(this); 8523 8524 std::string CanonDefModule = 8525 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef)); 8526 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl) 8527 << D << getOwningModuleNameForDiagnostic(D) 8528 << CanonDef << CanonDefModule.empty() << CanonDefModule; 8529 8530 if (Candidates.empty()) 8531 Diag(cast<Decl>(CanonDef)->getLocation(), 8532 diag::note_module_odr_violation_no_possible_decls) << D; 8533 else { 8534 for (unsigned I = 0, N = Candidates.size(); I != N; ++I) 8535 Diag(Candidates[I]->getLocation(), 8536 diag::note_module_odr_violation_possible_decl) 8537 << Candidates[I]; 8538 } 8539 8540 DiagnosedOdrMergeFailures.insert(CanonDef); 8541 } 8542 } 8543 8544 if (OdrMergeFailures.empty()) 8545 return; 8546 8547 // Ensure we don't accidentally recursively enter deserialization while 8548 // we're producing our diagnostics. 8549 Deserializing RecursionGuard(this); 8550 8551 // Issue any pending ODR-failure diagnostics. 8552 for (auto &Merge : OdrMergeFailures) { 8553 // If we've already pointed out a specific problem with this class, don't 8554 // bother issuing a general "something's different" diagnostic. 8555 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 8556 continue; 8557 8558 bool Diagnosed = false; 8559 for (auto *RD : Merge.second) { 8560 // Multiple different declarations got merged together; tell the user 8561 // where they came from. 8562 if (Merge.first != RD) { 8563 // FIXME: Walk the definition, figure out what's different, 8564 // and diagnose that. 8565 if (!Diagnosed) { 8566 std::string Module = getOwningModuleNameForDiagnostic(Merge.first); 8567 Diag(Merge.first->getLocation(), 8568 diag::err_module_odr_violation_different_definitions) 8569 << Merge.first << Module.empty() << Module; 8570 Diagnosed = true; 8571 } 8572 8573 Diag(RD->getLocation(), 8574 diag::note_module_odr_violation_different_definitions) 8575 << getOwningModuleNameForDiagnostic(RD); 8576 } 8577 } 8578 8579 if (!Diagnosed) { 8580 // All definitions are updates to the same declaration. This happens if a 8581 // module instantiates the declaration of a class template specialization 8582 // and two or more other modules instantiate its definition. 8583 // 8584 // FIXME: Indicate which modules had instantiations of this definition. 8585 // FIXME: How can this even happen? 8586 Diag(Merge.first->getLocation(), 8587 diag::err_module_odr_violation_different_instantiations) 8588 << Merge.first; 8589 } 8590 } 8591 } 8592 8593 void ASTReader::FinishedDeserializing() { 8594 assert(NumCurrentElementsDeserializing && 8595 "FinishedDeserializing not paired with StartedDeserializing"); 8596 if (NumCurrentElementsDeserializing == 1) { 8597 // We decrease NumCurrentElementsDeserializing only after pending actions 8598 // are finished, to avoid recursively re-calling finishPendingActions(). 8599 finishPendingActions(); 8600 } 8601 --NumCurrentElementsDeserializing; 8602 8603 if (NumCurrentElementsDeserializing == 0) { 8604 diagnoseOdrViolations(); 8605 8606 // We are not in recursive loading, so it's safe to pass the "interesting" 8607 // decls to the consumer. 8608 if (Consumer) 8609 PassInterestingDeclsToConsumer(); 8610 } 8611 } 8612 8613 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 8614 D = D->getMostRecentDecl(); 8615 8616 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 8617 SemaObj->TUScope->AddDecl(D); 8618 } else if (SemaObj->TUScope) { 8619 // Adding the decl to IdResolver may have failed because it was already in 8620 // (even though it was not added in scope). If it is already in, make sure 8621 // it gets in the scope as well. 8622 if (std::find(SemaObj->IdResolver.begin(Name), 8623 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 8624 SemaObj->TUScope->AddDecl(D); 8625 } 8626 } 8627 8628 ASTReader::ASTReader(Preprocessor &PP, ASTContext &Context, StringRef isysroot, 8629 bool DisableValidation, bool AllowASTWithCompilerErrors, 8630 bool AllowConfigurationMismatch, bool ValidateSystemInputs, 8631 bool UseGlobalIndex) 8632 : Listener(new PCHValidator(PP, *this)), DeserializationListener(nullptr), 8633 OwnsDeserializationListener(false), SourceMgr(PP.getSourceManager()), 8634 FileMgr(PP.getFileManager()), Diags(PP.getDiagnostics()), 8635 SemaObj(nullptr), PP(PP), Context(Context), Consumer(nullptr), 8636 ModuleMgr(PP.getFileManager()), isysroot(isysroot), 8637 DisableValidation(DisableValidation), 8638 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 8639 AllowConfigurationMismatch(AllowConfigurationMismatch), 8640 ValidateSystemInputs(ValidateSystemInputs), 8641 UseGlobalIndex(UseGlobalIndex), TriedLoadingGlobalIndex(false), 8642 CurrSwitchCaseStmts(&SwitchCaseStmts), 8643 NumSLocEntriesRead(0), TotalNumSLocEntries(0), NumStatementsRead(0), 8644 TotalNumStatements(0), NumMacrosRead(0), TotalNumMacros(0), 8645 NumIdentifierLookups(0), NumIdentifierLookupHits(0), NumSelectorsRead(0), 8646 NumMethodPoolEntriesRead(0), NumMethodPoolLookups(0), 8647 NumMethodPoolHits(0), NumMethodPoolTableLookups(0), 8648 NumMethodPoolTableHits(0), TotalNumMethodPoolEntries(0), 8649 NumLexicalDeclContextsRead(0), TotalLexicalDeclContexts(0), 8650 NumVisibleDeclContextsRead(0), TotalVisibleDeclContexts(0), 8651 TotalModulesSizeInBits(0), NumCurrentElementsDeserializing(0), 8652 PassingDeclsToConsumer(false), NumCXXBaseSpecifiersLoaded(0), 8653 ReadingKind(Read_None) { 8654 SourceMgr.setExternalSLocEntrySource(this); 8655 } 8656 8657 ASTReader::~ASTReader() { 8658 if (OwnsDeserializationListener) 8659 delete DeserializationListener; 8660 8661 for (DeclContextVisibleUpdatesPending::iterator 8662 I = PendingVisibleUpdates.begin(), 8663 E = PendingVisibleUpdates.end(); 8664 I != E; ++I) { 8665 for (DeclContextVisibleUpdates::iterator J = I->second.begin(), 8666 F = I->second.end(); 8667 J != F; ++J) 8668 delete J->first; 8669 } 8670 } 8671