Home | History | Annotate | Download | only in Serialization
      1 //===--- ASTWriter.h - AST File Writer --------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 //  This file defines the ASTWriter class, which writes an AST file
     11 //  containing a serialized representation of a translation unit.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 #ifndef LLVM_CLANG_SERIALIZATION_ASTWRITER_H
     15 #define LLVM_CLANG_SERIALIZATION_ASTWRITER_H
     16 
     17 #include "clang/AST/ASTMutationListener.h"
     18 #include "clang/AST/Decl.h"
     19 #include "clang/AST/DeclarationName.h"
     20 #include "clang/Frontend/PCHContainerOperations.h"
     21 #include "clang/AST/TemplateBase.h"
     22 #include "clang/Sema/SemaConsumer.h"
     23 #include "clang/Serialization/ASTBitCodes.h"
     24 #include "clang/Serialization/ASTDeserializationListener.h"
     25 #include "llvm/ADT/DenseMap.h"
     26 #include "llvm/ADT/DenseSet.h"
     27 #include "llvm/ADT/MapVector.h"
     28 #include "llvm/ADT/SetVector.h"
     29 #include "llvm/ADT/SmallPtrSet.h"
     30 #include "llvm/ADT/SmallVector.h"
     31 #include "llvm/Bitcode/BitstreamWriter.h"
     32 #include <map>
     33 #include <queue>
     34 #include <vector>
     35 
     36 namespace llvm {
     37   class APFloat;
     38   class APInt;
     39   class BitstreamWriter;
     40 }
     41 
     42 namespace clang {
     43 
     44 class ASTContext;
     45 class Attr;
     46 class NestedNameSpecifier;
     47 class CXXBaseSpecifier;
     48 class CXXCtorInitializer;
     49 class FileEntry;
     50 class FPOptions;
     51 class HeaderSearch;
     52 class HeaderSearchOptions;
     53 class IdentifierResolver;
     54 class MacroDefinitionRecord;
     55 class MacroDirective;
     56 class MacroInfo;
     57 class OpaqueValueExpr;
     58 class OpenCLOptions;
     59 class ASTReader;
     60 class Module;
     61 class ModuleFileExtension;
     62 class ModuleFileExtensionWriter;
     63 class PreprocessedEntity;
     64 class PreprocessingRecord;
     65 class Preprocessor;
     66 class RecordDecl;
     67 class Sema;
     68 class SourceManager;
     69 struct StoredDeclsList;
     70 class SwitchCase;
     71 class TargetInfo;
     72 class Token;
     73 class VersionTuple;
     74 class ASTUnresolvedSet;
     75 
     76 namespace SrcMgr { class SLocEntry; }
     77 
     78 /// \brief Writes an AST file containing the contents of a translation unit.
     79 ///
     80 /// The ASTWriter class produces a bitstream containing the serialized
     81 /// representation of a given abstract syntax tree and its supporting
     82 /// data structures. This bitstream can be de-serialized via an
     83 /// instance of the ASTReader class.
     84 class ASTWriter : public ASTDeserializationListener,
     85                   public ASTMutationListener {
     86 public:
     87   typedef SmallVector<uint64_t, 64> RecordData;
     88   typedef SmallVectorImpl<uint64_t> RecordDataImpl;
     89   typedef ArrayRef<uint64_t> RecordDataRef;
     90 
     91   friend class ASTDeclWriter;
     92   friend class ASTStmtWriter;
     93 private:
     94   /// \brief Map that provides the ID numbers of each type within the
     95   /// output stream, plus those deserialized from a chained PCH.
     96   ///
     97   /// The ID numbers of types are consecutive (in order of discovery)
     98   /// and start at 1. 0 is reserved for NULL. When types are actually
     99   /// stored in the stream, the ID number is shifted by 2 bits to
    100   /// allow for the const/volatile qualifiers.
    101   ///
    102   /// Keys in the map never have const/volatile qualifiers.
    103   typedef llvm::DenseMap<QualType, serialization::TypeIdx,
    104                          serialization::UnsafeQualTypeDenseMapInfo>
    105     TypeIdxMap;
    106 
    107   /// \brief The bitstream writer used to emit this precompiled header.
    108   llvm::BitstreamWriter &Stream;
    109 
    110   /// \brief The ASTContext we're writing.
    111   ASTContext *Context;
    112 
    113   /// \brief The preprocessor we're writing.
    114   Preprocessor *PP;
    115 
    116   /// \brief The reader of existing AST files, if we're chaining.
    117   ASTReader *Chain;
    118 
    119   /// \brief The module we're currently writing, if any.
    120   Module *WritingModule;
    121 
    122   /// \brief The base directory for any relative paths we emit.
    123   std::string BaseDirectory;
    124 
    125   /// \brief Indicates whether timestamps should be written to the produced
    126   /// module file. This is the case for files implicitly written to the
    127   /// module cache, where we need the timestamps to determine if the module
    128   /// file is up to date, but not otherwise.
    129   bool IncludeTimestamps;
    130 
    131   /// \brief Indicates when the AST writing is actively performing
    132   /// serialization, rather than just queueing updates.
    133   bool WritingAST;
    134 
    135   /// \brief Indicates that we are done serializing the collection of decls
    136   /// and types to emit.
    137   bool DoneWritingDeclsAndTypes;
    138 
    139   /// \brief Indicates that the AST contained compiler errors.
    140   bool ASTHasCompilerErrors;
    141 
    142   /// \brief Mapping from input file entries to the index into the
    143   /// offset table where information about that input file is stored.
    144   llvm::DenseMap<const FileEntry *, uint32_t> InputFileIDs;
    145 
    146   /// \brief Stores a declaration or a type to be written to the AST file.
    147   class DeclOrType {
    148   public:
    149     DeclOrType(Decl *D) : Stored(D), IsType(false) { }
    150     DeclOrType(QualType T) : Stored(T.getAsOpaquePtr()), IsType(true) { }
    151 
    152     bool isType() const { return IsType; }
    153     bool isDecl() const { return !IsType; }
    154 
    155     QualType getType() const {
    156       assert(isType() && "Not a type!");
    157       return QualType::getFromOpaquePtr(Stored);
    158     }
    159 
    160     Decl *getDecl() const {
    161       assert(isDecl() && "Not a decl!");
    162       return static_cast<Decl *>(Stored);
    163     }
    164 
    165   private:
    166     void *Stored;
    167     bool IsType;
    168   };
    169 
    170   /// \brief The declarations and types to emit.
    171   std::queue<DeclOrType> DeclTypesToEmit;
    172 
    173   /// \brief The first ID number we can use for our own declarations.
    174   serialization::DeclID FirstDeclID;
    175 
    176   /// \brief The decl ID that will be assigned to the next new decl.
    177   serialization::DeclID NextDeclID;
    178 
    179   /// \brief Map that provides the ID numbers of each declaration within
    180   /// the output stream, as well as those deserialized from a chained PCH.
    181   ///
    182   /// The ID numbers of declarations are consecutive (in order of
    183   /// discovery) and start at 2. 1 is reserved for the translation
    184   /// unit, while 0 is reserved for NULL.
    185   llvm::DenseMap<const Decl *, serialization::DeclID> DeclIDs;
    186 
    187   /// \brief Offset of each declaration in the bitstream, indexed by
    188   /// the declaration's ID.
    189   std::vector<serialization::DeclOffset> DeclOffsets;
    190 
    191   /// \brief Sorted (by file offset) vector of pairs of file offset/DeclID.
    192   typedef SmallVector<std::pair<unsigned, serialization::DeclID>, 64>
    193     LocDeclIDsTy;
    194   struct DeclIDInFileInfo {
    195     LocDeclIDsTy DeclIDs;
    196     /// \brief Set when the DeclIDs vectors from all files are joined, this
    197     /// indicates the index that this particular vector has in the global one.
    198     unsigned FirstDeclIndex;
    199   };
    200   typedef llvm::DenseMap<FileID, DeclIDInFileInfo *> FileDeclIDsTy;
    201 
    202   /// \brief Map from file SLocEntries to info about the file-level declarations
    203   /// that it contains.
    204   FileDeclIDsTy FileDeclIDs;
    205 
    206   void associateDeclWithFile(const Decl *D, serialization::DeclID);
    207 
    208   /// \brief The first ID number we can use for our own types.
    209   serialization::TypeID FirstTypeID;
    210 
    211   /// \brief The type ID that will be assigned to the next new type.
    212   serialization::TypeID NextTypeID;
    213 
    214   /// \brief Map that provides the ID numbers of each type within the
    215   /// output stream, plus those deserialized from a chained PCH.
    216   ///
    217   /// The ID numbers of types are consecutive (in order of discovery)
    218   /// and start at 1. 0 is reserved for NULL. When types are actually
    219   /// stored in the stream, the ID number is shifted by 2 bits to
    220   /// allow for the const/volatile qualifiers.
    221   ///
    222   /// Keys in the map never have const/volatile qualifiers.
    223   TypeIdxMap TypeIdxs;
    224 
    225   /// \brief Offset of each type in the bitstream, indexed by
    226   /// the type's ID.
    227   std::vector<uint32_t> TypeOffsets;
    228 
    229   /// \brief The first ID number we can use for our own identifiers.
    230   serialization::IdentID FirstIdentID;
    231 
    232   /// \brief The identifier ID that will be assigned to the next new identifier.
    233   serialization::IdentID NextIdentID;
    234 
    235   /// \brief Map that provides the ID numbers of each identifier in
    236   /// the output stream.
    237   ///
    238   /// The ID numbers for identifiers are consecutive (in order of
    239   /// discovery), starting at 1. An ID of zero refers to a NULL
    240   /// IdentifierInfo.
    241   llvm::MapVector<const IdentifierInfo *, serialization::IdentID> IdentifierIDs;
    242 
    243   /// \brief The first ID number we can use for our own macros.
    244   serialization::MacroID FirstMacroID;
    245 
    246   /// \brief The identifier ID that will be assigned to the next new identifier.
    247   serialization::MacroID NextMacroID;
    248 
    249   /// \brief Map that provides the ID numbers of each macro.
    250   llvm::DenseMap<MacroInfo *, serialization::MacroID> MacroIDs;
    251 
    252   struct MacroInfoToEmitData {
    253     const IdentifierInfo *Name;
    254     MacroInfo *MI;
    255     serialization::MacroID ID;
    256   };
    257   /// \brief The macro infos to emit.
    258   std::vector<MacroInfoToEmitData> MacroInfosToEmit;
    259 
    260   llvm::DenseMap<const IdentifierInfo *, uint64_t> IdentMacroDirectivesOffsetMap;
    261 
    262   /// @name FlushStmt Caches
    263   /// @{
    264 
    265   /// \brief Set of parent Stmts for the currently serializing sub-stmt.
    266   llvm::DenseSet<Stmt *> ParentStmts;
    267 
    268   /// \brief Offsets of sub-stmts already serialized. The offset points
    269   /// just after the stmt record.
    270   llvm::DenseMap<Stmt *, uint64_t> SubStmtEntries;
    271 
    272   /// @}
    273 
    274   /// \brief Offsets of each of the identifier IDs into the identifier
    275   /// table.
    276   std::vector<uint32_t> IdentifierOffsets;
    277 
    278   /// \brief The first ID number we can use for our own submodules.
    279   serialization::SubmoduleID FirstSubmoduleID;
    280 
    281   /// \brief The submodule ID that will be assigned to the next new submodule.
    282   serialization::SubmoduleID NextSubmoduleID;
    283 
    284   /// \brief The first ID number we can use for our own selectors.
    285   serialization::SelectorID FirstSelectorID;
    286 
    287   /// \brief The selector ID that will be assigned to the next new selector.
    288   serialization::SelectorID NextSelectorID;
    289 
    290   /// \brief Map that provides the ID numbers of each Selector.
    291   llvm::MapVector<Selector, serialization::SelectorID> SelectorIDs;
    292 
    293   /// \brief Offset of each selector within the method pool/selector
    294   /// table, indexed by the Selector ID (-1).
    295   std::vector<uint32_t> SelectorOffsets;
    296 
    297   /// \brief Mapping from macro definitions (as they occur in the preprocessing
    298   /// record) to the macro IDs.
    299   llvm::DenseMap<const MacroDefinitionRecord *,
    300                  serialization::PreprocessedEntityID> MacroDefinitions;
    301 
    302   /// \brief Cache of indices of anonymous declarations within their lexical
    303   /// contexts.
    304   llvm::DenseMap<const Decl *, unsigned> AnonymousDeclarationNumbers;
    305 
    306   /// An update to a Decl.
    307   class DeclUpdate {
    308     /// A DeclUpdateKind.
    309     unsigned Kind;
    310     union {
    311       const Decl *Dcl;
    312       void *Type;
    313       unsigned Loc;
    314       unsigned Val;
    315       Module *Mod;
    316       const Attr *Attribute;
    317     };
    318 
    319   public:
    320     DeclUpdate(unsigned Kind) : Kind(Kind), Dcl(nullptr) {}
    321     DeclUpdate(unsigned Kind, const Decl *Dcl) : Kind(Kind), Dcl(Dcl) {}
    322     DeclUpdate(unsigned Kind, QualType Type)
    323         : Kind(Kind), Type(Type.getAsOpaquePtr()) {}
    324     DeclUpdate(unsigned Kind, SourceLocation Loc)
    325         : Kind(Kind), Loc(Loc.getRawEncoding()) {}
    326     DeclUpdate(unsigned Kind, unsigned Val)
    327         : Kind(Kind), Val(Val) {}
    328     DeclUpdate(unsigned Kind, Module *M)
    329           : Kind(Kind), Mod(M) {}
    330     DeclUpdate(unsigned Kind, const Attr *Attribute)
    331           : Kind(Kind), Attribute(Attribute) {}
    332 
    333     unsigned getKind() const { return Kind; }
    334     const Decl *getDecl() const { return Dcl; }
    335     QualType getType() const { return QualType::getFromOpaquePtr(Type); }
    336     SourceLocation getLoc() const {
    337       return SourceLocation::getFromRawEncoding(Loc);
    338     }
    339     unsigned getNumber() const { return Val; }
    340     Module *getModule() const { return Mod; }
    341     const Attr *getAttr() const { return Attribute; }
    342   };
    343 
    344   typedef SmallVector<DeclUpdate, 1> UpdateRecord;
    345   typedef llvm::MapVector<const Decl *, UpdateRecord> DeclUpdateMap;
    346   /// \brief Mapping from declarations that came from a chained PCH to the
    347   /// record containing modifications to them.
    348   DeclUpdateMap DeclUpdates;
    349 
    350   typedef llvm::DenseMap<Decl *, Decl *> FirstLatestDeclMap;
    351   /// \brief Map of first declarations from a chained PCH that point to the
    352   /// most recent declarations in another PCH.
    353   FirstLatestDeclMap FirstLatestDecls;
    354 
    355   /// \brief Declarations encountered that might be external
    356   /// definitions.
    357   ///
    358   /// We keep track of external definitions and other 'interesting' declarations
    359   /// as we are emitting declarations to the AST file. The AST file contains a
    360   /// separate record for these declarations, which are provided to the AST
    361   /// consumer by the AST reader. This is behavior is required to properly cope with,
    362   /// e.g., tentative variable definitions that occur within
    363   /// headers. The declarations themselves are stored as declaration
    364   /// IDs, since they will be written out to an EAGERLY_DESERIALIZED_DECLS
    365   /// record.
    366   SmallVector<uint64_t, 16> EagerlyDeserializedDecls;
    367 
    368   /// \brief DeclContexts that have received extensions since their serialized
    369   /// form.
    370   ///
    371   /// For namespaces, when we're chaining and encountering a namespace, we check
    372   /// if its primary namespace comes from the chain. If it does, we add the
    373   /// primary to this set, so that we can write out lexical content updates for
    374   /// it.
    375   llvm::SmallSetVector<const DeclContext *, 16> UpdatedDeclContexts;
    376 
    377   /// \brief Keeps track of visible decls that were added in DeclContexts
    378   /// coming from another AST file.
    379   SmallVector<const Decl *, 16> UpdatingVisibleDecls;
    380 
    381   /// \brief The set of Objective-C class that have categories we
    382   /// should serialize.
    383   llvm::SetVector<ObjCInterfaceDecl *> ObjCClassesWithCategories;
    384 
    385   struct ReplacedDeclInfo {
    386     serialization::DeclID ID;
    387     uint64_t Offset;
    388     unsigned Loc;
    389 
    390     ReplacedDeclInfo() : ID(0), Offset(0), Loc(0) {}
    391     ReplacedDeclInfo(serialization::DeclID ID, uint64_t Offset,
    392                      SourceLocation Loc)
    393       : ID(ID), Offset(Offset), Loc(Loc.getRawEncoding()) {}
    394   };
    395 
    396   /// \brief Decls that have been replaced in the current dependent AST file.
    397   ///
    398   /// When a decl changes fundamentally after being deserialized (this shouldn't
    399   /// happen, but the ObjC AST nodes are designed this way), it will be
    400   /// serialized again. In this case, it is registered here, so that the reader
    401   /// knows to read the updated version.
    402   SmallVector<ReplacedDeclInfo, 16> ReplacedDecls;
    403 
    404   /// \brief The set of declarations that may have redeclaration chains that
    405   /// need to be serialized.
    406   llvm::SmallVector<const Decl *, 16> Redeclarations;
    407 
    408   /// \brief A cache of the first local declaration for "interesting"
    409   /// redeclaration chains.
    410   llvm::DenseMap<const Decl *, const Decl *> FirstLocalDeclCache;
    411 
    412   /// \brief Statements that we've encountered while serializing a
    413   /// declaration or type.
    414   SmallVector<Stmt *, 16> StmtsToEmit;
    415 
    416   /// \brief Statements collection to use for ASTWriter::AddStmt().
    417   /// It will point to StmtsToEmit unless it is overriden.
    418   SmallVector<Stmt *, 16> *CollectedStmts;
    419 
    420   /// \brief Mapping from SwitchCase statements to IDs.
    421   llvm::DenseMap<SwitchCase *, unsigned> SwitchCaseIDs;
    422 
    423   /// \brief The number of statements written to the AST file.
    424   unsigned NumStatements;
    425 
    426   /// \brief The number of macros written to the AST file.
    427   unsigned NumMacros;
    428 
    429   /// \brief The number of lexical declcontexts written to the AST
    430   /// file.
    431   unsigned NumLexicalDeclContexts;
    432 
    433   /// \brief The number of visible declcontexts written to the AST
    434   /// file.
    435   unsigned NumVisibleDeclContexts;
    436 
    437   /// \brief The offset of each CXXBaseSpecifier set within the AST.
    438   SmallVector<uint32_t, 16> CXXBaseSpecifiersOffsets;
    439 
    440   /// \brief The first ID number we can use for our own base specifiers.
    441   serialization::CXXBaseSpecifiersID FirstCXXBaseSpecifiersID;
    442 
    443   /// \brief The base specifiers ID that will be assigned to the next new
    444   /// set of C++ base specifiers.
    445   serialization::CXXBaseSpecifiersID NextCXXBaseSpecifiersID;
    446 
    447   /// \brief A set of C++ base specifiers that is queued to be written into the
    448   /// AST file.
    449   struct QueuedCXXBaseSpecifiers {
    450     QueuedCXXBaseSpecifiers() : ID(), Bases(), BasesEnd() { }
    451 
    452     QueuedCXXBaseSpecifiers(serialization::CXXBaseSpecifiersID ID,
    453                             CXXBaseSpecifier const *Bases,
    454                             CXXBaseSpecifier const *BasesEnd)
    455       : ID(ID), Bases(Bases), BasesEnd(BasesEnd) { }
    456 
    457     serialization::CXXBaseSpecifiersID ID;
    458     CXXBaseSpecifier const * Bases;
    459     CXXBaseSpecifier const * BasesEnd;
    460   };
    461 
    462   /// \brief Queue of C++ base specifiers to be written to the AST file,
    463   /// in the order they should be written.
    464   SmallVector<QueuedCXXBaseSpecifiers, 2> CXXBaseSpecifiersToWrite;
    465 
    466   /// \brief The offset of each CXXCtorInitializer list within the AST.
    467   SmallVector<uint32_t, 16> CXXCtorInitializersOffsets;
    468 
    469   /// \brief The first ID number we can use for our own ctor initializers.
    470   serialization::CXXCtorInitializersID FirstCXXCtorInitializersID;
    471 
    472   /// \brief The ctor initializers ID that will be assigned to the next new
    473   /// list of C++ ctor initializers.
    474   serialization::CXXCtorInitializersID NextCXXCtorInitializersID;
    475 
    476   /// \brief A set of C++ ctor initializers that is queued to be written
    477   /// into the AST file.
    478   struct QueuedCXXCtorInitializers {
    479     QueuedCXXCtorInitializers() : ID() {}
    480 
    481     QueuedCXXCtorInitializers(serialization::CXXCtorInitializersID ID,
    482                               ArrayRef<CXXCtorInitializer*> Inits)
    483         : ID(ID), Inits(Inits) {}
    484 
    485     serialization::CXXCtorInitializersID ID;
    486     ArrayRef<CXXCtorInitializer*> Inits;
    487   };
    488 
    489   /// \brief Queue of C++ ctor initializers to be written to the AST file,
    490   /// in the order they should be written.
    491   SmallVector<QueuedCXXCtorInitializers, 2> CXXCtorInitializersToWrite;
    492 
    493   /// \brief A mapping from each known submodule to its ID number, which will
    494   /// be a positive integer.
    495   llvm::DenseMap<Module *, unsigned> SubmoduleIDs;
    496 
    497   /// \brief A list of the module file extension writers.
    498   std::vector<std::unique_ptr<ModuleFileExtensionWriter>>
    499     ModuleFileExtensionWriters;
    500 
    501   /// \brief Retrieve or create a submodule ID for this module.
    502   unsigned getSubmoduleID(Module *Mod);
    503 
    504   /// \brief Write the given subexpression to the bitstream.
    505   void WriteSubStmt(Stmt *S,
    506                     llvm::DenseMap<Stmt *, uint64_t> &SubStmtEntries,
    507                     llvm::DenseSet<Stmt *> &ParentStmts);
    508 
    509   void WriteBlockInfoBlock();
    510   uint64_t WriteControlBlock(Preprocessor &PP, ASTContext &Context,
    511                              StringRef isysroot, const std::string &OutputFile);
    512   void WriteInputFiles(SourceManager &SourceMgr, HeaderSearchOptions &HSOpts,
    513                        bool Modules);
    514   void WriteSourceManagerBlock(SourceManager &SourceMgr,
    515                                const Preprocessor &PP);
    516   void WritePreprocessor(const Preprocessor &PP, bool IsModule);
    517   void WriteHeaderSearch(const HeaderSearch &HS);
    518   void WritePreprocessorDetail(PreprocessingRecord &PPRec);
    519   void WriteSubmodules(Module *WritingModule);
    520 
    521   void WritePragmaDiagnosticMappings(const DiagnosticsEngine &Diag,
    522                                      bool isModule);
    523   void WriteCXXBaseSpecifiersOffsets();
    524   void WriteCXXCtorInitializersOffsets();
    525 
    526   unsigned TypeExtQualAbbrev;
    527   unsigned TypeFunctionProtoAbbrev;
    528   void WriteTypeAbbrevs();
    529   void WriteType(QualType T);
    530 
    531   bool isLookupResultExternal(StoredDeclsList &Result, DeclContext *DC);
    532   bool isLookupResultEntirelyExternal(StoredDeclsList &Result, DeclContext *DC);
    533 
    534   void GenerateNameLookupTable(const DeclContext *DC,
    535                                llvm::SmallVectorImpl<char> &LookupTable);
    536   uint64_t WriteDeclContextLexicalBlock(ASTContext &Context, DeclContext *DC);
    537   uint64_t WriteDeclContextVisibleBlock(ASTContext &Context, DeclContext *DC);
    538   void WriteTypeDeclOffsets();
    539   void WriteFileDeclIDsMap();
    540   void WriteComments();
    541   void WriteSelectors(Sema &SemaRef);
    542   void WriteReferencedSelectorsPool(Sema &SemaRef);
    543   void WriteIdentifierTable(Preprocessor &PP, IdentifierResolver &IdResolver,
    544                             bool IsModule);
    545   void WriteAttributes(ArrayRef<const Attr*> Attrs, RecordDataImpl &Record);
    546   void WriteDeclUpdatesBlocks(RecordDataImpl &OffsetsRecord);
    547   void WriteDeclReplacementsBlock();
    548   void WriteDeclContextVisibleUpdate(const DeclContext *DC);
    549   void WriteFPPragmaOptions(const FPOptions &Opts);
    550   void WriteOpenCLExtensions(Sema &SemaRef);
    551   void WriteObjCCategories();
    552   void WriteLateParsedTemplates(Sema &SemaRef);
    553   void WriteOptimizePragmaOptions(Sema &SemaRef);
    554   void WriteModuleFileExtension(Sema &SemaRef,
    555                                 ModuleFileExtensionWriter &Writer);
    556 
    557   unsigned DeclParmVarAbbrev;
    558   unsigned DeclContextLexicalAbbrev;
    559   unsigned DeclContextVisibleLookupAbbrev;
    560   unsigned UpdateVisibleAbbrev;
    561   unsigned DeclRecordAbbrev;
    562   unsigned DeclTypedefAbbrev;
    563   unsigned DeclVarAbbrev;
    564   unsigned DeclFieldAbbrev;
    565   unsigned DeclEnumAbbrev;
    566   unsigned DeclObjCIvarAbbrev;
    567   unsigned DeclCXXMethodAbbrev;
    568 
    569   unsigned DeclRefExprAbbrev;
    570   unsigned CharacterLiteralAbbrev;
    571   unsigned IntegerLiteralAbbrev;
    572   unsigned ExprImplicitCastAbbrev;
    573 
    574   void WriteDeclAbbrevs();
    575   void WriteDecl(ASTContext &Context, Decl *D);
    576   void AddFunctionDefinition(const FunctionDecl *FD, RecordData &Record);
    577 
    578   uint64_t WriteASTCore(Sema &SemaRef,
    579                         StringRef isysroot, const std::string &OutputFile,
    580                         Module *WritingModule);
    581 
    582 public:
    583   /// \brief Create a new precompiled header writer that outputs to
    584   /// the given bitstream.
    585   ASTWriter(llvm::BitstreamWriter &Stream,
    586             ArrayRef<llvm::IntrusiveRefCntPtr<ModuleFileExtension>> Extensions,
    587             bool IncludeTimestamps = true);
    588   ~ASTWriter() override;
    589 
    590   const LangOptions &getLangOpts() const;
    591 
    592   /// \brief Get a timestamp for output into the AST file. The actual timestamp
    593   /// of the specified file may be ignored if we have been instructed to not
    594   /// include timestamps in the output file.
    595   time_t getTimestampForOutput(const FileEntry *E) const;
    596 
    597   /// \brief Write a precompiled header for the given semantic analysis.
    598   ///
    599   /// \param SemaRef a reference to the semantic analysis object that processed
    600   /// the AST to be written into the precompiled header.
    601   ///
    602   /// \param WritingModule The module that we are writing. If null, we are
    603   /// writing a precompiled header.
    604   ///
    605   /// \param isysroot if non-empty, write a relocatable file whose headers
    606   /// are relative to the given system root. If we're writing a module, its
    607   /// build directory will be used in preference to this if both are available.
    608   ///
    609   /// \return the module signature, which eventually will be a hash of
    610   /// the module but currently is merely a random 32-bit number.
    611   uint64_t WriteAST(Sema &SemaRef, const std::string &OutputFile,
    612                     Module *WritingModule, StringRef isysroot,
    613                     bool hasErrors = false);
    614 
    615   /// \brief Emit a token.
    616   void AddToken(const Token &Tok, RecordDataImpl &Record);
    617 
    618   /// \brief Emit a source location.
    619   void AddSourceLocation(SourceLocation Loc, RecordDataImpl &Record);
    620 
    621   /// \brief Emit a source range.
    622   void AddSourceRange(SourceRange Range, RecordDataImpl &Record);
    623 
    624   /// \brief Emit an integral value.
    625   void AddAPInt(const llvm::APInt &Value, RecordDataImpl &Record);
    626 
    627   /// \brief Emit a signed integral value.
    628   void AddAPSInt(const llvm::APSInt &Value, RecordDataImpl &Record);
    629 
    630   /// \brief Emit a floating-point value.
    631   void AddAPFloat(const llvm::APFloat &Value, RecordDataImpl &Record);
    632 
    633   /// \brief Emit a reference to an identifier.
    634   void AddIdentifierRef(const IdentifierInfo *II, RecordDataImpl &Record);
    635 
    636   /// \brief Emit a Selector (which is a smart pointer reference).
    637   void AddSelectorRef(Selector, RecordDataImpl &Record);
    638 
    639   /// \brief Emit a CXXTemporary.
    640   void AddCXXTemporary(const CXXTemporary *Temp, RecordDataImpl &Record);
    641 
    642   /// \brief Emit a set of C++ base specifiers to the record.
    643   void AddCXXBaseSpecifiersRef(CXXBaseSpecifier const *Bases,
    644                                CXXBaseSpecifier const *BasesEnd,
    645                                RecordDataImpl &Record);
    646 
    647   /// \brief Get the unique number used to refer to the given selector.
    648   serialization::SelectorID getSelectorRef(Selector Sel);
    649 
    650   /// \brief Get the unique number used to refer to the given identifier.
    651   serialization::IdentID getIdentifierRef(const IdentifierInfo *II);
    652 
    653   /// \brief Get the unique number used to refer to the given macro.
    654   serialization::MacroID getMacroRef(MacroInfo *MI, const IdentifierInfo *Name);
    655 
    656   /// \brief Determine the ID of an already-emitted macro.
    657   serialization::MacroID getMacroID(MacroInfo *MI);
    658 
    659   uint64_t getMacroDirectivesOffset(const IdentifierInfo *Name);
    660 
    661   /// \brief Emit a reference to a type.
    662   void AddTypeRef(QualType T, RecordDataImpl &Record);
    663 
    664   /// \brief Force a type to be emitted and get its ID.
    665   serialization::TypeID GetOrCreateTypeID(QualType T);
    666 
    667   /// \brief Determine the type ID of an already-emitted type.
    668   serialization::TypeID getTypeID(QualType T) const;
    669 
    670   /// \brief Emits a reference to a declarator info.
    671   void AddTypeSourceInfo(TypeSourceInfo *TInfo, RecordDataImpl &Record);
    672 
    673   /// \brief Emits a type with source-location information.
    674   void AddTypeLoc(TypeLoc TL, RecordDataImpl &Record);
    675 
    676   /// \brief Emits a template argument location info.
    677   void AddTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind,
    678                                   const TemplateArgumentLocInfo &Arg,
    679                                   RecordDataImpl &Record);
    680 
    681   /// \brief Emits a template argument location.
    682   void AddTemplateArgumentLoc(const TemplateArgumentLoc &Arg,
    683                               RecordDataImpl &Record);
    684 
    685   /// \brief Emits an AST template argument list info.
    686   void AddASTTemplateArgumentListInfo(
    687                           const ASTTemplateArgumentListInfo *ASTTemplArgList,
    688                           RecordDataImpl &Record);
    689 
    690   /// \brief Find the first local declaration of a given local redeclarable
    691   /// decl.
    692   const Decl *getFirstLocalDecl(const Decl *D);
    693 
    694   /// \brief Emit a reference to a declaration.
    695   void AddDeclRef(const Decl *D, RecordDataImpl &Record);
    696 
    697 
    698   /// \brief Force a declaration to be emitted and get its ID.
    699   serialization::DeclID GetDeclRef(const Decl *D);
    700 
    701   /// \brief Determine the declaration ID of an already-emitted
    702   /// declaration.
    703   serialization::DeclID getDeclID(const Decl *D);
    704 
    705   /// \brief Emit a declaration name.
    706   void AddDeclarationName(DeclarationName Name, RecordDataImpl &Record);
    707   void AddDeclarationNameLoc(const DeclarationNameLoc &DNLoc,
    708                              DeclarationName Name, RecordDataImpl &Record);
    709   void AddDeclarationNameInfo(const DeclarationNameInfo &NameInfo,
    710                               RecordDataImpl &Record);
    711   unsigned getAnonymousDeclarationNumber(const NamedDecl *D);
    712 
    713   void AddQualifierInfo(const QualifierInfo &Info, RecordDataImpl &Record);
    714 
    715   /// \brief Emit a nested name specifier.
    716   void AddNestedNameSpecifier(NestedNameSpecifier *NNS, RecordDataImpl &Record);
    717 
    718   /// \brief Emit a nested name specifier with source-location information.
    719   void AddNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
    720                                  RecordDataImpl &Record);
    721 
    722   /// \brief Emit a template name.
    723   void AddTemplateName(TemplateName Name, RecordDataImpl &Record);
    724 
    725   /// \brief Emit a template argument.
    726   void AddTemplateArgument(const TemplateArgument &Arg, RecordDataImpl &Record);
    727 
    728   /// \brief Emit a template parameter list.
    729   void AddTemplateParameterList(const TemplateParameterList *TemplateParams,
    730                                 RecordDataImpl &Record);
    731 
    732   /// \brief Emit a template argument list.
    733   void AddTemplateArgumentList(const TemplateArgumentList *TemplateArgs,
    734                                 RecordDataImpl &Record);
    735 
    736   /// \brief Emit a UnresolvedSet structure.
    737   void AddUnresolvedSet(const ASTUnresolvedSet &Set, RecordDataImpl &Record);
    738 
    739   /// \brief Emit a C++ base specifier.
    740   void AddCXXBaseSpecifier(const CXXBaseSpecifier &Base,
    741                            RecordDataImpl &Record);
    742 
    743   /// \brief Emit the ID for a CXXCtorInitializer array and register the array
    744   /// for later serialization.
    745   void AddCXXCtorInitializersRef(ArrayRef<CXXCtorInitializer *> Inits,
    746                                  RecordDataImpl &Record);
    747 
    748   /// \brief Emit a CXXCtorInitializer array.
    749   void AddCXXCtorInitializers(
    750                              const CXXCtorInitializer * const *CtorInitializers,
    751                              unsigned NumCtorInitializers,
    752                              RecordDataImpl &Record);
    753 
    754   void AddCXXDefinitionData(const CXXRecordDecl *D, RecordDataImpl &Record);
    755 
    756   /// \brief Add a string to the given record.
    757   void AddString(StringRef Str, RecordDataImpl &Record);
    758 
    759   /// \brief Convert a path from this build process into one that is appropriate
    760   /// for emission in the module file.
    761   bool PreparePathForOutput(SmallVectorImpl<char> &Path);
    762 
    763   /// \brief Add a path to the given record.
    764   void AddPath(StringRef Path, RecordDataImpl &Record);
    765 
    766   /// \brief Emit the current record with the given path as a blob.
    767   void EmitRecordWithPath(unsigned Abbrev, RecordDataRef Record,
    768                           StringRef Path);
    769 
    770   /// \brief Add a version tuple to the given record
    771   void AddVersionTuple(const VersionTuple &Version, RecordDataImpl &Record);
    772 
    773   /// \brief Infer the submodule ID that contains an entity at the given
    774   /// source location.
    775   serialization::SubmoduleID inferSubmoduleIDFromLocation(SourceLocation Loc);
    776 
    777   /// \brief Retrieve or create a submodule ID for this module, or return 0 if
    778   /// the submodule is neither local (a submodle of the currently-written module)
    779   /// nor from an imported module.
    780   unsigned getLocalOrImportedSubmoduleID(Module *Mod);
    781 
    782   /// \brief Note that the identifier II occurs at the given offset
    783   /// within the identifier table.
    784   void SetIdentifierOffset(const IdentifierInfo *II, uint32_t Offset);
    785 
    786   /// \brief Note that the selector Sel occurs at the given offset
    787   /// within the method pool/selector table.
    788   void SetSelectorOffset(Selector Sel, uint32_t Offset);
    789 
    790   /// \brief Add the given statement or expression to the queue of
    791   /// statements to emit.
    792   ///
    793   /// This routine should be used when emitting types and declarations
    794   /// that have expressions as part of their formulation. Once the
    795   /// type or declaration has been written, call FlushStmts() to write
    796   /// the corresponding statements just after the type or
    797   /// declaration.
    798   void AddStmt(Stmt *S) {
    799       CollectedStmts->push_back(S);
    800   }
    801 
    802   /// \brief Flush all of the statements and expressions that have
    803   /// been added to the queue via AddStmt().
    804   void FlushStmts();
    805 
    806   /// \brief Flush all of the C++ base specifier sets that have been added
    807   /// via \c AddCXXBaseSpecifiersRef().
    808   void FlushCXXBaseSpecifiers();
    809 
    810   /// \brief Flush all of the C++ constructor initializer lists that have been
    811   /// added via \c AddCXXCtorInitializersRef().
    812   void FlushCXXCtorInitializers();
    813 
    814   /// \brief Flush all pending records that are tacked onto the end of
    815   /// decl and decl update records.
    816   void FlushPendingAfterDecl() {
    817     FlushStmts();
    818     FlushCXXBaseSpecifiers();
    819     FlushCXXCtorInitializers();
    820   }
    821 
    822   /// \brief Record an ID for the given switch-case statement.
    823   unsigned RecordSwitchCaseID(SwitchCase *S);
    824 
    825   /// \brief Retrieve the ID for the given switch-case statement.
    826   unsigned getSwitchCaseID(SwitchCase *S);
    827 
    828   void ClearSwitchCaseIDs();
    829 
    830   unsigned getTypeExtQualAbbrev() const {
    831     return TypeExtQualAbbrev;
    832   }
    833   unsigned getTypeFunctionProtoAbbrev() const {
    834     return TypeFunctionProtoAbbrev;
    835   }
    836 
    837   unsigned getDeclParmVarAbbrev() const { return DeclParmVarAbbrev; }
    838   unsigned getDeclRecordAbbrev() const { return DeclRecordAbbrev; }
    839   unsigned getDeclTypedefAbbrev() const { return DeclTypedefAbbrev; }
    840   unsigned getDeclVarAbbrev() const { return DeclVarAbbrev; }
    841   unsigned getDeclFieldAbbrev() const { return DeclFieldAbbrev; }
    842   unsigned getDeclEnumAbbrev() const { return DeclEnumAbbrev; }
    843   unsigned getDeclObjCIvarAbbrev() const { return DeclObjCIvarAbbrev; }
    844   unsigned getDeclCXXMethodAbbrev() const { return DeclCXXMethodAbbrev; }
    845 
    846   unsigned getDeclRefExprAbbrev() const { return DeclRefExprAbbrev; }
    847   unsigned getCharacterLiteralAbbrev() const { return CharacterLiteralAbbrev; }
    848   unsigned getIntegerLiteralAbbrev() const { return IntegerLiteralAbbrev; }
    849   unsigned getExprImplicitCastAbbrev() const { return ExprImplicitCastAbbrev; }
    850 
    851   bool hasChain() const { return Chain; }
    852   ASTReader *getChain() const { return Chain; }
    853 
    854   // ASTDeserializationListener implementation
    855   void ReaderInitialized(ASTReader *Reader) override;
    856   void IdentifierRead(serialization::IdentID ID, IdentifierInfo *II) override;
    857   void MacroRead(serialization::MacroID ID, MacroInfo *MI) override;
    858   void TypeRead(serialization::TypeIdx Idx, QualType T) override;
    859   void SelectorRead(serialization::SelectorID ID, Selector Sel) override;
    860   void MacroDefinitionRead(serialization::PreprocessedEntityID ID,
    861                            MacroDefinitionRecord *MD) override;
    862   void ModuleRead(serialization::SubmoduleID ID, Module *Mod) override;
    863 
    864   // ASTMutationListener implementation.
    865   void CompletedTagDefinition(const TagDecl *D) override;
    866   void AddedVisibleDecl(const DeclContext *DC, const Decl *D) override;
    867   void AddedCXXImplicitMember(const CXXRecordDecl *RD, const Decl *D) override;
    868   void ResolvedExceptionSpec(const FunctionDecl *FD) override;
    869   void DeducedReturnType(const FunctionDecl *FD, QualType ReturnType) override;
    870   void ResolvedOperatorDelete(const CXXDestructorDecl *DD,
    871                               const FunctionDecl *Delete) override;
    872   void CompletedImplicitDefinition(const FunctionDecl *D) override;
    873   void StaticDataMemberInstantiated(const VarDecl *D) override;
    874   void FunctionDefinitionInstantiated(const FunctionDecl *D) override;
    875   void AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD,
    876                                     const ObjCInterfaceDecl *IFD) override;
    877   void DeclarationMarkedUsed(const Decl *D) override;
    878   void DeclarationMarkedOpenMPThreadPrivate(const Decl *D) override;
    879   void RedefinedHiddenDefinition(const NamedDecl *D, Module *M) override;
    880   void AddedAttributeToRecord(const Attr *Attr,
    881                               const RecordDecl *Record) override;
    882 };
    883 
    884 /// \brief AST and semantic-analysis consumer that generates a
    885 /// precompiled header from the parsed source code.
    886 class PCHGenerator : public SemaConsumer {
    887   const Preprocessor &PP;
    888   std::string OutputFile;
    889   clang::Module *Module;
    890   std::string isysroot;
    891   Sema *SemaPtr;
    892   std::shared_ptr<PCHBuffer> Buffer;
    893   llvm::BitstreamWriter Stream;
    894   ASTWriter Writer;
    895   bool AllowASTWithErrors;
    896 
    897 protected:
    898   ASTWriter &getWriter() { return Writer; }
    899   const ASTWriter &getWriter() const { return Writer; }
    900   SmallVectorImpl<char> &getPCH() const { return Buffer->Data; }
    901 
    902 public:
    903   PCHGenerator(
    904     const Preprocessor &PP, StringRef OutputFile,
    905     clang::Module *Module, StringRef isysroot,
    906     std::shared_ptr<PCHBuffer> Buffer,
    907     ArrayRef<llvm::IntrusiveRefCntPtr<ModuleFileExtension>> Extensions,
    908     bool AllowASTWithErrors = false,
    909     bool IncludeTimestamps = true);
    910   ~PCHGenerator() override;
    911   void InitializeSema(Sema &S) override { SemaPtr = &S; }
    912   void HandleTranslationUnit(ASTContext &Ctx) override;
    913   ASTMutationListener *GetASTMutationListener() override;
    914   ASTDeserializationListener *GetASTDeserializationListener() override;
    915   bool hasEmittedPCH() const { return Buffer->IsComplete; }
    916 };
    917 
    918 } // end namespace clang
    919 
    920 #endif
    921