xref: /aosp_15_r20/external/clang/lib/Serialization/ASTWriterDecl.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===--- ASTWriterDecl.cpp - Declaration Serialization --------------------===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li //  This file implements serialization for Declarations.
11*67e74705SXin Li //
12*67e74705SXin Li //===----------------------------------------------------------------------===//
13*67e74705SXin Li 
14*67e74705SXin Li #include "clang/Serialization/ASTWriter.h"
15*67e74705SXin Li #include "ASTCommon.h"
16*67e74705SXin Li #include "clang/AST/DeclCXX.h"
17*67e74705SXin Li #include "clang/AST/DeclContextInternals.h"
18*67e74705SXin Li #include "clang/AST/DeclTemplate.h"
19*67e74705SXin Li #include "clang/AST/DeclVisitor.h"
20*67e74705SXin Li #include "clang/AST/Expr.h"
21*67e74705SXin Li #include "clang/Basic/SourceManager.h"
22*67e74705SXin Li #include "clang/Serialization/ASTReader.h"
23*67e74705SXin Li #include "llvm/ADT/Twine.h"
24*67e74705SXin Li #include "llvm/Bitcode/BitstreamWriter.h"
25*67e74705SXin Li #include "llvm/Support/ErrorHandling.h"
26*67e74705SXin Li using namespace clang;
27*67e74705SXin Li using namespace serialization;
28*67e74705SXin Li 
29*67e74705SXin Li //===----------------------------------------------------------------------===//
30*67e74705SXin Li // Declaration serialization
31*67e74705SXin Li //===----------------------------------------------------------------------===//
32*67e74705SXin Li 
33*67e74705SXin Li namespace clang {
34*67e74705SXin Li   class ASTDeclWriter : public DeclVisitor<ASTDeclWriter, void> {
35*67e74705SXin Li     ASTWriter &Writer;
36*67e74705SXin Li     ASTContext &Context;
37*67e74705SXin Li     ASTRecordWriter Record;
38*67e74705SXin Li 
39*67e74705SXin Li     serialization::DeclCode Code;
40*67e74705SXin Li     unsigned AbbrevToUse;
41*67e74705SXin Li 
42*67e74705SXin Li   public:
ASTDeclWriter(ASTWriter & Writer,ASTContext & Context,ASTWriter::RecordDataImpl & Record)43*67e74705SXin Li     ASTDeclWriter(ASTWriter &Writer, ASTContext &Context,
44*67e74705SXin Li                   ASTWriter::RecordDataImpl &Record)
45*67e74705SXin Li         : Writer(Writer), Context(Context), Record(Writer, Record),
46*67e74705SXin Li           Code((serialization::DeclCode)0), AbbrevToUse(0) {}
47*67e74705SXin Li 
Emit(Decl * D)48*67e74705SXin Li     uint64_t Emit(Decl *D) {
49*67e74705SXin Li       if (!Code)
50*67e74705SXin Li         llvm::report_fatal_error(StringRef("unexpected declaration kind '") +
51*67e74705SXin Li             D->getDeclKindName() + "'");
52*67e74705SXin Li       return Record.Emit(Code, AbbrevToUse);
53*67e74705SXin Li     }
54*67e74705SXin Li 
55*67e74705SXin Li     void Visit(Decl *D);
56*67e74705SXin Li 
57*67e74705SXin Li     void VisitDecl(Decl *D);
58*67e74705SXin Li     void VisitPragmaCommentDecl(PragmaCommentDecl *D);
59*67e74705SXin Li     void VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl *D);
60*67e74705SXin Li     void VisitTranslationUnitDecl(TranslationUnitDecl *D);
61*67e74705SXin Li     void VisitNamedDecl(NamedDecl *D);
62*67e74705SXin Li     void VisitLabelDecl(LabelDecl *LD);
63*67e74705SXin Li     void VisitNamespaceDecl(NamespaceDecl *D);
64*67e74705SXin Li     void VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
65*67e74705SXin Li     void VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
66*67e74705SXin Li     void VisitTypeDecl(TypeDecl *D);
67*67e74705SXin Li     void VisitTypedefNameDecl(TypedefNameDecl *D);
68*67e74705SXin Li     void VisitTypedefDecl(TypedefDecl *D);
69*67e74705SXin Li     void VisitTypeAliasDecl(TypeAliasDecl *D);
70*67e74705SXin Li     void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
71*67e74705SXin Li     void VisitTagDecl(TagDecl *D);
72*67e74705SXin Li     void VisitEnumDecl(EnumDecl *D);
73*67e74705SXin Li     void VisitRecordDecl(RecordDecl *D);
74*67e74705SXin Li     void VisitCXXRecordDecl(CXXRecordDecl *D);
75*67e74705SXin Li     void VisitClassTemplateSpecializationDecl(
76*67e74705SXin Li                                             ClassTemplateSpecializationDecl *D);
77*67e74705SXin Li     void VisitClassTemplatePartialSpecializationDecl(
78*67e74705SXin Li                                      ClassTemplatePartialSpecializationDecl *D);
79*67e74705SXin Li     void VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D);
80*67e74705SXin Li     void VisitVarTemplatePartialSpecializationDecl(
81*67e74705SXin Li         VarTemplatePartialSpecializationDecl *D);
82*67e74705SXin Li     void VisitClassScopeFunctionSpecializationDecl(
83*67e74705SXin Li                                        ClassScopeFunctionSpecializationDecl *D);
84*67e74705SXin Li     void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
85*67e74705SXin Li     void VisitValueDecl(ValueDecl *D);
86*67e74705SXin Li     void VisitEnumConstantDecl(EnumConstantDecl *D);
87*67e74705SXin Li     void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
88*67e74705SXin Li     void VisitDeclaratorDecl(DeclaratorDecl *D);
89*67e74705SXin Li     void VisitFunctionDecl(FunctionDecl *D);
90*67e74705SXin Li     void VisitCXXMethodDecl(CXXMethodDecl *D);
91*67e74705SXin Li     void VisitCXXConstructorDecl(CXXConstructorDecl *D);
92*67e74705SXin Li     void VisitCXXDestructorDecl(CXXDestructorDecl *D);
93*67e74705SXin Li     void VisitCXXConversionDecl(CXXConversionDecl *D);
94*67e74705SXin Li     void VisitFieldDecl(FieldDecl *D);
95*67e74705SXin Li     void VisitMSPropertyDecl(MSPropertyDecl *D);
96*67e74705SXin Li     void VisitIndirectFieldDecl(IndirectFieldDecl *D);
97*67e74705SXin Li     void VisitVarDecl(VarDecl *D);
98*67e74705SXin Li     void VisitImplicitParamDecl(ImplicitParamDecl *D);
99*67e74705SXin Li     void VisitParmVarDecl(ParmVarDecl *D);
100*67e74705SXin Li     void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
101*67e74705SXin Li     void VisitTemplateDecl(TemplateDecl *D);
102*67e74705SXin Li     void VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D);
103*67e74705SXin Li     void VisitClassTemplateDecl(ClassTemplateDecl *D);
104*67e74705SXin Li     void VisitVarTemplateDecl(VarTemplateDecl *D);
105*67e74705SXin Li     void VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
106*67e74705SXin Li     void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
107*67e74705SXin Li     void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D);
108*67e74705SXin Li     void VisitUsingDecl(UsingDecl *D);
109*67e74705SXin Li     void VisitUsingShadowDecl(UsingShadowDecl *D);
110*67e74705SXin Li     void VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl *D);
111*67e74705SXin Li     void VisitLinkageSpecDecl(LinkageSpecDecl *D);
112*67e74705SXin Li     void VisitFileScopeAsmDecl(FileScopeAsmDecl *D);
113*67e74705SXin Li     void VisitImportDecl(ImportDecl *D);
114*67e74705SXin Li     void VisitAccessSpecDecl(AccessSpecDecl *D);
115*67e74705SXin Li     void VisitFriendDecl(FriendDecl *D);
116*67e74705SXin Li     void VisitFriendTemplateDecl(FriendTemplateDecl *D);
117*67e74705SXin Li     void VisitStaticAssertDecl(StaticAssertDecl *D);
118*67e74705SXin Li     void VisitBlockDecl(BlockDecl *D);
119*67e74705SXin Li     void VisitCapturedDecl(CapturedDecl *D);
120*67e74705SXin Li     void VisitEmptyDecl(EmptyDecl *D);
121*67e74705SXin Li 
122*67e74705SXin Li     void VisitDeclContext(DeclContext *DC);
123*67e74705SXin Li     template <typename T> void VisitRedeclarable(Redeclarable<T> *D);
124*67e74705SXin Li 
125*67e74705SXin Li 
126*67e74705SXin Li     // FIXME: Put in the same order is DeclNodes.td?
127*67e74705SXin Li     void VisitObjCMethodDecl(ObjCMethodDecl *D);
128*67e74705SXin Li     void VisitObjCTypeParamDecl(ObjCTypeParamDecl *D);
129*67e74705SXin Li     void VisitObjCContainerDecl(ObjCContainerDecl *D);
130*67e74705SXin Li     void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
131*67e74705SXin Li     void VisitObjCIvarDecl(ObjCIvarDecl *D);
132*67e74705SXin Li     void VisitObjCProtocolDecl(ObjCProtocolDecl *D);
133*67e74705SXin Li     void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D);
134*67e74705SXin Li     void VisitObjCCategoryDecl(ObjCCategoryDecl *D);
135*67e74705SXin Li     void VisitObjCImplDecl(ObjCImplDecl *D);
136*67e74705SXin Li     void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
137*67e74705SXin Li     void VisitObjCImplementationDecl(ObjCImplementationDecl *D);
138*67e74705SXin Li     void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D);
139*67e74705SXin Li     void VisitObjCPropertyDecl(ObjCPropertyDecl *D);
140*67e74705SXin Li     void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
141*67e74705SXin Li     void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D);
142*67e74705SXin Li     void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D);
143*67e74705SXin Li     void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D);
144*67e74705SXin Li 
145*67e74705SXin Li     /// Add an Objective-C type parameter list to the given record.
AddObjCTypeParamList(ObjCTypeParamList * typeParams)146*67e74705SXin Li     void AddObjCTypeParamList(ObjCTypeParamList *typeParams) {
147*67e74705SXin Li       // Empty type parameter list.
148*67e74705SXin Li       if (!typeParams) {
149*67e74705SXin Li         Record.push_back(0);
150*67e74705SXin Li         return;
151*67e74705SXin Li       }
152*67e74705SXin Li 
153*67e74705SXin Li       Record.push_back(typeParams->size());
154*67e74705SXin Li       for (auto typeParam : *typeParams) {
155*67e74705SXin Li         Record.AddDeclRef(typeParam);
156*67e74705SXin Li       }
157*67e74705SXin Li       Record.AddSourceLocation(typeParams->getLAngleLoc());
158*67e74705SXin Li       Record.AddSourceLocation(typeParams->getRAngleLoc());
159*67e74705SXin Li     }
160*67e74705SXin Li 
161*67e74705SXin Li     /// Add to the record the first declaration from each module file that
162*67e74705SXin Li     /// provides a declaration of D. The intent is to provide a sufficient
163*67e74705SXin Li     /// set such that reloading this set will load all current redeclarations.
AddFirstDeclFromEachModule(const Decl * D,bool IncludeLocal)164*67e74705SXin Li     void AddFirstDeclFromEachModule(const Decl *D, bool IncludeLocal) {
165*67e74705SXin Li       llvm::MapVector<ModuleFile*, const Decl*> Firsts;
166*67e74705SXin Li       // FIXME: We can skip entries that we know are implied by others.
167*67e74705SXin Li       for (const Decl *R = D->getMostRecentDecl(); R; R = R->getPreviousDecl()) {
168*67e74705SXin Li         if (R->isFromASTFile())
169*67e74705SXin Li           Firsts[Writer.Chain->getOwningModuleFile(R)] = R;
170*67e74705SXin Li         else if (IncludeLocal)
171*67e74705SXin Li           Firsts[nullptr] = R;
172*67e74705SXin Li       }
173*67e74705SXin Li       for (const auto &F : Firsts)
174*67e74705SXin Li         Record.AddDeclRef(F.second);
175*67e74705SXin Li     }
176*67e74705SXin Li 
177*67e74705SXin Li     /// Get the specialization decl from an entry in the specialization list.
178*67e74705SXin Li     template <typename EntryType>
179*67e74705SXin Li     typename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType *
getSpecializationDecl(EntryType & T)180*67e74705SXin Li     getSpecializationDecl(EntryType &T) {
181*67e74705SXin Li       return RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::getDecl(&T);
182*67e74705SXin Li     }
183*67e74705SXin Li 
184*67e74705SXin Li     /// Get the list of partial specializations from a template's common ptr.
185*67e74705SXin Li     template<typename T>
getPartialSpecializations(T * Common)186*67e74705SXin Li     decltype(T::PartialSpecializations) &getPartialSpecializations(T *Common) {
187*67e74705SXin Li       return Common->PartialSpecializations;
188*67e74705SXin Li     }
getPartialSpecializations(FunctionTemplateDecl::Common *)189*67e74705SXin Li     ArrayRef<Decl> getPartialSpecializations(FunctionTemplateDecl::Common *) {
190*67e74705SXin Li       return None;
191*67e74705SXin Li     }
192*67e74705SXin Li 
193*67e74705SXin Li     template<typename DeclTy>
AddTemplateSpecializations(DeclTy * D)194*67e74705SXin Li     void AddTemplateSpecializations(DeclTy *D) {
195*67e74705SXin Li       auto *Common = D->getCommonPtr();
196*67e74705SXin Li 
197*67e74705SXin Li       // If we have any lazy specializations, and the external AST source is
198*67e74705SXin Li       // our chained AST reader, we can just write out the DeclIDs. Otherwise,
199*67e74705SXin Li       // we need to resolve them to actual declarations.
200*67e74705SXin Li       if (Writer.Chain != Writer.Context->getExternalSource() &&
201*67e74705SXin Li           Common->LazySpecializations) {
202*67e74705SXin Li         D->LoadLazySpecializations();
203*67e74705SXin Li         assert(!Common->LazySpecializations);
204*67e74705SXin Li       }
205*67e74705SXin Li 
206*67e74705SXin Li       ArrayRef<DeclID> LazySpecializations;
207*67e74705SXin Li       if (auto *LS = Common->LazySpecializations)
208*67e74705SXin Li         LazySpecializations = llvm::makeArrayRef(LS + 1, LS[0]);
209*67e74705SXin Li 
210*67e74705SXin Li       // Add a slot to the record for the number of specializations.
211*67e74705SXin Li       unsigned I = Record.size();
212*67e74705SXin Li       Record.push_back(0);
213*67e74705SXin Li 
214*67e74705SXin Li       // AddFirstDeclFromEachModule might trigger deserialization, invalidating
215*67e74705SXin Li       // *Specializations iterators.
216*67e74705SXin Li       llvm::SmallVector<const Decl*, 16> Specs;
217*67e74705SXin Li       for (auto &Entry : Common->Specializations)
218*67e74705SXin Li         Specs.push_back(getSpecializationDecl(Entry));
219*67e74705SXin Li       for (auto &Entry : getPartialSpecializations(Common))
220*67e74705SXin Li         Specs.push_back(getSpecializationDecl(Entry));
221*67e74705SXin Li 
222*67e74705SXin Li       for (auto *D : Specs) {
223*67e74705SXin Li         assert(D->isCanonicalDecl() && "non-canonical decl in set");
224*67e74705SXin Li         AddFirstDeclFromEachModule(D, /*IncludeLocal*/true);
225*67e74705SXin Li       }
226*67e74705SXin Li       Record.append(LazySpecializations.begin(), LazySpecializations.end());
227*67e74705SXin Li 
228*67e74705SXin Li       // Update the size entry we added earlier.
229*67e74705SXin Li       Record[I] = Record.size() - I - 1;
230*67e74705SXin Li     }
231*67e74705SXin Li 
232*67e74705SXin Li     /// Ensure that this template specialization is associated with the specified
233*67e74705SXin Li     /// template on reload.
RegisterTemplateSpecialization(const Decl * Template,const Decl * Specialization)234*67e74705SXin Li     void RegisterTemplateSpecialization(const Decl *Template,
235*67e74705SXin Li                                         const Decl *Specialization) {
236*67e74705SXin Li       Template = Template->getCanonicalDecl();
237*67e74705SXin Li 
238*67e74705SXin Li       // If the canonical template is local, we'll write out this specialization
239*67e74705SXin Li       // when we emit it.
240*67e74705SXin Li       // FIXME: We can do the same thing if there is any local declaration of
241*67e74705SXin Li       // the template, to avoid emitting an update record.
242*67e74705SXin Li       if (!Template->isFromASTFile())
243*67e74705SXin Li         return;
244*67e74705SXin Li 
245*67e74705SXin Li       // We only need to associate the first local declaration of the
246*67e74705SXin Li       // specialization. The other declarations will get pulled in by it.
247*67e74705SXin Li       if (Writer.getFirstLocalDecl(Specialization) != Specialization)
248*67e74705SXin Li         return;
249*67e74705SXin Li 
250*67e74705SXin Li       Writer.DeclUpdates[Template].push_back(ASTWriter::DeclUpdate(
251*67e74705SXin Li           UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION, Specialization));
252*67e74705SXin Li     }
253*67e74705SXin Li   };
254*67e74705SXin Li }
255*67e74705SXin Li 
Visit(Decl * D)256*67e74705SXin Li void ASTDeclWriter::Visit(Decl *D) {
257*67e74705SXin Li   DeclVisitor<ASTDeclWriter>::Visit(D);
258*67e74705SXin Li 
259*67e74705SXin Li   // Source locations require array (variable-length) abbreviations.  The
260*67e74705SXin Li   // abbreviation infrastructure requires that arrays are encoded last, so
261*67e74705SXin Li   // we handle it here in the case of those classes derived from DeclaratorDecl
262*67e74705SXin Li   if (DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) {
263*67e74705SXin Li     Record.AddTypeSourceInfo(DD->getTypeSourceInfo());
264*67e74705SXin Li   }
265*67e74705SXin Li 
266*67e74705SXin Li   // Handle FunctionDecl's body here and write it after all other Stmts/Exprs
267*67e74705SXin Li   // have been written. We want it last because we will not read it back when
268*67e74705SXin Li   // retrieving it from the AST, we'll just lazily set the offset.
269*67e74705SXin Li   if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
270*67e74705SXin Li     Record.push_back(FD->doesThisDeclarationHaveABody());
271*67e74705SXin Li     if (FD->doesThisDeclarationHaveABody())
272*67e74705SXin Li       Record.AddFunctionDefinition(FD);
273*67e74705SXin Li   }
274*67e74705SXin Li 
275*67e74705SXin Li   // If this declaration is also a DeclContext, write blocks for the
276*67e74705SXin Li   // declarations that lexically stored inside its context and those
277*67e74705SXin Li   // declarations that are visible from its context.
278*67e74705SXin Li   if (DeclContext *DC = dyn_cast<DeclContext>(D))
279*67e74705SXin Li     VisitDeclContext(DC);
280*67e74705SXin Li }
281*67e74705SXin Li 
VisitDecl(Decl * D)282*67e74705SXin Li void ASTDeclWriter::VisitDecl(Decl *D) {
283*67e74705SXin Li   Record.AddDeclRef(cast_or_null<Decl>(D->getDeclContext()));
284*67e74705SXin Li   if (D->getDeclContext() != D->getLexicalDeclContext())
285*67e74705SXin Li     Record.AddDeclRef(cast_or_null<Decl>(D->getLexicalDeclContext()));
286*67e74705SXin Li   else
287*67e74705SXin Li     Record.push_back(0);
288*67e74705SXin Li   Record.push_back(D->isInvalidDecl());
289*67e74705SXin Li   Record.push_back(D->hasAttrs());
290*67e74705SXin Li   if (D->hasAttrs())
291*67e74705SXin Li     Record.AddAttributes(D->getAttrs());
292*67e74705SXin Li   Record.push_back(D->isImplicit());
293*67e74705SXin Li   Record.push_back(D->isUsed(false));
294*67e74705SXin Li   Record.push_back(D->isReferenced());
295*67e74705SXin Li   Record.push_back(D->isTopLevelDeclInObjCContainer());
296*67e74705SXin Li   Record.push_back(D->getAccess());
297*67e74705SXin Li   Record.push_back(D->isModulePrivate());
298*67e74705SXin Li   Record.push_back(Writer.inferSubmoduleIDFromLocation(D->getLocation()));
299*67e74705SXin Li 
300*67e74705SXin Li   // If this declaration injected a name into a context different from its
301*67e74705SXin Li   // lexical context, and that context is an imported namespace, we need to
302*67e74705SXin Li   // update its visible declarations to include this name.
303*67e74705SXin Li   //
304*67e74705SXin Li   // This happens when we instantiate a class with a friend declaration or a
305*67e74705SXin Li   // function with a local extern declaration, for instance.
306*67e74705SXin Li   //
307*67e74705SXin Li   // FIXME: Can we handle this in AddedVisibleDecl instead?
308*67e74705SXin Li   if (D->isOutOfLine()) {
309*67e74705SXin Li     auto *DC = D->getDeclContext();
310*67e74705SXin Li     while (auto *NS = dyn_cast<NamespaceDecl>(DC->getRedeclContext())) {
311*67e74705SXin Li       if (!NS->isFromASTFile())
312*67e74705SXin Li         break;
313*67e74705SXin Li       Writer.UpdatedDeclContexts.insert(NS->getPrimaryContext());
314*67e74705SXin Li       if (!NS->isInlineNamespace())
315*67e74705SXin Li         break;
316*67e74705SXin Li       DC = NS->getParent();
317*67e74705SXin Li     }
318*67e74705SXin Li   }
319*67e74705SXin Li }
320*67e74705SXin Li 
VisitPragmaCommentDecl(PragmaCommentDecl * D)321*67e74705SXin Li void ASTDeclWriter::VisitPragmaCommentDecl(PragmaCommentDecl *D) {
322*67e74705SXin Li   StringRef Arg = D->getArg();
323*67e74705SXin Li   Record.push_back(Arg.size());
324*67e74705SXin Li   VisitDecl(D);
325*67e74705SXin Li   Record.AddSourceLocation(D->getLocStart());
326*67e74705SXin Li   Record.push_back(D->getCommentKind());
327*67e74705SXin Li   Record.AddString(Arg);
328*67e74705SXin Li   Code = serialization::DECL_PRAGMA_COMMENT;
329*67e74705SXin Li }
330*67e74705SXin Li 
VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl * D)331*67e74705SXin Li void ASTDeclWriter::VisitPragmaDetectMismatchDecl(
332*67e74705SXin Li     PragmaDetectMismatchDecl *D) {
333*67e74705SXin Li   StringRef Name = D->getName();
334*67e74705SXin Li   StringRef Value = D->getValue();
335*67e74705SXin Li   Record.push_back(Name.size() + 1 + Value.size());
336*67e74705SXin Li   VisitDecl(D);
337*67e74705SXin Li   Record.AddSourceLocation(D->getLocStart());
338*67e74705SXin Li   Record.AddString(Name);
339*67e74705SXin Li   Record.AddString(Value);
340*67e74705SXin Li   Code = serialization::DECL_PRAGMA_DETECT_MISMATCH;
341*67e74705SXin Li }
342*67e74705SXin Li 
VisitTranslationUnitDecl(TranslationUnitDecl * D)343*67e74705SXin Li void ASTDeclWriter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
344*67e74705SXin Li   llvm_unreachable("Translation units aren't directly serialized");
345*67e74705SXin Li }
346*67e74705SXin Li 
VisitNamedDecl(NamedDecl * D)347*67e74705SXin Li void ASTDeclWriter::VisitNamedDecl(NamedDecl *D) {
348*67e74705SXin Li   VisitDecl(D);
349*67e74705SXin Li   Record.AddDeclarationName(D->getDeclName());
350*67e74705SXin Li   Record.push_back(needsAnonymousDeclarationNumber(D)
351*67e74705SXin Li                        ? Writer.getAnonymousDeclarationNumber(D)
352*67e74705SXin Li                        : 0);
353*67e74705SXin Li }
354*67e74705SXin Li 
VisitTypeDecl(TypeDecl * D)355*67e74705SXin Li void ASTDeclWriter::VisitTypeDecl(TypeDecl *D) {
356*67e74705SXin Li   VisitNamedDecl(D);
357*67e74705SXin Li   Record.AddSourceLocation(D->getLocStart());
358*67e74705SXin Li   Record.AddTypeRef(QualType(D->getTypeForDecl(), 0));
359*67e74705SXin Li }
360*67e74705SXin Li 
VisitTypedefNameDecl(TypedefNameDecl * D)361*67e74705SXin Li void ASTDeclWriter::VisitTypedefNameDecl(TypedefNameDecl *D) {
362*67e74705SXin Li   VisitRedeclarable(D);
363*67e74705SXin Li   VisitTypeDecl(D);
364*67e74705SXin Li   Record.AddTypeSourceInfo(D->getTypeSourceInfo());
365*67e74705SXin Li   Record.push_back(D->isModed());
366*67e74705SXin Li   if (D->isModed())
367*67e74705SXin Li     Record.AddTypeRef(D->getUnderlyingType());
368*67e74705SXin Li }
369*67e74705SXin Li 
VisitTypedefDecl(TypedefDecl * D)370*67e74705SXin Li void ASTDeclWriter::VisitTypedefDecl(TypedefDecl *D) {
371*67e74705SXin Li   VisitTypedefNameDecl(D);
372*67e74705SXin Li   if (D->getDeclContext() == D->getLexicalDeclContext() &&
373*67e74705SXin Li       !D->hasAttrs() &&
374*67e74705SXin Li       !D->isImplicit() &&
375*67e74705SXin Li       D->getFirstDecl() == D->getMostRecentDecl() &&
376*67e74705SXin Li       !D->isInvalidDecl() &&
377*67e74705SXin Li       !D->isTopLevelDeclInObjCContainer() &&
378*67e74705SXin Li       !D->isModulePrivate() &&
379*67e74705SXin Li       !needsAnonymousDeclarationNumber(D) &&
380*67e74705SXin Li       D->getDeclName().getNameKind() == DeclarationName::Identifier)
381*67e74705SXin Li     AbbrevToUse = Writer.getDeclTypedefAbbrev();
382*67e74705SXin Li 
383*67e74705SXin Li   Code = serialization::DECL_TYPEDEF;
384*67e74705SXin Li }
385*67e74705SXin Li 
VisitTypeAliasDecl(TypeAliasDecl * D)386*67e74705SXin Li void ASTDeclWriter::VisitTypeAliasDecl(TypeAliasDecl *D) {
387*67e74705SXin Li   VisitTypedefNameDecl(D);
388*67e74705SXin Li   Record.AddDeclRef(D->getDescribedAliasTemplate());
389*67e74705SXin Li   Code = serialization::DECL_TYPEALIAS;
390*67e74705SXin Li }
391*67e74705SXin Li 
VisitTagDecl(TagDecl * D)392*67e74705SXin Li void ASTDeclWriter::VisitTagDecl(TagDecl *D) {
393*67e74705SXin Li   VisitRedeclarable(D);
394*67e74705SXin Li   VisitTypeDecl(D);
395*67e74705SXin Li   Record.push_back(D->getIdentifierNamespace());
396*67e74705SXin Li   Record.push_back((unsigned)D->getTagKind()); // FIXME: stable encoding
397*67e74705SXin Li   if (!isa<CXXRecordDecl>(D))
398*67e74705SXin Li     Record.push_back(D->isCompleteDefinition());
399*67e74705SXin Li   Record.push_back(D->isEmbeddedInDeclarator());
400*67e74705SXin Li   Record.push_back(D->isFreeStanding());
401*67e74705SXin Li   Record.push_back(D->isCompleteDefinitionRequired());
402*67e74705SXin Li   Record.AddSourceLocation(D->getRBraceLoc());
403*67e74705SXin Li 
404*67e74705SXin Li   if (D->hasExtInfo()) {
405*67e74705SXin Li     Record.push_back(1);
406*67e74705SXin Li     Record.AddQualifierInfo(*D->getExtInfo());
407*67e74705SXin Li   } else if (auto *TD = D->getTypedefNameForAnonDecl()) {
408*67e74705SXin Li     Record.push_back(2);
409*67e74705SXin Li     Record.AddDeclRef(TD);
410*67e74705SXin Li     Record.AddIdentifierRef(TD->getDeclName().getAsIdentifierInfo());
411*67e74705SXin Li   } else {
412*67e74705SXin Li     Record.push_back(0);
413*67e74705SXin Li   }
414*67e74705SXin Li }
415*67e74705SXin Li 
VisitEnumDecl(EnumDecl * D)416*67e74705SXin Li void ASTDeclWriter::VisitEnumDecl(EnumDecl *D) {
417*67e74705SXin Li   VisitTagDecl(D);
418*67e74705SXin Li   Record.AddTypeSourceInfo(D->getIntegerTypeSourceInfo());
419*67e74705SXin Li   if (!D->getIntegerTypeSourceInfo())
420*67e74705SXin Li     Record.AddTypeRef(D->getIntegerType());
421*67e74705SXin Li   Record.AddTypeRef(D->getPromotionType());
422*67e74705SXin Li   Record.push_back(D->getNumPositiveBits());
423*67e74705SXin Li   Record.push_back(D->getNumNegativeBits());
424*67e74705SXin Li   Record.push_back(D->isScoped());
425*67e74705SXin Li   Record.push_back(D->isScopedUsingClassTag());
426*67e74705SXin Li   Record.push_back(D->isFixed());
427*67e74705SXin Li   if (MemberSpecializationInfo *MemberInfo = D->getMemberSpecializationInfo()) {
428*67e74705SXin Li     Record.AddDeclRef(MemberInfo->getInstantiatedFrom());
429*67e74705SXin Li     Record.push_back(MemberInfo->getTemplateSpecializationKind());
430*67e74705SXin Li     Record.AddSourceLocation(MemberInfo->getPointOfInstantiation());
431*67e74705SXin Li   } else {
432*67e74705SXin Li     Record.AddDeclRef(nullptr);
433*67e74705SXin Li   }
434*67e74705SXin Li 
435*67e74705SXin Li   if (D->getDeclContext() == D->getLexicalDeclContext() &&
436*67e74705SXin Li       !D->hasAttrs() &&
437*67e74705SXin Li       !D->isImplicit() &&
438*67e74705SXin Li       !D->isUsed(false) &&
439*67e74705SXin Li       !D->hasExtInfo() &&
440*67e74705SXin Li       !D->getTypedefNameForAnonDecl() &&
441*67e74705SXin Li       D->getFirstDecl() == D->getMostRecentDecl() &&
442*67e74705SXin Li       !D->isInvalidDecl() &&
443*67e74705SXin Li       !D->isReferenced() &&
444*67e74705SXin Li       !D->isTopLevelDeclInObjCContainer() &&
445*67e74705SXin Li       D->getAccess() == AS_none &&
446*67e74705SXin Li       !D->isModulePrivate() &&
447*67e74705SXin Li       !CXXRecordDecl::classofKind(D->getKind()) &&
448*67e74705SXin Li       !D->getIntegerTypeSourceInfo() &&
449*67e74705SXin Li       !D->getMemberSpecializationInfo() &&
450*67e74705SXin Li       !needsAnonymousDeclarationNumber(D) &&
451*67e74705SXin Li       D->getDeclName().getNameKind() == DeclarationName::Identifier)
452*67e74705SXin Li     AbbrevToUse = Writer.getDeclEnumAbbrev();
453*67e74705SXin Li 
454*67e74705SXin Li   Code = serialization::DECL_ENUM;
455*67e74705SXin Li }
456*67e74705SXin Li 
VisitRecordDecl(RecordDecl * D)457*67e74705SXin Li void ASTDeclWriter::VisitRecordDecl(RecordDecl *D) {
458*67e74705SXin Li   VisitTagDecl(D);
459*67e74705SXin Li   Record.push_back(D->hasFlexibleArrayMember());
460*67e74705SXin Li   Record.push_back(D->isAnonymousStructOrUnion());
461*67e74705SXin Li   Record.push_back(D->hasObjectMember());
462*67e74705SXin Li   Record.push_back(D->hasVolatileMember());
463*67e74705SXin Li 
464*67e74705SXin Li   if (D->getDeclContext() == D->getLexicalDeclContext() &&
465*67e74705SXin Li       !D->hasAttrs() &&
466*67e74705SXin Li       !D->isImplicit() &&
467*67e74705SXin Li       !D->isUsed(false) &&
468*67e74705SXin Li       !D->hasExtInfo() &&
469*67e74705SXin Li       !D->getTypedefNameForAnonDecl() &&
470*67e74705SXin Li       D->getFirstDecl() == D->getMostRecentDecl() &&
471*67e74705SXin Li       !D->isInvalidDecl() &&
472*67e74705SXin Li       !D->isReferenced() &&
473*67e74705SXin Li       !D->isTopLevelDeclInObjCContainer() &&
474*67e74705SXin Li       D->getAccess() == AS_none &&
475*67e74705SXin Li       !D->isModulePrivate() &&
476*67e74705SXin Li       !CXXRecordDecl::classofKind(D->getKind()) &&
477*67e74705SXin Li       !needsAnonymousDeclarationNumber(D) &&
478*67e74705SXin Li       D->getDeclName().getNameKind() == DeclarationName::Identifier)
479*67e74705SXin Li     AbbrevToUse = Writer.getDeclRecordAbbrev();
480*67e74705SXin Li 
481*67e74705SXin Li   Code = serialization::DECL_RECORD;
482*67e74705SXin Li }
483*67e74705SXin Li 
VisitValueDecl(ValueDecl * D)484*67e74705SXin Li void ASTDeclWriter::VisitValueDecl(ValueDecl *D) {
485*67e74705SXin Li   VisitNamedDecl(D);
486*67e74705SXin Li   Record.AddTypeRef(D->getType());
487*67e74705SXin Li }
488*67e74705SXin Li 
VisitEnumConstantDecl(EnumConstantDecl * D)489*67e74705SXin Li void ASTDeclWriter::VisitEnumConstantDecl(EnumConstantDecl *D) {
490*67e74705SXin Li   VisitValueDecl(D);
491*67e74705SXin Li   Record.push_back(D->getInitExpr()? 1 : 0);
492*67e74705SXin Li   if (D->getInitExpr())
493*67e74705SXin Li     Record.AddStmt(D->getInitExpr());
494*67e74705SXin Li   Record.AddAPSInt(D->getInitVal());
495*67e74705SXin Li 
496*67e74705SXin Li   Code = serialization::DECL_ENUM_CONSTANT;
497*67e74705SXin Li }
498*67e74705SXin Li 
VisitDeclaratorDecl(DeclaratorDecl * D)499*67e74705SXin Li void ASTDeclWriter::VisitDeclaratorDecl(DeclaratorDecl *D) {
500*67e74705SXin Li   VisitValueDecl(D);
501*67e74705SXin Li   Record.AddSourceLocation(D->getInnerLocStart());
502*67e74705SXin Li   Record.push_back(D->hasExtInfo());
503*67e74705SXin Li   if (D->hasExtInfo())
504*67e74705SXin Li     Record.AddQualifierInfo(*D->getExtInfo());
505*67e74705SXin Li }
506*67e74705SXin Li 
VisitFunctionDecl(FunctionDecl * D)507*67e74705SXin Li void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) {
508*67e74705SXin Li   VisitRedeclarable(D);
509*67e74705SXin Li   VisitDeclaratorDecl(D);
510*67e74705SXin Li   Record.AddDeclarationNameLoc(D->DNLoc, D->getDeclName());
511*67e74705SXin Li   Record.push_back(D->getIdentifierNamespace());
512*67e74705SXin Li 
513*67e74705SXin Li   // FunctionDecl's body is handled last at ASTWriterDecl::Visit,
514*67e74705SXin Li   // after everything else is written.
515*67e74705SXin Li 
516*67e74705SXin Li   Record.push_back((int)D->SClass); // FIXME: stable encoding
517*67e74705SXin Li   Record.push_back(D->IsInline);
518*67e74705SXin Li   Record.push_back(D->IsInlineSpecified);
519*67e74705SXin Li   Record.push_back(D->IsVirtualAsWritten);
520*67e74705SXin Li   Record.push_back(D->IsPure);
521*67e74705SXin Li   Record.push_back(D->HasInheritedPrototype);
522*67e74705SXin Li   Record.push_back(D->HasWrittenPrototype);
523*67e74705SXin Li   Record.push_back(D->IsDeleted);
524*67e74705SXin Li   Record.push_back(D->IsTrivial);
525*67e74705SXin Li   Record.push_back(D->IsDefaulted);
526*67e74705SXin Li   Record.push_back(D->IsExplicitlyDefaulted);
527*67e74705SXin Li   Record.push_back(D->HasImplicitReturnZero);
528*67e74705SXin Li   Record.push_back(D->IsConstexpr);
529*67e74705SXin Li   Record.push_back(D->HasSkippedBody);
530*67e74705SXin Li   Record.push_back(D->IsLateTemplateParsed);
531*67e74705SXin Li   Record.push_back(D->getLinkageInternal());
532*67e74705SXin Li   Record.AddSourceLocation(D->getLocEnd());
533*67e74705SXin Li 
534*67e74705SXin Li   Record.push_back(D->getTemplatedKind());
535*67e74705SXin Li   switch (D->getTemplatedKind()) {
536*67e74705SXin Li   case FunctionDecl::TK_NonTemplate:
537*67e74705SXin Li     break;
538*67e74705SXin Li   case FunctionDecl::TK_FunctionTemplate:
539*67e74705SXin Li     Record.AddDeclRef(D->getDescribedFunctionTemplate());
540*67e74705SXin Li     break;
541*67e74705SXin Li   case FunctionDecl::TK_MemberSpecialization: {
542*67e74705SXin Li     MemberSpecializationInfo *MemberInfo = D->getMemberSpecializationInfo();
543*67e74705SXin Li     Record.AddDeclRef(MemberInfo->getInstantiatedFrom());
544*67e74705SXin Li     Record.push_back(MemberInfo->getTemplateSpecializationKind());
545*67e74705SXin Li     Record.AddSourceLocation(MemberInfo->getPointOfInstantiation());
546*67e74705SXin Li     break;
547*67e74705SXin Li   }
548*67e74705SXin Li   case FunctionDecl::TK_FunctionTemplateSpecialization: {
549*67e74705SXin Li     FunctionTemplateSpecializationInfo *
550*67e74705SXin Li       FTSInfo = D->getTemplateSpecializationInfo();
551*67e74705SXin Li 
552*67e74705SXin Li     RegisterTemplateSpecialization(FTSInfo->getTemplate(), D);
553*67e74705SXin Li 
554*67e74705SXin Li     Record.AddDeclRef(FTSInfo->getTemplate());
555*67e74705SXin Li     Record.push_back(FTSInfo->getTemplateSpecializationKind());
556*67e74705SXin Li 
557*67e74705SXin Li     // Template arguments.
558*67e74705SXin Li     Record.AddTemplateArgumentList(FTSInfo->TemplateArguments);
559*67e74705SXin Li 
560*67e74705SXin Li     // Template args as written.
561*67e74705SXin Li     Record.push_back(FTSInfo->TemplateArgumentsAsWritten != nullptr);
562*67e74705SXin Li     if (FTSInfo->TemplateArgumentsAsWritten) {
563*67e74705SXin Li       Record.push_back(FTSInfo->TemplateArgumentsAsWritten->NumTemplateArgs);
564*67e74705SXin Li       for (int i=0, e = FTSInfo->TemplateArgumentsAsWritten->NumTemplateArgs;
565*67e74705SXin Li              i!=e; ++i)
566*67e74705SXin Li         Record.AddTemplateArgumentLoc(
567*67e74705SXin Li             (*FTSInfo->TemplateArgumentsAsWritten)[i]);
568*67e74705SXin Li       Record.AddSourceLocation(FTSInfo->TemplateArgumentsAsWritten->LAngleLoc);
569*67e74705SXin Li       Record.AddSourceLocation(FTSInfo->TemplateArgumentsAsWritten->RAngleLoc);
570*67e74705SXin Li     }
571*67e74705SXin Li 
572*67e74705SXin Li     Record.AddSourceLocation(FTSInfo->getPointOfInstantiation());
573*67e74705SXin Li 
574*67e74705SXin Li     if (D->isCanonicalDecl()) {
575*67e74705SXin Li       // Write the template that contains the specializations set. We will
576*67e74705SXin Li       // add a FunctionTemplateSpecializationInfo to it when reading.
577*67e74705SXin Li       Record.AddDeclRef(FTSInfo->getTemplate()->getCanonicalDecl());
578*67e74705SXin Li     }
579*67e74705SXin Li     break;
580*67e74705SXin Li   }
581*67e74705SXin Li   case FunctionDecl::TK_DependentFunctionTemplateSpecialization: {
582*67e74705SXin Li     DependentFunctionTemplateSpecializationInfo *
583*67e74705SXin Li       DFTSInfo = D->getDependentSpecializationInfo();
584*67e74705SXin Li 
585*67e74705SXin Li     // Templates.
586*67e74705SXin Li     Record.push_back(DFTSInfo->getNumTemplates());
587*67e74705SXin Li     for (int i=0, e = DFTSInfo->getNumTemplates(); i != e; ++i)
588*67e74705SXin Li       Record.AddDeclRef(DFTSInfo->getTemplate(i));
589*67e74705SXin Li 
590*67e74705SXin Li     // Templates args.
591*67e74705SXin Li     Record.push_back(DFTSInfo->getNumTemplateArgs());
592*67e74705SXin Li     for (int i=0, e = DFTSInfo->getNumTemplateArgs(); i != e; ++i)
593*67e74705SXin Li       Record.AddTemplateArgumentLoc(DFTSInfo->getTemplateArg(i));
594*67e74705SXin Li     Record.AddSourceLocation(DFTSInfo->getLAngleLoc());
595*67e74705SXin Li     Record.AddSourceLocation(DFTSInfo->getRAngleLoc());
596*67e74705SXin Li     break;
597*67e74705SXin Li   }
598*67e74705SXin Li   }
599*67e74705SXin Li 
600*67e74705SXin Li   Record.push_back(D->param_size());
601*67e74705SXin Li   for (auto P : D->parameters())
602*67e74705SXin Li     Record.AddDeclRef(P);
603*67e74705SXin Li   Code = serialization::DECL_FUNCTION;
604*67e74705SXin Li }
605*67e74705SXin Li 
VisitObjCMethodDecl(ObjCMethodDecl * D)606*67e74705SXin Li void ASTDeclWriter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
607*67e74705SXin Li   VisitNamedDecl(D);
608*67e74705SXin Li   // FIXME: convert to LazyStmtPtr?
609*67e74705SXin Li   // Unlike C/C++, method bodies will never be in header files.
610*67e74705SXin Li   bool HasBodyStuff = D->getBody() != nullptr     ||
611*67e74705SXin Li                       D->getSelfDecl() != nullptr || D->getCmdDecl() != nullptr;
612*67e74705SXin Li   Record.push_back(HasBodyStuff);
613*67e74705SXin Li   if (HasBodyStuff) {
614*67e74705SXin Li     Record.AddStmt(D->getBody());
615*67e74705SXin Li     Record.AddDeclRef(D->getSelfDecl());
616*67e74705SXin Li     Record.AddDeclRef(D->getCmdDecl());
617*67e74705SXin Li   }
618*67e74705SXin Li   Record.push_back(D->isInstanceMethod());
619*67e74705SXin Li   Record.push_back(D->isVariadic());
620*67e74705SXin Li   Record.push_back(D->isPropertyAccessor());
621*67e74705SXin Li   Record.push_back(D->isDefined());
622*67e74705SXin Li   Record.push_back(D->IsOverriding);
623*67e74705SXin Li   Record.push_back(D->HasSkippedBody);
624*67e74705SXin Li 
625*67e74705SXin Li   Record.push_back(D->IsRedeclaration);
626*67e74705SXin Li   Record.push_back(D->HasRedeclaration);
627*67e74705SXin Li   if (D->HasRedeclaration) {
628*67e74705SXin Li     assert(Context.getObjCMethodRedeclaration(D));
629*67e74705SXin Li     Record.AddDeclRef(Context.getObjCMethodRedeclaration(D));
630*67e74705SXin Li   }
631*67e74705SXin Li 
632*67e74705SXin Li   // FIXME: stable encoding for @required/@optional
633*67e74705SXin Li   Record.push_back(D->getImplementationControl());
634*67e74705SXin Li   // FIXME: stable encoding for in/out/inout/bycopy/byref/oneway/nullability
635*67e74705SXin Li   Record.push_back(D->getObjCDeclQualifier());
636*67e74705SXin Li   Record.push_back(D->hasRelatedResultType());
637*67e74705SXin Li   Record.AddTypeRef(D->getReturnType());
638*67e74705SXin Li   Record.AddTypeSourceInfo(D->getReturnTypeSourceInfo());
639*67e74705SXin Li   Record.AddSourceLocation(D->getLocEnd());
640*67e74705SXin Li   Record.push_back(D->param_size());
641*67e74705SXin Li   for (const auto *P : D->parameters())
642*67e74705SXin Li     Record.AddDeclRef(P);
643*67e74705SXin Li 
644*67e74705SXin Li   Record.push_back(D->SelLocsKind);
645*67e74705SXin Li   unsigned NumStoredSelLocs = D->getNumStoredSelLocs();
646*67e74705SXin Li   SourceLocation *SelLocs = D->getStoredSelLocs();
647*67e74705SXin Li   Record.push_back(NumStoredSelLocs);
648*67e74705SXin Li   for (unsigned i = 0; i != NumStoredSelLocs; ++i)
649*67e74705SXin Li     Record.AddSourceLocation(SelLocs[i]);
650*67e74705SXin Li 
651*67e74705SXin Li   Code = serialization::DECL_OBJC_METHOD;
652*67e74705SXin Li }
653*67e74705SXin Li 
VisitObjCTypeParamDecl(ObjCTypeParamDecl * D)654*67e74705SXin Li void ASTDeclWriter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) {
655*67e74705SXin Li   VisitTypedefNameDecl(D);
656*67e74705SXin Li   Record.push_back(D->Variance);
657*67e74705SXin Li   Record.push_back(D->Index);
658*67e74705SXin Li   Record.AddSourceLocation(D->VarianceLoc);
659*67e74705SXin Li   Record.AddSourceLocation(D->ColonLoc);
660*67e74705SXin Li 
661*67e74705SXin Li   Code = serialization::DECL_OBJC_TYPE_PARAM;
662*67e74705SXin Li }
663*67e74705SXin Li 
VisitObjCContainerDecl(ObjCContainerDecl * D)664*67e74705SXin Li void ASTDeclWriter::VisitObjCContainerDecl(ObjCContainerDecl *D) {
665*67e74705SXin Li   VisitNamedDecl(D);
666*67e74705SXin Li   Record.AddSourceLocation(D->getAtStartLoc());
667*67e74705SXin Li   Record.AddSourceRange(D->getAtEndRange());
668*67e74705SXin Li   // Abstract class (no need to define a stable serialization::DECL code).
669*67e74705SXin Li }
670*67e74705SXin Li 
VisitObjCInterfaceDecl(ObjCInterfaceDecl * D)671*67e74705SXin Li void ASTDeclWriter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
672*67e74705SXin Li   VisitRedeclarable(D);
673*67e74705SXin Li   VisitObjCContainerDecl(D);
674*67e74705SXin Li   Record.AddTypeRef(QualType(D->getTypeForDecl(), 0));
675*67e74705SXin Li   AddObjCTypeParamList(D->TypeParamList);
676*67e74705SXin Li 
677*67e74705SXin Li   Record.push_back(D->isThisDeclarationADefinition());
678*67e74705SXin Li   if (D->isThisDeclarationADefinition()) {
679*67e74705SXin Li     // Write the DefinitionData
680*67e74705SXin Li     ObjCInterfaceDecl::DefinitionData &Data = D->data();
681*67e74705SXin Li 
682*67e74705SXin Li     Record.AddTypeSourceInfo(D->getSuperClassTInfo());
683*67e74705SXin Li     Record.AddSourceLocation(D->getEndOfDefinitionLoc());
684*67e74705SXin Li     Record.push_back(Data.HasDesignatedInitializers);
685*67e74705SXin Li 
686*67e74705SXin Li     // Write out the protocols that are directly referenced by the @interface.
687*67e74705SXin Li     Record.push_back(Data.ReferencedProtocols.size());
688*67e74705SXin Li     for (const auto *P : D->protocols())
689*67e74705SXin Li       Record.AddDeclRef(P);
690*67e74705SXin Li     for (const auto &PL : D->protocol_locs())
691*67e74705SXin Li       Record.AddSourceLocation(PL);
692*67e74705SXin Li 
693*67e74705SXin Li     // Write out the protocols that are transitively referenced.
694*67e74705SXin Li     Record.push_back(Data.AllReferencedProtocols.size());
695*67e74705SXin Li     for (ObjCList<ObjCProtocolDecl>::iterator
696*67e74705SXin Li               P = Data.AllReferencedProtocols.begin(),
697*67e74705SXin Li            PEnd = Data.AllReferencedProtocols.end();
698*67e74705SXin Li          P != PEnd; ++P)
699*67e74705SXin Li       Record.AddDeclRef(*P);
700*67e74705SXin Li 
701*67e74705SXin Li 
702*67e74705SXin Li     if (ObjCCategoryDecl *Cat = D->getCategoryListRaw()) {
703*67e74705SXin Li       // Ensure that we write out the set of categories for this class.
704*67e74705SXin Li       Writer.ObjCClassesWithCategories.insert(D);
705*67e74705SXin Li 
706*67e74705SXin Li       // Make sure that the categories get serialized.
707*67e74705SXin Li       for (; Cat; Cat = Cat->getNextClassCategoryRaw())
708*67e74705SXin Li         (void)Writer.GetDeclRef(Cat);
709*67e74705SXin Li     }
710*67e74705SXin Li   }
711*67e74705SXin Li 
712*67e74705SXin Li   Code = serialization::DECL_OBJC_INTERFACE;
713*67e74705SXin Li }
714*67e74705SXin Li 
VisitObjCIvarDecl(ObjCIvarDecl * D)715*67e74705SXin Li void ASTDeclWriter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
716*67e74705SXin Li   VisitFieldDecl(D);
717*67e74705SXin Li   // FIXME: stable encoding for @public/@private/@protected/@package
718*67e74705SXin Li   Record.push_back(D->getAccessControl());
719*67e74705SXin Li   Record.push_back(D->getSynthesize());
720*67e74705SXin Li 
721*67e74705SXin Li   if (D->getDeclContext() == D->getLexicalDeclContext() &&
722*67e74705SXin Li       !D->hasAttrs() &&
723*67e74705SXin Li       !D->isImplicit() &&
724*67e74705SXin Li       !D->isUsed(false) &&
725*67e74705SXin Li       !D->isInvalidDecl() &&
726*67e74705SXin Li       !D->isReferenced() &&
727*67e74705SXin Li       !D->isModulePrivate() &&
728*67e74705SXin Li       !D->getBitWidth() &&
729*67e74705SXin Li       !D->hasExtInfo() &&
730*67e74705SXin Li       D->getDeclName())
731*67e74705SXin Li     AbbrevToUse = Writer.getDeclObjCIvarAbbrev();
732*67e74705SXin Li 
733*67e74705SXin Li   Code = serialization::DECL_OBJC_IVAR;
734*67e74705SXin Li }
735*67e74705SXin Li 
VisitObjCProtocolDecl(ObjCProtocolDecl * D)736*67e74705SXin Li void ASTDeclWriter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
737*67e74705SXin Li   VisitRedeclarable(D);
738*67e74705SXin Li   VisitObjCContainerDecl(D);
739*67e74705SXin Li 
740*67e74705SXin Li   Record.push_back(D->isThisDeclarationADefinition());
741*67e74705SXin Li   if (D->isThisDeclarationADefinition()) {
742*67e74705SXin Li     Record.push_back(D->protocol_size());
743*67e74705SXin Li     for (const auto *I : D->protocols())
744*67e74705SXin Li       Record.AddDeclRef(I);
745*67e74705SXin Li     for (const auto &PL : D->protocol_locs())
746*67e74705SXin Li       Record.AddSourceLocation(PL);
747*67e74705SXin Li   }
748*67e74705SXin Li 
749*67e74705SXin Li   Code = serialization::DECL_OBJC_PROTOCOL;
750*67e74705SXin Li }
751*67e74705SXin Li 
VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl * D)752*67e74705SXin Li void ASTDeclWriter::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D) {
753*67e74705SXin Li   VisitFieldDecl(D);
754*67e74705SXin Li   Code = serialization::DECL_OBJC_AT_DEFS_FIELD;
755*67e74705SXin Li }
756*67e74705SXin Li 
VisitObjCCategoryDecl(ObjCCategoryDecl * D)757*67e74705SXin Li void ASTDeclWriter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
758*67e74705SXin Li   VisitObjCContainerDecl(D);
759*67e74705SXin Li   Record.AddSourceLocation(D->getCategoryNameLoc());
760*67e74705SXin Li   Record.AddSourceLocation(D->getIvarLBraceLoc());
761*67e74705SXin Li   Record.AddSourceLocation(D->getIvarRBraceLoc());
762*67e74705SXin Li   Record.AddDeclRef(D->getClassInterface());
763*67e74705SXin Li   AddObjCTypeParamList(D->TypeParamList);
764*67e74705SXin Li   Record.push_back(D->protocol_size());
765*67e74705SXin Li   for (const auto *I : D->protocols())
766*67e74705SXin Li     Record.AddDeclRef(I);
767*67e74705SXin Li   for (const auto &PL : D->protocol_locs())
768*67e74705SXin Li     Record.AddSourceLocation(PL);
769*67e74705SXin Li   Code = serialization::DECL_OBJC_CATEGORY;
770*67e74705SXin Li }
771*67e74705SXin Li 
VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl * D)772*67e74705SXin Li void ASTDeclWriter::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D) {
773*67e74705SXin Li   VisitNamedDecl(D);
774*67e74705SXin Li   Record.AddDeclRef(D->getClassInterface());
775*67e74705SXin Li   Code = serialization::DECL_OBJC_COMPATIBLE_ALIAS;
776*67e74705SXin Li }
777*67e74705SXin Li 
VisitObjCPropertyDecl(ObjCPropertyDecl * D)778*67e74705SXin Li void ASTDeclWriter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
779*67e74705SXin Li   VisitNamedDecl(D);
780*67e74705SXin Li   Record.AddSourceLocation(D->getAtLoc());
781*67e74705SXin Li   Record.AddSourceLocation(D->getLParenLoc());
782*67e74705SXin Li   Record.AddTypeRef(D->getType());
783*67e74705SXin Li   Record.AddTypeSourceInfo(D->getTypeSourceInfo());
784*67e74705SXin Li   // FIXME: stable encoding
785*67e74705SXin Li   Record.push_back((unsigned)D->getPropertyAttributes());
786*67e74705SXin Li   Record.push_back((unsigned)D->getPropertyAttributesAsWritten());
787*67e74705SXin Li   // FIXME: stable encoding
788*67e74705SXin Li   Record.push_back((unsigned)D->getPropertyImplementation());
789*67e74705SXin Li   Record.AddDeclarationName(D->getGetterName());
790*67e74705SXin Li   Record.AddDeclarationName(D->getSetterName());
791*67e74705SXin Li   Record.AddDeclRef(D->getGetterMethodDecl());
792*67e74705SXin Li   Record.AddDeclRef(D->getSetterMethodDecl());
793*67e74705SXin Li   Record.AddDeclRef(D->getPropertyIvarDecl());
794*67e74705SXin Li   Code = serialization::DECL_OBJC_PROPERTY;
795*67e74705SXin Li }
796*67e74705SXin Li 
VisitObjCImplDecl(ObjCImplDecl * D)797*67e74705SXin Li void ASTDeclWriter::VisitObjCImplDecl(ObjCImplDecl *D) {
798*67e74705SXin Li   VisitObjCContainerDecl(D);
799*67e74705SXin Li   Record.AddDeclRef(D->getClassInterface());
800*67e74705SXin Li   // Abstract class (no need to define a stable serialization::DECL code).
801*67e74705SXin Li }
802*67e74705SXin Li 
VisitObjCCategoryImplDecl(ObjCCategoryImplDecl * D)803*67e74705SXin Li void ASTDeclWriter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
804*67e74705SXin Li   VisitObjCImplDecl(D);
805*67e74705SXin Li   Record.AddIdentifierRef(D->getIdentifier());
806*67e74705SXin Li   Record.AddSourceLocation(D->getCategoryNameLoc());
807*67e74705SXin Li   Code = serialization::DECL_OBJC_CATEGORY_IMPL;
808*67e74705SXin Li }
809*67e74705SXin Li 
VisitObjCImplementationDecl(ObjCImplementationDecl * D)810*67e74705SXin Li void ASTDeclWriter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
811*67e74705SXin Li   VisitObjCImplDecl(D);
812*67e74705SXin Li   Record.AddDeclRef(D->getSuperClass());
813*67e74705SXin Li   Record.AddSourceLocation(D->getSuperClassLoc());
814*67e74705SXin Li   Record.AddSourceLocation(D->getIvarLBraceLoc());
815*67e74705SXin Li   Record.AddSourceLocation(D->getIvarRBraceLoc());
816*67e74705SXin Li   Record.push_back(D->hasNonZeroConstructors());
817*67e74705SXin Li   Record.push_back(D->hasDestructors());
818*67e74705SXin Li   Record.push_back(D->NumIvarInitializers);
819*67e74705SXin Li   if (D->NumIvarInitializers)
820*67e74705SXin Li     Record.AddCXXCtorInitializers(
821*67e74705SXin Li         llvm::makeArrayRef(D->init_begin(), D->init_end()));
822*67e74705SXin Li   Code = serialization::DECL_OBJC_IMPLEMENTATION;
823*67e74705SXin Li }
824*67e74705SXin Li 
VisitObjCPropertyImplDecl(ObjCPropertyImplDecl * D)825*67e74705SXin Li void ASTDeclWriter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
826*67e74705SXin Li   VisitDecl(D);
827*67e74705SXin Li   Record.AddSourceLocation(D->getLocStart());
828*67e74705SXin Li   Record.AddDeclRef(D->getPropertyDecl());
829*67e74705SXin Li   Record.AddDeclRef(D->getPropertyIvarDecl());
830*67e74705SXin Li   Record.AddSourceLocation(D->getPropertyIvarDeclLoc());
831*67e74705SXin Li   Record.AddStmt(D->getGetterCXXConstructor());
832*67e74705SXin Li   Record.AddStmt(D->getSetterCXXAssignment());
833*67e74705SXin Li   Code = serialization::DECL_OBJC_PROPERTY_IMPL;
834*67e74705SXin Li }
835*67e74705SXin Li 
VisitFieldDecl(FieldDecl * D)836*67e74705SXin Li void ASTDeclWriter::VisitFieldDecl(FieldDecl *D) {
837*67e74705SXin Li   VisitDeclaratorDecl(D);
838*67e74705SXin Li   Record.push_back(D->isMutable());
839*67e74705SXin Li   if (D->InitStorage.getInt() == FieldDecl::ISK_BitWidthOrNothing &&
840*67e74705SXin Li       D->InitStorage.getPointer() == nullptr) {
841*67e74705SXin Li     Record.push_back(0);
842*67e74705SXin Li   } else if (D->InitStorage.getInt() == FieldDecl::ISK_CapturedVLAType) {
843*67e74705SXin Li     Record.push_back(D->InitStorage.getInt() + 1);
844*67e74705SXin Li     Record.AddTypeRef(
845*67e74705SXin Li         QualType(static_cast<Type *>(D->InitStorage.getPointer()), 0));
846*67e74705SXin Li   } else {
847*67e74705SXin Li     Record.push_back(D->InitStorage.getInt() + 1);
848*67e74705SXin Li     Record.AddStmt(static_cast<Expr *>(D->InitStorage.getPointer()));
849*67e74705SXin Li   }
850*67e74705SXin Li   if (!D->getDeclName())
851*67e74705SXin Li     Record.AddDeclRef(Context.getInstantiatedFromUnnamedFieldDecl(D));
852*67e74705SXin Li 
853*67e74705SXin Li   if (D->getDeclContext() == D->getLexicalDeclContext() &&
854*67e74705SXin Li       !D->hasAttrs() &&
855*67e74705SXin Li       !D->isImplicit() &&
856*67e74705SXin Li       !D->isUsed(false) &&
857*67e74705SXin Li       !D->isInvalidDecl() &&
858*67e74705SXin Li       !D->isReferenced() &&
859*67e74705SXin Li       !D->isTopLevelDeclInObjCContainer() &&
860*67e74705SXin Li       !D->isModulePrivate() &&
861*67e74705SXin Li       !D->getBitWidth() &&
862*67e74705SXin Li       !D->hasInClassInitializer() &&
863*67e74705SXin Li       !D->hasExtInfo() &&
864*67e74705SXin Li       !ObjCIvarDecl::classofKind(D->getKind()) &&
865*67e74705SXin Li       !ObjCAtDefsFieldDecl::classofKind(D->getKind()) &&
866*67e74705SXin Li       D->getDeclName())
867*67e74705SXin Li     AbbrevToUse = Writer.getDeclFieldAbbrev();
868*67e74705SXin Li 
869*67e74705SXin Li   Code = serialization::DECL_FIELD;
870*67e74705SXin Li }
871*67e74705SXin Li 
VisitMSPropertyDecl(MSPropertyDecl * D)872*67e74705SXin Li void ASTDeclWriter::VisitMSPropertyDecl(MSPropertyDecl *D) {
873*67e74705SXin Li   VisitDeclaratorDecl(D);
874*67e74705SXin Li   Record.AddIdentifierRef(D->getGetterId());
875*67e74705SXin Li   Record.AddIdentifierRef(D->getSetterId());
876*67e74705SXin Li   Code = serialization::DECL_MS_PROPERTY;
877*67e74705SXin Li }
878*67e74705SXin Li 
VisitIndirectFieldDecl(IndirectFieldDecl * D)879*67e74705SXin Li void ASTDeclWriter::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
880*67e74705SXin Li   VisitValueDecl(D);
881*67e74705SXin Li   Record.push_back(D->getChainingSize());
882*67e74705SXin Li 
883*67e74705SXin Li   for (const auto *P : D->chain())
884*67e74705SXin Li     Record.AddDeclRef(P);
885*67e74705SXin Li   Code = serialization::DECL_INDIRECTFIELD;
886*67e74705SXin Li }
887*67e74705SXin Li 
VisitVarDecl(VarDecl * D)888*67e74705SXin Li void ASTDeclWriter::VisitVarDecl(VarDecl *D) {
889*67e74705SXin Li   VisitRedeclarable(D);
890*67e74705SXin Li   VisitDeclaratorDecl(D);
891*67e74705SXin Li   Record.push_back(D->getStorageClass());
892*67e74705SXin Li   Record.push_back(D->getTSCSpec());
893*67e74705SXin Li   Record.push_back(D->getInitStyle());
894*67e74705SXin Li   if (!isa<ParmVarDecl>(D)) {
895*67e74705SXin Li     Record.push_back(D->isExceptionVariable());
896*67e74705SXin Li     Record.push_back(D->isNRVOVariable());
897*67e74705SXin Li     Record.push_back(D->isCXXForRangeDecl());
898*67e74705SXin Li     Record.push_back(D->isARCPseudoStrong());
899*67e74705SXin Li     Record.push_back(D->isInline());
900*67e74705SXin Li     Record.push_back(D->isInlineSpecified());
901*67e74705SXin Li     Record.push_back(D->isConstexpr());
902*67e74705SXin Li     Record.push_back(D->isInitCapture());
903*67e74705SXin Li     Record.push_back(D->isPreviousDeclInSameBlockScope());
904*67e74705SXin Li   }
905*67e74705SXin Li   Record.push_back(D->getLinkageInternal());
906*67e74705SXin Li 
907*67e74705SXin Li   if (D->getInit()) {
908*67e74705SXin Li     Record.push_back(!D->isInitKnownICE() ? 1 : (D->isInitICE() ? 3 : 2));
909*67e74705SXin Li     Record.AddStmt(D->getInit());
910*67e74705SXin Li   } else {
911*67e74705SXin Li     Record.push_back(0);
912*67e74705SXin Li   }
913*67e74705SXin Li 
914*67e74705SXin Li   enum {
915*67e74705SXin Li     VarNotTemplate = 0, VarTemplate, StaticDataMemberSpecialization
916*67e74705SXin Li   };
917*67e74705SXin Li   if (VarTemplateDecl *TemplD = D->getDescribedVarTemplate()) {
918*67e74705SXin Li     Record.push_back(VarTemplate);
919*67e74705SXin Li     Record.AddDeclRef(TemplD);
920*67e74705SXin Li   } else if (MemberSpecializationInfo *SpecInfo
921*67e74705SXin Li                = D->getMemberSpecializationInfo()) {
922*67e74705SXin Li     Record.push_back(StaticDataMemberSpecialization);
923*67e74705SXin Li     Record.AddDeclRef(SpecInfo->getInstantiatedFrom());
924*67e74705SXin Li     Record.push_back(SpecInfo->getTemplateSpecializationKind());
925*67e74705SXin Li     Record.AddSourceLocation(SpecInfo->getPointOfInstantiation());
926*67e74705SXin Li   } else {
927*67e74705SXin Li     Record.push_back(VarNotTemplate);
928*67e74705SXin Li   }
929*67e74705SXin Li 
930*67e74705SXin Li   if (D->getDeclContext() == D->getLexicalDeclContext() &&
931*67e74705SXin Li       !D->hasAttrs() &&
932*67e74705SXin Li       !D->isImplicit() &&
933*67e74705SXin Li       !D->isUsed(false) &&
934*67e74705SXin Li       !D->isInvalidDecl() &&
935*67e74705SXin Li       !D->isReferenced() &&
936*67e74705SXin Li       !D->isTopLevelDeclInObjCContainer() &&
937*67e74705SXin Li       D->getAccess() == AS_none &&
938*67e74705SXin Li       !D->isModulePrivate() &&
939*67e74705SXin Li       !needsAnonymousDeclarationNumber(D) &&
940*67e74705SXin Li       D->getDeclName().getNameKind() == DeclarationName::Identifier &&
941*67e74705SXin Li       !D->hasExtInfo() &&
942*67e74705SXin Li       D->getFirstDecl() == D->getMostRecentDecl() &&
943*67e74705SXin Li       D->getInitStyle() == VarDecl::CInit &&
944*67e74705SXin Li       D->getInit() == nullptr &&
945*67e74705SXin Li       !isa<ParmVarDecl>(D) &&
946*67e74705SXin Li       !isa<VarTemplateSpecializationDecl>(D) &&
947*67e74705SXin Li       !D->isInline() &&
948*67e74705SXin Li       !D->isConstexpr() &&
949*67e74705SXin Li       !D->isInitCapture() &&
950*67e74705SXin Li       !D->isPreviousDeclInSameBlockScope() &&
951*67e74705SXin Li       !D->getMemberSpecializationInfo())
952*67e74705SXin Li     AbbrevToUse = Writer.getDeclVarAbbrev();
953*67e74705SXin Li 
954*67e74705SXin Li   Code = serialization::DECL_VAR;
955*67e74705SXin Li }
956*67e74705SXin Li 
VisitImplicitParamDecl(ImplicitParamDecl * D)957*67e74705SXin Li void ASTDeclWriter::VisitImplicitParamDecl(ImplicitParamDecl *D) {
958*67e74705SXin Li   VisitVarDecl(D);
959*67e74705SXin Li   Code = serialization::DECL_IMPLICIT_PARAM;
960*67e74705SXin Li }
961*67e74705SXin Li 
VisitParmVarDecl(ParmVarDecl * D)962*67e74705SXin Li void ASTDeclWriter::VisitParmVarDecl(ParmVarDecl *D) {
963*67e74705SXin Li   VisitVarDecl(D);
964*67e74705SXin Li   Record.push_back(D->isObjCMethodParameter());
965*67e74705SXin Li   Record.push_back(D->getFunctionScopeDepth());
966*67e74705SXin Li   Record.push_back(D->getFunctionScopeIndex());
967*67e74705SXin Li   Record.push_back(D->getObjCDeclQualifier()); // FIXME: stable encoding
968*67e74705SXin Li   Record.push_back(D->isKNRPromoted());
969*67e74705SXin Li   Record.push_back(D->hasInheritedDefaultArg());
970*67e74705SXin Li   Record.push_back(D->hasUninstantiatedDefaultArg());
971*67e74705SXin Li   if (D->hasUninstantiatedDefaultArg())
972*67e74705SXin Li     Record.AddStmt(D->getUninstantiatedDefaultArg());
973*67e74705SXin Li   Code = serialization::DECL_PARM_VAR;
974*67e74705SXin Li 
975*67e74705SXin Li   assert(!D->isARCPseudoStrong()); // can be true of ImplicitParamDecl
976*67e74705SXin Li 
977*67e74705SXin Li   // If the assumptions about the DECL_PARM_VAR abbrev are true, use it.  Here
978*67e74705SXin Li   // we dynamically check for the properties that we optimize for, but don't
979*67e74705SXin Li   // know are true of all PARM_VAR_DECLs.
980*67e74705SXin Li   if (D->getDeclContext() == D->getLexicalDeclContext() &&
981*67e74705SXin Li       !D->hasAttrs() &&
982*67e74705SXin Li       !D->hasExtInfo() &&
983*67e74705SXin Li       !D->isImplicit() &&
984*67e74705SXin Li       !D->isUsed(false) &&
985*67e74705SXin Li       !D->isInvalidDecl() &&
986*67e74705SXin Li       !D->isReferenced() &&
987*67e74705SXin Li       D->getAccess() == AS_none &&
988*67e74705SXin Li       !D->isModulePrivate() &&
989*67e74705SXin Li       D->getStorageClass() == 0 &&
990*67e74705SXin Li       D->getInitStyle() == VarDecl::CInit && // Can params have anything else?
991*67e74705SXin Li       D->getFunctionScopeDepth() == 0 &&
992*67e74705SXin Li       D->getObjCDeclQualifier() == 0 &&
993*67e74705SXin Li       !D->isKNRPromoted() &&
994*67e74705SXin Li       !D->hasInheritedDefaultArg() &&
995*67e74705SXin Li       D->getInit() == nullptr &&
996*67e74705SXin Li       !D->hasUninstantiatedDefaultArg())  // No default expr.
997*67e74705SXin Li     AbbrevToUse = Writer.getDeclParmVarAbbrev();
998*67e74705SXin Li 
999*67e74705SXin Li   // Check things we know are true of *every* PARM_VAR_DECL, which is more than
1000*67e74705SXin Li   // just us assuming it.
1001*67e74705SXin Li   assert(!D->getTSCSpec() && "PARM_VAR_DECL can't use TLS");
1002*67e74705SXin Li   assert(D->getAccess() == AS_none && "PARM_VAR_DECL can't be public/private");
1003*67e74705SXin Li   assert(!D->isExceptionVariable() && "PARM_VAR_DECL can't be exception var");
1004*67e74705SXin Li   assert(D->getPreviousDecl() == nullptr && "PARM_VAR_DECL can't be redecl");
1005*67e74705SXin Li   assert(!D->isStaticDataMember() &&
1006*67e74705SXin Li          "PARM_VAR_DECL can't be static data member");
1007*67e74705SXin Li }
1008*67e74705SXin Li 
VisitFileScopeAsmDecl(FileScopeAsmDecl * D)1009*67e74705SXin Li void ASTDeclWriter::VisitFileScopeAsmDecl(FileScopeAsmDecl *D) {
1010*67e74705SXin Li   VisitDecl(D);
1011*67e74705SXin Li   Record.AddStmt(D->getAsmString());
1012*67e74705SXin Li   Record.AddSourceLocation(D->getRParenLoc());
1013*67e74705SXin Li   Code = serialization::DECL_FILE_SCOPE_ASM;
1014*67e74705SXin Li }
1015*67e74705SXin Li 
VisitEmptyDecl(EmptyDecl * D)1016*67e74705SXin Li void ASTDeclWriter::VisitEmptyDecl(EmptyDecl *D) {
1017*67e74705SXin Li   VisitDecl(D);
1018*67e74705SXin Li   Code = serialization::DECL_EMPTY;
1019*67e74705SXin Li }
1020*67e74705SXin Li 
VisitBlockDecl(BlockDecl * D)1021*67e74705SXin Li void ASTDeclWriter::VisitBlockDecl(BlockDecl *D) {
1022*67e74705SXin Li   VisitDecl(D);
1023*67e74705SXin Li   Record.AddStmt(D->getBody());
1024*67e74705SXin Li   Record.AddTypeSourceInfo(D->getSignatureAsWritten());
1025*67e74705SXin Li   Record.push_back(D->param_size());
1026*67e74705SXin Li   for (ParmVarDecl *P : D->parameters())
1027*67e74705SXin Li     Record.AddDeclRef(P);
1028*67e74705SXin Li   Record.push_back(D->isVariadic());
1029*67e74705SXin Li   Record.push_back(D->blockMissingReturnType());
1030*67e74705SXin Li   Record.push_back(D->isConversionFromLambda());
1031*67e74705SXin Li   Record.push_back(D->capturesCXXThis());
1032*67e74705SXin Li   Record.push_back(D->getNumCaptures());
1033*67e74705SXin Li   for (const auto &capture : D->captures()) {
1034*67e74705SXin Li     Record.AddDeclRef(capture.getVariable());
1035*67e74705SXin Li 
1036*67e74705SXin Li     unsigned flags = 0;
1037*67e74705SXin Li     if (capture.isByRef()) flags |= 1;
1038*67e74705SXin Li     if (capture.isNested()) flags |= 2;
1039*67e74705SXin Li     if (capture.hasCopyExpr()) flags |= 4;
1040*67e74705SXin Li     Record.push_back(flags);
1041*67e74705SXin Li 
1042*67e74705SXin Li     if (capture.hasCopyExpr()) Record.AddStmt(capture.getCopyExpr());
1043*67e74705SXin Li   }
1044*67e74705SXin Li 
1045*67e74705SXin Li   Code = serialization::DECL_BLOCK;
1046*67e74705SXin Li }
1047*67e74705SXin Li 
VisitCapturedDecl(CapturedDecl * CD)1048*67e74705SXin Li void ASTDeclWriter::VisitCapturedDecl(CapturedDecl *CD) {
1049*67e74705SXin Li   Record.push_back(CD->getNumParams());
1050*67e74705SXin Li   VisitDecl(CD);
1051*67e74705SXin Li   Record.push_back(CD->getContextParamPosition());
1052*67e74705SXin Li   Record.push_back(CD->isNothrow() ? 1 : 0);
1053*67e74705SXin Li   // Body is stored by VisitCapturedStmt.
1054*67e74705SXin Li   for (unsigned I = 0; I < CD->getNumParams(); ++I)
1055*67e74705SXin Li     Record.AddDeclRef(CD->getParam(I));
1056*67e74705SXin Li   Code = serialization::DECL_CAPTURED;
1057*67e74705SXin Li }
1058*67e74705SXin Li 
VisitLinkageSpecDecl(LinkageSpecDecl * D)1059*67e74705SXin Li void ASTDeclWriter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
1060*67e74705SXin Li   VisitDecl(D);
1061*67e74705SXin Li   Record.push_back(D->getLanguage());
1062*67e74705SXin Li   Record.AddSourceLocation(D->getExternLoc());
1063*67e74705SXin Li   Record.AddSourceLocation(D->getRBraceLoc());
1064*67e74705SXin Li   Code = serialization::DECL_LINKAGE_SPEC;
1065*67e74705SXin Li }
1066*67e74705SXin Li 
VisitLabelDecl(LabelDecl * D)1067*67e74705SXin Li void ASTDeclWriter::VisitLabelDecl(LabelDecl *D) {
1068*67e74705SXin Li   VisitNamedDecl(D);
1069*67e74705SXin Li   Record.AddSourceLocation(D->getLocStart());
1070*67e74705SXin Li   Code = serialization::DECL_LABEL;
1071*67e74705SXin Li }
1072*67e74705SXin Li 
1073*67e74705SXin Li 
VisitNamespaceDecl(NamespaceDecl * D)1074*67e74705SXin Li void ASTDeclWriter::VisitNamespaceDecl(NamespaceDecl *D) {
1075*67e74705SXin Li   VisitRedeclarable(D);
1076*67e74705SXin Li   VisitNamedDecl(D);
1077*67e74705SXin Li   Record.push_back(D->isInline());
1078*67e74705SXin Li   Record.AddSourceLocation(D->getLocStart());
1079*67e74705SXin Li   Record.AddSourceLocation(D->getRBraceLoc());
1080*67e74705SXin Li 
1081*67e74705SXin Li   if (D->isOriginalNamespace())
1082*67e74705SXin Li     Record.AddDeclRef(D->getAnonymousNamespace());
1083*67e74705SXin Li   Code = serialization::DECL_NAMESPACE;
1084*67e74705SXin Li 
1085*67e74705SXin Li   if (Writer.hasChain() && D->isAnonymousNamespace() &&
1086*67e74705SXin Li       D == D->getMostRecentDecl()) {
1087*67e74705SXin Li     // This is a most recent reopening of the anonymous namespace. If its parent
1088*67e74705SXin Li     // is in a previous PCH (or is the TU), mark that parent for update, because
1089*67e74705SXin Li     // the original namespace always points to the latest re-opening of its
1090*67e74705SXin Li     // anonymous namespace.
1091*67e74705SXin Li     Decl *Parent = cast<Decl>(
1092*67e74705SXin Li         D->getParent()->getRedeclContext()->getPrimaryContext());
1093*67e74705SXin Li     if (Parent->isFromASTFile() || isa<TranslationUnitDecl>(Parent)) {
1094*67e74705SXin Li       Writer.DeclUpdates[Parent].push_back(
1095*67e74705SXin Li           ASTWriter::DeclUpdate(UPD_CXX_ADDED_ANONYMOUS_NAMESPACE, D));
1096*67e74705SXin Li     }
1097*67e74705SXin Li   }
1098*67e74705SXin Li }
1099*67e74705SXin Li 
VisitNamespaceAliasDecl(NamespaceAliasDecl * D)1100*67e74705SXin Li void ASTDeclWriter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
1101*67e74705SXin Li   VisitRedeclarable(D);
1102*67e74705SXin Li   VisitNamedDecl(D);
1103*67e74705SXin Li   Record.AddSourceLocation(D->getNamespaceLoc());
1104*67e74705SXin Li   Record.AddSourceLocation(D->getTargetNameLoc());
1105*67e74705SXin Li   Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());
1106*67e74705SXin Li   Record.AddDeclRef(D->getNamespace());
1107*67e74705SXin Li   Code = serialization::DECL_NAMESPACE_ALIAS;
1108*67e74705SXin Li }
1109*67e74705SXin Li 
VisitUsingDecl(UsingDecl * D)1110*67e74705SXin Li void ASTDeclWriter::VisitUsingDecl(UsingDecl *D) {
1111*67e74705SXin Li   VisitNamedDecl(D);
1112*67e74705SXin Li   Record.AddSourceLocation(D->getUsingLoc());
1113*67e74705SXin Li   Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());
1114*67e74705SXin Li   Record.AddDeclarationNameLoc(D->DNLoc, D->getDeclName());
1115*67e74705SXin Li   Record.AddDeclRef(D->FirstUsingShadow.getPointer());
1116*67e74705SXin Li   Record.push_back(D->hasTypename());
1117*67e74705SXin Li   Record.AddDeclRef(Context.getInstantiatedFromUsingDecl(D));
1118*67e74705SXin Li   Code = serialization::DECL_USING;
1119*67e74705SXin Li }
1120*67e74705SXin Li 
VisitUsingShadowDecl(UsingShadowDecl * D)1121*67e74705SXin Li void ASTDeclWriter::VisitUsingShadowDecl(UsingShadowDecl *D) {
1122*67e74705SXin Li   VisitRedeclarable(D);
1123*67e74705SXin Li   VisitNamedDecl(D);
1124*67e74705SXin Li   Record.AddDeclRef(D->getTargetDecl());
1125*67e74705SXin Li   Record.AddDeclRef(D->UsingOrNextShadow);
1126*67e74705SXin Li   Record.AddDeclRef(Context.getInstantiatedFromUsingShadowDecl(D));
1127*67e74705SXin Li   Code = serialization::DECL_USING_SHADOW;
1128*67e74705SXin Li }
1129*67e74705SXin Li 
VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl * D)1130*67e74705SXin Li void ASTDeclWriter::VisitConstructorUsingShadowDecl(
1131*67e74705SXin Li     ConstructorUsingShadowDecl *D) {
1132*67e74705SXin Li   VisitUsingShadowDecl(D);
1133*67e74705SXin Li   Record.AddDeclRef(D->NominatedBaseClassShadowDecl);
1134*67e74705SXin Li   Record.AddDeclRef(D->ConstructedBaseClassShadowDecl);
1135*67e74705SXin Li   Record.push_back(D->IsVirtual);
1136*67e74705SXin Li   Code = serialization::DECL_CONSTRUCTOR_USING_SHADOW;
1137*67e74705SXin Li }
1138*67e74705SXin Li 
VisitUsingDirectiveDecl(UsingDirectiveDecl * D)1139*67e74705SXin Li void ASTDeclWriter::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
1140*67e74705SXin Li   VisitNamedDecl(D);
1141*67e74705SXin Li   Record.AddSourceLocation(D->getUsingLoc());
1142*67e74705SXin Li   Record.AddSourceLocation(D->getNamespaceKeyLocation());
1143*67e74705SXin Li   Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());
1144*67e74705SXin Li   Record.AddDeclRef(D->getNominatedNamespace());
1145*67e74705SXin Li   Record.AddDeclRef(dyn_cast<Decl>(D->getCommonAncestor()));
1146*67e74705SXin Li   Code = serialization::DECL_USING_DIRECTIVE;
1147*67e74705SXin Li }
1148*67e74705SXin Li 
VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl * D)1149*67e74705SXin Li void ASTDeclWriter::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
1150*67e74705SXin Li   VisitValueDecl(D);
1151*67e74705SXin Li   Record.AddSourceLocation(D->getUsingLoc());
1152*67e74705SXin Li   Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());
1153*67e74705SXin Li   Record.AddDeclarationNameLoc(D->DNLoc, D->getDeclName());
1154*67e74705SXin Li   Code = serialization::DECL_UNRESOLVED_USING_VALUE;
1155*67e74705SXin Li }
1156*67e74705SXin Li 
VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl * D)1157*67e74705SXin Li void ASTDeclWriter::VisitUnresolvedUsingTypenameDecl(
1158*67e74705SXin Li                                                UnresolvedUsingTypenameDecl *D) {
1159*67e74705SXin Li   VisitTypeDecl(D);
1160*67e74705SXin Li   Record.AddSourceLocation(D->getTypenameLoc());
1161*67e74705SXin Li   Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());
1162*67e74705SXin Li   Code = serialization::DECL_UNRESOLVED_USING_TYPENAME;
1163*67e74705SXin Li }
1164*67e74705SXin Li 
VisitCXXRecordDecl(CXXRecordDecl * D)1165*67e74705SXin Li void ASTDeclWriter::VisitCXXRecordDecl(CXXRecordDecl *D) {
1166*67e74705SXin Li   VisitRecordDecl(D);
1167*67e74705SXin Li 
1168*67e74705SXin Li   enum {
1169*67e74705SXin Li     CXXRecNotTemplate = 0, CXXRecTemplate, CXXRecMemberSpecialization
1170*67e74705SXin Li   };
1171*67e74705SXin Li   if (ClassTemplateDecl *TemplD = D->getDescribedClassTemplate()) {
1172*67e74705SXin Li     Record.push_back(CXXRecTemplate);
1173*67e74705SXin Li     Record.AddDeclRef(TemplD);
1174*67e74705SXin Li   } else if (MemberSpecializationInfo *MSInfo
1175*67e74705SXin Li                = D->getMemberSpecializationInfo()) {
1176*67e74705SXin Li     Record.push_back(CXXRecMemberSpecialization);
1177*67e74705SXin Li     Record.AddDeclRef(MSInfo->getInstantiatedFrom());
1178*67e74705SXin Li     Record.push_back(MSInfo->getTemplateSpecializationKind());
1179*67e74705SXin Li     Record.AddSourceLocation(MSInfo->getPointOfInstantiation());
1180*67e74705SXin Li   } else {
1181*67e74705SXin Li     Record.push_back(CXXRecNotTemplate);
1182*67e74705SXin Li   }
1183*67e74705SXin Li 
1184*67e74705SXin Li   Record.push_back(D->isThisDeclarationADefinition());
1185*67e74705SXin Li   if (D->isThisDeclarationADefinition())
1186*67e74705SXin Li     Record.AddCXXDefinitionData(D);
1187*67e74705SXin Li 
1188*67e74705SXin Li   // Store (what we currently believe to be) the key function to avoid
1189*67e74705SXin Li   // deserializing every method so we can compute it.
1190*67e74705SXin Li   if (D->IsCompleteDefinition)
1191*67e74705SXin Li     Record.AddDeclRef(Context.getCurrentKeyFunction(D));
1192*67e74705SXin Li 
1193*67e74705SXin Li   Code = serialization::DECL_CXX_RECORD;
1194*67e74705SXin Li }
1195*67e74705SXin Li 
VisitCXXMethodDecl(CXXMethodDecl * D)1196*67e74705SXin Li void ASTDeclWriter::VisitCXXMethodDecl(CXXMethodDecl *D) {
1197*67e74705SXin Li   VisitFunctionDecl(D);
1198*67e74705SXin Li   if (D->isCanonicalDecl()) {
1199*67e74705SXin Li     Record.push_back(D->size_overridden_methods());
1200*67e74705SXin Li     for (CXXMethodDecl::method_iterator
1201*67e74705SXin Li            I = D->begin_overridden_methods(), E = D->end_overridden_methods();
1202*67e74705SXin Li            I != E; ++I)
1203*67e74705SXin Li       Record.AddDeclRef(*I);
1204*67e74705SXin Li   } else {
1205*67e74705SXin Li     // We only need to record overridden methods once for the canonical decl.
1206*67e74705SXin Li     Record.push_back(0);
1207*67e74705SXin Li   }
1208*67e74705SXin Li 
1209*67e74705SXin Li   if (D->getDeclContext() == D->getLexicalDeclContext() &&
1210*67e74705SXin Li       D->getFirstDecl() == D->getMostRecentDecl() &&
1211*67e74705SXin Li       !D->isInvalidDecl() &&
1212*67e74705SXin Li       !D->hasAttrs() &&
1213*67e74705SXin Li       !D->isTopLevelDeclInObjCContainer() &&
1214*67e74705SXin Li       D->getDeclName().getNameKind() == DeclarationName::Identifier &&
1215*67e74705SXin Li       !D->hasExtInfo() &&
1216*67e74705SXin Li       !D->hasInheritedPrototype() &&
1217*67e74705SXin Li       D->hasWrittenPrototype())
1218*67e74705SXin Li     AbbrevToUse = Writer.getDeclCXXMethodAbbrev();
1219*67e74705SXin Li 
1220*67e74705SXin Li   Code = serialization::DECL_CXX_METHOD;
1221*67e74705SXin Li }
1222*67e74705SXin Li 
VisitCXXConstructorDecl(CXXConstructorDecl * D)1223*67e74705SXin Li void ASTDeclWriter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
1224*67e74705SXin Li   if (auto Inherited = D->getInheritedConstructor()) {
1225*67e74705SXin Li     Record.AddDeclRef(Inherited.getShadowDecl());
1226*67e74705SXin Li     Record.AddDeclRef(Inherited.getConstructor());
1227*67e74705SXin Li     Code = serialization::DECL_CXX_INHERITED_CONSTRUCTOR;
1228*67e74705SXin Li   } else {
1229*67e74705SXin Li     Code = serialization::DECL_CXX_CONSTRUCTOR;
1230*67e74705SXin Li   }
1231*67e74705SXin Li 
1232*67e74705SXin Li   VisitCXXMethodDecl(D);
1233*67e74705SXin Li 
1234*67e74705SXin Li   Record.push_back(D->IsExplicitSpecified);
1235*67e74705SXin Li 
1236*67e74705SXin Li   Code = D->isInheritingConstructor()
1237*67e74705SXin Li              ? serialization::DECL_CXX_INHERITED_CONSTRUCTOR
1238*67e74705SXin Li              : serialization::DECL_CXX_CONSTRUCTOR;
1239*67e74705SXin Li }
1240*67e74705SXin Li 
VisitCXXDestructorDecl(CXXDestructorDecl * D)1241*67e74705SXin Li void ASTDeclWriter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
1242*67e74705SXin Li   VisitCXXMethodDecl(D);
1243*67e74705SXin Li 
1244*67e74705SXin Li   Record.AddDeclRef(D->getOperatorDelete());
1245*67e74705SXin Li 
1246*67e74705SXin Li   Code = serialization::DECL_CXX_DESTRUCTOR;
1247*67e74705SXin Li }
1248*67e74705SXin Li 
VisitCXXConversionDecl(CXXConversionDecl * D)1249*67e74705SXin Li void ASTDeclWriter::VisitCXXConversionDecl(CXXConversionDecl *D) {
1250*67e74705SXin Li   VisitCXXMethodDecl(D);
1251*67e74705SXin Li   Record.push_back(D->IsExplicitSpecified);
1252*67e74705SXin Li   Code = serialization::DECL_CXX_CONVERSION;
1253*67e74705SXin Li }
1254*67e74705SXin Li 
VisitImportDecl(ImportDecl * D)1255*67e74705SXin Li void ASTDeclWriter::VisitImportDecl(ImportDecl *D) {
1256*67e74705SXin Li   VisitDecl(D);
1257*67e74705SXin Li   Record.push_back(Writer.getSubmoduleID(D->getImportedModule()));
1258*67e74705SXin Li   ArrayRef<SourceLocation> IdentifierLocs = D->getIdentifierLocs();
1259*67e74705SXin Li   Record.push_back(!IdentifierLocs.empty());
1260*67e74705SXin Li   if (IdentifierLocs.empty()) {
1261*67e74705SXin Li     Record.AddSourceLocation(D->getLocEnd());
1262*67e74705SXin Li     Record.push_back(1);
1263*67e74705SXin Li   } else {
1264*67e74705SXin Li     for (unsigned I = 0, N = IdentifierLocs.size(); I != N; ++I)
1265*67e74705SXin Li       Record.AddSourceLocation(IdentifierLocs[I]);
1266*67e74705SXin Li     Record.push_back(IdentifierLocs.size());
1267*67e74705SXin Li   }
1268*67e74705SXin Li   // Note: the number of source locations must always be the last element in
1269*67e74705SXin Li   // the record.
1270*67e74705SXin Li   Code = serialization::DECL_IMPORT;
1271*67e74705SXin Li }
1272*67e74705SXin Li 
VisitAccessSpecDecl(AccessSpecDecl * D)1273*67e74705SXin Li void ASTDeclWriter::VisitAccessSpecDecl(AccessSpecDecl *D) {
1274*67e74705SXin Li   VisitDecl(D);
1275*67e74705SXin Li   Record.AddSourceLocation(D->getColonLoc());
1276*67e74705SXin Li   Code = serialization::DECL_ACCESS_SPEC;
1277*67e74705SXin Li }
1278*67e74705SXin Li 
VisitFriendDecl(FriendDecl * D)1279*67e74705SXin Li void ASTDeclWriter::VisitFriendDecl(FriendDecl *D) {
1280*67e74705SXin Li   // Record the number of friend type template parameter lists here
1281*67e74705SXin Li   // so as to simplify memory allocation during deserialization.
1282*67e74705SXin Li   Record.push_back(D->NumTPLists);
1283*67e74705SXin Li   VisitDecl(D);
1284*67e74705SXin Li   bool hasFriendDecl = D->Friend.is<NamedDecl*>();
1285*67e74705SXin Li   Record.push_back(hasFriendDecl);
1286*67e74705SXin Li   if (hasFriendDecl)
1287*67e74705SXin Li     Record.AddDeclRef(D->getFriendDecl());
1288*67e74705SXin Li   else
1289*67e74705SXin Li     Record.AddTypeSourceInfo(D->getFriendType());
1290*67e74705SXin Li   for (unsigned i = 0; i < D->NumTPLists; ++i)
1291*67e74705SXin Li     Record.AddTemplateParameterList(D->getFriendTypeTemplateParameterList(i));
1292*67e74705SXin Li   Record.AddDeclRef(D->getNextFriend());
1293*67e74705SXin Li   Record.push_back(D->UnsupportedFriend);
1294*67e74705SXin Li   Record.AddSourceLocation(D->FriendLoc);
1295*67e74705SXin Li   Code = serialization::DECL_FRIEND;
1296*67e74705SXin Li }
1297*67e74705SXin Li 
VisitFriendTemplateDecl(FriendTemplateDecl * D)1298*67e74705SXin Li void ASTDeclWriter::VisitFriendTemplateDecl(FriendTemplateDecl *D) {
1299*67e74705SXin Li   VisitDecl(D);
1300*67e74705SXin Li   Record.push_back(D->getNumTemplateParameters());
1301*67e74705SXin Li   for (unsigned i = 0, e = D->getNumTemplateParameters(); i != e; ++i)
1302*67e74705SXin Li     Record.AddTemplateParameterList(D->getTemplateParameterList(i));
1303*67e74705SXin Li   Record.push_back(D->getFriendDecl() != nullptr);
1304*67e74705SXin Li   if (D->getFriendDecl())
1305*67e74705SXin Li     Record.AddDeclRef(D->getFriendDecl());
1306*67e74705SXin Li   else
1307*67e74705SXin Li     Record.AddTypeSourceInfo(D->getFriendType());
1308*67e74705SXin Li   Record.AddSourceLocation(D->getFriendLoc());
1309*67e74705SXin Li   Code = serialization::DECL_FRIEND_TEMPLATE;
1310*67e74705SXin Li }
1311*67e74705SXin Li 
VisitTemplateDecl(TemplateDecl * D)1312*67e74705SXin Li void ASTDeclWriter::VisitTemplateDecl(TemplateDecl *D) {
1313*67e74705SXin Li   VisitNamedDecl(D);
1314*67e74705SXin Li 
1315*67e74705SXin Li   Record.AddDeclRef(D->getTemplatedDecl());
1316*67e74705SXin Li   Record.AddTemplateParameterList(D->getTemplateParameters());
1317*67e74705SXin Li }
1318*67e74705SXin Li 
VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl * D)1319*67e74705SXin Li void ASTDeclWriter::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) {
1320*67e74705SXin Li   VisitRedeclarable(D);
1321*67e74705SXin Li 
1322*67e74705SXin Li   // Emit data to initialize CommonOrPrev before VisitTemplateDecl so that
1323*67e74705SXin Li   // getCommonPtr() can be used while this is still initializing.
1324*67e74705SXin Li   if (D->isFirstDecl()) {
1325*67e74705SXin Li     // This declaration owns the 'common' pointer, so serialize that data now.
1326*67e74705SXin Li     Record.AddDeclRef(D->getInstantiatedFromMemberTemplate());
1327*67e74705SXin Li     if (D->getInstantiatedFromMemberTemplate())
1328*67e74705SXin Li       Record.push_back(D->isMemberSpecialization());
1329*67e74705SXin Li   }
1330*67e74705SXin Li 
1331*67e74705SXin Li   VisitTemplateDecl(D);
1332*67e74705SXin Li   Record.push_back(D->getIdentifierNamespace());
1333*67e74705SXin Li }
1334*67e74705SXin Li 
VisitClassTemplateDecl(ClassTemplateDecl * D)1335*67e74705SXin Li void ASTDeclWriter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
1336*67e74705SXin Li   VisitRedeclarableTemplateDecl(D);
1337*67e74705SXin Li 
1338*67e74705SXin Li   if (D->isFirstDecl())
1339*67e74705SXin Li     AddTemplateSpecializations(D);
1340*67e74705SXin Li   Code = serialization::DECL_CLASS_TEMPLATE;
1341*67e74705SXin Li }
1342*67e74705SXin Li 
VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl * D)1343*67e74705SXin Li void ASTDeclWriter::VisitClassTemplateSpecializationDecl(
1344*67e74705SXin Li                                            ClassTemplateSpecializationDecl *D) {
1345*67e74705SXin Li   RegisterTemplateSpecialization(D->getSpecializedTemplate(), D);
1346*67e74705SXin Li 
1347*67e74705SXin Li   VisitCXXRecordDecl(D);
1348*67e74705SXin Li 
1349*67e74705SXin Li   llvm::PointerUnion<ClassTemplateDecl *,
1350*67e74705SXin Li                      ClassTemplatePartialSpecializationDecl *> InstFrom
1351*67e74705SXin Li     = D->getSpecializedTemplateOrPartial();
1352*67e74705SXin Li   if (Decl *InstFromD = InstFrom.dyn_cast<ClassTemplateDecl *>()) {
1353*67e74705SXin Li     Record.AddDeclRef(InstFromD);
1354*67e74705SXin Li   } else {
1355*67e74705SXin Li     Record.AddDeclRef(InstFrom.get<ClassTemplatePartialSpecializationDecl *>());
1356*67e74705SXin Li     Record.AddTemplateArgumentList(&D->getTemplateInstantiationArgs());
1357*67e74705SXin Li   }
1358*67e74705SXin Li 
1359*67e74705SXin Li   Record.AddTemplateArgumentList(&D->getTemplateArgs());
1360*67e74705SXin Li   Record.AddSourceLocation(D->getPointOfInstantiation());
1361*67e74705SXin Li   Record.push_back(D->getSpecializationKind());
1362*67e74705SXin Li   Record.push_back(D->isCanonicalDecl());
1363*67e74705SXin Li 
1364*67e74705SXin Li   if (D->isCanonicalDecl()) {
1365*67e74705SXin Li     // When reading, we'll add it to the folding set of the following template.
1366*67e74705SXin Li     Record.AddDeclRef(D->getSpecializedTemplate()->getCanonicalDecl());
1367*67e74705SXin Li   }
1368*67e74705SXin Li 
1369*67e74705SXin Li   // Explicit info.
1370*67e74705SXin Li   Record.AddTypeSourceInfo(D->getTypeAsWritten());
1371*67e74705SXin Li   if (D->getTypeAsWritten()) {
1372*67e74705SXin Li     Record.AddSourceLocation(D->getExternLoc());
1373*67e74705SXin Li     Record.AddSourceLocation(D->getTemplateKeywordLoc());
1374*67e74705SXin Li   }
1375*67e74705SXin Li 
1376*67e74705SXin Li   Code = serialization::DECL_CLASS_TEMPLATE_SPECIALIZATION;
1377*67e74705SXin Li }
1378*67e74705SXin Li 
VisitClassTemplatePartialSpecializationDecl(ClassTemplatePartialSpecializationDecl * D)1379*67e74705SXin Li void ASTDeclWriter::VisitClassTemplatePartialSpecializationDecl(
1380*67e74705SXin Li                                     ClassTemplatePartialSpecializationDecl *D) {
1381*67e74705SXin Li   VisitClassTemplateSpecializationDecl(D);
1382*67e74705SXin Li 
1383*67e74705SXin Li   Record.AddTemplateParameterList(D->getTemplateParameters());
1384*67e74705SXin Li   Record.AddASTTemplateArgumentListInfo(D->getTemplateArgsAsWritten());
1385*67e74705SXin Li 
1386*67e74705SXin Li   // These are read/set from/to the first declaration.
1387*67e74705SXin Li   if (D->getPreviousDecl() == nullptr) {
1388*67e74705SXin Li     Record.AddDeclRef(D->getInstantiatedFromMember());
1389*67e74705SXin Li     Record.push_back(D->isMemberSpecialization());
1390*67e74705SXin Li   }
1391*67e74705SXin Li 
1392*67e74705SXin Li   Code = serialization::DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION;
1393*67e74705SXin Li }
1394*67e74705SXin Li 
VisitVarTemplateDecl(VarTemplateDecl * D)1395*67e74705SXin Li void ASTDeclWriter::VisitVarTemplateDecl(VarTemplateDecl *D) {
1396*67e74705SXin Li   VisitRedeclarableTemplateDecl(D);
1397*67e74705SXin Li 
1398*67e74705SXin Li   if (D->isFirstDecl())
1399*67e74705SXin Li     AddTemplateSpecializations(D);
1400*67e74705SXin Li   Code = serialization::DECL_VAR_TEMPLATE;
1401*67e74705SXin Li }
1402*67e74705SXin Li 
VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl * D)1403*67e74705SXin Li void ASTDeclWriter::VisitVarTemplateSpecializationDecl(
1404*67e74705SXin Li     VarTemplateSpecializationDecl *D) {
1405*67e74705SXin Li   RegisterTemplateSpecialization(D->getSpecializedTemplate(), D);
1406*67e74705SXin Li 
1407*67e74705SXin Li   VisitVarDecl(D);
1408*67e74705SXin Li 
1409*67e74705SXin Li   llvm::PointerUnion<VarTemplateDecl *, VarTemplatePartialSpecializationDecl *>
1410*67e74705SXin Li   InstFrom = D->getSpecializedTemplateOrPartial();
1411*67e74705SXin Li   if (Decl *InstFromD = InstFrom.dyn_cast<VarTemplateDecl *>()) {
1412*67e74705SXin Li     Record.AddDeclRef(InstFromD);
1413*67e74705SXin Li   } else {
1414*67e74705SXin Li     Record.AddDeclRef(InstFrom.get<VarTemplatePartialSpecializationDecl *>());
1415*67e74705SXin Li     Record.AddTemplateArgumentList(&D->getTemplateInstantiationArgs());
1416*67e74705SXin Li   }
1417*67e74705SXin Li 
1418*67e74705SXin Li   // Explicit info.
1419*67e74705SXin Li   Record.AddTypeSourceInfo(D->getTypeAsWritten());
1420*67e74705SXin Li   if (D->getTypeAsWritten()) {
1421*67e74705SXin Li     Record.AddSourceLocation(D->getExternLoc());
1422*67e74705SXin Li     Record.AddSourceLocation(D->getTemplateKeywordLoc());
1423*67e74705SXin Li   }
1424*67e74705SXin Li 
1425*67e74705SXin Li   Record.AddTemplateArgumentList(&D->getTemplateArgs());
1426*67e74705SXin Li   Record.AddSourceLocation(D->getPointOfInstantiation());
1427*67e74705SXin Li   Record.push_back(D->getSpecializationKind());
1428*67e74705SXin Li   Record.push_back(D->isCanonicalDecl());
1429*67e74705SXin Li 
1430*67e74705SXin Li   if (D->isCanonicalDecl()) {
1431*67e74705SXin Li     // When reading, we'll add it to the folding set of the following template.
1432*67e74705SXin Li     Record.AddDeclRef(D->getSpecializedTemplate()->getCanonicalDecl());
1433*67e74705SXin Li   }
1434*67e74705SXin Li 
1435*67e74705SXin Li   Code = serialization::DECL_VAR_TEMPLATE_SPECIALIZATION;
1436*67e74705SXin Li }
1437*67e74705SXin Li 
VisitVarTemplatePartialSpecializationDecl(VarTemplatePartialSpecializationDecl * D)1438*67e74705SXin Li void ASTDeclWriter::VisitVarTemplatePartialSpecializationDecl(
1439*67e74705SXin Li     VarTemplatePartialSpecializationDecl *D) {
1440*67e74705SXin Li   VisitVarTemplateSpecializationDecl(D);
1441*67e74705SXin Li 
1442*67e74705SXin Li   Record.AddTemplateParameterList(D->getTemplateParameters());
1443*67e74705SXin Li   Record.AddASTTemplateArgumentListInfo(D->getTemplateArgsAsWritten());
1444*67e74705SXin Li 
1445*67e74705SXin Li   // These are read/set from/to the first declaration.
1446*67e74705SXin Li   if (D->getPreviousDecl() == nullptr) {
1447*67e74705SXin Li     Record.AddDeclRef(D->getInstantiatedFromMember());
1448*67e74705SXin Li     Record.push_back(D->isMemberSpecialization());
1449*67e74705SXin Li   }
1450*67e74705SXin Li 
1451*67e74705SXin Li   Code = serialization::DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION;
1452*67e74705SXin Li }
1453*67e74705SXin Li 
VisitClassScopeFunctionSpecializationDecl(ClassScopeFunctionSpecializationDecl * D)1454*67e74705SXin Li void ASTDeclWriter::VisitClassScopeFunctionSpecializationDecl(
1455*67e74705SXin Li                                     ClassScopeFunctionSpecializationDecl *D) {
1456*67e74705SXin Li   VisitDecl(D);
1457*67e74705SXin Li   Record.AddDeclRef(D->getSpecialization());
1458*67e74705SXin Li   Code = serialization::DECL_CLASS_SCOPE_FUNCTION_SPECIALIZATION;
1459*67e74705SXin Li }
1460*67e74705SXin Li 
1461*67e74705SXin Li 
VisitFunctionTemplateDecl(FunctionTemplateDecl * D)1462*67e74705SXin Li void ASTDeclWriter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
1463*67e74705SXin Li   VisitRedeclarableTemplateDecl(D);
1464*67e74705SXin Li 
1465*67e74705SXin Li   if (D->isFirstDecl())
1466*67e74705SXin Li     AddTemplateSpecializations(D);
1467*67e74705SXin Li   Code = serialization::DECL_FUNCTION_TEMPLATE;
1468*67e74705SXin Li }
1469*67e74705SXin Li 
VisitTemplateTypeParmDecl(TemplateTypeParmDecl * D)1470*67e74705SXin Li void ASTDeclWriter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
1471*67e74705SXin Li   VisitTypeDecl(D);
1472*67e74705SXin Li 
1473*67e74705SXin Li   Record.push_back(D->wasDeclaredWithTypename());
1474*67e74705SXin Li 
1475*67e74705SXin Li   bool OwnsDefaultArg = D->hasDefaultArgument() &&
1476*67e74705SXin Li                         !D->defaultArgumentWasInherited();
1477*67e74705SXin Li   Record.push_back(OwnsDefaultArg);
1478*67e74705SXin Li   if (OwnsDefaultArg)
1479*67e74705SXin Li     Record.AddTypeSourceInfo(D->getDefaultArgumentInfo());
1480*67e74705SXin Li 
1481*67e74705SXin Li   Code = serialization::DECL_TEMPLATE_TYPE_PARM;
1482*67e74705SXin Li }
1483*67e74705SXin Li 
VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl * D)1484*67e74705SXin Li void ASTDeclWriter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
1485*67e74705SXin Li   // For an expanded parameter pack, record the number of expansion types here
1486*67e74705SXin Li   // so that it's easier for deserialization to allocate the right amount of
1487*67e74705SXin Li   // memory.
1488*67e74705SXin Li   if (D->isExpandedParameterPack())
1489*67e74705SXin Li     Record.push_back(D->getNumExpansionTypes());
1490*67e74705SXin Li 
1491*67e74705SXin Li   VisitDeclaratorDecl(D);
1492*67e74705SXin Li   // TemplateParmPosition.
1493*67e74705SXin Li   Record.push_back(D->getDepth());
1494*67e74705SXin Li   Record.push_back(D->getPosition());
1495*67e74705SXin Li 
1496*67e74705SXin Li   if (D->isExpandedParameterPack()) {
1497*67e74705SXin Li     for (unsigned I = 0, N = D->getNumExpansionTypes(); I != N; ++I) {
1498*67e74705SXin Li       Record.AddTypeRef(D->getExpansionType(I));
1499*67e74705SXin Li       Record.AddTypeSourceInfo(D->getExpansionTypeSourceInfo(I));
1500*67e74705SXin Li     }
1501*67e74705SXin Li 
1502*67e74705SXin Li     Code = serialization::DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK;
1503*67e74705SXin Li   } else {
1504*67e74705SXin Li     // Rest of NonTypeTemplateParmDecl.
1505*67e74705SXin Li     Record.push_back(D->isParameterPack());
1506*67e74705SXin Li     bool OwnsDefaultArg = D->hasDefaultArgument() &&
1507*67e74705SXin Li                           !D->defaultArgumentWasInherited();
1508*67e74705SXin Li     Record.push_back(OwnsDefaultArg);
1509*67e74705SXin Li     if (OwnsDefaultArg)
1510*67e74705SXin Li       Record.AddStmt(D->getDefaultArgument());
1511*67e74705SXin Li     Code = serialization::DECL_NON_TYPE_TEMPLATE_PARM;
1512*67e74705SXin Li   }
1513*67e74705SXin Li }
1514*67e74705SXin Li 
VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl * D)1515*67e74705SXin Li void ASTDeclWriter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
1516*67e74705SXin Li   // For an expanded parameter pack, record the number of expansion types here
1517*67e74705SXin Li   // so that it's easier for deserialization to allocate the right amount of
1518*67e74705SXin Li   // memory.
1519*67e74705SXin Li   if (D->isExpandedParameterPack())
1520*67e74705SXin Li     Record.push_back(D->getNumExpansionTemplateParameters());
1521*67e74705SXin Li 
1522*67e74705SXin Li   VisitTemplateDecl(D);
1523*67e74705SXin Li   // TemplateParmPosition.
1524*67e74705SXin Li   Record.push_back(D->getDepth());
1525*67e74705SXin Li   Record.push_back(D->getPosition());
1526*67e74705SXin Li 
1527*67e74705SXin Li   if (D->isExpandedParameterPack()) {
1528*67e74705SXin Li     for (unsigned I = 0, N = D->getNumExpansionTemplateParameters();
1529*67e74705SXin Li          I != N; ++I)
1530*67e74705SXin Li       Record.AddTemplateParameterList(D->getExpansionTemplateParameters(I));
1531*67e74705SXin Li     Code = serialization::DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK;
1532*67e74705SXin Li   } else {
1533*67e74705SXin Li     // Rest of TemplateTemplateParmDecl.
1534*67e74705SXin Li     Record.push_back(D->isParameterPack());
1535*67e74705SXin Li     bool OwnsDefaultArg = D->hasDefaultArgument() &&
1536*67e74705SXin Li                           !D->defaultArgumentWasInherited();
1537*67e74705SXin Li     Record.push_back(OwnsDefaultArg);
1538*67e74705SXin Li     if (OwnsDefaultArg)
1539*67e74705SXin Li       Record.AddTemplateArgumentLoc(D->getDefaultArgument());
1540*67e74705SXin Li     Code = serialization::DECL_TEMPLATE_TEMPLATE_PARM;
1541*67e74705SXin Li   }
1542*67e74705SXin Li }
1543*67e74705SXin Li 
VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl * D)1544*67e74705SXin Li void ASTDeclWriter::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
1545*67e74705SXin Li   VisitRedeclarableTemplateDecl(D);
1546*67e74705SXin Li   Code = serialization::DECL_TYPE_ALIAS_TEMPLATE;
1547*67e74705SXin Li }
1548*67e74705SXin Li 
VisitStaticAssertDecl(StaticAssertDecl * D)1549*67e74705SXin Li void ASTDeclWriter::VisitStaticAssertDecl(StaticAssertDecl *D) {
1550*67e74705SXin Li   VisitDecl(D);
1551*67e74705SXin Li   Record.AddStmt(D->getAssertExpr());
1552*67e74705SXin Li   Record.push_back(D->isFailed());
1553*67e74705SXin Li   Record.AddStmt(D->getMessage());
1554*67e74705SXin Li   Record.AddSourceLocation(D->getRParenLoc());
1555*67e74705SXin Li   Code = serialization::DECL_STATIC_ASSERT;
1556*67e74705SXin Li }
1557*67e74705SXin Li 
1558*67e74705SXin Li /// \brief Emit the DeclContext part of a declaration context decl.
VisitDeclContext(DeclContext * DC)1559*67e74705SXin Li void ASTDeclWriter::VisitDeclContext(DeclContext *DC) {
1560*67e74705SXin Li   Record.AddOffset(Writer.WriteDeclContextLexicalBlock(Context, DC));
1561*67e74705SXin Li   Record.AddOffset(Writer.WriteDeclContextVisibleBlock(Context, DC));
1562*67e74705SXin Li }
1563*67e74705SXin Li 
getFirstLocalDecl(const Decl * D)1564*67e74705SXin Li const Decl *ASTWriter::getFirstLocalDecl(const Decl *D) {
1565*67e74705SXin Li   assert(IsLocalDecl(D) && "expected a local declaration");
1566*67e74705SXin Li 
1567*67e74705SXin Li   const Decl *Canon = D->getCanonicalDecl();
1568*67e74705SXin Li   if (IsLocalDecl(Canon))
1569*67e74705SXin Li     return Canon;
1570*67e74705SXin Li 
1571*67e74705SXin Li   const Decl *&CacheEntry = FirstLocalDeclCache[Canon];
1572*67e74705SXin Li   if (CacheEntry)
1573*67e74705SXin Li     return CacheEntry;
1574*67e74705SXin Li 
1575*67e74705SXin Li   for (const Decl *Redecl = D; Redecl; Redecl = Redecl->getPreviousDecl())
1576*67e74705SXin Li     if (IsLocalDecl(Redecl))
1577*67e74705SXin Li       D = Redecl;
1578*67e74705SXin Li   return CacheEntry = D;
1579*67e74705SXin Li }
1580*67e74705SXin Li 
1581*67e74705SXin Li template <typename T>
VisitRedeclarable(Redeclarable<T> * D)1582*67e74705SXin Li void ASTDeclWriter::VisitRedeclarable(Redeclarable<T> *D) {
1583*67e74705SXin Li   T *First = D->getFirstDecl();
1584*67e74705SXin Li   T *MostRecent = First->getMostRecentDecl();
1585*67e74705SXin Li   T *DAsT = static_cast<T *>(D);
1586*67e74705SXin Li   if (MostRecent != First) {
1587*67e74705SXin Li     assert(isRedeclarableDeclKind(DAsT->getKind()) &&
1588*67e74705SXin Li            "Not considered redeclarable?");
1589*67e74705SXin Li 
1590*67e74705SXin Li     Record.AddDeclRef(First);
1591*67e74705SXin Li 
1592*67e74705SXin Li     // Write out a list of local redeclarations of this declaration if it's the
1593*67e74705SXin Li     // first local declaration in the chain.
1594*67e74705SXin Li     const Decl *FirstLocal = Writer.getFirstLocalDecl(DAsT);
1595*67e74705SXin Li     if (DAsT == FirstLocal) {
1596*67e74705SXin Li       // Emit a list of all imported first declarations so that we can be sure
1597*67e74705SXin Li       // that all redeclarations visible to this module are before D in the
1598*67e74705SXin Li       // redecl chain.
1599*67e74705SXin Li       unsigned I = Record.size();
1600*67e74705SXin Li       Record.push_back(0);
1601*67e74705SXin Li       if (Writer.Chain)
1602*67e74705SXin Li         AddFirstDeclFromEachModule(DAsT, /*IncludeLocal*/false);
1603*67e74705SXin Li       // This is the number of imported first declarations + 1.
1604*67e74705SXin Li       Record[I] = Record.size() - I;
1605*67e74705SXin Li 
1606*67e74705SXin Li       // Collect the set of local redeclarations of this declaration, from
1607*67e74705SXin Li       // newest to oldest.
1608*67e74705SXin Li       ASTWriter::RecordData LocalRedecls;
1609*67e74705SXin Li       ASTRecordWriter LocalRedeclWriter(Record, LocalRedecls);
1610*67e74705SXin Li       for (const Decl *Prev = FirstLocal->getMostRecentDecl();
1611*67e74705SXin Li            Prev != FirstLocal; Prev = Prev->getPreviousDecl())
1612*67e74705SXin Li         if (!Prev->isFromASTFile())
1613*67e74705SXin Li           LocalRedeclWriter.AddDeclRef(Prev);
1614*67e74705SXin Li 
1615*67e74705SXin Li       // If we have any redecls, write them now as a separate record preceding
1616*67e74705SXin Li       // the declaration itself.
1617*67e74705SXin Li       if (LocalRedecls.empty())
1618*67e74705SXin Li         Record.push_back(0);
1619*67e74705SXin Li       else
1620*67e74705SXin Li         Record.AddOffset(LocalRedeclWriter.Emit(LOCAL_REDECLARATIONS));
1621*67e74705SXin Li     } else {
1622*67e74705SXin Li       Record.push_back(0);
1623*67e74705SXin Li       Record.AddDeclRef(FirstLocal);
1624*67e74705SXin Li     }
1625*67e74705SXin Li 
1626*67e74705SXin Li     // Make sure that we serialize both the previous and the most-recent
1627*67e74705SXin Li     // declarations, which (transitively) ensures that all declarations in the
1628*67e74705SXin Li     // chain get serialized.
1629*67e74705SXin Li     //
1630*67e74705SXin Li     // FIXME: This is not correct; when we reach an imported declaration we
1631*67e74705SXin Li     // won't emit its previous declaration.
1632*67e74705SXin Li     (void)Writer.GetDeclRef(D->getPreviousDecl());
1633*67e74705SXin Li     (void)Writer.GetDeclRef(MostRecent);
1634*67e74705SXin Li   } else {
1635*67e74705SXin Li     // We use the sentinel value 0 to indicate an only declaration.
1636*67e74705SXin Li     Record.push_back(0);
1637*67e74705SXin Li   }
1638*67e74705SXin Li }
1639*67e74705SXin Li 
VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl * D)1640*67e74705SXin Li void ASTDeclWriter::VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D) {
1641*67e74705SXin Li   Record.push_back(D->varlist_size());
1642*67e74705SXin Li   VisitDecl(D);
1643*67e74705SXin Li   for (auto *I : D->varlists())
1644*67e74705SXin Li     Record.AddStmt(I);
1645*67e74705SXin Li   Code = serialization::DECL_OMP_THREADPRIVATE;
1646*67e74705SXin Li }
1647*67e74705SXin Li 
VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl * D)1648*67e74705SXin Li void ASTDeclWriter::VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D) {
1649*67e74705SXin Li   VisitValueDecl(D);
1650*67e74705SXin Li   Record.AddSourceLocation(D->getLocStart());
1651*67e74705SXin Li   Record.AddStmt(D->getCombiner());
1652*67e74705SXin Li   Record.AddStmt(D->getInitializer());
1653*67e74705SXin Li   Record.AddDeclRef(D->getPrevDeclInScope());
1654*67e74705SXin Li   Code = serialization::DECL_OMP_DECLARE_REDUCTION;
1655*67e74705SXin Li }
1656*67e74705SXin Li 
VisitOMPCapturedExprDecl(OMPCapturedExprDecl * D)1657*67e74705SXin Li void ASTDeclWriter::VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D) {
1658*67e74705SXin Li   VisitVarDecl(D);
1659*67e74705SXin Li   Code = serialization::DECL_OMP_CAPTUREDEXPR;
1660*67e74705SXin Li }
1661*67e74705SXin Li 
1662*67e74705SXin Li //===----------------------------------------------------------------------===//
1663*67e74705SXin Li // ASTWriter Implementation
1664*67e74705SXin Li //===----------------------------------------------------------------------===//
1665*67e74705SXin Li 
WriteDeclAbbrevs()1666*67e74705SXin Li void ASTWriter::WriteDeclAbbrevs() {
1667*67e74705SXin Li   using namespace llvm;
1668*67e74705SXin Li 
1669*67e74705SXin Li   BitCodeAbbrev *Abv;
1670*67e74705SXin Li 
1671*67e74705SXin Li   // Abbreviation for DECL_FIELD
1672*67e74705SXin Li   Abv = new BitCodeAbbrev();
1673*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(serialization::DECL_FIELD));
1674*67e74705SXin Li   // Decl
1675*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
1676*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // LexicalDeclContext
1677*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isInvalidDecl
1678*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // HasAttrs
1679*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isImplicit
1680*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isUsed
1681*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isReferenced
1682*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                   // TopLevelDeclInObjCContainer
1683*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2));  // AccessSpecifier
1684*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // ModulePrivate
1685*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
1686*67e74705SXin Li   // NamedDecl
1687*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // NameKind = Identifier
1688*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
1689*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // AnonDeclNumber
1690*67e74705SXin Li   // ValueDecl
1691*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
1692*67e74705SXin Li   // DeclaratorDecl
1693*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc
1694*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // hasExtInfo
1695*67e74705SXin Li   // FieldDecl
1696*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isMutable
1697*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       //getBitWidth
1698*67e74705SXin Li   // Type Source Info
1699*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1700*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1701*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
1702*67e74705SXin Li   DeclFieldAbbrev = Stream.EmitAbbrev(Abv);
1703*67e74705SXin Li 
1704*67e74705SXin Li   // Abbreviation for DECL_OBJC_IVAR
1705*67e74705SXin Li   Abv = new BitCodeAbbrev();
1706*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(serialization::DECL_OBJC_IVAR));
1707*67e74705SXin Li   // Decl
1708*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
1709*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // LexicalDeclContext
1710*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isInvalidDecl
1711*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // HasAttrs
1712*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isImplicit
1713*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isUsed
1714*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isReferenced
1715*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                   // TopLevelDeclInObjCContainer
1716*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2));  // AccessSpecifier
1717*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // ModulePrivate
1718*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
1719*67e74705SXin Li   // NamedDecl
1720*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // NameKind = Identifier
1721*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
1722*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // AnonDeclNumber
1723*67e74705SXin Li   // ValueDecl
1724*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
1725*67e74705SXin Li   // DeclaratorDecl
1726*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc
1727*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // hasExtInfo
1728*67e74705SXin Li   // FieldDecl
1729*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isMutable
1730*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       //getBitWidth
1731*67e74705SXin Li   // ObjC Ivar
1732*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getAccessControl
1733*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getSynthesize
1734*67e74705SXin Li   // Type Source Info
1735*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1736*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1737*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
1738*67e74705SXin Li   DeclObjCIvarAbbrev = Stream.EmitAbbrev(Abv);
1739*67e74705SXin Li 
1740*67e74705SXin Li   // Abbreviation for DECL_ENUM
1741*67e74705SXin Li   Abv = new BitCodeAbbrev();
1742*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(serialization::DECL_ENUM));
1743*67e74705SXin Li   // Redeclarable
1744*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // No redeclaration
1745*67e74705SXin Li   // Decl
1746*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
1747*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // LexicalDeclContext
1748*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isInvalidDecl
1749*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // HasAttrs
1750*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isImplicit
1751*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isUsed
1752*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isReferenced
1753*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                   // TopLevelDeclInObjCContainer
1754*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(AS_none));                 // C++ AccessSpecifier
1755*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // ModulePrivate
1756*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
1757*67e74705SXin Li   // NamedDecl
1758*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // NameKind = Identifier
1759*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
1760*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // AnonDeclNumber
1761*67e74705SXin Li   // TypeDecl
1762*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location
1763*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type Ref
1764*67e74705SXin Li   // TagDecl
1765*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // IdentifierNamespace
1766*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // getTagKind
1767*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isCompleteDefinition
1768*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // EmbeddedInDeclarator
1769*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsFreeStanding
1770*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsCompleteDefinitionRequired
1771*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // SourceLocation
1772*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                         // ExtInfoKind
1773*67e74705SXin Li   // EnumDecl
1774*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // AddTypeRef
1775*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // IntegerType
1776*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // getPromotionType
1777*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // getNumPositiveBits
1778*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // getNumNegativeBits
1779*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isScoped
1780*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isScopedUsingClassTag
1781*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isFixed
1782*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // InstantiatedMembEnum
1783*67e74705SXin Li   // DC
1784*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // LexicalOffset
1785*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // VisibleOffset
1786*67e74705SXin Li   DeclEnumAbbrev = Stream.EmitAbbrev(Abv);
1787*67e74705SXin Li 
1788*67e74705SXin Li   // Abbreviation for DECL_RECORD
1789*67e74705SXin Li   Abv = new BitCodeAbbrev();
1790*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(serialization::DECL_RECORD));
1791*67e74705SXin Li   // Redeclarable
1792*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // No redeclaration
1793*67e74705SXin Li   // Decl
1794*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
1795*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // LexicalDeclContext
1796*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isInvalidDecl
1797*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // HasAttrs
1798*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isImplicit
1799*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isUsed
1800*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isReferenced
1801*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                   // TopLevelDeclInObjCContainer
1802*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(AS_none));                 // C++ AccessSpecifier
1803*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // ModulePrivate
1804*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
1805*67e74705SXin Li   // NamedDecl
1806*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // NameKind = Identifier
1807*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
1808*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // AnonDeclNumber
1809*67e74705SXin Li   // TypeDecl
1810*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location
1811*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type Ref
1812*67e74705SXin Li   // TagDecl
1813*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // IdentifierNamespace
1814*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // getTagKind
1815*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isCompleteDefinition
1816*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // EmbeddedInDeclarator
1817*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsFreeStanding
1818*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsCompleteDefinitionRequired
1819*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // SourceLocation
1820*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                         // ExtInfoKind
1821*67e74705SXin Li   // RecordDecl
1822*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // FlexibleArrayMember
1823*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // AnonymousStructUnion
1824*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // hasObjectMember
1825*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // hasVolatileMember
1826*67e74705SXin Li   // DC
1827*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // LexicalOffset
1828*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // VisibleOffset
1829*67e74705SXin Li   DeclRecordAbbrev = Stream.EmitAbbrev(Abv);
1830*67e74705SXin Li 
1831*67e74705SXin Li   // Abbreviation for DECL_PARM_VAR
1832*67e74705SXin Li   Abv = new BitCodeAbbrev();
1833*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(serialization::DECL_PARM_VAR));
1834*67e74705SXin Li   // Redeclarable
1835*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // No redeclaration
1836*67e74705SXin Li   // Decl
1837*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
1838*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // LexicalDeclContext
1839*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isInvalidDecl
1840*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // HasAttrs
1841*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isImplicit
1842*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isUsed
1843*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isReferenced
1844*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                   // TopLevelDeclInObjCContainer
1845*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(AS_none));                 // C++ AccessSpecifier
1846*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // ModulePrivate
1847*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
1848*67e74705SXin Li   // NamedDecl
1849*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // NameKind = Identifier
1850*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
1851*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // AnonDeclNumber
1852*67e74705SXin Li   // ValueDecl
1853*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
1854*67e74705SXin Li   // DeclaratorDecl
1855*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc
1856*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // hasExtInfo
1857*67e74705SXin Li   // VarDecl
1858*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // StorageClass
1859*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // getTSCSpec
1860*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // hasCXXDirectInitializer
1861*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // Linkage
1862*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // HasInit
1863*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                   // HasMemberSpecializationInfo
1864*67e74705SXin Li   // ParmVarDecl
1865*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsObjCMethodParameter
1866*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // ScopeDepth
1867*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ScopeIndex
1868*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // ObjCDeclQualifier
1869*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // KNRPromoted
1870*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // HasInheritedDefaultArg
1871*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                   // HasUninstantiatedDefaultArg
1872*67e74705SXin Li   // Type Source Info
1873*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1874*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1875*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
1876*67e74705SXin Li   DeclParmVarAbbrev = Stream.EmitAbbrev(Abv);
1877*67e74705SXin Li 
1878*67e74705SXin Li   // Abbreviation for DECL_TYPEDEF
1879*67e74705SXin Li   Abv = new BitCodeAbbrev();
1880*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(serialization::DECL_TYPEDEF));
1881*67e74705SXin Li   // Redeclarable
1882*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // No redeclaration
1883*67e74705SXin Li   // Decl
1884*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
1885*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // LexicalDeclContext
1886*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isInvalidDecl
1887*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // HasAttrs
1888*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isImplicit
1889*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isUsed
1890*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isReferenced
1891*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                   // TopLevelDeclInObjCContainer
1892*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // C++ AccessSpecifier
1893*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // ModulePrivate
1894*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
1895*67e74705SXin Li   // NamedDecl
1896*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // NameKind = Identifier
1897*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
1898*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // AnonDeclNumber
1899*67e74705SXin Li   // TypeDecl
1900*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Source Location
1901*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type Ref
1902*67e74705SXin Li   // TypedefDecl
1903*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1904*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
1905*67e74705SXin Li   DeclTypedefAbbrev = Stream.EmitAbbrev(Abv);
1906*67e74705SXin Li 
1907*67e74705SXin Li   // Abbreviation for DECL_VAR
1908*67e74705SXin Li   Abv = new BitCodeAbbrev();
1909*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(serialization::DECL_VAR));
1910*67e74705SXin Li   // Redeclarable
1911*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // No redeclaration
1912*67e74705SXin Li   // Decl
1913*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
1914*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // LexicalDeclContext
1915*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isInvalidDecl
1916*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // HasAttrs
1917*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isImplicit
1918*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isUsed
1919*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // isReferenced
1920*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                   // TopLevelDeclInObjCContainer
1921*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(AS_none));                 // C++ AccessSpecifier
1922*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // ModulePrivate
1923*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
1924*67e74705SXin Li   // NamedDecl
1925*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // NameKind = Identifier
1926*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name
1927*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // AnonDeclNumber
1928*67e74705SXin Li   // ValueDecl
1929*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
1930*67e74705SXin Li   // DeclaratorDecl
1931*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InnerStartLoc
1932*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                       // hasExtInfo
1933*67e74705SXin Li   // VarDecl
1934*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // StorageClass
1935*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // getTSCSpec
1936*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // CXXDirectInitializer
1937*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isExceptionVariable
1938*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isNRVOVariable
1939*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isCXXForRangeDecl
1940*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isARCPseudoStrong
1941*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                         // isInline
1942*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                         // isInlineSpecified
1943*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                         // isConstexpr
1944*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                         // isInitCapture
1945*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                         // isPrevDeclInSameScope
1946*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // Linkage
1947*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // HasInit
1948*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // HasMemberSpecInfo
1949*67e74705SXin Li   // Type Source Info
1950*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1951*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1952*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
1953*67e74705SXin Li   DeclVarAbbrev = Stream.EmitAbbrev(Abv);
1954*67e74705SXin Li 
1955*67e74705SXin Li   // Abbreviation for DECL_CXX_METHOD
1956*67e74705SXin Li   Abv = new BitCodeAbbrev();
1957*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(serialization::DECL_CXX_METHOD));
1958*67e74705SXin Li   // RedeclarableDecl
1959*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                         // CanonicalDecl
1960*67e74705SXin Li   // Decl
1961*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // DeclContext
1962*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                         // LexicalDeclContext
1963*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                         // Invalid
1964*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                         // HasAttrs
1965*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Implicit
1966*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Used
1967*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Referenced
1968*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                         // InObjCContainer
1969*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // Access
1970*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ModulePrivate
1971*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // SubmoduleID
1972*67e74705SXin Li   // NamedDecl
1973*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(DeclarationName::Identifier)); // NameKind
1974*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // Identifier
1975*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                         // AnonDeclNumber
1976*67e74705SXin Li   // ValueDecl
1977*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // Type
1978*67e74705SXin Li   // DeclaratorDecl
1979*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // InnerLocStart
1980*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                         // HasExtInfo
1981*67e74705SXin Li   // FunctionDecl
1982*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 11)); // IDNS
1983*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // StorageClass
1984*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Inline
1985*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // InlineSpecified
1986*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // VirtualAsWritten
1987*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Pure
1988*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0));                         // HasInheritedProto
1989*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(1));                         // HasWrittenProto
1990*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Deleted
1991*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Trivial
1992*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Defaulted
1993*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ExplicitlyDefaulted
1994*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ImplicitReturnZero
1995*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Constexpr
1996*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // SkippedBody
1997*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // LateParsed
1998*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // Linkage
1999*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // LocEnd
2000*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // TemplateKind
2001*67e74705SXin Li   // This Array slurps the rest of the record. Fortunately we want to encode
2002*67e74705SXin Li   // (nearly) all the remaining (variable number of) fields in the same way.
2003*67e74705SXin Li   //
2004*67e74705SXin Li   // This is the function template information if any, then
2005*67e74705SXin Li   //         NumParams and Params[] from FunctionDecl, and
2006*67e74705SXin Li   //         NumOverriddenMethods, OverriddenMethods[] from CXXMethodDecl.
2007*67e74705SXin Li   //
2008*67e74705SXin Li   //  Add an AbbrevOp for 'size then elements' and use it here.
2009*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2010*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2011*67e74705SXin Li   DeclCXXMethodAbbrev = Stream.EmitAbbrev(Abv);
2012*67e74705SXin Li 
2013*67e74705SXin Li   // Abbreviation for EXPR_DECL_REF
2014*67e74705SXin Li   Abv = new BitCodeAbbrev();
2015*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(serialization::EXPR_DECL_REF));
2016*67e74705SXin Li   //Stmt
2017*67e74705SXin Li   //Expr
2018*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
2019*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //TypeDependent
2020*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ValueDependent
2021*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //InstantiationDependent
2022*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //UnexpandedParamPack
2023*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind
2024*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind
2025*67e74705SXin Li   //DeclRefExpr
2026*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //HasQualifier
2027*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //GetDeclFound
2028*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ExplicitTemplateArgs
2029*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //HadMultipleCandidates
2030*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2031*67e74705SXin Li                            1)); // RefersToEnclosingVariableOrCapture
2032*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclRef
2033*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Location
2034*67e74705SXin Li   DeclRefExprAbbrev = Stream.EmitAbbrev(Abv);
2035*67e74705SXin Li 
2036*67e74705SXin Li   // Abbreviation for EXPR_INTEGER_LITERAL
2037*67e74705SXin Li   Abv = new BitCodeAbbrev();
2038*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(serialization::EXPR_INTEGER_LITERAL));
2039*67e74705SXin Li   //Stmt
2040*67e74705SXin Li   //Expr
2041*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
2042*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //TypeDependent
2043*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ValueDependent
2044*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //InstantiationDependent
2045*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //UnexpandedParamPack
2046*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind
2047*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind
2048*67e74705SXin Li   //Integer Literal
2049*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Location
2050*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(32));                      // Bit Width
2051*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Value
2052*67e74705SXin Li   IntegerLiteralAbbrev = Stream.EmitAbbrev(Abv);
2053*67e74705SXin Li 
2054*67e74705SXin Li   // Abbreviation for EXPR_CHARACTER_LITERAL
2055*67e74705SXin Li   Abv = new BitCodeAbbrev();
2056*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(serialization::EXPR_CHARACTER_LITERAL));
2057*67e74705SXin Li   //Stmt
2058*67e74705SXin Li   //Expr
2059*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
2060*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //TypeDependent
2061*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ValueDependent
2062*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //InstantiationDependent
2063*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //UnexpandedParamPack
2064*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind
2065*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind
2066*67e74705SXin Li   //Character Literal
2067*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getValue
2068*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Location
2069*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // getKind
2070*67e74705SXin Li   CharacterLiteralAbbrev = Stream.EmitAbbrev(Abv);
2071*67e74705SXin Li 
2072*67e74705SXin Li   // Abbreviation for EXPR_IMPLICIT_CAST
2073*67e74705SXin Li   Abv = new BitCodeAbbrev();
2074*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(serialization::EXPR_IMPLICIT_CAST));
2075*67e74705SXin Li   // Stmt
2076*67e74705SXin Li   // Expr
2077*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
2078*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //TypeDependent
2079*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //ValueDependent
2080*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //InstantiationDependent
2081*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //UnexpandedParamPack
2082*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind
2083*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind
2084*67e74705SXin Li   // CastExpr
2085*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(0)); // PathSize
2086*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 6)); // CastKind
2087*67e74705SXin Li   // ImplicitCastExpr
2088*67e74705SXin Li   ExprImplicitCastAbbrev = Stream.EmitAbbrev(Abv);
2089*67e74705SXin Li 
2090*67e74705SXin Li   Abv = new BitCodeAbbrev();
2091*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(serialization::DECL_CONTEXT_LEXICAL));
2092*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2093*67e74705SXin Li   DeclContextLexicalAbbrev = Stream.EmitAbbrev(Abv);
2094*67e74705SXin Li 
2095*67e74705SXin Li   Abv = new BitCodeAbbrev();
2096*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(serialization::DECL_CONTEXT_VISIBLE));
2097*67e74705SXin Li   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2098*67e74705SXin Li   DeclContextVisibleLookupAbbrev = Stream.EmitAbbrev(Abv);
2099*67e74705SXin Li }
2100*67e74705SXin Li 
2101*67e74705SXin Li /// isRequiredDecl - Check if this is a "required" Decl, which must be seen by
2102*67e74705SXin Li /// consumers of the AST.
2103*67e74705SXin Li ///
2104*67e74705SXin Li /// Such decls will always be deserialized from the AST file, so we would like
2105*67e74705SXin Li /// this to be as restrictive as possible. Currently the predicate is driven by
2106*67e74705SXin Li /// code generation requirements, if other clients have a different notion of
2107*67e74705SXin Li /// what is "required" then we may have to consider an alternate scheme where
2108*67e74705SXin Li /// clients can iterate over the top-level decls and get information on them,
2109*67e74705SXin Li /// without necessary deserializing them. We could explicitly require such
2110*67e74705SXin Li /// clients to use a separate API call to "realize" the decl. This should be
2111*67e74705SXin Li /// relatively painless since they would presumably only do it for top-level
2112*67e74705SXin Li /// decls.
isRequiredDecl(const Decl * D,ASTContext & Context,bool WritingModule)2113*67e74705SXin Li static bool isRequiredDecl(const Decl *D, ASTContext &Context,
2114*67e74705SXin Li                            bool WritingModule) {
2115*67e74705SXin Li   // An ObjCMethodDecl is never considered as "required" because its
2116*67e74705SXin Li   // implementation container always is.
2117*67e74705SXin Li 
2118*67e74705SXin Li   // File scoped assembly or obj-c or OMP declare target implementation must be
2119*67e74705SXin Li   // seen.
2120*67e74705SXin Li   if (isa<FileScopeAsmDecl>(D) || isa<ObjCImplDecl>(D) ||
2121*67e74705SXin Li       D->hasAttr<OMPDeclareTargetDeclAttr>())
2122*67e74705SXin Li     return true;
2123*67e74705SXin Li 
2124*67e74705SXin Li   // ImportDecl is used by codegen to determine the set of imported modules to
2125*67e74705SXin Li   // search for inputs for automatic linking; include it if it has a semantic
2126*67e74705SXin Li   // effect.
2127*67e74705SXin Li   if (isa<ImportDecl>(D) && !WritingModule)
2128*67e74705SXin Li     return true;
2129*67e74705SXin Li 
2130*67e74705SXin Li   return Context.DeclMustBeEmitted(D);
2131*67e74705SXin Li }
2132*67e74705SXin Li 
WriteDecl(ASTContext & Context,Decl * D)2133*67e74705SXin Li void ASTWriter::WriteDecl(ASTContext &Context, Decl *D) {
2134*67e74705SXin Li   // Determine the ID for this declaration.
2135*67e74705SXin Li   serialization::DeclID ID;
2136*67e74705SXin Li   assert(!D->isFromASTFile() && "should not be emitting imported decl");
2137*67e74705SXin Li   serialization::DeclID &IDR = DeclIDs[D];
2138*67e74705SXin Li   if (IDR == 0)
2139*67e74705SXin Li     IDR = NextDeclID++;
2140*67e74705SXin Li 
2141*67e74705SXin Li   ID = IDR;
2142*67e74705SXin Li 
2143*67e74705SXin Li   assert(ID >= FirstDeclID && "invalid decl ID");
2144*67e74705SXin Li 
2145*67e74705SXin Li   RecordData Record;
2146*67e74705SXin Li   ASTDeclWriter W(*this, Context, Record);
2147*67e74705SXin Li 
2148*67e74705SXin Li   // Build a record for this declaration
2149*67e74705SXin Li   W.Visit(D);
2150*67e74705SXin Li 
2151*67e74705SXin Li   // Emit this declaration to the bitstream.
2152*67e74705SXin Li   uint64_t Offset = W.Emit(D);
2153*67e74705SXin Li 
2154*67e74705SXin Li   // Record the offset for this declaration
2155*67e74705SXin Li   SourceLocation Loc = D->getLocation();
2156*67e74705SXin Li   unsigned Index = ID - FirstDeclID;
2157*67e74705SXin Li   if (DeclOffsets.size() == Index)
2158*67e74705SXin Li     DeclOffsets.push_back(DeclOffset(Loc, Offset));
2159*67e74705SXin Li   else if (DeclOffsets.size() < Index) {
2160*67e74705SXin Li     // FIXME: Can/should this happen?
2161*67e74705SXin Li     DeclOffsets.resize(Index+1);
2162*67e74705SXin Li     DeclOffsets[Index].setLocation(Loc);
2163*67e74705SXin Li     DeclOffsets[Index].BitOffset = Offset;
2164*67e74705SXin Li   } else {
2165*67e74705SXin Li     llvm_unreachable("declarations should be emitted in ID order");
2166*67e74705SXin Li   }
2167*67e74705SXin Li 
2168*67e74705SXin Li   SourceManager &SM = Context.getSourceManager();
2169*67e74705SXin Li   if (Loc.isValid() && SM.isLocalSourceLocation(Loc))
2170*67e74705SXin Li     associateDeclWithFile(D, ID);
2171*67e74705SXin Li 
2172*67e74705SXin Li   // Note declarations that should be deserialized eagerly so that we can add
2173*67e74705SXin Li   // them to a record in the AST file later.
2174*67e74705SXin Li   if (isRequiredDecl(D, Context, WritingModule))
2175*67e74705SXin Li     EagerlyDeserializedDecls.push_back(ID);
2176*67e74705SXin Li }
2177*67e74705SXin Li 
AddFunctionDefinition(const FunctionDecl * FD)2178*67e74705SXin Li void ASTRecordWriter::AddFunctionDefinition(const FunctionDecl *FD) {
2179*67e74705SXin Li   // Switch case IDs are per function body.
2180*67e74705SXin Li   Writer->ClearSwitchCaseIDs();
2181*67e74705SXin Li 
2182*67e74705SXin Li   assert(FD->doesThisDeclarationHaveABody());
2183*67e74705SXin Li   if (auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {
2184*67e74705SXin Li     Record->push_back(CD->getNumCtorInitializers());
2185*67e74705SXin Li     if (CD->getNumCtorInitializers())
2186*67e74705SXin Li       AddCXXCtorInitializers(
2187*67e74705SXin Li           llvm::makeArrayRef(CD->init_begin(), CD->init_end()));
2188*67e74705SXin Li   }
2189*67e74705SXin Li   AddStmt(FD->getBody());
2190*67e74705SXin Li }
2191