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