xref: /freebsd/contrib/llvm-project/clang/include/clang/Serialization/ASTReader.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
1 //===- ASTReader.h - AST File Reader ----------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 //  This file defines the ASTReader class, which reads AST files.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_SERIALIZATION_ASTREADER_H
14 #define LLVM_CLANG_SERIALIZATION_ASTREADER_H
15 
16 #include "clang/AST/Type.h"
17 #include "clang/Basic/Diagnostic.h"
18 #include "clang/Basic/DiagnosticOptions.h"
19 #include "clang/Basic/IdentifierTable.h"
20 #include "clang/Basic/OpenCLOptions.h"
21 #include "clang/Basic/SourceLocation.h"
22 #include "clang/Basic/StackExhaustionHandler.h"
23 #include "clang/Basic/Version.h"
24 #include "clang/Lex/ExternalPreprocessorSource.h"
25 #include "clang/Lex/HeaderSearch.h"
26 #include "clang/Lex/PreprocessingRecord.h"
27 #include "clang/Lex/PreprocessorOptions.h"
28 #include "clang/Sema/ExternalSemaSource.h"
29 #include "clang/Sema/IdentifierResolver.h"
30 #include "clang/Sema/Sema.h"
31 #include "clang/Serialization/ASTBitCodes.h"
32 #include "clang/Serialization/ContinuousRangeMap.h"
33 #include "clang/Serialization/ModuleFile.h"
34 #include "clang/Serialization/ModuleFileExtension.h"
35 #include "clang/Serialization/ModuleManager.h"
36 #include "clang/Serialization/SourceLocationEncoding.h"
37 #include "llvm/ADT/ArrayRef.h"
38 #include "llvm/ADT/DenseMap.h"
39 #include "llvm/ADT/DenseSet.h"
40 #include "llvm/ADT/IntrusiveRefCntPtr.h"
41 #include "llvm/ADT/MapVector.h"
42 #include "llvm/ADT/PagedVector.h"
43 #include "llvm/ADT/STLExtras.h"
44 #include "llvm/ADT/SetVector.h"
45 #include "llvm/ADT/SmallPtrSet.h"
46 #include "llvm/ADT/SmallVector.h"
47 #include "llvm/ADT/StringMap.h"
48 #include "llvm/ADT/StringRef.h"
49 #include "llvm/ADT/iterator.h"
50 #include "llvm/ADT/iterator_range.h"
51 #include "llvm/Bitstream/BitstreamReader.h"
52 #include "llvm/Support/MemoryBuffer.h"
53 #include "llvm/Support/SaveAndRestore.h"
54 #include "llvm/Support/Timer.h"
55 #include "llvm/Support/VersionTuple.h"
56 #include <cassert>
57 #include <cstddef>
58 #include <cstdint>
59 #include <ctime>
60 #include <deque>
61 #include <memory>
62 #include <optional>
63 #include <set>
64 #include <string>
65 #include <utility>
66 #include <vector>
67 
68 namespace clang {
69 
70 class ASTConsumer;
71 class ASTContext;
72 class ASTDeserializationListener;
73 class ASTReader;
74 class ASTRecordReader;
75 class CXXTemporary;
76 class Decl;
77 class DeclarationName;
78 class DeclaratorDecl;
79 class DeclContext;
80 class EnumDecl;
81 class Expr;
82 class FieldDecl;
83 class FileEntry;
84 class FileManager;
85 class FileSystemOptions;
86 class FunctionDecl;
87 class GlobalModuleIndex;
88 struct HeaderFileInfo;
89 class HeaderSearchOptions;
90 class LangOptions;
91 class MacroInfo;
92 class ModuleCache;
93 class NamedDecl;
94 class NamespaceDecl;
95 class ObjCCategoryDecl;
96 class ObjCInterfaceDecl;
97 class PCHContainerReader;
98 class Preprocessor;
99 class PreprocessorOptions;
100 class Sema;
101 class SourceManager;
102 class Stmt;
103 class SwitchCase;
104 class TargetOptions;
105 class Token;
106 class TypedefNameDecl;
107 class ValueDecl;
108 class VarDecl;
109 
110 /// Abstract interface for callback invocations by the ASTReader.
111 ///
112 /// While reading an AST file, the ASTReader will call the methods of the
113 /// listener to pass on specific information. Some of the listener methods can
114 /// return true to indicate to the ASTReader that the information (and
115 /// consequently the AST file) is invalid.
116 class ASTReaderListener {
117 public:
118   virtual ~ASTReaderListener();
119 
120   /// Receives the full Clang version information.
121   ///
122   /// \returns true to indicate that the version is invalid. Subclasses should
123   /// generally defer to this implementation.
ReadFullVersionInformation(StringRef FullVersion)124   virtual bool ReadFullVersionInformation(StringRef FullVersion) {
125     return FullVersion != getClangFullRepositoryVersion();
126   }
127 
ReadModuleName(StringRef ModuleName)128   virtual void ReadModuleName(StringRef ModuleName) {}
ReadModuleMapFile(StringRef ModuleMapPath)129   virtual void ReadModuleMapFile(StringRef ModuleMapPath) {}
130 
131   /// Receives the language options.
132   ///
133   /// \returns true to indicate the options are invalid or false otherwise.
ReadLanguageOptions(const LangOptions & LangOpts,StringRef ModuleFilename,bool Complain,bool AllowCompatibleDifferences)134   virtual bool ReadLanguageOptions(const LangOptions &LangOpts,
135                                    StringRef ModuleFilename, bool Complain,
136                                    bool AllowCompatibleDifferences) {
137     return false;
138   }
139 
140   /// Receives the target options.
141   ///
142   /// \returns true to indicate the target options are invalid, or false
143   /// otherwise.
ReadTargetOptions(const TargetOptions & TargetOpts,StringRef ModuleFilename,bool Complain,bool AllowCompatibleDifferences)144   virtual bool ReadTargetOptions(const TargetOptions &TargetOpts,
145                                  StringRef ModuleFilename, bool Complain,
146                                  bool AllowCompatibleDifferences) {
147     return false;
148   }
149 
150   /// Receives the diagnostic options.
151   ///
152   /// \returns true to indicate the diagnostic options are invalid, or false
153   /// otherwise.
ReadDiagnosticOptions(DiagnosticOptions & DiagOpts,StringRef ModuleFilename,bool Complain)154   virtual bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts,
155                                      StringRef ModuleFilename, bool Complain) {
156     return false;
157   }
158 
159   /// Receives the file system options.
160   ///
161   /// \returns true to indicate the file system options are invalid, or false
162   /// otherwise.
ReadFileSystemOptions(const FileSystemOptions & FSOpts,bool Complain)163   virtual bool ReadFileSystemOptions(const FileSystemOptions &FSOpts,
164                                      bool Complain) {
165     return false;
166   }
167 
168   /// Receives the header search options.
169   ///
170   /// \param HSOpts The read header search options. The following fields are
171   ///               missing and are reported in ReadHeaderSearchPaths():
172   ///               UserEntries, SystemHeaderPrefixes, VFSOverlayFiles.
173   ///
174   /// \returns true to indicate the header search options are invalid, or false
175   /// otherwise.
ReadHeaderSearchOptions(const HeaderSearchOptions & HSOpts,StringRef ModuleFilename,StringRef SpecificModuleCachePath,bool Complain)176   virtual bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
177                                        StringRef ModuleFilename,
178                                        StringRef SpecificModuleCachePath,
179                                        bool Complain) {
180     return false;
181   }
182 
183   /// Receives the header search paths.
184   ///
185   /// \param HSOpts The read header search paths. Only the following fields are
186   ///               initialized: UserEntries, SystemHeaderPrefixes,
187   ///               VFSOverlayFiles. The rest is reported in
188   ///               ReadHeaderSearchOptions().
189   ///
190   /// \returns true to indicate the header search paths are invalid, or false
191   /// otherwise.
ReadHeaderSearchPaths(const HeaderSearchOptions & HSOpts,bool Complain)192   virtual bool ReadHeaderSearchPaths(const HeaderSearchOptions &HSOpts,
193                                      bool Complain) {
194     return false;
195   }
196 
197   /// Receives the preprocessor options.
198   ///
199   /// \param SuggestedPredefines Can be filled in with the set of predefines
200   /// that are suggested by the preprocessor options. Typically only used when
201   /// loading a precompiled header.
202   ///
203   /// \returns true to indicate the preprocessor options are invalid, or false
204   /// otherwise.
ReadPreprocessorOptions(const PreprocessorOptions & PPOpts,StringRef ModuleFilename,bool ReadMacros,bool Complain,std::string & SuggestedPredefines)205   virtual bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
206                                        StringRef ModuleFilename,
207                                        bool ReadMacros, bool Complain,
208                                        std::string &SuggestedPredefines) {
209     return false;
210   }
211 
212   /// Receives __COUNTER__ value.
ReadCounter(const serialization::ModuleFile & M,unsigned Value)213   virtual void ReadCounter(const serialization::ModuleFile &M,
214                            unsigned Value) {}
215 
216   /// This is called for each AST file loaded.
visitModuleFile(StringRef Filename,serialization::ModuleKind Kind)217   virtual void visitModuleFile(StringRef Filename,
218                                serialization::ModuleKind Kind) {}
219 
220   /// Returns true if this \c ASTReaderListener wants to receive the
221   /// input files of the AST file via \c visitInputFile, false otherwise.
needsInputFileVisitation()222   virtual bool needsInputFileVisitation() { return false; }
223 
224   /// Returns true if this \c ASTReaderListener wants to receive the
225   /// system input files of the AST file via \c visitInputFile, false otherwise.
needsSystemInputFileVisitation()226   virtual bool needsSystemInputFileVisitation() { return false; }
227 
228   /// if \c needsInputFileVisitation returns true, this is called for
229   /// each non-system input file of the AST File. If
230   /// \c needsSystemInputFileVisitation is true, then it is called for all
231   /// system input files as well.
232   ///
233   /// \returns true to continue receiving the next input file, false to stop.
visitInputFile(StringRef Filename,bool isSystem,bool isOverridden,bool isExplicitModule)234   virtual bool visitInputFile(StringRef Filename, bool isSystem,
235                               bool isOverridden, bool isExplicitModule) {
236     return true;
237   }
238 
239   /// Overloaded member function of \c visitInputFile that should
240   /// be defined when there is a distinction between
241   /// the file name and name-as-requested. For example, when deserializing input
242   /// files from precompiled AST files.
243   ///
244   /// \returns true to continue receiving the next input file, false to stop.
visitInputFile(StringRef FilenameAsRequested,StringRef Filename,bool isSystem,bool isOverridden,bool isExplicitModule)245   virtual bool visitInputFile(StringRef FilenameAsRequested, StringRef Filename,
246                               bool isSystem, bool isOverridden,
247                               bool isExplicitModule) {
248     return true;
249   }
250 
251   /// Returns true if this \c ASTReaderListener wants to receive the
252   /// imports of the AST file via \c visitImport, false otherwise.
needsImportVisitation()253   virtual bool needsImportVisitation() const { return false; }
254 
255   /// If needsImportVisitation returns \c true, this is called for each
256   /// AST file imported by this AST file.
visitImport(StringRef ModuleName,StringRef Filename)257   virtual void visitImport(StringRef ModuleName, StringRef Filename) {}
258 
259   /// Indicates that a particular module file extension has been read.
readModuleFileExtension(const ModuleFileExtensionMetadata & Metadata)260   virtual void readModuleFileExtension(
261                  const ModuleFileExtensionMetadata &Metadata) {}
262 };
263 
264 /// Simple wrapper class for chaining listeners.
265 class ChainedASTReaderListener : public ASTReaderListener {
266   std::unique_ptr<ASTReaderListener> First;
267   std::unique_ptr<ASTReaderListener> Second;
268 
269 public:
270   /// Takes ownership of \p First and \p Second.
ChainedASTReaderListener(std::unique_ptr<ASTReaderListener> First,std::unique_ptr<ASTReaderListener> Second)271   ChainedASTReaderListener(std::unique_ptr<ASTReaderListener> First,
272                            std::unique_ptr<ASTReaderListener> Second)
273       : First(std::move(First)), Second(std::move(Second)) {}
274 
takeFirst()275   std::unique_ptr<ASTReaderListener> takeFirst() { return std::move(First); }
takeSecond()276   std::unique_ptr<ASTReaderListener> takeSecond() { return std::move(Second); }
277 
278   bool ReadFullVersionInformation(StringRef FullVersion) override;
279   void ReadModuleName(StringRef ModuleName) override;
280   void ReadModuleMapFile(StringRef ModuleMapPath) override;
281   bool ReadLanguageOptions(const LangOptions &LangOpts,
282                            StringRef ModuleFilename, bool Complain,
283                            bool AllowCompatibleDifferences) override;
284   bool ReadTargetOptions(const TargetOptions &TargetOpts,
285                          StringRef ModuleFilename, bool Complain,
286                          bool AllowCompatibleDifferences) override;
287   bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts,
288                              StringRef ModuleFilename, bool Complain) override;
289   bool ReadFileSystemOptions(const FileSystemOptions &FSOpts,
290                              bool Complain) override;
291 
292   bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
293                                StringRef ModuleFilename,
294                                StringRef SpecificModuleCachePath,
295                                bool Complain) override;
296   bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
297                                StringRef ModuleFilename, bool ReadMacros,
298                                bool Complain,
299                                std::string &SuggestedPredefines) override;
300 
301   void ReadCounter(const serialization::ModuleFile &M, unsigned Value) override;
302   bool needsInputFileVisitation() override;
303   bool needsSystemInputFileVisitation() override;
304   void visitModuleFile(StringRef Filename,
305                        serialization::ModuleKind Kind) override;
306   bool visitInputFile(StringRef Filename, bool isSystem,
307                       bool isOverridden, bool isExplicitModule) override;
308   void readModuleFileExtension(
309          const ModuleFileExtensionMetadata &Metadata) override;
310 };
311 
312 /// ASTReaderListener implementation to validate the information of
313 /// the PCH file against an initialized Preprocessor.
314 class PCHValidator : public ASTReaderListener {
315   Preprocessor &PP;
316   ASTReader &Reader;
317 
318 public:
PCHValidator(Preprocessor & PP,ASTReader & Reader)319   PCHValidator(Preprocessor &PP, ASTReader &Reader)
320       : PP(PP), Reader(Reader) {}
321 
322   bool ReadLanguageOptions(const LangOptions &LangOpts,
323                            StringRef ModuleFilename, bool Complain,
324                            bool AllowCompatibleDifferences) override;
325   bool ReadTargetOptions(const TargetOptions &TargetOpts,
326                          StringRef ModuleFilename, bool Complain,
327                          bool AllowCompatibleDifferences) override;
328   bool ReadDiagnosticOptions(DiagnosticOptions &DiagOpts,
329                              StringRef ModuleFilename, bool Complain) override;
330   bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
331                                StringRef ModuleFilename, bool ReadMacros,
332                                bool Complain,
333                                std::string &SuggestedPredefines) override;
334   bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts,
335                                StringRef ModuleFilename,
336                                StringRef SpecificModuleCachePath,
337                                bool Complain) override;
338   void ReadCounter(const serialization::ModuleFile &M, unsigned Value) override;
339 };
340 
341 /// ASTReaderListenter implementation to set SuggestedPredefines of
342 /// ASTReader which is required to use a pch file. This is the replacement
343 /// of PCHValidator or SimplePCHValidator when using a pch file without
344 /// validating it.
345 class SimpleASTReaderListener : public ASTReaderListener {
346   Preprocessor &PP;
347 
348 public:
SimpleASTReaderListener(Preprocessor & PP)349   SimpleASTReaderListener(Preprocessor &PP) : PP(PP) {}
350 
351   bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts,
352                                StringRef ModuleFilename, bool ReadMacros,
353                                bool Complain,
354                                std::string &SuggestedPredefines) override;
355 };
356 
357 namespace serialization {
358 
359 class ReadMethodPoolVisitor;
360 
361 namespace reader {
362 
363 class ASTIdentifierLookupTrait;
364 
365 /// The on-disk hash table(s) used for DeclContext name lookup.
366 struct DeclContextLookupTable;
367 struct ModuleLocalLookupTable;
368 
369 /// The on-disk hash table(s) used for specialization decls.
370 struct LazySpecializationInfoLookupTable;
371 
372 } // namespace reader
373 
374 } // namespace serialization
375 
376 struct VisibleLookupBlockOffsets {
377   uint64_t VisibleOffset = 0;
378   uint64_t ModuleLocalOffset = 0;
379   uint64_t TULocalOffset = 0;
380 
381   operator bool() const {
382     return VisibleOffset || ModuleLocalOffset || TULocalOffset;
383   }
384 };
385 
386 struct LookupBlockOffsets : VisibleLookupBlockOffsets {
387   uint64_t LexicalOffset = 0;
388 
389   operator bool() const {
390     return VisibleLookupBlockOffsets::operator bool() || LexicalOffset;
391   }
392 };
393 
394 /// Reads an AST files chain containing the contents of a translation
395 /// unit.
396 ///
397 /// The ASTReader class reads bitstreams (produced by the ASTWriter
398 /// class) containing the serialized representation of a given
399 /// abstract syntax tree and its supporting data structures. An
400 /// instance of the ASTReader can be attached to an ASTContext object,
401 /// which will provide access to the contents of the AST files.
402 ///
403 /// The AST reader provides lazy de-serialization of declarations, as
404 /// required when traversing the AST. Only those AST nodes that are
405 /// actually required will be de-serialized.
406 class ASTReader
407   : public ExternalPreprocessorSource,
408     public ExternalPreprocessingRecordSource,
409     public ExternalHeaderFileInfoSource,
410     public ExternalSemaSource,
411     public IdentifierInfoLookup,
412     public ExternalSLocEntrySource
413 {
414 public:
415   /// Types of AST files.
416   friend class ASTDeclMerger;
417   friend class ASTDeclReader;
418   friend class ASTIdentifierIterator;
419   friend class ASTRecordReader;
420   friend class ASTUnit; // ASTUnit needs to remap source locations.
421   friend class ASTWriter;
422   friend class PCHValidator;
423   friend class serialization::reader::ASTIdentifierLookupTrait;
424   friend class serialization::ReadMethodPoolVisitor;
425   friend class TypeLocReader;
426   friend class LocalDeclID;
427 
428   using RecordData = SmallVector<uint64_t, 64>;
429   using RecordDataImpl = SmallVectorImpl<uint64_t>;
430 
431   /// The result of reading the control block of an AST file, which
432   /// can fail for various reasons.
433   enum ASTReadResult {
434     /// The control block was read successfully. Aside from failures,
435     /// the AST file is safe to read into the current context.
436     Success,
437 
438     /// The AST file itself appears corrupted.
439     Failure,
440 
441     /// The AST file was missing.
442     Missing,
443 
444     /// The AST file is out-of-date relative to its input files,
445     /// and needs to be regenerated.
446     OutOfDate,
447 
448     /// The AST file was written by a different version of Clang.
449     VersionMismatch,
450 
451     /// The AST file was written with a different language/target
452     /// configuration.
453     ConfigurationMismatch,
454 
455     /// The AST file has errors.
456     HadErrors
457   };
458 
459   using ModuleFile = serialization::ModuleFile;
460   using ModuleKind = serialization::ModuleKind;
461   using ModuleManager = serialization::ModuleManager;
462   using ModuleIterator = ModuleManager::ModuleIterator;
463   using ModuleConstIterator = ModuleManager::ModuleConstIterator;
464   using ModuleReverseIterator = ModuleManager::ModuleReverseIterator;
465 
466 private:
467   /// The receiver of some callbacks invoked by ASTReader.
468   std::unique_ptr<ASTReaderListener> Listener;
469 
470   /// The receiver of deserialization events.
471   ASTDeserializationListener *DeserializationListener = nullptr;
472 
473   bool OwnsDeserializationListener = false;
474 
475   SourceManager &SourceMgr;
476   FileManager &FileMgr;
477   const PCHContainerReader &PCHContainerRdr;
478   DiagnosticsEngine &Diags;
479   // Sema has duplicate logic, but SemaObj can sometimes be null so ASTReader
480   // has its own version.
481   StackExhaustionHandler StackHandler;
482 
483   /// The semantic analysis object that will be processing the
484   /// AST files and the translation unit that uses it.
485   Sema *SemaObj = nullptr;
486 
487   /// The preprocessor that will be loading the source file.
488   Preprocessor &PP;
489 
490   /// The AST context into which we'll read the AST files.
491   ASTContext *ContextObj = nullptr;
492 
493   /// The AST consumer.
494   ASTConsumer *Consumer = nullptr;
495 
496   /// The module manager which manages modules and their dependencies
497   ModuleManager ModuleMgr;
498 
499   /// A dummy identifier resolver used to merge TU-scope declarations in
500   /// C, for the cases where we don't have a Sema object to provide a real
501   /// identifier resolver.
502   IdentifierResolver DummyIdResolver;
503 
504   /// A mapping from extension block names to module file extensions.
505   llvm::StringMap<std::shared_ptr<ModuleFileExtension>> ModuleFileExtensions;
506 
507   /// A timer used to track the time spent deserializing.
508   std::unique_ptr<llvm::Timer> ReadTimer;
509 
510   /// The location where the module file will be considered as
511   /// imported from. For non-module AST types it should be invalid.
512   SourceLocation CurrentImportLoc;
513 
514   /// The module kind that is currently deserializing.
515   std::optional<ModuleKind> CurrentDeserializingModuleKind;
516 
517   /// The global module index, if loaded.
518   std::unique_ptr<GlobalModuleIndex> GlobalIndex;
519 
520   /// A map of global bit offsets to the module that stores entities
521   /// at those bit offsets.
522   ContinuousRangeMap<uint64_t, ModuleFile*, 4> GlobalBitOffsetsMap;
523 
524   /// A map of negated SLocEntryIDs to the modules containing them.
525   ContinuousRangeMap<unsigned, ModuleFile*, 64> GlobalSLocEntryMap;
526 
527   using GlobalSLocOffsetMapType =
528       ContinuousRangeMap<SourceLocation::UIntTy, ModuleFile *, 64>;
529 
530   /// A map of reversed (SourceManager::MaxLoadedOffset - SLocOffset)
531   /// SourceLocation offsets to the modules containing them.
532   GlobalSLocOffsetMapType GlobalSLocOffsetMap;
533 
534   /// Types that have already been loaded from the chain.
535   ///
536   /// When the pointer at index I is non-NULL, the type with
537   /// ID = (I + 1) << FastQual::Width has already been loaded
538   llvm::PagedVector<QualType> TypesLoaded;
539 
540   /// Declarations that have already been loaded from the chain.
541   ///
542   /// When the pointer at index I is non-NULL, the declaration with ID
543   /// = I + 1 has already been loaded.
544   llvm::PagedVector<Decl *> DeclsLoaded;
545 
546   using FileOffset = std::pair<ModuleFile *, uint64_t>;
547   using FileOffsetsTy = SmallVector<FileOffset, 2>;
548   using DeclUpdateOffsetsMap = llvm::DenseMap<GlobalDeclID, FileOffsetsTy>;
549 
550   /// Declarations that have modifications residing in a later file
551   /// in the chain.
552   DeclUpdateOffsetsMap DeclUpdateOffsets;
553 
554   using DelayedNamespaceOffsetMapTy =
555       llvm::DenseMap<GlobalDeclID, LookupBlockOffsets>;
556 
557   /// Mapping from global declaration IDs to the lexical and visible block
558   /// offset for delayed namespace in reduced BMI.
559   ///
560   /// We can't use the existing DeclUpdate mechanism since the DeclUpdate
561   /// may only be applied in an outer most read. However, we need to know
562   /// whether or not a DeclContext has external storage during the recursive
563   /// reading. So we need to apply the offset immediately after we read the
564   /// namespace as if it is not delayed.
565   DelayedNamespaceOffsetMapTy DelayedNamespaceOffsetMap;
566 
567   /// Mapping from main decl ID to the related decls IDs.
568   ///
569   /// The key is the main decl ID, and the value is a vector of related decls
570   /// that must be loaded immediately after the main decl. This is necessary
571   /// to ensure that the definition for related decls comes from the same module
572   /// as the enclosing main decl. Without this, due to lazy deserialization,
573   /// the definition for the main decl and related decls may come from different
574   /// modules. It is used for the following cases:
575   /// - Lambda inside a template function definition: The main declaration is
576   ///   the enclosing function, and the related declarations are the lambda
577   ///   call operators.
578   /// - Friend function defined inside a template CXXRecord declaration: The
579   ///   main declaration is the enclosing record, and the related declarations
580   ///   are the friend functions.
581   llvm::DenseMap<GlobalDeclID, SmallVector<GlobalDeclID, 4>> RelatedDeclsMap;
582 
583   struct PendingUpdateRecord {
584     Decl *D;
585     GlobalDeclID ID;
586 
587     // Whether the declaration was just deserialized.
588     bool JustLoaded;
589 
PendingUpdateRecordPendingUpdateRecord590     PendingUpdateRecord(GlobalDeclID ID, Decl *D, bool JustLoaded)
591         : D(D), ID(ID), JustLoaded(JustLoaded) {}
592   };
593 
594   /// Declaration updates for already-loaded declarations that we need
595   /// to apply once we finish processing an import.
596   llvm::SmallVector<PendingUpdateRecord, 16> PendingUpdateRecords;
597 
598   enum class PendingFakeDefinitionKind { NotFake, Fake, FakeLoaded };
599 
600   /// The DefinitionData pointers that we faked up for class definitions
601   /// that we needed but hadn't loaded yet.
602   llvm::DenseMap<void *, PendingFakeDefinitionKind> PendingFakeDefinitionData;
603 
604   /// Exception specification updates that have been loaded but not yet
605   /// propagated across the relevant redeclaration chain. The map key is the
606   /// canonical declaration (used only for deduplication) and the value is a
607   /// declaration that has an exception specification.
608   llvm::SmallMapVector<Decl *, FunctionDecl *, 4> PendingExceptionSpecUpdates;
609 
610   /// Deduced return type updates that have been loaded but not yet propagated
611   /// across the relevant redeclaration chain. The map key is the canonical
612   /// declaration and the value is the deduced return type.
613   llvm::SmallMapVector<FunctionDecl *, QualType, 4> PendingDeducedTypeUpdates;
614 
615   /// Functions has undededuced return type and we wish we can find the deduced
616   /// return type by iterating the redecls in other modules.
617   llvm::SmallVector<FunctionDecl *, 4> PendingUndeducedFunctionDecls;
618 
619   /// Declarations that have been imported and have typedef names for
620   /// linkage purposes.
621   llvm::DenseMap<std::pair<DeclContext *, IdentifierInfo *>, NamedDecl *>
622       ImportedTypedefNamesForLinkage;
623 
624   /// Mergeable declaration contexts that have anonymous declarations
625   /// within them, and those anonymous declarations.
626   llvm::DenseMap<Decl*, llvm::SmallVector<NamedDecl*, 2>>
627     AnonymousDeclarationsForMerging;
628 
629   /// Map from numbering information for lambdas to the corresponding lambdas.
630   llvm::DenseMap<std::pair<const Decl *, unsigned>, NamedDecl *>
631       LambdaDeclarationsForMerging;
632 
633   /// Key used to identify LifetimeExtendedTemporaryDecl for merging,
634   /// containing the lifetime-extending declaration and the mangling number.
635   using LETemporaryKey = std::pair<Decl *, unsigned>;
636 
637   /// Map of already deserialiazed temporaries.
638   llvm::DenseMap<LETemporaryKey, LifetimeExtendedTemporaryDecl *>
639       LETemporaryForMerging;
640 
641   struct FileDeclsInfo {
642     ModuleFile *Mod = nullptr;
643     ArrayRef<serialization::unaligned_decl_id_t> Decls;
644 
645     FileDeclsInfo() = default;
FileDeclsInfoFileDeclsInfo646     FileDeclsInfo(ModuleFile *Mod,
647                   ArrayRef<serialization::unaligned_decl_id_t> Decls)
648         : Mod(Mod), Decls(Decls) {}
649   };
650 
651   /// Map from a FileID to the file-level declarations that it contains.
652   llvm::DenseMap<FileID, FileDeclsInfo> FileDeclIDs;
653 
654   /// An array of lexical contents of a declaration context, as a sequence of
655   /// Decl::Kind, DeclID pairs.
656   using LexicalContents = ArrayRef<serialization::unaligned_decl_id_t>;
657 
658   /// Map from a DeclContext to its lexical contents.
659   llvm::DenseMap<const DeclContext*, std::pair<ModuleFile*, LexicalContents>>
660       LexicalDecls;
661 
662   /// Map from the TU to its lexical contents from each module file.
663   std::vector<std::pair<ModuleFile*, LexicalContents>> TULexicalDecls;
664 
665   /// Map from a DeclContext to its lookup tables.
666   llvm::DenseMap<const DeclContext *,
667                  serialization::reader::DeclContextLookupTable> Lookups;
668   llvm::DenseMap<const DeclContext *,
669                  serialization::reader::ModuleLocalLookupTable>
670       ModuleLocalLookups;
671   llvm::DenseMap<const DeclContext *,
672                  serialization::reader::DeclContextLookupTable>
673       TULocalLookups;
674 
675   using SpecLookupTableTy =
676       llvm::DenseMap<const Decl *,
677                      serialization::reader::LazySpecializationInfoLookupTable>;
678   /// Map from decls to specialized decls.
679   SpecLookupTableTy SpecializationsLookups;
680   /// Split partial specialization from specialization to speed up lookups.
681   SpecLookupTableTy PartialSpecializationsLookups;
682 
683   bool LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
684                                        const Decl *D);
685   bool LoadExternalSpecializationsImpl(SpecLookupTableTy &SpecLookups,
686                                        const Decl *D,
687                                        ArrayRef<TemplateArgument> TemplateArgs);
688 
689   // Updates for visible decls can occur for other contexts than just the
690   // TU, and when we read those update records, the actual context may not
691   // be available yet, so have this pending map using the ID as a key. It
692   // will be realized when the data is actually loaded.
693   struct UpdateData {
694     ModuleFile *Mod;
695     const unsigned char *Data;
696   };
697   using DeclContextVisibleUpdates = SmallVector<UpdateData, 1>;
698 
699   /// Updates to the visible declarations of declaration contexts that
700   /// haven't been loaded yet.
701   llvm::DenseMap<GlobalDeclID, DeclContextVisibleUpdates> PendingVisibleUpdates;
702   llvm::DenseMap<GlobalDeclID, DeclContextVisibleUpdates>
703       PendingModuleLocalVisibleUpdates;
704   llvm::DenseMap<GlobalDeclID, DeclContextVisibleUpdates> TULocalUpdates;
705 
706   using SpecializationsUpdate = SmallVector<UpdateData, 1>;
707   using SpecializationsUpdateMap =
708       llvm::DenseMap<GlobalDeclID, SpecializationsUpdate>;
709   SpecializationsUpdateMap PendingSpecializationsUpdates;
710   SpecializationsUpdateMap PendingPartialSpecializationsUpdates;
711 
712   /// The set of C++ or Objective-C classes that have forward
713   /// declarations that have not yet been linked to their definitions.
714   llvm::SmallPtrSet<Decl *, 4> PendingDefinitions;
715 
716   using PendingBodiesMap =
717       llvm::MapVector<Decl *, uint64_t,
718                       llvm::SmallDenseMap<Decl *, unsigned, 4>,
719                       SmallVector<std::pair<Decl *, uint64_t>, 4>>;
720 
721   /// Functions or methods that have bodies that will be attached.
722   PendingBodiesMap PendingBodies;
723 
724   /// Definitions for which we have added merged definitions but not yet
725   /// performed deduplication.
726   llvm::SetVector<NamedDecl *> PendingMergedDefinitionsToDeduplicate;
727 
728   /// The duplicated definitions in module units which are pending to be warned.
729   /// We need to delay it to wait for the loading of definitions since we don't
730   /// want to warn for forward declarations.
731   llvm::SmallVector<std::pair<Decl *, Decl *>>
732       PendingWarningForDuplicatedDefsInModuleUnits;
733 
734   /// Read the record that describes the lexical contents of a DC.
735   bool ReadLexicalDeclContextStorage(ModuleFile &M,
736                                      llvm::BitstreamCursor &Cursor,
737                                      uint64_t Offset, DeclContext *DC);
738 
739   enum class VisibleDeclContextStorageKind {
740     GenerallyVisible,
741     ModuleLocalVisible,
742     TULocalVisible,
743   };
744 
745   /// Read the record that describes the visible contents of a DC.
746   bool ReadVisibleDeclContextStorage(ModuleFile &M,
747                                      llvm::BitstreamCursor &Cursor,
748                                      uint64_t Offset, GlobalDeclID ID,
749                                      VisibleDeclContextStorageKind VisibleKind);
750 
751   bool ReadSpecializations(ModuleFile &M, llvm::BitstreamCursor &Cursor,
752                            uint64_t Offset, Decl *D, bool IsPartial);
753   void AddSpecializations(const Decl *D, const unsigned char *Data,
754                           ModuleFile &M, bool IsPartial);
755 
756   /// A vector containing identifiers that have already been
757   /// loaded.
758   ///
759   /// If the pointer at index I is non-NULL, then it refers to the
760   /// IdentifierInfo for the identifier with ID=I+1 that has already
761   /// been loaded.
762   std::vector<IdentifierInfo *> IdentifiersLoaded;
763 
764   /// A vector containing macros that have already been
765   /// loaded.
766   ///
767   /// If the pointer at index I is non-NULL, then it refers to the
768   /// MacroInfo for the identifier with ID=I+1 that has already
769   /// been loaded.
770   std::vector<MacroInfo *> MacrosLoaded;
771 
772   using LoadedMacroInfo =
773       std::pair<IdentifierInfo *, serialization::SubmoduleID>;
774 
775   /// A set of #undef directives that we have loaded; used to
776   /// deduplicate the same #undef information coming from multiple module
777   /// files.
778   llvm::DenseSet<LoadedMacroInfo> LoadedUndefs;
779 
780   using GlobalMacroMapType =
781       ContinuousRangeMap<serialization::MacroID, ModuleFile *, 4>;
782 
783   /// Mapping from global macro IDs to the module in which the
784   /// macro resides along with the offset that should be added to the
785   /// global macro ID to produce a local ID.
786   GlobalMacroMapType GlobalMacroMap;
787 
788   /// A vector containing submodules that have already been loaded.
789   ///
790   /// This vector is indexed by the Submodule ID (-1). NULL submodule entries
791   /// indicate that the particular submodule ID has not yet been loaded.
792   SmallVector<Module *, 2> SubmodulesLoaded;
793 
794   using GlobalSubmoduleMapType =
795       ContinuousRangeMap<serialization::SubmoduleID, ModuleFile *, 4>;
796 
797   /// Mapping from global submodule IDs to the module file in which the
798   /// submodule resides along with the offset that should be added to the
799   /// global submodule ID to produce a local ID.
800   GlobalSubmoduleMapType GlobalSubmoduleMap;
801 
802   /// A set of hidden declarations.
803   using HiddenNames = SmallVector<Decl *, 2>;
804   using HiddenNamesMapType = llvm::DenseMap<Module *, HiddenNames>;
805 
806   /// A mapping from each of the hidden submodules to the deserialized
807   /// declarations in that submodule that could be made visible.
808   HiddenNamesMapType HiddenNamesMap;
809 
810   /// A module import, export, or conflict that hasn't yet been resolved.
811   struct UnresolvedModuleRef {
812     /// The file in which this module resides.
813     ModuleFile *File;
814 
815     /// The module that is importing or exporting.
816     Module *Mod;
817 
818     /// The kind of module reference.
819     enum { Import, Export, Conflict, Affecting } Kind;
820 
821     /// The local ID of the module that is being exported.
822     unsigned ID;
823 
824     /// Whether this is a wildcard export.
825     LLVM_PREFERRED_TYPE(bool)
826     unsigned IsWildcard : 1;
827 
828     /// String data.
829     StringRef String;
830   };
831 
832   /// The set of module imports and exports that still need to be
833   /// resolved.
834   SmallVector<UnresolvedModuleRef, 2> UnresolvedModuleRefs;
835 
836   /// A vector containing selectors that have already been loaded.
837   ///
838   /// This vector is indexed by the Selector ID (-1). NULL selector
839   /// entries indicate that the particular selector ID has not yet
840   /// been loaded.
841   SmallVector<Selector, 16> SelectorsLoaded;
842 
843   using GlobalSelectorMapType =
844       ContinuousRangeMap<serialization::SelectorID, ModuleFile *, 4>;
845 
846   /// Mapping from global selector IDs to the module in which the
847   /// global selector ID to produce a local ID.
848   GlobalSelectorMapType GlobalSelectorMap;
849 
850   /// The generation number of the last time we loaded data from the
851   /// global method pool for this selector.
852   llvm::DenseMap<Selector, unsigned> SelectorGeneration;
853 
854   /// Whether a selector is out of date. We mark a selector as out of date
855   /// if we load another module after the method pool entry was pulled in.
856   llvm::DenseMap<Selector, bool> SelectorOutOfDate;
857 
858   struct PendingMacroInfo {
859     ModuleFile *M;
860     /// Offset relative to ModuleFile::MacroOffsetsBase.
861     uint32_t MacroDirectivesOffset;
862 
PendingMacroInfoPendingMacroInfo863     PendingMacroInfo(ModuleFile *M, uint32_t MacroDirectivesOffset)
864         : M(M), MacroDirectivesOffset(MacroDirectivesOffset) {}
865   };
866 
867   using PendingMacroIDsMap =
868       llvm::MapVector<IdentifierInfo *, SmallVector<PendingMacroInfo, 2>>;
869 
870   /// Mapping from identifiers that have a macro history to the global
871   /// IDs have not yet been deserialized to the global IDs of those macros.
872   PendingMacroIDsMap PendingMacroIDs;
873 
874   using GlobalPreprocessedEntityMapType =
875       ContinuousRangeMap<unsigned, ModuleFile *, 4>;
876 
877   /// Mapping from global preprocessing entity IDs to the module in
878   /// which the preprocessed entity resides along with the offset that should be
879   /// added to the global preprocessing entity ID to produce a local ID.
880   GlobalPreprocessedEntityMapType GlobalPreprocessedEntityMap;
881 
882   using GlobalSkippedRangeMapType =
883       ContinuousRangeMap<unsigned, ModuleFile *, 4>;
884 
885   /// Mapping from global skipped range base IDs to the module in which
886   /// the skipped ranges reside.
887   GlobalSkippedRangeMapType GlobalSkippedRangeMap;
888 
889   /// \name CodeGen-relevant special data
890   /// Fields containing data that is relevant to CodeGen.
891   //@{
892 
893   /// The IDs of all declarations that fulfill the criteria of
894   /// "interesting" decls.
895   ///
896   /// This contains the data loaded from all EAGERLY_DESERIALIZED_DECLS blocks
897   /// in the chain. The referenced declarations are deserialized and passed to
898   /// the consumer eagerly.
899   SmallVector<GlobalDeclID, 16> EagerlyDeserializedDecls;
900 
901   /// The IDs of all vtables to emit. The referenced declarations are passed
902   /// to the consumers' HandleVTable eagerly after passing
903   /// EagerlyDeserializedDecls.
904   SmallVector<GlobalDeclID, 16> VTablesToEmit;
905 
906   /// The IDs of all tentative definitions stored in the chain.
907   ///
908   /// Sema keeps track of all tentative definitions in a TU because it has to
909   /// complete them and pass them on to CodeGen. Thus, tentative definitions in
910   /// the PCH chain must be eagerly deserialized.
911   SmallVector<GlobalDeclID, 16> TentativeDefinitions;
912 
913   /// The IDs of all CXXRecordDecls stored in the chain whose VTables are
914   /// used.
915   ///
916   /// CodeGen has to emit VTables for these records, so they have to be eagerly
917   /// deserialized.
918   struct VTableUse {
919     GlobalDeclID ID;
920     SourceLocation::UIntTy RawLoc;
921     bool Used;
922   };
923   SmallVector<VTableUse> VTableUses;
924 
925   /// A snapshot of the pending instantiations in the chain.
926   ///
927   /// This record tracks the instantiations that Sema has to perform at the
928   /// end of the TU. It consists of a pair of values for every pending
929   /// instantiation where the first value is the ID of the decl and the second
930   /// is the instantiation location.
931   struct PendingInstantiation {
932     GlobalDeclID ID;
933     SourceLocation::UIntTy RawLoc;
934   };
935   SmallVector<PendingInstantiation, 64> PendingInstantiations;
936 
937   //@}
938 
939   /// \name DiagnosticsEngine-relevant special data
940   /// Fields containing data that is used for generating diagnostics
941   //@{
942 
943   /// A snapshot of Sema's unused file-scoped variable tracking, for
944   /// generating warnings.
945   SmallVector<GlobalDeclID, 16> UnusedFileScopedDecls;
946 
947   /// A list of all the delegating constructors we've seen, to diagnose
948   /// cycles.
949   SmallVector<GlobalDeclID, 4> DelegatingCtorDecls;
950 
951   /// Method selectors used in a @selector expression. Used for
952   /// implementation of -Wselector.
953   SmallVector<serialization::SelectorID, 64> ReferencedSelectorsData;
954 
955   /// A snapshot of Sema's weak undeclared identifier tracking, for
956   /// generating warnings.
957   SmallVector<serialization::IdentifierID, 64> WeakUndeclaredIdentifiers;
958 
959   /// The IDs of type aliases for ext_vectors that exist in the chain.
960   ///
961   /// Used by Sema for finding sugared names for ext_vectors in diagnostics.
962   SmallVector<GlobalDeclID, 4> ExtVectorDecls;
963 
964   //@}
965 
966   /// \name Sema-relevant special data
967   /// Fields containing data that is used for semantic analysis
968   //@{
969 
970   /// The IDs of all potentially unused typedef names in the chain.
971   ///
972   /// Sema tracks these to emit warnings.
973   SmallVector<GlobalDeclID, 16> UnusedLocalTypedefNameCandidates;
974 
975   /// Our current depth in #pragma cuda force_host_device begin/end
976   /// macros.
977   unsigned ForceHostDeviceDepth = 0;
978 
979   /// The IDs of the declarations Sema stores directly.
980   ///
981   /// Sema tracks a few important decls, such as namespace std, directly.
982   SmallVector<GlobalDeclID, 4> SemaDeclRefs;
983 
984   /// The IDs of the types ASTContext stores directly.
985   ///
986   /// The AST context tracks a few important types, such as va_list, directly.
987   SmallVector<serialization::TypeID, 16> SpecialTypes;
988 
989   /// The IDs of CUDA-specific declarations ASTContext stores directly.
990   ///
991   /// The AST context tracks a few important decls, currently cudaConfigureCall,
992   /// directly.
993   SmallVector<GlobalDeclID, 2> CUDASpecialDeclRefs;
994 
995   /// The floating point pragma option settings.
996   SmallVector<uint64_t, 1> FPPragmaOptions;
997 
998   /// The pragma clang optimize location (if the pragma state is "off").
999   SourceLocation OptimizeOffPragmaLocation;
1000 
1001   /// The PragmaMSStructKind pragma ms_struct state if set, or -1.
1002   int PragmaMSStructState = -1;
1003 
1004   /// The PragmaMSPointersToMembersKind pragma pointers_to_members state.
1005   int PragmaMSPointersToMembersState = -1;
1006   SourceLocation PointersToMembersPragmaLocation;
1007 
1008   /// The pragma float_control state.
1009   std::optional<FPOptionsOverride> FpPragmaCurrentValue;
1010   SourceLocation FpPragmaCurrentLocation;
1011   struct FpPragmaStackEntry {
1012     FPOptionsOverride Value;
1013     SourceLocation Location;
1014     SourceLocation PushLocation;
1015     StringRef SlotLabel;
1016   };
1017   llvm::SmallVector<FpPragmaStackEntry, 2> FpPragmaStack;
1018   llvm::SmallVector<std::string, 2> FpPragmaStrings;
1019 
1020   /// The pragma align/pack state.
1021   std::optional<Sema::AlignPackInfo> PragmaAlignPackCurrentValue;
1022   SourceLocation PragmaAlignPackCurrentLocation;
1023   struct PragmaAlignPackStackEntry {
1024     Sema::AlignPackInfo Value;
1025     SourceLocation Location;
1026     SourceLocation PushLocation;
1027     StringRef SlotLabel;
1028   };
1029   llvm::SmallVector<PragmaAlignPackStackEntry, 2> PragmaAlignPackStack;
1030   llvm::SmallVector<std::string, 2> PragmaAlignPackStrings;
1031 
1032   /// The OpenCL extension settings.
1033   OpenCLOptions OpenCLExtensions;
1034 
1035   /// Extensions required by an OpenCL type.
1036   llvm::DenseMap<const Type *, std::set<std::string>> OpenCLTypeExtMap;
1037 
1038   /// Extensions required by an OpenCL declaration.
1039   llvm::DenseMap<const Decl *, std::set<std::string>> OpenCLDeclExtMap;
1040 
1041   /// A list of the namespaces we've seen.
1042   SmallVector<GlobalDeclID, 4> KnownNamespaces;
1043 
1044   /// A list of undefined decls with internal linkage followed by the
1045   /// SourceLocation of a matching ODR-use.
1046   struct UndefinedButUsedDecl {
1047     GlobalDeclID ID;
1048     SourceLocation::UIntTy RawLoc;
1049   };
1050   SmallVector<UndefinedButUsedDecl, 8> UndefinedButUsed;
1051 
1052   /// Delete expressions to analyze at the end of translation unit.
1053   SmallVector<uint64_t, 8> DelayedDeleteExprs;
1054 
1055   // A list of late parsed template function data with their module files.
1056   SmallVector<std::pair<ModuleFile *, SmallVector<uint64_t, 1>>, 4>
1057       LateParsedTemplates;
1058 
1059   /// The IDs of all decls to be checked for deferred diags.
1060   ///
1061   /// Sema tracks these to emit deferred diags.
1062   llvm::SmallSetVector<GlobalDeclID, 4> DeclsToCheckForDeferredDiags;
1063 
1064   /// The IDs of all decls with function effects to be checked.
1065   SmallVector<GlobalDeclID> DeclsWithEffectsToVerify;
1066 
1067 private:
1068   struct ImportedSubmodule {
1069     serialization::SubmoduleID ID;
1070     SourceLocation ImportLoc;
1071 
ImportedSubmoduleImportedSubmodule1072     ImportedSubmodule(serialization::SubmoduleID ID, SourceLocation ImportLoc)
1073         : ID(ID), ImportLoc(ImportLoc) {}
1074   };
1075 
1076   /// A list of modules that were imported by precompiled headers or
1077   /// any other non-module AST file and have not yet been made visible. If a
1078   /// module is made visible in the ASTReader, it will be transfered to
1079   /// \c PendingImportedModulesSema.
1080   SmallVector<ImportedSubmodule, 2> PendingImportedModules;
1081 
1082   /// A list of modules that were imported by precompiled headers or
1083   /// any other non-module AST file and have not yet been made visible for Sema.
1084   SmallVector<ImportedSubmodule, 2> PendingImportedModulesSema;
1085   //@}
1086 
1087   /// The system include root to be used when loading the
1088   /// precompiled header.
1089   std::string isysroot;
1090 
1091   /// Whether to disable the normal validation performed on precompiled
1092   /// headers and module files when they are loaded.
1093   DisableValidationForModuleKind DisableValidationKind;
1094 
1095   /// Whether to accept an AST file with compiler errors.
1096   bool AllowASTWithCompilerErrors;
1097 
1098   /// Whether to accept an AST file that has a different configuration
1099   /// from the current compiler instance.
1100   bool AllowConfigurationMismatch;
1101 
1102   /// Whether to validate system input files.
1103   bool ValidateSystemInputs;
1104 
1105   /// Whether to force the validation of user input files.
1106   bool ForceValidateUserInputs;
1107 
1108   /// Whether validate headers and module maps using hash based on contents.
1109   bool ValidateASTInputFilesContent;
1110 
1111   /// Whether we are allowed to use the global module index.
1112   bool UseGlobalIndex;
1113 
1114   /// Whether we have tried loading the global module index yet.
1115   bool TriedLoadingGlobalIndex = false;
1116 
1117   ///Whether we are currently processing update records.
1118   bool ProcessingUpdateRecords = false;
1119 
1120   using SwitchCaseMapTy = llvm::DenseMap<unsigned, SwitchCase *>;
1121 
1122   /// Mapping from switch-case IDs in the chain to switch-case statements
1123   ///
1124   /// Statements usually don't have IDs, but switch cases need them, so that the
1125   /// switch statement can refer to them.
1126   SwitchCaseMapTy SwitchCaseStmts;
1127 
1128   SwitchCaseMapTy *CurrSwitchCaseStmts;
1129 
1130   /// The number of source location entries de-serialized from
1131   /// the PCH file.
1132   unsigned NumSLocEntriesRead = 0;
1133 
1134   /// The number of source location entries in the chain.
1135   unsigned TotalNumSLocEntries = 0;
1136 
1137   /// The number of statements (and expressions) de-serialized
1138   /// from the chain.
1139   unsigned NumStatementsRead = 0;
1140 
1141   /// The total number of statements (and expressions) stored
1142   /// in the chain.
1143   unsigned TotalNumStatements = 0;
1144 
1145   /// The number of macros de-serialized from the chain.
1146   unsigned NumMacrosRead = 0;
1147 
1148   /// The total number of macros stored in the chain.
1149   unsigned TotalNumMacros = 0;
1150 
1151   /// The number of lookups into identifier tables.
1152   unsigned NumIdentifierLookups = 0;
1153 
1154   /// The number of lookups into identifier tables that succeed.
1155   unsigned NumIdentifierLookupHits = 0;
1156 
1157   /// The number of selectors that have been read.
1158   unsigned NumSelectorsRead = 0;
1159 
1160   /// The number of method pool entries that have been read.
1161   unsigned NumMethodPoolEntriesRead = 0;
1162 
1163   /// The number of times we have looked up a selector in the method
1164   /// pool.
1165   unsigned NumMethodPoolLookups = 0;
1166 
1167   /// The number of times we have looked up a selector in the method
1168   /// pool and found something.
1169   unsigned NumMethodPoolHits = 0;
1170 
1171   /// The number of times we have looked up a selector in the method
1172   /// pool within a specific module.
1173   unsigned NumMethodPoolTableLookups = 0;
1174 
1175   /// The number of times we have looked up a selector in the method
1176   /// pool within a specific module and found something.
1177   unsigned NumMethodPoolTableHits = 0;
1178 
1179   /// The total number of method pool entries in the selector table.
1180   unsigned TotalNumMethodPoolEntries = 0;
1181 
1182   /// Number of lexical decl contexts read/total.
1183   unsigned NumLexicalDeclContextsRead = 0, TotalLexicalDeclContexts = 0;
1184 
1185   /// Number of visible decl contexts read/total.
1186   unsigned NumVisibleDeclContextsRead = 0, TotalVisibleDeclContexts = 0;
1187 
1188   /// Number of module local visible decl contexts read/total.
1189   unsigned NumModuleLocalVisibleDeclContexts = 0,
1190            TotalModuleLocalVisibleDeclContexts = 0;
1191 
1192   /// Number of TU Local decl contexts read/total
1193   unsigned NumTULocalVisibleDeclContexts = 0,
1194            TotalTULocalVisibleDeclContexts = 0;
1195 
1196   /// Total size of modules, in bits, currently loaded
1197   uint64_t TotalModulesSizeInBits = 0;
1198 
1199   /// Number of Decl/types that are currently deserializing.
1200   unsigned NumCurrentElementsDeserializing = 0;
1201 
1202   /// Set false while we are in a state where we cannot safely pass deserialized
1203   /// "interesting" decls to the consumer inside FinishedDeserializing().
1204   /// This is used as a guard to avoid recursively entering the process of
1205   /// passing decls to consumer.
1206   bool CanPassDeclsToConsumer = true;
1207 
1208   /// The set of identifiers that were read while the AST reader was
1209   /// (recursively) loading declarations.
1210   ///
1211   /// The declarations on the identifier chain for these identifiers will be
1212   /// loaded once the recursive loading has completed.
1213   llvm::MapVector<IdentifierInfo *, SmallVector<GlobalDeclID, 4>>
1214       PendingIdentifierInfos;
1215 
1216   /// The set of lookup results that we have faked in order to support
1217   /// merging of partially deserialized decls but that we have not yet removed.
1218   llvm::SmallMapVector<const IdentifierInfo *, SmallVector<NamedDecl *, 2>, 16>
1219       PendingFakeLookupResults;
1220 
1221   /// The generation number of each identifier, which keeps track of
1222   /// the last time we loaded information about this identifier.
1223   llvm::DenseMap<const IdentifierInfo *, unsigned> IdentifierGeneration;
1224 
1225   /// Contains declarations and definitions that could be
1226   /// "interesting" to the ASTConsumer, when we get that AST consumer.
1227   ///
1228   /// "Interesting" declarations are those that have data that may
1229   /// need to be emitted, such as inline function definitions or
1230   /// Objective-C protocols.
1231   std::deque<Decl *> PotentiallyInterestingDecls;
1232 
1233   /// The list of deduced function types that we have not yet read, because
1234   /// they might contain a deduced return type that refers to a local type
1235   /// declared within the function.
1236   SmallVector<std::pair<FunctionDecl *, serialization::TypeID>, 16>
1237       PendingDeducedFunctionTypes;
1238 
1239   /// The list of deduced variable types that we have not yet read, because
1240   /// they might contain a deduced type that refers to a local type declared
1241   /// within the variable.
1242   SmallVector<std::pair<VarDecl *, serialization::TypeID>, 16>
1243       PendingDeducedVarTypes;
1244 
1245   /// The list of redeclaration chains that still need to be
1246   /// reconstructed, and the local offset to the corresponding list
1247   /// of redeclarations.
1248   SmallVector<std::pair<Decl *, uint64_t>, 16> PendingDeclChains;
1249 
1250   /// The list of canonical declarations whose redeclaration chains
1251   /// need to be marked as incomplete once we're done deserializing things.
1252   SmallVector<Decl *, 16> PendingIncompleteDeclChains;
1253 
1254   /// The Decl IDs for the Sema/Lexical DeclContext of a Decl that has
1255   /// been loaded but its DeclContext was not set yet.
1256   struct PendingDeclContextInfo {
1257     Decl *D;
1258     GlobalDeclID SemaDC;
1259     GlobalDeclID LexicalDC;
1260   };
1261 
1262   /// The set of Decls that have been loaded but their DeclContexts are
1263   /// not set yet.
1264   ///
1265   /// The DeclContexts for these Decls will be set once recursive loading has
1266   /// been completed.
1267   std::deque<PendingDeclContextInfo> PendingDeclContextInfos;
1268 
1269   template <typename DeclTy>
1270   using DuplicateObjCDecls = std::pair<DeclTy *, DeclTy *>;
1271 
1272   /// When resolving duplicate ivars from Objective-C extensions we don't error
1273   /// out immediately but check if can merge identical extensions. Not checking
1274   /// extensions for equality immediately because ivar deserialization isn't
1275   /// over yet at that point.
1276   llvm::SmallMapVector<DuplicateObjCDecls<ObjCCategoryDecl>,
1277                        llvm::SmallVector<DuplicateObjCDecls<ObjCIvarDecl>, 4>,
1278                        2>
1279       PendingObjCExtensionIvarRedeclarations;
1280 
1281   /// Members that have been added to classes, for which the class has not yet
1282   /// been notified. CXXRecordDecl::addedMember will be called for each of
1283   /// these once recursive deserialization is complete.
1284   SmallVector<std::pair<CXXRecordDecl*, Decl*>, 4> PendingAddedClassMembers;
1285 
1286   /// The set of NamedDecls that have been loaded, but are members of a
1287   /// context that has been merged into another context where the corresponding
1288   /// declaration is either missing or has not yet been loaded.
1289   ///
1290   /// We will check whether the corresponding declaration is in fact missing
1291   /// once recursing loading has been completed.
1292   llvm::SmallVector<NamedDecl *, 16> PendingOdrMergeChecks;
1293 
1294   using DataPointers =
1295       std::pair<CXXRecordDecl *, struct CXXRecordDecl::DefinitionData *>;
1296   using ObjCInterfaceDataPointers =
1297       std::pair<ObjCInterfaceDecl *,
1298                 struct ObjCInterfaceDecl::DefinitionData *>;
1299   using ObjCProtocolDataPointers =
1300       std::pair<ObjCProtocolDecl *, struct ObjCProtocolDecl::DefinitionData *>;
1301 
1302   /// Record definitions in which we found an ODR violation.
1303   llvm::SmallDenseMap<CXXRecordDecl *, llvm::SmallVector<DataPointers, 2>, 2>
1304       PendingOdrMergeFailures;
1305 
1306   /// C/ObjC record definitions in which we found an ODR violation.
1307   llvm::SmallDenseMap<RecordDecl *, llvm::SmallVector<RecordDecl *, 2>, 2>
1308       PendingRecordOdrMergeFailures;
1309 
1310   /// Function definitions in which we found an ODR violation.
1311   llvm::SmallDenseMap<FunctionDecl *, llvm::SmallVector<FunctionDecl *, 2>, 2>
1312       PendingFunctionOdrMergeFailures;
1313 
1314   /// Enum definitions in which we found an ODR violation.
1315   llvm::SmallDenseMap<EnumDecl *, llvm::SmallVector<EnumDecl *, 2>, 2>
1316       PendingEnumOdrMergeFailures;
1317 
1318   /// ObjCInterfaceDecl in which we found an ODR violation.
1319   llvm::SmallDenseMap<ObjCInterfaceDecl *,
1320                       llvm::SmallVector<ObjCInterfaceDataPointers, 2>, 2>
1321       PendingObjCInterfaceOdrMergeFailures;
1322 
1323   /// ObjCProtocolDecl in which we found an ODR violation.
1324   llvm::SmallDenseMap<ObjCProtocolDecl *,
1325                       llvm::SmallVector<ObjCProtocolDataPointers, 2>, 2>
1326       PendingObjCProtocolOdrMergeFailures;
1327 
1328   /// DeclContexts in which we have diagnosed an ODR violation.
1329   llvm::SmallPtrSet<DeclContext*, 2> DiagnosedOdrMergeFailures;
1330 
1331   /// The set of Objective-C categories that have been deserialized
1332   /// since the last time the declaration chains were linked.
1333   llvm::SmallPtrSet<ObjCCategoryDecl *, 16> CategoriesDeserialized;
1334 
1335   /// The set of Objective-C class definitions that have already been
1336   /// loaded, for which we will need to check for categories whenever a new
1337   /// module is loaded.
1338   SmallVector<ObjCInterfaceDecl *, 16> ObjCClassesLoaded;
1339 
1340   using KeyDeclsMap = llvm::DenseMap<Decl *, SmallVector<GlobalDeclID, 2>>;
1341 
1342   /// A mapping from canonical declarations to the set of global
1343   /// declaration IDs for key declaration that have been merged with that
1344   /// canonical declaration. A key declaration is a formerly-canonical
1345   /// declaration whose module did not import any other key declaration for that
1346   /// entity. These are the IDs that we use as keys when finding redecl chains.
1347   KeyDeclsMap KeyDecls;
1348 
1349   /// A mapping from DeclContexts to the semantic DeclContext that we
1350   /// are treating as the definition of the entity. This is used, for instance,
1351   /// when merging implicit instantiations of class templates across modules.
1352   llvm::DenseMap<DeclContext *, DeclContext *> MergedDeclContexts;
1353 
1354   /// A mapping from canonical declarations of enums to their canonical
1355   /// definitions. Only populated when using modules in C++.
1356   llvm::DenseMap<EnumDecl *, EnumDecl *> EnumDefinitions;
1357 
1358   /// A mapping from canonical declarations of records to their canonical
1359   /// definitions. Doesn't cover CXXRecordDecl.
1360   llvm::DenseMap<RecordDecl *, RecordDecl *> RecordDefinitions;
1361 
1362   /// When reading a Stmt tree, Stmt operands are placed in this stack.
1363   SmallVector<Stmt *, 16> StmtStack;
1364 
1365   /// What kind of records we are reading.
1366   enum ReadingKind {
1367     Read_None, Read_Decl, Read_Type, Read_Stmt
1368   };
1369 
1370   /// What kind of records we are reading.
1371   ReadingKind ReadingKind = Read_None;
1372 
1373   /// RAII object to change the reading kind.
1374   class ReadingKindTracker {
1375     ASTReader &Reader;
1376     enum ReadingKind PrevKind;
1377 
1378   public:
ReadingKindTracker(enum ReadingKind newKind,ASTReader & reader)1379     ReadingKindTracker(enum ReadingKind newKind, ASTReader &reader)
1380         : Reader(reader), PrevKind(Reader.ReadingKind) {
1381       Reader.ReadingKind = newKind;
1382     }
1383 
1384     ReadingKindTracker(const ReadingKindTracker &) = delete;
1385     ReadingKindTracker &operator=(const ReadingKindTracker &) = delete;
~ReadingKindTracker()1386     ~ReadingKindTracker() { Reader.ReadingKind = PrevKind; }
1387   };
1388 
1389   /// RAII object to mark the start of processing updates.
1390   class ProcessingUpdatesRAIIObj {
1391     ASTReader &Reader;
1392     bool PrevState;
1393 
1394   public:
ProcessingUpdatesRAIIObj(ASTReader & reader)1395     ProcessingUpdatesRAIIObj(ASTReader &reader)
1396         : Reader(reader), PrevState(Reader.ProcessingUpdateRecords) {
1397       Reader.ProcessingUpdateRecords = true;
1398     }
1399 
1400     ProcessingUpdatesRAIIObj(const ProcessingUpdatesRAIIObj &) = delete;
1401     ProcessingUpdatesRAIIObj &
1402     operator=(const ProcessingUpdatesRAIIObj &) = delete;
~ProcessingUpdatesRAIIObj()1403     ~ProcessingUpdatesRAIIObj() { Reader.ProcessingUpdateRecords = PrevState; }
1404   };
1405 
1406   /// Suggested contents of the predefines buffer, after this
1407   /// PCH file has been processed.
1408   ///
1409   /// In most cases, this string will be empty, because the predefines
1410   /// buffer computed to build the PCH file will be identical to the
1411   /// predefines buffer computed from the command line. However, when
1412   /// there are differences that the PCH reader can work around, this
1413   /// predefines buffer may contain additional definitions.
1414   std::string SuggestedPredefines;
1415 
1416   llvm::DenseMap<const Decl *, bool> DefinitionSource;
1417 
1418   /// Friend functions that were defined but might have had their bodies
1419   /// removed.
1420   llvm::DenseSet<const FunctionDecl *> ThisDeclarationWasADefinitionSet;
1421 
1422   bool shouldDisableValidationForFile(const serialization::ModuleFile &M) const;
1423 
1424   /// Reads a statement from the specified cursor.
1425   Stmt *ReadStmtFromStream(ModuleFile &F);
1426 
1427   /// Retrieve the stored information about an input file.
1428   serialization::InputFileInfo getInputFileInfo(ModuleFile &F, unsigned ID);
1429 
1430   /// Retrieve the file entry and 'overridden' bit for an input
1431   /// file in the given module file.
1432   serialization::InputFile getInputFile(ModuleFile &F, unsigned ID,
1433                                         bool Complain = true);
1434 
1435   /// The buffer used as the temporary backing storage for resolved paths.
1436   SmallString<0> PathBuf;
1437 
1438   /// A wrapper around StringRef that temporarily borrows the underlying buffer.
1439   class TemporarilyOwnedStringRef {
1440     StringRef String;
1441     llvm::SaveAndRestore<SmallString<0>> UnderlyingBuffer;
1442 
1443   public:
TemporarilyOwnedStringRef(StringRef S,SmallString<0> & UnderlyingBuffer)1444     TemporarilyOwnedStringRef(StringRef S, SmallString<0> &UnderlyingBuffer)
1445         : String(S), UnderlyingBuffer(UnderlyingBuffer, {}) {}
1446 
1447     /// Return the wrapped \c StringRef that must be outlived by \c this.
1448     const StringRef *operator->() const & { return &String; }
1449     const StringRef &operator*() const & { return String; }
1450 
1451     /// Make it harder to get a \c StringRef that outlives \c this.
1452     const StringRef *operator->() && = delete;
1453     const StringRef &operator*() && = delete;
1454   };
1455 
1456 public:
1457   /// Get the buffer for resolving paths.
getPathBuf()1458   SmallString<0> &getPathBuf() { return PathBuf; }
1459 
1460   /// Resolve \c Path in the context of module file \c M. The return value
1461   /// must go out of scope before the next call to \c ResolveImportedPath.
1462   static TemporarilyOwnedStringRef
1463   ResolveImportedPath(SmallString<0> &Buf, StringRef Path, ModuleFile &ModF);
1464   /// Resolve \c Path in the context of the \c Prefix directory. The return
1465   /// value must go out of scope before the next call to \c ResolveImportedPath.
1466   static TemporarilyOwnedStringRef
1467   ResolveImportedPath(SmallString<0> &Buf, StringRef Path, StringRef Prefix);
1468 
1469   /// Resolve \c Path in the context of module file \c M.
1470   static std::string ResolveImportedPathAndAllocate(SmallString<0> &Buf,
1471                                                     StringRef Path,
1472                                                     ModuleFile &ModF);
1473   /// Resolve \c Path in the context of the \c Prefix directory.
1474   static std::string ResolveImportedPathAndAllocate(SmallString<0> &Buf,
1475                                                     StringRef Path,
1476                                                     StringRef Prefix);
1477 
1478   /// Returns the first key declaration for the given declaration. This
1479   /// is one that is formerly-canonical (or still canonical) and whose module
1480   /// did not import any other key declaration of the entity.
getKeyDeclaration(Decl * D)1481   Decl *getKeyDeclaration(Decl *D) {
1482     D = D->getCanonicalDecl();
1483     if (D->isFromASTFile())
1484       return D;
1485 
1486     auto I = KeyDecls.find(D);
1487     if (I == KeyDecls.end() || I->second.empty())
1488       return D;
1489     return GetExistingDecl(I->second[0]);
1490   }
getKeyDeclaration(const Decl * D)1491   const Decl *getKeyDeclaration(const Decl *D) {
1492     return getKeyDeclaration(const_cast<Decl*>(D));
1493   }
1494 
1495   /// Run a callback on each imported key declaration of \p D.
1496   template <typename Fn>
forEachImportedKeyDecl(const Decl * D,Fn Visit)1497   void forEachImportedKeyDecl(const Decl *D, Fn Visit) {
1498     D = D->getCanonicalDecl();
1499     if (D->isFromASTFile())
1500       Visit(D);
1501 
1502     auto It = KeyDecls.find(const_cast<Decl*>(D));
1503     if (It != KeyDecls.end())
1504       for (auto ID : It->second)
1505         Visit(GetExistingDecl(ID));
1506   }
1507 
1508   /// Get the loaded lookup tables for \p Primary, if any.
1509   const serialization::reader::DeclContextLookupTable *
1510   getLoadedLookupTables(DeclContext *Primary) const;
1511 
1512   const serialization::reader::ModuleLocalLookupTable *
1513   getModuleLocalLookupTables(DeclContext *Primary) const;
1514 
1515   const serialization::reader::DeclContextLookupTable *
1516   getTULocalLookupTables(DeclContext *Primary) const;
1517 
1518   /// Get the loaded specializations lookup tables for \p D,
1519   /// if any.
1520   serialization::reader::LazySpecializationInfoLookupTable *
1521   getLoadedSpecializationsLookupTables(const Decl *D, bool IsPartial);
1522 
1523   /// If we have any unloaded specialization for \p D
1524   bool haveUnloadedSpecializations(const Decl *D) const;
1525 
1526 private:
1527   struct ImportedModule {
1528     ModuleFile *Mod;
1529     ModuleFile *ImportedBy;
1530     SourceLocation ImportLoc;
1531 
ImportedModuleImportedModule1532     ImportedModule(ModuleFile *Mod,
1533                    ModuleFile *ImportedBy,
1534                    SourceLocation ImportLoc)
1535         : Mod(Mod), ImportedBy(ImportedBy), ImportLoc(ImportLoc) {}
1536   };
1537 
1538   ASTReadResult ReadASTCore(StringRef FileName, ModuleKind Type,
1539                             SourceLocation ImportLoc, ModuleFile *ImportedBy,
1540                             SmallVectorImpl<ImportedModule> &Loaded,
1541                             off_t ExpectedSize, time_t ExpectedModTime,
1542                             ASTFileSignature ExpectedSignature,
1543                             unsigned ClientLoadCapabilities);
1544   ASTReadResult ReadControlBlock(ModuleFile &F,
1545                                  SmallVectorImpl<ImportedModule> &Loaded,
1546                                  const ModuleFile *ImportedBy,
1547                                  unsigned ClientLoadCapabilities);
1548   static ASTReadResult
1549   ReadOptionsBlock(llvm::BitstreamCursor &Stream, StringRef Filename,
1550                    unsigned ClientLoadCapabilities,
1551                    bool AllowCompatibleConfigurationMismatch,
1552                    ASTReaderListener &Listener,
1553                    std::string &SuggestedPredefines);
1554 
1555   /// Read the unhashed control block.
1556   ///
1557   /// This has no effect on \c F.Stream, instead creating a fresh cursor from
1558   /// \c F.Data and reading ahead.
1559   ASTReadResult readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy,
1560                                          unsigned ClientLoadCapabilities);
1561 
1562   static ASTReadResult readUnhashedControlBlockImpl(
1563       ModuleFile *F, llvm::StringRef StreamData, StringRef Filename,
1564       unsigned ClientLoadCapabilities,
1565       bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener,
1566       bool ValidateDiagnosticOptions);
1567 
1568   llvm::Error ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities);
1569   llvm::Error ReadExtensionBlock(ModuleFile &F);
1570   void ReadModuleOffsetMap(ModuleFile &F) const;
1571   void ParseLineTable(ModuleFile &F, const RecordData &Record);
1572   llvm::Error ReadSourceManagerBlock(ModuleFile &F);
1573   SourceLocation getImportLocation(ModuleFile *F);
1574   ASTReadResult ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
1575                                        const ModuleFile *ImportedBy,
1576                                        unsigned ClientLoadCapabilities);
1577   llvm::Error ReadSubmoduleBlock(ModuleFile &F,
1578                                  unsigned ClientLoadCapabilities);
1579   static bool ParseLanguageOptions(const RecordData &Record,
1580                                    StringRef ModuleFilename, bool Complain,
1581                                    ASTReaderListener &Listener,
1582                                    bool AllowCompatibleDifferences);
1583   static bool ParseTargetOptions(const RecordData &Record,
1584                                  StringRef ModuleFilename, bool Complain,
1585                                  ASTReaderListener &Listener,
1586                                  bool AllowCompatibleDifferences);
1587   static bool ParseDiagnosticOptions(const RecordData &Record,
1588                                      StringRef ModuleFilename, bool Complain,
1589                                      ASTReaderListener &Listener);
1590   static bool ParseFileSystemOptions(const RecordData &Record, bool Complain,
1591                                      ASTReaderListener &Listener);
1592   static bool ParseHeaderSearchOptions(const RecordData &Record,
1593                                        StringRef ModuleFilename, bool Complain,
1594                                        ASTReaderListener &Listener);
1595   static bool ParseHeaderSearchPaths(const RecordData &Record, bool Complain,
1596                                      ASTReaderListener &Listener);
1597   static bool ParsePreprocessorOptions(const RecordData &Record,
1598                                        StringRef ModuleFilename, bool Complain,
1599                                        ASTReaderListener &Listener,
1600                                        std::string &SuggestedPredefines);
1601 
1602   struct RecordLocation {
1603     ModuleFile *F;
1604     uint64_t Offset;
1605 
RecordLocationRecordLocation1606     RecordLocation(ModuleFile *M, uint64_t O) : F(M), Offset(O) {}
1607   };
1608 
1609   QualType readTypeRecord(serialization::TypeID ID);
1610   RecordLocation TypeCursorForIndex(serialization::TypeID ID);
1611   void LoadedDecl(unsigned Index, Decl *D);
1612   Decl *ReadDeclRecord(GlobalDeclID ID);
1613   void markIncompleteDeclChain(Decl *D);
1614 
1615   /// Returns the most recent declaration of a declaration (which must be
1616   /// of a redeclarable kind) that is either local or has already been loaded
1617   /// merged into its redecl chain.
1618   Decl *getMostRecentExistingDecl(Decl *D);
1619 
1620   RecordLocation DeclCursorForID(GlobalDeclID ID, SourceLocation &Location);
1621   void loadDeclUpdateRecords(PendingUpdateRecord &Record);
1622   void loadPendingDeclChain(Decl *D, uint64_t LocalOffset);
1623   void loadObjCCategories(GlobalDeclID ID, ObjCInterfaceDecl *D,
1624                           unsigned PreviousGeneration = 0);
1625 
1626   RecordLocation getLocalBitOffset(uint64_t GlobalOffset);
1627   uint64_t getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset);
1628 
1629   /// Returns the first preprocessed entity ID that begins or ends after
1630   /// \arg Loc.
1631   serialization::PreprocessedEntityID
1632   findPreprocessedEntity(SourceLocation Loc, bool EndsAfter) const;
1633 
1634   /// Find the next module that contains entities and return the ID
1635   /// of the first entry.
1636   ///
1637   /// \param SLocMapI points at a chunk of a module that contains no
1638   /// preprocessed entities or the entities it contains are not the
1639   /// ones we are looking for.
1640   serialization::PreprocessedEntityID
1641     findNextPreprocessedEntity(
1642                         GlobalSLocOffsetMapType::const_iterator SLocMapI) const;
1643 
1644   /// Returns (ModuleFile, Local index) pair for \p GlobalIndex of a
1645   /// preprocessed entity.
1646   std::pair<ModuleFile *, unsigned>
1647     getModulePreprocessedEntity(unsigned GlobalIndex);
1648 
1649   /// Returns (begin, end) pair for the preprocessed entities of a
1650   /// particular module.
1651   llvm::iterator_range<PreprocessingRecord::iterator>
1652   getModulePreprocessedEntities(ModuleFile &Mod) const;
1653 
1654   bool canRecoverFromOutOfDate(StringRef ModuleFileName,
1655                                unsigned ClientLoadCapabilities);
1656 
1657 public:
1658   class ModuleDeclIterator
1659       : public llvm::iterator_adaptor_base<
1660             ModuleDeclIterator, const serialization::unaligned_decl_id_t *,
1661             std::random_access_iterator_tag, const Decl *, ptrdiff_t,
1662             const Decl *, const Decl *> {
1663     ASTReader *Reader = nullptr;
1664     ModuleFile *Mod = nullptr;
1665 
1666   public:
ModuleDeclIterator()1667     ModuleDeclIterator() : iterator_adaptor_base(nullptr) {}
1668 
ModuleDeclIterator(ASTReader * Reader,ModuleFile * Mod,const serialization::unaligned_decl_id_t * Pos)1669     ModuleDeclIterator(ASTReader *Reader, ModuleFile *Mod,
1670                        const serialization::unaligned_decl_id_t *Pos)
1671         : iterator_adaptor_base(Pos), Reader(Reader), Mod(Mod) {}
1672 
1673     value_type operator*() const {
1674       LocalDeclID ID = LocalDeclID::get(*Reader, *Mod, *I);
1675       return Reader->GetDecl(Reader->getGlobalDeclID(*Mod, ID));
1676     }
1677 
1678     value_type operator->() const { return **this; }
1679 
1680     bool operator==(const ModuleDeclIterator &RHS) const {
1681       assert(Reader == RHS.Reader && Mod == RHS.Mod);
1682       return I == RHS.I;
1683     }
1684   };
1685 
1686   llvm::iterator_range<ModuleDeclIterator>
1687   getModuleFileLevelDecls(ModuleFile &Mod);
1688 
1689 private:
1690   bool isConsumerInterestedIn(Decl *D);
1691   void PassInterestingDeclsToConsumer();
1692   void PassInterestingDeclToConsumer(Decl *D);
1693   void PassVTableToConsumer(CXXRecordDecl *RD);
1694 
1695   void finishPendingActions();
1696   void diagnoseOdrViolations();
1697 
1698   void pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name);
1699 
addPendingDeclContextInfo(Decl * D,GlobalDeclID SemaDC,GlobalDeclID LexicalDC)1700   void addPendingDeclContextInfo(Decl *D, GlobalDeclID SemaDC,
1701                                  GlobalDeclID LexicalDC) {
1702     assert(D);
1703     PendingDeclContextInfo Info = { D, SemaDC, LexicalDC };
1704     PendingDeclContextInfos.push_back(Info);
1705   }
1706 
1707   /// Produce an error diagnostic and return true.
1708   ///
1709   /// This routine should only be used for fatal errors that have to
1710   /// do with non-routine failures (e.g., corrupted AST file).
1711   void Error(StringRef Msg) const;
1712   void Error(unsigned DiagID, StringRef Arg1 = StringRef(),
1713              StringRef Arg2 = StringRef(), StringRef Arg3 = StringRef()) const;
1714   void Error(llvm::Error &&Err) const;
1715 
1716   /// Translate a \param GlobalDeclID to the index of DeclsLoaded array.
1717   unsigned translateGlobalDeclIDToIndex(GlobalDeclID ID) const;
1718 
1719   /// Translate an \param IdentifierID ID to the index of IdentifiersLoaded
1720   /// array and the corresponding module file.
1721   std::pair<ModuleFile *, unsigned>
1722   translateIdentifierIDToIndex(serialization::IdentifierID ID) const;
1723 
1724   /// Translate an \param TypeID ID to the index of TypesLoaded
1725   /// array and the corresponding module file.
1726   std::pair<ModuleFile *, unsigned>
1727   translateTypeIDToIndex(serialization::TypeID ID) const;
1728 
1729   /// Get a predefined Decl from ASTContext.
1730   Decl *getPredefinedDecl(PredefinedDeclIDs ID);
1731 
1732 public:
1733   /// Load the AST file and validate its contents against the given
1734   /// Preprocessor.
1735   ///
1736   /// \param PP the preprocessor associated with the context in which this
1737   /// precompiled header will be loaded.
1738   ///
1739   /// \param Context the AST context that this precompiled header will be
1740   /// loaded into, if any.
1741   ///
1742   /// \param PCHContainerRdr the PCHContainerOperations to use for loading and
1743   /// creating modules.
1744   ///
1745   /// \param Extensions the list of module file extensions that can be loaded
1746   /// from the AST files.
1747   ///
1748   /// \param isysroot If non-NULL, the system include path specified by the
1749   /// user. This is only used with relocatable PCH files. If non-NULL,
1750   /// a relocatable PCH file will use the default path "/".
1751   ///
1752   /// \param DisableValidationKind If set, the AST reader will suppress most
1753   /// of its regular consistency checking, allowing the use of precompiled
1754   /// headers and module files that cannot be determined to be compatible.
1755   ///
1756   /// \param AllowASTWithCompilerErrors If true, the AST reader will accept an
1757   /// AST file the was created out of an AST with compiler errors,
1758   /// otherwise it will reject it.
1759   ///
1760   /// \param AllowConfigurationMismatch If true, the AST reader will not check
1761   /// for configuration differences between the AST file and the invocation.
1762   ///
1763   /// \param ValidateSystemInputs If true, the AST reader will validate
1764   /// system input files in addition to user input files. This is only
1765   /// meaningful if \p DisableValidation is false.
1766   ///
1767   /// \param UseGlobalIndex If true, the AST reader will try to load and use
1768   /// the global module index.
1769   ///
1770   /// \param ReadTimer If non-null, a timer used to track the time spent
1771   /// deserializing.
1772   ASTReader(Preprocessor &PP, ModuleCache &ModCache, ASTContext *Context,
1773             const PCHContainerReader &PCHContainerRdr,
1774             ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
1775             StringRef isysroot = "",
1776             DisableValidationForModuleKind DisableValidationKind =
1777                 DisableValidationForModuleKind::None,
1778             bool AllowASTWithCompilerErrors = false,
1779             bool AllowConfigurationMismatch = false,
1780             bool ValidateSystemInputs = false,
1781             bool ForceValidateUserInputs = true,
1782             bool ValidateASTInputFilesContent = false,
1783             bool UseGlobalIndex = true,
1784             std::unique_ptr<llvm::Timer> ReadTimer = {});
1785   ASTReader(const ASTReader &) = delete;
1786   ASTReader &operator=(const ASTReader &) = delete;
1787   ~ASTReader() override;
1788 
getSourceManager()1789   SourceManager &getSourceManager() const { return SourceMgr; }
getFileManager()1790   FileManager &getFileManager() const { return FileMgr; }
getDiags()1791   DiagnosticsEngine &getDiags() const { return Diags; }
1792 
1793   /// Flags that indicate what kind of AST loading failures the client
1794   /// of the AST reader can directly handle.
1795   ///
1796   /// When a client states that it can handle a particular kind of failure,
1797   /// the AST reader will not emit errors when producing that kind of failure.
1798   enum LoadFailureCapabilities {
1799     /// The client can't handle any AST loading failures.
1800     ARR_None = 0,
1801 
1802     /// The client can handle an AST file that cannot load because it
1803     /// is missing.
1804     ARR_Missing = 0x1,
1805 
1806     /// The client can handle an AST file that cannot load because it
1807     /// is out-of-date relative to its input files.
1808     ARR_OutOfDate = 0x2,
1809 
1810     /// The client can handle an AST file that cannot load because it
1811     /// was built with a different version of Clang.
1812     ARR_VersionMismatch = 0x4,
1813 
1814     /// The client can handle an AST file that cannot load because it's
1815     /// compiled configuration doesn't match that of the context it was
1816     /// loaded into.
1817     ARR_ConfigurationMismatch = 0x8,
1818 
1819     /// If a module file is marked with errors treat it as out-of-date so the
1820     /// caller can rebuild it.
1821     ARR_TreatModuleWithErrorsAsOutOfDate = 0x10
1822   };
1823 
1824   /// Load the AST file designated by the given file name.
1825   ///
1826   /// \param FileName The name of the AST file to load.
1827   ///
1828   /// \param Type The kind of AST being loaded, e.g., PCH, module, main file,
1829   /// or preamble.
1830   ///
1831   /// \param ImportLoc the location where the module file will be considered as
1832   /// imported from. For non-module AST types it should be invalid.
1833   ///
1834   /// \param ClientLoadCapabilities The set of client load-failure
1835   /// capabilities, represented as a bitset of the enumerators of
1836   /// LoadFailureCapabilities.
1837   ///
1838   /// \param LoadedModuleFile The optional out-parameter refers to the new
1839   /// loaded modules. In case the module specified by FileName is already
1840   /// loaded, the module file pointer referred by NewLoadedModuleFile wouldn't
1841   /// change. Otherwise if the AST file get loaded successfully,
1842   /// NewLoadedModuleFile would refer to the address of the new loaded top level
1843   /// module. The state of NewLoadedModuleFile is unspecified if the AST file
1844   /// isn't loaded successfully.
1845   ASTReadResult ReadAST(StringRef FileName, ModuleKind Type,
1846                         SourceLocation ImportLoc,
1847                         unsigned ClientLoadCapabilities,
1848                         ModuleFile **NewLoadedModuleFile = nullptr);
1849 
1850   /// Make the entities in the given module and any of its (non-explicit)
1851   /// submodules visible to name lookup.
1852   ///
1853   /// \param Mod The module whose names should be made visible.
1854   ///
1855   /// \param NameVisibility The level of visibility to give the names in the
1856   /// module.  Visibility can only be increased over time.
1857   ///
1858   /// \param ImportLoc The location at which the import occurs.
1859   void makeModuleVisible(Module *Mod,
1860                          Module::NameVisibilityKind NameVisibility,
1861                          SourceLocation ImportLoc);
1862 
1863   /// Make the names within this set of hidden names visible.
1864   void makeNamesVisible(const HiddenNames &Names, Module *Owner);
1865 
1866   /// Note that MergedDef is a redefinition of the canonical definition
1867   /// Def, so Def should be visible whenever MergedDef is.
1868   void mergeDefinitionVisibility(NamedDecl *Def, NamedDecl *MergedDef);
1869 
1870   /// Take the AST callbacks listener.
takeListener()1871   std::unique_ptr<ASTReaderListener> takeListener() {
1872     return std::move(Listener);
1873   }
1874 
1875   /// Set the AST callbacks listener.
setListener(std::unique_ptr<ASTReaderListener> Listener)1876   void setListener(std::unique_ptr<ASTReaderListener> Listener) {
1877     this->Listener = std::move(Listener);
1878   }
1879 
1880   /// Add an AST callback listener.
1881   ///
1882   /// Takes ownership of \p L.
addListener(std::unique_ptr<ASTReaderListener> L)1883   void addListener(std::unique_ptr<ASTReaderListener> L) {
1884     if (Listener)
1885       L = std::make_unique<ChainedASTReaderListener>(std::move(L),
1886                                                       std::move(Listener));
1887     Listener = std::move(L);
1888   }
1889 
1890   /// RAII object to temporarily add an AST callback listener.
1891   class ListenerScope {
1892     ASTReader &Reader;
1893     bool Chained = false;
1894 
1895   public:
ListenerScope(ASTReader & Reader,std::unique_ptr<ASTReaderListener> L)1896     ListenerScope(ASTReader &Reader, std::unique_ptr<ASTReaderListener> L)
1897         : Reader(Reader) {
1898       auto Old = Reader.takeListener();
1899       if (Old) {
1900         Chained = true;
1901         L = std::make_unique<ChainedASTReaderListener>(std::move(L),
1902                                                         std::move(Old));
1903       }
1904       Reader.setListener(std::move(L));
1905     }
1906 
~ListenerScope()1907     ~ListenerScope() {
1908       auto New = Reader.takeListener();
1909       if (Chained)
1910         Reader.setListener(static_cast<ChainedASTReaderListener *>(New.get())
1911                                ->takeSecond());
1912     }
1913   };
1914 
1915   /// Set the AST deserialization listener.
1916   void setDeserializationListener(ASTDeserializationListener *Listener,
1917                                   bool TakeOwnership = false);
1918 
1919   /// Get the AST deserialization listener.
getDeserializationListener()1920   ASTDeserializationListener *getDeserializationListener() {
1921     return DeserializationListener;
1922   }
1923 
1924   /// Determine whether this AST reader has a global index.
hasGlobalIndex()1925   bool hasGlobalIndex() const { return (bool)GlobalIndex; }
1926 
1927   /// Return global module index.
getGlobalIndex()1928   GlobalModuleIndex *getGlobalIndex() { return GlobalIndex.get(); }
1929 
1930   /// Reset reader for a reload try.
resetForReload()1931   void resetForReload() { TriedLoadingGlobalIndex = false; }
1932 
1933   /// Attempts to load the global index.
1934   ///
1935   /// \returns true if loading the global index has failed for any reason.
1936   bool loadGlobalIndex();
1937 
1938   /// Determine whether we tried to load the global index, but failed,
1939   /// e.g., because it is out-of-date or does not exist.
1940   bool isGlobalIndexUnavailable() const;
1941 
1942   /// Initializes the ASTContext
1943   void InitializeContext();
1944 
1945   /// Update the state of Sema after loading some additional modules.
1946   void UpdateSema();
1947 
1948   /// Add in-memory (virtual file) buffer.
addInMemoryBuffer(StringRef & FileName,std::unique_ptr<llvm::MemoryBuffer> Buffer)1949   void addInMemoryBuffer(StringRef &FileName,
1950                          std::unique_ptr<llvm::MemoryBuffer> Buffer) {
1951     ModuleMgr.addInMemoryBuffer(FileName, std::move(Buffer));
1952   }
1953 
1954   /// Finalizes the AST reader's state before writing an AST file to
1955   /// disk.
1956   ///
1957   /// This operation may undo temporary state in the AST that should not be
1958   /// emitted.
1959   void finalizeForWriting();
1960 
1961   /// Retrieve the module manager.
getModuleManager()1962   ModuleManager &getModuleManager() { return ModuleMgr; }
getModuleManager()1963   const ModuleManager &getModuleManager() const { return ModuleMgr; }
1964 
1965   /// Retrieve the preprocessor.
getPreprocessor()1966   Preprocessor &getPreprocessor() const { return PP; }
1967 
1968   /// Retrieve the name of the original source file name for the primary
1969   /// module file.
getOriginalSourceFile()1970   StringRef getOriginalSourceFile() {
1971     return ModuleMgr.getPrimaryModule().OriginalSourceFileName;
1972   }
1973 
1974   /// Retrieve the name of the original source file name directly from
1975   /// the AST file, without actually loading the AST file.
1976   static std::string
1977   getOriginalSourceFile(const std::string &ASTFileName, FileManager &FileMgr,
1978                         const PCHContainerReader &PCHContainerRdr,
1979                         DiagnosticsEngine &Diags);
1980 
1981   /// Read the control block for the named AST file.
1982   ///
1983   /// \returns true if an error occurred, false otherwise.
1984   static bool readASTFileControlBlock(
1985       StringRef Filename, FileManager &FileMgr, const ModuleCache &ModCache,
1986       const PCHContainerReader &PCHContainerRdr, bool FindModuleFileExtensions,
1987       ASTReaderListener &Listener, bool ValidateDiagnosticOptions,
1988       unsigned ClientLoadCapabilities = ARR_ConfigurationMismatch |
1989                                         ARR_OutOfDate);
1990 
1991   /// Determine whether the given AST file is acceptable to load into a
1992   /// translation unit with the given language and target options.
1993   static bool isAcceptableASTFile(StringRef Filename, FileManager &FileMgr,
1994                                   const ModuleCache &ModCache,
1995                                   const PCHContainerReader &PCHContainerRdr,
1996                                   const LangOptions &LangOpts,
1997                                   const TargetOptions &TargetOpts,
1998                                   const PreprocessorOptions &PPOpts,
1999                                   StringRef ExistingModuleCachePath,
2000                                   bool RequireStrictOptionMatches = false);
2001 
2002   /// Returns the suggested contents of the predefines buffer,
2003   /// which contains a (typically-empty) subset of the predefines
2004   /// build prior to including the precompiled header.
getSuggestedPredefines()2005   const std::string &getSuggestedPredefines() { return SuggestedPredefines; }
2006 
2007   /// Read a preallocated preprocessed entity from the external source.
2008   ///
2009   /// \returns null if an error occurred that prevented the preprocessed
2010   /// entity from being loaded.
2011   PreprocessedEntity *ReadPreprocessedEntity(unsigned Index) override;
2012 
2013   /// Returns a pair of [Begin, End) indices of preallocated
2014   /// preprocessed entities that \p Range encompasses.
2015   std::pair<unsigned, unsigned>
2016       findPreprocessedEntitiesInRange(SourceRange Range) override;
2017 
2018   /// Optionally returns true or false if the preallocated preprocessed
2019   /// entity with index \p Index came from file \p FID.
2020   std::optional<bool> isPreprocessedEntityInFileID(unsigned Index,
2021                                                    FileID FID) override;
2022 
2023   /// Read a preallocated skipped range from the external source.
2024   SourceRange ReadSkippedRange(unsigned Index) override;
2025 
2026   /// Read the header file information for the given file entry.
2027   HeaderFileInfo GetHeaderFileInfo(FileEntryRef FE) override;
2028 
2029   void ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag);
2030 
2031   /// Returns the number of source locations found in the chain.
getTotalNumSLocs()2032   unsigned getTotalNumSLocs() const {
2033     return TotalNumSLocEntries;
2034   }
2035 
2036   /// Returns the number of identifiers found in the chain.
getTotalNumIdentifiers()2037   unsigned getTotalNumIdentifiers() const {
2038     return static_cast<unsigned>(IdentifiersLoaded.size());
2039   }
2040 
2041   /// Returns the number of macros found in the chain.
getTotalNumMacros()2042   unsigned getTotalNumMacros() const {
2043     return static_cast<unsigned>(MacrosLoaded.size());
2044   }
2045 
2046   /// Returns the number of types found in the chain.
getTotalNumTypes()2047   unsigned getTotalNumTypes() const {
2048     return static_cast<unsigned>(TypesLoaded.size());
2049   }
2050 
2051   /// Returns the number of declarations found in the chain.
getTotalNumDecls()2052   unsigned getTotalNumDecls() const {
2053     return static_cast<unsigned>(DeclsLoaded.size());
2054   }
2055 
2056   /// Returns the number of submodules known.
getTotalNumSubmodules()2057   unsigned getTotalNumSubmodules() const {
2058     return static_cast<unsigned>(SubmodulesLoaded.size());
2059   }
2060 
2061   /// Returns the number of selectors found in the chain.
getTotalNumSelectors()2062   unsigned getTotalNumSelectors() const {
2063     return static_cast<unsigned>(SelectorsLoaded.size());
2064   }
2065 
2066   /// Returns the number of preprocessed entities known to the AST
2067   /// reader.
getTotalNumPreprocessedEntities()2068   unsigned getTotalNumPreprocessedEntities() const {
2069     unsigned Result = 0;
2070     for (const auto &M : ModuleMgr)
2071       Result += M.NumPreprocessedEntities;
2072     return Result;
2073   }
2074 
2075   /// Resolve a type ID into a type, potentially building a new
2076   /// type.
2077   QualType GetType(serialization::TypeID ID);
2078 
2079   /// Resolve a local type ID within a given AST file into a type.
2080   QualType getLocalType(ModuleFile &F, serialization::LocalTypeID LocalID);
2081 
2082   /// Map a local type ID within a given AST file into a global type ID.
2083   serialization::TypeID
2084   getGlobalTypeID(ModuleFile &F, serialization::LocalTypeID LocalID) const;
2085 
2086   /// Read a type from the current position in the given record, which
2087   /// was read from the given AST file.
readType(ModuleFile & F,const RecordData & Record,unsigned & Idx)2088   QualType readType(ModuleFile &F, const RecordData &Record, unsigned &Idx) {
2089     if (Idx >= Record.size())
2090       return {};
2091 
2092     return getLocalType(F, Record[Idx++]);
2093   }
2094 
2095   /// Map from a local declaration ID within a given module to a
2096   /// global declaration ID.
2097   GlobalDeclID getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const;
2098 
2099   /// Returns true if global DeclID \p ID originated from module \p M.
2100   bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const;
2101 
2102   /// Retrieve the module file that owns the given declaration, or NULL
2103   /// if the declaration is not from a module file.
2104   ModuleFile *getOwningModuleFile(const Decl *D) const;
2105   ModuleFile *getOwningModuleFile(GlobalDeclID ID) const;
2106 
2107   /// Returns the source location for the decl \p ID.
2108   SourceLocation getSourceLocationForDeclID(GlobalDeclID ID);
2109 
2110   /// Resolve a declaration ID into a declaration, potentially
2111   /// building a new declaration.
2112   Decl *GetDecl(GlobalDeclID ID);
2113   Decl *GetExternalDecl(GlobalDeclID ID) override;
2114 
2115   /// Resolve a declaration ID into a declaration. Return 0 if it's not
2116   /// been loaded yet.
2117   Decl *GetExistingDecl(GlobalDeclID ID);
2118 
2119   /// Reads a declaration with the given local ID in the given module.
GetLocalDecl(ModuleFile & F,LocalDeclID LocalID)2120   Decl *GetLocalDecl(ModuleFile &F, LocalDeclID LocalID) {
2121     return GetDecl(getGlobalDeclID(F, LocalID));
2122   }
2123 
2124   /// Reads a declaration with the given local ID in the given module.
2125   ///
2126   /// \returns The requested declaration, casted to the given return type.
GetLocalDeclAs(ModuleFile & F,LocalDeclID LocalID)2127   template <typename T> T *GetLocalDeclAs(ModuleFile &F, LocalDeclID LocalID) {
2128     return cast_or_null<T>(GetLocalDecl(F, LocalID));
2129   }
2130 
2131   /// Map a global declaration ID into the declaration ID used to
2132   /// refer to this declaration within the given module fule.
2133   ///
2134   /// \returns the global ID of the given declaration as known in the given
2135   /// module file.
2136   LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M,
2137                                               GlobalDeclID GlobalID);
2138 
2139   /// Reads a declaration ID from the given position in a record in the
2140   /// given module.
2141   ///
2142   /// \returns The declaration ID read from the record, adjusted to a global ID.
2143   GlobalDeclID ReadDeclID(ModuleFile &F, const RecordDataImpl &Record,
2144                           unsigned &Idx);
2145 
2146   /// Reads a declaration from the given position in a record in the
2147   /// given module.
ReadDecl(ModuleFile & F,const RecordDataImpl & R,unsigned & I)2148   Decl *ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I) {
2149     return GetDecl(ReadDeclID(F, R, I));
2150   }
2151 
2152   /// Reads a declaration from the given position in a record in the
2153   /// given module.
2154   ///
2155   /// \returns The declaration read from this location, casted to the given
2156   /// result type.
2157   template <typename T>
ReadDeclAs(ModuleFile & F,const RecordDataImpl & R,unsigned & I)2158   T *ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I) {
2159     return cast_or_null<T>(GetDecl(ReadDeclID(F, R, I)));
2160   }
2161 
2162   /// If any redeclarations of \p D have been imported since it was
2163   /// last checked, this digs out those redeclarations and adds them to the
2164   /// redeclaration chain for \p D.
2165   void CompleteRedeclChain(const Decl *D) override;
2166 
2167   CXXBaseSpecifier *GetExternalCXXBaseSpecifiers(uint64_t Offset) override;
2168 
2169   /// Resolve the offset of a statement into a statement.
2170   ///
2171   /// This operation will read a new statement from the external
2172   /// source each time it is called, and is meant to be used via a
2173   /// LazyOffsetPtr (which is used by Decls for the body of functions, etc).
2174   Stmt *GetExternalDeclStmt(uint64_t Offset) override;
2175 
2176   /// ReadBlockAbbrevs - Enter a subblock of the specified BlockID with the
2177   /// specified cursor.  Read the abbreviations that are at the top of the block
2178   /// and then leave the cursor pointing into the block.
2179   static llvm::Error ReadBlockAbbrevs(llvm::BitstreamCursor &Cursor,
2180                                       unsigned BlockID,
2181                                       uint64_t *StartOfBlockOffset = nullptr);
2182 
2183   bool LoadExternalSpecializations(const Decl *D, bool OnlyPartial) override;
2184 
2185   bool
2186   LoadExternalSpecializations(const Decl *D,
2187                               ArrayRef<TemplateArgument> TemplateArgs) override;
2188 
2189   /// Finds all the visible declarations with a given name.
2190   /// The current implementation of this method just loads the entire
2191   /// lookup table as unmaterialized references.
2192   bool FindExternalVisibleDeclsByName(const DeclContext *DC,
2193                                       DeclarationName Name,
2194                                       const DeclContext *OriginalDC) override;
2195 
2196   /// Read all of the declarations lexically stored in a
2197   /// declaration context.
2198   ///
2199   /// \param DC The declaration context whose declarations will be
2200   /// read.
2201   ///
2202   /// \param IsKindWeWant A predicate indicating which declaration kinds
2203   /// we are interested in.
2204   ///
2205   /// \param Decls Vector that will contain the declarations loaded
2206   /// from the external source. The caller is responsible for merging
2207   /// these declarations with any declarations already stored in the
2208   /// declaration context.
2209   void
2210   FindExternalLexicalDecls(const DeclContext *DC,
2211                            llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
2212                            SmallVectorImpl<Decl *> &Decls) override;
2213 
2214   /// Get the decls that are contained in a file in the Offset/Length
2215   /// range. \p Length can be 0 to indicate a point at \p Offset instead of
2216   /// a range.
2217   void FindFileRegionDecls(FileID File, unsigned Offset, unsigned Length,
2218                            SmallVectorImpl<Decl *> &Decls) override;
2219 
2220   /// Notify ASTReader that we started deserialization of
2221   /// a decl or type so until FinishedDeserializing is called there may be
2222   /// decls that are initializing. Must be paired with FinishedDeserializing.
2223   void StartedDeserializing() override;
2224 
2225   /// Notify ASTReader that we finished the deserialization of
2226   /// a decl or type. Must be paired with StartedDeserializing.
2227   void FinishedDeserializing() override;
2228 
2229   /// Function that will be invoked when we begin parsing a new
2230   /// translation unit involving this external AST source.
2231   ///
2232   /// This function will provide all of the external definitions to
2233   /// the ASTConsumer.
2234   void StartTranslationUnit(ASTConsumer *Consumer) override;
2235 
2236   /// Print some statistics about AST usage.
2237   void PrintStats() override;
2238 
2239   /// Dump information about the AST reader to standard error.
2240   void dump();
2241 
2242   /// Return the amount of memory used by memory buffers, breaking down
2243   /// by heap-backed versus mmap'ed memory.
2244   void getMemoryBufferSizes(MemoryBufferSizes &sizes) const override;
2245 
2246   /// Initialize the semantic source with the Sema instance
2247   /// being used to perform semantic analysis on the abstract syntax
2248   /// tree.
2249   void InitializeSema(Sema &S) override;
2250 
2251   /// Inform the semantic consumer that Sema is no longer available.
ForgetSema()2252   void ForgetSema() override { SemaObj = nullptr; }
2253 
2254   /// Retrieve the IdentifierInfo for the named identifier.
2255   ///
2256   /// This routine builds a new IdentifierInfo for the given identifier. If any
2257   /// declarations with this name are visible from translation unit scope, their
2258   /// declarations will be deserialized and introduced into the declaration
2259   /// chain of the identifier.
2260   IdentifierInfo *get(StringRef Name) override;
2261 
2262   /// Retrieve an iterator into the set of all identifiers
2263   /// in all loaded AST files.
2264   IdentifierIterator *getIdentifiers() override;
2265 
2266   /// Load the contents of the global method pool for a given
2267   /// selector.
2268   void ReadMethodPool(Selector Sel) override;
2269 
2270   /// Load the contents of the global method pool for a given
2271   /// selector if necessary.
2272   void updateOutOfDateSelector(Selector Sel) override;
2273 
2274   /// Load the set of namespaces that are known to the external source,
2275   /// which will be used during typo correction.
2276   void ReadKnownNamespaces(
2277                          SmallVectorImpl<NamespaceDecl *> &Namespaces) override;
2278 
2279   void ReadUndefinedButUsed(
2280       llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) override;
2281 
2282   void ReadMismatchingDeleteExpressions(llvm::MapVector<
2283       FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
2284                                             Exprs) override;
2285 
2286   void ReadTentativeDefinitions(
2287                             SmallVectorImpl<VarDecl *> &TentativeDefs) override;
2288 
2289   void ReadUnusedFileScopedDecls(
2290                        SmallVectorImpl<const DeclaratorDecl *> &Decls) override;
2291 
2292   void ReadDelegatingConstructors(
2293                          SmallVectorImpl<CXXConstructorDecl *> &Decls) override;
2294 
2295   void ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) override;
2296 
2297   void ReadUnusedLocalTypedefNameCandidates(
2298       llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) override;
2299 
2300   void ReadDeclsToCheckForDeferredDiags(
2301       llvm::SmallSetVector<Decl *, 4> &Decls) override;
2302 
2303   void ReadReferencedSelectors(
2304            SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) override;
2305 
2306   void ReadWeakUndeclaredIdentifiers(
2307       SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) override;
2308 
2309   void ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) override;
2310 
2311   void ReadPendingInstantiations(
2312                   SmallVectorImpl<std::pair<ValueDecl *,
2313                                             SourceLocation>> &Pending) override;
2314 
2315   void ReadLateParsedTemplates(
2316       llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
2317           &LPTMap) override;
2318 
2319   void AssignedLambdaNumbering(CXXRecordDecl *Lambda) override;
2320 
2321   /// Load a selector from disk, registering its ID if it exists.
2322   void LoadSelector(Selector Sel);
2323 
2324   void SetIdentifierInfo(serialization::IdentifierID ID, IdentifierInfo *II);
2325   void SetGloballyVisibleDecls(IdentifierInfo *II,
2326                                const SmallVectorImpl<GlobalDeclID> &DeclIDs,
2327                                SmallVectorImpl<Decl *> *Decls = nullptr);
2328 
2329   /// Report a diagnostic.
2330   DiagnosticBuilder Diag(unsigned DiagID) const;
2331 
2332   /// Report a diagnostic.
2333   DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) const;
2334 
2335   void runWithSufficientStackSpace(SourceLocation Loc,
2336                                    llvm::function_ref<void()> Fn);
2337 
2338   IdentifierInfo *DecodeIdentifierInfo(serialization::IdentifierID ID);
2339 
readIdentifier(ModuleFile & M,const RecordData & Record,unsigned & Idx)2340   IdentifierInfo *readIdentifier(ModuleFile &M, const RecordData &Record,
2341                                  unsigned &Idx) {
2342     return DecodeIdentifierInfo(getGlobalIdentifierID(M, Record[Idx++]));
2343   }
2344 
GetIdentifier(serialization::IdentifierID ID)2345   IdentifierInfo *GetIdentifier(serialization::IdentifierID ID) override {
2346     // Note that we are loading an identifier.
2347     Deserializing AnIdentifier(this);
2348 
2349     return DecodeIdentifierInfo(ID);
2350   }
2351 
2352   IdentifierInfo *getLocalIdentifier(ModuleFile &M, uint64_t LocalID);
2353 
2354   serialization::IdentifierID getGlobalIdentifierID(ModuleFile &M,
2355                                                     uint64_t LocalID);
2356 
2357   void resolvePendingMacro(IdentifierInfo *II, const PendingMacroInfo &PMInfo);
2358 
2359   /// Retrieve the macro with the given ID.
2360   MacroInfo *getMacro(serialization::MacroID ID);
2361 
2362   /// Retrieve the global macro ID corresponding to the given local
2363   /// ID within the given module file.
2364   serialization::MacroID getGlobalMacroID(ModuleFile &M, unsigned LocalID);
2365 
2366   /// Read the source location entry with index ID.
2367   bool ReadSLocEntry(int ID) override;
2368   /// Get the index ID for the loaded SourceLocation offset.
2369   int getSLocEntryID(SourceLocation::UIntTy SLocOffset) override;
2370   /// Try to read the offset of the SLocEntry at the given index in the given
2371   /// module file.
2372   llvm::Expected<SourceLocation::UIntTy> readSLocOffset(ModuleFile *F,
2373                                                         unsigned Index);
2374 
2375   /// Retrieve the module import location and module name for the
2376   /// given source manager entry ID.
2377   std::pair<SourceLocation, StringRef> getModuleImportLoc(int ID) override;
2378 
2379   /// Retrieve the global submodule ID given a module and its local ID
2380   /// number.
2381   serialization::SubmoduleID getGlobalSubmoduleID(ModuleFile &M,
2382                                                   unsigned LocalID) const;
2383 
2384   /// Retrieve the submodule that corresponds to a global submodule ID.
2385   ///
2386   Module *getSubmodule(serialization::SubmoduleID GlobalID);
2387 
2388   /// Retrieve the module that corresponds to the given module ID.
2389   ///
2390   /// Note: overrides method in ExternalASTSource
2391   Module *getModule(unsigned ID) override;
2392 
2393   /// Retrieve the module file with a given local ID within the specified
2394   /// ModuleFile.
2395   ModuleFile *getLocalModuleFile(ModuleFile &M, unsigned ID) const;
2396 
2397   /// Get an ID for the given module file.
2398   unsigned getModuleFileID(ModuleFile *M);
2399 
2400   /// Return a descriptor for the corresponding module.
2401   std::optional<ASTSourceDescriptor> getSourceDescriptor(unsigned ID) override;
2402 
2403   ExtKind hasExternalDefinitions(const Decl *D) override;
2404 
2405   bool wasThisDeclarationADefinition(const FunctionDecl *FD) override;
2406 
2407   /// Retrieve a selector from the given module with its local ID
2408   /// number.
2409   Selector getLocalSelector(ModuleFile &M, unsigned LocalID);
2410 
2411   Selector DecodeSelector(serialization::SelectorID Idx);
2412 
2413   Selector GetExternalSelector(serialization::SelectorID ID) override;
2414   uint32_t GetNumExternalSelectors() override;
2415 
ReadSelector(ModuleFile & M,const RecordData & Record,unsigned & Idx)2416   Selector ReadSelector(ModuleFile &M, const RecordData &Record, unsigned &Idx) {
2417     return getLocalSelector(M, Record[Idx++]);
2418   }
2419 
2420   /// Retrieve the global selector ID that corresponds to this
2421   /// the local selector ID in a given module.
2422   serialization::SelectorID getGlobalSelectorID(ModuleFile &M,
2423                                                 unsigned LocalID) const;
2424 
2425   /// Read the contents of a CXXCtorInitializer array.
2426   CXXCtorInitializer **GetExternalCXXCtorInitializers(uint64_t Offset) override;
2427 
2428   /// Read a AlignPackInfo from raw form.
ReadAlignPackInfo(uint32_t Raw)2429   Sema::AlignPackInfo ReadAlignPackInfo(uint32_t Raw) const {
2430     return Sema::AlignPackInfo::getFromRawEncoding(Raw);
2431   }
2432 
2433   using RawLocEncoding = SourceLocationEncoding::RawLocEncoding;
2434 
2435   /// Read a source location from raw form and return it in its
2436   /// originating module file's source location space.
2437   std::pair<SourceLocation, unsigned>
ReadUntranslatedSourceLocation(RawLocEncoding Raw)2438   ReadUntranslatedSourceLocation(RawLocEncoding Raw) const {
2439     return SourceLocationEncoding::decode(Raw);
2440   }
2441 
2442   /// Read a source location from raw form.
ReadSourceLocation(ModuleFile & MF,RawLocEncoding Raw)2443   SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw) const {
2444     if (!MF.ModuleOffsetMap.empty())
2445       ReadModuleOffsetMap(MF);
2446 
2447     auto [Loc, ModuleFileIndex] = ReadUntranslatedSourceLocation(Raw);
2448     ModuleFile *OwningModuleFile =
2449         ModuleFileIndex == 0 ? &MF : MF.TransitiveImports[ModuleFileIndex - 1];
2450 
2451     assert(!SourceMgr.isLoadedSourceLocation(Loc) &&
2452            "Run out source location space");
2453 
2454     return TranslateSourceLocation(*OwningModuleFile, Loc);
2455   }
2456 
2457   /// Translate a source location from another module file's source
2458   /// location space into ours.
TranslateSourceLocation(ModuleFile & ModuleFile,SourceLocation Loc)2459   SourceLocation TranslateSourceLocation(ModuleFile &ModuleFile,
2460                                          SourceLocation Loc) const {
2461     if (Loc.isInvalid())
2462       return Loc;
2463 
2464     // FIXME: TranslateSourceLocation is not re-enterable. It is problematic
2465     // to call TranslateSourceLocation on a translated source location.
2466     // We either need a method to know whether or not a source location is
2467     // translated or refactor the code to make it clear that
2468     // TranslateSourceLocation won't be called with translated source location.
2469 
2470     return Loc.getLocWithOffset(ModuleFile.SLocEntryBaseOffset - 2);
2471   }
2472 
2473   /// Read a source location.
ReadSourceLocation(ModuleFile & ModuleFile,const RecordDataImpl & Record,unsigned & Idx)2474   SourceLocation ReadSourceLocation(ModuleFile &ModuleFile,
2475                                     const RecordDataImpl &Record,
2476                                     unsigned &Idx) {
2477     return ReadSourceLocation(ModuleFile, Record[Idx++]);
2478   }
2479 
2480   /// Read a FileID.
ReadFileID(ModuleFile & F,const RecordDataImpl & Record,unsigned & Idx)2481   FileID ReadFileID(ModuleFile &F, const RecordDataImpl &Record,
2482                     unsigned &Idx) const {
2483     return TranslateFileID(F, FileID::get(Record[Idx++]));
2484   }
2485 
2486   /// Translate a FileID from another module file's FileID space into ours.
TranslateFileID(ModuleFile & F,FileID FID)2487   FileID TranslateFileID(ModuleFile &F, FileID FID) const {
2488     assert(FID.ID >= 0 && "Reading non-local FileID.");
2489     if (FID.isInvalid())
2490       return FID;
2491     return FileID::get(F.SLocEntryBaseID + FID.ID - 1);
2492   }
2493 
2494   /// Read a source range.
2495   SourceRange ReadSourceRange(ModuleFile &F, const RecordData &Record,
2496                               unsigned &Idx);
2497 
2498   static llvm::BitVector ReadBitVector(const RecordData &Record,
2499                                        const StringRef Blob);
2500 
2501   // Read a string
2502   static std::string ReadString(const RecordDataImpl &Record, unsigned &Idx);
2503   static StringRef ReadStringBlob(const RecordDataImpl &Record, unsigned &Idx,
2504                                   StringRef &Blob);
2505 
2506   // Read a path
2507   std::string ReadPath(ModuleFile &F, const RecordData &Record, unsigned &Idx);
2508 
2509   // Read a path
2510   std::string ReadPath(StringRef BaseDirectory, const RecordData &Record,
2511                        unsigned &Idx);
2512   std::string ReadPathBlob(StringRef BaseDirectory, const RecordData &Record,
2513                            unsigned &Idx, StringRef &Blob);
2514 
2515   /// Read a version tuple.
2516   static VersionTuple ReadVersionTuple(const RecordData &Record, unsigned &Idx);
2517 
2518   CXXTemporary *ReadCXXTemporary(ModuleFile &F, const RecordData &Record,
2519                                  unsigned &Idx);
2520 
2521   /// Reads a statement.
2522   Stmt *ReadStmt(ModuleFile &F);
2523 
2524   /// Reads an expression.
2525   Expr *ReadExpr(ModuleFile &F);
2526 
2527   /// Reads a sub-statement operand during statement reading.
ReadSubStmt()2528   Stmt *ReadSubStmt() {
2529     assert(ReadingKind == Read_Stmt &&
2530            "Should be called only during statement reading!");
2531     // Subexpressions are stored from last to first, so the next Stmt we need
2532     // is at the back of the stack.
2533     assert(!StmtStack.empty() && "Read too many sub-statements!");
2534     return StmtStack.pop_back_val();
2535   }
2536 
2537   /// Reads a sub-expression operand during statement reading.
2538   Expr *ReadSubExpr();
2539 
2540   /// Reads a token out of a record.
2541   Token ReadToken(ModuleFile &M, const RecordDataImpl &Record, unsigned &Idx);
2542 
2543   /// Reads the macro record located at the given offset.
2544   MacroInfo *ReadMacroRecord(ModuleFile &F, uint64_t Offset);
2545 
2546   /// Determine the global preprocessed entity ID that corresponds to
2547   /// the given local ID within the given module.
2548   serialization::PreprocessedEntityID
2549   getGlobalPreprocessedEntityID(ModuleFile &M, unsigned LocalID) const;
2550 
2551   /// Add a macro to deserialize its macro directive history.
2552   ///
2553   /// \param II The name of the macro.
2554   /// \param M The module file.
2555   /// \param MacroDirectivesOffset Offset of the serialized macro directive
2556   /// history.
2557   void addPendingMacro(IdentifierInfo *II, ModuleFile *M,
2558                        uint32_t MacroDirectivesOffset);
2559 
2560   /// Read the set of macros defined by this external macro source.
2561   void ReadDefinedMacros() override;
2562 
2563   /// Update an out-of-date identifier.
2564   void updateOutOfDateIdentifier(const IdentifierInfo &II) override;
2565 
2566   /// Note that this identifier is up-to-date.
2567   void markIdentifierUpToDate(const IdentifierInfo *II);
2568 
2569   /// Load all external visible decls in the given DeclContext.
2570   void completeVisibleDeclsMap(const DeclContext *DC) override;
2571 
2572   /// Retrieve the AST context that this AST reader supplements.
getContext()2573   ASTContext &getContext() {
2574     assert(ContextObj && "requested AST context when not loading AST");
2575     return *ContextObj;
2576   }
2577 
2578   // Contains the IDs for declarations that were requested before we have
2579   // access to a Sema object.
2580   SmallVector<GlobalDeclID, 16> PreloadedDeclIDs;
2581 
2582   /// Retrieve the semantic analysis object used to analyze the
2583   /// translation unit in which the precompiled header is being
2584   /// imported.
getSema()2585   Sema *getSema() { return SemaObj; }
2586 
2587   /// Get the identifier resolver used for name lookup / updates
2588   /// in the translation unit scope. We have one of these even if we don't
2589   /// have a Sema object.
2590   IdentifierResolver &getIdResolver();
2591 
2592   /// Retrieve the identifier table associated with the
2593   /// preprocessor.
2594   IdentifierTable &getIdentifierTable();
2595 
2596   /// Record that the given ID maps to the given switch-case
2597   /// statement.
2598   void RecordSwitchCaseID(SwitchCase *SC, unsigned ID);
2599 
2600   /// Retrieve the switch-case statement with the given ID.
2601   SwitchCase *getSwitchCaseWithID(unsigned ID);
2602 
2603   void ClearSwitchCaseIDs();
2604 
2605   /// Cursors for comments blocks.
2606   SmallVector<std::pair<llvm::BitstreamCursor,
2607                         serialization::ModuleFile *>, 8> CommentsCursors;
2608 
2609   /// Loads comments ranges.
2610   void ReadComments() override;
2611 
2612   /// Visit all the input file infos of the given module file.
2613   void visitInputFileInfos(
2614       serialization::ModuleFile &MF, bool IncludeSystem,
2615       llvm::function_ref<void(const serialization::InputFileInfo &IFI,
2616                               bool IsSystem)>
2617           Visitor);
2618 
2619   /// Visit all the input files of the given module file.
2620   void visitInputFiles(serialization::ModuleFile &MF,
2621                        bool IncludeSystem, bool Complain,
2622           llvm::function_ref<void(const serialization::InputFile &IF,
2623                                   bool isSystem)> Visitor);
2624 
2625   /// Visit all the top-level module maps loaded when building the given module
2626   /// file.
2627   void visitTopLevelModuleMaps(serialization::ModuleFile &MF,
2628                                llvm::function_ref<void(FileEntryRef)> Visitor);
2629 
isProcessingUpdateRecords()2630   bool isProcessingUpdateRecords() { return ProcessingUpdateRecords; }
2631 };
2632 
2633 /// A simple helper class to unpack an integer to bits and consuming
2634 /// the bits in order.
2635 class BitsUnpacker {
2636   constexpr static uint32_t BitsIndexUpbound = 32;
2637 
2638 public:
BitsUnpacker(uint32_t V)2639   BitsUnpacker(uint32_t V) { updateValue(V); }
2640   BitsUnpacker(const BitsUnpacker &) = delete;
2641   BitsUnpacker(BitsUnpacker &&) = delete;
2642   BitsUnpacker operator=(const BitsUnpacker &) = delete;
2643   BitsUnpacker operator=(BitsUnpacker &&) = delete;
2644   ~BitsUnpacker() = default;
2645 
updateValue(uint32_t V)2646   void updateValue(uint32_t V) {
2647     Value = V;
2648     CurrentBitsIndex = 0;
2649   }
2650 
advance(uint32_t BitsWidth)2651   void advance(uint32_t BitsWidth) { CurrentBitsIndex += BitsWidth; }
2652 
getNextBit()2653   bool getNextBit() {
2654     assert(isValid());
2655     return Value & (1 << CurrentBitsIndex++);
2656   }
2657 
getNextBits(uint32_t Width)2658   uint32_t getNextBits(uint32_t Width) {
2659     assert(isValid());
2660     assert(Width < BitsIndexUpbound);
2661     uint32_t Ret = (Value >> CurrentBitsIndex) & ((1 << Width) - 1);
2662     CurrentBitsIndex += Width;
2663     return Ret;
2664   }
2665 
canGetNextNBits(uint32_t Width)2666   bool canGetNextNBits(uint32_t Width) const {
2667     return CurrentBitsIndex + Width < BitsIndexUpbound;
2668   }
2669 
2670 private:
isValid()2671   bool isValid() const { return CurrentBitsIndex < BitsIndexUpbound; }
2672 
2673   uint32_t Value;
2674   uint32_t CurrentBitsIndex = ~0;
2675 };
2676 
shouldSkipCheckingODR(const Decl * D)2677 inline bool shouldSkipCheckingODR(const Decl *D) {
2678   return D->getASTContext().getLangOpts().SkipODRCheckInGMF &&
2679          (D->isFromGlobalModule() || D->isFromHeaderUnit());
2680 }
2681 
2682 /// Calculate a hash value for the primary module name of the given module.
2683 /// \returns std::nullopt if M is not a C++ standard module.
2684 UnsignedOrNone getPrimaryModuleHash(const Module *M);
2685 
2686 } // namespace clang
2687 
2688 #endif // LLVM_CLANG_SERIALIZATION_ASTREADER_H
2689