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