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