96#include "llvm/ADT/APFloat.h" 
   97#include "llvm/ADT/APInt.h" 
   98#include "llvm/ADT/ArrayRef.h" 
   99#include "llvm/ADT/DenseMap.h" 
  100#include "llvm/ADT/FoldingSet.h" 
  101#include "llvm/ADT/IntrusiveRefCntPtr.h" 
  102#include "llvm/ADT/STLExtras.h" 
  103#include "llvm/ADT/ScopeExit.h" 
  104#include "llvm/ADT/Sequence.h" 
  105#include "llvm/ADT/SmallPtrSet.h" 
  106#include "llvm/ADT/SmallVector.h" 
  107#include "llvm/ADT/StringExtras.h" 
  108#include "llvm/ADT/StringMap.h" 
  109#include "llvm/ADT/StringRef.h" 
  110#include "llvm/ADT/iterator_range.h" 
  111#include "llvm/Bitstream/BitstreamReader.h" 
  112#include "llvm/Support/Compiler.h" 
  113#include "llvm/Support/Compression.h" 
  114#include "llvm/Support/DJB.h" 
  115#include "llvm/Support/Endian.h" 
  116#include "llvm/Support/Error.h" 
  117#include "llvm/Support/ErrorHandling.h" 
  118#include "llvm/Support/LEB128.h" 
  119#include "llvm/Support/MemoryBuffer.h" 
  120#include "llvm/Support/Path.h" 
  121#include "llvm/Support/SaveAndRestore.h" 
  122#include "llvm/Support/TimeProfiler.h" 
  123#include "llvm/Support/Timer.h" 
  124#include "llvm/Support/VersionTuple.h" 
  125#include "llvm/Support/raw_ostream.h" 
  126#include "llvm/TargetParser/Triple.h" 
  139#include <system_error> 
  144using namespace clang;
 
  147using llvm::BitstreamCursor;
 
  155  return First->ReadFullVersionInformation(FullVersion) ||
 
  156         Second->ReadFullVersionInformation(FullVersion);
 
 
  160  First->ReadModuleName(ModuleName);
 
  161  Second->ReadModuleName(ModuleName);
 
 
  165  First->ReadModuleMapFile(ModuleMapPath);
 
  166  Second->ReadModuleMapFile(ModuleMapPath);
 
 
  170    const LangOptions &LangOpts, StringRef ModuleFilename, 
bool Complain,
 
  171    bool AllowCompatibleDifferences) {
 
  172  return First->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
 
  173                                    AllowCompatibleDifferences) ||
 
  174         Second->ReadLanguageOptions(LangOpts, ModuleFilename, Complain,
 
  175                                     AllowCompatibleDifferences);
 
 
  179    const CodeGenOptions &CGOpts, StringRef ModuleFilename, 
bool Complain,
 
  180    bool AllowCompatibleDifferences) {
 
  181  return First->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
 
  182                                   AllowCompatibleDifferences) ||
 
  183         Second->ReadCodeGenOptions(CGOpts, ModuleFilename, Complain,
 
  184                                    AllowCompatibleDifferences);
 
 
  188    const TargetOptions &TargetOpts, StringRef ModuleFilename, 
bool Complain,
 
  189    bool AllowCompatibleDifferences) {
 
  190  return First->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
 
  191                                  AllowCompatibleDifferences) ||
 
  192         Second->ReadTargetOptions(TargetOpts, ModuleFilename, Complain,
 
  193                                   AllowCompatibleDifferences);
 
 
  198  return First->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain) ||
 
  199         Second->ReadDiagnosticOptions(DiagOpts, ModuleFilename, Complain);
 
 
  205  return First->ReadFileSystemOptions(FSOpts, Complain) ||
 
  206         Second->ReadFileSystemOptions(FSOpts, Complain);
 
 
  211    StringRef SpecificModuleCachePath, 
bool Complain) {
 
  212  return First->ReadHeaderSearchOptions(HSOpts, ModuleFilename,
 
  213                                        SpecificModuleCachePath, Complain) ||
 
  214         Second->ReadHeaderSearchOptions(HSOpts, ModuleFilename,
 
  215                                         SpecificModuleCachePath, Complain);
 
 
  220    bool ReadMacros, 
bool Complain, std::string &SuggestedPredefines) {
 
  221  return First->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
 
  222                                        Complain, SuggestedPredefines) ||
 
  223         Second->ReadPreprocessorOptions(PPOpts, ModuleFilename, ReadMacros,
 
  224                                         Complain, SuggestedPredefines);
 
 
  229  First->ReadCounter(M, 
Value);
 
  230  Second->ReadCounter(M, 
Value);
 
 
  234  return First->needsInputFileVisitation() ||
 
  235         Second->needsInputFileVisitation();
 
 
  239  return First->needsSystemInputFileVisitation() ||
 
  240  Second->needsSystemInputFileVisitation();
 
 
  245  First->visitModuleFile(Filename, Kind);
 
  246  Second->visitModuleFile(Filename, Kind);
 
 
  252                                              bool isExplicitModule) {
 
  253  bool Continue = 
false;
 
  254  if (First->needsInputFileVisitation() &&
 
  255      (!isSystem || First->needsSystemInputFileVisitation()))
 
  256    Continue |= First->visitInputFile(Filename, isSystem, isOverridden,
 
  258  if (Second->needsInputFileVisitation() &&
 
  259      (!isSystem || Second->needsSystemInputFileVisitation()))
 
  260    Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,
 
 
  267  First->readModuleFileExtension(Metadata);
 
  268  Second->readModuleFileExtension(Metadata);
 
 
  287                                 StringRef ModuleFilename,
 
  289                                 bool AllowCompatibleDifferences = 
true) {
 
  293#define LANGOPT(Name, Bits, Default, Compatibility, Description)               \ 
  294  if constexpr (CK::Compatibility != CK::Benign) {                             \ 
  295    if ((CK::Compatibility == CK::NotCompatible) ||                            \ 
  296        (CK::Compatibility == CK::Compatible &&                                \ 
  297         !AllowCompatibleDifferences)) {                                       \ 
  298      if (ExistingLangOpts.Name != LangOpts.Name) {                            \ 
  301            Diags->Report(diag::err_ast_file_langopt_mismatch)                 \ 
  302                << Description << LangOpts.Name << ExistingLangOpts.Name       \ 
  305            Diags->Report(diag::err_ast_file_langopt_value_mismatch)           \ 
  306                << Description << ModuleFilename;                              \ 
  313#define VALUE_LANGOPT(Name, Bits, Default, Compatibility, Description)         \ 
  314  if constexpr (CK::Compatibility != CK::Benign) {                             \ 
  315    if ((CK::Compatibility == CK::NotCompatible) ||                            \ 
  316        (CK::Compatibility == CK::Compatible &&                                \ 
  317         !AllowCompatibleDifferences)) {                                       \ 
  318      if (ExistingLangOpts.Name != LangOpts.Name) {                            \ 
  320          Diags->Report(diag::err_ast_file_langopt_value_mismatch)             \ 
  321              << Description << ModuleFilename;                                \ 
  327#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description)    \ 
  328  if constexpr (CK::Compatibility != CK::Benign) {                             \ 
  329    if ((CK::Compatibility == CK::NotCompatible) ||                            \ 
  330        (CK::Compatibility == CK::Compatible &&                                \ 
  331         !AllowCompatibleDifferences)) {                                       \ 
  332      if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) {              \ 
  334          Diags->Report(diag::err_ast_file_langopt_value_mismatch)             \ 
  335              << Description << ModuleFilename;                                \ 
  341#include "clang/Basic/LangOptions.def" 
  345      Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
 
  346          << 
"module features" << ModuleFilename;
 
  352      Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
 
  353          << 
"target Objective-C runtime" << ModuleFilename;
 
  360      Diags->
Report(diag::err_ast_file_langopt_value_mismatch)
 
  361          << 
"block command names" << ModuleFilename;
 
  369  if (!AllowCompatibleDifferences) {
 
  373    ExistingSanitizers.
clear(ModularSanitizers);
 
  374    ImportedSanitizers.
clear(ModularSanitizers);
 
  375    if (ExistingSanitizers.
Mask != ImportedSanitizers.
Mask) {
 
  376      const std::string Flag = 
"-fsanitize=";
 
  378#define SANITIZER(NAME, ID)                                                    \ 
  380    bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID);         \ 
  381    bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID);         \ 
  382    if (InExistingModule != InImportedModule)                                  \ 
  383      Diags->Report(diag::err_ast_file_targetopt_feature_mismatch)             \ 
  384          << InExistingModule << ModuleFilename << (Flag + NAME);              \ 
  386#include "clang/Basic/Sanitizers.def" 
 
  397                                StringRef ModuleFilename,
 
  399                                bool AllowCompatibleDifferences = 
true) {
 
  403#define CODEGENOPT(Name, Bits, Default, Compatibility)                         \ 
  404  if constexpr (CK::Compatibility != CK::Benign) {                             \ 
  405    if ((CK::Compatibility == CK::NotCompatible) ||                            \ 
  406        (CK::Compatibility == CK::Compatible &&                                \ 
  407         !AllowCompatibleDifferences)) {                                       \ 
  408      if (ExistingCGOpts.Name != CGOpts.Name) {                                \ 
  411            Diags->Report(diag::err_ast_file_codegenopt_mismatch)              \ 
  412                << #Name << CGOpts.Name << ExistingCGOpts.Name                 \ 
  415            Diags->Report(diag::err_ast_file_codegenopt_value_mismatch)        \ 
  416                << #Name << ModuleFilename;                                    \ 
  423#define VALUE_CODEGENOPT(Name, Bits, Default, Compatibility)                   \ 
  424  if constexpr (CK::Compatibility != CK::Benign) {                             \ 
  425    if ((CK::Compatibility == CK::NotCompatible) ||                            \ 
  426        (CK::Compatibility == CK::Compatible &&                                \ 
  427         !AllowCompatibleDifferences)) {                                       \ 
  428      if (ExistingCGOpts.Name != CGOpts.Name) {                                \ 
  430          Diags->Report(diag::err_ast_file_codegenopt_value_mismatch)          \ 
  431              << #Name << ModuleFilename;                                      \ 
  436#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility)              \ 
  437  if constexpr (CK::Compatibility != CK::Benign) {                             \ 
  438    if ((CK::Compatibility == CK::NotCompatible) ||                            \ 
  439        (CK::Compatibility == CK::Compatible &&                                \ 
  440         !AllowCompatibleDifferences)) {                                       \ 
  441      if (ExistingCGOpts.get##Name() != CGOpts.get##Name()) {                  \ 
  443          Diags->Report(diag::err_ast_file_codegenopt_value_mismatch)          \ 
  444              << #Name << ModuleFilename;                                      \ 
  449#define DEBUGOPT(Name, Bits, Default, Compatibility) 
  450#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility) 
  451#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility) 
  452#include "clang/Basic/CodeGenOptions.def" 
 
  465                               StringRef ModuleFilename,
 
  467                               bool AllowCompatibleDifferences = 
true) {
 
  468#define CHECK_TARGET_OPT(Field, Name)                                          \ 
  469  if (TargetOpts.Field != ExistingTargetOpts.Field) {                          \ 
  471      Diags->Report(diag::err_ast_file_targetopt_mismatch)                     \ 
  472          << ModuleFilename << Name << TargetOpts.Field                        \ 
  473          << ExistingTargetOpts.Field;                                         \ 
  484  if (!AllowCompatibleDifferences) {
 
  489#undef CHECK_TARGET_OPT 
  497  llvm::sort(ExistingFeatures);
 
  498  llvm::sort(ReadFeatures);
 
  504      ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(),
 
  505      ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures));
 
  506  std::set_difference(ReadFeatures.begin(), ReadFeatures.end(),
 
  507                      ExistingFeatures.begin(), ExistingFeatures.end(),
 
  508                      std::back_inserter(UnmatchedReadFeatures));
 
  512  if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty())
 
  516    for (StringRef 
Feature : UnmatchedReadFeatures)
 
  517      Diags->
Report(diag::err_ast_file_targetopt_feature_mismatch)
 
  518          <<  
false << ModuleFilename << 
Feature;
 
  519    for (StringRef 
Feature : UnmatchedExistingFeatures)
 
  520      Diags->
Report(diag::err_ast_file_targetopt_feature_mismatch)
 
  521          <<  
true << ModuleFilename << 
Feature;
 
  524  return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty();
 
 
  528                                       StringRef ModuleFilename, 
bool Complain,
 
  529                                       bool AllowCompatibleDifferences) {
 
  530  const LangOptions &ExistingLangOpts = PP.getLangOpts();
 
  532                              Complain ? &Reader.Diags : 
nullptr,
 
  533                              AllowCompatibleDifferences);
 
 
  537                                      StringRef ModuleFilename, 
bool Complain,
 
  538                                      bool AllowCompatibleDifferences) {
 
  541                             Complain ? &Reader.Diags : 
nullptr,
 
  542                             AllowCompatibleDifferences);
 
 
  546                                     StringRef ModuleFilename, 
bool Complain,
 
  547                                     bool AllowCompatibleDifferences) {
 
  548  const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts();
 
  550                            Complain ? &Reader.Diags : 
nullptr,
 
  551                            AllowCompatibleDifferences);
 
 
  556using MacroDefinitionsMap =
 
  557    llvm::StringMap<std::pair<StringRef, 
bool >>;
 
  558using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>;
 
  564                                         StringRef ModuleFilename,
 
  574    for (
auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) {
 
  583          Diags.
Report(diag::err_ast_file_diagopt_mismatch)
 
  585                                  ->getWarningOptionForDiag(DiagID)
 
 
  605                                    StringRef ModuleFilename, 
bool IsSystem,
 
  606                                    bool SystemHeaderWarningsInModule,
 
  615        !SystemHeaderWarningsInModule) {
 
  617        Diags.
Report(diag::err_ast_file_diagopt_mismatch)
 
  618            << 
"-Wsystem-headers" << ModuleFilename;
 
  625      Diags.
Report(diag::err_ast_file_diagopt_mismatch)
 
  626          << 
"-Werror" << ModuleFilename;
 
  633      Diags.
Report(diag::err_ast_file_diagopt_mismatch)
 
  634          << 
"-Weverything -Werror" << ModuleFilename;
 
  641      Diags.
Report(diag::err_ast_file_diagopt_mismatch)
 
  642          << 
"-pedantic-errors" << ModuleFilename;
 
 
  667  assert(!ModuleName.empty() && 
"diagnostic options read before module name");
 
  671  assert(M && 
"missing module");
 
 
  676                                         StringRef ModuleFilename,
 
  680  auto Diags = llvm::makeIntrusiveRefCnt<DiagnosticsEngine>(DiagIDs, DiagOpts);
 
  684                        PP.getFileManager().getVirtualFileSystem(),
 
  688  assert(ModuleMgr.
size() >= 1 && 
"what ASTFile is this then");
 
  694  Module *Importer = PP.getCurrentModule();
 
  697  bool SystemHeaderWarningsInModule =
 
  704                                 TopM->
IsSystem, SystemHeaderWarningsInModule,
 
 
  712                        MacroDefinitionsMap &
Macros,
 
  714  for (
unsigned I = 0, N = PPOpts.
Macros.size(); I != N; ++I) {
 
  716    bool IsUndef = PPOpts.
Macros[I].second;
 
  718    std::pair<StringRef, StringRef> MacroPair = 
Macro.split(
'=');
 
  719    StringRef MacroName = MacroPair.first;
 
  720    StringRef MacroBody = MacroPair.second;
 
  724      auto [It, Inserted] = 
Macros.try_emplace(MacroName);
 
  725      if (MacroNames && Inserted)
 
  726        MacroNames->push_back(MacroName);
 
  728      It->second = std::make_pair(
"", 
true);
 
  733    if (MacroName.size() == 
Macro.size())
 
  737      StringRef::size_type End = MacroBody.find_first_of(
"\n\r");
 
  738      MacroBody = MacroBody.substr(0, End);
 
  741    auto [It, Inserted] = 
Macros.try_emplace(MacroName);
 
  742    if (MacroNames && Inserted)
 
  743      MacroNames->push_back(MacroName);
 
  744    It->second = std::make_pair(MacroBody, 
false);
 
 
  768    std::string &SuggestedPredefines, 
const LangOptions &LangOpts,
 
  772    MacroDefinitionsMap ASTFileMacros;
 
  774    MacroDefinitionsMap ExistingMacros;
 
  777                            &ExistingMacroNames);
 
  781    SuggestedPredefines += 
"# 1 \"<command line>\" 1\n";
 
  783    for (
unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) {
 
  785      StringRef MacroName = ExistingMacroNames[I];
 
  786      std::pair<StringRef, bool> Existing = ExistingMacros[MacroName];
 
  789      llvm::StringMap<std::pair<StringRef, 
bool >>
::iterator Known =
 
  790          ASTFileMacros.find(MacroName);
 
  796            Diags->
Report(diag::err_ast_file_macro_def_undef)
 
  797                << MacroName << 
true << ModuleFilename;
 
  805        if (Existing.second) {
 
  806          SuggestedPredefines += 
"#undef ";
 
  807          SuggestedPredefines += MacroName.str();
 
  808          SuggestedPredefines += 
'\n';
 
  810          SuggestedPredefines += 
"#define ";
 
  811          SuggestedPredefines += MacroName.str();
 
  812          SuggestedPredefines += 
' ';
 
  813          SuggestedPredefines += Existing.first.str();
 
  814          SuggestedPredefines += 
'\n';
 
  821      if (Existing.second != Known->second.second) {
 
  823          Diags->
Report(diag::err_ast_file_macro_def_undef)
 
  824              << MacroName << Known->second.second << ModuleFilename;
 
  831      if (Existing.second || Existing.first == Known->second.first) {
 
  832        ASTFileMacros.erase(Known);
 
  838        Diags->
Report(diag::err_ast_file_macro_def_conflict)
 
  839            << MacroName << Known->second.first << Existing.first
 
  846    SuggestedPredefines += 
"# 1 \"<built-in>\" 2\n";
 
  851      for (
const auto &MacroName : ASTFileMacros.keys()) {
 
  853          Diags->
Report(diag::err_ast_file_macro_def_undef)
 
  854              << MacroName << 
false << ModuleFilename;
 
  865      Diags->
Report(diag::err_ast_file_undef)
 
  872  if (LangOpts.Modules &&
 
  876      Diags->
Report(diag::err_ast_file_pp_detailed_record)
 
  883  for (
unsigned I = 0, N = ExistingPPOpts.
Includes.size(); I != N; ++I) {
 
  890      SuggestedPredefines += 
"#include \"";
 
  891      SuggestedPredefines += 
File;
 
  892      SuggestedPredefines += 
"\"\n";
 
  902    SuggestedPredefines += 
"#include \"";
 
  903    SuggestedPredefines += 
File;
 
  904    SuggestedPredefines += 
"\"\n";
 
  907  for (
unsigned I = 0, N = ExistingPPOpts.
MacroIncludes.size(); I != N; ++I) {
 
  912    SuggestedPredefines += 
"#__include_macros \"";
 
  913    SuggestedPredefines += 
File;
 
  914    SuggestedPredefines += 
"\"\n##\n";
 
 
  921                                           StringRef ModuleFilename,
 
  922                                           bool ReadMacros, 
bool Complain,
 
  923                                           std::string &SuggestedPredefines) {
 
  927      PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros,
 
  928      Complain ? &Reader.Diags : 
nullptr, PP.getFileManager(),
 
  929      SuggestedPredefines, PP.getLangOpts());
 
 
  934    bool ReadMacros, 
bool Complain, std::string &SuggestedPredefines) {
 
  936                                  ModuleFilename, ReadMacros, 
nullptr,
 
  937                                  PP.getFileManager(), SuggestedPredefines,
 
 
  946                                 StringRef SpecificModuleCachePath,
 
  947                                 StringRef ExistingModuleCachePath,
 
  948                                 StringRef ModuleFilename,
 
  953      SpecificModuleCachePath == ExistingModuleCachePath)
 
  956      VFS.equivalent(SpecificModuleCachePath, ExistingModuleCachePath);
 
  957  if (EqualOrErr && *EqualOrErr)
 
  960    Diags->
Report(diag::err_ast_file_modulecache_mismatch)
 
  961        << SpecificModuleCachePath << ExistingModuleCachePath << ModuleFilename;
 
 
  966                                           StringRef ModuleFilename,
 
  967                                           StringRef SpecificModuleCachePath,
 
  970      Reader.getFileManager().getVirtualFileSystem(), SpecificModuleCachePath,
 
  971      PP.getHeaderSearchInfo().getModuleCachePath(), ModuleFilename,
 
  972      Complain ? &Reader.Diags : 
nullptr, PP.getLangOpts(),
 
  973      PP.getPreprocessorOpts());
 
 
  977  PP.setCounterValue(
Value);
 
 
  986  const char *
Error = 
nullptr;
 
  988  uint64_t Val = llvm::decodeULEB128(P, &Length, 
nullptr, &
Error);
 
  990    llvm::report_fatal_error(
Error);
 
 
  996static std::pair<unsigned, unsigned>
 
  999  if ((
unsigned)KeyLen != KeyLen)
 
 1000    llvm::report_fatal_error(
"key too large");
 
 1003  if ((
unsigned)DataLen != DataLen)
 
 1004    llvm::report_fatal_error(
"data too large");
 
 1006  return std::make_pair(KeyLen, DataLen);
 
 
 1010                                           bool TakeOwnership) {
 
 1011  DeserializationListener = Listener;
 
 1012  OwnsDeserializationListener = TakeOwnership;
 
 
 1023    Reader.ReadModuleOffsetMap(MF);
 
 1025  unsigned ModuleFileIndex = 
ID.getModuleFileIndex();
 
 1026  unsigned LocalDeclID = 
ID.getLocalDeclIndex();
 
 1032  assert(OwningModuleFile);
 
 1036  if (!ModuleFileIndex)
 
 1039  assert(LocalDeclID < LocalNumDecls);
 
 
 1047                             unsigned ModuleFileIndex, 
unsigned LocalDeclID) {
 
 
 1052std::pair<unsigned, unsigned>
 
 1059  using namespace llvm::support;
 
 1062  unsigned N = endian::readNext<uint16_t, llvm::endianness::little>(d);
 
 1064      F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
 
 1071  Args.push_back(FirstII);
 
 1072  for (
unsigned I = 1; I != N; ++I)
 
 1073    Args.push_back(Reader.getLocalIdentifier(
 
 1074        F, endian::readNext<IdentifierID, llvm::endianness::little>(d)));
 
 
 1082  using namespace llvm::support;
 
 1086  Result.ID = Reader.getGlobalSelectorID(
 
 1087      F, endian::readNext<uint32_t, llvm::endianness::little>(d));
 
 1088  unsigned FullInstanceBits =
 
 1089      endian::readNext<uint16_t, llvm::endianness::little>(d);
 
 1090  unsigned FullFactoryBits =
 
 1091      endian::readNext<uint16_t, llvm::endianness::little>(d);
 
 1092  Result.InstanceBits = FullInstanceBits & 0x3;
 
 1093  Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1;
 
 1094  Result.FactoryBits = FullFactoryBits & 0x3;
 
 1095  Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1;
 
 1096  unsigned NumInstanceMethods = FullInstanceBits >> 3;
 
 1097  unsigned NumFactoryMethods = FullFactoryBits >> 3;
 
 1100  for (
unsigned I = 0; I != NumInstanceMethods; ++I) {
 
 1104                   endian::readNext<DeclID, llvm::endianness::little>(d))))
 
 1109  for (
unsigned I = 0; I != NumFactoryMethods; ++I) {
 
 1113                   endian::readNext<DeclID, llvm::endianness::little>(d))))
 
 
 1121  return llvm::djbHash(a);
 
 
 1124std::pair<unsigned, unsigned>
 
 1131  assert(n >= 2 && d[n-1] == 
'\0');
 
 1132  return StringRef((
const char*) d, n-1);
 
 
 1138  bool IsInteresting =
 
 
 1149  bool Value = Bits & 0x1;
 
 
 1155  using namespace llvm::support;
 
 1158      endian::readNext<IdentifierID, llvm::endianness::little>(d);
 
 1159  return Reader.getGlobalIdentifierID(F, RawID >> 1);
 
 
 1172                                                   const unsigned char* d,
 
 1174  using namespace llvm::support;
 
 1177      endian::readNext<IdentifierID, llvm::endianness::little>(d);
 
 1178  bool IsInteresting = RawID & 0x01;
 
 1188    II = &Reader.getIdentifierTable().getOwn(k);
 
 1191  bool IsModule = Reader.getPreprocessor().getCurrentModule() != 
nullptr;
 
 1193  Reader.markIdentifierUpToDate(II);
 
 1195  IdentifierID ID = Reader.getGlobalIdentifierID(F, RawID);
 
 1196  if (!IsInteresting) {
 
 1199    Reader.SetIdentifierInfo(ID, II);
 
 1203  unsigned ObjCOrBuiltinID =
 
 1204      endian::readNext<uint16_t, llvm::endianness::little>(d);
 
 1205  unsigned Bits = endian::readNext<uint16_t, llvm::endianness::little>(d);
 
 1206  bool CPlusPlusOperatorKeyword = 
readBit(Bits);
 
 1207  bool HasRevertedTokenIDToIdentifier = 
readBit(Bits);
 
 1208  bool Poisoned = 
readBit(Bits);
 
 1209  bool ExtensionToken = 
readBit(Bits);
 
 1210  bool HasMacroDefinition = 
readBit(Bits);
 
 1212  assert(Bits == 0 && 
"Extra bits in the identifier?");
 
 1213  DataLen -= 
sizeof(uint16_t) * 2;
 
 1217  if (HasRevertedTokenIDToIdentifier && II->
getTokenID() != tok::identifier)
 
 1222         "Incorrect extension token flag");
 
 1223  (void)ExtensionToken;
 
 1227         "Incorrect C++ operator keyword flag");
 
 1228  (void)CPlusPlusOperatorKeyword;
 
 1232  if (HasMacroDefinition) {
 
 1233    uint32_t MacroDirectivesOffset =
 
 1234        endian::readNext<uint32_t, llvm::endianness::little>(d);
 
 1237    if (MacroDirectivesOffset)
 
 1238      Reader.addPendingMacro(II, &F, MacroDirectivesOffset);
 
 1240      hasMacroDefinitionInDependencies = 
true;
 
 1243  Reader.SetIdentifierInfo(ID, II);
 
 1249    for (; DataLen > 0; DataLen -= 
sizeof(
DeclID))
 
 1250      DeclIDs.push_back(Reader.getGlobalDeclID(
 
 1253                 endian::readNext<DeclID, llvm::endianness::little>(d))));
 
 1254    Reader.SetGloballyVisibleDecls(II, DeclIDs);
 
 
 1261    : Kind(Name.getNameKind()) {
 
 
 1291  llvm::FoldingSetNodeID ID;
 
 1292  ID.AddInteger(Kind);
 
 1315  return ID.computeStableHash();
 
 
 1320  using namespace llvm::support;
 
 1322  uint32_t ModuleFileID =
 
 1323      endian::readNext<uint32_t, llvm::endianness::little>(d);
 
 1324  return Reader.getLocalModuleFile(
F, ModuleFileID);
 
 
 1327std::pair<unsigned, unsigned>
 
 1334  using namespace llvm::support;
 
 1343        F, endian::readNext<IdentifierID, llvm::endianness::little>(d));
 
 1350                   F, endian::readNext<uint32_t, llvm::endianness::little>(d))
 
 
 1374  using namespace llvm::support;
 
 1376  for (
unsigned NumDecls = DataLen / 
sizeof(
DeclID); NumDecls; --NumDecls) {
 
 1378        Reader, 
F, endian::readNext<DeclID, llvm::endianness::little>(d));
 
 
 1384                                                 const unsigned char *d,
 
 
 1392  llvm::FoldingSetNodeID ID;
 
 1393  ID.AddInteger(Key.first.getHash());
 
 1394  ID.AddInteger(Key.second);
 
 1395  return ID.computeStableHash();
 
 
 1406  return {Name, *ModuleHash};
 
 
 1412  unsigned PrimaryModuleHash =
 
 1413      llvm::support::endian::readNext<uint32_t, llvm::endianness::little>(d);
 
 1414  return {Name, PrimaryModuleHash};
 
 
 1418                                              const unsigned char *d,
 
 
 1426  using namespace llvm::support;
 
 1428  uint32_t ModuleFileID =
 
 1429      endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
 
 1430  return Reader.getLocalModuleFile(F, ModuleFileID);
 
 
 1435  using namespace llvm::support;
 
 1436  return endian::readNext<uint32_t, llvm::endianness::little, unaligned>(d);
 
 
 1439std::pair<unsigned, unsigned>
 
 1445                                                     const unsigned char *d,
 
 1448  using namespace llvm::support;
 
 1450  for (
unsigned NumDecls =
 
 1452       NumDecls; --NumDecls) {
 
 1455        endian::readNext<DeclID, llvm::endianness::little, unaligned>(d));
 
 1456    Val.
insert(Reader.getGlobalDeclID(F, LocalID));
 
 
 1460bool ASTReader::ReadLexicalDeclContextStorage(
ModuleFile &M,
 
 1461                                              BitstreamCursor &Cursor,
 
 1464  assert(Offset != 0);
 
 1467  if (llvm::Error Err = Cursor.JumpToBit(Offset)) {
 
 1468    Error(std::move(Err));
 
 1476    Error(MaybeCode.takeError());
 
 1479  unsigned Code = MaybeCode.get();
 
 1482  if (!MaybeRecCode) {
 
 1483    Error(MaybeRecCode.takeError());
 
 1486  unsigned RecCode = MaybeRecCode.get();
 
 1488    Error(
"Expected lexical block");
 
 1493         "expected a TU_UPDATE_LEXICAL record for TU");
 
 1498  auto &Lex = LexicalDecls[DC];
 
 1500    Lex = std::make_pair(
 
 1503                Blob.size() / 
sizeof(
DeclID)));
 
 1509bool ASTReader::ReadVisibleDeclContextStorage(
 
 1510    ModuleFile &M, BitstreamCursor &Cursor, uint64_t Offset, GlobalDeclID ID,
 
 1511    ASTReader::VisibleDeclContextStorageKind VisibleKind) {
 
 1512  assert(Offset != 0);
 
 1514  SavedStreamPosition SavedPosition(Cursor);
 
 1515  if (llvm::Error Err = 
Cursor.JumpToBit(Offset)) {
 
 1516    Error(std::move(Err));
 
 1522  Expected<unsigned> MaybeCode = 
Cursor.ReadCode();
 
 1524    Error(MaybeCode.takeError());
 
 1527  unsigned Code = MaybeCode.get();
 
 1529  Expected<unsigned> MaybeRecCode = 
Cursor.readRecord(Code, 
Record, &Blob);
 
 1530  if (!MaybeRecCode) {
 
 1531    Error(MaybeRecCode.takeError());
 
 1534  unsigned RecCode = MaybeRecCode.get();
 
 1535  switch (VisibleKind) {
 
 1536  case VisibleDeclContextStorageKind::GenerallyVisible:
 
 1538      Error(
"Expected visible lookup table block");
 
 1542  case VisibleDeclContextStorageKind::ModuleLocalVisible:
 
 1544      Error(
"Expected module local visible lookup table block");
 
 1548  case VisibleDeclContextStorageKind::TULocalVisible:
 
 1550      Error(
"Expected TU local lookup table block");
 
 1558  auto *
Data = (
const unsigned char*)Blob.data();
 
 1559  switch (VisibleKind) {
 
 1560  case VisibleDeclContextStorageKind::GenerallyVisible:
 
 1561    PendingVisibleUpdates[
ID].push_back(UpdateData{&M, 
Data});
 
 1563  case VisibleDeclContextStorageKind::ModuleLocalVisible:
 
 1564    PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&M, 
Data});
 
 1566  case VisibleDeclContextStorageKind::TULocalVisible:
 
 1568      TULocalUpdates[
ID].push_back(UpdateData{&M, 
Data});
 
 1574void ASTReader::AddSpecializations(
const Decl *D, 
const unsigned char *
Data,
 
 1578      IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
 
 1579  SpecLookups[D].Table.add(&M, 
Data,
 
 1583bool ASTReader::ReadSpecializations(
ModuleFile &M, BitstreamCursor &Cursor,
 
 1584                                    uint64_t Offset, Decl *D, 
bool IsPartial) {
 
 1585  assert(Offset != 0);
 
 1587  SavedStreamPosition SavedPosition(Cursor);
 
 1588  if (llvm::Error Err = 
Cursor.JumpToBit(Offset)) {
 
 1589    Error(std::move(Err));
 
 1595  Expected<unsigned> MaybeCode = 
Cursor.ReadCode();
 
 1597    Error(MaybeCode.takeError());
 
 1600  unsigned Code = MaybeCode.get();
 
 1602  Expected<unsigned> MaybeRecCode = 
Cursor.readRecord(Code, 
Record, &Blob);
 
 1603  if (!MaybeRecCode) {
 
 1604    Error(MaybeRecCode.takeError());
 
 1607  unsigned RecCode = MaybeRecCode.get();
 
 1610    Error(
"Expected decl specs block");
 
 1614  auto *
Data = (
const unsigned char *)Blob.data();
 
 1615  AddSpecializations(D, 
Data, M, IsPartial);
 
 1619void ASTReader::Error(StringRef Msg)
 const {
 
 1620  Error(diag::err_fe_ast_file_malformed, Msg);
 
 1621  if (PP.getLangOpts().Modules &&
 
 1622      !PP.getHeaderSearchInfo().getModuleCachePath().empty()) {
 
 1623    Diag(diag::note_module_cache_path)
 
 1624      << PP.getHeaderSearchInfo().getModuleCachePath();
 
 1628void ASTReader::Error(
unsigned DiagID, StringRef Arg1, StringRef Arg2,
 
 1629                      StringRef Arg3)
 const {
 
 1630  Diag(DiagID) << Arg1 << Arg2 << Arg3;
 
 1634struct AlreadyReportedDiagnosticError
 
 1635    : llvm::ErrorInfo<AlreadyReportedDiagnosticError> {
 
 1638  void log(raw_ostream &OS)
 const override {
 
 1639    llvm_unreachable(
"reporting an already-reported diagnostic error");
 
 1642  std::error_code convertToErrorCode()
 const override {
 
 1643    return llvm::inconvertibleErrorCode();
 
 1647char AlreadyReportedDiagnosticError::ID = 0;
 
 1650void ASTReader::Error(llvm::Error &&Err)
 const {
 
 1652      std::move(Err), [](AlreadyReportedDiagnosticError &) {},
 
 1653      [&](llvm::ErrorInfoBase &E) { 
return Error(E.message()); });
 
 1663  LineTableInfo &LineTable = SourceMgr.getLineTable();
 
 1666  std::map<int, int> FileIDs;
 
 1668  for (
unsigned I = 0; 
Record[Idx]; ++I) {
 
 1670    auto Filename = ReadPath(F, 
Record, Idx);
 
 1676  std::vector<LineEntry> Entries;
 
 1677  while (Idx < 
Record.size()) {
 
 1678    FileID FID = ReadFileID(F, 
Record, Idx);
 
 1681    unsigned NumEntries = 
Record[Idx++];
 
 1682    assert(NumEntries && 
"no line entries for file ID");
 
 1684    Entries.reserve(NumEntries);
 
 1685    for (
unsigned I = 0; I != NumEntries; ++I) {
 
 1686      unsigned FileOffset = 
Record[Idx++];
 
 1687      unsigned LineNo = 
Record[Idx++];
 
 1688      int FilenameID = FileIDs[
Record[Idx++]];
 
 1691      unsigned IncludeOffset = 
Record[Idx++];
 
 1693                                       FileKind, IncludeOffset));
 
 1700llvm::Error ASTReader::ReadSourceManagerBlock(
ModuleFile &F) {
 
 1701  using namespace SrcMgr;
 
 1709  SLocEntryCursor = F.
Stream;
 
 1712  if (llvm::Error Err = F.
Stream.SkipBlock())
 
 1722    Expected<llvm::BitstreamEntry> MaybeE =
 
 1723        SLocEntryCursor.advanceSkippingSubblocks();
 
 1725      return MaybeE.takeError();
 
 1726    llvm::BitstreamEntry E = MaybeE.get();
 
 1729    case llvm::BitstreamEntry::SubBlock: 
 
 1730    case llvm::BitstreamEntry::Error:
 
 1731      return llvm::createStringError(std::errc::illegal_byte_sequence,
 
 1732                                     "malformed block record in AST file");
 
 1733    case llvm::BitstreamEntry::EndBlock:
 
 1734      return llvm::Error::success();
 
 1735    case llvm::BitstreamEntry::Record:
 
 1743    Expected<unsigned> MaybeRecord =
 
 1744        SLocEntryCursor.readRecord(E.ID, 
Record, &Blob);
 
 1746      return MaybeRecord.takeError();
 
 1747    switch (MaybeRecord.get()) {
 
 1755      return llvm::Error::success();
 
 1760llvm::Expected<SourceLocation::UIntTy>
 
 1766    return std::move(Err);
 
 1770    return MaybeEntry.takeError();
 
 1772  llvm::BitstreamEntry Entry = MaybeEntry.get();
 
 1773  if (Entry.Kind != llvm::BitstreamEntry::Record)
 
 1774    return llvm::createStringError(
 
 1775        std::errc::illegal_byte_sequence,
 
 1776        "incorrectly-formatted source location entry in AST file");
 
 1782    return MaybeSLOC.takeError();
 
 1784  switch (MaybeSLOC.get()) {
 
 1786    return llvm::createStringError(
 
 1787        std::errc::illegal_byte_sequence,
 
 1788        "incorrectly-formatted source location entry in AST file");
 
 
 1798      GlobalSLocOffsetMap.find(SourceManager::MaxLoadedOffset - SLocOffset - 1);
 
 1799  assert(SLocMapI != GlobalSLocOffsetMap.end() &&
 
 1800         "Corrupted global sloc offset map");
 
 1805  auto It = llvm::upper_bound(
 
 1808        int ID = F->SLocEntryBaseID + LocalIndex;
 
 1809        std::size_t Index = -ID - 2;
 
 1810        if (!SourceMgr.SLocEntryOffsetLoaded[Index]) {
 
 1811          assert(!SourceMgr.SLocEntryLoaded[Index]);
 
 1812          auto MaybeEntryOffset = readSLocOffset(F, LocalIndex);
 
 1813          if (!MaybeEntryOffset) {
 
 1814            Error(MaybeEntryOffset.takeError());
 
 1818          SourceMgr.LoadedSLocEntryTable[Index] =
 
 1819              SrcMgr::SLocEntry::getOffsetOnly(*MaybeEntryOffset);
 
 1820          SourceMgr.SLocEntryOffsetLoaded[Index] = true;
 
 1822        return Offset < SourceMgr.LoadedSLocEntryTable[Index].getOffset();
 
 
 1838    Error(
"source location entry ID out-of-range for AST file");
 
 1844  auto ReadBuffer = [
this](
 
 1845      BitstreamCursor &SLocEntryCursor,
 
 1846      StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> {
 
 1851      Error(MaybeCode.takeError());
 
 1854    unsigned Code = MaybeCode.get();
 
 1857        SLocEntryCursor.readRecord(Code, 
Record, &Blob);
 
 1858    if (!MaybeRecCode) {
 
 1859      Error(MaybeRecCode.takeError());
 
 1862    unsigned RecCode = MaybeRecCode.get();
 
 1867      const llvm::compression::Format F =
 
 1868          Blob.size() > 0 && Blob.data()[0] == 0x78
 
 1869              ? llvm::compression::Format::Zlib
 
 1870              : llvm::compression::Format::Zstd;
 
 1871      if (
const char *Reason = llvm::compression::getReasonIfUnsupported(F)) {
 
 1876      if (llvm::Error E = llvm::compression::decompress(
 
 1877              F, llvm::arrayRefFromStringRef(Blob), Decompressed, 
Record[0])) {
 
 1878        Error(
"could not decompress embedded file contents: " +
 
 1879              llvm::toString(std::move(E)));
 
 1882      return llvm::MemoryBuffer::getMemBufferCopy(
 
 1883          llvm::toStringRef(Decompressed), Name);
 
 1885      return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, 
true);
 
 1887      Error(
"AST record has invalid code");
 
 1892  ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second;
 
 1896    Error(std::move(Err));
 
 1903  ++NumSLocEntriesRead;
 
 1906    Error(MaybeEntry.takeError());
 
 1909  llvm::BitstreamEntry Entry = MaybeEntry.get();
 
 1911  if (Entry.Kind != llvm::BitstreamEntry::Record) {
 
 1912    Error(
"incorrectly-formatted source location entry in AST file");
 
 1919      SLocEntryCursor.readRecord(Entry.ID, 
Record, &Blob);
 
 1921    Error(MaybeSLOC.takeError());
 
 1924  switch (MaybeSLOC.get()) {
 
 1926    Error(
"incorrectly-formatted source location entry in AST file");
 
 1932    unsigned InputID = 
Record[4];
 
 1933    InputFile IF = getInputFile(*F, InputID);
 
 1946      IncludeLoc = getImportLocation(F);
 
 1950    FileID FID = SourceMgr.createFileID(*
File, IncludeLoc, FileCharacter, ID,
 
 1953    FileInfo.NumCreatedFIDs = 
Record[5];
 
 1957    unsigned NumFileDecls = 
Record[7];
 
 1958    if (NumFileDecls && ContextObj) {
 
 1960      assert(F->
FileSortedDecls && 
"FILE_SORTED_DECLS not encountered yet ?");
 
 1966        SourceMgr.getOrCreateContentCache(*
File, isSystem(FileCharacter));
 
 1970      auto Buffer = ReadBuffer(SLocEntryCursor, 
File->getName());
 
 1973      SourceMgr.overrideFileContents(*
File, std::move(Buffer));
 
 1980    const char *Name = Blob.data();
 
 1981    unsigned Offset = 
Record[0];
 
 1986      IncludeLoc = getImportLocation(F);
 
 1989    auto Buffer = ReadBuffer(SLocEntryCursor, Name);
 
 1992    FileID FID = SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID,
 
 1993                                        BaseOffset + Offset, IncludeLoc);
 
 1995      auto &FileInfo = SourceMgr.getSLocEntry(FID).getFile();
 
 1996      FileInfo.setHasLineDirectives();
 
 2005    SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd,
 
 
 2020    Error(
"source location entry ID out-of-range for AST file");
 
 2025  ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second;
 
 
 2043    assert(SourceMgr.getMainFileID().isValid() && 
"missing main file");
 
 2044    return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
 
 2054                                        uint64_t *StartOfBlockOffset) {
 
 2055  if (llvm::Error Err = Cursor.EnterSubBlock(BlockID))
 
 2058  if (StartOfBlockOffset)
 
 2059    *StartOfBlockOffset = Cursor.GetCurrentBitNo();
 
 2062    uint64_t Offset = Cursor.GetCurrentBitNo();
 
 2065      return MaybeCode.takeError();
 
 2066    unsigned Code = MaybeCode.get();
 
 2069    if (Code != llvm::bitc::DEFINE_ABBREV) {
 
 2070      if (llvm::Error Err = Cursor.JumpToBit(Offset))
 
 2072      return llvm::Error::success();
 
 2074    if (llvm::Error Err = Cursor.ReadAbbrevRecord())
 
 
 2087  if (
Tok.isAnnotation()) {
 
 2089    switch (
Tok.getKind()) {
 
 2090    case tok::annot_pragma_loop_hint: {
 
 2094      unsigned NumTokens = 
Record[Idx++];
 
 2096      Toks.reserve(NumTokens);
 
 2097      for (
unsigned I = 0; I < NumTokens; ++I)
 
 2099      Info->Toks = 
llvm::ArrayRef(Toks).copy(PP.getPreprocessorAllocator());
 
 2100      Tok.setAnnotationValue(
static_cast<void *
>(Info));
 
 2103    case tok::annot_pragma_pack: {
 
 2108          llvm::StringRef(SlotLabel).copy(PP.getPreprocessorAllocator());
 
 2110      Tok.setAnnotationValue(
static_cast<void *
>(Info));
 
 2114    case tok::annot_pragma_openmp:
 
 2115    case tok::annot_pragma_openmp_end:
 
 2116    case tok::annot_pragma_unused:
 
 2117    case tok::annot_pragma_openacc:
 
 2118    case tok::annot_pragma_openacc_end:
 
 2119    case tok::annot_repl_input_end:
 
 2122      llvm_unreachable(
"missing deserialization code for annotation token");
 
 2127      Tok.setIdentifierInfo(II);
 
 
 2139  if (llvm::Error Err = Stream.JumpToBit(Offset)) {
 
 2141    consumeError(std::move(Err));
 
 2153    unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd;
 
 2155        Stream.advanceSkippingSubblocks(Flags);
 
 2157      Error(MaybeEntry.takeError());
 
 2160    llvm::BitstreamEntry Entry = MaybeEntry.get();
 
 2162    switch (Entry.Kind) {
 
 2163    case llvm::BitstreamEntry::SubBlock: 
 
 2164    case llvm::BitstreamEntry::Error:
 
 2165      Error(
"malformed block record in AST file");
 
 2167    case llvm::BitstreamEntry::EndBlock:
 
 2169    case llvm::BitstreamEntry::Record:
 
 2180      Error(MaybeRecType.takeError());
 
 2196      unsigned NextIndex = 1; 
 
 2198      MacroInfo *MI = PP.AllocateMacroInfo(Loc);
 
 2203                                       PP.getPreprocessorAllocator());
 
 2206        bool isC99VarArgs = 
Record[NextIndex++];
 
 2207        bool isGNUVarArgs = 
Record[NextIndex++];
 
 2208        bool hasCommaPasting = 
Record[NextIndex++];
 
 2209        MacroParams.clear();
 
 2210        unsigned NumArgs = 
Record[NextIndex++];
 
 2211        for (
unsigned i = 0; i != NumArgs; ++i)
 
 2226      if (NextIndex + 1 == 
Record.size() && PP.getPreprocessingRecord() &&
 
 2232        PreprocessingRecord::PPEntityID PPID =
 
 2233            PPRec.getPPEntityID(GlobalID - 1, 
true);
 
 2235            PPRec.getPreprocessedEntity(PPID));
 
 2237          PPRec.RegisterMacroDefinition(
Macro, PPDef);
 
 2248      if (MacroTokens.empty()) {
 
 2249        Error(
"unexpected number of macro tokens for a macro in AST file");
 
 2255      MacroTokens = MacroTokens.drop_front();
 
 
 2264                                         unsigned LocalID)
 const {
 
 2266    ReadModuleOffsetMap(M);
 
 2271         && 
"Invalid index into preprocessed entity index remap");
 
 2273  return LocalID + I->second;
 
 
 2277HeaderFileInfoTrait::getFile(
const internal_key_type &Key) {
 
 2280    return FileMgr.getOptionalFileRef(Key.Filename);
 
 2284  return FileMgr.getOptionalFileRef(*Resolved);
 
 2288  uint8_t buf[
sizeof(ikey.
Size) + 
sizeof(ikey.
ModTime)];
 
 2291  return llvm::xxh3_64bits(buf);
 
 
 2312  return FEA && FEA == FEB;
 
 
 2315std::pair<unsigned, unsigned>
 
 2322  using namespace llvm::support;
 
 2325  ikey.
Size = off_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
 
 2327      time_t(endian::readNext<uint64_t, llvm::endianness::little>(d));
 
 
 2336  using namespace llvm::support;
 
 2338  const unsigned char *End = d + DataLen;
 
 2340  unsigned Flags = *d++;
 
 2343  bool Included = (Flags >> 6) & 0x01;
 
 2345    if ((FE = getFile(key)))
 
 2348      Reader.getPreprocessor().getIncludedFiles().insert(*FE);
 
 2351  HFI.
isImport |= (Flags >> 5) & 0x01;
 
 2353  HFI.
DirInfo = (Flags >> 1) & 0x07;
 
 2355      M, endian::readNext<IdentifierID, llvm::endianness::little>(d));
 
 2357  assert((End - d) % 4 == 0 &&
 
 2358         "Wrong data length in HeaderFileInfo deserialization");
 
 2360    uint32_t LocalSMID =
 
 2361        endian::readNext<uint32_t, llvm::endianness::little>(d);
 
 2367    SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID);
 
 2368    Module *Mod = Reader.getSubmodule(GlobalSMID);
 
 2370        Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap();
 
 2372    if (FE || (FE = getFile(key))) {
 
 2375      ModMap.
addHeader(Mod, H, HeaderRole, 
true);
 
 
 2387                                uint32_t MacroDirectivesOffset) {
 
 2388  assert(NumCurrentElementsDeserializing > 0 &&
"Missing deserialization guard");
 
 2389  PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset));
 
 
 2396  for (
ModuleFile &I : llvm::reverse(ModuleMgr)) {
 
 2397    BitstreamCursor &MacroCursor = I.MacroCursor;
 
 2400    if (MacroCursor.getBitcodeBytes().empty())
 
 2403    BitstreamCursor Cursor = MacroCursor;
 
 2404    if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) {
 
 2405      Error(std::move(Err));
 
 2413        Error(MaybeE.takeError());
 
 2416      llvm::BitstreamEntry E = MaybeE.get();
 
 2419      case llvm::BitstreamEntry::SubBlock: 
 
 2420      case llvm::BitstreamEntry::Error:
 
 2421        Error(
"malformed block record in AST file");
 
 2423      case llvm::BitstreamEntry::EndBlock:
 
 2426      case llvm::BitstreamEntry::Record: {
 
 2430          Error(MaybeRecord.takeError());
 
 2433        switch (MaybeRecord.get()) {
 
 
 2460  class IdentifierLookupVisitor {
 
 2463    unsigned PriorGeneration;
 
 2464    unsigned &NumIdentifierLookups;
 
 2465    unsigned &NumIdentifierLookupHits;
 
 2469    IdentifierLookupVisitor(StringRef Name, 
unsigned PriorGeneration,
 
 2470                            unsigned &NumIdentifierLookups,
 
 2471                            unsigned &NumIdentifierLookupHits)
 
 2473        PriorGeneration(PriorGeneration),
 
 2474        NumIdentifierLookups(NumIdentifierLookups),
 
 2475        NumIdentifierLookupHits(NumIdentifierLookupHits) {}
 
 2489      ++NumIdentifierLookups;
 
 2490      ASTIdentifierLookupTable::iterator Pos =
 
 2491          IdTable->find_hashed(Name, NameHash, &Trait);
 
 2492      if (Pos == IdTable->end())
 
 2498      ++NumIdentifierLookupHits;
 
 2500      if (Trait.hasMoreInformationInDependencies()) {
 
 2509    IdentifierInfo *getIdentifierInfo()
 const { 
return Found; }
 
 2518  unsigned PriorGeneration = 0;
 
 2520    PriorGeneration = IdentifierGeneration[&II];
 
 2527    if (GlobalIndex->lookupIdentifier(II.
getName(), Hits)) {
 
 2532  IdentifierLookupVisitor Visitor(II.
getName(), PriorGeneration,
 
 2533                                  NumIdentifierLookups,
 
 2534                                  NumIdentifierLookupHits);
 
 2535  ModuleMgr.visit(Visitor, HitsPtr);
 
 
 2551                                    const PendingMacroInfo &PMInfo) {
 
 2556  if (llvm::Error Err =
 
 2558    Error(std::move(Err));
 
 2562  struct ModuleMacroRecord {
 
 2575        Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd);
 
 2577      Error(MaybeEntry.takeError());
 
 2580    llvm::BitstreamEntry Entry = MaybeEntry.get();
 
 2582    if (Entry.Kind != llvm::BitstreamEntry::Record) {
 
 2583      Error(
"malformed block record in AST file");
 
 2590      Error(MaybePP.takeError());
 
 2598      ModuleMacros.push_back(ModuleMacroRecord());
 
 2599      auto &Info = ModuleMacros.back();
 
 2602      for (
int I = 2, N = 
Record.size(); I != N; ++I)
 
 2608      Error(
"malformed block record in AST file");
 
 2619    std::reverse(ModuleMacros.begin(), ModuleMacros.end());
 
 2621    for (
auto &MMR : ModuleMacros) {
 
 2623      for (
unsigned ModID : MMR.Overrides) {
 
 2625        auto *
Macro = PP.getModuleMacro(Mod, II);
 
 2626        assert(
Macro && 
"missing definition for overridden macro");
 
 2627        Overrides.push_back(
Macro);
 
 2630      bool Inserted = 
false;
 
 2632      PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted);
 
 2643  unsigned Idx = 0, N = 
Record.size();
 
 2651      MD = PP.AllocateDefMacroDirective(MI, Loc);
 
 2655      MD = PP.AllocateUndefMacroDirective(Loc);
 
 2658      bool isPublic = 
Record[Idx++];
 
 2659      MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic);
 
 2671    PP.setLoadedMacroDirective(II, Earliest, Latest);
 
 
 2674bool ASTReader::shouldDisableValidationForFile(
 
 2697static std::pair<StringRef, StringRef>
 
 2699                            const StringRef InputBlob) {
 
 2700  uint16_t AsRequestedLength = 
Record[7];
 
 2701  return {InputBlob.substr(0, AsRequestedLength),
 
 2702          InputBlob.substr(AsRequestedLength)};
 
 
 2716  SavedStreamPosition SavedPosition(Cursor);
 
 2720    consumeError(std::move(Err));
 
 2723  Expected<unsigned> MaybeCode = 
Cursor.ReadCode();
 
 2726    consumeError(MaybeCode.takeError());
 
 2728  unsigned Code = MaybeCode.get();
 
 2732  if (Expected<unsigned> Maybe = 
Cursor.readRecord(Code, 
Record, &Blob))
 
 2734           "invalid record type for input file");
 
 2737    consumeError(
Maybe.takeError());
 
 2740  assert(
Record[0] == ID && 
"Bogus stored ID or offset");
 
 2748  auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
 
 2752                                     ? UnresolvedFilenameAsRequested
 
 2753                                     : UnresolvedFilename;
 
 2755  Expected<llvm::BitstreamEntry> MaybeEntry = 
Cursor.advance();
 
 2757    consumeError(MaybeEntry.takeError());
 
 2758  llvm::BitstreamEntry Entry = MaybeEntry.get();
 
 2759  assert(Entry.Kind == llvm::BitstreamEntry::Record &&
 
 2760         "expected record type for input file hash");
 
 2763  if (Expected<unsigned> Maybe = 
Cursor.readRecord(Entry.ID, 
Record))
 
 2765           "invalid record type for input file hash");
 
 2768    consumeError(
Maybe.takeError());
 
 2793  SavedStreamPosition SavedPosition(Cursor);
 
 2797    consumeError(std::move(Err));
 
 2812  const HeaderSearchOptions &HSOpts =
 
 2813      PP.getHeaderSearchInfo().getHeaderSearchOpts();
 
 2826  if ((Overridden || Transient || SkipChecks) && !
File)
 
 2831      std::string ErrorStr = 
"could not find file '";
 
 2832      ErrorStr += *Filename;
 
 2833      ErrorStr += 
"' referenced by AST file '";
 
 2847  SourceManager &
SM = getSourceManager();
 
 2849  if ((!Overridden && !Transient) && !SkipChecks &&
 
 2850      SM.isFileOverridden(*
File)) {
 
 2852      Error(diag::err_fe_pch_file_overridden, *Filename);
 
 2864    enum ModificationKind {
 
 2870    std::optional<int64_t> Old = std::nullopt;
 
 2871    std::optional<int64_t> 
New = std::nullopt;
 
 2873  auto HasInputContentChanged = [&](Change OriginalChange) {
 
 2874    assert(ValidateASTInputFilesContent &&
 
 2875           "We should only check the content of the inputs with " 
 2876           "ValidateASTInputFilesContent enabled.");
 
 2878    if (StoredContentHash == 0)
 
 2879      return OriginalChange;
 
 2882    if (!MemBuffOrError) {
 
 2884        return OriginalChange;
 
 2885      std::string ErrorStr = 
"could not get buffer for file '";
 
 2886      ErrorStr += 
File->getName();
 
 2889      return OriginalChange;
 
 2892    auto ContentHash = xxh3_64bits(MemBuffOrError.get()->getBuffer());
 
 2893    if (StoredContentHash == 
static_cast<uint64_t>(ContentHash))
 
 2894      return Change{Change::None};
 
 2896    return Change{Change::Content};
 
 2898  auto HasInputFileChanged = [&]() {
 
 2899    if (StoredSize != 
File->getSize())
 
 2900      return Change{Change::Size, StoredSize, 
File->getSize()};
 
 2901    if (!shouldDisableValidationForFile(F) && StoredTime &&
 
 2902        StoredTime != 
File->getModificationTime()) {
 
 2903      Change MTimeChange = {Change::ModTime, StoredTime,
 
 2904                            File->getModificationTime()};
 
 2908      if (ValidateASTInputFilesContent)
 
 2909        return HasInputContentChanged(MTimeChange);
 
 2913    return Change{Change::None};
 
 2916  bool IsOutOfDate = 
false;
 
 2917  auto FileChange = SkipChecks ? Change{Change::None} : HasInputFileChanged();
 
 2923    FileChange = HasInputContentChanged(FileChange);
 
 2929  if (!StoredTime && ValidateASTInputFilesContent &&
 
 2930      FileChange.Kind == Change::None)
 
 2931    FileChange = HasInputContentChanged(FileChange);
 
 2934  if (!Overridden && FileChange.Kind != Change::None) {
 
 2937      SmallVector<ModuleFile *, 4> ImportStack(1, &F);
 
 2938      while (!ImportStack.back()->ImportedBy.empty())
 
 2939        ImportStack.push_back(ImportStack.back()->ImportedBy[0]);
 
 2942      StringRef TopLevelASTFileName(ImportStack.back()->FileName);
 
 2943      Diag(diag::err_fe_ast_file_modified)
 
 2945          << TopLevelASTFileName << FileChange.Kind
 
 2946          << (FileChange.Old && FileChange.New)
 
 2947          << llvm::itostr(FileChange.Old.value_or(0))
 
 2948          << llvm::itostr(FileChange.New.value_or(0));
 
 2951      if (ImportStack.size() > 1) {
 
 2952        Diag(diag::note_ast_file_required_by)
 
 2953            << *Filename << ImportStack[0]->FileName;
 
 2954        for (
unsigned I = 1; I < ImportStack.size(); ++I)
 
 2955          Diag(diag::note_ast_file_required_by)
 
 2956              << ImportStack[I - 1]->FileName << ImportStack[I]->FileName;
 
 2959      Diag(diag::note_ast_file_rebuild_required) << TopLevelASTFileName;
 
 2974ASTReader::TemporarilyOwnedStringRef
 
 2980ASTReader::TemporarilyOwnedStringRef
 
 2983  assert(Buf.capacity() != 0 && 
"Overlapping ResolveImportedPath calls");
 
 2985  if (Prefix.empty() || Path.empty() || llvm::sys::path::is_absolute(Path) ||
 
 2986      Path == 
"<built-in>" || Path == 
"<command line>")
 
 2990  llvm::sys::path::append(Buf, Prefix, Path);
 
 2991  StringRef ResolvedPath{Buf.data(), Buf.size()};
 
 2992  return {ResolvedPath, Buf};
 
 
 3005  return ResolvedPath->str();
 
 
 3020  llvm_unreachable(
"unknown ASTReadResult");
 
 
 3024    BitstreamCursor &Stream, StringRef Filename,
 
 3025    unsigned ClientLoadCapabilities, 
bool AllowCompatibleConfigurationMismatch,
 
 3026    ASTReaderListener &Listener, std::string &SuggestedPredefines) {
 
 3029    consumeError(std::move(Err));
 
 3037    Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
 
 3040      consumeError(MaybeEntry.takeError());
 
 3043    llvm::BitstreamEntry Entry = MaybeEntry.get();
 
 3045    switch (Entry.Kind) {
 
 3046    case llvm::BitstreamEntry::Error:
 
 3047    case llvm::BitstreamEntry::SubBlock:
 
 3050    case llvm::BitstreamEntry::EndBlock:
 
 3053    case llvm::BitstreamEntry::Record:
 
 3060    Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, 
Record);
 
 3061    if (!MaybeRecordType) {
 
 3063      consumeError(MaybeRecordType.takeError());
 
 3068      bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
 
 3069      if (ParseLanguageOptions(
Record, Filename, Complain, Listener,
 
 3070                               AllowCompatibleConfigurationMismatch))
 
 3071        Result = ConfigurationMismatch;
 
 3076      bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
 
 3077      if (ParseCodeGenOptions(
Record, Filename, Complain, Listener,
 
 3078                              AllowCompatibleConfigurationMismatch))
 
 3079        Result = ConfigurationMismatch;
 
 3084      bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
 
 3085      if (ParseTargetOptions(
Record, Filename, Complain, Listener,
 
 3086                             AllowCompatibleConfigurationMismatch))
 
 3087        Result = ConfigurationMismatch;
 
 3092      bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
 
 3093      if (!AllowCompatibleConfigurationMismatch &&
 
 3094          ParseFileSystemOptions(
Record, Complain, Listener))
 
 3095        Result = ConfigurationMismatch;
 
 3100      bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
 
 3101      if (!AllowCompatibleConfigurationMismatch &&
 
 3102          ParseHeaderSearchOptions(
Record, Filename, Complain, Listener))
 
 3103        Result = ConfigurationMismatch;
 
 3108      bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
 
 3109      if (!AllowCompatibleConfigurationMismatch &&
 
 3110          ParsePreprocessorOptions(
Record, Filename, Complain, Listener,
 
 3111                                   SuggestedPredefines))
 
 3112        Result = ConfigurationMismatch;
 
 3120                            SmallVectorImpl<ImportedModule> &Loaded,
 
 3122                            unsigned ClientLoadCapabilities) {
 
 3123  BitstreamCursor &Stream = F.
Stream;
 
 3126    Error(std::move(Err));
 
 3136  bool HasReadUnhashedControlBlock = 
false;
 
 3137  auto readUnhashedControlBlockOnce = [&]() {
 
 3138    if (!HasReadUnhashedControlBlock) {
 
 3139      HasReadUnhashedControlBlock = 
true;
 
 3140      if (ASTReadResult 
Result =
 
 3141              readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities))
 
 3147  bool DisableValidation = shouldDisableValidationForFile(F);
 
 3151  unsigned NumInputs = 0;
 
 3152  unsigned NumUserInputs = 0;
 
 3153  StringRef BaseDirectoryAsWritten;
 
 3155    Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
 
 3157      Error(MaybeEntry.takeError());
 
 3160    llvm::BitstreamEntry Entry = MaybeEntry.get();
 
 3162    switch (Entry.Kind) {
 
 3163    case llvm::BitstreamEntry::Error:
 
 3164      Error(
"malformed block record in AST file");
 
 3166    case llvm::BitstreamEntry::EndBlock: {
 
 3169      if (ASTReadResult 
Result = readUnhashedControlBlockOnce())
 
 3173      const HeaderSearchOptions &HSOpts =
 
 3174          PP.getHeaderSearchInfo().getHeaderSearchOpts();
 
 3181        bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
 
 3187        unsigned N = ValidateSystemInputs ? NumInputs : NumUserInputs;
 
 3191          N = ForceValidateUserInputs ? NumUserInputs : 0;
 
 3194          Diag(diag::remark_module_validation)
 
 3197        for (
unsigned I = 0; I < N; ++I) {
 
 3198          InputFile IF = getInputFile(F, I+1, Complain);
 
 3210        for (
unsigned I = 0; I < N; ++I) {
 
 3211          bool IsSystem = I >= NumUserInputs;
 
 3213          auto FilenameAsRequested = ResolveImportedPath(
 
 3216              *FilenameAsRequested, IsSystem, FI.
Overridden,
 
 3224    case llvm::BitstreamEntry::SubBlock:
 
 3228        if (llvm::Error Err = Stream.SkipBlock()) {
 
 3229          Error(std::move(Err));
 
 3233          Error(
"malformed block record in AST file");
 
 3243        if (Listener && !ImportedBy) {
 
 3249          bool AllowCompatibleConfigurationMismatch =
 
 3253              ReadOptionsBlock(Stream, F.
FileName, ClientLoadCapabilities,
 
 3254                               AllowCompatibleConfigurationMismatch, *Listener,
 
 3255                               SuggestedPredefines);
 
 3257            Error(
"malformed block record in AST file");
 
 3261          if (DisableValidation ||
 
 3262              (AllowConfigurationMismatch && 
Result == ConfigurationMismatch))
 
 3270        } 
else if (llvm::Error Err = Stream.SkipBlock()) {
 
 3271          Error(std::move(Err));
 
 3277        if (llvm::Error Err = Stream.SkipBlock()) {
 
 3278          Error(std::move(Err));
 
 3284    case llvm::BitstreamEntry::Record:
 
 3292    Expected<unsigned> MaybeRecordType =
 
 3293        Stream.readRecord(Entry.ID, 
Record, &Blob);
 
 3294    if (!MaybeRecordType) {
 
 3295      Error(MaybeRecordType.takeError());
 
 3301        if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
 
 3303                                         : diag::err_ast_file_version_too_new)
 
 3308      bool hasErrors = 
Record[7];
 
 3309      if (hasErrors && !DisableValidation) {
 
 3312        if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) &&
 
 3313            canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
 
 3316        if (!AllowASTWithCompilerErrors) {
 
 3317          Diag(diag::err_ast_file_with_compiler_errors)
 
 3323        Diags.ErrorOccurred = 
true;
 
 3324        Diags.UncompilableErrorOccurred = 
true;
 
 3325        Diags.UnrecoverableErrorOccurred = 
true;
 
 3338      StringRef ASTBranch = Blob;
 
 3339      if (StringRef(CurBranch) != ASTBranch && !DisableValidation) {
 
 3340        if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
 
 3341          Diag(diag::err_ast_file_different_branch)
 
 3353      if (ASTReadResult 
Result = readUnhashedControlBlockOnce())
 
 3363      auto [ImportLoc, ImportModuleFileIndex] =
 
 3364          ReadUntranslatedSourceLocation(
Record[Idx++]);
 
 3366      assert(ImportModuleFileIndex == 0);
 
 3368      StringRef ImportedName = ReadStringBlob(
Record, Idx, Blob);
 
 3370      bool IsImportingStdCXXModule = 
Record[Idx++];
 
 3372      off_t StoredSize = 0;
 
 3373      time_t StoredModTime = 0;
 
 3374      ASTFileSignature StoredSignature;
 
 3375      std::string ImportedFile;
 
 3376      std::string StoredFile;
 
 3377      bool IgnoreImportedByNote = 
false;
 
 3386        ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName(
 
 3387            ImportedName,  !IsImportingStdCXXModule);
 
 3389      if (IsImportingStdCXXModule && ImportedFile.empty()) {
 
 3390        Diag(diag::err_failed_to_find_module_file) << ImportedName;
 
 3394      if (!IsImportingStdCXXModule) {
 
 3395        StoredSize = (off_t)
Record[Idx++];
 
 3396        StoredModTime = (time_t)
Record[Idx++];
 
 3400                                                   SignatureBytes.end());
 
 3405        StoredFile = ReadPathBlob(BaseDirectoryAsWritten, 
Record, Idx, Blob);
 
 3406        if (ImportedFile.empty()) {
 
 3407          ImportedFile = StoredFile;
 
 3408        } 
else if (!getDiags().isIgnored(
 
 3409                       diag::warn_module_file_mapping_mismatch,
 
 3410                       CurrentImportLoc)) {
 
 3411          auto ImportedFileRef =
 
 3412              PP.getFileManager().getOptionalFileRef(ImportedFile);
 
 3413          auto StoredFileRef =
 
 3414              PP.getFileManager().getOptionalFileRef(StoredFile);
 
 3415          if ((ImportedFileRef && StoredFileRef) &&
 
 3416              (*ImportedFileRef != *StoredFileRef)) {
 
 3417            Diag(diag::warn_module_file_mapping_mismatch)
 
 3418                << ImportedFile << StoredFile;
 
 3419            Diag(diag::note_module_file_imported_by)
 
 3421            IgnoreImportedByNote = 
true;
 
 3428      unsigned Capabilities = ClientLoadCapabilities;
 
 3429      if ((ClientLoadCapabilities & ARR_OutOfDate) == 0)
 
 3430        Capabilities &= ~ARR_Missing;
 
 3433      auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F,
 
 3434                                Loaded, StoredSize, StoredModTime,
 
 3435                                StoredSignature, Capabilities);
 
 3440      if (IsImportingStdCXXModule) {
 
 3441        if (
const auto *Imported =
 
 3442                getModuleManager().lookupByFileName(ImportedFile);
 
 3443            Imported != 
nullptr && Imported->ModuleName != ImportedName) {
 
 3444          Diag(diag::err_failed_to_find_module_file) << ImportedName;
 
 3450      bool recompilingFinalized = 
Result == OutOfDate &&
 
 3451                                  (Capabilities & ARR_OutOfDate) &&
 
 3454                                      .getInMemoryModuleCache()
 
 3456      if (!IgnoreImportedByNote &&
 
 3458        Diag(diag::note_module_file_imported_by)
 
 3462      case Failure: 
return Failure;
 
 3465      case OutOfDate: 
return OutOfDate;
 
 3467      case ConfigurationMismatch: 
return ConfigurationMismatch;
 
 3468      case HadErrors: 
return HadErrors;
 
 3487      Diag(diag::remark_module_import)
 
 3489          << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
 
 3495      if (ASTReadResult 
Result = readUnhashedControlBlockOnce())
 
 3503      BaseDirectoryAsWritten = Blob;
 
 3505             "MODULE_DIRECTORY found before MODULE_NAME");
 
 3507      if (!PP.getPreprocessorOpts().ModulesCheckRelocated)
 
 3511      Module *M = PP.getHeaderSearchInfo().lookupModule(
 
 3518        if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
 
 3521          auto BuildDir = PP.getFileManager().getOptionalDirectoryRef(Blob);
 
 3522          if (!BuildDir || *BuildDir != M->
Directory) {
 
 3523            if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
 
 3524              Diag(diag::err_imported_module_relocated)
 
 3535      if (ASTReadResult 
Result =
 
 3536              ReadModuleMapFileBlock(
Record, F, ImportedBy, ClientLoadCapabilities))
 
 3542      NumUserInputs = 
Record[1];
 
 3544          (
const llvm::support::unaligned_uint64_t *)Blob.data();
 
 3553llvm::Error ASTReader::ReadASTBlock(
ModuleFile &F,
 
 3554                                    unsigned ClientLoadCapabilities) {
 
 3555  BitstreamCursor &Stream = F.
Stream;
 
 3557  if (llvm::Error Err = Stream.EnterSubBlock(
AST_BLOCK_ID))
 
 3564    Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
 
 3566      return MaybeEntry.takeError();
 
 3567    llvm::BitstreamEntry Entry = MaybeEntry.get();
 
 3569    switch (Entry.Kind) {
 
 3570    case llvm::BitstreamEntry::Error:
 
 3571      return llvm::createStringError(
 
 3572          std::errc::illegal_byte_sequence,
 
 3573          "error at end of module block in AST file");
 
 3574    case llvm::BitstreamEntry::EndBlock:
 
 3580      if (ASTContext *Ctx = ContextObj) {
 
 3581        DeclContext *DC = Ctx->getTranslationUnitDecl();
 
 3586      return llvm::Error::success();
 
 3587    case llvm::BitstreamEntry::SubBlock:
 
 3595        if (llvm::Error Err = Stream.SkipBlock())
 
 3597        if (llvm::Error Err = ReadBlockAbbrevs(
 
 3604        if (!PP.getExternalSource())
 
 3605          PP.setExternalSource(
this);
 
 3607        if (llvm::Error Err = Stream.SkipBlock())
 
 3609        if (llvm::Error Err =
 
 3618        if (llvm::Error Err = Stream.SkipBlock()) {
 
 3627        if (!PP.getPreprocessingRecord())
 
 3628          PP.createPreprocessingRecord();
 
 3629        if (!PP.getPreprocessingRecord()->getExternalSource())
 
 3630          PP.getPreprocessingRecord()->SetExternalSource(*
this);
 
 3634        if (llvm::Error Err = ReadSourceManagerBlock(F))
 
 3639        if (llvm::Error Err = ReadSubmoduleBlock(F, ClientLoadCapabilities))
 
 3644        BitstreamCursor 
C = Stream;
 
 3646        if (llvm::Error Err = Stream.SkipBlock())
 
 3650        CommentsCursors.push_back(std::make_pair(
C, &F));
 
 3655        if (llvm::Error Err = Stream.SkipBlock())
 
 3661    case llvm::BitstreamEntry::Record:
 
 3669    Expected<unsigned> MaybeRecordType =
 
 3670        Stream.readRecord(Entry.ID, 
Record, &Blob);
 
 3671    if (!MaybeRecordType)
 
 3672      return MaybeRecordType.takeError();
 
 3677      switch (RecordType) {
 
 3698    switch (RecordType) {
 
 3704        return llvm::createStringError(
 
 3705            std::errc::illegal_byte_sequence,
 
 3706            "duplicate TYPE_OFFSET record in AST file");
 
 3719        return llvm::createStringError(
 
 3720            std::errc::illegal_byte_sequence,
 
 3721            "duplicate DECL_OFFSET record in AST file");
 
 3733      DeclContext *TU = ContextObj->getTranslationUnitDecl();
 
 3734      LexicalContents Contents(
 
 3736          static_cast<unsigned int>(Blob.size() / 
sizeof(
DeclID)));
 
 3737      TULexicalDecls.push_back(std::make_pair(&F, Contents));
 
 3744      GlobalDeclID 
ID = ReadDeclID(F, 
Record, Idx);
 
 3745      auto *
Data = (
const unsigned char*)Blob.data();
 
 3746      PendingVisibleUpdates[
ID].push_back(UpdateData{&F, 
Data});
 
 3749      if (Decl *D = GetExistingDecl(ID))
 
 3750        PendingUpdateRecords.push_back(
 
 3751            PendingUpdateRecord(ID, D, 
false));
 
 3757      GlobalDeclID 
ID = ReadDeclID(F, 
Record, Idx);
 
 3758      auto *
Data = (
const unsigned char *)Blob.data();
 
 3759      PendingModuleLocalVisibleUpdates[
ID].push_back(UpdateData{&F, 
Data});
 
 3762      if (Decl *D = GetExistingDecl(ID))
 
 3763        PendingUpdateRecords.push_back(
 
 3764            PendingUpdateRecord(ID, D, 
false));
 
 3772      GlobalDeclID 
ID = ReadDeclID(F, 
Record, Idx);
 
 3773      auto *
Data = (
const unsigned char *)Blob.data();
 
 3774      TULocalUpdates[
ID].push_back(UpdateData{&F, 
Data});
 
 3777      if (Decl *D = GetExistingDecl(ID))
 
 3778        PendingUpdateRecords.push_back(
 
 3779            PendingUpdateRecord(ID, D, 
false));
 
 3785      GlobalDeclID 
ID = ReadDeclID(F, 
Record, Idx);
 
 3786      auto *
Data = (
const unsigned char *)Blob.data();
 
 3787      PendingSpecializationsUpdates[
ID].push_back(UpdateData{&F, 
Data});
 
 3790      if (Decl *D = GetExistingDecl(ID))
 
 3791        PendingUpdateRecords.push_back(
 
 3792            PendingUpdateRecord(ID, D, 
false));
 
 3798      GlobalDeclID 
ID = ReadDeclID(F, 
Record, Idx);
 
 3799      auto *
Data = (
const unsigned char *)Blob.data();
 
 3800      PendingPartialSpecializationsUpdates[
ID].push_back(UpdateData{&F, 
Data});
 
 3803      if (Decl *D = GetExistingDecl(ID))
 
 3804        PendingUpdateRecords.push_back(
 
 3805            PendingUpdateRecord(ID, D, 
false));
 
 3811          reinterpret_cast<const unsigned char *
>(Blob.data());
 
 3817            ASTIdentifierLookupTrait(*
this, F));
 
 3819        PP.getIdentifierTable().setExternalIdentifierLookup(
this);
 
 3825        return llvm::createStringError(
 
 3826            std::errc::illegal_byte_sequence,
 
 3827            "duplicate IDENTIFIER_OFFSET record in AST file");
 
 3833        IdentifiersLoaded.resize(IdentifiersLoaded.size()
 
 3845      for (
unsigned I = 0, N = 
Record.size(); I != N; )
 
 3846        EagerlyDeserializedDecls.push_back(ReadDeclID(F, 
Record, I));
 
 3853          getContext().getLangOpts().BuildingPCHWithObjectFile)
 
 3854        for (
unsigned I = 0, N = 
Record.size(); I != N; )
 
 3855          EagerlyDeserializedDecls.push_back(ReadDeclID(F, 
Record, I));
 
 3859      if (SpecialTypes.empty()) {
 
 3860        for (
unsigned I = 0, N = 
Record.size(); I != N; ++I)
 
 3861          SpecialTypes.push_back(getGlobalTypeID(F, 
Record[I]));
 
 3868      if (SpecialTypes.size() != 
Record.size())
 
 3869        return llvm::createStringError(std::errc::illegal_byte_sequence,
 
 3870                                       "invalid special-types record");
 
 3872      for (
unsigned I = 0, N = 
Record.size(); I != N; ++I) {
 
 3874        if (!SpecialTypes[I])
 
 3875          SpecialTypes[I] = 
ID;
 
 3882      TotalNumStatements += 
Record[0];
 
 3883      TotalNumMacros += 
Record[1];
 
 3884      TotalLexicalDeclContexts += 
Record[2];
 
 3885      TotalVisibleDeclContexts += 
Record[3];
 
 3886      TotalModuleLocalVisibleDeclContexts += 
Record[4];
 
 3887      TotalTULocalVisibleDeclContexts += 
Record[5];
 
 3891      for (
unsigned I = 0, N = 
Record.size(); I != N; )
 
 3892        UnusedFileScopedDecls.push_back(ReadDeclID(F, 
Record, I));
 
 3896      for (
unsigned I = 0, N = 
Record.size(); I != N; )
 
 3897        DelegatingCtorDecls.push_back(ReadDeclID(F, 
Record, I));
 
 3901      if (
Record.size() % 3 != 0)
 
 3902        return llvm::createStringError(std::errc::illegal_byte_sequence,
 
 3903                                       "invalid weak identifiers record");
 
 3907      WeakUndeclaredIdentifiers.clear();
 
 3910      for (
unsigned I = 0, N = 
Record.size(); I < N; ) {
 
 3911        WeakUndeclaredIdentifiers.push_back(
 
 3912          getGlobalIdentifierID(F, 
Record[I++]));
 
 3913        WeakUndeclaredIdentifiers.push_back(
 
 3914          getGlobalIdentifierID(F, 
Record[I++]));
 
 3915        WeakUndeclaredIdentifiers.push_back(
 
 3916            ReadSourceLocation(F, 
Record, I).getRawEncoding());
 
 3923      unsigned LocalBaseSelectorID = 
Record[1];
 
 3929        GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F));
 
 3934          std::make_pair(LocalBaseSelectorID,
 
 3946          = ASTSelectorLookupTable::Create(
 
 3949                        ASTSelectorLookupTrait(*
this, F));
 
 3950      TotalNumMethodPoolEntries += 
Record[1];
 
 3955        for (
unsigned Idx = 0, N = 
Record.size() - 1; Idx < N; ) {
 
 3956          ReferencedSelectorsData.push_back(getGlobalSelectorID(F,
 
 3958          ReferencedSelectorsData.push_back(ReadSourceLocation(F, 
Record, Idx).
 
 3967        PP.setPreambleRecordedPragmaAssumeNonNullLoc(
 
 3968            ReadSourceLocation(F, 
Record, Idx));
 
 3974        SmallVector<SourceLocation, 64> SrcLocs;
 
 3976        while (Idx < 
Record.size())
 
 3977          SrcLocs.push_back(ReadSourceLocation(F, 
Record, Idx));
 
 3978        PP.setDeserializedSafeBufferOptOutMap(SrcLocs);
 
 3985        unsigned Idx = 0, End = 
Record.size() - 1;
 
 3986        bool ReachedEOFWhileSkipping = 
Record[Idx++];
 
 3987        std::optional<Preprocessor::PreambleSkipInfo> SkipInfo;
 
 3988        if (ReachedEOFWhileSkipping) {
 
 3989          SourceLocation HashToken = ReadSourceLocation(F, 
Record, Idx);
 
 3990          SourceLocation IfTokenLoc = ReadSourceLocation(F, 
Record, Idx);
 
 3991          bool FoundNonSkipPortion = 
Record[Idx++];
 
 3992          bool FoundElse = 
Record[Idx++];
 
 3993          SourceLocation ElseLoc = ReadSourceLocation(F, 
Record, Idx);
 
 3994          SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion,
 
 3995                           FoundElse, ElseLoc);
 
 3997        SmallVector<PPConditionalInfo, 4> ConditionalStack;
 
 3999          auto Loc = ReadSourceLocation(F, 
Record, Idx);
 
 4000          bool WasSkipping = 
Record[Idx++];
 
 4001          bool FoundNonSkip = 
Record[Idx++];
 
 4002          bool FoundElse = 
Record[Idx++];
 
 4003          ConditionalStack.push_back(
 
 4004              {Loc, WasSkipping, FoundNonSkip, FoundElse});
 
 4006        PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo);
 
 4011      if (!
Record.empty() && Listener)
 
 4029        Diags.Report(SourceLocation(), diag::remark_sloc_usage);
 
 4030        SourceMgr.noteSLocAddressSpaceUsage(Diags);
 
 4031        return llvm::createStringError(std::errc::invalid_argument,
 
 4032                                       "ran out of source locations");
 
 4037      unsigned RangeStart =
 
 4039      GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F));
 
 4044      GlobalSLocOffsetMap.insert(
 
 4046                           - SLocSpaceSize,&F));
 
 4057      ParseLineTable(F, 
Record);
 
 4061      for (
unsigned I = 0, N = 
Record.size(); I != N; )
 
 4062        ExtVectorDecls.push_back(ReadDeclID(F, 
Record, I));
 
 4066      if (
Record.size() % 3 != 0)
 
 4067        return llvm::createStringError(std::errc::illegal_byte_sequence,
 
 4068                                       "Invalid VTABLE_USES record");
 
 4075      for (
unsigned Idx = 0, N = 
Record.size(); Idx != N; ) {
 
 4076        VTableUses.push_back(
 
 4077            {ReadDeclID(F, 
Record, Idx),
 
 4078             ReadSourceLocation(F, 
Record, Idx).getRawEncoding(),
 
 4085      if (
Record.size() % 2 != 0)
 
 4086        return llvm::createStringError(
 
 4087            std::errc::illegal_byte_sequence,
 
 4088            "Invalid PENDING_IMPLICIT_INSTANTIATIONS block");
 
 4090      for (
unsigned I = 0, N = 
Record.size(); I != N; ) {
 
 4091        PendingInstantiations.push_back(
 
 4092            {ReadDeclID(F, 
Record, I),
 
 4093             ReadSourceLocation(F, 
Record, I).getRawEncoding()});
 
 4099        return llvm::createStringError(std::errc::illegal_byte_sequence,
 
 4100                                       "Invalid SEMA_DECL_REFS block");
 
 4101      for (
unsigned I = 0, N = 
Record.size(); I != N; )
 
 4102        SemaDeclRefs.push_back(ReadDeclID(F, 
Record, I));
 
 4110      unsigned LocalBasePreprocessedEntityID = 
Record[0];
 
 4112      unsigned StartingID;
 
 4113      if (!PP.getPreprocessingRecord())
 
 4114        PP.createPreprocessingRecord();
 
 4115      if (!PP.getPreprocessingRecord()->getExternalSource())
 
 4116        PP.getPreprocessingRecord()->SetExternalSource(*
this);
 
 4118        = PP.getPreprocessingRecord()
 
 4125        GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F));
 
 4130          std::make_pair(LocalBasePreprocessedEntityID,
 
 4142      if (!PP.getPreprocessingRecord())
 
 4143        PP.createPreprocessingRecord();
 
 4144      if (!PP.getPreprocessingRecord()->getExternalSource())
 
 4145        PP.getPreprocessingRecord()->SetExternalSource(*
this);
 
 4150        GlobalSkippedRangeMap.insert(
 
 4156      if (
Record.size() % 2 != 0)
 
 4157        return llvm::createStringError(
 
 4158            std::errc::illegal_byte_sequence,
 
 4159            "invalid DECL_UPDATE_OFFSETS block in AST file");
 
 4160      for (
unsigned I = 0, N = 
Record.size(); I != N; ) {
 
 4161        GlobalDeclID 
ID = ReadDeclID(F, 
Record, I);
 
 4162        DeclUpdateOffsets[
ID].push_back(std::make_pair(&F, 
Record[I++]));
 
 4166        if (Decl *D = GetExistingDecl(ID))
 
 4167          PendingUpdateRecords.push_back(
 
 4168              PendingUpdateRecord(ID, D, 
false));
 
 4173      if (
Record.size() % 5 != 0)
 
 4174        return llvm::createStringError(
 
 4175            std::errc::illegal_byte_sequence,
 
 4176            "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST " 
 4178      for (
unsigned I = 0, N = 
Record.size(); I != N; ) {
 
 4179        GlobalDeclID 
ID = ReadDeclID(F, 
Record, I);
 
 4182        assert(BaseOffset && 
"Invalid DeclsBlockStartOffset for module file!");
 
 4185            LocalLexicalOffset ? BaseOffset + LocalLexicalOffset : 0;
 
 4188            LocalVisibleOffset ? BaseOffset + LocalVisibleOffset : 0;
 
 4191            LocalModuleLocalOffset ? BaseOffset + LocalModuleLocalOffset : 0;
 
 4194            TULocalLocalOffset ? BaseOffset + TULocalLocalOffset : 0;
 
 4196        DelayedNamespaceOffsetMap[
ID] = {
 
 4197            {VisibleOffset, TULocalOffset, ModuleLocalOffset}, LexicalOffset};
 
 4199        assert(!GetExistingDecl(ID) &&
 
 4200               "We shouldn't load the namespace in the front of delayed " 
 4201               "namespace lexical and visible block");
 
 4207      for (
unsigned I = 0, N = 
Record.size(); I != N; ) {
 
 4208        GlobalDeclID 
ID = ReadDeclID(F, 
Record, I);
 
 4209        auto &RelatedDecls = RelatedDeclsMap[
ID];
 
 4210        unsigned NN = 
Record[I++];
 
 4211        RelatedDecls.reserve(NN);
 
 4212        for (
unsigned II = 0; II < NN; II++)
 
 4213          RelatedDecls.push_back(ReadDeclID(F, 
Record, I));
 
 4219        return llvm::createStringError(
 
 4220            std::errc::illegal_byte_sequence,
 
 4221            "duplicate OBJC_CATEGORIES_MAP record in AST file");
 
 4234      CUDASpecialDeclRefs.clear();
 
 4235      for (
unsigned I = 0, N = 
Record.size(); I != N; )
 
 4236        CUDASpecialDeclRefs.push_back(ReadDeclID(F, 
Record, I));
 
 4246            HeaderFileInfoTrait(*
this, F));
 
 4248        PP.getHeaderSearchInfo().SetExternalSource(
this);
 
 4249        if (!PP.getHeaderSearchInfo().getExternalLookup())
 
 4250          PP.getHeaderSearchInfo().SetExternalLookup(
this);
 
 4256      FPPragmaOptions.swap(
Record);
 
 4260      for (
unsigned I = 0, N = 
Record.size(); I != N; )
 
 4261        DeclsWithEffectsToVerify.push_back(ReadDeclID(F, 
Record, I));
 
 4265      for (
unsigned I = 0, E = 
Record.size(); I != E; ) {
 
 4266        auto Name = ReadString(
Record, I);
 
 4267        auto &OptInfo = OpenCLExtensions.OptMap[Name];
 
 4268        OptInfo.Supported = 
Record[I++] != 0;
 
 4269        OptInfo.Enabled = 
Record[I++] != 0;
 
 4270        OptInfo.WithPragma = 
Record[I++] != 0;
 
 4271        OptInfo.Avail = 
Record[I++];
 
 4272        OptInfo.Core = 
Record[I++];
 
 4273        OptInfo.Opt = 
Record[I++];
 
 4278      for (
unsigned I = 0, N = 
Record.size(); I != N; )
 
 4279        TentativeDefinitions.push_back(ReadDeclID(F, 
Record, I));
 
 4283      for (
unsigned I = 0, N = 
Record.size(); I != N; )
 
 4284        KnownNamespaces.push_back(ReadDeclID(F, 
Record, I));
 
 4288      if (
Record.size() % 2 != 0)
 
 4289        return llvm::createStringError(std::errc::illegal_byte_sequence,
 
 4290                                       "invalid undefined-but-used record");
 
 4291      for (
unsigned I = 0, N = 
Record.size(); I != N; ) {
 
 4292        UndefinedButUsed.push_back(
 
 4293            {ReadDeclID(F, 
Record, I),
 
 4294             ReadSourceLocation(F, 
Record, I).getRawEncoding()});
 
 4299      for (
unsigned I = 0, N = 
Record.size(); I != N;) {
 
 4300        DelayedDeleteExprs.push_back(ReadDeclID(F, 
Record, I).getRawValue());
 
 4302        DelayedDeleteExprs.push_back(Count);
 
 4303        for (uint64_t 
C = 0; 
C < Count; ++
C) {
 
 4304          DelayedDeleteExprs.push_back(ReadSourceLocation(F, 
Record, I).getRawEncoding());
 
 4305          bool IsArrayForm = 
Record[I++] == 1;
 
 4306          DelayedDeleteExprs.push_back(IsArrayForm);
 
 4313          getContext().getLangOpts().BuildingPCHWithObjectFile)
 
 4314        for (
unsigned I = 0, N = 
Record.size(); I != N;)
 
 4315          VTablesToEmit.push_back(ReadDeclID(F, 
Record, I));
 
 4323        for (
unsigned I = 0, N = 
Record.size(); I != N; ) {
 
 4324          unsigned GlobalID = getGlobalSubmoduleID(F, 
Record[I++]);
 
 4325          SourceLocation Loc = ReadSourceLocation(F, 
Record, I);
 
 4327            PendingImportedModules.push_back(ImportedSubmodule(GlobalID, Loc));
 
 4328            if (DeserializationListener)
 
 4329              DeserializationListener->ModuleImportRead(GlobalID, Loc);
 
 4337        return llvm::createStringError(
 
 4338            std::errc::illegal_byte_sequence,
 
 4339            "duplicate MACRO_OFFSET record in AST file");
 
 4342      unsigned LocalBaseMacroID = 
Record[1];
 
 4348        GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F));
 
 4352          std::make_pair(LocalBaseMacroID,
 
 4361      LateParsedTemplates.emplace_back(
 
 4362          std::piecewise_construct, std::forward_as_tuple(&F),
 
 4368        return llvm::createStringError(std::errc::illegal_byte_sequence,
 
 4369                                       "invalid pragma optimize record");
 
 4370      OptimizeOffPragmaLocation = ReadSourceLocation(F, 
Record[0]);
 
 4375        return llvm::createStringError(std::errc::illegal_byte_sequence,
 
 4376                                       "invalid pragma ms_struct record");
 
 4377      PragmaMSStructState = 
Record[0];
 
 4382        return llvm::createStringError(
 
 4383            std::errc::illegal_byte_sequence,
 
 4384            "invalid pragma pointers to members record");
 
 4385      PragmaMSPointersToMembersState = 
Record[0];
 
 4386      PointersToMembersPragmaLocation = ReadSourceLocation(F, 
Record[1]);
 
 4390      for (
unsigned I = 0, N = 
Record.size(); I != N; )
 
 4391        UnusedLocalTypedefNameCandidates.push_back(ReadDeclID(F, 
Record, I));
 
 4396        return llvm::createStringError(std::errc::illegal_byte_sequence,
 
 4397                                       "invalid cuda pragma options record");
 
 4398      ForceHostDeviceDepth = 
Record[0];
 
 4403        return llvm::createStringError(std::errc::illegal_byte_sequence,
 
 4404                                       "invalid pragma pack record");
 
 4405      PragmaAlignPackCurrentValue = ReadAlignPackInfo(
Record[0]);
 
 4406      PragmaAlignPackCurrentLocation = ReadSourceLocation(F, 
Record[1]);
 
 4407      unsigned NumStackEntries = 
Record[2];
 
 4410      PragmaAlignPackStack.clear();
 
 4411      for (
unsigned I = 0; I < NumStackEntries; ++I) {
 
 4412        PragmaAlignPackStackEntry Entry;
 
 4413        Entry.Value = ReadAlignPackInfo(
Record[Idx++]);
 
 4414        Entry.Location = ReadSourceLocation(F, 
Record[Idx++]);
 
 4415        Entry.PushLocation = ReadSourceLocation(F, 
Record[Idx++]);
 
 4416        PragmaAlignPackStrings.push_back(ReadString(
Record, Idx));
 
 4417        Entry.SlotLabel = PragmaAlignPackStrings.back();
 
 4418        PragmaAlignPackStack.push_back(Entry);
 
 4425        return llvm::createStringError(std::errc::illegal_byte_sequence,
 
 4426                                       "invalid pragma float control record");
 
 4428      FpPragmaCurrentLocation = ReadSourceLocation(F, 
Record[1]);
 
 4429      unsigned NumStackEntries = 
Record[2];
 
 4432      FpPragmaStack.clear();
 
 4433      for (
unsigned I = 0; I < NumStackEntries; ++I) {
 
 4434        FpPragmaStackEntry Entry;
 
 4436        Entry.Location = ReadSourceLocation(F, 
Record[Idx++]);
 
 4437        Entry.PushLocation = ReadSourceLocation(F, 
Record[Idx++]);
 
 4438        FpPragmaStrings.push_back(ReadString(
Record, Idx));
 
 4439        Entry.SlotLabel = FpPragmaStrings.back();
 
 4440        FpPragmaStack.push_back(Entry);
 
 4446      for (
unsigned I = 0, N = 
Record.size(); I != N; )
 
 4447        DeclsToCheckForDeferredDiags.insert(ReadDeclID(F, 
Record, I));
 
 4453void ASTReader::ReadModuleOffsetMap(
ModuleFile &F)
 const {
 
 4468  assert(ImportedModuleVector.empty());
 
 4470  while (
Data < DataEnd) {
 
 4474    using namespace llvm::support;
 
 4476        endian::readNext<uint8_t, llvm::endianness::little>(
Data));
 
 4477    uint16_t Len = endian::readNext<uint16_t, llvm::endianness::little>(
Data);
 
 4478    StringRef Name = StringRef((
const char*)
Data, Len);
 
 4482                          ? ModuleMgr.lookupByModuleName(Name)
 
 4483                          : ModuleMgr.lookupByFileName(Name));
 
 4485      std::string Msg = 
"refers to unknown module, cannot find ";
 
 4486      Msg.append(std::string(Name));
 
 4491    ImportedModuleVector.push_back(OM);
 
 4494        endian::readNext<uint32_t, llvm::endianness::little>(
Data);
 
 4495    uint32_t PreprocessedEntityIDOffset =
 
 4496        endian::readNext<uint32_t, llvm::endianness::little>(
Data);
 
 4498        endian::readNext<uint32_t, llvm::endianness::little>(
Data);
 
 4500        endian::readNext<uint32_t, llvm::endianness::little>(
Data);
 
 4503                         RemapBuilder &Remap) {
 
 4504      constexpr uint32_t None = std::numeric_limits<uint32_t>::max();
 
 4506        Remap.insert(std::make_pair(Offset,
 
 4507                                    static_cast<int>(BaseOffset - Offset)));
 
 4510    mapOffset(MacroIDOffset, OM->
BaseMacroID, MacroRemap);
 
 4512              PreprocessedEntityRemap);
 
 4521                                  unsigned ClientLoadCapabilities) {
 
 4530         "MODULE_NAME should come before MODULE_MAP_FILE");
 
 4531  if (PP.getPreprocessorOpts().ModulesCheckRelocated &&
 
 4537    auto &Map = PP.getHeaderSearchInfo().getModuleMap();
 
 4539        M ? Map.getModuleMapFileForUniquing(M) : std::nullopt;
 
 4541    if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
 
 4544      if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities)) {
 
 4545        if (
auto ASTFE = M ? M->
getASTFile() : std::nullopt) {
 
 4548                                               << ASTFE->getName();
 
 4552          Diag(diag::err_imported_module_not_found)
 
 4559          if (ImportedBy && ImportedBy->
Kind == 
MK_PCH)
 
 4560            Diag(diag::note_imported_by_pch_module_not_found)
 
 4567    assert(M && M->
Name == F.
ModuleName && 
"found module with different name");
 
 4571    if (!StoredModMap || *StoredModMap != ModMap) {
 
 4572      assert(ModMap && 
"found module is missing module map file");
 
 4574             "top-level import should be verified");
 
 4576      if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
 
 4577        Diag(diag::err_imported_module_modmap_changed)
 
 4584    for (
unsigned I = 0, N = 
Record[Idx++]; I < N; ++I) {
 
 4586      std::string Filename = ReadPath(F, 
Record, Idx);
 
 4589        if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
 
 4590          Error(
"could not find file '" + Filename +
"' referenced by AST file");
 
 4593      AdditionalStoredMaps.insert(*SF);
 
 4598    if (
auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) {
 
 4599      for (FileEntryRef ModMap : *AdditionalModuleMaps) {
 
 4602        if (!AdditionalStoredMaps.erase(ModMap)) {
 
 4603          if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
 
 4604            Diag(diag::err_module_different_modmap)
 
 4613    for (FileEntryRef ModMap : AdditionalStoredMaps) {
 
 4614      if (!canRecoverFromOutOfDate(F.
FileName, ClientLoadCapabilities))
 
 4615        Diag(diag::err_module_different_modmap)
 
 4629  SemaObjC::GlobalMethodPool::iterator Known =
 
 4635  ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first
 
 4636                                                    : Known->second.second;
 
 4640      if (List->getMethod() == Method) {
 
 4648    if (List->getNext())
 
 4649      List->setMethod(List->getNext()->getMethod());
 
 4651      List->setMethod(Method);
 
 
 4657  for (
Decl *D : Names) {
 
 4661    if (wasHidden && SemaObj) {
 
 
 4674  Stack.push_back(Mod);
 
 4675  while (!Stack.empty()) {
 
 4676    Mod = Stack.pop_back_val();
 
 4678    if (NameVisibility <= Mod->NameVisibility) {
 
 4694    HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod);
 
 4695    if (Hidden != HiddenNamesMap.end()) {
 
 4696      auto HiddenNames = std::move(*Hidden);
 
 4697      HiddenNamesMap.erase(Hidden);
 
 4699      assert(!HiddenNamesMap.contains(Mod) &&
 
 4700             "making names visible added hidden names");
 
 4707           I = Exports.begin(), E = Exports.end(); I != E; ++I) {
 
 4709      if (Visited.insert(Exported).second)
 
 4710        Stack.push_back(Exported);
 
 
 4728      PendingMergedDefinitionsToDeduplicate.insert(Def);
 
 
 4737  if (TriedLoadingGlobalIndex || !UseGlobalIndex ||
 
 4738      !PP.getLangOpts().Modules)
 
 4742  TriedLoadingGlobalIndex = 
true;
 
 4743  StringRef ModuleCachePath
 
 4745  std::pair<GlobalModuleIndex *, llvm::Error> 
Result =
 
 4747  if (llvm::Error Err = std::move(
Result.second)) {
 
 4749    consumeError(std::move(Err)); 
 
 4753  GlobalIndex.reset(
Result.first);
 
 4754  ModuleMgr.setGlobalIndex(GlobalIndex.get());
 
 
 4759  return PP.getLangOpts().Modules && UseGlobalIndex &&
 
 
 4771      consumeError(MaybeEntry.takeError());
 
 4774    llvm::BitstreamEntry Entry = MaybeEntry.get();
 
 4776    switch (Entry.Kind) {
 
 4777    case llvm::BitstreamEntry::Error:
 
 4778    case llvm::BitstreamEntry::EndBlock:
 
 4781    case llvm::BitstreamEntry::Record:
 
 4787        consumeError(Skipped.takeError());
 
 4791    case llvm::BitstreamEntry::SubBlock:
 
 4792      if (Entry.ID == BlockID) {
 
 4793        if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) {
 
 4795          consumeError(std::move(Err));
 
 4802      if (llvm::Error Err = Cursor.SkipBlock()) {
 
 4804        consumeError(std::move(Err));
 
 
 4813                                            unsigned ClientLoadCapabilities,
 
 4815  llvm::TimeTraceScope scope(
"ReadAST", 
FileName);
 
 4819      CurrentDeserializingModuleKind, 
Type);
 
 4825  unsigned PreviousGeneration = 0;
 
 4829  unsigned NumModules = ModuleMgr.size();
 
 4834                      ClientLoadCapabilities)) {
 
 4835    ModuleMgr.removeModules(ModuleMgr.begin() + NumModules);
 
 4839    GlobalIndex.reset();
 
 4840    ModuleMgr.setGlobalIndex(
nullptr);
 
 4844  if (NewLoadedModuleFile && !Loaded.empty())
 
 4845    *NewLoadedModuleFile = Loaded.back().Mod;
 
 4856  for (ImportedModule &M : Loaded) {
 
 4858    llvm::TimeTraceScope Scope2(
"Read Loaded AST", F.
ModuleName);
 
 4861    if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) {
 
 4862      Error(std::move(Err));
 
 4868      Error(diag::err_module_file_missing_top_level_submodule, F.
FileName);
 
 4874      if (llvm::Error Err = ReadExtensionBlock(F)) {
 
 4875        Error(std::move(Err));
 
 4888  for (ImportedModule &M : Loaded) {
 
 4904      if (!PP.getLangOpts().CPlusPlus) {
 
 4911        auto It = PP.getIdentifierTable().find(Key);
 
 4912        if (It == PP.getIdentifierTable().end())
 
 4921        II = &PP.getIdentifierTable().getOwn(Key);
 
 4939    for (
auto &Id : PP.getIdentifierTable())
 
 4940      Id.second->setOutOfDate(
true);
 
 4943  for (
const auto &Sel : SelectorGeneration)
 
 4944    SelectorOutOfDate[Sel.first] = 
true;
 
 4948  for (ImportedModule &M : Loaded) {
 
 4951    ModuleMgr.moduleFileAccepted(&F);
 
 4964  for (
unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) {
 
 4965    UnresolvedModuleRef &
Unresolved = UnresolvedModuleRefs[I];
 
 4970    case UnresolvedModuleRef::Conflict:
 
 4973        Conflict.
Other = ResolvedMod;
 
 4975        Unresolved.Mod->Conflicts.push_back(Conflict);
 
 4979    case UnresolvedModuleRef::Import:
 
 4984    case UnresolvedModuleRef::Affecting:
 
 4986        Unresolved.Mod->AffectingClangModules.insert(ResolvedMod);
 
 4989    case UnresolvedModuleRef::Export:
 
 4996  UnresolvedModuleRefs.clear();
 
 5008  if (DeserializationListener)
 
 5009    DeserializationListener->ReaderInitialized(
this);
 
 5011  ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule();
 
 5026    for (
unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) {
 
 5027      loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(),
 
 5028                         ObjCClassesLoaded[I], PreviousGeneration);
 
 5033      PP.getHeaderSearchInfo().getHeaderSearchOpts();
 
 5038    for (
unsigned I = 0, N = Loaded.size(); I != N; ++I) {
 
 5039      ImportedModule &M = Loaded[I];
 
 
 5057  if (!Stream.canSkipToPos(4))
 
 5058    return llvm::createStringError(
 
 5059        std::errc::illegal_byte_sequence,
 
 5060        "file too small to contain precompiled file magic");
 
 5061  for (
unsigned C : {
'C', 
'P', 
'C', 
'H'})
 
 5064        return llvm::createStringError(
 
 5065            std::errc::illegal_byte_sequence,
 
 5066            "file doesn't start with precompiled file magic");
 
 5068      return Res.takeError();
 
 5069  return llvm::Error::success();
 
 
 5084  llvm_unreachable(
"unknown module kind");
 
 
 5088ASTReader::ReadASTCore(StringRef 
FileName,
 
 5090                       SourceLocation ImportLoc,
 
 5092                       SmallVectorImpl<ImportedModule> &Loaded,
 
 5093                       off_t ExpectedSize, time_t ExpectedModTime,
 
 5094                       ASTFileSignature ExpectedSignature,
 
 5095                       unsigned ClientLoadCapabilities) {
 
 5097  std::string ErrorStr;
 
 5099    = ModuleMgr.addModule(
FileName, 
Type, ImportLoc, ImportedBy,
 
 5100                          getGeneration(), ExpectedSize, ExpectedModTime,
 
 5104  switch (AddResult) {
 
 5106    Diag(diag::remark_module_import)
 
 5108        << (ImportedBy ? StringRef(ImportedBy->
ModuleName) : StringRef());
 
 5118    if (ClientLoadCapabilities & ARR_Missing)
 
 5122    Diag(diag::err_ast_file_not_found)
 
 5130    if (ClientLoadCapabilities & ARR_OutOfDate)
 
 5134    Diag(diag::err_ast_file_out_of_date)
 
 5140  assert(M && 
"Missing module file");
 
 5142  bool ShouldFinalizePCM = 
false;
 
 5143  auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() {
 
 5144    auto &MC = getModuleManager().getModuleCache().getInMemoryModuleCache();
 
 5145    if (ShouldFinalizePCM)
 
 5151  BitstreamCursor &Stream = F.Stream;
 
 5152  Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer));
 
 5153  F.SizeInBits = F.Buffer->getBufferSize() * 8;
 
 5157    Diag(diag::err_ast_file_invalid)
 
 5163  bool HaveReadControlBlock = 
false;
 
 5165    Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
 
 5167      Error(MaybeEntry.takeError());
 
 5170    llvm::BitstreamEntry Entry = MaybeEntry.get();
 
 5172    switch (Entry.Kind) {
 
 5173    case llvm::BitstreamEntry::Error:
 
 5174    case llvm::BitstreamEntry::Record:
 
 5175    case llvm::BitstreamEntry::EndBlock:
 
 5176      Error(
"invalid record at top-level of AST file");
 
 5179    case llvm::BitstreamEntry::SubBlock:
 
 5185      HaveReadControlBlock = 
true;
 
 5186      switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) {
 
 5194            F.ModuleName.empty()) {
 
 5196          if (
Result != OutOfDate ||
 
 5197              (ClientLoadCapabilities & ARR_OutOfDate) == 0)
 
 5203      case Failure: 
return Failure;
 
 5204      case Missing: 
return Missing;
 
 5205      case OutOfDate: 
return OutOfDate;
 
 5207      case ConfigurationMismatch: 
return ConfigurationMismatch;
 
 5208      case HadErrors: 
return HadErrors;
 
 5213      if (!HaveReadControlBlock) {
 
 5214        if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0)
 
 5215          Diag(diag::err_ast_file_version_too_old)
 
 5221      Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc));
 
 5222      ShouldFinalizePCM = 
true;
 
 5226      if (llvm::Error Err = Stream.SkipBlock()) {
 
 5227        Error(std::move(Err));
 
 5234  llvm_unreachable(
"unexpected break; expected return");
 
 5238ASTReader::readUnhashedControlBlock(
ModuleFile &F, 
bool WasImportedBy,
 
 5239                                    unsigned ClientLoadCapabilities) {
 
 5240  const HeaderSearchOptions &HSOpts =
 
 5241      PP.getHeaderSearchInfo().getHeaderSearchOpts();
 
 5242  bool AllowCompatibleConfigurationMismatch =
 
 5244  bool DisableValidation = shouldDisableValidationForFile(F);
 
 5246  ASTReadResult 
Result = readUnhashedControlBlockImpl(
 
 5248      AllowCompatibleConfigurationMismatch, Listener.get(),
 
 5253  if (DisableValidation || WasImportedBy ||
 
 5254      (AllowConfigurationMismatch && 
Result == ConfigurationMismatch))
 
 5258    Error(
"malformed block record in AST file");
 
 5281    if (getModuleManager().getModuleCache().getInMemoryModuleCache().isPCMFinal(
 
 5283      Diag(diag::warn_module_system_bit_conflict) << F.
FileName;
 
 5292    ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
 
 5293    unsigned ClientLoadCapabilities, 
bool AllowCompatibleConfigurationMismatch,
 
 5294    ASTReaderListener *Listener, 
bool ValidateDiagnosticOptions) {
 
 5296  BitstreamCursor Stream(StreamData);
 
 5301    consumeError(std::move(Err));
 
 5313    Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
 
 5316      consumeError(MaybeEntry.takeError());
 
 5319    llvm::BitstreamEntry Entry = MaybeEntry.get();
 
 5321    switch (Entry.Kind) {
 
 5322    case llvm::BitstreamEntry::Error:
 
 5323    case llvm::BitstreamEntry::SubBlock:
 
 5326    case llvm::BitstreamEntry::EndBlock:
 
 5329    case llvm::BitstreamEntry::Record:
 
 5337    Expected<unsigned> MaybeRecordType =
 
 5338        Stream.readRecord(Entry.ID, 
Record, &Blob);
 
 5339    if (!MaybeRecordType) {
 
 5348               "Dummy AST file signature not backpatched in ASTWriter.");
 
 5355               "Dummy AST block hash not backpatched in ASTWriter.");
 
 5359      bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0;
 
 5360      if (Listener && ValidateDiagnosticOptions &&
 
 5361          !AllowCompatibleConfigurationMismatch &&
 
 5362          ParseDiagnosticOptions(
Record, Filename, Complain, *Listener))
 
 5367      bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0;
 
 5368      if (Listener && !AllowCompatibleConfigurationMismatch &&
 
 5369          ParseHeaderSearchPaths(
Record, Complain, *Listener))
 
 5370        Result = ConfigurationMismatch;
 
 5399  if (
Record.size() < 4) 
return true;
 
 5404  unsigned BlockNameLen = 
Record[2];
 
 5405  unsigned UserInfoLen = 
Record[3];
 
 5407  if (BlockNameLen + UserInfoLen > Blob.size()) 
return true;
 
 5409  Metadata.
BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen);
 
 5410  Metadata.
UserInfo = std::string(Blob.data() + BlockNameLen,
 
 5411                                  Blob.data() + BlockNameLen + UserInfoLen);
 
 
 5415llvm::Error ASTReader::ReadExtensionBlock(
ModuleFile &F) {
 
 5416  BitstreamCursor &Stream = F.
Stream;
 
 5420    Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
 
 5422      return MaybeEntry.takeError();
 
 5423    llvm::BitstreamEntry Entry = MaybeEntry.get();
 
 5425    switch (Entry.Kind) {
 
 5426    case llvm::BitstreamEntry::SubBlock:
 
 5427      if (llvm::Error Err = Stream.SkipBlock())
 
 5430    case llvm::BitstreamEntry::EndBlock:
 
 5431      return llvm::Error::success();
 
 5432    case llvm::BitstreamEntry::Error:
 
 5433      return llvm::createStringError(std::errc::illegal_byte_sequence,
 
 5434                                     "malformed block record in AST file");
 
 5435    case llvm::BitstreamEntry::Record:
 
 5441    Expected<unsigned> MaybeRecCode =
 
 5442        Stream.readRecord(Entry.ID, 
Record, &Blob);
 
 5444      return MaybeRecCode.takeError();
 
 5445    switch (MaybeRecCode.get()) {
 
 5447      ModuleFileExtensionMetadata Metadata;
 
 5449        return llvm::createStringError(
 
 5450            std::errc::illegal_byte_sequence,
 
 5451            "malformed EXTENSION_METADATA in AST file");
 
 5454      auto Known = ModuleFileExtensions.find(Metadata.
BlockName);
 
 5455      if (Known == ModuleFileExtensions.end()) 
break;
 
 5458      if (
auto Reader = Known->second->createExtensionReader(Metadata, *
this,
 
 5468  llvm_unreachable(
"ReadExtensionBlock should return from while loop");
 
 5472  assert(ContextObj && 
"no context to initialize");
 
 5476  if (DeserializationListener)
 
 5477    DeserializationListener->DeclRead(
 
 5479        Context.getTranslationUnitDecl());
 
 5487      if (!Context.CFConstantStringTypeDecl)
 
 5488        Context.setCFConstantStringType(
GetType(String));
 
 5493      if (FileType.isNull()) {
 
 5494        Error(
"FILE type is NULL");
 
 5498      if (!Context.FILEDecl) {
 
 5500          Context.setFILEDecl(
Typedef->getDecl());
 
 5502          const TagType *Tag = FileType->getAs<TagType>();
 
 5504            Error(
"Invalid FILE type in AST file");
 
 5507          Context.setFILEDecl(Tag->getDecl());
 
 5514      if (Jmp_bufType.
isNull()) {
 
 5515        Error(
"jmp_buf type is NULL");
 
 5519      if (!Context.jmp_bufDecl) {
 
 5521          Context.setjmp_bufDecl(
Typedef->getDecl());
 
 5523          const TagType *Tag = Jmp_bufType->
getAs<TagType>();
 
 5525            Error(
"Invalid jmp_buf type in AST file");
 
 5528          Context.setjmp_bufDecl(Tag->getDecl());
 
 5535      if (Sigjmp_bufType.
isNull()) {
 
 5536        Error(
"sigjmp_buf type is NULL");
 
 5540      if (!Context.sigjmp_bufDecl) {
 
 5542          Context.setsigjmp_bufDecl(
Typedef->getDecl());
 
 5544          const TagType *Tag = Sigjmp_bufType->
getAs<TagType>();
 
 5545          assert(Tag && 
"Invalid sigjmp_buf type in AST file");
 
 5546          Context.setsigjmp_bufDecl(Tag->getDecl());
 
 5552      if (Context.ObjCIdRedefinitionType.isNull())
 
 5553        Context.ObjCIdRedefinitionType = 
GetType(ObjCIdRedef);
 
 5556    if (
TypeID ObjCClassRedef =
 
 5558      if (Context.ObjCClassRedefinitionType.isNull())
 
 5559        Context.ObjCClassRedefinitionType = 
GetType(ObjCClassRedef);
 
 5562    if (
TypeID ObjCSelRedef =
 
 5564      if (Context.ObjCSelRedefinitionType.isNull())
 
 5565        Context.ObjCSelRedefinitionType = 
GetType(ObjCSelRedef);
 
 5570      if (Ucontext_tType.
isNull()) {
 
 5571        Error(
"ucontext_t type is NULL");
 
 5575      if (!Context.ucontext_tDecl) {
 
 5577          Context.setucontext_tDecl(
Typedef->getDecl());
 
 5579          const TagType *Tag = Ucontext_tType->
getAs<TagType>();
 
 5580          assert(Tag && 
"Invalid ucontext_t type in AST file");
 
 5581          Context.setucontext_tDecl(Tag->getDecl());
 
 5590  if (!CUDASpecialDeclRefs.empty()) {
 
 5591    assert(CUDASpecialDeclRefs.size() == 1 && 
"More decl refs than expected!");
 
 5592    Context.setcudaConfigureCallDecl(
 
 5598  for (
auto &Import : PendingImportedModules) {
 
 5602      if (Import.ImportLoc.isValid())
 
 5603        PP.makeModuleVisible(Imported, Import.ImportLoc);
 
 5610  PendingImportedModulesSema.append(PendingImportedModules);
 
 5611  PendingImportedModules.clear();
 
 
 5621  BitstreamCursor Stream(
PCH);
 
 5624    consumeError(std::move(Err));
 
 5636        Stream.advanceSkippingSubblocks();
 
 5639      consumeError(MaybeEntry.takeError());
 
 5642    llvm::BitstreamEntry Entry = MaybeEntry.get();
 
 5644    if (Entry.Kind != llvm::BitstreamEntry::Record)
 
 5652      consumeError(MaybeRecord.takeError());
 
 5658             "Dummy AST file signature not backpatched in ASTWriter.");
 
 
 5668    const std::string &ASTFileName, 
FileManager &FileMgr,
 
 5671  auto Buffer = FileMgr.getBufferForFile(ASTFileName, 
false,
 
 5676    Diags.Report(diag::err_fe_unable_to_read_pch_file)
 
 5677        << ASTFileName << Buffer.getError().message();
 
 5678    return std::string();
 
 5682  BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer));
 
 5686    Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err);
 
 5687    return std::string();
 
 5692    Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
 
 5693    return std::string();
 
 5700        Stream.advanceSkippingSubblocks();
 
 5703      consumeError(MaybeEntry.takeError());
 
 5704      return std::string();
 
 5706    llvm::BitstreamEntry Entry = MaybeEntry.get();
 
 5708    if (Entry.Kind == llvm::BitstreamEntry::EndBlock)
 
 5709      return std::string();
 
 5711    if (Entry.Kind != llvm::BitstreamEntry::Record) {
 
 5712      Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName;
 
 5713      return std::string();
 
 5721      consumeError(MaybeRecord.takeError());
 
 5722      return std::string();
 
 
 5736    std::string ExistingModuleCachePath;
 
 5738    bool StrictOptionMatches;
 
 5741    SimplePCHValidator(
const LangOptions &ExistingLangOpts,
 
 5746                       bool StrictOptionMatches)
 
 5747        : ExistingLangOpts(ExistingLangOpts), ExistingCGOpts(ExistingCGOpts),
 
 5748          ExistingTargetOpts(ExistingTargetOpts),
 
 5749          ExistingPPOpts(ExistingPPOpts),
 
 5750          ExistingModuleCachePath(ExistingModuleCachePath), 
FileMgr(
FileMgr),
 
 5751          StrictOptionMatches(StrictOptionMatches) {}
 
 5753    bool ReadLanguageOptions(
const LangOptions &LangOpts,
 
 5754                             StringRef ModuleFilename, 
bool Complain,
 
 5755                             bool AllowCompatibleDifferences)
 override {
 
 5757                                  nullptr, AllowCompatibleDifferences);
 
 5760    bool ReadCodeGenOptions(
const CodeGenOptions &CGOpts,
 
 5761                            StringRef ModuleFilename, 
bool Complain,
 
 5762                            bool AllowCompatibleDifferences)
 override {
 
 5764                                 nullptr, AllowCompatibleDifferences);
 
 5767    bool ReadTargetOptions(
const TargetOptions &TargetOpts,
 
 5768                           StringRef ModuleFilename, 
bool Complain,
 
 5769                           bool AllowCompatibleDifferences)
 override {
 
 5771                                nullptr, AllowCompatibleDifferences);
 
 5774    bool ReadHeaderSearchOptions(
const HeaderSearchOptions &HSOpts,
 
 5775                                 StringRef ModuleFilename,
 
 5776                                 StringRef SpecificModuleCachePath,
 
 5777                                 bool Complain)
 override {
 
 5779                                  SpecificModuleCachePath,
 
 5780                                  ExistingModuleCachePath, ModuleFilename,
 
 5781                                  nullptr, ExistingLangOpts, ExistingPPOpts);
 
 5784    bool ReadPreprocessorOptions(
const PreprocessorOptions &PPOpts,
 
 5785                                 StringRef ModuleFilename, 
bool ReadMacros,
 
 5787                                 std::string &SuggestedPredefines)
 override {
 
 5789          PPOpts, ExistingPPOpts, ModuleFilename, ReadMacros, 
nullptr,
 
 5790          FileMgr, SuggestedPredefines, ExistingLangOpts,
 
 5802    unsigned ClientLoadCapabilities) {
 
 5804  std::unique_ptr<llvm::MemoryBuffer> OwnedBuffer;
 
 5805  llvm::MemoryBuffer *Buffer =
 
 5815        Filename == 
"-" ? FileMgr.getSTDIN() : FileMgr.getFileRef(Filename);
 
 5817      llvm::consumeError(Entry.takeError());
 
 5820    auto BufferOrErr = FileMgr.getBufferForFile(*Entry);
 
 5823    OwnedBuffer = std::move(*BufferOrErr);
 
 5824    Buffer = OwnedBuffer.get();
 
 5828  StringRef Bytes = PCHContainerRdr.ExtractPCH(*Buffer);
 
 5829  BitstreamCursor Stream(Bytes);
 
 5833    consumeError(std::move(Err)); 
 
 5841  bool NeedsInputFiles = Listener.needsInputFileVisitation();
 
 5842  bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation();
 
 5843  bool NeedsImports = Listener.needsImportVisitation();
 
 5844  BitstreamCursor InputFilesCursor;
 
 5845  uint64_t InputFilesOffsetBase = 0;
 
 5848  std::string ModuleDir;
 
 5849  bool DoneWithControlBlock = 
false;
 
 5851  PathBuf.reserve(256);
 
 5856  AdditionalPathBuf.reserve(256);
 
 5857  while (!DoneWithControlBlock) {
 
 5861      consumeError(MaybeEntry.takeError());
 
 5864    llvm::BitstreamEntry Entry = MaybeEntry.get();
 
 5866    switch (Entry.Kind) {
 
 5867    case llvm::BitstreamEntry::SubBlock: {
 
 5870        std::string IgnoredSuggestedPredefines;
 
 5871        if (ReadOptionsBlock(Stream, Filename, ClientLoadCapabilities,
 
 5873                             Listener, IgnoredSuggestedPredefines) != 
Success)
 
 5879        InputFilesCursor = Stream;
 
 5880        if (llvm::Error Err = Stream.SkipBlock()) {
 
 5882          consumeError(std::move(Err));
 
 5885        if (NeedsInputFiles &&
 
 5888        InputFilesOffsetBase = InputFilesCursor.GetCurrentBitNo();
 
 5892        if (llvm::Error Err = Stream.SkipBlock()) {
 
 5894          consumeError(std::move(Err));
 
 5903    case llvm::BitstreamEntry::EndBlock:
 
 5904      DoneWithControlBlock = 
true;
 
 5907    case llvm::BitstreamEntry::Error:
 
 5910    case llvm::BitstreamEntry::Record:
 
 5914    if (DoneWithControlBlock) 
break;
 
 5919        Stream.readRecord(Entry.ID, 
Record, &Blob);
 
 5920    if (!MaybeRecCode) {
 
 5928      if (Listener.ReadFullVersionInformation(Blob))
 
 5932      Listener.ReadModuleName(Blob);
 
 5935      ModuleDir = std::string(Blob);
 
 5941      Listener.ReadModuleMapFile(*Path);
 
 5945      if (!NeedsInputFiles)
 
 5948      unsigned NumInputFiles = 
Record[0];
 
 5949      unsigned NumUserFiles = 
Record[1];
 
 5950      const llvm::support::unaligned_uint64_t *InputFileOffs =
 
 5951          (
const llvm::support::unaligned_uint64_t *)Blob.data();
 
 5952      for (
unsigned I = 0; I != NumInputFiles; ++I) {
 
 5954        bool isSystemFile = I >= NumUserFiles;
 
 5956        if (isSystemFile && !NeedsSystemInputFiles)
 
 5959        BitstreamCursor &Cursor = InputFilesCursor;
 
 5961        if (llvm::Error Err =
 
 5962                Cursor.JumpToBit(InputFilesOffsetBase + InputFileOffs[I])) {
 
 5964          consumeError(std::move(Err));
 
 5970          consumeError(MaybeCode.takeError());
 
 5972        unsigned Code = MaybeCode.get();
 
 5976        bool shouldContinue = 
false;
 
 5978            Cursor.readRecord(Code, 
Record, &Blob);
 
 5979        if (!MaybeRecordType) {
 
 5981          consumeError(MaybeRecordType.takeError());
 
 5987          bool Overridden = 
static_cast<bool>(
Record[3]);
 
 5988          auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
 
 5991              PathBuf, UnresolvedFilenameAsRequested, ModuleDir);
 
 5993          if (UnresolvedFilename.empty())
 
 5994            Filename = *FilenameAsRequestedBuf;
 
 5997                AdditionalPathBuf, UnresolvedFilename, ModuleDir);
 
 5998            Filename = *FilenameBuf;
 
 6000          shouldContinue = Listener.visitInputFileAsRequested(
 
 6001              *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
 
 6005        if (!shouldContinue)
 
 6026      bool IsStandardCXXModule = 
Record[Idx++];
 
 6030      if (IsStandardCXXModule) {
 
 6031        Listener.visitImport(ModuleName, 
"");
 
 6042      Listener.visitImport(ModuleName, *Filename);
 
 6053  if (FindModuleFileExtensions) {
 
 6054    BitstreamCursor SavedStream = Stream;
 
 6056      bool DoneWithExtensionBlock = 
false;
 
 6057      while (!DoneWithExtensionBlock) {
 
 6063        llvm::BitstreamEntry Entry = MaybeEntry.get();
 
 6065        switch (Entry.Kind) {
 
 6066        case llvm::BitstreamEntry::SubBlock:
 
 6067          if (llvm::Error Err = Stream.SkipBlock()) {
 
 6069            consumeError(std::move(Err));
 
 6074        case llvm::BitstreamEntry::EndBlock:
 
 6075          DoneWithExtensionBlock = 
true;
 
 6078        case llvm::BitstreamEntry::Error:
 
 6081        case llvm::BitstreamEntry::Record:
 
 6088           Stream.readRecord(Entry.ID, 
Record, &Blob);
 
 6089       if (!MaybeRecCode) {
 
 6093       switch (MaybeRecCode.get()) {
 
 6099         Listener.readModuleFileExtension(Metadata);
 
 6105    Stream = std::move(SavedStream);
 
 6109  if (readUnhashedControlBlockImpl(
 
 6110          nullptr, Bytes, Filename, ClientLoadCapabilities,
 
 6112          ValidateDiagnosticOptions) != 
Success)
 
 
 6123    bool RequireStrictOptionMatches) {
 
 6124  SimplePCHValidator validator(LangOpts, CGOpts, TargetOpts, PPOpts,
 
 6125                               ExistingModuleCachePath, FileMgr,
 
 6126                               RequireStrictOptionMatches);
 
 
 6132llvm::Error ASTReader::ReadSubmoduleBlock(
ModuleFile &F,
 
 6133                                          unsigned ClientLoadCapabilities) {
 
 6138  ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap();
 
 6143  auto CreateModule = !KnowsTopLevelModule
 
 6148  Module *CurrentModule = 
nullptr;
 
 6152        F.
Stream.advanceSkippingSubblocks();
 
 6154      return MaybeEntry.takeError();
 
 6155    llvm::BitstreamEntry Entry = MaybeEntry.get();
 
 6157    switch (Entry.Kind) {
 
 6158    case llvm::BitstreamEntry::SubBlock: 
 
 6159    case llvm::BitstreamEntry::Error:
 
 6160      return llvm::createStringError(std::errc::illegal_byte_sequence,
 
 6161                                     "malformed block record in AST file");
 
 6162    case llvm::BitstreamEntry::EndBlock:
 
 6163      return llvm::Error::success();
 
 6164    case llvm::BitstreamEntry::Record:
 
 6174      return MaybeKind.takeError();
 
 6175    unsigned Kind = MaybeKind.get();
 
 6178      return llvm::createStringError(
 
 6179          std::errc::illegal_byte_sequence,
 
 6180          "submodule metadata record should be at beginning of block");
 
 6195        return llvm::createStringError(std::errc::illegal_byte_sequence,
 
 6196                                       "malformed module definition");
 
 6198      StringRef Name = Blob;
 
 6205      bool IsFramework = 
Record[Idx++];
 
 6206      bool IsExplicit = 
Record[Idx++];
 
 6207      bool IsSystem = 
Record[Idx++];
 
 6208      bool IsExternC = 
Record[Idx++];
 
 6209      bool InferSubmodules = 
Record[Idx++];
 
 6210      bool InferExplicitSubmodules = 
Record[Idx++];
 
 6211      bool InferExportWildcard = 
Record[Idx++];
 
 6212      bool ConfigMacrosExhaustive = 
Record[Idx++];
 
 6213      bool ModuleMapIsPrivate = 
Record[Idx++];
 
 6214      bool NamedModuleHasInit = 
Record[Idx++];
 
 6216      Module *ParentModule = 
nullptr;
 
 6218        ParentModule = getSubmodule(Parent);
 
 6220      CurrentModule = std::invoke(CreateModule, &ModMap, Name, ParentModule,
 
 6221                                  IsFramework, IsExplicit);
 
 6224      if (GlobalIndex >= SubmodulesLoaded.size() ||
 
 6225          SubmodulesLoaded[GlobalIndex])
 
 6226        return llvm::createStringError(std::errc::invalid_argument,
 
 6227                                       "too many submodules");
 
 6229      if (!ParentModule) {
 
 6232          if (!
bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
 
 6234            assert(CurFile != F.
File && 
"ModuleManager did not de-duplicate");
 
 6236            Diag(diag::err_module_file_conflict)
 
 6240            auto CurModMapFile =
 
 6243            if (CurModMapFile && ModMapFile && CurModMapFile != ModMapFile)
 
 6244              Diag(diag::note_module_file_conflict)
 
 6245                  << CurModMapFile->getName() << ModMapFile->getName();
 
 6247            return llvm::make_error<AlreadyReportedDiagnosticError>();
 
 6266      if (InferredAllowedBy.
isValid())
 
 6276      if (DeserializationListener)
 
 6277        DeserializationListener->ModuleRead(GlobalID, CurrentModule);
 
 6279      SubmodulesLoaded[GlobalIndex] = CurrentModule;
 
 6304      auto Filename = ResolveImportedPath(PathBuf, Blob, F);
 
 6305      if (
auto Umbrella = PP.getFileManager().getOptionalFileRef(*Filename)) {
 
 6333      auto HeaderName = ResolveImportedPath(PathBuf, Blob, F);
 
 6340      auto Dirname = ResolveImportedPath(PathBuf, Blob, F);
 
 6342              PP.getFileManager().getOptionalDirectoryRef(*Dirname)) {
 
 6354      unsigned LocalBaseSubmoduleID = 
Record[1];
 
 6358        GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F));
 
 6363          std::make_pair(LocalBaseSubmoduleID,
 
 6372      for (
unsigned Idx = 0; Idx != 
Record.size(); ++Idx) {
 
 6384      for (
unsigned Idx = 0; Idx != 
Record.size(); ++Idx) {
 
 6396      for (
unsigned Idx = 0; Idx + 1 < 
Record.size(); Idx += 2) {
 
 6413                                    PP.getTargetInfo());
 
 6419          Module::LinkLibrary(std::string(Blob), 
Record[0]));
 
 6441      SmallVector<GlobalDeclID, 16> Inits;
 
 6442      for (
unsigned I = 0; I < 
Record.size(); )
 
 6443        Inits.push_back(ReadDeclID(F, 
Record, I));
 
 6444      ContextObj->addLazyModuleInitializers(CurrentModule, Inits);
 
 6463bool ASTReader::ParseLanguageOptions(
const RecordData &
Record,
 
 6464                                     StringRef ModuleFilename, 
bool Complain,
 
 6465                                     ASTReaderListener &Listener,
 
 6466                                     bool AllowCompatibleDifferences) {
 
 6467  LangOptions LangOpts;
 
 6469#define LANGOPT(Name, Bits, Default, Compatibility, Description)               \ 
 6470  LangOpts.Name = Record[Idx++]; 
 6471#define ENUM_LANGOPT(Name, Type, Bits, Default, Compatibility, Description)    \ 
 6472  LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 
 6473#include "clang/Basic/LangOptions.def" 
 6474#define SANITIZER(NAME, ID)                                                    \ 
 6475  LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]); 
 6476#include "clang/Basic/Sanitizers.def" 
 6478  for (
unsigned N = 
Record[Idx++]; N; --N)
 
 6482  VersionTuple runtimeVersion = ReadVersionTuple(
Record, Idx);
 
 6483  LangOpts.
ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion);
 
 6488  for (
unsigned N = 
Record[Idx++]; N; --N) {
 
 6490      ReadString(
Record, Idx));
 
 6495  for (
unsigned N = 
Record[Idx++]; N; --N) {
 
 6502                                      AllowCompatibleDifferences);
 
 6505bool ASTReader::ParseCodeGenOptions(
const RecordData &
Record,
 
 6506                                    StringRef ModuleFilename, 
bool Complain,
 
 6507                                    ASTReaderListener &Listener,
 
 6508                                    bool AllowCompatibleDifferences) {
 
 6510  CodeGenOptions CGOpts;
 
 6512#define CODEGENOPT(Name, Bits, Default, Compatibility)                         \ 
 6513  if constexpr (CK::Compatibility != CK::Benign)                               \ 
 6514    CGOpts.Name = static_cast<unsigned>(Record[Idx++]); 
 6515#define ENUM_CODEGENOPT(Name, Type, Bits, Default, Compatibility)              \ 
 6516  if constexpr (CK::Compatibility != CK::Benign)                               \ 
 6517    CGOpts.set##Name(static_cast<clang::CodeGenOptions::Type>(Record[Idx++])); 
 6518#define DEBUGOPT(Name, Bits, Default, Compatibility) 
 6519#define VALUE_DEBUGOPT(Name, Bits, Default, Compatibility) 
 6520#define ENUM_DEBUGOPT(Name, Type, Bits, Default, Compatibility) 
 6521#include "clang/Basic/CodeGenOptions.def" 
 6524                                     AllowCompatibleDifferences);
 
 6527bool ASTReader::ParseTargetOptions(
const RecordData &
Record,
 
 6528                                   StringRef ModuleFilename, 
bool Complain,
 
 6529                                   ASTReaderListener &Listener,
 
 6530                                   bool AllowCompatibleDifferences) {
 
 6532  TargetOptions TargetOpts;
 
 6534  TargetOpts.
CPU = ReadString(
Record, Idx);
 
 6536  TargetOpts.
ABI = ReadString(
Record, Idx);
 
 6537  for (
unsigned N = 
Record[Idx++]; N; --N) {
 
 6540  for (
unsigned N = 
Record[Idx++]; N; --N) {
 
 6545                                    AllowCompatibleDifferences);
 
 6548bool ASTReader::ParseDiagnosticOptions(
const RecordData &
Record,
 
 6549                                       StringRef ModuleFilename, 
bool Complain,
 
 6550                                       ASTReaderListener &Listener) {
 
 6551  DiagnosticOptions DiagOpts;
 
 6553#define DIAGOPT(Name, Bits, Default) DiagOpts.Name = Record[Idx++]; 
 6554#define ENUM_DIAGOPT(Name, Type, Bits, Default)                                \ 
 6555  DiagOpts.set##Name(static_cast<Type>(Record[Idx++])); 
 6556#include "clang/Basic/DiagnosticOptions.def" 
 6558  for (
unsigned N = 
Record[Idx++]; N; --N)
 
 6560  for (
unsigned N = 
Record[Idx++]; N; --N)
 
 6566bool ASTReader::ParseFileSystemOptions(
const RecordData &
Record, 
bool Complain,
 
 6567                                       ASTReaderListener &Listener) {
 
 6568  FileSystemOptions FSOpts;
 
 6574bool ASTReader::ParseHeaderSearchOptions(
const RecordData &
Record,
 
 6575                                         StringRef ModuleFilename,
 
 6577                                         ASTReaderListener &Listener) {
 
 6578  HeaderSearchOptions HSOpts;
 
 6593  std::string SpecificModuleCachePath = ReadString(
Record, Idx);
 
 6596                                          SpecificModuleCachePath, Complain);
 
 6599bool ASTReader::ParseHeaderSearchPaths(
const RecordData &
Record, 
bool Complain,
 
 6600                                       ASTReaderListener &Listener) {
 
 6601  HeaderSearchOptions HSOpts;
 
 6605  for (
unsigned N = 
Record[Idx++]; N; --N) {
 
 6606    std::string Path = ReadString(
Record, Idx);
 
 6609    bool IsFramework = 
Record[Idx++];
 
 6610    bool IgnoreSysRoot = 
Record[Idx++];
 
 6611    HSOpts.
UserEntries.emplace_back(std::move(Path), Group, IsFramework,
 
 6616  for (
unsigned N = 
Record[Idx++]; N; --N) {
 
 6617    std::string Prefix = ReadString(
Record, Idx);
 
 6618    bool IsSystemHeader = 
Record[Idx++];
 
 6623  for (
unsigned N = 
Record[Idx++]; N; --N) {
 
 6624    std::string VFSOverlayFile = ReadString(
Record, Idx);
 
 6631bool ASTReader::ParsePreprocessorOptions(
const RecordData &
Record,
 
 6632                                         StringRef ModuleFilename,
 
 6634                                         ASTReaderListener &Listener,
 
 6635                                         std::string &SuggestedPredefines) {
 
 6636  PreprocessorOptions PPOpts;
 
 6640  bool ReadMacros = 
Record[Idx++];
 
 6642    for (
unsigned N = 
Record[Idx++]; N; --N) {
 
 6644      bool IsUndef = 
Record[Idx++];
 
 6645      PPOpts.
Macros.push_back(std::make_pair(
Macro, IsUndef));
 
 6650  for (
unsigned N = 
Record[Idx++]; N; --N) {
 
 6655  for (
unsigned N = 
Record[Idx++]; N; --N) {
 
 6664  SuggestedPredefines.clear();
 
 6666                                          Complain, SuggestedPredefines);
 
 6669std::pair<ModuleFile *, unsigned>
 
 6670ASTReader::getModulePreprocessedEntity(
unsigned GlobalIndex) {
 
 6671  GlobalPreprocessedEntityMapType::iterator
 
 6672  I = GlobalPreprocessedEntityMap.find(GlobalIndex);
 
 6673  assert(I != GlobalPreprocessedEntityMap.end() &&
 
 6674         "Corrupted global preprocessed entity map");
 
 6677  return std::make_pair(M, LocalIndex);
 
 6680llvm::iterator_range<PreprocessingRecord::iterator>
 
 6681ASTReader::getModulePreprocessedEntities(
ModuleFile &Mod)
 const {
 
 6682  if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord())
 
 6686  return llvm::make_range(PreprocessingRecord::iterator(),
 
 6687                          PreprocessingRecord::iterator());
 
 6690bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName,
 
 6691                                        unsigned int ClientLoadCapabilities) {
 
 6692  return ClientLoadCapabilities & ARR_OutOfDate &&
 
 6695              .getInMemoryModuleCache()
 
 6696              .isPCMFinal(ModuleFileName);
 
 6699llvm::iterator_range<ASTReader::ModuleDeclIterator>
 
 6701  return llvm::make_range(
 
 
 6708  auto I = GlobalSkippedRangeMap.find(GlobalIndex);
 
 6709  assert(I != GlobalSkippedRangeMap.end() &&
 
 6710    "Corrupted global skipped range map");
 
 6713  assert(LocalIndex < M->NumPreprocessedSkippedRanges);
 
 6717  assert(Range.isValid());
 
 
 6723  std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
 
 6725  unsigned LocalIndex = PPInfo.second;
 
 6728  if (!PP.getPreprocessingRecord()) {
 
 6729    Error(
"no preprocessing record");
 
 6736    Error(std::move(Err));
 
 6743    Error(MaybeEntry.takeError());
 
 6746  llvm::BitstreamEntry Entry = MaybeEntry.get();
 
 6748  if (Entry.Kind != llvm::BitstreamEntry::Record)
 
 6759  if (!MaybeRecType) {
 
 6760    Error(MaybeRecType.takeError());
 
 6765    bool isBuiltin = 
Record[0];
 
 6774          PPRec.getLoadedPreprocessedEntity(GlobalID - 1));
 
 6792    if (DeserializationListener)
 
 6793      DeserializationListener->MacroDefinitionRead(PPID, MD);
 
 6799    const char *FullFileNameStart = Blob.data() + 
Record[0];
 
 6800    StringRef FullFileName(FullFileNameStart, Blob.size() - 
Record[0]);
 
 6802    if (!FullFileName.empty())
 
 6803      File = PP.getFileManager().getOptionalFileRef(FullFileName);
 
 6810                                       StringRef(Blob.data(), 
Record[0]),
 
 6818  llvm_unreachable(
"Invalid PreprocessorDetailRecordTypes");
 
 
 6828                       GlobalSLocOffsetMapType::const_iterator SLocMapI)
 const {
 
 6830  for (GlobalSLocOffsetMapType::const_iterator
 
 6831         EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) {
 
 6837  return getTotalNumPreprocessedEntities();
 
 6842struct PPEntityComp {
 
 6843  const ASTReader &Reader;
 
 6846  PPEntityComp(
const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {}
 
 6848  bool operator()(
const PPEntityOffset &L, 
const PPEntityOffset &R)
 const {
 
 6849    SourceLocation LHS = getLoc(L);
 
 6850    SourceLocation RHS = getLoc(R);
 
 6854  bool operator()(
const PPEntityOffset &L, SourceLocation RHS)
 const {
 
 6855    SourceLocation LHS = getLoc(L);
 
 6859  bool operator()(SourceLocation LHS, 
const PPEntityOffset &R)
 const {
 
 6860    SourceLocation RHS = getLoc(R);
 
 6864  SourceLocation getLoc(
const PPEntityOffset &PPE)
 const {
 
 6872                                                       bool EndsAfter)
 const {
 
 6873  if (SourceMgr.isLocalSourceLocation(Loc))
 
 6874    return getTotalNumPreprocessedEntities();
 
 6876  GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find(
 
 6877      SourceManager::MaxLoadedOffset - Loc.getOffset() - 1);
 
 6878  assert(SLocMapI != GlobalSLocOffsetMap.end() &&
 
 6879         "Corrupted global sloc offset map");
 
 6881  if (SLocMapI->second->NumPreprocessedEntities == 0)
 
 6882    return findNextPreprocessedEntity(SLocMapI);
 
 6893  pp_iterator 
First = pp_begin;
 
 6897    PPI = std::upper_bound(pp_begin, pp_end, Loc,
 
 6898                           PPEntityComp(*
this, M));
 
 6907      std::advance(PPI, 
Half);
 
 6908      if (SourceMgr.isBeforeInTranslationUnit(
 
 6909              ReadSourceLocation(M, PPI->getEnd()), Loc)) {
 
 6912        Count = Count - 
Half - 1;
 
 6919    return findNextPreprocessedEntity(SLocMapI);
 
 6926std::pair<unsigned, unsigned>
 
 6928  if (Range.isInvalid())
 
 6929    return std::make_pair(0,0);
 
 6930  assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin()));
 
 6933      findPreprocessedEntity(Range.getBegin(), 
false);
 
 6935  return std::make_pair(BeginID, EndID);
 
 
 6945  std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index);
 
 6947  unsigned LocalIndex = PPInfo.second;
 
 6954  if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID))
 
 
 6963  class HeaderFileInfoVisitor {
 
 6965    std::optional<HeaderFileInfo> HFI;
 
 6968    explicit HeaderFileInfoVisitor(
FileEntryRef FE) : FE(FE) {}
 
 6977      HeaderFileInfoLookupTable::iterator Pos = Table->find(FE);
 
 6978      if (Pos == Table->end())
 
 6985    std::optional<HeaderFileInfo> getHeaderFileInfo()
 const { 
return HFI; }
 
 6991  HeaderFileInfoVisitor Visitor(FE);
 
 6992  ModuleMgr.visit(Visitor);
 
 6993  if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo())
 
 
 7000  using DiagState = DiagnosticsEngine::DiagState;
 
 7011    auto ReadDiagState = [&](
const DiagState &BasedOn,
 
 7012                             bool IncludeNonPragmaStates) {
 
 7013      unsigned BackrefID = 
Record[Idx++];
 
 7015        return DiagStates[BackrefID - 1];
 
 7018      Diag.DiagStates.push_back(BasedOn);
 
 7019      DiagState *NewState = &
Diag.DiagStates.back();
 
 7020      DiagStates.push_back(NewState);
 
 7021      unsigned Size = 
Record[Idx++];
 
 7022      assert(Idx + Size * 2 <= 
Record.size() &&
 
 7023             "Invalid data, not enough diag/map pairs");
 
 7025        unsigned DiagID = 
Record[Idx++];
 
 7028        if (!NewMapping.
isPragma() && !IncludeNonPragmaStates)
 
 7041        Mapping = NewMapping;
 
 7047    DiagState *FirstState;
 
 7052      FirstState = 
Diag.DiagStatesByLoc.FirstDiagState;
 
 7053      DiagStates.push_back(FirstState);
 
 7057             "Invalid data, unexpected backref in initial state");
 
 7059      assert(Idx < 
Record.size() &&
 
 7060             "Invalid data, not enough state change pairs in initial state");
 
 7065      unsigned Flags = 
Record[Idx++];
 
 7066      DiagState Initial(*
Diag.getDiagnosticIDs());
 
 7067      Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1;
 
 7068      Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1;
 
 7069      Initial.WarningsAsErrors = Flags & 1; Flags >>= 1;
 
 7070      Initial.EnableAllWarnings = Flags & 1; Flags >>= 1;
 
 7071      Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1;
 
 7073      FirstState = ReadDiagState(Initial, 
true);
 
 7081          .StateTransitions.push_back({FirstState, 0});
 
 7086      FirstState = ReadDiagState(*
Diag.DiagStatesByLoc.CurDiagState, 
false);
 
 7090    unsigned NumLocations = 
Record[Idx++];
 
 7091    while (NumLocations--) {
 
 7092      assert(Idx < 
Record.size() &&
 
 7093             "Invalid data, missing pragma diagnostic states");
 
 7095      assert(FID.
isValid() && 
"invalid FileID for transition");
 
 7096      unsigned Transitions = 
Record[Idx++];
 
 7102      auto &F = 
Diag.DiagStatesByLoc.Files[FID];
 
 7103      F.StateTransitions.reserve(F.StateTransitions.size() + Transitions);
 
 7104      for (
unsigned I = 0; I != Transitions; ++I) {
 
 7105        unsigned Offset = 
Record[Idx++];
 
 7106        auto *State = ReadDiagState(*FirstState, 
false);
 
 7107        F.StateTransitions.push_back({State, Offset});
 
 7112    assert(Idx < 
Record.size() &&
 
 7113           "Invalid data, missing final pragma diagnostic state");
 
 7115    auto *CurState = ReadDiagState(*FirstState, 
false);
 
 7118      Diag.DiagStatesByLoc.CurDiagState = CurState;
 
 7119      Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc;
 
 7124      auto &
T = 
Diag.DiagStatesByLoc.Files[NullFile].StateTransitions;
 
 7126        T.push_back({CurState, 0});
 
 7128        T[0].State = CurState;
 
 
 7137ASTReader::RecordLocation ASTReader::TypeCursorForIndex(
TypeID ID) {
 
 7138  auto [M, Index] = translateTypeIDToIndex(ID);
 
 7145#define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \ 
 7146  case TYPE_##CODE_ID: return Type::CLASS_ID; 
 7147#include "clang/Serialization/TypeBitCodes.def" 
 7149    return std::nullopt;
 
 
 7159QualType ASTReader::readTypeRecord(
TypeID ID) {
 
 7160  assert(ContextObj && 
"reading type with no AST context");
 
 7161  ASTContext &Context = *ContextObj;
 
 7162  RecordLocation Loc = TypeCursorForIndex(ID);
 
 7163  BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
 
 7167  SavedStreamPosition SavedPosition(DeclsCursor);
 
 7169  ReadingKindTracker ReadingKind(Read_Type, *
this);
 
 7172  Deserializing AType(
this);
 
 7174  if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) {
 
 7175    Error(std::move(Err));
 
 7178  Expected<unsigned> RawCode = DeclsCursor.ReadCode();
 
 7180    Error(RawCode.takeError());
 
 7184  ASTRecordReader 
Record(*
this, *Loc.F);
 
 7185  Expected<unsigned> Code = 
Record.readRecord(DeclsCursor, RawCode.get());
 
 7187    Error(Code.takeError());
 
 7191    QualType baseType = 
Record.readQualType();
 
 7192    Qualifiers quals = 
Record.readQualifiers();
 
 7198    Error(
"Unexpected code for type");
 
 7202  serialization::AbstractTypeReader<ASTRecordReader> TypeReader(
Record);
 
 7203  return TypeReader.read(*maybeClass);
 
 7211  SourceLocation readSourceLocation() { 
return Reader.readSourceLocation(); }
 
 7212  SourceRange readSourceRange() { 
return Reader.readSourceRange(); }
 
 7215    return Reader.readTypeSourceInfo();
 
 7219    return Reader.readNestedNameSpecifierLoc();
 
 7223    return Reader.readAttr();
 
 7232#define ABSTRACT_TYPELOC(CLASS, PARENT) 
 7233#define TYPELOC(CLASS, PARENT) \ 
 7234  void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 
 
 7235#include "clang/AST/TypeLocNodes.def" 
 
 7244void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
 
 7248void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
 
 7258void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) {
 
 7262void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) {
 
 7266void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
 
 7270void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
 
 7274void TypeLocReader::VisitArrayParameterTypeLoc(ArrayParameterTypeLoc TL) {
 
 7278void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) {
 
 7282void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
 
 7286void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
 
 7290void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
 
 7294void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
 
 7302  if (Reader.readBool())
 
 
 7309  VisitArrayTypeLoc(TL);
 
 7313  VisitArrayTypeLoc(TL);
 
 7316void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) {
 
 7317  VisitArrayTypeLoc(TL);
 
 7320void TypeLocReader::VisitDependentSizedArrayTypeLoc(
 
 7321                                            DependentSizedArrayTypeLoc TL) {
 
 7322  VisitArrayTypeLoc(TL);
 
 7325void TypeLocReader::VisitDependentAddressSpaceTypeLoc(
 
 7326    DependentAddressSpaceTypeLoc TL) {
 
 7333void TypeLocReader::VisitDependentSizedExtVectorTypeLoc(
 
 7334                                        DependentSizedExtVectorTypeLoc TL) {
 
 7338void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) {
 
 7342void TypeLocReader::VisitDependentVectorTypeLoc(
 
 7343    DependentVectorTypeLoc TL) {
 
 7347void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) {
 
 7351void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) {
 
 7358void TypeLocReader::VisitDependentSizedMatrixTypeLoc(
 
 7359    DependentSizedMatrixTypeLoc TL) {
 
 7372  for (
unsigned i = 0, e = TL.
getNumParams(); i != e; ++i) {
 
 
 7378  VisitFunctionTypeLoc(TL);
 
 7382  VisitFunctionTypeLoc(TL);
 
 7385void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
 
 7386  SourceLocation ElaboratedKeywordLoc = readSourceLocation();
 
 7387  NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
 
 7388  SourceLocation NameLoc = readSourceLocation();
 
 7389  TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
 
 7392void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) {
 
 7393  SourceLocation ElaboratedKeywordLoc = readSourceLocation();
 
 7394  NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
 
 7395  SourceLocation NameLoc = readSourceLocation();
 
 7396  TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
 
 7399void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
 
 7400  SourceLocation ElaboratedKeywordLoc = readSourceLocation();
 
 7401  NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
 
 7402  SourceLocation NameLoc = readSourceLocation();
 
 7403  TL.
set(ElaboratedKeywordLoc, QualifierLoc, NameLoc);
 
 7406void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
 
 7412void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
 
 7419void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
 
 7424void TypeLocReader::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) {
 
 7428void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
 
 7442      getContext(), NNS, TemplateKWLoc, ConceptNameLoc, FoundDecl, NamedConcept,
 
 
 7447void TypeLocReader::VisitAutoTypeLoc(
AutoTypeLoc TL) {
 
 7449  if (Reader.readBool())
 
 7451  if (Reader.readBool())
 
 7455void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
 
 7469  VisitTagTypeLoc(TL);
 
 7473  VisitTagTypeLoc(TL);
 
 7476void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { VisitTagTypeLoc(TL); }
 
 7478void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
 
 7482void TypeLocReader::VisitCountAttributedTypeLoc(CountAttributedTypeLoc TL) {
 
 7486void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) {
 
 7490void TypeLocReader::VisitHLSLAttributedResourceTypeLoc(
 
 7491    HLSLAttributedResourceTypeLoc TL) {
 
 7495void TypeLocReader::VisitHLSLInlineSpirvTypeLoc(HLSLInlineSpirvTypeLoc TL) {
 
 7499void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
 
 7503void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc(
 
 7504                                            SubstTemplateTypeParmTypeLoc TL) {
 
 7508void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc(
 
 7509                                          SubstTemplateTypeParmPackTypeLoc TL) {
 
 7513void TypeLocReader::VisitSubstBuiltinTemplatePackTypeLoc(
 
 7514    SubstBuiltinTemplatePackTypeLoc TL) {
 
 7518void TypeLocReader::VisitTemplateSpecializationTypeLoc(
 
 7519                                           TemplateSpecializationTypeLoc TL) {
 
 7520  SourceLocation ElaboratedKeywordLoc = readSourceLocation();
 
 7521  NestedNameSpecifierLoc QualifierLoc = ReadNestedNameSpecifierLoc();
 
 7522  SourceLocation TemplateKeywordLoc = readSourceLocation();
 
 7523  SourceLocation NameLoc = readSourceLocation();
 
 7524  SourceLocation LAngleLoc = readSourceLocation();
 
 7525  SourceLocation RAngleLoc = readSourceLocation();
 
 7526  TL.
set(ElaboratedKeywordLoc, QualifierLoc, TemplateKeywordLoc, NameLoc,
 
 7527         LAngleLoc, RAngleLoc);
 
 7528  MutableArrayRef<TemplateArgumentLocInfo> Args = TL.
getArgLocInfos();
 
 7529  for (
unsigned I = 0, E = TL.
getNumArgs(); I != E; ++I)
 
 7530    Args[I] = Reader.readTemplateArgumentLocInfo(
 
 7531        TL.
getTypePtr()->template_arguments()[I].getKind());
 
 7534void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) {
 
 7539void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
 
 7545void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
 
 7549void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
 
 7554void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) {
 
 7563void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
 
 7575void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
 
 7579void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
 
 7585void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) {
 
 7589void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) {
 
 7593void TypeLocReader::VisitDependentBitIntTypeLoc(
 
 7594    clang::DependentBitIntTypeLoc TL) {
 
 7598void TypeLocReader::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) {
 
 7632std::pair<ModuleFile *, unsigned>
 
 7635         "Predefined type shouldn't be in TypesLoaded");
 
 7637  assert(ModuleFileIndex && 
"Untranslated Local Decl?");
 
 7639  ModuleFile *OwningModuleFile = &getModuleManager()[ModuleFileIndex - 1];
 
 7640  assert(OwningModuleFile &&
 
 7641         "untranslated type ID or local type ID shouldn't be in TypesLoaded");
 
 7643  return {OwningModuleFile,
 
 7648  assert(ContextObj && 
"reading type with no AST context");
 
 7659      llvm_unreachable(
"Invalid predefined type");
 
 7675      T = Context.UnsignedCharTy;
 
 7678      T = Context.UnsignedShortTy;
 
 7681      T = Context.UnsignedIntTy;
 
 7684      T = Context.UnsignedLongTy;
 
 7687      T = Context.UnsignedLongLongTy;
 
 7690      T = Context.UnsignedInt128Ty;
 
 7693      T = Context.SignedCharTy;
 
 7696      T = Context.WCharTy;
 
 7699      T = Context.ShortTy;
 
 7708      T = Context.LongLongTy;
 
 7711      T = Context.Int128Ty;
 
 7714      T = Context.BFloat16Ty;
 
 7720      T = Context.FloatTy;
 
 7723      T = Context.DoubleTy;
 
 7726      T = Context.LongDoubleTy;
 
 7729      T = Context.ShortAccumTy;
 
 7732      T = Context.AccumTy;
 
 7735      T = Context.LongAccumTy;
 
 7738      T = Context.UnsignedShortAccumTy;
 
 7741      T = Context.UnsignedAccumTy;
 
 7744      T = Context.UnsignedLongAccumTy;
 
 7747      T = Context.ShortFractTy;
 
 7750      T = Context.FractTy;
 
 7753      T = Context.LongFractTy;
 
 7756      T = Context.UnsignedShortFractTy;
 
 7759      T = Context.UnsignedFractTy;
 
 7762      T = Context.UnsignedLongFractTy;
 
 7765      T = Context.SatShortAccumTy;
 
 7768      T = Context.SatAccumTy;
 
 7771      T = Context.SatLongAccumTy;
 
 7774      T = Context.SatUnsignedShortAccumTy;
 
 7777      T = Context.SatUnsignedAccumTy;
 
 7780      T = Context.SatUnsignedLongAccumTy;
 
 7783      T = Context.SatShortFractTy;
 
 7786      T = Context.SatFractTy;
 
 7789      T = Context.SatLongFractTy;
 
 7792      T = Context.SatUnsignedShortFractTy;
 
 7795      T = Context.SatUnsignedFractTy;
 
 7798      T = Context.SatUnsignedLongFractTy;
 
 7801      T = Context.Float16Ty;
 
 7804      T = Context.Float128Ty;
 
 7807      T = Context.Ibm128Ty;
 
 7810      T = Context.OverloadTy;
 
 7813      T = Context.UnresolvedTemplateTy;
 
 7816      T = Context.BoundMemberTy;
 
 7819      T = Context.PseudoObjectTy;
 
 7822      T = Context.DependentTy;
 
 7825      T = Context.UnknownAnyTy;
 
 7828      T = Context.NullPtrTy;
 
 7831      T = Context.Char8Ty;
 
 7834      T = Context.Char16Ty;
 
 7837      T = Context.Char32Ty;
 
 7840      T = Context.ObjCBuiltinIdTy;
 
 7843      T = Context.ObjCBuiltinClassTy;
 
 7846      T = Context.ObjCBuiltinSelTy;
 
 7848#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 
 7849    case PREDEF_TYPE_##Id##_ID: \ 
 7850      T = Context.SingletonId; \ 
 7852#include "clang/Basic/OpenCLImageTypes.def" 
 7853#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 
 7854    case PREDEF_TYPE_##Id##_ID: \ 
 7855      T = Context.Id##Ty; \ 
 7857#include "clang/Basic/OpenCLExtensionTypes.def" 
 7859      T = Context.OCLSamplerTy;
 
 7862      T = Context.OCLEventTy;
 
 7865      T = Context.OCLClkEventTy;
 
 7868      T = Context.OCLQueueTy;
 
 7871      T = Context.OCLReserveIDTy;
 
 7874      T = Context.getAutoDeductType();
 
 7877      T = Context.getAutoRRefDeductType();
 
 7880      T = Context.ARCUnbridgedCastTy;
 
 7883      T = Context.BuiltinFnTy;
 
 7886      T = Context.IncompleteMatrixIdxTy;
 
 7889      T = Context.ArraySectionTy;
 
 7892      T = Context.OMPArrayShapingTy;
 
 7895      T = Context.OMPIteratorTy;
 
 7897#define SVE_TYPE(Name, Id, SingletonId) \ 
 7898    case PREDEF_TYPE_##Id##_ID: \ 
 7899      T = Context.SingletonId; \ 
 7901#include "clang/Basic/AArch64ACLETypes.def" 
 7902#define PPC_VECTOR_TYPE(Name, Id, Size) \ 
 7903    case PREDEF_TYPE_##Id##_ID: \ 
 7904      T = Context.Id##Ty; \ 
 7906#include "clang/Basic/PPCTypes.def" 
 7907#define RVV_TYPE(Name, Id, SingletonId) \ 
 7908    case PREDEF_TYPE_##Id##_ID: \ 
 7909      T = Context.SingletonId; \ 
 7911#include "clang/Basic/RISCVVTypes.def" 
 7912#define WASM_TYPE(Name, Id, SingletonId)                                       \ 
 7913  case PREDEF_TYPE_##Id##_ID:                                                  \ 
 7914    T = Context.SingletonId;                                                   \ 
 7916#include "clang/Basic/WebAssemblyReferenceTypes.def" 
 7917#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align)                       \ 
 7918  case PREDEF_TYPE_##Id##_ID:                                                  \ 
 7919    T = Context.SingletonId;                                                   \ 
 7921#include "clang/Basic/AMDGPUTypes.def" 
 7922#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId)                            \ 
 7923  case PREDEF_TYPE_##Id##_ID:                                                  \ 
 7924    T = Context.SingletonId;                                                   \ 
 7926#include "clang/Basic/HLSLIntangibleTypes.def" 
 7929    assert(!
T.isNull() && 
"Unknown predefined type");
 
 7930    return T.withFastQualifiers(FastQuals);
 
 7933  unsigned Index = translateTypeIDToIndex(ID).second;
 
 7935  assert(Index < TypesLoaded.size() && 
"Type index out-of-range");
 
 7936  if (TypesLoaded[Index].isNull()) {
 
 7937    TypesLoaded[Index] = readTypeRecord(ID);
 
 7938    if (TypesLoaded[Index].isNull())
 
 7941    TypesLoaded[Index]->setFromAST();
 
 7942    if (DeserializationListener)
 
 7944                                        TypesLoaded[Index]);
 
 7947  return TypesLoaded[Index].withFastQualifiers(FastQuals);
 
 
 7960    ReadModuleOffsetMap(F);
 
 7963  LocalID &= llvm::maskTrailingOnes<TypeID>(32);
 
 7965  if (ModuleFileIndex == 0)
 
 7970  ModuleFileIndex = MF.
Index + 1;
 
 7971  return ((uint64_t)ModuleFileIndex << 32) | LocalID;
 
 
 7990                                   TemplateNameLoc, EllipsisLoc);
 
 8001  llvm_unreachable(
"unexpected template argument loc");
 
 
 8018  unsigned NumArgsAsWritten = 
readInt();
 
 8019  for (
unsigned i = 0; i != NumArgsAsWritten; ++i)
 
 
 8033  if (NumCurrentElementsDeserializing) {
 
 8038    PendingIncompleteDeclChains.push_back(
const_cast<Decl*
>(D));
 
 8061        auto *II = Name.getAsIdentifierInfo();
 
 8062        assert(II && 
"non-identifier name in C?");
 
 8063        if (II->isOutOfDate())
 
 8080  if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
 
 8081    Template = CTSD->getSpecializedTemplate();
 
 8082    Args = CTSD->getTemplateArgs().asArray();
 
 8083  } 
else if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
 
 8084    Template = VTSD->getSpecializedTemplate();
 
 8085    Args = VTSD->getTemplateArgs().asArray();
 
 8086  } 
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
 
 8087    if (
auto *Tmplt = FD->getPrimaryTemplate()) {
 
 8089      Args = FD->getTemplateSpecializationArgs()->asArray();
 
 8097      Template->loadLazySpecializationsImpl();
 
 8099      Template->loadLazySpecializationsImpl(Args);
 
 
 8105  RecordLocation Loc = getLocalBitOffset(Offset);
 
 8108  if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
 
 8109    Error(std::move(Err));
 
 8112  ReadingKindTracker ReadingKind(Read_Decl, *
this);
 
 8117    Error(MaybeCode.takeError());
 
 8120  unsigned Code = MaybeCode.get();
 
 8124  if (!MaybeRecCode) {
 
 8125    Error(MaybeRecCode.takeError());
 
 8129    Error(
"malformed AST file: missing C++ ctor initializers");
 
 8133  return Record.readCXXCtorInitializers();
 
 
 8137  assert(ContextObj && 
"reading base specifiers with no AST context");
 
 8140  RecordLocation Loc = getLocalBitOffset(Offset);
 
 8143  if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) {
 
 8144    Error(std::move(Err));
 
 8147  ReadingKindTracker ReadingKind(Read_Decl, *
this);
 
 8152    Error(MaybeCode.takeError());
 
 8155  unsigned Code = MaybeCode.get();
 
 8159  if (!MaybeRecCode) {
 
 8160    Error(MaybeCode.takeError());
 
 8163  unsigned RecCode = MaybeRecCode.get();
 
 8166    Error(
"malformed AST file: missing C++ base specifiers");
 
 8170  unsigned NumBases = 
Record.readInt();
 
 8173  for (
unsigned I = 0; I != NumBases; ++I)
 
 8174    Bases[I] = 
Record.readCXXBaseSpecifier();
 
 
 8187    ReadModuleOffsetMap(F);
 
 8190      OwningModuleFileIndex == 0
 
 8194  if (OwningModuleFileIndex == 0)
 
 8197  uint64_t NewModuleFileIndex = OwningModuleFile->
Index + 1;
 
 
 8206  unsigned ModuleFileIndex = ID.getModuleFileIndex();
 
 8207  return M.
Index == ModuleFileIndex - 1;
 
 
 8215  uint64_t ModuleFileIndex = ID.getModuleFileIndex();
 
 8216  assert(ModuleFileIndex && 
"Untranslated Local Decl?");
 
 
 8236  DeclCursorForID(ID, Loc);
 
 
 8241  assert(ContextObj && 
"reading predefined decl without AST context");
 
 8243  Decl *NewLoaded = 
nullptr;
 
 8249    return Context.getTranslationUnitDecl();
 
 8252    if (Context.ObjCIdDecl)
 
 8253      return Context.ObjCIdDecl;
 
 8254    NewLoaded = Context.getObjCIdDecl();
 
 8258    if (Context.ObjCSelDecl)
 
 8259      return Context.ObjCSelDecl;
 
 8260    NewLoaded = Context.getObjCSelDecl();
 
 8264    if (Context.ObjCClassDecl)
 
 8265      return Context.ObjCClassDecl;
 
 8266    NewLoaded = Context.getObjCClassDecl();
 
 8270    if (Context.ObjCProtocolClassDecl)
 
 8271      return Context.ObjCProtocolClassDecl;
 
 8272    NewLoaded = Context.getObjCProtocolDecl();
 
 8276    if (Context.Int128Decl)
 
 8277      return Context.Int128Decl;
 
 8278    NewLoaded = Context.getInt128Decl();
 
 8282    if (Context.UInt128Decl)
 
 8283      return Context.UInt128Decl;
 
 8284    NewLoaded = Context.getUInt128Decl();
 
 8288    if (Context.ObjCInstanceTypeDecl)
 
 8289      return Context.ObjCInstanceTypeDecl;
 
 8290    NewLoaded = Context.getObjCInstanceTypeDecl();
 
 8294    if (Context.BuiltinVaListDecl)
 
 8295      return Context.BuiltinVaListDecl;
 
 8296    NewLoaded = Context.getBuiltinVaListDecl();
 
 8300    if (Context.VaListTagDecl)
 
 8301      return Context.VaListTagDecl;
 
 8302    NewLoaded = Context.getVaListTagDecl();
 
 8306    if (Context.BuiltinMSVaListDecl)
 
 8307      return Context.BuiltinMSVaListDecl;
 
 8308    NewLoaded = Context.getBuiltinMSVaListDecl();
 
 8313    return Context.getMSGuidTagDecl();
 
 8316    if (Context.ExternCContext)
 
 8317      return Context.ExternCContext;
 
 8318    NewLoaded = Context.getExternCContextDecl();
 
 8322    if (Context.CFConstantStringTypeDecl)
 
 8323      return Context.CFConstantStringTypeDecl;
 
 8324    NewLoaded = Context.getCFConstantStringDecl();
 
 8328    if (Context.CFConstantStringTagDecl)
 
 8329      return Context.CFConstantStringTagDecl;
 
 8330    NewLoaded = Context.getCFConstantStringTagDecl();
 
 8334    return Context.getMSTypeInfoTagDecl();
 
 8336#define BuiltinTemplate(BTName)                                                \ 
 8337  case PREDEF_DECL##BTName##_ID:                                               \ 
 8338    if (Context.Decl##BTName)                                                  \ 
 8339      return Context.Decl##BTName;                                             \ 
 8340    NewLoaded = Context.get##BTName##Decl();                                   \ 
 8342#include "clang/Basic/BuiltinTemplates.inc" 
 8345    llvm_unreachable(
"Invalid decl ID");
 
 8349  assert(NewLoaded && 
"Failed to load predefined decl?");
 
 8351  if (DeserializationListener)
 
 8352    DeserializationListener->PredefinedDeclBuilt(ID, NewLoaded);
 
 8357unsigned ASTReader::translateGlobalDeclIDToIndex(GlobalDeclID GlobalID)
 const {
 
 8358  ModuleFile *OwningModuleFile = getOwningModuleFile(GlobalID);
 
 8359  if (!OwningModuleFile) {
 
 8368  assert(ContextObj && 
"reading decl with no AST context");
 
 8377        Merged.push_back(ID);
 
 8382  unsigned Index = translateGlobalDeclIDToIndex(ID);
 
 8384  if (Index >= DeclsLoaded.size()) {
 
 8385    assert(0 && 
"declaration ID out-of-range for AST file");
 
 8386    Error(
"declaration ID out-of-range for AST file");
 
 8390  return DeclsLoaded[Index];
 
 
 8397  unsigned Index = translateGlobalDeclIDToIndex(ID);
 
 8399  if (Index >= DeclsLoaded.size()) {
 
 8400    assert(0 && 
"declaration ID out-of-range for AST file");
 
 8401    Error(
"declaration ID out-of-range for AST file");
 
 8405  if (!DeclsLoaded[Index]) {
 
 8407    if (DeserializationListener)
 
 8408      DeserializationListener->DeclRead(ID, DeclsLoaded[Index]);
 
 8411  return DeclsLoaded[Index];
 
 
 8420    ReadModuleOffsetMap(M);
 
 8430  uint64_t OrignalModuleFileIndex = 0;
 
 8433      OrignalModuleFileIndex = I + 1;
 
 8437  if (!OrignalModuleFileIndex)
 
 
 8445  if (Idx >= 
Record.size()) {
 
 8446    Error(
"Corrupted AST file");
 
 
 8463  RecordLocation Loc = getLocalBitOffset(Offset);
 
 8464  if (llvm::Error Err = Loc.F->
DeclsCursor.JumpToBit(Loc.Offset)) {
 
 8465    Error(std::move(Err));
 
 8468  assert(NumCurrentElementsDeserializing == 0 &&
 
 8469         "should not be called while already deserializing");
 
 8471  return ReadStmtFromStream(*Loc.F);
 
 
 8474bool ASTReader::LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
 
 8478  auto It = SpecLookups.find(D);
 
 8479  if (It == SpecLookups.end())
 
 8485      It->second.Table.findAll();
 
 8489  SpecLookups.erase(It);
 
 8491  bool NewSpecsFound = 
false;
 
 8492  Deserializing LookupResults(
this);
 
 8493  for (
auto &Info : Infos) {
 
 8494    if (GetExistingDecl(Info))
 
 8496    NewSpecsFound = 
true;
 
 8500  return NewSpecsFound;
 
 8507  bool NewSpecsFound =
 
 8508      LoadExternalSpecializationsImpl(PartialSpecializationsLookups, D);
 
 8510    return NewSpecsFound;
 
 8512  NewSpecsFound |= LoadExternalSpecializationsImpl(SpecializationsLookups, D);
 
 8513  return NewSpecsFound;
 
 
 8516bool ASTReader::LoadExternalSpecializationsImpl(
 
 8517    SpecLookupTableTy &SpecLookups, 
const Decl *D,
 
 8521  auto It = SpecLookups.find(D);
 
 8522  if (It == SpecLookups.end())
 
 8525  llvm::TimeTraceScope TimeScope(
"Load External Specializations for ", [&] {
 
 8527    llvm::raw_string_ostream OS(Name);
 
 8529    ND->getNameForDiagnostic(OS, ND->getASTContext().getPrintingPolicy(),
 
 8534  Deserializing LookupResults(
this);
 
 8539      It->second.Table.find(HashValue);
 
 8541  bool NewSpecsFound = 
false;
 
 8542  for (
auto &Info : Infos) {
 
 8543    if (GetExistingDecl(Info))
 
 8545    NewSpecsFound = 
true;
 
 8549  return NewSpecsFound;
 
 8556  bool NewDeclsFound = LoadExternalSpecializationsImpl(
 
 8557      PartialSpecializationsLookups, D, TemplateArgs);
 
 8559      LoadExternalSpecializationsImpl(SpecializationsLookups, D, TemplateArgs);
 
 8561  return NewDeclsFound;
 
 
 8569  auto Visit = [&] (
ModuleFile *M, LexicalContents LexicalDecls) {
 
 8570    assert(LexicalDecls.size() % 2 == 0 && 
"expected an even number of entries");
 
 8571    for (
int I = 0, N = LexicalDecls.size(); I != N; I += 2) {
 
 8573      if (!IsKindWeWant(K))
 
 8576      auto ID = (
DeclID) + LexicalDecls[I + 1];
 
 8581        if (PredefsVisited[ID])
 
 8584        PredefsVisited[ID] = 
true;
 
 8588        assert(D->
getKind() == K && 
"wrong kind for lexical decl");
 
 8596    for (
const auto &Lexical : TULexicalDecls)
 
 8597      Visit(Lexical.first, Lexical.second);
 
 8599    auto I = LexicalDecls.find(DC);
 
 8600    if (I != LexicalDecls.end())
 
 8601      Visit(I->second.first, I->second.second);
 
 8604  ++NumLexicalDeclContextsRead;
 
 
 8609class UnalignedDeclIDComp {
 
 8615      : Reader(Reader), Mod(M) {}
 
 8624    SourceLocation RHS = getLocation(R);
 
 8629    SourceLocation LHS = getLocation(L);
 
 8643                                    unsigned Offset, 
unsigned Length,
 
 8647  llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(
File);
 
 8648  if (I == FileDeclIDs.end())
 
 8651  FileDeclsInfo &DInfo = I->second;
 
 8652  if (DInfo.Decls.empty())
 
 8656    BeginLoc = 
SM.getLocForStartOfFile(
File).getLocWithOffset(Offset);
 
 8659  UnalignedDeclIDComp DIDComp(*
this, *DInfo.Mod);
 
 8661      llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp);
 
 8662  if (BeginIt != DInfo.Decls.begin())
 
 8668  while (BeginIt != DInfo.Decls.begin() &&
 
 8671             ->isTopLevelDeclInObjCContainer())
 
 8675      llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp);
 
 8676  if (EndIt != DInfo.Decls.end())
 
 
 8689         "DeclContext has no visible decls in storage");
 
 8697  auto Find = [&, 
this](
auto &&Table, 
auto &&Key) {
 
 8701        Decls.push_back(ND);
 
 8709  if (
auto It = Lookups.find(DC); It != Lookups.end()) {
 
 8710    ++NumVisibleDeclContextsRead;
 
 8711    Find(It->second.Table, Name);
 
 8714  auto FindModuleLocalLookup = [&, 
this](
Module *NamedModule) {
 
 8715    if (
auto It = ModuleLocalLookups.find(DC); It != ModuleLocalLookups.end()) {
 
 8716      ++NumModuleLocalVisibleDeclContexts;
 
 8717      Find(It->second.Table, std::make_pair(Name, NamedModule));
 
 8720  if (
auto *NamedModule =
 
 8721          OriginalDC ? 
cast<Decl>(OriginalDC)->getTopLevelOwningNamedModule()
 
 8723    FindModuleLocalLookup(NamedModule);
 
 8728  if (ContextObj && ContextObj->getCurrentNamedModule())
 
 8729    FindModuleLocalLookup(ContextObj->getCurrentNamedModule());
 
 8731  if (
auto It = TULocalLookups.find(DC); It != TULocalLookups.end()) {
 
 8732    ++NumTULocalVisibleDeclContexts;
 
 8733    Find(It->second.Table, Name);
 
 8737  return !Decls.empty();
 
 
 8746  auto findAll = [&](
auto &LookupTables, 
unsigned &NumRead) {
 
 8747    auto It = LookupTables.find(DC);
 
 8748    if (It == LookupTables.end())
 
 8761  findAll(Lookups, NumVisibleDeclContextsRead);
 
 8762  findAll(ModuleLocalLookups, NumModuleLocalVisibleDeclContexts);
 
 8763  findAll(TULocalLookups, NumTULocalVisibleDeclContexts);
 
 8765  for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) {
 
 8768  const_cast<DeclContext *
>(DC)->setHasExternalVisibleStorage(
false);
 
 
 8773  auto I = Lookups.find(Primary);
 
 8774  return I == Lookups.end() ? 
nullptr : &I->second;
 
 
 8779  auto I = ModuleLocalLookups.find(Primary);
 
 8780  return I == ModuleLocalLookups.end() ? 
nullptr : &I->second;
 
 
 8785  auto I = TULocalLookups.find(Primary);
 
 8786  return I == TULocalLookups.end() ? 
nullptr : &I->second;
 
 
 8793      IsPartial ? PartialSpecializationsLookups : SpecializationsLookups;
 
 8794  auto I = LookupTable.find(D);
 
 8795  return I == LookupTable.end() ? 
nullptr : &I->second;
 
 
 8800  return PartialSpecializationsLookups.contains(D) ||
 
 8801         SpecializationsLookups.contains(D);
 
 
 8810  assert(ImplD && Consumer);
 
 8812  for (
auto *I : ImplD->
methods())
 
 
 8818void ASTReader::PassInterestingDeclToConsumer(Decl *D) {
 
 8819  if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
 
 8822    Consumer->HandleInterestingDecl(DeclGroupRef(D));
 
 8825void ASTReader::PassVTableToConsumer(CXXRecordDecl *RD) {
 
 8826  Consumer->HandleVTable(RD);
 
 8830  this->Consumer = Consumer;
 
 8833    PassInterestingDeclsToConsumer();
 
 8835  if (DeserializationListener)
 
 8836    DeserializationListener->ReaderInitialized(
this);
 
 
 8840  std::fprintf(stderr, 
"*** AST File Statistics:\n");
 
 8842  unsigned NumTypesLoaded =
 
 8843      TypesLoaded.size() - llvm::count(TypesLoaded.materialized(), 
QualType());
 
 8844  unsigned NumDeclsLoaded =
 
 8845      DeclsLoaded.size() -
 
 8846      llvm::count(DeclsLoaded.materialized(), (
Decl *)
nullptr);
 
 8847  unsigned NumIdentifiersLoaded =
 
 8848      IdentifiersLoaded.size() -
 
 8850  unsigned NumMacrosLoaded =
 
 8851      MacrosLoaded.size() - llvm::count(MacrosLoaded, (
MacroInfo *)
nullptr);
 
 8852  unsigned NumSelectorsLoaded =
 
 8853      SelectorsLoaded.size() - llvm::count(SelectorsLoaded, 
Selector());
 
 8856    std::fprintf(stderr, 
"  %u/%u source location entries read (%f%%)\n",
 
 8857                 NumSLocEntriesRead, TotalNumSLocEntries,
 
 8858                 ((
float)NumSLocEntriesRead/TotalNumSLocEntries * 100));
 
 8859  if (!TypesLoaded.empty())
 
 8860    std::fprintf(stderr, 
"  %u/%u types read (%f%%)\n",
 
 8861                 NumTypesLoaded, (
unsigned)TypesLoaded.size(),
 
 8862                 ((
float)NumTypesLoaded/TypesLoaded.size() * 100));
 
 8863  if (!DeclsLoaded.empty())
 
 8864    std::fprintf(stderr, 
"  %u/%u declarations read (%f%%)\n",
 
 8865                 NumDeclsLoaded, (
unsigned)DeclsLoaded.size(),
 
 8866                 ((
float)NumDeclsLoaded/DeclsLoaded.size() * 100));
 
 8867  if (!IdentifiersLoaded.empty())
 
 8868    std::fprintf(stderr, 
"  %u/%u identifiers read (%f%%)\n",
 
 8869                 NumIdentifiersLoaded, (
unsigned)IdentifiersLoaded.size(),
 
 8870                 ((
float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100));
 
 8871  if (!MacrosLoaded.empty())
 
 8872    std::fprintf(stderr, 
"  %u/%u macros read (%f%%)\n",
 
 8873                 NumMacrosLoaded, (
unsigned)MacrosLoaded.size(),
 
 8874                 ((
float)NumMacrosLoaded/MacrosLoaded.size() * 100));
 
 8875  if (!SelectorsLoaded.empty())
 
 8876    std::fprintf(stderr, 
"  %u/%u selectors read (%f%%)\n",
 
 8877                 NumSelectorsLoaded, (
unsigned)SelectorsLoaded.size(),
 
 8878                 ((
float)NumSelectorsLoaded/SelectorsLoaded.size() * 100));
 
 8879  if (TotalNumStatements)
 
 8880    std::fprintf(stderr, 
"  %u/%u statements read (%f%%)\n",
 
 8881                 NumStatementsRead, TotalNumStatements,
 
 8882                 ((
float)NumStatementsRead/TotalNumStatements * 100));
 
 8884    std::fprintf(stderr, 
"  %u/%u macros read (%f%%)\n",
 
 8885                 NumMacrosRead, TotalNumMacros,
 
 8886                 ((
float)NumMacrosRead/TotalNumMacros * 100));
 
 8887  if (TotalLexicalDeclContexts)
 
 8888    std::fprintf(stderr, 
"  %u/%u lexical declcontexts read (%f%%)\n",
 
 8889                 NumLexicalDeclContextsRead, TotalLexicalDeclContexts,
 
 8890                 ((
float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts
 
 8892  if (TotalVisibleDeclContexts)
 
 8893    std::fprintf(stderr, 
"  %u/%u visible declcontexts read (%f%%)\n",
 
 8894                 NumVisibleDeclContextsRead, TotalVisibleDeclContexts,
 
 8895                 ((
float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts
 
 8897  if (TotalModuleLocalVisibleDeclContexts)
 
 8899        stderr, 
"  %u/%u module local visible declcontexts read (%f%%)\n",
 
 8900        NumModuleLocalVisibleDeclContexts, TotalModuleLocalVisibleDeclContexts,
 
 8901        ((
float)NumModuleLocalVisibleDeclContexts /
 
 8902         TotalModuleLocalVisibleDeclContexts * 100));
 
 8903  if (TotalTULocalVisibleDeclContexts)
 
 8904    std::fprintf(stderr, 
"  %u/%u visible declcontexts in GMF read (%f%%)\n",
 
 8905                 NumTULocalVisibleDeclContexts, TotalTULocalVisibleDeclContexts,
 
 8906                 ((
float)NumTULocalVisibleDeclContexts /
 
 8907                  TotalTULocalVisibleDeclContexts * 100));
 
 8908  if (TotalNumMethodPoolEntries)
 
 8909    std::fprintf(stderr, 
"  %u/%u method pool entries read (%f%%)\n",
 
 8910                 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries,
 
 8911                 ((
float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries
 
 8913  if (NumMethodPoolLookups)
 
 8914    std::fprintf(stderr, 
"  %u/%u method pool lookups succeeded (%f%%)\n",
 
 8915                 NumMethodPoolHits, NumMethodPoolLookups,
 
 8916                 ((
float)NumMethodPoolHits/NumMethodPoolLookups * 100.0));
 
 8917  if (NumMethodPoolTableLookups)
 
 8918    std::fprintf(stderr, 
"  %u/%u method pool table lookups succeeded (%f%%)\n",
 
 8919                 NumMethodPoolTableHits, NumMethodPoolTableLookups,
 
 8920                 ((
float)NumMethodPoolTableHits/NumMethodPoolTableLookups
 
 8922  if (NumIdentifierLookupHits)
 
 8923    std::fprintf(stderr,
 
 8924                 "  %u / %u identifier table lookups succeeded (%f%%)\n",
 
 8925                 NumIdentifierLookupHits, NumIdentifierLookups,
 
 8926                 (
double)NumIdentifierLookupHits*100.0/NumIdentifierLookups);
 
 8929    std::fprintf(stderr, 
"\n");
 
 8930    GlobalIndex->printStats();
 
 8933  std::fprintf(stderr, 
"\n");
 
 8935  std::fprintf(stderr, 
"\n");
 
 
 8938template<
typename Key, 
typename ModuleFile, 
unsigned InitialCapacity>
 
 8939LLVM_DUMP_METHOD 
static void 
 8942                                         InitialCapacity> &Map) {
 
 8943  if (Map.begin() == Map.end())
 
 8948  llvm::errs() << Name << 
":\n";
 
 8949  for (
typename MapType::const_iterator I = Map.begin(), IEnd = Map.end();
 
 8951    llvm::errs() << 
"  " << (
DeclID)I->first << 
" -> " << I->second->FileName
 
 
 8956  llvm::errs() << 
"*** PCH/ModuleFile Remappings:\n";
 
 8958  dumpModuleIDMap(
"Global source location entry map", GlobalSLocEntryMap);
 
 8963                  GlobalPreprocessedEntityMap);
 
 8965  llvm::errs() << 
"\n*** PCH/Modules Loaded:";
 
 
 8974    if (llvm::MemoryBuffer *buf = I.Buffer) {
 
 8975      size_t bytes = buf->getBufferSize();
 
 8976      switch (buf->getBufferKind()) {
 
 8977        case llvm::MemoryBuffer::MemoryBuffer_Malloc:
 
 8980        case llvm::MemoryBuffer::MemoryBuffer_MMap:
 
 
 9001  if (!FPPragmaOptions.empty()) {
 
 9002    assert(FPPragmaOptions.size() == 1 && 
"Wrong number of FP_PRAGMA_OPTIONS");
 
 9005    SemaObj->CurFPFeatures =
 
 9011    if (
auto *FD = dyn_cast<FunctionDecl>(D))
 
 9012      SemaObj->addDeclWithEffects(FD, FD->getFunctionEffects());
 
 9013    else if (
auto *BD = dyn_cast<BlockDecl>(D))
 
 9014      SemaObj->addDeclWithEffects(BD, BD->getFunctionEffects());
 
 9016      llvm_unreachable(
"unexpected Decl type in DeclsWithEffectsToVerify");
 
 9018  DeclsWithEffectsToVerify.clear();
 
 9020  SemaObj->OpenCLFeatures = OpenCLExtensions;
 
 
 9026  assert(SemaObj && 
"no Sema to update");
 
 9030  if (!SemaDeclRefs.empty()) {
 
 9031    assert(SemaDeclRefs.size() % 3 == 0);
 
 9032    for (
unsigned I = 0; I != SemaDeclRefs.size(); I += 3) {
 
 9033      if (!SemaObj->StdNamespace)
 
 9034        SemaObj->StdNamespace = SemaDeclRefs[I].getRawValue();
 
 9035      if (!SemaObj->StdBadAlloc)
 
 9036        SemaObj->StdBadAlloc = SemaDeclRefs[I + 1].getRawValue();
 
 9037      if (!SemaObj->StdAlignValT)
 
 9038        SemaObj->StdAlignValT = SemaDeclRefs[I + 2].getRawValue();
 
 9040    SemaDeclRefs.clear();
 
 9045  if(OptimizeOffPragmaLocation.isValid())
 
 9046    SemaObj->ActOnPragmaOptimize( 
false, OptimizeOffPragmaLocation);
 
 9047  if (PragmaMSStructState != -1)
 
 9049  if (PointersToMembersPragmaLocation.isValid()) {
 
 9050    SemaObj->ActOnPragmaMSPointersToMembers(
 
 9052            PragmaMSPointersToMembersState,
 
 9053        PointersToMembersPragmaLocation);
 
 9055  SemaObj->CUDA().ForceHostDeviceDepth = ForceHostDeviceDepth;
 
 9057  if (PragmaAlignPackCurrentValue) {
 
 9061    bool DropFirst = 
false;
 
 9062    if (!PragmaAlignPackStack.empty() &&
 
 9063        PragmaAlignPackStack.front().Location.isInvalid()) {
 
 9064      assert(PragmaAlignPackStack.front().Value ==
 
 9065                 SemaObj->AlignPackStack.DefaultValue &&
 
 9066             "Expected a default alignment value");
 
 9067      SemaObj->AlignPackStack.Stack.emplace_back(
 
 9068          PragmaAlignPackStack.front().SlotLabel,
 
 9069          SemaObj->AlignPackStack.CurrentValue,
 
 9070          SemaObj->AlignPackStack.CurrentPragmaLocation,
 
 9071          PragmaAlignPackStack.front().PushLocation);
 
 9074    for (
const auto &Entry :
 
 9075         llvm::ArrayRef(PragmaAlignPackStack).drop_front(DropFirst ? 1 : 0)) {
 
 9076      SemaObj->AlignPackStack.Stack.emplace_back(
 
 9077          Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
 
 9079    if (PragmaAlignPackCurrentLocation.isInvalid()) {
 
 9080      assert(*PragmaAlignPackCurrentValue ==
 
 9081                 SemaObj->AlignPackStack.DefaultValue &&
 
 9082             "Expected a default align and pack value");
 
 9085      SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue;
 
 9086      SemaObj->AlignPackStack.CurrentPragmaLocation =
 
 9087          PragmaAlignPackCurrentLocation;
 
 9090  if (FpPragmaCurrentValue) {
 
 9094    bool DropFirst = 
false;
 
 9095    if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) {
 
 9096      assert(FpPragmaStack.front().Value ==
 
 9097                 SemaObj->FpPragmaStack.DefaultValue &&
 
 9098             "Expected a default pragma float_control value");
 
 9099      SemaObj->FpPragmaStack.Stack.emplace_back(
 
 9100          FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue,
 
 9101          SemaObj->FpPragmaStack.CurrentPragmaLocation,
 
 9102          FpPragmaStack.front().PushLocation);
 
 9105    for (
const auto &Entry :
 
 9107      SemaObj->FpPragmaStack.Stack.emplace_back(
 
 9108          Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation);
 
 9109    if (FpPragmaCurrentLocation.isInvalid()) {
 
 9110      assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue &&
 
 9111             "Expected a default pragma float_control value");
 
 9114      SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue;
 
 9115      SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation;
 
 9120  for (
auto &Import : PendingImportedModulesSema) {
 
 9121    if (Import.ImportLoc.isInvalid())
 
 9124      SemaObj->makeModuleVisible(Imported, Import.ImportLoc);
 
 9127  PendingImportedModulesSema.clear();
 
 
 9134  IdentifierLookupVisitor Visitor(Name, 0,
 
 9135                                  NumIdentifierLookups,
 
 9136                                  NumIdentifierLookupHits);
 
 9142  if (PP.getLangOpts().CPlusPlus) {
 
 9143    for (
auto *F : ModuleMgr.pch_modules())
 
 9152      if (GlobalIndex->lookupIdentifier(Name, Hits)) {
 
 9157    ModuleMgr.visit(Visitor, HitsPtr);
 
 
 9179    ASTIdentifierLookupTable::key_iterator Current;
 
 9183    ASTIdentifierLookupTable::key_iterator End;
 
 9190                                   bool SkipModules = 
false);
 
 9192    StringRef 
Next() 
override;
 
 
 9199    : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) {
 
 
 9203  while (Current == End) {
 
 9215    Current = IdTable->key_begin();
 
 9216    End = IdTable->key_end();
 
 9221  StringRef 
Result = *Current;
 
 
 9230  std::unique_ptr<IdentifierIterator> Current;
 
 9231  std::unique_ptr<IdentifierIterator> Queued;
 
 9234  ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> 
First,
 
 9235                            std::unique_ptr<IdentifierIterator> Second)
 
 9236      : Current(
std::move(
First)), Queued(
std::move(Second)) {}
 
 9238  StringRef 
Next()
 override {
 
 9242    StringRef result = Current->Next();
 
 9243    if (!result.empty())
 
 9248    std::swap(Current, Queued);
 
 9257    std::unique_ptr<IdentifierIterator> ReaderIter(
 
 9259    std::unique_ptr<IdentifierIterator> ModulesIter(
 
 9260        GlobalIndex->createIdentifierIterator());
 
 9261    return new ChainedIdentifierIterator(std::move(ReaderIter),
 
 9262                                         std::move(ModulesIter));
 
 
 9274    unsigned PriorGeneration;
 
 9275    unsigned InstanceBits = 0;
 
 9276    unsigned FactoryBits = 0;
 
 9277    bool InstanceHasMoreThanOneDecl = 
false;
 
 9278    bool FactoryHasMoreThanOneDecl = 
false;
 
 9284                          unsigned PriorGeneration)
 
 9285        : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {}
 
 
 9295      ++Reader.NumMethodPoolTableLookups;
 
 9298      ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel);
 
 9299      if (Pos == PoolTable->end())
 
 9302      ++Reader.NumMethodPoolTableHits;
 
 9303      ++Reader.NumSelectorsRead;
 
 9307      ++Reader.NumMethodPoolEntriesRead;
 
 9309      if (Reader.DeserializationListener)
 
 9310        Reader.DeserializationListener->SelectorRead(
Data.ID, Sel);
 
 9315      InstanceMethods.append(
Data.Instance.rbegin(), 
Data.Instance.rend());
 
 9316      FactoryMethods.append(
Data.Factory.rbegin(), 
Data.Factory.rend());
 
 9317      InstanceBits = 
Data.InstanceBits;
 
 9318      FactoryBits = 
Data.FactoryBits;
 
 9319      InstanceHasMoreThanOneDecl = 
Data.InstanceHasMoreThanOneDecl;
 
 9320      FactoryHasMoreThanOneDecl = 
Data.FactoryHasMoreThanOneDecl;
 
 
 9326      return InstanceMethods;
 
 
 9331      return FactoryMethods;
 
 
 9338      return InstanceHasMoreThanOneDecl;
 
 
 
 9356  unsigned &Generation = SelectorGeneration[Sel];
 
 9357  unsigned PriorGeneration = Generation;
 
 9359  SelectorOutOfDate[Sel] = 
false;
 
 9362  ++NumMethodPoolLookups;
 
 9364  ModuleMgr.visit(Visitor);
 
 9370  ++NumMethodPoolHits;
 
 
 9391  if (SelectorOutOfDate[Sel])
 
 
 9399  for (
unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) {
 
 9401                = dyn_cast_or_null<NamespaceDecl>(
GetDecl(KnownNamespaces[I])))
 
 9402      Namespaces.push_back(Namespace);
 
 
 9407    llvm::MapVector<NamedDecl *, SourceLocation> &
Undefined) {
 
 9408  for (
unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) {
 
 9409    UndefinedButUsedDecl &
U = UndefinedButUsed[Idx++];
 
 9412    Undefined.insert(std::make_pair(D, Loc));
 
 9414  UndefinedButUsed.clear();
 
 
 9420  for (
unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) {
 
 9423    uint64_t Count = DelayedDeleteExprs[Idx++];
 
 9424    for (uint64_t 
C = 0; 
C < Count; ++
C) {
 
 9427      const bool IsArrayForm = DelayedDeleteExprs[Idx++];
 
 9428      Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm));
 
 
 9435  for (
unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
 
 9436    VarDecl *Var = dyn_cast_or_null<VarDecl>(
GetDecl(TentativeDefinitions[I]));
 
 9438      TentativeDefs.push_back(Var);
 
 9440  TentativeDefinitions.clear();
 
 
 9445  for (
unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) {
 
 9447      = dyn_cast_or_null<DeclaratorDecl>(
GetDecl(UnusedFileScopedDecls[I]));
 
 9451  UnusedFileScopedDecls.clear();
 
 
 9456  for (
unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) {
 
 9458      = dyn_cast_or_null<CXXConstructorDecl>(
GetDecl(DelegatingCtorDecls[I]));
 
 9462  DelegatingCtorDecls.clear();
 
 
 9466  for (
unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) {
 
 9468      = dyn_cast_or_null<TypedefNameDecl>(
GetDecl(ExtVectorDecls[I]));
 
 9472  ExtVectorDecls.clear();
 
 
 9477  for (
unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N;
 
 9480        GetDecl(UnusedLocalTypedefNameCandidates[I]));
 
 9484  UnusedLocalTypedefNameCandidates.clear();
 
 
 9489  for (
auto I : DeclsToCheckForDeferredDiags) {
 
 9490    auto *D = dyn_cast_or_null<Decl>(
GetDecl(I));
 
 9494  DeclsToCheckForDeferredDiags.clear();
 
 
 9499  if (ReferencedSelectorsData.empty())
 
 9504  unsigned int DataSize = ReferencedSelectorsData.size()-1;
 
 9506  while (I < DataSize) {
 
 9510    Sels.push_back(std::make_pair(Sel, SelLoc));
 
 9512  ReferencedSelectorsData.clear();
 
 
 9517  if (WeakUndeclaredIdentifiers.empty())
 
 9520  for (
unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; ) {
 
 9528    WeakIDs.push_back(std::make_pair(WeakId, WI));
 
 9530  WeakUndeclaredIdentifiers.clear();
 
 
 9534  for (
unsigned Idx = 0, N = VTableUses.size(); Idx < N; ) {
 
 9536    VTableUse &TableInfo = VTableUses[Idx++];
 
 9537    VT.
Record = dyn_cast_or_null<CXXRecordDecl>(
GetDecl(TableInfo.ID));
 
 9540    VTables.push_back(VT);
 
 
 9548  for (
unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
 
 9549    PendingInstantiation &Inst = PendingInstantiations[Idx++];
 
 9553    Pending.push_back(std::make_pair(D, Loc));
 
 9555  PendingInstantiations.clear();
 
 
 9559    llvm::MapVector<
const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
 
 9561  for (
auto &LPT : LateParsedTemplates) {
 
 9564    for (
unsigned Idx = 0, N = LateParsed.size(); Idx < N;
 
 9568      auto LT = std::make_unique<LateParsedTemplate>();
 
 9569      LT->D = 
ReadDecl(*FMod, LateParsed, Idx);
 
 9573      assert(F && 
"No module");
 
 9575      unsigned TokN = LateParsed[Idx++];
 
 9576      LT->Toks.reserve(TokN);
 
 9577      for (
unsigned T = 0; 
T < TokN; ++
T)
 
 9578        LT->Toks.push_back(
ReadToken(*F, LateParsed, Idx));
 
 9580      LPTMap.insert(std::make_pair(FD, std::move(LT)));
 
 9584  LateParsedTemplates.clear();
 
 
 9596  if (
auto Iter = LambdaDeclarationsForMerging.find(LambdaInfo);
 
 9597      Iter != LambdaDeclarationsForMerging.end() &&
 
 9598      Iter->second->isFromASTFile() && Lambda->
getFirstDecl() == Lambda) {
 
 9607  LambdaDeclarationsForMerging.insert({LambdaInfo, Lambda});
 
 
 9616  assert(ID && 
"Non-zero identifier ID required");
 
 9617  unsigned Index = translateIdentifierIDToIndex(ID).second;
 
 9618  assert(Index < IdentifiersLoaded.size() && 
"identifier ID out of range");
 
 9619  IdentifiersLoaded[Index] = II;
 
 9620  if (DeserializationListener)
 
 9621    DeserializationListener->IdentifierRead(ID, II);
 
 
 9643  if (NumCurrentElementsDeserializing && !Decls) {
 
 9644    PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end());
 
 9648  for (
unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
 
 9661      Decls->push_back(D);
 
 9668    pushExternalDeclIntoScope(D, II);
 
 
 9672std::pair<ModuleFile *, unsigned>
 
 9673ASTReader::translateIdentifierIDToIndex(
IdentifierID ID)
 const {
 
 9675    return {
nullptr, 0};
 
 9677  unsigned ModuleFileIndex = ID >> 32;
 
 9678  unsigned LocalID = ID & llvm::maskTrailingOnes<IdentifierID>(32);
 
 9680  assert(ModuleFileIndex && 
"not translating loaded IdentifierID?");
 
 9692  if (IdentifiersLoaded.empty()) {
 
 9693    Error(
"no identifier table in AST file");
 
 9697  auto [M, Index] = translateIdentifierIDToIndex(ID);
 
 9698  if (!IdentifiersLoaded[Index]) {
 
 9699    assert(M != 
nullptr && 
"Untranslated Identifier ID?");
 
 9702    const unsigned char *
Data =
 
 9708    auto &II = PP.getIdentifierTable().get(Key);
 
 9709    IdentifiersLoaded[Index] = &II;
 
 9712    if (DeserializationListener)
 
 9713      DeserializationListener->IdentifierRead(ID, &II);
 
 9716  return IdentifiersLoaded[Index];
 
 
 9728    ReadModuleOffsetMap(M);
 
 9730  unsigned ModuleFileIndex = LocalID >> 32;
 
 9731  LocalID &= llvm::maskTrailingOnes<IdentifierID>(32);
 
 9734  assert(MF && 
"malformed identifier ID encoding?");
 
 9736  if (!ModuleFileIndex)
 
 
 9746  if (MacrosLoaded.empty()) {
 
 9747    Error(
"no macro table in AST file");
 
 9752  if (!MacrosLoaded[ID]) {
 
 9755    assert(I != GlobalMacroMap.end() && 
"Corrupted global macro map");
 
 9761    if (DeserializationListener)
 
 9766  return MacrosLoaded[ID];
 
 
 9774    ReadModuleOffsetMap(M);
 
 9778  assert(I != M.
MacroRemap.
end() && 
"Invalid index into macro index remap");
 
 9780  return LocalID + I->second;
 
 
 9789    ReadModuleOffsetMap(M);
 
 9794         && 
"Invalid index into submodule index remap");
 
 9796  return LocalID + I->second;
 
 
 9801    assert(GlobalID == 0 && 
"Unhandled global submodule ID");
 
 9805  if (GlobalID > SubmodulesLoaded.size()) {
 
 9806    Error(
"submodule ID out of range in AST file");
 
 
 9821    return I == GlobalSubmoduleMap.end() ? 
nullptr : I->second;
 
 9824   int IndexFromEnd = 
static_cast<int>(ID >> 1);
 
 9825    assert(IndexFromEnd && 
"got reference to unknown module file");
 
 
 9842  auto I = llvm::find(PCHModules, M);
 
 9843  assert(I != PCHModules.end() && 
"emitting reference to unknown file");
 
 9844  return std::distance(I, PCHModules.end()) << 1;
 
 
 9853  const auto &PCHChain = ModuleMgr.pch_modules();
 
 9854  if (std::distance(std::begin(PCHChain), std::end(PCHChain))) {
 
 9855    ModuleFile &MF = ModuleMgr.getPrimaryModule();
 
 9859                               llvm::sys::path::parent_path(MF.
FileName),
 
 9862  return std::nullopt;
 
 
 9866  auto I = DefinitionSource.find(FD);
 
 9867  if (I == DefinitionSource.end())
 
 
 9873  return ThisDeclarationWasADefinitionSet.contains(FD);
 
 
 9884  if (ID > SelectorsLoaded.size()) {
 
 9885    Error(
"selector ID out of range in AST file");
 
 9889  if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == 
nullptr) {
 
 9892    assert(I != GlobalSelectorMap.end() && 
"Corrupted global selector map");
 
 9896    SelectorsLoaded[ID - 1] =
 
 9898    if (DeserializationListener)
 
 9899      DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]);
 
 9902  return SelectorsLoaded[ID - 1];
 
 
 9920    ReadModuleOffsetMap(M);
 
 9925         && 
"Invalid index into selector index remap");
 
 9927  return LocalID + I->second;
 
 
 9958  NameInfo.
setName(readDeclarationName());
 
 
 9972  SpirvOperand Op(SpirvOperand::SpirvOperandKind(Kind), ResultType, 
Value);
 
 9973  assert(Op.isValid());
 
 
 9979  unsigned NumTPLists = 
readInt();
 
 9984    for (
unsigned i = 0; i != NumTPLists; ++i)
 
 
 9995  unsigned NumParams = 
readInt();
 
 9997  Params.reserve(NumParams);
 
10001  bool HasRequiresClause = 
readBool();
 
10002  Expr *RequiresClause = HasRequiresClause ? 
readExpr() : 
nullptr;
 
10005      getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause);
 
10006  return TemplateParams;
 
 
10011                        bool Canonicalize) {
 
10012  unsigned NumTemplateArgs = 
readInt();
 
10013  TemplArgs.reserve(NumTemplateArgs);
 
10014  while (NumTemplateArgs--)
 
 
10020  unsigned NumDecls = 
readInt();
 
10022  while (NumDecls--) {
 
 
10034  bool inheritConstructors = 
readBool();
 
10040  Result.setInheritConstructors(inheritConstructors);
 
 
10047  unsigned NumInitializers = 
readInt();
 
10048  assert(NumInitializers && 
"wrote ctor initializers but have no inits");
 
10050  for (
unsigned i = 0; i != NumInitializers; ++i) {
 
10052    bool IsBaseVirtual = 
false;
 
10083      BOMInit = 
new (Context)
 
10085                             RParenLoc, MemberOrEllipsisLoc);
 
10087      BOMInit = 
new (Context)
 
10090      BOMInit = 
new (Context)
 
10094      BOMInit = 
new (Context)
 
10096                             LParenLoc, 
Init, RParenLoc);
 
10099      unsigned SourceOrder = 
readInt();
 
10103    CtorInitializers[i] = BOMInit;
 
10106  return CtorInitializers;
 
 
10114  for (
unsigned I = 0; I != N; ++I) {
 
10115    auto Kind = readNestedNameSpecifierKind();
 
10120      Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd());
 
10129      Builder.Make(Context, 
T->getTypeLoc(), ColonColonLoc);
 
10135      Builder.MakeGlobal(Context, ColonColonLoc);
 
10142      Builder.MakeMicrosoftSuper(Context, RD, Range.getBegin(), Range.getEnd());
 
10147      llvm_unreachable(
"unexpected null nested name specifier");
 
 
10162                                         const StringRef Blob) {
 
10163  unsigned Count = 
Record[0];
 
10164  const char *Byte = Blob.data();
 
10165  llvm::BitVector Ret = llvm::BitVector(Count, 
false);
 
10166  for (
unsigned I = 0; I < Count; ++Byte)
 
10167    for (
unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I)
 
10168      if (*Byte & (1 << Bit))
 
 
10175  return llvm::APFloat(Sem, 
readAPInt());
 
 
10180  unsigned Len = 
Record[Idx++];
 
 
10188  unsigned Len = 
Record[Idx++];
 
10189  StringRef 
Result = Blob.substr(0, Len);
 
10190  Blob = Blob.substr(Len);
 
 
10214  unsigned Major = 
Record[Idx++];
 
10215  unsigned Minor = 
Record[Idx++];
 
10216  unsigned Subminor = 
Record[Idx++];
 
10218    return VersionTuple(Major);
 
10220    return VersionTuple(Major, Minor - 1);
 
10221  return VersionTuple(Major, Minor - 1, Subminor - 1);
 
 
10232  return Diag(CurrentImportLoc, DiagID);
 
 
10236  return Diags.Report(Loc, DiagID);
 
 
10240                                            llvm::function_ref<
void()> Fn) {
 
10243    SemaObj->runWithSufficientStackSpace(Loc, Fn);
 
10247  StackHandler.runWithSufficientStackSpace(Loc, Fn);
 
 
10253  return PP.getIdentifierTable();
 
 
10259  assert((*CurrSwitchCaseStmts)[ID] == 
nullptr &&
 
10260         "Already have a SwitchCase with this ID");
 
10261  (*CurrSwitchCaseStmts)[ID] = SC;
 
 
10266  assert((*CurrSwitchCaseStmts)[ID] != 
nullptr && 
"No SwitchCase with this ID");
 
10267  return (*CurrSwitchCaseStmts)[ID];
 
 
10271  CurrSwitchCaseStmts->clear();
 
 
10276  std::vector<RawComment *> Comments;
 
10283    BitstreamCursor &Cursor = I->first;
 
10290          Cursor.advanceSkippingSubblocks(
 
10291              BitstreamCursor::AF_DontPopBlockAtEnd);
 
10293        Error(MaybeEntry.takeError());
 
10296      llvm::BitstreamEntry Entry = MaybeEntry.get();
 
10298      switch (Entry.Kind) {
 
10299      case llvm::BitstreamEntry::SubBlock: 
 
10300      case llvm::BitstreamEntry::Error:
 
10301        Error(
"malformed block record in AST file");
 
10303      case llvm::BitstreamEntry::EndBlock:
 
10305      case llvm::BitstreamEntry::Record:
 
10313      if (!MaybeComment) {
 
10314        Error(MaybeComment.takeError());
 
10323        bool IsTrailingComment = 
Record[Idx++];
 
10324        bool IsAlmostTrailingComment = 
Record[Idx++];
 
10325        Comments.push_back(
new (Context) 
RawComment(
 
10326            SR, Kind, IsTrailingComment, IsAlmostTrailingComment));
 
10336        if (Loc.first.isValid())
 
10337          Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, 
C);
 
 
10350  assert(NumUserInputs <= NumInputs);
 
10351  unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
 
10352  for (
unsigned I = 0; I < N; ++I) {
 
10353    bool IsSystem = I >= NumUserInputs;
 
10355    Visitor(IFI, IsSystem);
 
 
10360                                bool IncludeSystem, 
bool Complain,
 
10362                                            bool isSystem)> Visitor) {
 
10365  assert(NumUserInputs <= NumInputs);
 
10366  unsigned N = IncludeSystem ? NumInputs : NumUserInputs;
 
10367  for (
unsigned I = 0; I < N; ++I) {
 
10368    bool IsSystem = I >= NumUserInputs;
 
10369    InputFile IF = getInputFile(MF, I+1, Complain);
 
10370    Visitor(IF, IsSystem);
 
 
10378  for (
unsigned I = 0; I < NumInputs; ++I) {
 
10381      if (
auto FE = getInputFile(MF, I + 1).getFile())
 
 
10386void ASTReader::finishPendingActions() {
 
10387  while (!PendingIdentifierInfos.empty() ||
 
10388         !PendingDeducedFunctionTypes.empty() ||
 
10389         !PendingDeducedVarTypes.empty() || !PendingDeclChains.empty() ||
 
10390         !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() ||
 
10391         !PendingUpdateRecords.empty() ||
 
10392         !PendingObjCExtensionIvarRedeclarations.empty()) {
 
10395    using TopLevelDeclsMap =
 
10396        llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>;
 
10397    TopLevelDeclsMap TopLevelDecls;
 
10399    while (!PendingIdentifierInfos.empty()) {
 
10402          std::move(PendingIdentifierInfos.back().second);
 
10403      PendingIdentifierInfos.pop_back();
 
10410    for (
unsigned I = 0; I != PendingDeducedFunctionTypes.size(); ++I) {
 
10411      auto *FD = PendingDeducedFunctionTypes[I].first;
 
10412      FD->setType(
GetType(PendingDeducedFunctionTypes[I].second));
 
10414      if (
auto *DT = FD->getReturnType()->getContainedDeducedType()) {
 
10417        if (DT->isDeduced()) {
 
10418          PendingDeducedTypeUpdates.insert(
 
10419              {FD->getCanonicalDecl(), FD->getReturnType()});
 
10426        PendingUndeducedFunctionDecls.push_back(FD);
 
10430    PendingDeducedFunctionTypes.clear();
 
10434    for (
unsigned I = 0; I != PendingDeducedVarTypes.size(); ++I) {
 
10435      auto *VD = PendingDeducedVarTypes[I].first;
 
10436      VD->setType(
GetType(PendingDeducedVarTypes[I].second));
 
10438    PendingDeducedVarTypes.clear();
 
10441    for (
unsigned I = 0; I != PendingDeclChains.size(); ++I)
 
10442      loadPendingDeclChain(PendingDeclChains[I].first,
 
10443                           PendingDeclChains[I].second);
 
10444    PendingDeclChains.clear();
 
10447    for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(),
 
10448           TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) {
 
10449      IdentifierInfo *II = TLD->first;
 
10450      for (
unsigned I = 0, N = TLD->second.size(); I != N; ++I) {
 
10456    for (
unsigned I = 0; I != PendingMacroIDs.size(); ++I) {
 
10457      IdentifierInfo *II = PendingMacroIDs.begin()[I].first;
 
10458      SmallVector<PendingMacroInfo, 2> GlobalIDs;
 
10459      GlobalIDs.swap(PendingMacroIDs.begin()[I].second);
 
10461      for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
 
10463        const PendingMacroInfo &Info = GlobalIDs[IDIdx];
 
10464        if (!Info.M->isModule())
 
10468      for (
unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs;
 
10470        const PendingMacroInfo &Info = GlobalIDs[IDIdx];
 
10471        if (Info.M->isModule())
 
10475    PendingMacroIDs.clear();
 
10479    while (!PendingDeclContextInfos.empty()) {
 
10480      PendingDeclContextInfo Info = PendingDeclContextInfos.front();
 
10481      PendingDeclContextInfos.pop_front();
 
10484      Info.D->setDeclContextsImpl(SemaDC, LexicalDC, 
getContext());
 
10488    while (!PendingUpdateRecords.empty()) {
 
10489      auto Update = PendingUpdateRecords.pop_back_val();
 
10490      ReadingKindTracker ReadingKind(Read_Decl, *
this);
 
10491      loadDeclUpdateRecords(
Update);
 
10494    while (!PendingObjCExtensionIvarRedeclarations.empty()) {
 
10495      auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first;
 
10496      auto DuplicateIvars =
 
10497          PendingObjCExtensionIvarRedeclarations.back().second;
 
10499      StructuralEquivalenceContext Ctx(
 
10500          ContextObj->getLangOpts(), ExtensionsPair.first->getASTContext(),
 
10501          ExtensionsPair.second->getASTContext(), NonEquivalentDecls,
 
10505      if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) {
 
10507        for (
auto IvarPair : DuplicateIvars) {
 
10508          ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second;
 
10510          Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(),
 
10516        ExtensionsPair.first->setInvalidDecl();
 
10517        ExtensionsPair.second->getClassInterface()
 
10519            ->setIvarList(
nullptr);
 
10521        for (
auto IvarPair : DuplicateIvars) {
 
10522          Diag(IvarPair.first->getLocation(),
 
10523               diag::err_duplicate_ivar_declaration)
 
10524              << IvarPair.first->getIdentifier();
 
10525          Diag(IvarPair.second->getLocation(), diag::note_previous_definition);
 
10528      PendingObjCExtensionIvarRedeclarations.pop_back();
 
10534  assert(PendingFakeDefinitionData.empty() &&
 
10535         "faked up a class definition but never saw the real one");
 
10541  for (Decl *D : PendingDefinitions) {
 
10542    if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
 
10543      if (
auto *RD = dyn_cast<CXXRecordDecl>(TD)) {
 
10544        for (
auto *R = getMostRecentExistingDecl(RD); R;
 
10545             R = R->getPreviousDecl()) {
 
10548                 "declaration thinks it's the definition but it isn't");
 
10556    if (
auto ID = dyn_cast<ObjCInterfaceDecl>(D)) {
 
10561      for (
auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl())
 
10567    if (
auto PD = dyn_cast<ObjCProtocolDecl>(D)) {
 
10568      for (
auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl())
 
10575    for (
auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl())
 
10578  PendingDefinitions.clear();
 
10580  for (
auto [D, 
Previous] : PendingWarningForDuplicatedDefsInModuleUnits) {
 
10581    auto hasDefinitionImpl = [
this](
Decl *D, 
auto hasDefinitionImpl) {
 
10582      if (
auto *VD = dyn_cast<VarDecl>(D))
 
10583        return VD->isThisDeclarationADefinition() ||
 
10584               VD->isThisDeclarationADemotedDefinition();
 
10586      if (
auto *TD = dyn_cast<TagDecl>(D))
 
10587        return TD->isThisDeclarationADefinition() ||
 
10588               TD->isThisDeclarationADemotedDefinition();
 
10590      if (
auto *FD = dyn_cast<FunctionDecl>(D))
 
10591        return FD->isThisDeclarationADefinition() || PendingBodies.count(FD);
 
10593      if (
auto *RTD = dyn_cast<RedeclarableTemplateDecl>(D))
 
10594        return hasDefinitionImpl(RTD->getTemplatedDecl(), hasDefinitionImpl);
 
10601      return hasDefinitionImpl(D, hasDefinitionImpl);
 
10617  PendingWarningForDuplicatedDefsInModuleUnits.clear();
 
10623  for (PendingBodiesMap::iterator PB = PendingBodies.begin(),
 
10624                               PBEnd = PendingBodies.end();
 
10625       PB != PBEnd; ++PB) {
 
10626    if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) {
 
10628      const FunctionDecl *Defn = 
nullptr;
 
10629      if (!
getContext().getLangOpts().Modules || !FD->hasBody(Defn)) {
 
10630        FD->setLazyBody(PB->second);
 
10632        auto *NonConstDefn = 
const_cast<FunctionDecl*
>(Defn);
 
10635        if (!FD->isLateTemplateParsed() &&
 
10636            !NonConstDefn->isLateTemplateParsed() &&
 
10641            FD->getODRHash() != NonConstDefn->getODRHash()) {
 
10643            PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
 
10644          } 
else if (FD->getLexicalParent()->isFileContext() &&
 
10645                     NonConstDefn->getLexicalParent()->isFileContext()) {
 
10649            PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn);
 
10660  PendingBodies.clear();
 
10663  for (
auto [RD, MD] : PendingAddedClassMembers) {
 
10664    RD->addedMember(MD);
 
10666  PendingAddedClassMembers.clear();
 
10669  for (
auto *ND : PendingMergedDefinitionsToDeduplicate)
 
10671  PendingMergedDefinitionsToDeduplicate.clear();
 
10675  for (Decl *D : PendingIncompleteDeclChains)
 
10676    markIncompleteDeclChain(D);
 
10677  PendingIncompleteDeclChains.clear();
 
10679  assert(PendingIdentifierInfos.empty() &&
 
10680         "Should be empty at the end of finishPendingActions");
 
10681  assert(PendingDeducedFunctionTypes.empty() &&
 
10682         "Should be empty at the end of finishPendingActions");
 
10683  assert(PendingDeducedVarTypes.empty() &&
 
10684         "Should be empty at the end of finishPendingActions");
 
10685  assert(PendingDeclChains.empty() &&
 
10686         "Should be empty at the end of finishPendingActions");
 
10687  assert(PendingMacroIDs.empty() &&
 
10688         "Should be empty at the end of finishPendingActions");
 
10689  assert(PendingDeclContextInfos.empty() &&
 
10690         "Should be empty at the end of finishPendingActions");
 
10691  assert(PendingUpdateRecords.empty() &&
 
10692         "Should be empty at the end of finishPendingActions");
 
10693  assert(PendingObjCExtensionIvarRedeclarations.empty() &&
 
10694         "Should be empty at the end of finishPendingActions");
 
10695  assert(PendingFakeDefinitionData.empty() &&
 
10696         "Should be empty at the end of finishPendingActions");
 
10697  assert(PendingDefinitions.empty() &&
 
10698         "Should be empty at the end of finishPendingActions");
 
10699  assert(PendingWarningForDuplicatedDefsInModuleUnits.empty() &&
 
10700         "Should be empty at the end of finishPendingActions");
 
10701  assert(PendingBodies.empty() &&
 
10702         "Should be empty at the end of finishPendingActions");
 
10703  assert(PendingAddedClassMembers.empty() &&
 
10704         "Should be empty at the end of finishPendingActions");
 
10705  assert(PendingMergedDefinitionsToDeduplicate.empty() &&
 
10706         "Should be empty at the end of finishPendingActions");
 
10707  assert(PendingIncompleteDeclChains.empty() &&
 
10708         "Should be empty at the end of finishPendingActions");
 
10711void ASTReader::diagnoseOdrViolations() {
 
10712  if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() &&
 
10713      PendingRecordOdrMergeFailures.empty() &&
 
10714      PendingFunctionOdrMergeFailures.empty() &&
 
10715      PendingEnumOdrMergeFailures.empty() &&
 
10716      PendingObjCInterfaceOdrMergeFailures.empty() &&
 
10717      PendingObjCProtocolOdrMergeFailures.empty())
 
10724  auto OdrMergeFailures = std::move(PendingOdrMergeFailures);
 
10725  PendingOdrMergeFailures.clear();
 
10726  for (
auto &Merge : OdrMergeFailures) {
 
10727    Merge.first->buildLookup();
 
10728    Merge.first->decls_begin();
 
10729    Merge.first->bases_begin();
 
10730    Merge.first->vbases_begin();
 
10731    for (
auto &RecordPair : Merge.second) {
 
10732      auto *RD = RecordPair.first;
 
10740  auto RecordOdrMergeFailures = std::move(PendingRecordOdrMergeFailures);
 
10741  PendingRecordOdrMergeFailures.clear();
 
10742  for (
auto &Merge : RecordOdrMergeFailures) {
 
10743    Merge.first->decls_begin();
 
10744    for (
auto &D : Merge.second)
 
10749  auto ObjCInterfaceOdrMergeFailures =
 
10750      std::move(PendingObjCInterfaceOdrMergeFailures);
 
10751  PendingObjCInterfaceOdrMergeFailures.clear();
 
10752  for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
 
10753    Merge.first->decls_begin();
 
10754    for (
auto &InterfacePair : Merge.second)
 
10755      InterfacePair.first->decls_begin();
 
10759  auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures);
 
10760  PendingFunctionOdrMergeFailures.clear();
 
10761  for (
auto &Merge : FunctionOdrMergeFailures) {
 
10762    Merge.first->buildLookup();
 
10763    Merge.first->decls_begin();
 
10764    Merge.first->getBody();
 
10765    for (
auto &FD : Merge.second) {
 
10773  auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures);
 
10774  PendingEnumOdrMergeFailures.clear();
 
10775  for (
auto &Merge : EnumOdrMergeFailures) {
 
10776    Merge.first->decls_begin();
 
10777    for (
auto &
Enum : Merge.second) {
 
10778      Enum->decls_begin();
 
10783  auto ObjCProtocolOdrMergeFailures =
 
10784      std::move(PendingObjCProtocolOdrMergeFailures);
 
10785  PendingObjCProtocolOdrMergeFailures.clear();
 
10786  for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
 
10787    Merge.first->decls_begin();
 
10788    for (
auto &ProtocolPair : Merge.second)
 
10789      ProtocolPair.first->decls_begin();
 
10798  while (!PendingOdrMergeChecks.empty()) {
 
10799    NamedDecl *D = PendingOdrMergeChecks.pop_back_val();
 
10810    bool Found = 
false;
 
10813    for (
auto *RI : D->
redecls()) {
 
10814      if (RI->getLexicalDeclContext() == CanonDef) {
 
10828    llvm::SmallVector<const NamedDecl*, 4> Candidates;
 
10829    for (
auto *CanonMember : CanonDef->
decls()) {
 
10830      if (CanonMember->getCanonicalDecl() == DCanon) {
 
10839      if (
auto *ND = dyn_cast<NamedDecl>(CanonMember))
 
10841          Candidates.push_back(ND);
 
10854      std::string CanonDefModule =
 
10859        << CanonDef << CanonDefModule.empty() << CanonDefModule;
 
10861      if (Candidates.empty())
 
10863             diag::note_module_odr_violation_no_possible_decls) << D;
 
10865        for (
unsigned I = 0, N = Candidates.size(); I != N; ++I)
 
10866          Diag(Candidates[I]->getLocation(),
 
10867               diag::note_module_odr_violation_possible_decl)
 
10871      DiagnosedOdrMergeFailures.insert(CanonDef);
 
10875  if (OdrMergeFailures.empty() && RecordOdrMergeFailures.empty() &&
 
10876      FunctionOdrMergeFailures.empty() && EnumOdrMergeFailures.empty() &&
 
10877      ObjCInterfaceOdrMergeFailures.empty() &&
 
10878      ObjCProtocolOdrMergeFailures.empty())
 
10881  ODRDiagsEmitter DiagsEmitter(Diags, 
getContext(),
 
10885  for (
auto &Merge : OdrMergeFailures) {
 
10888    if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
 
10891    bool Diagnosed = 
false;
 
10892    CXXRecordDecl *FirstRecord = Merge.first;
 
10893    for (
auto &RecordPair : Merge.second) {
 
10894      if (DiagsEmitter.diagnoseMismatch(FirstRecord, RecordPair.first,
 
10895                                        RecordPair.second)) {
 
10908      Diag(Merge.first->getLocation(),
 
10909           diag::err_module_odr_violation_different_instantiations)
 
10916  for (
auto &Merge : RecordOdrMergeFailures) {
 
10919    if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
 
10922    RecordDecl *FirstRecord = Merge.first;
 
10923    bool Diagnosed = 
false;
 
10924    for (
auto *SecondRecord : Merge.second) {
 
10925      if (DiagsEmitter.diagnoseMismatch(FirstRecord, SecondRecord)) {
 
10931    assert(Diagnosed && 
"Unable to emit ODR diagnostic.");
 
10935  for (
auto &Merge : FunctionOdrMergeFailures) {
 
10936    FunctionDecl *FirstFunction = Merge.first;
 
10937    bool Diagnosed = 
false;
 
10938    for (
auto &SecondFunction : Merge.second) {
 
10939      if (DiagsEmitter.diagnoseMismatch(FirstFunction, SecondFunction)) {
 
10945    assert(Diagnosed && 
"Unable to emit ODR diagnostic.");
 
10949  for (
auto &Merge : EnumOdrMergeFailures) {
 
10952    if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
 
10955    EnumDecl *FirstEnum = Merge.first;
 
10956    bool Diagnosed = 
false;
 
10957    for (
auto &SecondEnum : Merge.second) {
 
10958      if (DiagsEmitter.diagnoseMismatch(FirstEnum, SecondEnum)) {
 
10964    assert(Diagnosed && 
"Unable to emit ODR diagnostic.");
 
10967  for (
auto &Merge : ObjCInterfaceOdrMergeFailures) {
 
10970    if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
 
10973    bool Diagnosed = 
false;
 
10974    ObjCInterfaceDecl *FirstID = Merge.first;
 
10975    for (
auto &InterfacePair : Merge.second) {
 
10976      if (DiagsEmitter.diagnoseMismatch(FirstID, InterfacePair.first,
 
10977                                        InterfacePair.second)) {
 
10983    assert(Diagnosed && 
"Unable to emit ODR diagnostic.");
 
10986  for (
auto &Merge : ObjCProtocolOdrMergeFailures) {
 
10989    if (!DiagnosedOdrMergeFailures.insert(Merge.first).second)
 
10992    ObjCProtocolDecl *FirstProtocol = Merge.first;
 
10993    bool Diagnosed = 
false;
 
10994    for (
auto &ProtocolPair : Merge.second) {
 
10995      if (DiagsEmitter.diagnoseMismatch(FirstProtocol, ProtocolPair.first,
 
10996                                        ProtocolPair.second)) {
 
11002    assert(Diagnosed && 
"Unable to emit ODR diagnostic.");
 
11007  if (llvm::Timer *
T = ReadTimer.get();
 
11008      ++NumCurrentElementsDeserializing == 1 && 
T)
 
11009    ReadTimeRegion.emplace(
T);
 
 
11013  assert(NumCurrentElementsDeserializing &&
 
11014         "FinishedDeserializing not paired with StartedDeserializing");
 
11015  if (NumCurrentElementsDeserializing == 1) {
 
11018    finishPendingActions();
 
11020  --NumCurrentElementsDeserializing;
 
11022  if (NumCurrentElementsDeserializing == 0) {
 
11026      SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
 
11034      while (!PendingExceptionSpecUpdates.empty() ||
 
11035             !PendingDeducedTypeUpdates.empty() ||
 
11036             !PendingUndeducedFunctionDecls.empty()) {
 
11037        auto ESUpdates = std::move(PendingExceptionSpecUpdates);
 
11038        PendingExceptionSpecUpdates.clear();
 
11039        for (
auto Update : ESUpdates) {
 
11040          ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
 
11043          if (
auto *Listener = 
getContext().getASTMutationListener())
 
11045          for (
auto *Redecl : 
Update.second->redecls())
 
11049        auto DTUpdates = std::move(PendingDeducedTypeUpdates);
 
11050        PendingDeducedTypeUpdates.clear();
 
11051        for (
auto Update : DTUpdates) {
 
11052          ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
 
11059        auto UDTUpdates = std::move(PendingUndeducedFunctionDecls);
 
11060        PendingUndeducedFunctionDecls.clear();
 
11064          (void)UndeducedFD->getMostRecentDecl();
 
11067      ReadTimeRegion.reset();
 
11069      diagnoseOdrViolations();
 
11075      PassInterestingDeclsToConsumer();
 
 
11082    auto It = PendingFakeLookupResults.find(II);
 
11083    if (It != PendingFakeLookupResults.end()) {
 
11084      for (
auto *ND : It->second)
 
11089      It->second.clear();
 
11093  if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) {
 
11094    SemaObj->TUScope->AddDecl(D);
 
11095  } 
else if (SemaObj->TUScope) {
 
11099    if (llvm::is_contained(SemaObj->IdResolver.decls(Name), D))
 
11100      SemaObj->TUScope->AddDecl(D);
 
11108                     ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
 
11109                     StringRef isysroot,
 
11111                     bool AllowASTWithCompilerErrors,
 
11112                     bool AllowConfigurationMismatch, 
bool ValidateSystemInputs,
 
11113                     bool ForceValidateUserInputs,
 
11114                     bool ValidateASTInputFilesContent, 
bool UseGlobalIndex,
 
11115                     std::unique_ptr<llvm::Timer> ReadTimer)
 
11120      PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()),
 
11121      StackHandler(Diags), PP(PP), ContextObj(Context),
 
11122      CodeGenOpts(CodeGenOpts),
 
11124                PP.getHeaderSearchInfo()),
 
11125      DummyIdResolver(PP), ReadTimer(
std::move(ReadTimer)), isysroot(isysroot),
 
11126      DisableValidationKind(DisableValidationKind),
 
11127      AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
 
11128      AllowConfigurationMismatch(AllowConfigurationMismatch),
 
11129      ValidateSystemInputs(ValidateSystemInputs),
 
11130      ForceValidateUserInputs(ForceValidateUserInputs),
 
11131      ValidateASTInputFilesContent(ValidateASTInputFilesContent),
 
11132      UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) {
 
11133  SourceMgr.setExternalSLocEntrySource(
this);
 
11135  PathBuf.reserve(256);
 
11137  for (
const auto &Ext : Extensions) {
 
11138    auto BlockName = Ext->getExtensionMetadata().BlockName;
 
11139    auto Known = ModuleFileExtensions.find(BlockName);
 
11140    if (Known != ModuleFileExtensions.end()) {
 
11141      Diags.Report(diag::warn_duplicate_module_file_extension)
 
11146    ModuleFileExtensions.insert({BlockName, Ext});
 
 
11151  if (OwnsDeserializationListener)
 
11152    delete DeserializationListener;
 
 
11156  return SemaObj ? SemaObj->IdResolver : DummyIdResolver;
 
 
11160                                               unsigned AbbrevID) {
 
11163  return Cursor.readRecord(AbbrevID, Record);
 
 
11179      : Record(Record), Context(Record.getContext()) {}
 
 
11180#define GEN_CLANG_CLAUSE_CLASS 
11181#define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C); 
11182#include "llvm/Frontend/OpenMP/OMP.inc" 
 
11196  switch (llvm::omp::Clause(Record.readInt())) {
 
11197  case llvm::omp::OMPC_if:
 
11200  case llvm::omp::OMPC_final:
 
11203  case llvm::omp::OMPC_num_threads:
 
11206  case llvm::omp::OMPC_safelen:
 
11209  case llvm::omp::OMPC_simdlen:
 
11212  case llvm::omp::OMPC_sizes: {
 
11213    unsigned NumSizes = Record.readInt();
 
11217  case llvm::omp::OMPC_permutation: {
 
11218    unsigned NumLoops = Record.readInt();
 
11222  case llvm::omp::OMPC_full:
 
11225  case llvm::omp::OMPC_partial:
 
11228  case llvm::omp::OMPC_looprange:
 
11231  case llvm::omp::OMPC_allocator:
 
11234  case llvm::omp::OMPC_collapse:
 
11237  case llvm::omp::OMPC_default:
 
11240  case llvm::omp::OMPC_proc_bind:
 
11243  case llvm::omp::OMPC_schedule:
 
11246  case llvm::omp::OMPC_ordered:
 
11249  case llvm::omp::OMPC_nowait:
 
11252  case llvm::omp::OMPC_untied:
 
11255  case llvm::omp::OMPC_mergeable:
 
11258  case llvm::omp::OMPC_threadset:
 
11261  case llvm::omp::OMPC_read:
 
11264  case llvm::omp::OMPC_write:
 
11267  case llvm::omp::OMPC_update:
 
11270  case llvm::omp::OMPC_capture:
 
11273  case llvm::omp::OMPC_compare:
 
11276  case llvm::omp::OMPC_fail:
 
11279  case llvm::omp::OMPC_seq_cst:
 
11282  case llvm::omp::OMPC_acq_rel:
 
11285  case llvm::omp::OMPC_absent: {
 
11286    unsigned NumKinds = Record.readInt();
 
11290  case llvm::omp::OMPC_holds:
 
11293  case llvm::omp::OMPC_contains: {
 
11294    unsigned NumKinds = Record.readInt();
 
11298  case llvm::omp::OMPC_no_openmp:
 
11301  case llvm::omp::OMPC_no_openmp_routines:
 
11304  case llvm::omp::OMPC_no_openmp_constructs:
 
11307  case llvm::omp::OMPC_no_parallelism:
 
11310  case llvm::omp::OMPC_acquire:
 
11313  case llvm::omp::OMPC_release:
 
11316  case llvm::omp::OMPC_relaxed:
 
11319  case llvm::omp::OMPC_weak:
 
11322  case llvm::omp::OMPC_threads:
 
11325  case llvm::omp::OMPC_simd:
 
11328  case llvm::omp::OMPC_nogroup:
 
11331  case llvm::omp::OMPC_unified_address:
 
11334  case llvm::omp::OMPC_unified_shared_memory:
 
11337  case llvm::omp::OMPC_reverse_offload:
 
11340  case llvm::omp::OMPC_dynamic_allocators:
 
11343  case llvm::omp::OMPC_atomic_default_mem_order:
 
11346  case llvm::omp::OMPC_self_maps:
 
11349  case llvm::omp::OMPC_at:
 
11352  case llvm::omp::OMPC_severity:
 
11355  case llvm::omp::OMPC_message:
 
11358  case llvm::omp::OMPC_private:
 
11361  case llvm::omp::OMPC_firstprivate:
 
11364  case llvm::omp::OMPC_lastprivate:
 
11367  case llvm::omp::OMPC_shared:
 
11370  case llvm::omp::OMPC_reduction: {
 
11371    unsigned N = Record.readInt();
 
11376  case llvm::omp::OMPC_task_reduction:
 
11379  case llvm::omp::OMPC_in_reduction:
 
11382  case llvm::omp::OMPC_linear:
 
11385  case llvm::omp::OMPC_aligned:
 
11388  case llvm::omp::OMPC_copyin:
 
11391  case llvm::omp::OMPC_copyprivate:
 
11394  case llvm::omp::OMPC_flush:
 
11397  case llvm::omp::OMPC_depobj:
 
11400  case llvm::omp::OMPC_depend: {
 
11401    unsigned NumVars = Record.readInt();
 
11402    unsigned NumLoops = Record.readInt();
 
11406  case llvm::omp::OMPC_device:
 
11409  case llvm::omp::OMPC_map: {
 
11411    Sizes.
NumVars = Record.readInt();
 
11418  case llvm::omp::OMPC_num_teams:
 
11421  case llvm::omp::OMPC_thread_limit:
 
11424  case llvm::omp::OMPC_priority:
 
11427  case llvm::omp::OMPC_grainsize:
 
11430  case llvm::omp::OMPC_num_tasks:
 
11433  case llvm::omp::OMPC_hint:
 
11436  case llvm::omp::OMPC_dist_schedule:
 
11439  case llvm::omp::OMPC_defaultmap:
 
11442  case llvm::omp::OMPC_to: {
 
11444    Sizes.
NumVars = Record.readInt();
 
11451  case llvm::omp::OMPC_from: {
 
11453    Sizes.
NumVars = Record.readInt();
 
11460  case llvm::omp::OMPC_use_device_ptr: {
 
11462    Sizes.
NumVars = Record.readInt();
 
11469  case llvm::omp::OMPC_use_device_addr: {
 
11471    Sizes.
NumVars = Record.readInt();
 
11478  case llvm::omp::OMPC_is_device_ptr: {
 
11480    Sizes.
NumVars = Record.readInt();
 
11487  case llvm::omp::OMPC_has_device_addr: {
 
11489    Sizes.
NumVars = Record.readInt();
 
11496  case llvm::omp::OMPC_allocate:
 
11499  case llvm::omp::OMPC_nontemporal:
 
11502  case llvm::omp::OMPC_inclusive:
 
11505  case llvm::omp::OMPC_exclusive:
 
11508  case llvm::omp::OMPC_order:
 
11511  case llvm::omp::OMPC_init:
 
11514  case llvm::omp::OMPC_use:
 
11517  case llvm::omp::OMPC_destroy:
 
11520  case llvm::omp::OMPC_novariants:
 
11523  case llvm::omp::OMPC_nocontext:
 
11526  case llvm::omp::OMPC_detach:
 
11529  case llvm::omp::OMPC_uses_allocators:
 
11532  case llvm::omp::OMPC_affinity:
 
11535  case llvm::omp::OMPC_filter:
 
11538  case llvm::omp::OMPC_bind:
 
11541  case llvm::omp::OMPC_align:
 
11544  case llvm::omp::OMPC_ompx_dyn_cgroup_mem:
 
11547  case llvm::omp::OMPC_doacross: {
 
11548    unsigned NumVars = Record.readInt();
 
11549    unsigned NumLoops = Record.readInt();
 
11553  case llvm::omp::OMPC_ompx_attribute:
 
11556  case llvm::omp::OMPC_ompx_bare:
 
11559#define OMP_CLAUSE_NO_CLASS(Enum, Str)                                         \ 
11560  case llvm::omp::Enum:                                                        \ 
11562#include "llvm/Frontend/OpenMP/OMPKinds.def" 
11566  assert(
C && 
"Unknown OMPClause type");
 
11569  C->setLocStart(Record.readSourceLocation());
 
11570  C->setLocEnd(Record.readSourceLocation());
 
 
11576  C->setPreInitStmt(Record.readSubStmt(),
 
 
11582  C->setPostUpdateExpr(Record.readSubExpr());
 
 
11585void OMPClauseReader::VisitOMPIfClause(
OMPIfClause *
C) {
 
11588  C->setNameModifierLoc(
Record.readSourceLocation());
 
11589  C->setColonLoc(
Record.readSourceLocation());
 
11590  C->setCondition(
Record.readSubExpr());
 
11591  C->setLParenLoc(
Record.readSourceLocation());
 
11596  C->setCondition(
Record.readSubExpr());
 
11597  C->setLParenLoc(
Record.readSourceLocation());
 
11603  C->setNumThreads(Record.readSubExpr());
 
11604  C->setModifierLoc(Record.readSourceLocation());
 
11605  C->setLParenLoc(Record.readSourceLocation());
 
11609  C->setSafelen(Record.readSubExpr());
 
11610  C->setLParenLoc(Record.readSourceLocation());
 
11614  C->setSimdlen(Record.readSubExpr());
 
11615  C->setLParenLoc(Record.readSourceLocation());
 
11619  for (Expr *&E : 
C->getSizesRefs())
 
11620    E = Record.readSubExpr();
 
11621  C->setLParenLoc(Record.readSourceLocation());
 
11625  for (Expr *&E : 
C->getArgsRefs())
 
11626    E = Record.readSubExpr();
 
11627  C->setLParenLoc(Record.readSourceLocation());
 
11633  C->setFactor(Record.readSubExpr());
 
11634  C->setLParenLoc(Record.readSourceLocation());
 
11638  C->setFirst(Record.readSubExpr());
 
11639  C->setCount(Record.readSubExpr());
 
11640  C->setLParenLoc(Record.readSourceLocation());
 
11641  C->setFirstLoc(Record.readSourceLocation());
 
11642  C->setCountLoc(Record.readSourceLocation());
 
11646  C->setAllocator(Record.readExpr());
 
11647  C->setLParenLoc(Record.readSourceLocation());
 
11651  C->setNumForLoops(Record.readSubExpr());
 
11652  C->setLParenLoc(Record.readSourceLocation());
 
11656  C->setDefaultKind(
static_cast<llvm::omp::DefaultKind
>(Record.readInt()));
 
11657  C->setLParenLoc(Record.readSourceLocation());
 
11658  C->setDefaultKindKwLoc(Record.readSourceLocation());
 
11659  C->setDefaultVariableCategory(
 
11661  C->setDefaultVariableCategoryLocation(Record.readSourceLocation());
 
11667  C->setLParenLoc(Record.readSourceLocation());
 
11668  SourceLocation ThreadsetKindLoc = Record.readSourceLocation();
 
11669  C->setThreadsetKindLoc(ThreadsetKindLoc);
 
11672  C->setThreadsetKind(TKind);
 
11676  C->setProcBindKind(
static_cast<llvm::omp::ProcBindKind
>(Record.readInt()));
 
11677  C->setLParenLoc(Record.readSourceLocation());
 
11678  C->setProcBindKindKwLoc(Record.readSourceLocation());
 
11683  C->setScheduleKind(
 
11685  C->setFirstScheduleModifier(
 
11687  C->setSecondScheduleModifier(
 
11689  C->setChunkSize(Record.readSubExpr());
 
11690  C->setLParenLoc(Record.readSourceLocation());
 
11691  C->setFirstScheduleModifierLoc(Record.readSourceLocation());
 
11692  C->setSecondScheduleModifierLoc(Record.readSourceLocation());
 
11693  C->setScheduleKindLoc(Record.readSourceLocation());
 
11694  C->setCommaLoc(Record.readSourceLocation());
 
11698  C->setNumForLoops(Record.readSubExpr());
 
11699  for (
unsigned I = 0, E = 
C->NumberOfLoops; I < E; ++I)
 
11700    C->setLoopNumIterations(I, Record.readSubExpr());
 
11701  for (
unsigned I = 0, E = 
C->NumberOfLoops; I < E; ++I)
 
11702    C->setLoopCounter(I, Record.readSubExpr());
 
11703  C->setLParenLoc(Record.readSourceLocation());
 
11707  C->setEventHandler(Record.readSubExpr());
 
11708  C->setLParenLoc(Record.readSourceLocation());
 
11712  C->setCondition(Record.readSubExpr());
 
11713  C->setLParenLoc(Record.readSourceLocation());
 
11720void OMPClauseReader::VisitOMPReadClause(
OMPReadClause *) {}
 
11725  if (
C->isExtended()) {
 
11726    C->setLParenLoc(Record.readSourceLocation());
 
11727    C->setArgumentLoc(Record.readSourceLocation());
 
11739  C->setLParenLoc(Record.readSourceLocation());
 
11740  SourceLocation FailParameterLoc = Record.readSourceLocation();
 
11741  C->setFailParameterLoc(FailParameterLoc);
 
11743  C->setFailParameter(CKind);
 
11747  unsigned Count = 
C->getDirectiveKinds().size();
 
11748  C->setLParenLoc(Record.readSourceLocation());
 
11749  llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
 
11750  DKVec.reserve(Count);
 
11751  for (
unsigned I = 0; I < Count; I++) {
 
11754  C->setDirectiveKinds(DKVec);
 
11758  C->setExpr(Record.readExpr());
 
11759  C->setLParenLoc(Record.readSourceLocation());
 
11763  unsigned Count = 
C->getDirectiveKinds().size();
 
11764  C->setLParenLoc(Record.readSourceLocation());
 
11765  llvm::SmallVector<OpenMPDirectiveKind, 4> DKVec;
 
11766  DKVec.reserve(Count);
 
11767  for (
unsigned I = 0; I < Count; I++) {
 
11770  C->setDirectiveKinds(DKVec);
 
11775void OMPClauseReader::VisitOMPNoOpenMPRoutinesClause(
 
11778void OMPClauseReader::VisitOMPNoOpenMPConstructsClause(
 
11793void OMPClauseReader::VisitOMPWeakClause(
OMPWeakClause *) {}
 
11797void OMPClauseReader::VisitOMPSIMDClause(
OMPSIMDClause *) {}
 
11802  unsigned NumVars = 
C->varlist_size();
 
11803  SmallVector<Expr *, 16> Vars;
 
11804  Vars.reserve(NumVars);
 
11805  for (
unsigned I = 0; I != NumVars; ++I)
 
11806    Vars.push_back(Record.readSubExpr());
 
11807  C->setVarRefs(Vars);
 
11808  C->setIsTarget(Record.readBool());
 
11809  C->setIsTargetSync(Record.readBool());
 
11810  C->setLParenLoc(Record.readSourceLocation());
 
11811  C->setVarLoc(Record.readSourceLocation());
 
11815  C->setInteropVar(Record.readSubExpr());
 
11816  C->setLParenLoc(Record.readSourceLocation());
 
11817  C->setVarLoc(Record.readSourceLocation());
 
11821  C->setInteropVar(Record.readSubExpr());
 
11822  C->setLParenLoc(Record.readSourceLocation());
 
11823  C->setVarLoc(Record.readSourceLocation());
 
11828  C->setCondition(Record.readSubExpr());
 
11829  C->setLParenLoc(Record.readSourceLocation());
 
11834  C->setCondition(Record.readSubExpr());
 
11835  C->setLParenLoc(Record.readSourceLocation());
 
11840void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause(
 
11849void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause(
 
11851  C->setAtomicDefaultMemOrderKind(
 
11853  C->setLParenLoc(Record.readSourceLocation());
 
11854  C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation());
 
11859void OMPClauseReader::VisitOMPAtClause(
OMPAtClause *
C) {
 
11861  C->setLParenLoc(Record.readSourceLocation());
 
11862  C->setAtKindKwLoc(Record.readSourceLocation());
 
11867  C->setLParenLoc(Record.readSourceLocation());
 
11868  C->setSeverityKindKwLoc(Record.readSourceLocation());
 
11873  C->setMessageString(Record.readSubExpr());
 
11874  C->setLParenLoc(Record.readSourceLocation());
 
11878  C->setLParenLoc(Record.readSourceLocation());
 
11879  unsigned NumVars = 
C->varlist_size();
 
11880  SmallVector<Expr *, 16> Vars;
 
11881  Vars.reserve(NumVars);
 
11882  for (
unsigned i = 0; i != NumVars; ++i)
 
11883    Vars.push_back(Record.readSubExpr());
 
11884  C->setVarRefs(Vars);
 
11886  for (
unsigned i = 0; i != NumVars; ++i)
 
11887    Vars.push_back(Record.readSubExpr());
 
11888  C->setPrivateCopies(Vars);
 
11893  C->setLParenLoc(Record.readSourceLocation());
 
11894  unsigned NumVars = 
C->varlist_size();
 
11895  SmallVector<Expr *, 16> Vars;
 
11896  Vars.reserve(NumVars);
 
11897  for (
unsigned i = 0; i != NumVars; ++i)
 
11898    Vars.push_back(Record.readSubExpr());
 
11899  C->setVarRefs(Vars);
 
11901  for (
unsigned i = 0; i != NumVars; ++i)
 
11902    Vars.push_back(Record.readSubExpr());
 
11903  C->setPrivateCopies(Vars);
 
11905  for (
unsigned i = 0; i != NumVars; ++i)
 
11906    Vars.push_back(Record.readSubExpr());
 
11912  C->setLParenLoc(Record.readSourceLocation());
 
11914  C->setKindLoc(Record.readSourceLocation());
 
11915  C->setColonLoc(Record.readSourceLocation());
 
11916  unsigned NumVars = 
C->varlist_size();
 
11917  SmallVector<Expr *, 16> Vars;
 
11918  Vars.reserve(NumVars);
 
11919  for (
unsigned i = 0; i != NumVars; ++i)
 
11920    Vars.push_back(Record.readSubExpr());
 
11921  C->setVarRefs(Vars);
 
11923  for (
unsigned i = 0; i != NumVars; ++i)
 
11924    Vars.push_back(Record.readSubExpr());
 
11925  C->setPrivateCopies(Vars);
 
11927  for (
unsigned i = 0; i != NumVars; ++i)
 
11928    Vars.push_back(Record.readSubExpr());
 
11929  C->setSourceExprs(Vars);
 
11931  for (
unsigned i = 0; i != NumVars; ++i)
 
11932    Vars.push_back(Record.readSubExpr());
 
11933  C->setDestinationExprs(Vars);
 
11935  for (
unsigned i = 0; i != NumVars; ++i)
 
11936    Vars.push_back(Record.readSubExpr());
 
11937  C->setAssignmentOps(Vars);
 
11941  C->setLParenLoc(Record.readSourceLocation());
 
11942  unsigned NumVars = 
C->varlist_size();
 
11943  SmallVector<Expr *, 16> Vars;
 
11944  Vars.reserve(NumVars);
 
11945  for (
unsigned i = 0; i != NumVars; ++i)
 
11946    Vars.push_back(Record.readSubExpr());
 
11947  C->setVarRefs(Vars);
 
11952  C->setLParenLoc(Record.readSourceLocation());
 
11953  C->setModifierLoc(Record.readSourceLocation());
 
11954  C->setColonLoc(Record.readSourceLocation());
 
11955  NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
 
11956  DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
 
11957  C->setQualifierLoc(NNSL);
 
11958  C->setNameInfo(DNI);
 
11960  unsigned NumVars = 
C->varlist_size();
 
11961  SmallVector<Expr *, 16> Vars;
 
11962  Vars.reserve(NumVars);
 
11963  for (
unsigned i = 0; i != NumVars; ++i)
 
11964    Vars.push_back(Record.readSubExpr());
 
11965  C->setVarRefs(Vars);
 
11967  for (
unsigned i = 0; i != NumVars; ++i)
 
11968    Vars.push_back(Record.readSubExpr());
 
11969  C->setPrivates(Vars);
 
11971  for (
unsigned i = 0; i != NumVars; ++i)
 
11972    Vars.push_back(Record.readSubExpr());
 
11973  C->setLHSExprs(Vars);
 
11975  for (
unsigned i = 0; i != NumVars; ++i)
 
11976    Vars.push_back(Record.readSubExpr());
 
11977  C->setRHSExprs(Vars);
 
11979  for (
unsigned i = 0; i != NumVars; ++i)
 
11980    Vars.push_back(Record.readSubExpr());
 
11981  C->setReductionOps(Vars);
 
11982  if (
C->getModifier() == OMPC_REDUCTION_inscan) {
 
11984    for (
unsigned i = 0; i != NumVars; ++i)
 
11985      Vars.push_back(Record.readSubExpr());
 
11986    C->setInscanCopyOps(Vars);
 
11988    for (
unsigned i = 0; i != NumVars; ++i)
 
11989      Vars.push_back(Record.readSubExpr());
 
11990    C->setInscanCopyArrayTemps(Vars);
 
11992    for (
unsigned i = 0; i != NumVars; ++i)
 
11993      Vars.push_back(Record.readSubExpr());
 
11994    C->setInscanCopyArrayElems(Vars);
 
11996  unsigned NumFlags = Record.readInt();
 
11997  SmallVector<bool, 16> Flags;
 
11998  Flags.reserve(NumFlags);
 
11999  for ([[maybe_unused]] 
unsigned I : llvm::seq<unsigned>(NumFlags))
 
12000    Flags.push_back(Record.readInt());
 
12001  C->setPrivateVariableReductionFlags(Flags);
 
12006  C->setLParenLoc(Record.readSourceLocation());
 
12007  C->setColonLoc(Record.readSourceLocation());
 
12008  NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
 
12009  DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
 
12010  C->setQualifierLoc(NNSL);
 
12011  C->setNameInfo(DNI);
 
12013  unsigned NumVars = 
C->varlist_size();
 
12014  SmallVector<Expr *, 16> Vars;
 
12015  Vars.reserve(NumVars);
 
12016  for (
unsigned I = 0; I != NumVars; ++I)
 
12017    Vars.push_back(Record.readSubExpr());
 
12018  C->setVarRefs(Vars);
 
12020  for (
unsigned I = 0; I != NumVars; ++I)
 
12021    Vars.push_back(Record.readSubExpr());
 
12022  C->setPrivates(Vars);
 
12024  for (
unsigned I = 0; I != NumVars; ++I)
 
12025    Vars.push_back(Record.readSubExpr());
 
12026  C->setLHSExprs(Vars);
 
12028  for (
unsigned I = 0; I != NumVars; ++I)
 
12029    Vars.push_back(Record.readSubExpr());
 
12030  C->setRHSExprs(Vars);
 
12032  for (
unsigned I = 0; I != NumVars; ++I)
 
12033    Vars.push_back(Record.readSubExpr());
 
12034  C->setReductionOps(Vars);
 
12039  C->setLParenLoc(Record.readSourceLocation());
 
12040  C->setColonLoc(Record.readSourceLocation());
 
12041  NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc();
 
12042  DeclarationNameInfo DNI = Record.readDeclarationNameInfo();
 
12043  C->setQualifierLoc(NNSL);
 
12044  C->setNameInfo(DNI);
 
12046  unsigned NumVars = 
C->varlist_size();
 
12047  SmallVector<Expr *, 16> Vars;
 
12048  Vars.reserve(NumVars);
 
12049  for (
unsigned I = 0; I != NumVars; ++I)
 
12050    Vars.push_back(Record.readSubExpr());
 
12051  C->setVarRefs(Vars);
 
12053  for (
unsigned I = 0; I != NumVars; ++I)
 
12054    Vars.push_back(Record.readSubExpr());
 
12055  C->setPrivates(Vars);
 
12057  for (
unsigned I = 0; I != NumVars; ++I)
 
12058    Vars.push_back(Record.readSubExpr());
 
12059  C->setLHSExprs(Vars);
 
12061  for (
unsigned I = 0; I != NumVars; ++I)
 
12062    Vars.push_back(Record.readSubExpr());
 
12063  C->setRHSExprs(Vars);
 
12065  for (
unsigned I = 0; I != NumVars; ++I)
 
12066    Vars.push_back(Record.readSubExpr());
 
12067  C->setReductionOps(Vars);
 
12069  for (
unsigned I = 0; I != NumVars; ++I)
 
12070    Vars.push_back(Record.readSubExpr());
 
12071  C->setTaskgroupDescriptors(Vars);
 
12076  C->setLParenLoc(Record.readSourceLocation());
 
12077  C->setColonLoc(Record.readSourceLocation());
 
12079  C->setModifierLoc(Record.readSourceLocation());
 
12080  unsigned NumVars = 
C->varlist_size();
 
12081  SmallVector<Expr *, 16> Vars;
 
12082  Vars.reserve(NumVars);
 
12083  for (
unsigned i = 0; i != NumVars; ++i)
 
12084    Vars.push_back(Record.readSubExpr());
 
12085  C->setVarRefs(Vars);
 
12087  for (
unsigned i = 0; i != NumVars; ++i)
 
12088    Vars.push_back(Record.readSubExpr());
 
12089  C->setPrivates(Vars);
 
12091  for (
unsigned i = 0; i != NumVars; ++i)
 
12092    Vars.push_back(Record.readSubExpr());
 
12095  for (
unsigned i = 0; i != NumVars; ++i)
 
12096    Vars.push_back(Record.readSubExpr());
 
12097  C->setUpdates(Vars);
 
12099  for (
unsigned i = 0; i != NumVars; ++i)
 
12100    Vars.push_back(Record.readSubExpr());
 
12101  C->setFinals(Vars);
 
12102  C->setStep(Record.readSubExpr());
 
12103  C->setCalcStep(Record.readSubExpr());
 
12105  for (
unsigned I = 0; I != NumVars + 1; ++I)
 
12106    Vars.push_back(Record.readSubExpr());
 
12107  C->setUsedExprs(Vars);
 
12111  C->setLParenLoc(Record.readSourceLocation());
 
12112  C->setColonLoc(Record.readSourceLocation());
 
12113  unsigned NumVars = 
C->varlist_size();
 
12114  SmallVector<Expr *, 16> Vars;
 
12115  Vars.reserve(NumVars);
 
12116  for (
unsigned i = 0; i != NumVars; ++i)
 
12117    Vars.push_back(Record.readSubExpr());
 
12118  C->setVarRefs(Vars);
 
12119  C->setAlignment(Record.readSubExpr());
 
12123  C->setLParenLoc(Record.readSourceLocation());
 
12124  unsigned NumVars = 
C->varlist_size();
 
12125  SmallVector<Expr *, 16> Exprs;
 
12126  Exprs.reserve(NumVars);
 
12127  for (
unsigned i = 0; i != NumVars; ++i)
 
12128    Exprs.push_back(Record.readSubExpr());
 
12129  C->setVarRefs(Exprs);
 
12131  for (
unsigned i = 0; i != NumVars; ++i)
 
12132    Exprs.push_back(Record.readSubExpr());
 
12133  C->setSourceExprs(Exprs);
 
12135  for (
unsigned i = 0; i != NumVars; ++i)
 
12136    Exprs.push_back(Record.readSubExpr());
 
12137  C->setDestinationExprs(Exprs);
 
12139  for (
unsigned i = 0; i != NumVars; ++i)
 
12140    Exprs.push_back(Record.readSubExpr());
 
12141  C->setAssignmentOps(Exprs);
 
12145  C->setLParenLoc(Record.readSourceLocation());
 
12146  unsigned NumVars = 
C->varlist_size();
 
12147  SmallVector<Expr *, 16> Exprs;
 
12148  Exprs.reserve(NumVars);
 
12149  for (
unsigned i = 0; i != NumVars; ++i)
 
12150    Exprs.push_back(Record.readSubExpr());
 
12151  C->setVarRefs(Exprs);
 
12153  for (
unsigned i = 0; i != NumVars; ++i)
 
12154    Exprs.push_back(Record.readSubExpr());
 
12155  C->setSourceExprs(Exprs);
 
12157  for (
unsigned i = 0; i != NumVars; ++i)
 
12158    Exprs.push_back(Record.readSubExpr());
 
12159  C->setDestinationExprs(Exprs);
 
12161  for (
unsigned i = 0; i != NumVars; ++i)
 
12162    Exprs.push_back(Record.readSubExpr());
 
12163  C->setAssignmentOps(Exprs);
 
12167  C->setLParenLoc(Record.readSourceLocation());
 
12168  unsigned NumVars = 
C->varlist_size();
 
12169  SmallVector<Expr *, 16> Vars;
 
12170  Vars.reserve(NumVars);
 
12171  for (
unsigned i = 0; i != NumVars; ++i)
 
12172    Vars.push_back(Record.readSubExpr());
 
12173  C->setVarRefs(Vars);
 
12177  C->setDepobj(Record.readSubExpr());
 
12178  C->setLParenLoc(Record.readSourceLocation());
 
12182  C->setLParenLoc(Record.readSourceLocation());
 
12183  C->setModifier(Record.readSubExpr());
 
12184  C->setDependencyKind(
 
12186  C->setDependencyLoc(Record.readSourceLocation());
 
12187  C->setColonLoc(Record.readSourceLocation());
 
12188  C->setOmpAllMemoryLoc(Record.readSourceLocation());
 
12189  unsigned NumVars = 
C->varlist_size();
 
12190  SmallVector<Expr *, 16> Vars;
 
12191  Vars.reserve(NumVars);
 
12192  for (
unsigned I = 0; I != NumVars; ++I)
 
12193    Vars.push_back(Record.readSubExpr());
 
12194  C->setVarRefs(Vars);
 
12195  for (
unsigned I = 0, E = 
C->getNumLoops(); I < E; ++I)
 
12196    C->setLoopData(I, Record.readSubExpr());
 
12202  C->setDevice(Record.readSubExpr());
 
12203  C->setModifierLoc(Record.readSourceLocation());
 
12204  C->setLParenLoc(Record.readSourceLocation());
 
12208  C->setLParenLoc(Record.readSourceLocation());
 
12209  bool HasIteratorModifier = 
false;
 
12211    C->setMapTypeModifier(
 
12213    C->setMapTypeModifierLoc(I, Record.readSourceLocation());
 
12214    if (
C->getMapTypeModifier(I) == OMPC_MAP_MODIFIER_iterator)
 
12215      HasIteratorModifier = 
true;
 
12217  C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
 
12218  C->setMapperIdInfo(Record.readDeclarationNameInfo());
 
12221  C->setMapLoc(Record.readSourceLocation());
 
12222  C->setColonLoc(Record.readSourceLocation());
 
12223  auto NumVars = 
C->varlist_size();
 
12224  auto UniqueDecls = 
C->getUniqueDeclarationsNum();
 
12225  auto TotalLists = 
C->getTotalComponentListNum();
 
12226  auto TotalComponents = 
C->getTotalComponentsNum();
 
12228  SmallVector<Expr *, 16> Vars;
 
12229  Vars.reserve(NumVars);
 
12230  for (
unsigned i = 0; i != NumVars; ++i)
 
12231    Vars.push_back(Record.readExpr());
 
12232  C->setVarRefs(Vars);
 
12234  SmallVector<Expr *, 16> UDMappers;
 
12235  UDMappers.reserve(NumVars);
 
12236  for (
unsigned I = 0; I < NumVars; ++I)
 
12237    UDMappers.push_back(Record.readExpr());
 
12238  C->setUDMapperRefs(UDMappers);
 
12240  if (HasIteratorModifier)
 
12241    C->setIteratorModifier(Record.readExpr());
 
12243  SmallVector<ValueDecl *, 16> Decls;
 
12244  Decls.reserve(UniqueDecls);
 
12245  for (
unsigned i = 0; i < UniqueDecls; ++i)
 
12246    Decls.push_back(Record.readDeclAs<ValueDecl>());
 
12247  C->setUniqueDecls(Decls);
 
12249  SmallVector<unsigned, 16> ListsPerDecl;
 
12250  ListsPerDecl.reserve(UniqueDecls);
 
12251  for (
unsigned i = 0; i < UniqueDecls; ++i)
 
12252    ListsPerDecl.push_back(Record.readInt());
 
12253  C->setDeclNumLists(ListsPerDecl);
 
12255  SmallVector<unsigned, 32> ListSizes;
 
12256  ListSizes.reserve(TotalLists);
 
12257  for (
unsigned i = 0; i < TotalLists; ++i)
 
12258    ListSizes.push_back(Record.readInt());
 
12259  C->setComponentListSizes(ListSizes);
 
12261  SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
 
12262  Components.reserve(TotalComponents);
 
12263  for (
unsigned i = 0; i < TotalComponents; ++i) {
 
12264    Expr *AssociatedExprPr = Record.readExpr();
 
12265    auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
 
12266    Components.emplace_back(AssociatedExprPr, AssociatedDecl,
 
12269  C->setComponents(Components, ListSizes);
 
12275  C->setLParenLoc(Record.readSourceLocation());
 
12276  C->setColonLoc(Record.readSourceLocation());
 
12277  C->setAllocator(Record.readSubExpr());
 
12278  C->setAlignment(Record.readSubExpr());
 
12279  unsigned NumVars = 
C->varlist_size();
 
12280  SmallVector<Expr *, 16> Vars;
 
12281  Vars.reserve(NumVars);
 
12282  for (
unsigned i = 0; i != NumVars; ++i)
 
12283    Vars.push_back(Record.readSubExpr());
 
12284  C->setVarRefs(Vars);
 
12289  C->setLParenLoc(Record.readSourceLocation());
 
12290  unsigned NumVars = 
C->varlist_size();
 
12291  SmallVector<Expr *, 16> Vars;
 
12292  Vars.reserve(NumVars);
 
12293  for (
unsigned I = 0; I != NumVars; ++I)
 
12294    Vars.push_back(Record.readSubExpr());
 
12295  C->setVarRefs(Vars);
 
12300  C->setLParenLoc(Record.readSourceLocation());
 
12301  unsigned NumVars = 
C->varlist_size();
 
12302  SmallVector<Expr *, 16> Vars;
 
12303  Vars.reserve(NumVars);
 
12304  for (
unsigned I = 0; I != NumVars; ++I)
 
12305    Vars.push_back(Record.readSubExpr());
 
12306  C->setVarRefs(Vars);
 
12311  C->setPriority(Record.readSubExpr());
 
12312  C->setLParenLoc(Record.readSourceLocation());
 
12318  C->setGrainsize(Record.readSubExpr());
 
12319  C->setModifierLoc(Record.readSourceLocation());
 
12320  C->setLParenLoc(Record.readSourceLocation());
 
12326  C->setNumTasks(Record.readSubExpr());
 
12327  C->setModifierLoc(Record.readSourceLocation());
 
12328  C->setLParenLoc(Record.readSourceLocation());
 
12332  C->setHint(Record.readSubExpr());
 
12333  C->setLParenLoc(Record.readSourceLocation());
 
12338  C->setDistScheduleKind(
 
12340  C->setChunkSize(Record.readSubExpr());
 
12341  C->setLParenLoc(Record.readSourceLocation());
 
12342  C->setDistScheduleKindLoc(Record.readSourceLocation());
 
12343  C->setCommaLoc(Record.readSourceLocation());
 
12347  C->setDefaultmapKind(
 
12349  C->setDefaultmapModifier(
 
12351  C->setLParenLoc(Record.readSourceLocation());
 
12352  C->setDefaultmapModifierLoc(Record.readSourceLocation());
 
12353  C->setDefaultmapKindLoc(Record.readSourceLocation());
 
12356void OMPClauseReader::VisitOMPToClause(
OMPToClause *
C) {
 
12357  C->setLParenLoc(Record.readSourceLocation());
 
12359    C->setMotionModifier(
 
12361    C->setMotionModifierLoc(I, Record.readSourceLocation());
 
12363  C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
 
12364  C->setMapperIdInfo(Record.readDeclarationNameInfo());
 
12365  C->setColonLoc(Record.readSourceLocation());
 
12366  auto NumVars = 
C->varlist_size();
 
12367  auto UniqueDecls = 
C->getUniqueDeclarationsNum();
 
12368  auto TotalLists = 
C->getTotalComponentListNum();
 
12369  auto TotalComponents = 
C->getTotalComponentsNum();
 
12371  SmallVector<Expr *, 16> Vars;
 
12372  Vars.reserve(NumVars);
 
12373  for (
unsigned i = 0; i != NumVars; ++i)
 
12374    Vars.push_back(Record.readSubExpr());
 
12375  C->setVarRefs(Vars);
 
12377  SmallVector<Expr *, 16> UDMappers;
 
12378  UDMappers.reserve(NumVars);
 
12379  for (
unsigned I = 0; I < NumVars; ++I)
 
12380    UDMappers.push_back(Record.readSubExpr());
 
12381  C->setUDMapperRefs(UDMappers);
 
12383  SmallVector<ValueDecl *, 16> Decls;
 
12384  Decls.reserve(UniqueDecls);
 
12385  for (
unsigned i = 0; i < UniqueDecls; ++i)
 
12386    Decls.push_back(Record.readDeclAs<ValueDecl>());
 
12387  C->setUniqueDecls(Decls);
 
12389  SmallVector<unsigned, 16> ListsPerDecl;
 
12390  ListsPerDecl.reserve(UniqueDecls);
 
12391  for (
unsigned i = 0; i < UniqueDecls; ++i)
 
12392    ListsPerDecl.push_back(Record.readInt());
 
12393  C->setDeclNumLists(ListsPerDecl);
 
12395  SmallVector<unsigned, 32> ListSizes;
 
12396  ListSizes.reserve(TotalLists);
 
12397  for (
unsigned i = 0; i < TotalLists; ++i)
 
12398    ListSizes.push_back(Record.readInt());
 
12399  C->setComponentListSizes(ListSizes);
 
12401  SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
 
12402  Components.reserve(TotalComponents);
 
12403  for (
unsigned i = 0; i < TotalComponents; ++i) {
 
12404    Expr *AssociatedExprPr = Record.readSubExpr();
 
12405    bool IsNonContiguous = Record.readBool();
 
12406    auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
 
12407    Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
 
12409  C->setComponents(Components, ListSizes);
 
12413  C->setLParenLoc(Record.readSourceLocation());
 
12415    C->setMotionModifier(
 
12417    C->setMotionModifierLoc(I, Record.readSourceLocation());
 
12419  C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc());
 
12420  C->setMapperIdInfo(Record.readDeclarationNameInfo());
 
12421  C->setColonLoc(Record.readSourceLocation());
 
12422  auto NumVars = 
C->varlist_size();
 
12423  auto UniqueDecls = 
C->getUniqueDeclarationsNum();
 
12424  auto TotalLists = 
C->getTotalComponentListNum();
 
12425  auto TotalComponents = 
C->getTotalComponentsNum();
 
12427  SmallVector<Expr *, 16> Vars;
 
12428  Vars.reserve(NumVars);
 
12429  for (
unsigned i = 0; i != NumVars; ++i)
 
12430    Vars.push_back(Record.readSubExpr());
 
12431  C->setVarRefs(Vars);
 
12433  SmallVector<Expr *, 16> UDMappers;
 
12434  UDMappers.reserve(NumVars);
 
12435  for (
unsigned I = 0; I < NumVars; ++I)
 
12436    UDMappers.push_back(Record.readSubExpr());
 
12437  C->setUDMapperRefs(UDMappers);
 
12439  SmallVector<ValueDecl *, 16> Decls;
 
12440  Decls.reserve(UniqueDecls);
 
12441  for (
unsigned i = 0; i < UniqueDecls; ++i)
 
12442    Decls.push_back(Record.readDeclAs<ValueDecl>());
 
12443  C->setUniqueDecls(Decls);
 
12445  SmallVector<unsigned, 16> ListsPerDecl;
 
12446  ListsPerDecl.reserve(UniqueDecls);
 
12447  for (
unsigned i = 0; i < UniqueDecls; ++i)
 
12448    ListsPerDecl.push_back(Record.readInt());
 
12449  C->setDeclNumLists(ListsPerDecl);
 
12451  SmallVector<unsigned, 32> ListSizes;
 
12452  ListSizes.reserve(TotalLists);
 
12453  for (
unsigned i = 0; i < TotalLists; ++i)
 
12454    ListSizes.push_back(Record.readInt());
 
12455  C->setComponentListSizes(ListSizes);
 
12457  SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
 
12458  Components.reserve(TotalComponents);
 
12459  for (
unsigned i = 0; i < TotalComponents; ++i) {
 
12460    Expr *AssociatedExprPr = Record.readSubExpr();
 
12461    bool IsNonContiguous = Record.readBool();
 
12462    auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
 
12463    Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous);
 
12465  C->setComponents(Components, ListSizes);
 
12469  C->setLParenLoc(Record.readSourceLocation());
 
12470  auto NumVars = 
C->varlist_size();
 
12471  auto UniqueDecls = 
C->getUniqueDeclarationsNum();
 
12472  auto TotalLists = 
C->getTotalComponentListNum();
 
12473  auto TotalComponents = 
C->getTotalComponentsNum();
 
12475  SmallVector<Expr *, 16> Vars;
 
12476  Vars.reserve(NumVars);
 
12477  for (
unsigned i = 0; i != NumVars; ++i)
 
12478    Vars.push_back(Record.readSubExpr());
 
12479  C->setVarRefs(Vars);
 
12481  for (
unsigned i = 0; i != NumVars; ++i)
 
12482    Vars.push_back(Record.readSubExpr());
 
12483  C->setPrivateCopies(Vars);
 
12485  for (
unsigned i = 0; i != NumVars; ++i)
 
12486    Vars.push_back(Record.readSubExpr());
 
12489  SmallVector<ValueDecl *, 16> Decls;
 
12490  Decls.reserve(UniqueDecls);
 
12491  for (
unsigned i = 0; i < UniqueDecls; ++i)
 
12492    Decls.push_back(Record.readDeclAs<ValueDecl>());
 
12493  C->setUniqueDecls(Decls);
 
12495  SmallVector<unsigned, 16> ListsPerDecl;
 
12496  ListsPerDecl.reserve(UniqueDecls);
 
12497  for (
unsigned i = 0; i < UniqueDecls; ++i)
 
12498    ListsPerDecl.push_back(Record.readInt());
 
12499  C->setDeclNumLists(ListsPerDecl);
 
12501  SmallVector<unsigned, 32> ListSizes;
 
12502  ListSizes.reserve(TotalLists);
 
12503  for (
unsigned i = 0; i < TotalLists; ++i)
 
12504    ListSizes.push_back(Record.readInt());
 
12505  C->setComponentListSizes(ListSizes);
 
12507  SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
 
12508  Components.reserve(TotalComponents);
 
12509  for (
unsigned i = 0; i < TotalComponents; ++i) {
 
12510    auto *AssociatedExprPr = Record.readSubExpr();
 
12511    auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
 
12512    Components.emplace_back(AssociatedExprPr, AssociatedDecl,
 
12515  C->setComponents(Components, ListSizes);
 
12519  C->setLParenLoc(Record.readSourceLocation());
 
12520  auto NumVars = 
C->varlist_size();
 
12521  auto UniqueDecls = 
C->getUniqueDeclarationsNum();
 
12522  auto TotalLists = 
C->getTotalComponentListNum();
 
12523  auto TotalComponents = 
C->getTotalComponentsNum();
 
12525  SmallVector<Expr *, 16> Vars;
 
12526  Vars.reserve(NumVars);
 
12527  for (
unsigned i = 0; i != NumVars; ++i)
 
12528    Vars.push_back(Record.readSubExpr());
 
12529  C->setVarRefs(Vars);
 
12531  SmallVector<ValueDecl *, 16> Decls;
 
12532  Decls.reserve(UniqueDecls);
 
12533  for (
unsigned i = 0; i < UniqueDecls; ++i)
 
12534    Decls.push_back(Record.readDeclAs<ValueDecl>());
 
12535  C->setUniqueDecls(Decls);
 
12537  SmallVector<unsigned, 16> ListsPerDecl;
 
12538  ListsPerDecl.reserve(UniqueDecls);
 
12539  for (
unsigned i = 0; i < UniqueDecls; ++i)
 
12540    ListsPerDecl.push_back(Record.readInt());
 
12541  C->setDeclNumLists(ListsPerDecl);
 
12543  SmallVector<unsigned, 32> ListSizes;
 
12544  ListSizes.reserve(TotalLists);
 
12545  for (
unsigned i = 0; i < TotalLists; ++i)
 
12546    ListSizes.push_back(Record.readInt());
 
12547  C->setComponentListSizes(ListSizes);
 
12549  SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
 
12550  Components.reserve(TotalComponents);
 
12551  for (
unsigned i = 0; i < TotalComponents; ++i) {
 
12552    Expr *AssociatedExpr = Record.readSubExpr();
 
12553    auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
 
12554    Components.emplace_back(AssociatedExpr, AssociatedDecl,
 
12557  C->setComponents(Components, ListSizes);
 
12561  C->setLParenLoc(Record.readSourceLocation());
 
12562  auto NumVars = 
C->varlist_size();
 
12563  auto UniqueDecls = 
C->getUniqueDeclarationsNum();
 
12564  auto TotalLists = 
C->getTotalComponentListNum();
 
12565  auto TotalComponents = 
C->getTotalComponentsNum();
 
12567  SmallVector<Expr *, 16> Vars;
 
12568  Vars.reserve(NumVars);
 
12569  for (
unsigned i = 0; i != NumVars; ++i)
 
12570    Vars.push_back(Record.readSubExpr());
 
12571  C->setVarRefs(Vars);
 
12574  SmallVector<ValueDecl *, 16> Decls;
 
12575  Decls.reserve(UniqueDecls);
 
12576  for (
unsigned i = 0; i < UniqueDecls; ++i)
 
12577    Decls.push_back(Record.readDeclAs<ValueDecl>());
 
12578  C->setUniqueDecls(Decls);
 
12580  SmallVector<unsigned, 16> ListsPerDecl;
 
12581  ListsPerDecl.reserve(UniqueDecls);
 
12582  for (
unsigned i = 0; i < UniqueDecls; ++i)
 
12583    ListsPerDecl.push_back(Record.readInt());
 
12584  C->setDeclNumLists(ListsPerDecl);
 
12586  SmallVector<unsigned, 32> ListSizes;
 
12587  ListSizes.reserve(TotalLists);
 
12588  for (
unsigned i = 0; i < TotalLists; ++i)
 
12589    ListSizes.push_back(Record.readInt());
 
12590  C->setComponentListSizes(ListSizes);
 
12592  SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
 
12593  Components.reserve(TotalComponents);
 
12594  for (
unsigned i = 0; i < TotalComponents; ++i) {
 
12595    Expr *AssociatedExpr = Record.readSubExpr();
 
12596    auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
 
12597    Components.emplace_back(AssociatedExpr, AssociatedDecl,
 
12600  C->setComponents(Components, ListSizes);
 
12604  C->setLParenLoc(Record.readSourceLocation());
 
12605  auto NumVars = 
C->varlist_size();
 
12606  auto UniqueDecls = 
C->getUniqueDeclarationsNum();
 
12607  auto TotalLists = 
C->getTotalComponentListNum();
 
12608  auto TotalComponents = 
C->getTotalComponentsNum();
 
12610  SmallVector<Expr *, 16> Vars;
 
12611  Vars.reserve(NumVars);
 
12612  for (
unsigned I = 0; I != NumVars; ++I)
 
12613    Vars.push_back(Record.readSubExpr());
 
12614  C->setVarRefs(Vars);
 
12617  SmallVector<ValueDecl *, 16> Decls;
 
12618  Decls.reserve(UniqueDecls);
 
12619  for (
unsigned I = 0; I < UniqueDecls; ++I)
 
12620    Decls.push_back(Record.readDeclAs<ValueDecl>());
 
12621  C->setUniqueDecls(Decls);
 
12623  SmallVector<unsigned, 16> ListsPerDecl;
 
12624  ListsPerDecl.reserve(UniqueDecls);
 
12625  for (
unsigned I = 0; I < UniqueDecls; ++I)
 
12626    ListsPerDecl.push_back(Record.readInt());
 
12627  C->setDeclNumLists(ListsPerDecl);
 
12629  SmallVector<unsigned, 32> ListSizes;
 
12630  ListSizes.reserve(TotalLists);
 
12631  for (
unsigned i = 0; i < TotalLists; ++i)
 
12632    ListSizes.push_back(Record.readInt());
 
12633  C->setComponentListSizes(ListSizes);
 
12635  SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
 
12636  Components.reserve(TotalComponents);
 
12637  for (
unsigned I = 0; I < TotalComponents; ++I) {
 
12638    Expr *AssociatedExpr = Record.readSubExpr();
 
12639    auto *AssociatedDecl = Record.readDeclAs<ValueDecl>();
 
12640    Components.emplace_back(AssociatedExpr, AssociatedDecl,
 
12643  C->setComponents(Components, ListSizes);
 
12647  C->setLParenLoc(Record.readSourceLocation());
 
12648  unsigned NumVars = 
C->varlist_size();
 
12649  SmallVector<Expr *, 16> Vars;
 
12650  Vars.reserve(NumVars);
 
12651  for (
unsigned i = 0; i != NumVars; ++i)
 
12652    Vars.push_back(Record.readSubExpr());
 
12653  C->setVarRefs(Vars);
 
12655  Vars.reserve(NumVars);
 
12656  for (
unsigned i = 0; i != NumVars; ++i)
 
12657    Vars.push_back(Record.readSubExpr());
 
12658  C->setPrivateRefs(Vars);
 
12662  C->setLParenLoc(Record.readSourceLocation());
 
12663  unsigned NumVars = 
C->varlist_size();
 
12664  SmallVector<Expr *, 16> Vars;
 
12665  Vars.reserve(NumVars);
 
12666  for (
unsigned i = 0; i != NumVars; ++i)
 
12667    Vars.push_back(Record.readSubExpr());
 
12668  C->setVarRefs(Vars);
 
12672  C->setLParenLoc(Record.readSourceLocation());
 
12673  unsigned NumVars = 
C->varlist_size();
 
12674  SmallVector<Expr *, 16> Vars;
 
12675  Vars.reserve(NumVars);
 
12676  for (
unsigned i = 0; i != NumVars; ++i)
 
12677    Vars.push_back(Record.readSubExpr());
 
12678  C->setVarRefs(Vars);
 
12682  C->setLParenLoc(Record.readSourceLocation());
 
12683  unsigned NumOfAllocators = 
C->getNumberOfAllocators();
 
12684  SmallVector<OMPUsesAllocatorsClause::Data, 4> 
Data;
 
12685  Data.reserve(NumOfAllocators);
 
12686  for (
unsigned I = 0; I != NumOfAllocators; ++I) {
 
12687    OMPUsesAllocatorsClause::Data &D = 
Data.emplace_back();
 
12690    D.
LParenLoc = Record.readSourceLocation();
 
12691    D.
RParenLoc = Record.readSourceLocation();
 
12693  C->setAllocatorsData(
Data);
 
12697  C->setLParenLoc(Record.readSourceLocation());
 
12698  C->setModifier(Record.readSubExpr());
 
12699  C->setColonLoc(Record.readSourceLocation());
 
12700  unsigned NumOfLocators = 
C->varlist_size();
 
12701  SmallVector<Expr *, 4> Locators;
 
12702  Locators.reserve(NumOfLocators);
 
12703  for (
unsigned I = 0; I != NumOfLocators; ++I)
 
12704    Locators.push_back(Record.readSubExpr());
 
12705  C->setVarRefs(Locators);
 
12711  C->setLParenLoc(Record.readSourceLocation());
 
12712  C->setKindKwLoc(Record.readSourceLocation());
 
12713  C->setModifierKwLoc(Record.readSourceLocation());
 
12718  C->setThreadID(Record.readSubExpr());
 
12719  C->setLParenLoc(Record.readSourceLocation());
 
12724  C->setLParenLoc(Record.readSourceLocation());
 
12725  C->setBindKindLoc(Record.readSourceLocation());
 
12729  C->setAlignment(Record.readExpr());
 
12730  C->setLParenLoc(Record.readSourceLocation());
 
12735  C->setSize(Record.readSubExpr());
 
12736  C->setLParenLoc(Record.readSourceLocation());
 
12740  C->setLParenLoc(Record.readSourceLocation());
 
12741  C->setDependenceType(
 
12743  C->setDependenceLoc(Record.readSourceLocation());
 
12744  C->setColonLoc(Record.readSourceLocation());
 
12745  unsigned NumVars = 
C->varlist_size();
 
12746  SmallVector<Expr *, 16> Vars;
 
12747  Vars.reserve(NumVars);
 
12748  for (
unsigned I = 0; I != NumVars; ++I)
 
12749    Vars.push_back(Record.readSubExpr());
 
12750  C->setVarRefs(Vars);
 
12751  for (
unsigned I = 0, E = 
C->getNumLoops(); I < E; ++I)
 
12752    C->setLoopData(I, Record.readSubExpr());
 
12757  Record.readAttributes(Attrs);
 
12758  C->setAttrs(Attrs);
 
12759  C->setLocStart(Record.readSourceLocation());
 
12760  C->setLParenLoc(Record.readSourceLocation());
 
12761  C->setLocEnd(Record.readSourceLocation());
 
12774      Selector.ScoreOrCondition = 
nullptr;
 
12776        Selector.ScoreOrCondition = readExprRef();
 
 
12788  if (Reader->ReadingKind == ASTReader::Read_Stmt) {
 
12793  for (
unsigned I = 0, E = 
Data->getNumClauses(); I < E; ++I)
 
12795  Data->setClauses(Clauses);
 
12796  if (
Data->hasAssociatedStmt())
 
12798  for (
unsigned I = 0, E = 
Data->getNumChildren(); I < E; ++I)
 
 
12803  unsigned NumVars = 
readInt();
 
12805  for (
unsigned I = 0; I < NumVars; ++I)
 
 
12811  unsigned NumExprs = 
readInt();
 
12813  for (
unsigned I = 0; I < NumExprs; ++I)
 
 
12823  switch (ClauseKind) {
 
12838    bool isConditionExprClause = 
readBool();
 
12839    if (isConditionExprClause) {
 
12844    unsigned NumVars = 
readInt();
 
12846    for (
unsigned I = 0; I < NumVars; ++I)
 
12853    unsigned NumClauses = 
readInt();
 
12855    for (
unsigned I = 0; I < NumClauses; ++I)
 
12889    for (
unsigned I = 0; I < VarList.size(); ++I) {
 
12892      RecipeList.push_back({Alloca});
 
12896                                        VarList, RecipeList, EndLoc);
 
12914    for (
unsigned I = 0; I < VarList.size(); ++I) {
 
12918      RecipeList.push_back({Recipe, RecipeTemp});
 
12922                                             VarList, RecipeList, EndLoc);
 
12973                                     LParenLoc, ModList, VarList, EndLoc);
 
12982                                       LParenLoc, ModList, VarList, EndLoc);
 
12991                                        LParenLoc, ModList, VarList, EndLoc);
 
13000                                       LParenLoc, ModList, VarList, EndLoc);
 
13006                                      AsyncExpr, EndLoc);
 
13014                                     DevNumExpr, QueuesLoc, QueueIdExprs,
 
13021    unsigned NumArchs = 
readInt();
 
13023    for (
unsigned I = 0; I < NumArchs; ++I) {
 
13026      Archs.emplace_back(Loc, Ident);
 
13030                                           LParenLoc, Archs, EndLoc);
 
13038    for (
unsigned I = 0; I < VarList.size(); ++I) {
 
13042                    3 * 
sizeof(
int *));
 
13045      unsigned NumCombiners = 
readInt();
 
13046      for (
unsigned I = 0; I < NumCombiners; ++I) {
 
13051        Combiners.push_back({LHS, RHS, Op});
 
13054      RecipeList.push_back({Recipe, Combiners});
 
13058                                          VarList, RecipeList, EndLoc);
 
13077                                         HasForce, LoopCount, EndLoc);
 
13081    unsigned NumClauses = 
readInt();
 
13083    for (
unsigned I = 0; I < NumClauses; ++I)
 
13086                                     SizeExprs, EndLoc);
 
13090    unsigned NumExprs = 
readInt();
 
13093    for (
unsigned I = 0; I < NumExprs; ++I) {
 
13099                                     GangKinds, Exprs, EndLoc);
 
13105                                       WorkerExpr, EndLoc);
 
13111                                       VectorExpr, EndLoc);
 
13123                                               LParenLoc, VarList, EndLoc);
 
13137    llvm_unreachable(
"Clause serialization not yet implemented");
 
13139  llvm_unreachable(
"Invalid Clause Kind");
 
 
13144  for (
unsigned I = 0; I < Clauses.size(); ++I)
 
 
13149  unsigned NumVars = 
readInt();
 
13150  A->Clauses.resize(NumVars);
 
 
13157  llvm::FoldingSetNodeID ID;
 
13158  ID.AddString(PrimaryModuleName);
 
13159  return ID.computeStableHash();
 
 
13164    return std::nullopt;
 
13167    return std::nullopt;
 
13170    return std::nullopt;
 
 
Defines the clang::ASTContext interface.
static unsigned moduleKindForDiagnostic(ModuleKind Kind)
static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, ASTConsumer *Consumer)
Under non-PCH compilation the consumer receives the objc methods before receiving the implementation,...
static bool checkCodegenOptions(const CodeGenOptions &CGOpts, const CodeGenOptions &ExistingCGOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream)
Whether Stream doesn't start with the AST file magic number 'CPCH'.
static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags)
static bool checkModuleCachePath(llvm::vfs::FileSystem &VFS, StringRef SpecificModuleCachePath, StringRef ExistingModuleCachePath, StringRef ModuleFilename, DiagnosticsEngine *Diags, const LangOptions &LangOpts, const PreprocessorOptions &PPOpts)
Check that the specified and the existing module cache paths are equivalent.
static unsigned getModuleFileIndexForTypeID(serialization::TypeID ID)
static void collectMacroDefinitions(const PreprocessorOptions &PPOpts, MacroDefinitionsMap &Macros, SmallVectorImpl< StringRef > *MacroNames=nullptr)
Collect the macro definitions provided by the given preprocessor options.
static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II, bool IsModule)
static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method)
Move the given method to the back of the global list of methods.
static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps)
static bool isInterestingIdentifier(ASTReader &Reader, const IdentifierInfo &II, bool IsModule)
Whether the given identifier is "interesting".
static bool parseModuleFileExtensionMetadata(const SmallVectorImpl< uint64_t > &Record, StringRef Blob, ModuleFileExtensionMetadata &Metadata)
Parse a record and blob containing module file extension metadata.
static Module * getTopImportImplicitModule(ModuleManager &ModuleMgr, Preprocessor &PP)
Return the top import module if it is implicit, nullptr otherwise.
static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, const PreprocessorOptions &ExistingPPOpts, StringRef ModuleFilename, bool ReadMacros, DiagnosticsEngine *Diags, FileManager &FileMgr, std::string &SuggestedPredefines, const LangOptions &LangOpts, OptionValidation Validation=OptionValidateContradictions)
Check the preprocessor options deserialized from the control block against the preprocessor options i...
static void addMethodsToPool(Sema &S, ArrayRef< ObjCMethodDecl * > Methods, ObjCMethodList &List)
Add the given set of methods to the method list.
static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, DiagnosticsEngine &Diags, StringRef ModuleFilename, bool IsSystem, bool SystemHeaderWarningsInModule, bool Complain)
static bool isPredefinedType(serialization::TypeID ID)
static bool readBit(unsigned &Bits)
static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, DiagnosticsEngine &Diags, StringRef ModuleFilename, bool Complain)
static std::optional< Type::TypeClass > getTypeClassForCode(TypeCode code)
static std::pair< unsigned, unsigned > readULEBKeyDataLength(const unsigned char *&P)
Read ULEB-encoded key length and data length.
static unsigned getStableHashForModuleName(StringRef PrimaryModuleName)
static LLVM_DUMP_METHOD void dumpModuleIDMap(StringRef Name, const ContinuousRangeMap< Key, ModuleFile *, InitialCapacity > &Map)
@ OptionValidateStrictMatches
@ OptionValidateContradictions
static bool checkTargetOptions(const TargetOptions &TargetOpts, const TargetOptions &ExistingTargetOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
Compare the given set of target options against an existing set of target options.
static bool checkLanguageOptions(const LangOptions &LangOpts, const LangOptions &ExistingLangOpts, StringRef ModuleFilename, DiagnosticsEngine *Diags, bool AllowCompatibleDifferences=true)
Compare the given set of language options against an existing set of language options.
static std::pair< StringRef, StringRef > getUnresolvedInputFilenames(const ASTReader::RecordData &Record, const StringRef InputBlob)
#define CHECK_TARGET_OPT(Field, Name)
static ASTFileSignature readASTFileSignature(StringRef PCH)
Reads and return the signature record from PCH's control block, or else returns 0.
static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID)
Given a cursor at the start of an AST file, scan ahead and drop the cursor into the start of the give...
static unsigned getIndexForTypeID(serialization::TypeID ID)
static uint64_t readULEB(const unsigned char *&P)
Defines the clang::ASTSourceDescriptor class, which abstracts clang modules and precompiled header fi...
static StringRef bytes(const std::vector< T, Allocator > &v)
Defines the Diagnostic-related interfaces.
static void dump(llvm::raw_ostream &OS, StringRef FunctionName, ArrayRef< CounterExpression > Expressions, ArrayRef< CounterMappingRegion > Regions)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the Diagnostic IDs-related interfaces.
static bool hasDefinition(const ObjCObjectPointerType *ObjPtr)
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::FileManager interface and associated types.
Defines the clang::FileSystemOptions interface.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Record Record
Defines the clang::MacroInfo and clang::MacroDirective classes.
Defines the clang::Module class, which describes a module in the source code.
Defines types useful for describing an Objective-C runtime.
Defines some OpenACC-specific enums and functions.
This file defines OpenMP AST classes for clauses.
Defines some OpenMP-specific enums and functions.
Defines an enumeration for C++ overloaded operators.
Defines the clang::Preprocessor interface.
Defines the clang::SanitizerKind enum.
This file declares semantic analysis for CUDA constructs.
This file declares semantic analysis for Objective-C.
Defines the clang::SourceLocation class and associated facilities.
Defines implementation details of the clang::SourceManager class.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
Defines the clang::TargetOptions class.
#define IMPORT(DERIVED, BASE)
Defines the clang::TokenKind enum and support functions.
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
Defines version macros and version-related utility functions for Clang.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
virtual void HandleInterestingDecl(DeclGroupRef D)
HandleInterestingDecl - Handle the specified interesting declaration.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
OMPTraitInfo & getNewOMPTraitInfo()
Return a new OMPTraitInfo object owned by this context.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
void adjustExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI, bool AsWritten=false)
Change the exception specification on a function once it is delay-parsed, instantiated,...
void deduplicateMergedDefinitionsFor(NamedDecl *ND)
Clean up the merged definition list.
void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType)
Change the result type of a function type once it is deduced.
void setPrimaryMergedDecl(Decl *D, Decl *Primary)
ASTIdentifierIterator(const ASTReader &Reader, bool SkipModules=false)
StringRef Next() override
Retrieve the next string in the identifier table and advances the iterator for the following string.
Abstract interface for callback invocations by the ASTReader.
virtual void ReadModuleMapFile(StringRef ModuleMapPath)
virtual bool needsInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
virtual bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain)
Receives the diagnostic options.
virtual bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the target options.
virtual bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule)
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
virtual bool ReadHeaderSearchPaths(const HeaderSearchOptions &HSOpts, bool Complain)
Receives the header search paths.
virtual bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain)
Receives the file system options.
virtual ~ASTReaderListener()
virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines)
Receives the preprocessor options.
virtual bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef SpecificModuleCachePath, bool Complain)
Receives the header search options.
virtual bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the language options.
virtual void visitModuleFile(StringRef Filename, serialization::ModuleKind Kind)
This is called for each AST file loaded.
virtual void ReadCounter(const serialization::ModuleFile &M, unsigned Value)
Receives COUNTER value.
virtual void ReadModuleName(StringRef ModuleName)
virtual bool needsSystemInputFileVisitation()
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
virtual bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences)
Receives the codegen options.
Reads an AST files chain containing the contents of a translation unit.
std::optional< bool > isPreprocessedEntityInFileID(unsigned Index, FileID FID) override
Optionally returns true or false if the preallocated preprocessed entity with index Index came from f...
PreprocessedEntity * ReadPreprocessedEntity(unsigned Index) override
Read a preallocated preprocessed entity from the external source.
void markIdentifierUpToDate(const IdentifierInfo *II)
Note that this identifier is up-to-date.
void visitTopLevelModuleMaps(serialization::ModuleFile &MF, llvm::function_ref< void(FileEntryRef)> Visitor)
Visit all the top-level module maps loaded when building the given module file.
void setDeserializationListener(ASTDeserializationListener *Listener, bool TakeOwnership=false)
Set the AST deserialization listener.
SmallVectorImpl< uint64_t > RecordDataImpl
serialization::SubmoduleID getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) const
Retrieve the global submodule ID given a module and its local ID number.
ExtKind hasExternalDefinitions(const Decl *D) override
IdentifierTable & getIdentifierTable()
Retrieve the identifier table associated with the preprocessor.
ModuleManager & getModuleManager()
Retrieve the module manager.
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
friend class ASTIdentifierIterator
bool ReadSLocEntry(int ID) override
Read the source location entry with index ID.
void RecordSwitchCaseID(SwitchCase *SC, unsigned ID)
Record that the given ID maps to the given switch-case statement.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Decl * ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
static std::string ReadString(const RecordDataImpl &Record, unsigned &Idx)
void ReadDeclsToCheckForDeferredDiags(llvm::SmallSetVector< Decl *, 4 > &Decls) override
Read the set of decls to be checked for deferred diags.
void InitializeSema(Sema &S) override
Initialize the semantic source with the Sema instance being used to perform semantic analysis on the ...
@ ARR_Missing
The client can handle an AST file that cannot load because it is missing.
@ ARR_ConfigurationMismatch
The client can handle an AST file that cannot load because it's compiled configuration doesn't match ...
@ ARR_OutOfDate
The client can handle an AST file that cannot load because it is out-of-date relative to its input fi...
@ ARR_VersionMismatch
The client can handle an AST file that cannot load because it was built with a different version of C...
void ReadMismatchingDeleteExpressions(llvm::MapVector< FieldDecl *, llvm::SmallVector< std::pair< SourceLocation, bool >, 4 > > &Exprs) override
void FindFileRegionDecls(FileID File, unsigned Offset, unsigned Length, SmallVectorImpl< Decl * > &Decls) override
Get the decls that are contained in a file in the Offset/Length range.
std::string ReadPathBlob(StringRef BaseDirectory, const RecordData &Record, unsigned &Idx, StringRef &Blob)
SourceRange ReadSkippedRange(unsigned Index) override
Read a preallocated skipped range from the external source.
serialization::TypeID getGlobalTypeID(ModuleFile &F, serialization::LocalTypeID LocalID) const
Map a local type ID within a given AST file into a global type ID.
void dump()
Dump information about the AST reader to standard error.
MacroInfo * ReadMacroRecord(ModuleFile &F, uint64_t Offset)
Reads the macro record located at the given offset.
SmallVector< std::pair< llvm::BitstreamCursor, serialization::ModuleFile * >, 8 > CommentsCursors
Cursors for comments blocks.
Selector getLocalSelector(ModuleFile &M, unsigned LocalID)
Retrieve a selector from the given module with its local ID number.
void FindExternalLexicalDecls(const DeclContext *DC, llvm::function_ref< bool(Decl::Kind)> IsKindWeWant, SmallVectorImpl< Decl * > &Decls) override
Read all of the declarations lexically stored in a declaration context.
ModuleFile * getOwningModuleFile(const Decl *D) const
Retrieve the module file that owns the given declaration, or NULL if the declaration is not from a mo...
std::optional< ASTSourceDescriptor > getSourceDescriptor(unsigned ID) override
Return a descriptor for the corresponding module.
const serialization::reader::DeclContextLookupTable * getLoadedLookupTables(DeclContext *Primary) const
Get the loaded lookup tables for Primary, if any.
T * ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
QualType getLocalType(ModuleFile &F, serialization::LocalTypeID LocalID)
Resolve a local type ID within a given AST file into a type.
void ClearSwitchCaseIDs()
void SetGloballyVisibleDecls(IdentifierInfo *II, const SmallVectorImpl< GlobalDeclID > &DeclIDs, SmallVectorImpl< Decl * > *Decls=nullptr)
Set the globally-visible declarations associated with the given identifier.
serialization::ModuleKind ModuleKind
bool loadGlobalIndex()
Attempts to load the global index.
void ReadComments() override
Loads comments ranges.
SourceManager & getSourceManager() const
const serialization::reader::ModuleLocalLookupTable * getModuleLocalLookupTables(DeclContext *Primary) const
SourceLocation getSourceLocationForDeclID(GlobalDeclID ID)
Returns the source location for the decl ID.
void makeModuleVisible(Module *Mod, Module::NameVisibilityKind NameVisibility, SourceLocation ImportLoc)
Make the entities in the given module and any of its (non-explicit) submodules visible to name lookup...
SourceRange ReadSourceRange(ModuleFile &F, const RecordData &Record, unsigned &Idx)
Read a source range.
bool LoadExternalSpecializations(const Decl *D, bool OnlyPartial) override
Load all the external specializations for the Decl.
void finalizeForWriting()
Finalizes the AST reader's state before writing an AST file to disk.
Sema * getSema()
Retrieve the semantic analysis object used to analyze the translation unit in which the precompiled h...
static std::string ResolveImportedPathAndAllocate(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
static StringRef ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx, StringRef &Blob)
CXXCtorInitializer ** GetExternalCXXCtorInitializers(uint64_t Offset) override
Read the contents of a CXXCtorInitializer array.
void visitInputFileInfos(serialization::ModuleFile &MF, bool IncludeSystem, llvm::function_ref< void(const serialization::InputFileInfo &IFI, bool IsSystem)> Visitor)
Visit all the input file infos of the given module file.
unsigned getTotalNumSLocs() const
Returns the number of source locations found in the chain.
void StartTranslationUnit(ASTConsumer *Consumer) override
Function that will be invoked when we begin parsing a new translation unit involving this external AS...
LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)
Map a global declaration ID into the declaration ID used to refer to this declaration within the give...
void resolvePendingMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo)
void ReadTentativeDefinitions(SmallVectorImpl< VarDecl * > &TentativeDefs) override
Read the set of tentative definitions known to the external Sema source.
Decl * GetExternalDecl(GlobalDeclID ID) override
Resolve a declaration ID into a declaration, potentially building a new declaration.
GlobalDeclID ReadDeclID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx)
Reads a declaration ID from the given position in a record in the given module.
llvm::Expected< SourceLocation::UIntTy > readSLocOffset(ModuleFile *F, unsigned Index)
Try to read the offset of the SLocEntry at the given index in the given module file.
bool haveUnloadedSpecializations(const Decl *D) const
If we have any unloaded specialization for D.
friend class PCHValidator
friend class serialization::ReadMethodPoolVisitor
void CompleteRedeclChain(const Decl *D) override
If any redeclarations of D have been imported since it was last checked, this digs out those redeclar...
SourceLocation TranslateSourceLocation(ModuleFile &ModuleFile, SourceLocation Loc) const
Translate a source location from another module file's source location space into ours.
static llvm::Error ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor, unsigned BlockID, uint64_t *StartOfBlockOffset=nullptr)
ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the specified cursor.
void SetIdentifierInfo(serialization::IdentifierID ID, IdentifierInfo *II)
serialization::PreprocessedEntityID getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const
Determine the global preprocessed entity ID that corresponds to the given local ID within the given m...
std::pair< unsigned, unsigned > findPreprocessedEntitiesInRange(SourceRange Range) override
Returns a pair of [Begin, End) indices of preallocated preprocessed entities that Range encompasses.
IdentifierInfo * get(StringRef Name) override
Retrieve the IdentifierInfo for the named identifier.
IdentifierInfo * getLocalIdentifier(ModuleFile &M, uint64_t LocalID)
void visitInputFiles(serialization::ModuleFile &MF, bool IncludeSystem, bool Complain, llvm::function_ref< void(const serialization::InputFile &IF, bool isSystem)> Visitor)
Visit all the input files of the given module file.
Module * getModule(unsigned ID) override
Retrieve the module that corresponds to the given module ID.
static bool isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache, const PCHContainerReader &PCHContainerRdr, const LangOptions &LangOpts, const CodeGenOptions &CGOpts, const TargetOptions &TargetOpts, const PreprocessorOptions &PPOpts, StringRef ExistingModuleCachePath, bool RequireStrictOptionMatches=false)
Determine whether the given AST file is acceptable to load into a translation unit with the given lan...
llvm::iterator_range< ModuleDeclIterator > getModuleFileLevelDecls(ModuleFile &Mod)
Stmt * GetExternalDeclStmt(uint64_t Offset) override
Resolve the offset of a statement into a statement.
Selector GetExternalSelector(serialization::SelectorID ID) override
Resolve a selector ID into a selector.
unsigned getTotalNumSelectors() const
Returns the number of selectors found in the chain.
MacroInfo * getMacro(serialization::MacroID ID)
Retrieve the macro with the given ID.
void ReadUndefinedButUsed(llvm::MapVector< NamedDecl *, SourceLocation > &Undefined) override
Load the set of used but not defined functions or variables with internal linkage,...
void ReadDelegatingConstructors(SmallVectorImpl< CXXConstructorDecl * > &Decls) override
Read the set of delegating constructors known to the external Sema source.
QualType GetType(serialization::TypeID ID)
Resolve a type ID into a type, potentially building a new type.
void addPendingMacro(IdentifierInfo *II, ModuleFile *M, uint32_t MacroDirectivesOffset)
Add a macro to deserialize its macro directive history.
GlobalDeclID getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const
Map from a local declaration ID within a given module to a global declaration ID.
void ReadWeakUndeclaredIdentifiers(SmallVectorImpl< std::pair< IdentifierInfo *, WeakInfo > > &WeakIDs) override
Read the set of weak, undeclared identifiers known to the external Sema source.
void completeVisibleDeclsMap(const DeclContext *DC) override
Load all external visible decls in the given DeclContext.
void AssignedLambdaNumbering(CXXRecordDecl *Lambda) override
Notify the external source that a lambda was assigned a mangling number.
void ReadUnusedLocalTypedefNameCandidates(llvm::SmallSetVector< const TypedefNameDecl *, 4 > &Decls) override
Read the set of potentially unused typedefs known to the source.
IdentifierResolver & getIdResolver()
Get the identifier resolver used for name lookup / updates in the translation unit scope.
static bool readASTFileControlBlock(StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache, const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions, ASTReaderListener &Listener, bool ValidateDiagnosticOptions, unsigned ClientLoadCapabilities=ARR_ConfigurationMismatch|ARR_OutOfDate)
Read the control block for the named AST file.
void ReadExtVectorDecls(SmallVectorImpl< TypedefNameDecl * > &Decls) override
Read the set of ext_vector type declarations known to the external Sema source.
SmallVector< GlobalDeclID, 16 > PreloadedDeclIDs
std::pair< SourceLocation, StringRef > getModuleImportLoc(int ID) override
Retrieve the module import location and module name for the given source manager entry ID.
void ReadUnusedFileScopedDecls(SmallVectorImpl< const DeclaratorDecl * > &Decls) override
Read the set of unused file-scope declarations known to the external Sema source.
void ReadReferencedSelectors(SmallVectorImpl< std::pair< Selector, SourceLocation > > &Sels) override
Read the set of referenced selectors known to the external Sema source.
Selector DecodeSelector(serialization::SelectorID Idx)
ASTReadResult ReadAST(StringRef FileName, ModuleKind Type, SourceLocation ImportLoc, unsigned ClientLoadCapabilities, ModuleFile **NewLoadedModuleFile=nullptr)
Load the AST file designated by the given file name.
StringRef getOriginalSourceFile()
Retrieve the name of the original source file name for the primary module file.
std::string ReadPath(ModuleFile &F, const RecordData &Record, unsigned &Idx)
friend class serialization::reader::ASTIdentifierLookupTrait
unsigned getModuleFileID(ModuleFile *M)
Get an ID for the given module file.
bool FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name, const DeclContext *OriginalDC) override
Finds all the visible declarations with a given name.
IdentifierInfo * DecodeIdentifierInfo(serialization::IdentifierID ID)
ASTReadResult
The result of reading the control block of an AST file, which can fail for various reasons.
@ Success
The control block was read successfully.
@ ConfigurationMismatch
The AST file was written with a different language/target configuration.
@ OutOfDate
The AST file is out-of-date relative to its input files, and needs to be regenerated.
@ Failure
The AST file itself appears corrupted.
@ VersionMismatch
The AST file was written by a different version of Clang.
@ HadErrors
The AST file has errors.
@ Missing
The AST file was missing.
static VersionTuple ReadVersionTuple(const RecordData &Record, unsigned &Idx)
Read a version tuple.
Token ReadToken(ModuleFile &M, const RecordDataImpl &Record, unsigned &Idx)
Reads a token out of a record.
SwitchCase * getSwitchCaseWithID(unsigned ID)
Retrieve the switch-case statement with the given ID.
serialization::IdentifierID getGlobalIdentifierID(ModuleFile &M, uint64_t LocalID)
FileID TranslateFileID(ModuleFile &F, FileID FID) const
Translate a FileID from another module file's FileID space into ours.
void ReadLateParsedTemplates(llvm::MapVector< const FunctionDecl *, std::unique_ptr< LateParsedTemplate > > &LPTMap) override
Read the set of late parsed template functions for this source.
IdentifierIterator * getIdentifiers() override
Retrieve an iterator into the set of all identifiers in all loaded AST files.
void ReadUsedVTables(SmallVectorImpl< ExternalVTableUse > &VTables) override
Read the set of used vtables known to the external Sema source.
bool isGlobalIndexUnavailable() const
Determine whether we tried to load the global index, but failed, e.g., because it is out-of-date or d...
uint32_t GetNumExternalSelectors() override
Returns the number of selectors known to the external AST source.
static TemporarilyOwnedStringRef ResolveImportedPath(SmallString< 0 > &Buf, StringRef Path, ModuleFile &ModF)
Resolve Path in the context of module file M.
void updateOutOfDateSelector(Selector Sel) override
Load the contents of the global method pool for a given selector if necessary.
Decl * GetExistingDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration.
static llvm::BitVector ReadBitVector(const RecordData &Record, const StringRef Blob)
ModuleFile * getLocalModuleFile(ModuleFile &M, unsigned ID) const
Retrieve the module file with a given local ID within the specified ModuleFile.
ASTReader(Preprocessor &PP, ModuleCache &ModCache, ASTContext *Context, const PCHContainerReader &PCHContainerRdr, const CodeGenOptions &CodeGenOpts, ArrayRef< std::shared_ptr< ModuleFileExtension > > Extensions, StringRef isysroot="", DisableValidationForModuleKind DisableValidationKind=DisableValidationForModuleKind::None, bool AllowASTWithCompilerErrors=false, bool AllowConfigurationMismatch=false, bool ValidateSystemInputs=false, bool ForceValidateUserInputs=true, bool ValidateASTInputFilesContent=false, bool UseGlobalIndex=true, std::unique_ptr< llvm::Timer > ReadTimer={})
Load the AST file and validate its contents against the given Preprocessor.
void LoadSelector(Selector Sel)
Load a selector from disk, registering its ID if it exists.
void ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag)
void makeNamesVisible(const HiddenNames &Names, Module *Owner)
Make the names within this set of hidden names visible.
void UpdateSema()
Update the state of Sema after loading some additional modules.
Decl * GetDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
Decl * GetLocalDecl(ModuleFile &F, LocalDeclID LocalID)
Reads a declaration with the given local ID in the given module.
int getSLocEntryID(SourceLocation::UIntTy SLocOffset) override
Get the index ID for the loaded SourceLocation offset.
SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw) const
Read a source location from raw form.
void ReadPendingInstantiations(SmallVectorImpl< std::pair< ValueDecl *, SourceLocation > > &Pending) override
Read the set of pending instantiations known to the external Sema source.
Preprocessor & getPreprocessor() const
Retrieve the preprocessor.
serialization::reader::LazySpecializationInfoLookupTable * getLoadedSpecializationsLookupTables(const Decl *D, bool IsPartial)
Get the loaded specializations lookup tables for D, if any.
CXXTemporary * ReadCXXTemporary(ModuleFile &F, const RecordData &Record, unsigned &Idx)
void ReadKnownNamespaces(SmallVectorImpl< NamespaceDecl * > &Namespaces) override
Load the set of namespaces that are known to the external source, which will be used during typo corr...
Module * getSubmodule(serialization::SubmoduleID GlobalID)
Retrieve the submodule that corresponds to a global submodule ID.
void PrintStats() override
Print some statistics about AST usage.
void mergeDefinitionVisibility(NamedDecl *Def, NamedDecl *MergedDef)
Note that MergedDef is a redefinition of the canonical definition Def, so Def should be visible whene...
serialization::SelectorID getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const
Retrieve the global selector ID that corresponds to this the local selector ID in a given module.
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
friend class ASTRecordReader
SmallVector< uint64_t, 64 > RecordData
FileID ReadFileID(ModuleFile &F, const RecordDataImpl &Record, unsigned &Idx) const
Read a FileID.
void StartedDeserializing() override
Notify ASTReader that we started deserialization of a decl or type so until FinishedDeserializing is ...
void ReadMethodPool(Selector Sel) override
Load the contents of the global method pool for a given selector.
void InitializeContext()
Initializes the ASTContext.
CXXBaseSpecifier * GetExternalCXXBaseSpecifiers(uint64_t Offset) override
Resolve the offset of a set of C++ base specifiers in the decl stream into an array of specifiers.
const serialization::reader::DeclContextLookupTable * getTULocalLookupTables(DeclContext *Primary) const
FileManager & getFileManager() const
bool wasThisDeclarationADefinition(const FunctionDecl *FD) override
True if this function declaration was a definition before in its own module.
void FinishedDeserializing() override
Notify ASTReader that we finished the deserialization of a decl or type.
void updateOutOfDateIdentifier(const IdentifierInfo &II) override
Update an out-of-date identifier.
void ReadDefinedMacros() override
Read the set of macros defined by this external macro source.
HeaderFileInfo GetHeaderFileInfo(FileEntryRef FE) override
Read the header file information for the given file entry.
void getMemoryBufferSizes(MemoryBufferSizes &sizes) const override
Return the amount of memory used by memory buffers, breaking down by heap-backed versus mmap'ed memor...
serialization::MacroID getGlobalMacroID(ModuleFile &M, unsigned LocalID)
Retrieve the global macro ID corresponding to the given local ID within the given module file.
serialization::ModuleFile ModuleFile
bool hasGlobalIndex() const
Determine whether this AST reader has a global index.
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
uint32_t readUInt32()
Read a 32-bit unsigned value; required to satisfy BasicReader.
llvm::APFloat readAPFloat(const llvm::fltSemantics &Sem)
Read an arbitrary constant value, advancing Idx.
TemplateArgumentLoc readTemplateArgumentLoc()
Reads a TemplateArgumentLoc, advancing Idx.
SourceRange readSourceRange()
Read a source range, advancing Idx.
SourceLocation readSourceLocation()
Read a source location, advancing Idx.
void readUnresolvedSet(LazyASTUnresolvedSet &Set)
Read a UnresolvedSet structure, advancing Idx.
void readTemplateArgumentList(SmallVectorImpl< TemplateArgument > &TemplArgs, bool Canonicalize=false)
Read a template argument array, advancing Idx.
void readQualifierInfo(QualifierInfo &Info)
DeclarationNameLoc readDeclarationNameLoc(DeclarationName Name)
Read a declaration name, advancing Idx.
CXXBaseSpecifier readCXXBaseSpecifier()
Read a C++ base specifier, advancing Idx.
QualType readType()
Read a type from the current position in the record.
T * readDeclAs()
Reads a declaration from the given position in the record, advancing Idx.
Expected< unsigned > readRecord(llvm::BitstreamCursor &Cursor, unsigned AbbrevID)
Reads a record with id AbbrevID from Cursor, resetting the internal state.
DeclarationNameInfo readDeclarationNameInfo()
void readTypeLoc(TypeLoc TL)
Reads the location information for a type.
IdentifierInfo * readIdentifier()
TemplateArgumentLocInfo readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind)
Reads a TemplateArgumentLocInfo appropriate for the given TemplateArgument kind, advancing Idx.
TemplateArgument readTemplateArgument(bool Canonicalize)
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
TypeSourceInfo * readTypeSourceInfo()
Reads a declarator info from the given record, advancing Idx.
void readTemplateArgumentListInfo(TemplateArgumentListInfo &Result)
TypeCoupledDeclRefInfo readTypeCoupledDeclRefInfo()
void skipInts(unsigned N)
Skips the specified number of values.
GlobalDeclID readDeclID()
Reads a declaration ID from the given position in this record.
NestedNameSpecifierLoc readNestedNameSpecifierLoc()
Return a nested name specifier, advancing Idx.
ConceptReference * readConceptReference()
void readOMPChildren(OMPChildren *Data)
Read an OpenMP children, advancing Idx.
OMPClause * readOMPClause()
Read an OpenMP clause, advancing Idx.
void readOpenACCClauseList(MutableArrayRef< const OpenACCClause * > Clauses)
Read a list of OpenACC clauses into the passed SmallVector, during statement reading.
OMPTraitInfo * readOMPTraitInfo()
Read an OMPTraitInfo object, advancing Idx.
TemplateParameterList * readTemplateParameterList()
Read a template parameter list, advancing Idx.
OpenACCClause * readOpenACCClause()
Read an OpenACC clause, advancing Idx.
llvm::SmallVector< Expr * > readOpenACCVarList()
Read a list of Exprs used for a var-list.
CXXCtorInitializer ** readCXXCtorInitializers()
Read a CXXCtorInitializer array, advancing Idx.
SpirvOperand readHLSLSpirvOperand()
Stmt * readStmt()
Reads a statement.
const ASTTemplateArgumentListInfo * readASTTemplateArgumentListInfo()
uint64_t readInt()
Returns the current value in this record, and advances to the next value.
Expr * readExpr()
Reads an expression.
void readOpenACCRoutineDeclAttr(OpenACCRoutineDeclAttr *A)
llvm::SmallVector< Expr * > readOpenACCIntExprList()
Read a list of Exprs used for a int-expr-list.
Expr * readSubExpr()
Reads a sub-expression operand during statement reading.
Abstracts clang modules and precompiled header files and holds everything needed to generate debug in...
Wrapper for source info for arrays.
void setLBracketLoc(SourceLocation Loc)
void setRBracketLoc(SourceLocation Loc)
void setSizeExpr(Expr *Size)
void setRParenLoc(SourceLocation Loc)
void setLParenLoc(SourceLocation Loc)
void setKWLoc(SourceLocation Loc)
Attr - This represents one attribute.
void setAttr(const Attr *A)
void setConceptReference(ConceptReference *CR)
void setRParenLoc(SourceLocation Loc)
void setCaretLoc(SourceLocation Loc)
void setWrittenTypeSpec(TypeSpecifierType written)
bool needsExtraLocalData() const
void setModeAttr(bool written)
void setBuiltinLoc(SourceLocation Loc)
void setWrittenWidthSpec(TypeSpecifierWidth written)
void setWrittenSignSpec(TypeSpecifierSign written)
Represents a base class of a C++ class.
Represents a C++ constructor within a class.
Represents a C++ base or member initializer.
void setSourceOrder(int Pos)
Set the source order of this initializer.
Represents a C++ destructor within a class.
Represents a C++ struct/union/class.
Decl * getLambdaContextDecl() const
Retrieve the declaration that provides additional context for a lambda, when the normal declaration c...
unsigned getLambdaIndexInContext() const
Retrieve the index of this lambda within the context declaration returned by getLambdaContextDecl().
base_class_iterator bases_begin()
base_class_iterator vbases_begin()
Represents a C++ temporary.
static CXXTemporary * Create(const ASTContext &C, const CXXDestructorDecl *Destructor)
bool visitInputFile(StringRef Filename, bool isSystem, bool isOverridden, bool isExplicitModule) override
if needsInputFileVisitation returns true, this is called for each non-system input file of the AST Fi...
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
bool ReadFullVersionInformation(StringRef FullVersion) override
Receives the full Clang version information.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef SpecificModuleCachePath, bool Complain) override
Receives the header search options.
bool ReadFileSystemOptions(const FileSystemOptions &FSOpts, bool Complain) override
Receives the file system options.
void ReadCounter(const serialization::ModuleFile &M, unsigned Value) override
Receives COUNTER value.
void ReadModuleMapFile(StringRef ModuleMapPath) override
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void ReadModuleName(StringRef ModuleName) override
bool needsInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the input files of the AST file via visitInpu...
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
void readModuleFileExtension(const ModuleFileExtensionMetadata &Metadata) override
Indicates that a particular module file extension has been read.
void visitModuleFile(StringRef Filename, serialization::ModuleKind Kind) override
This is called for each AST file loaded.
bool needsSystemInputFileVisitation() override
Returns true if this ASTReaderListener wants to receive the system input files of the AST file via vi...
bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
CodeGenOptions - Track various options which control how the code is optimized and passed to the back...
A reference to a concept and its template args, as it appears in the code.
static ConceptReference * Create(const ASTContext &C, NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, TemplateDecl *NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)
const TypeClass * getTypePtr() const
A map from continuous integer ranges to some value, with a very specialized interface.
void insertOrReplace(const value_type &Val)
typename Representation::const_iterator const_iterator
typename Representation::iterator iterator
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool hasExternalVisibleStorage() const
Whether this DeclContext has external storage containing additional declarations that are visible in ...
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void setMustBuildLookupTable()
Mark that there are external lexical declarations that we need to include in our lookup table (and th...
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
void setHasExternalLexicalStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations lexically in this context.
bool isDeclInLexicalTraversal(const Decl *D) const
Determine whether the given declaration is stored in the list of declarations lexically within this c...
decl_iterator decls_begin() const
unsigned getModuleFileIndex() const
DeclID getRawValue() const
unsigned getLocalDeclIndex() const
uint64_t DeclID
An ID number that refers to a declaration in an AST file.
Decl - This represents one declaration (or definition), e.g.
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
bool isUnconditionallyVisible() const
Determine whether this declaration is definitely visible to name lookup, independent of whether the o...
Kind
Lists the kind of concrete classes of Decl.
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
SourceLocation getLocation() const
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
DeclContext * getDeclContext()
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
GlobalDeclID getGlobalID() const
Retrieve the global declaration ID associated with this declaration, which specifies where this Decl ...
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
DeclarationNameLoc - Additional source/type location info for a declaration name.
static DeclarationNameLoc makeNamedTypeLoc(TypeSourceInfo *TInfo)
Construct location information for a constructor, destructor or conversion operator.
static DeclarationNameLoc makeCXXLiteralOperatorNameLoc(SourceLocation Loc)
Construct location information for a literal C++ operator.
static DeclarationNameLoc makeCXXOperatorNameLoc(SourceLocation BeginLoc, SourceLocation EndLoc)
Construct location information for a non-literal C++ operator.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name.
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
NameKind
The kind of the name stored in this DeclarationName.
@ CXXConversionFunctionName
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
NameKind getNameKind() const
Determine what kind of name this is.
Represents a ValueDecl that came out of a declarator.
void setRParenLoc(SourceLocation Loc)
void setDecltypeLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setTemplateNameLoc(SourceLocation Loc)
void setAttrNameLoc(SourceLocation loc)
void setAttrOperandParensRange(SourceRange range)
void setAttrExprOperand(Expr *e)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setNameLoc(SourceLocation Loc)
void setNameLoc(SourceLocation Loc)
A little helper class used to produce diagnostics.
bool wasUpgradedFromWarning() const
Whether this mapping attempted to map the diagnostic to a warning, but was overruled because the diag...
bool isErrorOrFatal() const
void setSeverity(diag::Severity Value)
static DiagnosticMapping deserialize(unsigned Bits)
Deserialize a mapping.
void setUpgradedFromWarning(bool Value)
Options for controlling the compiler diagnostics engine.
std::vector< std::string > Remarks
The list of -R... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > Warnings
The list of -W... options used to alter the diagnostic mappings, with the prefixes removed.
std::vector< std::string > SystemHeaderWarningsModules
The list of -Wsystem-headers-in-module=... options used to override whether -Wsystem-headers is enabl...
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
bool getEnableAllWarnings() const
Level
The level of the diagnostic, after it has been through mapping.
Level getDiagnosticLevel(unsigned DiagID, SourceLocation Loc) const
Based on the way the client configured the DiagnosticsEngine object, classify the specified diagnosti...
bool getSuppressSystemWarnings() const
bool getWarningsAsErrors() const
diag::Severity getExtensionHandlingBehavior() const
const IntrusiveRefCntPtr< DiagnosticIDs > & getDiagnosticIDs() const
StringRef getName() const
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation NameLoc)
This represents one expression.
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
static DeclContextLookupResult SetExternalVisibleDeclsForName(const DeclContext *DC, DeclarationName Name, ArrayRef< NamedDecl * > Decls)
uint32_t incrementGeneration(ASTContext &C)
Increment the current generation.
uint32_t getGeneration() const
Get the current generation of this AST source.
Represents difference between two FPOptions values.
static FPOptionsOverride getFromOpaqueInt(storage_type I)
FPOptions applyOverrides(FPOptions Base)
static FPOptions getFromOpaqueInt(storage_type Value)
Represents a member of a struct/union/class.
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
time_t getModificationTime() const
StringRef getName() const
The name of this FileEntry.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Implements support for file system lookup, file system caching, and directory search management.
llvm::vfs::FileSystem & getVirtualFileSystem() const
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(FileEntryRef Entry, bool isVolatile=false, bool RequiresNullTerminator=true, std::optional< int64_t > MaybeLimit=std::nullopt, bool IsText=true)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true)
Get a FileEntryRef if it exists, without doing anything on error.
FileEntryRef getVirtualFileRef(StringRef Filename, off_t Size, time_t ModificationTime)
Retrieve a file entry for a "virtual" file that acts as if there were a file with the given name on d...
Keeps track of options that affect how file operations are performed.
std::string WorkingDir
If set, paths are resolved as if the working directory was set to the value of WorkingDir.
Represents a function declaration or definition.
Represents a prototype with parameter type info, e.g.
ExtProtoInfo getExtProtoInfo() const
Wrapper for source info for functions.
unsigned getNumParams() const
void setLocalRangeBegin(SourceLocation L)
void setLParenLoc(SourceLocation Loc)
void setParam(unsigned i, ParmVarDecl *VD)
void setRParenLoc(SourceLocation Loc)
void setLocalRangeEnd(SourceLocation L)
void setExceptionSpecRange(SourceRange R)
llvm::SmallPtrSet< ModuleFile *, 4 > HitSet
A set of module files in which we found a result.
static std::pair< GlobalModuleIndex *, llvm::Error > readIndex(llvm::StringRef Path)
Read a global index file for the given directory.
One of these records is kept for each identifier that is lexed.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
bool isCPlusPlusOperatorKeyword() const
tok::TokenKind getTokenID() const
If this is a source-language token (e.g.
bool hadMacroDefinition() const
Returns true if this identifier was #defined to some value at any moment.
void setIsPoisoned(bool Value=true)
setIsPoisoned - Mark this identifier as poisoned.
bool isFromAST() const
Return true if the identifier in its current state was loaded from an AST file.
bool isPoisoned() const
Return true if this token has been poisoned.
bool hasRevertedTokenIDToIdentifier() const
True if revertTokenIDToIdentifier() was called.
tok::NotableIdentifierKind getNotableIdentifierID() const
void setOutOfDate(bool OOD)
Set whether the information for this identifier is out of date with respect to the external source.
tok::ObjCKeywordKind getObjCKeywordID() const
Return the Objective-C keyword ID for the this identifier.
void setObjCOrBuiltinID(unsigned ID)
void revertTokenIDToIdentifier()
Revert TokenID to tok::identifier; used for GNU libstdc++ 4.2 compatibility.
bool isOutOfDate() const
Determine whether the information for this identifier is out of date with respect to the external sou...
void setChangedSinceDeserialization()
Note that this identifier has changed since it was loaded from an AST file.
void * getFETokenInfo() const
Get and set FETokenInfo.
StringRef getName() const
Return the actual identifier string.
bool isExtensionToken() const
get/setExtension - Initialize information about whether or not this language token is an extension.
An iterator that walks over all of the known identifiers in the lookup table.
IdentifierIterator()=default
IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.
void RemoveDecl(NamedDecl *D)
RemoveDecl - Unlink the decl from its shadowed decl chain.
Implements an efficient mapping from strings to IdentifierInfo nodes.
llvm::MemoryBuffer * lookupPCM(llvm::StringRef Filename) const
Get a pointer to the pCM if it exists; else nullptr.
Record the location of an inclusion directive, such as an #include or #import statement.
InclusionKind
The kind of inclusion directives known to the preprocessor.
Represents a field injected from an anonymous union/struct into the parent scope.
Wrapper for source info for injected class names of class templates.
void setAmpLoc(SourceLocation Loc)
PragmaMSPointersToMembersKind
CompatibilityKind
For ASTs produced with different option value, signifies their level of compatibility.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
clang::ObjCRuntime ObjCRuntime
SanitizerSet Sanitize
Set of enabled sanitizers.
CommentOptions CommentOpts
Options for parsing comments.
std::string OMPHostIRFile
Name of the IR file that contains the result of the OpenMP target host code generation.
std::vector< llvm::Triple > OMPTargetTriples
Triples of the OpenMP targets that the host code codegen should take into account in order to generat...
std::string CurrentModule
The name of the current module, of which the main source file is a part.
std::vector< std::string > ModuleFeatures
The names of any features to enable in module 'requires' decls in addition to the hard-coded list in ...
An UnresolvedSet-like class that might not have been loaded from the external AST source yet.
unsigned getLineTableFilenameID(StringRef Str)
void AddEntry(FileID FID, const std::vector< LineEntry > &Entries)
Add a new line entry that has already been encoded into the internal representation of the line table...
static LocalDeclID get(ASTReader &Reader, serialization::ModuleFile &MF, DeclID ID)
Record the location of a macro definition.
Encapsulates changes to the "macros namespace" (the location where the macro name became active,...
void setPrevious(MacroDirective *Prev)
Set previous definition of the macro with the same name.
Records the location of a macro expansion.
Encapsulates the data about a macro definition (e.g.
void setUsedForHeaderGuard(bool Val)
void setHasCommaPasting()
void setDefinitionEndLoc(SourceLocation EndLoc)
Set the location of the last token in the macro.
void setParameterList(ArrayRef< IdentifierInfo * > List, llvm::BumpPtrAllocator &PPAllocator)
Set the specified list of identifiers as the parameter list for this macro.
llvm::MutableArrayRef< Token > allocateTokens(unsigned NumTokens, llvm::BumpPtrAllocator &PPAllocator)
void setIsFunctionLike()
Function/Object-likeness.
void setIsC99Varargs()
Varargs querying methods. This can only be set for function-like macros.
void setIsUsed(bool Val)
Set the value of the IsUsed flag.
void setExpansionLoc(SourceLocation Loc)
void setAttrRowOperand(Expr *e)
void setAttrColumnOperand(Expr *e)
void setAttrOperandParensRange(SourceRange range)
void setAttrNameLoc(SourceLocation loc)
void setStarLoc(SourceLocation Loc)
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
The module cache used for compiling modules implicitly.
virtual InMemoryModuleCache & getInMemoryModuleCache()=0
Returns this process's view of the module cache.
void addLinkAsDependency(Module *Mod)
Make module to use export_as as the link dependency name if enough information is available or add it...
void setUmbrellaDirAsWritten(Module *Mod, DirectoryEntryRef UmbrellaDir, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory)
Sets the umbrella directory of the given module to the given directory.
OptionalFileEntryRef getContainingModuleMapFile(const Module *Module) const
Module * findModule(StringRef Name) const
Retrieve a module with the given name.
void setInferredModuleAllowedBy(Module *M, FileID ModMapFID)
void setUmbrellaHeaderAsWritten(Module *Mod, FileEntryRef UmbrellaHeader, const Twine &NameAsWritten, const Twine &PathRelativeToRootModuleDirectory)
Sets the umbrella header of the given module to the given header.
llvm::DenseSet< FileEntryRef > AdditionalModMapsSet
Module * findOrCreateModuleFirst(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Call ModuleMap::findOrCreateModule and throw away the information whether the module was found or cre...
Module * createModule(StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
Create new submodule, assuming it does not exist.
void resolveLinkAsDependencies(Module *Mod)
Use PendingLinkAsModule information to mark top level link names that are going to be replaced by exp...
ModuleHeaderRole
Flags describing the role of a module header.
void addHeader(Module *Mod, Module::Header Header, ModuleHeaderRole Role, bool Imported=false)
Adds this header to the given module.
Describes a module or submodule.
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
void addRequirement(StringRef Feature, bool RequiredState, const LangOptions &LangOpts, const TargetInfo &Target)
Add the given feature requirement to the list of features required by this module.
unsigned InferSubmodules
Whether we should infer submodules for this module based on the headers.
std::vector< std::string > ConfigMacros
The set of "configuration macros", which are macros that (intentionally) change how this module is bu...
unsigned IsUnimportable
Whether this module has declared itself unimportable, either because it's missing a requirement from ...
NameVisibilityKind NameVisibility
The visibility of names within this particular module.
NameVisibilityKind
Describes the visibility of the various names within a particular module.
@ Hidden
All of the names in this module are hidden.
@ AllVisible
All of the names in this module are visible.
SourceLocation DefinitionLoc
The location of the module definition.
SmallVector< UnresolvedHeaderDirective, 1 > MissingHeaders
Headers that are mentioned in the module map file but could not be found on the file system.
ModuleKind Kind
The kind of this module.
void addTopHeaderFilename(StringRef Filename)
Add a top-level header filename associated with this module.
bool isUnimportable() const
Determine whether this module has been declared unimportable.
void setASTFile(OptionalFileEntryRef File)
Set the serialized AST file for the top-level module of this module.
unsigned IsSystem
Whether this is a "system" module (which assumes that all headers in it are system headers).
std::string Name
The name of this module.
unsigned IsExternC
Whether this is an 'extern "C"' module (which implicitly puts all headers in it within an 'extern "C"...
unsigned ModuleMapIsPrivate
Whether this module came from a "private" module map, found next to a regular (public) module map.
llvm::SmallVector< LinkLibrary, 2 > LinkLibraries
The set of libraries or frameworks to link against when an entity from this module is used.
SmallVector< UnresolvedExportDecl, 2 > UnresolvedExports
The set of export declarations that have yet to be resolved.
std::optional< Header > getUmbrellaHeaderAsWritten() const
Retrieve the umbrella header as written.
SmallVector< Requirement, 2 > Requirements
The set of language features required to use this module.
bool isHeaderLikeModule() const
Is this module have similar semantics as headers.
OptionalDirectoryEntryRef Directory
The build directory of this module.
unsigned NamedModuleHasInit
Whether this C++20 named modules doesn't need an initializer.
StringRef getPrimaryModuleInterfaceName() const
Get the primary module interface name from a partition.
unsigned ConfigMacrosExhaustive
Whether the set of configuration macros is exhaustive.
std::string PresumedModuleMapFile
The presumed file name for the module map defining this module.
ASTFileSignature Signature
The module signature.
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
unsigned InferExportWildcard
Whether, when inferring submodules, the inferr submodules should export all modules they import (e....
void getExportedModules(SmallVectorImpl< Module * > &Exported) const
Appends this module's list of exported modules to Exported.
std::vector< UnresolvedConflict > UnresolvedConflicts
The list of conflicts for which the module-id has not yet been resolved.
unsigned IsFromModuleFile
Whether this module was loaded from a module file.
llvm::PointerIntPair< Module *, 1, bool > ExportDecl
Describes an exported module.
std::optional< DirectoryName > getUmbrellaDirAsWritten() const
Retrieve the umbrella directory as written.
std::string ExportAsModule
The module through which entities defined in this module will eventually be exposed,...
unsigned IsAvailable
Whether this module is available in the current translation unit.
unsigned InferExplicitSubmodules
Whether, when inferring submodules, the inferred submodules should be explicit.
OptionalFileEntryRef getASTFile() const
The serialized AST file for this module, if one was created.
std::vector< Conflict > Conflicts
The list of conflicts.
This represents a decl that may have a name.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Represent a C++ namespace.
Class that aids in the construction of nested-name-specifiers along with source-location information ...
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
A C++ nested-name-specifier augmented with source location information.
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
static std::string getOwningModuleNameForDiagnostic(const Decl *D)
Get the best name we know for the module that owns the given declaration, or an empty string if the d...
This represents the 'absent' clause in the 'pragma omp assume' directive.
static OMPAbsentClause * CreateEmpty(const ASTContext &C, unsigned NumKinds)
This represents 'acq_rel' clause in the 'pragma omp atomic|flush' directives.
This represents 'acquire' clause in the 'pragma omp atomic|flush' directives.
This represents clause 'affinity' in the 'pragma omp task'-based directives.
static OMPAffinityClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N locator items.
This represents the 'align' clause in the 'pragma omp allocate' directive.
This represents clause 'aligned' in the 'pragma omp ...' directives.
static OMPAlignedClause * CreateEmpty(const ASTContext &C, unsigned NumVars)
Creates an empty clause with the place for NumVars variables.
This represents clause 'allocate' in the 'pragma omp ...' directives.
static OMPAllocateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'allocator' clause in the 'pragma omp ...' directive.
This represents 'at' clause in the 'pragma omp error' directive.
This represents 'atomic_default_mem_order' clause in the 'pragma omp requires' directive.
This represents 'bind' clause in the 'pragma omp ...' directives.
static OMPBindClause * CreateEmpty(const ASTContext &C)
Build an empty 'bind' clause.
This represents 'capture' clause in the 'pragma omp atomic' directive.
Contains data for OpenMP directives: clauses, children expressions/statements (helpers for codegen) a...
void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C)
OMPClauseReader(ASTRecordReader &Record)
void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C)
void Visit(PTR(OMPClause) S)
Class that handles post-update expression for some clauses, like 'lastprivate', 'reduction' etc.
Class that handles pre-initialization statement for some clauses, like 'schedule',...
This is a basic class for representing single OpenMP clause.
This represents 'collapse' clause in the 'pragma omp ...' directive.
This represents 'compare' clause in the 'pragma omp atomic' directive.
This represents the 'contains' clause in the 'pragma omp assume' directive.
static OMPContainsClause * CreateEmpty(const ASTContext &C, unsigned NumKinds)
This represents clause 'copyin' in the 'pragma omp ...' directives.
static OMPCopyinClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents clause 'copyprivate' in the 'pragma omp ...' directives.
static OMPCopyprivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'default' clause in the 'pragma omp ...' directive.
This represents 'defaultmap' clause in the 'pragma omp ...' directive.
This represents implicit clause 'depend' for the 'pragma omp task' directive.
static OMPDependClause * CreateEmpty(const ASTContext &C, unsigned N, unsigned NumLoops)
Creates an empty clause with N variables.
This represents implicit clause 'depobj' for the 'pragma omp depobj' directive.
static OMPDepobjClause * CreateEmpty(const ASTContext &C)
Creates an empty clause.
This represents 'destroy' clause in the 'pragma omp depobj' directive or the 'pragma omp interop' dir...
This represents 'detach' clause in the 'pragma omp task' directive.
This represents 'device' clause in the 'pragma omp ...' directive.
This represents 'dist_schedule' clause in the 'pragma omp ...' directive.
This represents the 'doacross' clause for the 'pragma omp ordered' directive.
static OMPDoacrossClause * CreateEmpty(const ASTContext &C, unsigned N, unsigned NumLoops)
Creates an empty clause with N expressions.
This represents 'dynamic_allocators' clause in the 'pragma omp requires' directive.
This represents clause 'exclusive' in the 'pragma omp scan' directive.
static OMPExclusiveClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'fail' clause in the 'pragma omp atomic' directive.
This represents 'filter' clause in the 'pragma omp ...' directive.
This represents 'final' clause in the 'pragma omp ...' directive.
This represents clause 'firstprivate' in the 'pragma omp ...' directives.
static OMPFirstprivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents implicit clause 'flush' for the 'pragma omp flush' directive.
static OMPFlushClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents clause 'from' in the 'pragma omp ...' directives.
static OMPFromClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
Representation of the 'full' clause of the 'pragma omp unroll' directive.
static OMPFullClause * CreateEmpty(const ASTContext &C)
Build an empty 'full' AST node for deserialization.
This represents 'grainsize' clause in the 'pragma omp ...' directive.
This represents clause 'has_device_ptr' in the 'pragma omp ...' directives.
static OMPHasDeviceAddrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents 'hint' clause in the 'pragma omp ...' directive.
This represents the 'holds' clause in the 'pragma omp assume' directive.
This represents 'if' clause in the 'pragma omp ...' directive.
This represents clause 'in_reduction' in the 'pragma omp task' directives.
static OMPInReductionClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents clause 'inclusive' in the 'pragma omp scan' directive.
static OMPInclusiveClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents the 'init' clause in 'pragma omp ...' directives.
static OMPInitClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N expressions.
This represents clause 'is_device_ptr' in the 'pragma omp ...' directives.
static OMPIsDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents clause 'lastprivate' in the 'pragma omp ...' directives.
static OMPLastprivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents clause 'linear' in the 'pragma omp ...' directives.
static OMPLinearClause * CreateEmpty(const ASTContext &C, unsigned NumVars)
Creates an empty clause with the place for NumVars variables.
This class represents the 'looprange' clause in the 'pragma omp fuse' directive.
static OMPLoopRangeClause * CreateEmpty(const ASTContext &C)
Build an empty 'looprange' clause node.
This represents clause 'map' in the 'pragma omp ...' directives.
static OMPMapClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars original expressions, NumUniqueDeclarations declar...
This represents 'mergeable' clause in the 'pragma omp ...' directive.
This represents the 'message' clause in the 'pragma omp error' and the 'pragma omp parallel' directiv...
This represents the 'no_openmp' clause in the 'pragma omp assume' directive.
This represents the 'no_openmp_constructs' clause in the.
This represents the 'no_openmp_routines' clause in the 'pragma omp assume' directive.
This represents the 'no_parallelism' clause in the 'pragma omp assume' directive.
This represents 'nocontext' clause in the 'pragma omp ...' directive.
This represents 'nogroup' clause in the 'pragma omp ...' directive.
This represents clause 'nontemporal' in the 'pragma omp ...' directives.
static OMPNontemporalClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'novariants' clause in the 'pragma omp ...' directive.
This represents 'nowait' clause in the 'pragma omp ...' directive.
This represents 'num_tasks' clause in the 'pragma omp ...' directive.
This represents 'num_teams' clause in the 'pragma omp ...' directive.
static OMPNumTeamsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'num_threads' clause in the 'pragma omp ...' directive.
This represents 'order' clause in the 'pragma omp ...' directive.
This represents 'ordered' clause in the 'pragma omp ...' directive.
static OMPOrderedClause * CreateEmpty(const ASTContext &C, unsigned NumLoops)
Build an empty clause.
Representation of the 'partial' clause of the 'pragma omp unroll' directive.
static OMPPartialClause * CreateEmpty(const ASTContext &C)
Build an empty 'partial' AST node for deserialization.
This class represents the 'permutation' clause in the 'pragma omp interchange' directive.
static OMPPermutationClause * CreateEmpty(const ASTContext &C, unsigned NumLoops)
Build an empty 'permutation' AST node for deserialization.
This represents 'priority' clause in the 'pragma omp ...' directive.
This represents clause 'private' in the 'pragma omp ...' directives.
static OMPPrivateClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'proc_bind' clause in the 'pragma omp ...' directive.
This represents 'read' clause in the 'pragma omp atomic' directive.
This represents clause 'reduction' in the 'pragma omp ...' directives.
static OMPReductionClause * CreateEmpty(const ASTContext &C, unsigned N, OpenMPReductionClauseModifier Modifier)
Creates an empty clause with the place for N variables.
This represents 'relaxed' clause in the 'pragma omp atomic' directives.
This represents 'release' clause in the 'pragma omp atomic|flush' directives.
This represents 'reverse_offload' clause in the 'pragma omp requires' directive.
This represents 'simd' clause in the 'pragma omp ...' directive.
This represents 'safelen' clause in the 'pragma omp ...' directive.
This represents 'schedule' clause in the 'pragma omp ...' directive.
This represents 'self_maps' clause in the 'pragma omp requires' directive.
This represents 'seq_cst' clause in the 'pragma omp atomic|flush' directives.
This represents the 'severity' clause in the 'pragma omp error' and the 'pragma omp parallel' directi...
This represents clause 'shared' in the 'pragma omp ...' directives.
static OMPSharedClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'simdlen' clause in the 'pragma omp ...' directive.
This represents the 'sizes' clause in the 'pragma omp tile' directive.
static OMPSizesClause * CreateEmpty(const ASTContext &C, unsigned NumSizes)
Build an empty 'sizes' AST node for deserialization.
This represents clause 'task_reduction' in the 'pragma omp taskgroup' directives.
static OMPTaskReductionClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N variables.
This represents 'thread_limit' clause in the 'pragma omp ...' directive.
static OMPThreadLimitClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with N variables.
This represents 'threads' clause in the 'pragma omp ...' directive.
This represents 'threadset' clause in the 'pragma omp task ...' directive.
This represents clause 'to' in the 'pragma omp ...' directives.
static OMPToClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
llvm::SmallVector< OMPTraitSet, 2 > Sets
The outermost level of selector sets.
This represents 'unified_address' clause in the 'pragma omp requires' directive.
This represents 'unified_shared_memory' clause in the 'pragma omp requires' directive.
This represents 'untied' clause in the 'pragma omp ...' directive.
This represents 'update' clause in the 'pragma omp atomic' directive.
static OMPUpdateClause * CreateEmpty(const ASTContext &C, bool IsExtended)
Creates an empty clause with the place for N variables.
This represents the 'use' clause in 'pragma omp ...' directives.
This represents clause 'use_device_addr' in the 'pragma omp ...' directives.
static OMPUseDeviceAddrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents clause 'use_device_ptr' in the 'pragma omp ...' directives.
static OMPUseDevicePtrClause * CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes)
Creates an empty clause with the place for NumVars variables.
This represents clause 'uses_allocators' in the 'pragma omp target'-based directives.
static OMPUsesAllocatorsClause * CreateEmpty(const ASTContext &C, unsigned N)
Creates an empty clause with the place for N allocators.
This represents 'weak' clause in the 'pragma omp atomic' directives.
This represents 'write' clause in the 'pragma omp atomic' directive.
This represents 'ompx_attribute' clause in a directive that might generate an outlined function.
This represents 'ompx_bare' clause in the 'pragma omp target teams ...' directive.
This represents 'ompx_dyn_cgroup_mem' clause in the 'pragma omp target ...' directive.
method_range methods() const
void setNameLoc(SourceLocation Loc)
void setNameEndLoc(SourceLocation Loc)
ObjCMethodDecl - Represents an instance or class method declaration.
bool hasBody() const override
Determine whether this method has a body.
void setLazyBody(uint64_t Offset)
void setStarLoc(SourceLocation Loc)
void setTypeArgsRAngleLoc(SourceLocation Loc)
unsigned getNumTypeArgs() const
unsigned getNumProtocols() const
void setTypeArgsLAngleLoc(SourceLocation Loc)
void setTypeArgTInfo(unsigned i, TypeSourceInfo *TInfo)
void setProtocolLAngleLoc(SourceLocation Loc)
void setProtocolRAngleLoc(SourceLocation Loc)
void setHasBaseTypeAsWritten(bool HasBaseType)
void setProtocolLoc(unsigned i, SourceLocation Loc)
Kind
The basic Objective-C runtimes that we know about.
unsigned getNumProtocols() const
void setProtocolLoc(unsigned i, SourceLocation Loc)
void setProtocolLAngleLoc(SourceLocation Loc)
void setProtocolRAngleLoc(SourceLocation Loc)
static OpenACCAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCAttachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCAutoClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCBindClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, const IdentifierInfo *ID, SourceLocation EndLoc)
This is the base type for all OpenACC Clauses.
static OpenACCCollapseClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, bool HasForce, Expr *LoopCount, SourceLocation EndLoc)
static OpenACCCopyClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyInClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyOutClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCreateClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDefaultAsyncClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCDefaultClause * Create(const ASTContext &C, OpenACCDefaultClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
static OpenACCDeleteClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDetachClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceNumClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCDevicePtrClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceResidentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceTypeClause * Create(const ASTContext &C, OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< DeviceTypeArgument > Archs, SourceLocation EndLoc)
static OpenACCFinalizeClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCFirstPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, ArrayRef< OpenACCFirstPrivateRecipe > InitRecipes, SourceLocation EndLoc)
static OpenACCGangClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< OpenACCGangKind > GangKinds, ArrayRef< Expr * > IntExprs, SourceLocation EndLoc)
static OpenACCHostClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCIfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCIfPresentClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCIndependentClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCLinkClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoCreateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoHostClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCNumGangsClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > IntExprs, SourceLocation EndLoc)
static OpenACCNumWorkersClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCPresentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCPrivateClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, ArrayRef< OpenACCPrivateRecipe > InitRecipes, SourceLocation EndLoc)
static OpenACCReductionClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCReductionOperator Operator, ArrayRef< Expr * > VarList, ArrayRef< OpenACCReductionRecipeWithStorage > Recipes, SourceLocation EndLoc)
static OpenACCSelfClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *ConditionExpr, SourceLocation EndLoc)
static OpenACCSeqClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCTileClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > SizeExprs, SourceLocation EndLoc)
static OpenACCUseDeviceClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCVectorClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCVectorLengthClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCWaitClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *DevNumExpr, SourceLocation QueuesLoc, ArrayRef< Expr * > QueueIdExprs, SourceLocation EndLoc)
static OpenACCWorkerClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
This abstract interface provides operations for unwrapping containers for serialized ASTs (precompile...
bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts, StringRef ModuleFilename, bool Complain) override
Receives the diagnostic options.
bool ReadLanguageOptions(const LangOptions &LangOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the language options.
bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef ModuleFilename, StringRef SpecificModuleCachePath, bool Complain) override
Receives the header search options.
void ReadCounter(const serialization::ModuleFile &M, unsigned Value) override
Receives COUNTER value.
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
bool ReadCodeGenOptions(const CodeGenOptions &CGOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the codegen options.
bool ReadTargetOptions(const TargetOptions &TargetOpts, StringRef ModuleFilename, bool Complain, bool AllowCompatibleDifferences) override
Receives the target options.
void setEllipsisLoc(SourceLocation Loc)
void setEllipsisLoc(SourceLocation Loc)
void setRParenLoc(SourceLocation Loc)
void setLParenLoc(SourceLocation Loc)
Represents a parameter to a function.
void setKWLoc(SourceLocation Loc)
void setStarLoc(SourceLocation Loc)
Base class that describes a preprocessed entity, which may be a preprocessor directive or macro expan...
A record of the steps taken while preprocessing a source file, including the various preprocessing di...
PreprocessorOptions - This class is used for passing the various options used in preprocessor initial...
std::vector< std::string > MacroIncludes
std::vector< std::string > Includes
ObjCXXARCStandardLibraryKind ObjCXXARCStandardLibrary
The Objective-C++ ARC standard library that we should support, by providing appropriate definitions t...
std::string PCHThroughHeader
If non-empty, the filename used in an include directive in the primary source file (or command-line p...
bool DetailedRecord
Whether we should maintain a detailed record of all macro definitions and expansions.
std::string ImplicitPCHInclude
The implicit PCH included at the start of the translation unit, or empty.
bool AllowPCHWithDifferentModulesCachePath
When true, a PCH with modules cache path different to the current compilation will not be rejected.
bool UsePredefines
Initialize the preprocessor with the compiler and target specific predefines.
std::vector< std::pair< std::string, bool > > Macros
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
Module * getCurrentModule()
Retrieves the module that we're currently building, if any.
HeaderSearch & getHeaderSearchInfo() const
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
@ FastWidth
The width of the "fast" qualifier mask.
@ FastMask
The fast qualifier mask.
void setAmpAmpLoc(SourceLocation Loc)
Wrapper for source info for record types.
Declaration of a redeclarable template.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
This table allows us to fully hide how we implement multi-keyword caching.
Selector getNullarySelector(const IdentifierInfo *ID)
Selector getSelector(unsigned NumArgs, const IdentifierInfo **IIV)
Can create any sort of selector.
Selector getUnarySelector(const IdentifierInfo *ID)
Smart pointer class that efficiently represents Objective-C method names.
void * getAsOpaquePtr() const
void addMethodToGlobalList(ObjCMethodList *List, ObjCMethodDecl *Method)
Add the given method to the list of globally-known methods.
GlobalMethodPool MethodPool
Method Pool - allows efficient lookup when typechecking messages to "id".
Sema - This implements semantic analysis and AST building for C.
void addExternalSource(IntrusiveRefCntPtr< ExternalSemaSource > E)
Registers an external source.
IdentifierResolver IdResolver
ASTReaderListenter implementation to set SuggestedPredefines of ASTReader which is required to use a ...
bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, StringRef ModuleFilename, bool ReadMacros, bool Complain, std::string &SuggestedPredefines) override
Receives the preprocessor options.
Encodes a location in the source.
static SourceLocation getFromRawEncoding(UIntTy Encoding)
Turn a raw encoding of a SourceLocation object into a real SourceLocation.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
This class handles loading and caching of source files into memory.
SourceLocation getFileLoc(SourceLocation Loc) const
Given Loc, if it is a macro location return the expansion location or the spelling location,...
bool isBeforeInTranslationUnit(SourceLocation LHS, SourceLocation RHS) const
Determines the order of 2 source locations in the translation unit.
A trivial tuple used to represent a source range.
One instance of this struct is kept for every file loaded or used.
OptionalFileEntryRef ContentsEntry
References the file which the contents were actually loaded from.
std::optional< llvm::MemoryBufferRef > getBufferIfLoaded() const
Return the buffer, only if it has been loaded.
unsigned BufferOverridden
Indicates whether the buffer itself was provided to override the actual file contents.
OptionalFileEntryRef OrigEntry
Reference to the file entry representing this ContentCache.
Information about a FileID, basically just the logical file that it represents and include stack info...
void setHasLineDirectives()
Set the flag that indicates that this FileID has line table entries associated with it.
Stmt - This represents one statement.
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
Options for controlling the target.
std::string Triple
The name of the target triple to compile for.
std::vector< std::string > Features
The list of target specific features to enable or disable – this should be a list of strings starting...
std::string ABI
If given, the name of the target ABI to use.
std::string TuneCPU
If given, the name of the target CPU to tune code for.
std::string CPU
If given, the name of the target CPU to generate code for.
std::vector< std::string > FeaturesAsWritten
The list of target specific features to enable or disable, as written on the command line.
A convenient class for passing around template argument information.
Location wrapper for a TemplateArgument.
Represents a template argument.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
ArgKind
The kind of template argument we're storing.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
Stores a list of template parameters for a TemplateDecl and its derived classes.
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
unsigned getNumArgs() const
MutableArrayRef< TemplateArgumentLocInfo > getArgLocInfos()
void set(SourceLocation ElaboratedKeywordLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKeywordLoc, SourceLocation NameLoc, SourceLocation LAngleLoc, SourceLocation RAngleLoc)
Token - This structure provides full information about a lexed token.
[BoundsSafety] Represents information of declarations referenced by the arguments of the counted_by a...
TypeLocReader(ASTRecordReader &Reader)
void VisitArrayTypeLoc(ArrayTypeLoc)
void VisitFunctionTypeLoc(FunctionTypeLoc)
void VisitTagTypeLoc(TagTypeLoc TL)
RetTy Visit(TypeLoc TyLoc)
Base wrapper for a particular "section" of type source info.
TypeLoc getNextTypeLoc() const
Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the TypeLoc is a PointerLoc and next Typ...
void setUnmodifiedTInfo(TypeSourceInfo *TI) const
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
const T * getAs() const
Member-template getAs<specific type>'.
Base class for declarations which introduce a typedef-name.
void setLParenLoc(SourceLocation Loc)
void setTypeofLoc(SourceLocation Loc)
void setRParenLoc(SourceLocation Loc)
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
void setNameLoc(SourceLocation Loc)
Captures information about a #pragma weak directive.
Source location and bit offset of a declaration.
A key used when looking up entities by DeclarationName.
unsigned getHash() const
Compute a fingerprint of this key for use in on-disk hash table.
DeclarationNameKey()=default
Information about a module that has been loaded by the ASTReader.
const PPEntityOffset * PreprocessedEntityOffsets
void * IdentifierLookupTable
A pointer to an on-disk hash table of opaque type IdentifierHashTable.
void * SelectorLookupTable
A pointer to an on-disk hash table of opaque type ASTSelectorLookupTable.
std::vector< std::unique_ptr< ModuleFileExtensionReader > > ExtensionReaders
The list of extension readers that are attached to this module file.
SourceLocation DirectImportLoc
The source location where the module was explicitly or implicitly imported in the local translation u...
StringRef Data
The serialized bitstream data for this file.
const serialization::ObjCCategoriesInfo * ObjCCategoriesMap
Array of category list location information within this module file, sorted by the definition ID.
ContinuousRangeMap< uint32_t, int, 2 > PreprocessedEntityRemap
Remapping table for preprocessed entity IDs in this module.
int SLocEntryBaseID
The base ID in the source manager's view of this module.
serialization::IdentifierID BaseIdentifierID
Base identifier ID for identifiers local to this module.
serialization::PreprocessedEntityID BasePreprocessedEntityID
Base preprocessed entity ID for preprocessed entities local to this module.
serialization::TypeID BaseTypeIndex
Base type ID for types local to this module as represented in the global type ID space.
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
uint64_t MacroOffsetsBase
Base file offset for the offsets in MacroOffsets.
const llvm::support::unaligned_uint64_t * InputFileOffsets
Relative offsets for all of the input file entries in the AST file.
std::vector< unsigned > PreloadIdentifierOffsets
Offsets of identifiers that we're going to preload within IdentifierTableData.
unsigned LocalNumIdentifiers
The number of identifiers in this AST file.
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
const unsigned char * IdentifierTableData
Actual data for the on-disk hash table of identifiers.
uint64_t SLocEntryOffsetsBase
Base file offset for the offsets in SLocEntryOffsets.
llvm::BitstreamCursor InputFilesCursor
The cursor to the start of the input-files block.
std::vector< InputFile > InputFilesLoaded
The input files that have been loaded from this AST file.
serialization::SelectorID BaseSelectorID
Base selector ID for selectors local to this module.
llvm::SetVector< ModuleFile * > ImportedBy
List of modules which depend on this module.
const char * HeaderFileInfoTableData
Actual data for the on-disk hash table of header file information.
SourceLocation ImportLoc
The source location where this module was first imported.
const serialization::unaligned_decl_id_t * FileSortedDecls
Array of file-level DeclIDs sorted by file.
const uint32_t * SLocEntryOffsets
Offsets for all of the source location entries in the AST file.
llvm::BitstreamCursor MacroCursor
The cursor to the start of the preprocessor block, which stores all of the macro definitions.
FileID OriginalSourceFileID
The file ID for the original source file that was used to build this AST file.
FileEntryRef File
The file entry for the module file.
std::string ActualOriginalSourceFileName
The actual original source file name that was used to build this AST file.
uint64_t PreprocessorDetailStartOffset
The offset of the start of the preprocessor detail cursor.
std::vector< InputFileInfo > InputFileInfosLoaded
The input file infos that have been loaded from this AST file.
unsigned LocalNumSubmodules
The number of submodules in this module.
SourceLocation FirstLoc
The first source location in this module.
ASTFileSignature ASTBlockHash
The signature of the AST block of the module file, this can be used to unique module files based on A...
uint64_t SourceManagerBlockStartOffset
The bit offset to the start of the SOURCE_MANAGER_BLOCK.
bool DidReadTopLevelSubmodule
Whether the top-level module has been read from the AST file.
std::string OriginalSourceFileName
The original source file name that was used to build the primary AST file, which may have been modifi...
bool isModule() const
Is this a module file for a module (rather than a PCH or similar).
bool HasTimestamps
Whether timestamps are included in this module file.
uint64_t InputFilesOffsetBase
Absolute offset of the start of the input-files block.
llvm::BitstreamCursor SLocEntryCursor
Cursor used to read source location entries.
unsigned NumPreprocessedEntities
bool RelocatablePCH
Whether this precompiled header is a relocatable PCH file.
const uint32_t * SelectorOffsets
Offsets into the selector lookup table's data array where each selector resides.
unsigned BaseDeclIndex
Base declaration index in ASTReader for declarations local to this module.
unsigned NumFileSortedDecls
unsigned LocalNumSLocEntries
The number of source location entries in this AST file.
void * HeaderFileInfoTable
The on-disk hash table that contains information about each of the header files.
unsigned Index
The index of this module in the list of modules.
unsigned NumUserInputFiles
llvm::BitstreamCursor Stream
The main bitstream cursor for the main block.
serialization::SubmoduleID BaseSubmoduleID
Base submodule ID for submodules local to this module.
uint64_t SizeInBits
The size of this file, in bits.
const UnalignedUInt64 * TypeOffsets
Offset of each type within the bitstream, indexed by the type ID, or the representation of a Type*.
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
bool StandardCXXModule
Whether this module file is a standard C++ module.
unsigned LocalNumTypes
The number of types in this AST file.
StringRef ModuleOffsetMap
The module offset map data for this file.
const PPSkippedRange * PreprocessedSkippedRangeOffsets
std::string FileName
The file name of the module file.
uint64_t InputFilesValidationTimestamp
If non-zero, specifies the time when we last validated input files.
llvm::BitstreamCursor PreprocessorDetailCursor
The cursor to the start of the (optional) detailed preprocessing record block.
SourceLocation::UIntTy SLocEntryBaseOffset
The base offset in the source manager's view of this module.
std::string ModuleMapPath
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
uint64_t MacroStartOffset
The offset of the start of the set of defined macros.
ASTFileSignature Signature
The signature of the module file, which may be used instead of the size and modification time to iden...
unsigned LocalNumMacros
The number of macros in this AST file.
unsigned NumPreprocessedSkippedRanges
const unsigned char * SelectorLookupTableData
A pointer to the character data that comprises the selector table.
void dump()
Dump debugging output for this module.
unsigned LocalNumDecls
The number of declarations in this AST file.
unsigned LocalNumHeaderFileInfos
The number of local HeaderFileInfo structures.
llvm::BitVector SearchPathUsage
The bit vector denoting usage of each header search entry (true = used).
unsigned Generation
The generation of which this module file is a part.
const uint32_t * IdentifierOffsets
Offsets into the identifier table data.
ContinuousRangeMap< uint32_t, int, 2 > SelectorRemap
Remapping table for selector IDs in this module.
ContinuousRangeMap< uint32_t, int, 2 > MacroRemap
Remapping table for macro IDs in this module.
const uint32_t * MacroOffsets
Offsets of macros in the preprocessor block.
uint64_t ASTBlockStartOffset
The bit offset of the AST block of this module.
ContinuousRangeMap< uint32_t, int, 2 > SubmoduleRemap
Remapping table for submodule IDs in this module.
llvm::BitVector VFSUsage
The bit vector denoting usage of each VFS entry (true = used).
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
SmallVector< uint64_t, 8 > PragmaDiagMappings
Diagnostic IDs and their mappings that the user changed.
unsigned BasePreprocessedSkippedRangeID
Base ID for preprocessed skipped ranges local to this module.
unsigned LocalNumSelectors
The number of selectors new to this file.
ModuleKind Kind
The type of this module.
std::string ModuleName
The name of the module.
serialization::MacroID BaseMacroID
Base macro ID for macros local to this module.
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
std::string BaseDirectory
The base directory of the module.
llvm::SmallVector< ModuleFile *, 16 > TransitiveImports
List of modules which this modules dependent on.
Manages the set of modules loaded by an AST reader.
AddModuleResult
The result of attempting to add a new module.
@ Missing
The module file is missing.
@ OutOfDate
The module file is out-of-date.
@ NewlyLoaded
The module file was just loaded in response to this call.
@ AlreadyLoaded
The module file had already been loaded.
llvm::iterator_range< SmallVectorImpl< ModuleFile * >::const_iterator > pch_modules() const
A range covering the PCH and preamble module files loaded.
ModuleReverseIterator rbegin()
Reverse iterator to traverse all loaded modules.
unsigned size() const
Number of modules loaded.
Source range/offset of a preprocessed entity.
uint32_t getOffset() const
RawLocEncoding getBegin() const
RawLocEncoding getEnd() const
Source range of a skipped preprocessor region.
RawLocEncoding getBegin() const
RawLocEncoding getEnd() const
unsigned getFactoryBits() const
ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, unsigned PriorGeneration)
ArrayRef< ObjCMethodDecl * > getInstanceMethods() const
Retrieve the instance methods found by this visitor.
ArrayRef< ObjCMethodDecl * > getFactoryMethods() const
Retrieve the instance methods found by this visitor.
bool instanceHasMoreThanOneDecl() const
bool operator()(ModuleFile &M)
bool factoryHasMoreThanOneDecl() const
unsigned getInstanceBits() const
static TypeIdx fromTypeID(TypeID ID)
32 aligned uint64_t in the AST file.
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
void ReadDataIntoImpl(const unsigned char *d, unsigned DataLen, data_type_builder &Val)
file_type ReadFileRef(const unsigned char *&d)
DeclarationNameKey ReadKeyBase(const unsigned char *&d)
internal_key_type ReadKey(const unsigned char *d, unsigned)
DeclarationNameKey internal_key_type
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
static hash_value_type ComputeHash(const internal_key_type &a)
StringRef internal_key_type
static internal_key_type ReadKey(const unsigned char *d, unsigned n)
Class that performs lookup for an identifier stored in an AST file.
IdentifierID ReadIdentifierID(const unsigned char *d)
data_type ReadData(const internal_key_type &k, const unsigned char *d, unsigned DataLen)
Class that performs lookup for a selector's entries in the global method pool stored in an AST file.
internal_key_type ReadKey(const unsigned char *d, unsigned)
data_type ReadData(Selector, const unsigned char *d, unsigned DataLen)
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
static hash_value_type ComputeHash(Selector Sel)
external_key_type internal_key_type
Class that performs lookup to specialized decls.
file_type ReadFileRef(const unsigned char *&d)
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
unsigned internal_key_type
static std::pair< unsigned, unsigned > ReadKeyDataLength(const unsigned char *&d)
internal_key_type ReadKey(const unsigned char *d, unsigned)
std::pair< DeclarationName, const Module * > external_key_type
void ReadDataInto(internal_key_type, const unsigned char *d, unsigned DataLen, data_type_builder &Val)
std::pair< DeclarationNameKey, unsigned > internal_key_type
internal_key_type ReadKey(const unsigned char *d, unsigned)
static hash_value_type ComputeHash(const internal_key_type &Key)
static internal_key_type GetInternalKey(const external_key_type &Key)
PredefinedTypeIDs
Predefined type IDs.
CtorInitializerType
The different kinds of data that can occur in a CtorInitializer.
const unsigned NUM_PREDEF_TYPE_IDS
The number of predefined type IDs that are reserved for the PREDEF_TYPE_* constants.
const unsigned NumSpecialTypeIDs
The number of special type IDs.
TypeCode
Record codes for each kind of type.
@ PREDEF_TYPE_LONG_ACCUM_ID
The 'long _Accum' type.
@ PREDEF_TYPE_SAMPLER_ID
OpenCL sampler type.
@ PREDEF_TYPE_INT128_ID
The '__int128_t' type.
@ PREDEF_TYPE_CHAR32_ID
The C++ 'char32_t' type.
@ PREDEF_TYPE_SAT_SHORT_ACCUM_ID
The '_Sat short _Accum' type.
@ PREDEF_TYPE_IBM128_ID
The '__ibm128' type.
@ PREDEF_TYPE_SHORT_FRACT_ID
The 'short _Fract' type.
@ PREDEF_TYPE_AUTO_RREF_DEDUCT
The "auto &&" deduction type.
@ PREDEF_TYPE_BOUND_MEMBER
The placeholder type for bound member functions.
@ PREDEF_TYPE_LONGLONG_ID
The (signed) 'long long' type.
@ PREDEF_TYPE_FRACT_ID
The '_Fract' type.
@ PREDEF_TYPE_ARC_UNBRIDGED_CAST
ARC's unbridged-cast placeholder type.
@ PREDEF_TYPE_USHORT_FRACT_ID
The 'unsigned short _Fract' type.
@ PREDEF_TYPE_SAT_ULONG_FRACT_ID
The '_Sat unsigned long _Fract' type.
@ PREDEF_TYPE_BOOL_ID
The 'bool' or '_Bool' type.
@ PREDEF_TYPE_SAT_LONG_ACCUM_ID
The '_Sat long _Accum' type.
@ PREDEF_TYPE_SAT_LONG_FRACT_ID
The '_Sat long _Fract' type.
@ PREDEF_TYPE_SAT_SHORT_FRACT_ID
The '_Sat short _Fract' type.
@ PREDEF_TYPE_CHAR_U_ID
The 'char' type, when it is unsigned.
@ PREDEF_TYPE_RESERVE_ID_ID
OpenCL reserve_id type.
@ PREDEF_TYPE_SAT_ACCUM_ID
The '_Sat _Accum' type.
@ PREDEF_TYPE_BUILTIN_FN
The placeholder type for builtin functions.
@ PREDEF_TYPE_SHORT_ACCUM_ID
The 'short _Accum' type.
@ PREDEF_TYPE_FLOAT_ID
The 'float' type.
@ PREDEF_TYPE_QUEUE_ID
OpenCL queue type.
@ PREDEF_TYPE_INT_ID
The (signed) 'int' type.
@ PREDEF_TYPE_OBJC_SEL
The ObjC 'SEL' type.
@ PREDEF_TYPE_BFLOAT16_ID
The '__bf16' type.
@ PREDEF_TYPE_WCHAR_ID
The C++ 'wchar_t' type.
@ PREDEF_TYPE_UCHAR_ID
The 'unsigned char' type.
@ PREDEF_TYPE_UACCUM_ID
The 'unsigned _Accum' type.
@ PREDEF_TYPE_SCHAR_ID
The 'signed char' type.
@ PREDEF_TYPE_CHAR_S_ID
The 'char' type, when it is signed.
@ PREDEF_TYPE_NULLPTR_ID
The type of 'nullptr'.
@ PREDEF_TYPE_ULONG_FRACT_ID
The 'unsigned long _Fract' type.
@ PREDEF_TYPE_FLOAT16_ID
The '_Float16' type.
@ PREDEF_TYPE_UINT_ID
The 'unsigned int' type.
@ PREDEF_TYPE_FLOAT128_ID
The '__float128' type.
@ PREDEF_TYPE_OBJC_ID
The ObjC 'id' type.
@ PREDEF_TYPE_CHAR16_ID
The C++ 'char16_t' type.
@ PREDEF_TYPE_ARRAY_SECTION
The placeholder type for an array section.
@ PREDEF_TYPE_ULONGLONG_ID
The 'unsigned long long' type.
@ PREDEF_TYPE_SAT_UFRACT_ID
The '_Sat unsigned _Fract' type.
@ PREDEF_TYPE_USHORT_ID
The 'unsigned short' type.
@ PREDEF_TYPE_SHORT_ID
The (signed) 'short' type.
@ PREDEF_TYPE_OMP_ARRAY_SHAPING
The placeholder type for OpenMP array shaping operation.
@ PREDEF_TYPE_DEPENDENT_ID
The placeholder type for dependent types.
@ PREDEF_TYPE_LONGDOUBLE_ID
The 'long double' type.
@ PREDEF_TYPE_DOUBLE_ID
The 'double' type.
@ PREDEF_TYPE_UINT128_ID
The '__uint128_t' type.
@ PREDEF_TYPE_HALF_ID
The OpenCL 'half' / ARM NEON __fp16 type.
@ PREDEF_TYPE_VOID_ID
The void type.
@ PREDEF_TYPE_SAT_USHORT_FRACT_ID
The '_Sat unsigned short _Fract' type.
@ PREDEF_TYPE_ACCUM_ID
The '_Accum' type.
@ PREDEF_TYPE_SAT_FRACT_ID
The '_Sat _Fract' type.
@ PREDEF_TYPE_NULL_ID
The NULL type.
@ PREDEF_TYPE_USHORT_ACCUM_ID
The 'unsigned short _Accum' type.
@ PREDEF_TYPE_CHAR8_ID
The C++ 'char8_t' type.
@ PREDEF_TYPE_UFRACT_ID
The 'unsigned _Fract' type.
@ PREDEF_TYPE_OVERLOAD_ID
The placeholder type for overloaded function sets.
@ PREDEF_TYPE_INCOMPLETE_MATRIX_IDX
A placeholder type for incomplete matrix index operations.
@ PREDEF_TYPE_UNRESOLVED_TEMPLATE
The placeholder type for unresolved templates.
@ PREDEF_TYPE_SAT_USHORT_ACCUM_ID
The '_Sat unsigned short _Accum' type.
@ PREDEF_TYPE_LONG_ID
The (signed) 'long' type.
@ PREDEF_TYPE_SAT_ULONG_ACCUM_ID
The '_Sat unsigned long _Accum' type.
@ PREDEF_TYPE_LONG_FRACT_ID
The 'long _Fract' type.
@ PREDEF_TYPE_UNKNOWN_ANY
The 'unknown any' placeholder type.
@ PREDEF_TYPE_OMP_ITERATOR
The placeholder type for OpenMP iterator expression.
@ PREDEF_TYPE_PSEUDO_OBJECT
The pseudo-object placeholder type.
@ PREDEF_TYPE_OBJC_CLASS
The ObjC 'Class' type.
@ PREDEF_TYPE_ULONG_ID
The 'unsigned long' type.
@ PREDEF_TYPE_SAT_UACCUM_ID
The '_Sat unsigned _Accum' type.
@ PREDEF_TYPE_CLK_EVENT_ID
OpenCL clk event type.
@ PREDEF_TYPE_EVENT_ID
OpenCL event type.
@ PREDEF_TYPE_ULONG_ACCUM_ID
The 'unsigned long _Accum' type.
@ PREDEF_TYPE_AUTO_DEDUCT
The "auto" deduction type.
@ CTOR_INITIALIZER_MEMBER
@ CTOR_INITIALIZER_DELEGATING
@ CTOR_INITIALIZER_INDIRECT_MEMBER
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
@ DECL_PARTIAL_SPECIALIZATIONS
@ DECL_CONTEXT_TU_LOCAL_VISIBLE
A record that stores the set of declarations that are only visible to the TU.
@ DECL_CONTEXT_LEXICAL
A record that stores the set of declarations that are lexically stored within a given DeclContext.
@ DECL_CXX_CTOR_INITIALIZERS
A record containing CXXCtorInitializers.
@ DECL_CONTEXT_MODULE_LOCAL_VISIBLE
A record containing the set of declarations that are only visible from DeclContext in the same module...
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
@ TYPE_EXT_QUAL
An ExtQualType record.
@ SPECIAL_TYPE_OBJC_SEL_REDEFINITION
Objective-C "SEL" redefinition type.
@ SPECIAL_TYPE_UCONTEXT_T
C ucontext_t typedef type.
@ SPECIAL_TYPE_JMP_BUF
C jmp_buf typedef type.
@ SPECIAL_TYPE_FILE
C FILE typedef type.
@ SPECIAL_TYPE_SIGJMP_BUF
C sigjmp_buf typedef type.
@ SPECIAL_TYPE_OBJC_CLASS_REDEFINITION
Objective-C "Class" redefinition type.
@ SPECIAL_TYPE_CF_CONSTANT_STRING
CFConstantString type.
@ SPECIAL_TYPE_OBJC_ID_REDEFINITION
Objective-C "id" redefinition type.
Defines the clang::TargetInfo interface.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
internal::Matcher< T > findAll(const internal::Matcher< T > &Matcher)
Matches if the node or any descendant matches.
unsigned kind
All of the diagnostics that can be emitted by the frontend.
Severity
Enum values that allow the client to map NOTEs, WARNINGs, and EXTENSIONs to either Ignore (nothing),...
@ Warning
Present this diagnostic as a warning.
@ Error
Present this diagnostic as an error.
IncludeDirGroup
IncludeDirGroup - Identifies the group an include Entry belongs to, representing its relative positiv...
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
llvm::OnDiskChainedHashTable< ASTSelectorLookupTrait > ASTSelectorLookupTable
The on-disk hash table used for the global method pool.
llvm::OnDiskChainedHashTable< HeaderFileInfoTrait > HeaderFileInfoLookupTable
The on-disk hash table used for known header files.
llvm::OnDiskIterableChainedHashTable< ASTIdentifierLookupTrait > ASTIdentifierLookupTable
The on-disk hash table used to contain information about all of the identifiers in the program.
GlobalDeclID LazySpecializationInfo
@ EXTENSION_METADATA
Metadata describing this particular extension.
@ SUBMODULE_EXCLUDED_HEADER
Specifies a header that has been explicitly excluded from this submodule.
@ SUBMODULE_TOPHEADER
Specifies a top-level header that falls into this (sub)module.
@ SUBMODULE_PRIVATE_TEXTUAL_HEADER
Specifies a header that is private to this submodule but must be textually included.
@ SUBMODULE_HEADER
Specifies a header that falls into this (sub)module.
@ SUBMODULE_EXPORT_AS
Specifies the name of the module that will eventually re-export the entities in this module.
@ SUBMODULE_UMBRELLA_DIR
Specifies an umbrella directory.
@ SUBMODULE_UMBRELLA_HEADER
Specifies the umbrella header used to create this module, if any.
@ SUBMODULE_METADATA
Metadata for submodules as a whole.
@ SUBMODULE_REQUIRES
Specifies a required feature.
@ SUBMODULE_PRIVATE_HEADER
Specifies a header that is private to this submodule.
@ SUBMODULE_IMPORTS
Specifies the submodules that are imported by this submodule.
@ SUBMODULE_CONFLICT
Specifies a conflict with another module.
@ SUBMODULE_INITIALIZERS
Specifies some declarations with initializers that must be emitted to initialize the module.
@ SUBMODULE_DEFINITION
Defines the major attributes of a submodule, including its name and parent.
@ SUBMODULE_LINK_LIBRARY
Specifies a library or framework to link against.
@ SUBMODULE_CONFIG_MACRO
Specifies a configuration macro for this module.
@ SUBMODULE_EXPORTS
Specifies the submodules that are re-exported from this submodule.
@ SUBMODULE_TEXTUAL_HEADER
Specifies a header that is part of the module but must be textually included.
@ SUBMODULE_AFFECTING_MODULES
Specifies affecting modules that were not imported.
uint32_t SelectorID
An ID number that refers to an ObjC selector in an AST file.
const unsigned int NUM_PREDEF_IDENT_IDS
The number of predefined identifier IDs.
OptionsRecordTypes
Record types that occur within the options block inside the control block.
@ FILE_SYSTEM_OPTIONS
Record code for the filesystem options table.
@ TARGET_OPTIONS
Record code for the target options table.
@ PREPROCESSOR_OPTIONS
Record code for the preprocessor options table.
@ HEADER_SEARCH_OPTIONS
Record code for the headers search options table.
@ CODEGEN_OPTIONS
Record code for the codegen options table.
@ LANGUAGE_OPTIONS
Record code for the language options table.
const unsigned int NUM_PREDEF_PP_ENTITY_IDS
The number of predefined preprocessed entity IDs.
const unsigned int NUM_PREDEF_SUBMODULE_IDS
The number of predefined submodule IDs.
@ SUBMODULE_BLOCK_ID
The block containing the submodule structure.
@ PREPROCESSOR_DETAIL_BLOCK_ID
The block containing the detailed preprocessing record.
@ AST_BLOCK_ID
The AST block, which acts as a container around the full AST block.
@ SOURCE_MANAGER_BLOCK_ID
The block containing information about the source manager.
@ CONTROL_BLOCK_ID
The control block, which contains all of the information that needs to be validated prior to committi...
@ DECLTYPES_BLOCK_ID
The block containing the definitions of all of the types and decls used within the AST file.
@ PREPROCESSOR_BLOCK_ID
The block containing information about the preprocessor.
@ COMMENTS_BLOCK_ID
The block containing comments.
@ UNHASHED_CONTROL_BLOCK_ID
A block with unhashed content.
@ EXTENSION_BLOCK_ID
A block containing a module file extension.
@ OPTIONS_BLOCK_ID
The block of configuration options, used to check that a module is being used in a configuration comp...
@ INPUT_FILES_BLOCK_ID
The block of input files, which were used as inputs to create this AST file.
unsigned StableHashForTemplateArguments(llvm::ArrayRef< TemplateArgument > Args)
Calculate a stable hash value for template arguments.
CommentRecordTypes
Record types used within a comments block.
DeclIDBase::DeclID DeclID
An ID number that refers to a declaration in an AST file.
@ SM_SLOC_FILE_ENTRY
Describes a source location entry (SLocEntry) for a file.
@ SM_SLOC_BUFFER_BLOB_COMPRESSED
Describes a zlib-compressed blob that contains the data for a buffer entry.
@ SM_SLOC_BUFFER_ENTRY
Describes a source location entry (SLocEntry) for a buffer.
@ SM_SLOC_BUFFER_BLOB
Describes a blob that contains the data for a buffer entry.
@ SM_SLOC_EXPANSION_ENTRY
Describes a source location entry (SLocEntry) for a macro expansion.
const unsigned int NUM_PREDEF_SELECTOR_IDS
The number of predefined selector IDs.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
const unsigned VERSION_MAJOR
AST file major version number supported by this version of Clang.
llvm::support::detail::packed_endian_specific_integral< serialization::DeclID, llvm::endianness::native, llvm::support::unaligned > unaligned_decl_id_t
PreprocessorRecordTypes
Record types used within a preprocessor block.
@ PP_TOKEN
Describes one token.
@ PP_MACRO_FUNCTION_LIKE
A function-like macro definition.
@ PP_MACRO_OBJECT_LIKE
An object-like macro definition.
@ PP_MACRO_DIRECTIVE_HISTORY
The macro directives history for a particular identifier.
@ PP_MODULE_MACRO
A macro directive exported by a module.
ControlRecordTypes
Record types that occur within the control block.
@ MODULE_MAP_FILE
Record code for the module map file that was used to build this AST file.
@ MODULE_DIRECTORY
Record code for the module build directory.
@ ORIGINAL_FILE_ID
Record code for file ID of the file or buffer that was used to generate the AST file.
@ MODULE_NAME
Record code for the module name.
@ ORIGINAL_FILE
Record code for the original file that was used to generate the AST file, including both its file ID ...
@ IMPORT
Record code for another AST file imported by this AST file.
@ INPUT_FILE_OFFSETS
Offsets into the input-files block where input files reside.
@ METADATA
AST file metadata, including the AST file version number and information about the compiler used to b...
UnhashedControlBlockRecordTypes
Record codes for the unhashed control block.
@ DIAGNOSTIC_OPTIONS
Record code for the diagnostic options table.
@ HEADER_SEARCH_ENTRY_USAGE
Record code for the indices of used header search entries.
@ AST_BLOCK_HASH
Record code for the content hash of the AST block.
@ DIAG_PRAGMA_MAPPINGS
Record code for #pragma diagnostic mappings.
@ SIGNATURE
Record code for the signature that identifiers this AST file.
@ HEADER_SEARCH_PATHS
Record code for the headers search paths.
@ VFS_USAGE
Record code for the indices of used VFSs.
InputFileRecordTypes
Record types that occur within the input-files block inside the control block.
@ INPUT_FILE_HASH
The input file content hash.
@ INPUT_FILE
An input file.
uint64_t TypeID
An ID number that refers to a type in an AST file.
uint32_t MacroID
An ID number that refers to a macro in an AST file.
PreprocessorDetailRecordTypes
Record types used within a preprocessor detail block.
@ PPD_INCLUSION_DIRECTIVE
Describes an inclusion directive within the preprocessing record.
@ PPD_MACRO_EXPANSION
Describes a macro expansion within the preprocessing record.
@ PPD_MACRO_DEFINITION
Describes a macro definition within the preprocessing record.
ModuleKind
Specifies the kind of module that has been loaded.
@ MK_PCH
File is a PCH file treated as such.
@ MK_Preamble
File is a PCH file treated as the preamble.
@ MK_MainFile
File is a PCH file treated as the actual main file.
@ MK_ExplicitModule
File is an explicitly-loaded module.
@ MK_ImplicitModule
File is an implicitly-loaded module.
@ MK_PrebuiltModule
File is from a prebuilt module path.
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
const unsigned int NUM_PREDEF_MACRO_IDS
The number of predefined macro IDs.
ASTRecordTypes
Record types that occur within the AST block itself.
@ DECL_UPDATE_OFFSETS
Record for offsets of DECL_UPDATES records for declarations that were modified after being deserializ...
@ STATISTICS
Record code for the extra statistics we gather while generating an AST file.
@ FLOAT_CONTROL_PRAGMA_OPTIONS
Record code for #pragma float_control options.
@ KNOWN_NAMESPACES
Record code for the set of known namespaces, which are used for typo correction.
@ SPECIAL_TYPES
Record code for the set of non-builtin, special types.
@ PENDING_IMPLICIT_INSTANTIATIONS
Record code for pending implicit instantiations.
@ CXX_ADDED_TEMPLATE_SPECIALIZATION
@ TYPE_OFFSET
Record code for the offsets of each type.
@ DELEGATING_CTORS
The list of delegating constructor declarations.
@ PP_ASSUME_NONNULL_LOC
ID 66 used to be the list of included files.
@ EXT_VECTOR_DECLS
Record code for the set of ext_vector type names.
@ OPENCL_EXTENSIONS
Record code for enabled OpenCL extensions.
@ FP_PRAGMA_OPTIONS
Record code for floating point #pragma options.
@ PP_UNSAFE_BUFFER_USAGE
Record code for #pragma clang unsafe_buffer_usage begin/end.
@ CXX_ADDED_TEMPLATE_PARTIAL_SPECIALIZATION
@ DECLS_WITH_EFFECTS_TO_VERIFY
Record code for Sema's vector of functions/blocks with effects to be verified.
@ VTABLE_USES
Record code for the array of VTable uses.
@ LATE_PARSED_TEMPLATE
Record code for late parsed template functions.
@ DECLS_TO_CHECK_FOR_DEFERRED_DIAGS
Record code for the Decls to be checked for deferred diags.
@ DECL_OFFSET
Record code for the offsets of each decl.
@ SOURCE_MANAGER_LINE_TABLE
Record code for the source manager line table information, which stores information about #line direc...
@ PP_COUNTER_VALUE
The value of the next COUNTER to dispense.
@ DELETE_EXPRS_TO_ANALYZE
Delete expressions that will be analyzed later.
@ RELATED_DECLS_MAP
Record code for related declarations that have to be deserialized together from the same module.
@ UPDATE_VISIBLE
Record code for an update to a decl context's lookup table.
@ CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH
Number of unmatched pragma clang cuda_force_host_device begin directives we've seen.
@ MACRO_OFFSET
Record code for the table of offsets of each macro ID.
@ PPD_ENTITIES_OFFSETS
Record code for the table of offsets to entries in the preprocessing record.
@ VTABLES_TO_EMIT
Record code for vtables to emit.
@ UPDATE_MODULE_LOCAL_VISIBLE
@ IDENTIFIER_OFFSET
Record code for the table of offsets of each identifier ID.
@ OBJC_CATEGORIES
Record code for the array of Objective-C categories (including extensions).
@ METHOD_POOL
Record code for the Objective-C method pool,.
@ DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD
Record code for lexical and visible block for delayed namespace in reduced BMI.
@ PP_CONDITIONAL_STACK
The stack of open ifs/ifdefs recorded in a preamble.
@ REFERENCED_SELECTOR_POOL
Record code for referenced selector pool.
@ SOURCE_LOCATION_OFFSETS
Record code for the table of offsets into the block of source-location information.
@ WEAK_UNDECLARED_IDENTIFIERS
Record code for weak undeclared identifiers.
@ UNDEFINED_BUT_USED
Record code for undefined but used functions and variables that need a definition in this TU.
@ FILE_SORTED_DECLS
Record code for a file sorted array of DeclIDs in a module.
@ MSSTRUCT_PRAGMA_OPTIONS
Record code for #pragma ms_struct options.
@ TENTATIVE_DEFINITIONS
Record code for the array of tentative definitions.
@ UPDATE_TU_LOCAL_VISIBLE
@ UNUSED_FILESCOPED_DECLS
Record code for the array of unused file scoped decls.
@ ALIGN_PACK_PRAGMA_OPTIONS
Record code for #pragma align/pack options.
@ IMPORTED_MODULES
Record code for an array of all of the (sub)modules that were imported by the AST file.
@ SELECTOR_OFFSETS
Record code for the table of offsets into the Objective-C method pool.
@ UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES
Record code for potentially unused local typedef names.
@ EAGERLY_DESERIALIZED_DECLS
Record code for the array of eagerly deserialized decls.
@ INTERESTING_IDENTIFIERS
A list of "interesting" identifiers.
@ HEADER_SEARCH_TABLE
Record code for header search information.
@ OBJC_CATEGORIES_MAP
Record code for map of Objective-C class definition IDs to the ObjC categories in a module that are a...
@ CUDA_SPECIAL_DECL_REFS
Record code for special CUDA declarations.
@ TU_UPDATE_LEXICAL
Record code for an update to the TU's lexically contained declarations.
@ PPD_SKIPPED_RANGES
A table of skipped ranges within the preprocessing record.
@ IDENTIFIER_TABLE
Record code for the identifier table.
@ SEMA_DECL_REFS
Record code for declarations that Sema keeps references of.
@ OPTIMIZE_PRAGMA_OPTIONS
Record code for #pragma optimize options.
@ MODULE_OFFSET_MAP
Record code for the remapping information used to relate loaded modules to the various offsets and ID...
@ POINTERS_TO_MEMBERS_PRAGMA_OPTIONS
Record code for #pragma ms_struct options.
uint32_t PreprocessedEntityID
An ID number that refers to an entity in the detailed preprocessing record.
unsigned ComputeHash(Selector Sel)
TypeID LocalTypeID
Same with TypeID except that the LocalTypeID is only meaningful with the corresponding ModuleFile.
uint64_t IdentifierID
An ID number that refers to an identifier in an AST file.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
bool isa(CodeGen::Address addr)
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
SanitizerMask getPPTransparentSanitizers()
Return the sanitizers which do not affect preprocessing.
OpenMPDefaultClauseVariableCategory
OpenMP variable-category for 'default' clause.
OpenMPDefaultmapClauseModifier
OpenMP modifiers for 'defaultmap' clause.
OpenMPOrderClauseModifier
OpenMP modifiers for 'order' clause.
std::vector< std::string > Macros
A list of macros of the form  <definition>=<expansion> .
@ Success
Annotation was successful.
std::pair< FileID, unsigned > FileIDAndOffset
OpenMPAtClauseKind
OpenMP attributes for 'at' clause.
OpenMPReductionClauseModifier
OpenMP modifiers for 'reduction' clause.
OpenACCClauseKind
Represents the kind of an OpenACC clause.
@ Auto
'auto' clause, allowed on 'loop' directives.
@ Bind
'bind' clause, allowed on routine constructs.
@ Gang
'gang' clause, allowed on 'loop' and Combined constructs.
@ Wait
'wait' clause, allowed on Compute, Data, 'update', and Combined constructs.
@ DevicePtr
'deviceptr' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ PCopyOut
'copyout' clause alias 'pcopyout'. Preserved for diagnostic purposes.
@ VectorLength
'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop', and 'kernels loop' constru...
@ Async
'async' clause, allowed on Compute, Data, 'update', 'wait', and Combined constructs.
@ PresentOrCreate
'create' clause alias 'present_or_create'.
@ Collapse
'collapse' clause, allowed on 'loop' and Combined constructs.
@ NoHost
'nohost' clause, allowed on 'routine' directives.
@ PresentOrCopy
'copy' clause alias 'present_or_copy'. Preserved for diagnostic purposes.
@ DeviceNum
'device_num' clause, allowed on 'init', 'shutdown', and 'set' constructs.
@ Private
'private' clause, allowed on 'parallel', 'serial', 'loop', 'parallel loop', and 'serial loop' constru...
@ Invalid
Represents an invalid clause, for the purposes of parsing.
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Copy
'copy' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ Worker
'worker' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ DeviceType
'device_type' clause, allowed on Compute, 'data', 'init', 'shutdown', 'set', update',...
@ DefaultAsync
'default_async' clause, allowed on 'set' construct.
@ Attach
'attach' clause, allowed on Compute and Combined constructs, plus 'data' and 'enter data'.
@ Shortloop
'shortloop' is represented in the ACC.td file, but isn't present in the standard.
@ NumGangs
'num_gangs' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs.
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
@ Default
'default' clause, allowed on parallel, serial, kernel (and compound) constructs.
@ UseDevice
'use_device' clause, allowed on 'host_data' construct.
@ NoCreate
'no_create' clause, allowed on allowed on Compute and Combined constructs, plus 'data'.
@ PresentOrCopyOut
'copyout' clause alias 'present_or_copyout'.
@ Link
'link' clause, allowed on 'declare' construct.
@ Reduction
'reduction' clause, allowed on Parallel, Serial, Loop, and the combined constructs.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ CopyOut
'copyout' clause, allowed on Compute and Combined constructs, plus 'data', 'exit data',...
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
@ FirstPrivate
'firstprivate' clause, allowed on 'parallel', 'serial', 'parallel loop', and 'serial loop' constructs...
@ Host
'host' clause, allowed on 'update' construct.
@ PCopy
'copy' clause alias 'pcopy'. Preserved for diagnostic purposes.
@ Tile
'tile' clause, allowed on 'loop' and Combined constructs.
@ PCopyIn
'copyin' clause alias 'pcopyin'. Preserved for diagnostic purposes.
@ DeviceResident
'device_resident' clause, allowed on the 'declare' construct.
@ PCreate
'create' clause alias 'pcreate'. Preserved for diagnostic purposes.
@ Present
'present' clause, allowed on Compute and Combined constructs, plus 'data' and 'declare'.
@ DType
'dtype' clause, an alias for 'device_type', stored separately for diagnostic purposes.
@ CopyIn
'copyin' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ Device
'device' clause, allowed on the 'update' construct.
@ Independent
'independent' clause, allowed on 'loop' directives.
@ NumWorkers
'num_workers' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs...
@ IfPresent
'if_present' clause, allowed on 'host_data' and 'update' directives.
@ Detach
'detach' clause, allowed on the 'exit data' construct.
@ Delete
'delete' clause, allowed on the 'exit data' construct.
@ PresentOrCopyIn
'copyin' clause alias 'present_or_copyin'.
@ Finalize
'finalize' clause, allowed on 'exit data' directive.
OpenMPScheduleClauseModifier
OpenMP modifiers for 'schedule' clause.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
OpenMPDistScheduleClauseKind
OpenMP attributes for 'dist_schedule' clause.
OpenMPDoacrossClauseModifier
OpenMP dependence types for 'doacross' clause.
static constexpr unsigned NumberOfOMPMapClauseModifiers
Number of allowed map-type-modifiers.
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
ObjCXXARCStandardLibraryKind
Enumerate the kinds of standard library that.
PredefinedDeclIDs
Predefined declaration IDs.
@ PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID
The internal '__NSConstantString' tag type.
@ PREDEF_DECL_TRANSLATION_UNIT_ID
The translation unit.
@ PREDEF_DECL_OBJC_CLASS_ID
The Objective-C 'Class' type.
@ PREDEF_DECL_BUILTIN_MS_GUID_ID
The predeclared '_GUID' struct.
@ PREDEF_DECL_BUILTIN_MS_TYPE_INFO_TAG_ID
The predeclared 'type_info' struct.
@ PREDEF_DECL_OBJC_INSTANCETYPE_ID
The internal 'instancetype' typedef.
@ PREDEF_DECL_OBJC_PROTOCOL_ID
The Objective-C 'Protocol' type.
@ PREDEF_DECL_UNSIGNED_INT_128_ID
The unsigned 128-bit integer type.
@ PREDEF_DECL_OBJC_SEL_ID
The Objective-C 'SEL' type.
@ NUM_PREDEF_DECL_IDS
The number of declaration IDs that are predefined.
@ PREDEF_DECL_INT_128_ID
The signed 128-bit integer type.
@ PREDEF_DECL_VA_LIST_TAG
The internal '__va_list_tag' struct, if any.
@ PREDEF_DECL_BUILTIN_MS_VA_LIST_ID
The internal '__builtin_ms_va_list' typedef.
@ PREDEF_DECL_CF_CONSTANT_STRING_ID
The internal '__NSConstantString' typedef.
@ PREDEF_DECL_NULL_ID
The NULL declaration.
@ PREDEF_DECL_BUILTIN_VA_LIST_ID
The internal '__builtin_va_list' typedef.
@ PREDEF_DECL_EXTERN_C_CONTEXT_ID
The extern "C" context.
@ PREDEF_DECL_OBJC_ID_ID
The Objective-C 'id' type.
@ Property
The type of a property.
@ Result
The result type of a method or function.
OpenMPBindClauseKind
OpenMP bindings for the 'bind' clause.
const FunctionProtoType * T
OpenMPLastprivateModifier
OpenMP 'lastprivate' clause modifier.
@ Template
We are parsing a template declaration.
OpenMPDependClauseKind
OpenMP attributes for 'depend' clause.
OpenMPGrainsizeClauseModifier
OpenMPNumTasksClauseModifier
@ Type
The name was classified as a type.
OpenMPSeverityClauseKind
OpenMP attributes for 'severity' clause.
void ProcessWarningOptions(DiagnosticsEngine &Diags, const DiagnosticOptions &Opts, llvm::vfs::FileSystem &VFS, bool ReportDiags=true)
ProcessWarningOptions - Initialize the diagnostic client and process the warning options specified on...
static constexpr unsigned NumberOfOMPMotionModifiers
Number of allowed motion-modifiers.
TypeSpecifierWidth
Specifies the width of a type, e.g., short, long, or long long.
OpenMPMotionModifierKind
OpenMP modifier kind for 'to' or 'from' clause.
OpenMPDefaultmapClauseKind
OpenMP attributes for 'defaultmap' clause.
OpenMPAllocateClauseModifier
OpenMP modifiers for 'allocate' clause.
OpenMPLinearClauseKind
OpenMP attributes for 'linear' clause.
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
TypeSpecifierSign
Specifies the signedness of a type, e.g., signed or unsigned.
DisableValidationForModuleKind
Whether to disable the normal validation performed on precompiled headers and module files when they ...
@ None
Perform validation, don't disable it.
@ PCH
Disable validation for a precompiled header and the modules it depends on.
@ Module
Disable validation for module files.
bool shouldSkipCheckingODR(const Decl *D)
std::string getClangFullRepositoryVersion()
Retrieves the full repository version that is an amalgamation of the information in getClangRepositor...
OpenMPNumThreadsClauseModifier
OpenMPAtomicDefaultMemOrderClauseKind
OpenMP attributes for 'atomic_default_mem_order' clause.
U cast(CodeGen::Address addr)
@ None
The alignment was not explicit in code.
OpenMPDeviceClauseModifier
OpenMP modifiers for 'device' clause.
OpenMPMapModifierKind
OpenMP modifier kind for 'map' clause.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
llvm::omp::Clause OpenMPClauseKind
OpenMP clauses.
OpenMPOrderClauseKind
OpenMP attributes for 'order' clause.
OpenMPScheduleClauseKind
OpenMP attributes for 'schedule' clause.
OpenMPThreadsetKind
OpenMP modifiers for 'threadset' clause.
UnsignedOrNone getPrimaryModuleHash(const Module *M)
Calculate a hash value for the primary module name of the given module.
OpenMPMapClauseKind
OpenMP mapping kind for 'map' clause.
The signature of a module, which is a hash of the AST content.
static constexpr size_t size
static ASTFileSignature create(std::array< uint8_t, 20 > Bytes)
static ASTFileSignature createDummy()
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
static const ASTTemplateArgumentListInfo * Create(const ASTContext &C, const TemplateArgumentListInfo &List)
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setLoc(SourceLocation L)
setLoc - Sets the main location of the declaration name.
void setInfo(const DeclarationNameLoc &Info)
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
A simple structure that captures a vtable use for the purposes of the ExternalSemaSource.
ExceptionSpecInfo ExceptionSpec
static LineEntry get(unsigned Offs, unsigned Line, int Filename, SrcMgr::CharacteristicKind FileKind, unsigned IncludeOffset)
A conflict between two modules.
Module * Other
The module that this module conflicts with.
std::string Message
The message provided to the user when there is a conflict.
This structure contains all sizes needed for by an OMPMappableExprListClause.
unsigned NumComponentLists
Number of component lists.
unsigned NumVars
Number of expressions listed.
unsigned NumUniqueDeclarations
Number of unique base declarations.
unsigned NumComponents
Total number of expression components.
SourceLocation LParenLoc
Locations of '(' and ')' symbols.
Expr * AllocatorTraits
Allocator traits.
Expr * Allocator
Allocator.
a linked list of methods with the same selector name but different signatures.
ObjCMethodList * getNext() const
A struct with extended info about a syntactic name qualifier, to be used for the case of out-of-line ...
TemplateParameterList ** TemplParamLists
A new-allocated array of size NumTemplParamLists, containing pointers to the "outer" template paramet...
NestedNameSpecifierLoc QualifierLoc
unsigned NumTemplParamLists
The number of "outer" template parameter lists.
void clear(SanitizerMask K=SanitizerKind::All)
Disable the sanitizers specified in K.
SanitizerMask Mask
Bitmask of enabled sanitizers.
Helper class that saves the current stream position and then restores it when destroyed.
PragmaMsStackAction Action
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
Location information for a TemplateArgument.
Describes the categories of an Objective-C class.
void insert(GlobalDeclID ID)
void insert(LazySpecializationInfo Info)