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