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