1 //===--- ASTWriterDecl.cpp - Declaration Serialization --------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file implements serialization for Declarations.
11 //===----------------------------------------------------------------------===//
13 #include "ASTCommon.h"
14 #include "clang/AST/Attr.h"
15 #include "clang/AST/DeclCXX.h"
16 #include "clang/AST/DeclTemplate.h"
17 #include "clang/AST/DeclVisitor.h"
18 #include "clang/AST/Expr.h"
19 #include "clang/AST/OpenMPClause.h"
20 #include "clang/AST/PrettyDeclStackTrace.h"
21 #include "clang/Basic/SourceManager.h"
22 #include "clang/Serialization/ASTReader.h"
23 #include "clang/Serialization/ASTRecordWriter.h"
24 #include "llvm/Bitstream/BitstreamWriter.h"
25 #include "llvm/Support/ErrorHandling.h"
27 using namespace clang
;
28 using namespace serialization
;
30 //===----------------------------------------------------------------------===//
31 // Declaration serialization
32 //===----------------------------------------------------------------------===//
35 class ASTDeclWriter
: public DeclVisitor
<ASTDeclWriter
, void> {
38 ASTRecordWriter Record
;
40 serialization::DeclCode Code
;
43 bool GeneratingReducedBMI
= false;
46 ASTDeclWriter(ASTWriter
&Writer
, ASTContext
&Context
,
47 ASTWriter::RecordDataImpl
&Record
, bool GeneratingReducedBMI
)
48 : Writer(Writer
), Context(Context
), Record(Writer
, Record
),
49 Code((serialization::DeclCode
)0), AbbrevToUse(0),
50 GeneratingReducedBMI(GeneratingReducedBMI
) {}
52 uint64_t Emit(Decl
*D
) {
54 llvm::report_fatal_error(StringRef("unexpected declaration kind '") +
55 D
->getDeclKindName() + "'");
56 return Record
.Emit(Code
, AbbrevToUse
);
61 void VisitDecl(Decl
*D
);
62 void VisitPragmaCommentDecl(PragmaCommentDecl
*D
);
63 void VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl
*D
);
64 void VisitTranslationUnitDecl(TranslationUnitDecl
*D
);
65 void VisitNamedDecl(NamedDecl
*D
);
66 void VisitLabelDecl(LabelDecl
*LD
);
67 void VisitNamespaceDecl(NamespaceDecl
*D
);
68 void VisitUsingDirectiveDecl(UsingDirectiveDecl
*D
);
69 void VisitNamespaceAliasDecl(NamespaceAliasDecl
*D
);
70 void VisitTypeDecl(TypeDecl
*D
);
71 void VisitTypedefNameDecl(TypedefNameDecl
*D
);
72 void VisitTypedefDecl(TypedefDecl
*D
);
73 void VisitTypeAliasDecl(TypeAliasDecl
*D
);
74 void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl
*D
);
75 void VisitUnresolvedUsingIfExistsDecl(UnresolvedUsingIfExistsDecl
*D
);
76 void VisitTagDecl(TagDecl
*D
);
77 void VisitEnumDecl(EnumDecl
*D
);
78 void VisitRecordDecl(RecordDecl
*D
);
79 void VisitCXXRecordDecl(CXXRecordDecl
*D
);
80 void VisitClassTemplateSpecializationDecl(
81 ClassTemplateSpecializationDecl
*D
);
82 void VisitClassTemplatePartialSpecializationDecl(
83 ClassTemplatePartialSpecializationDecl
*D
);
84 void VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl
*D
);
85 void VisitVarTemplatePartialSpecializationDecl(
86 VarTemplatePartialSpecializationDecl
*D
);
87 void VisitTemplateTypeParmDecl(TemplateTypeParmDecl
*D
);
88 void VisitValueDecl(ValueDecl
*D
);
89 void VisitEnumConstantDecl(EnumConstantDecl
*D
);
90 void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl
*D
);
91 void VisitDeclaratorDecl(DeclaratorDecl
*D
);
92 void VisitFunctionDecl(FunctionDecl
*D
);
93 void VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl
*D
);
94 void VisitCXXMethodDecl(CXXMethodDecl
*D
);
95 void VisitCXXConstructorDecl(CXXConstructorDecl
*D
);
96 void VisitCXXDestructorDecl(CXXDestructorDecl
*D
);
97 void VisitCXXConversionDecl(CXXConversionDecl
*D
);
98 void VisitFieldDecl(FieldDecl
*D
);
99 void VisitMSPropertyDecl(MSPropertyDecl
*D
);
100 void VisitMSGuidDecl(MSGuidDecl
*D
);
101 void VisitUnnamedGlobalConstantDecl(UnnamedGlobalConstantDecl
*D
);
102 void VisitTemplateParamObjectDecl(TemplateParamObjectDecl
*D
);
103 void VisitIndirectFieldDecl(IndirectFieldDecl
*D
);
104 void VisitVarDecl(VarDecl
*D
);
105 void VisitImplicitParamDecl(ImplicitParamDecl
*D
);
106 void VisitParmVarDecl(ParmVarDecl
*D
);
107 void VisitDecompositionDecl(DecompositionDecl
*D
);
108 void VisitBindingDecl(BindingDecl
*D
);
109 void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl
*D
);
110 void VisitTemplateDecl(TemplateDecl
*D
);
111 void VisitConceptDecl(ConceptDecl
*D
);
112 void VisitImplicitConceptSpecializationDecl(
113 ImplicitConceptSpecializationDecl
*D
);
114 void VisitRequiresExprBodyDecl(RequiresExprBodyDecl
*D
);
115 void VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl
*D
);
116 void VisitClassTemplateDecl(ClassTemplateDecl
*D
);
117 void VisitVarTemplateDecl(VarTemplateDecl
*D
);
118 void VisitFunctionTemplateDecl(FunctionTemplateDecl
*D
);
119 void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl
*D
);
120 void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl
*D
);
121 void VisitUsingDecl(UsingDecl
*D
);
122 void VisitUsingEnumDecl(UsingEnumDecl
*D
);
123 void VisitUsingPackDecl(UsingPackDecl
*D
);
124 void VisitUsingShadowDecl(UsingShadowDecl
*D
);
125 void VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl
*D
);
126 void VisitLinkageSpecDecl(LinkageSpecDecl
*D
);
127 void VisitExportDecl(ExportDecl
*D
);
128 void VisitFileScopeAsmDecl(FileScopeAsmDecl
*D
);
129 void VisitTopLevelStmtDecl(TopLevelStmtDecl
*D
);
130 void VisitImportDecl(ImportDecl
*D
);
131 void VisitAccessSpecDecl(AccessSpecDecl
*D
);
132 void VisitFriendDecl(FriendDecl
*D
);
133 void VisitFriendTemplateDecl(FriendTemplateDecl
*D
);
134 void VisitStaticAssertDecl(StaticAssertDecl
*D
);
135 void VisitBlockDecl(BlockDecl
*D
);
136 void VisitCapturedDecl(CapturedDecl
*D
);
137 void VisitEmptyDecl(EmptyDecl
*D
);
138 void VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl
*D
);
139 void VisitDeclContext(DeclContext
*DC
);
140 template <typename T
> void VisitRedeclarable(Redeclarable
<T
> *D
);
141 void VisitHLSLBufferDecl(HLSLBufferDecl
*D
);
143 // FIXME: Put in the same order is DeclNodes.td?
144 void VisitObjCMethodDecl(ObjCMethodDecl
*D
);
145 void VisitObjCTypeParamDecl(ObjCTypeParamDecl
*D
);
146 void VisitObjCContainerDecl(ObjCContainerDecl
*D
);
147 void VisitObjCInterfaceDecl(ObjCInterfaceDecl
*D
);
148 void VisitObjCIvarDecl(ObjCIvarDecl
*D
);
149 void VisitObjCProtocolDecl(ObjCProtocolDecl
*D
);
150 void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl
*D
);
151 void VisitObjCCategoryDecl(ObjCCategoryDecl
*D
);
152 void VisitObjCImplDecl(ObjCImplDecl
*D
);
153 void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl
*D
);
154 void VisitObjCImplementationDecl(ObjCImplementationDecl
*D
);
155 void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl
*D
);
156 void VisitObjCPropertyDecl(ObjCPropertyDecl
*D
);
157 void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl
*D
);
158 void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl
*D
);
159 void VisitOMPAllocateDecl(OMPAllocateDecl
*D
);
160 void VisitOMPRequiresDecl(OMPRequiresDecl
*D
);
161 void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl
*D
);
162 void VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl
*D
);
163 void VisitOMPCapturedExprDecl(OMPCapturedExprDecl
*D
);
165 /// Add an Objective-C type parameter list to the given record.
166 void AddObjCTypeParamList(ObjCTypeParamList
*typeParams
) {
167 // Empty type parameter list.
173 Record
.push_back(typeParams
->size());
174 for (auto *typeParam
: *typeParams
) {
175 Record
.AddDeclRef(typeParam
);
177 Record
.AddSourceLocation(typeParams
->getLAngleLoc());
178 Record
.AddSourceLocation(typeParams
->getRAngleLoc());
181 /// Add to the record the first declaration from each module file that
182 /// provides a declaration of D. The intent is to provide a sufficient
183 /// set such that reloading this set will load all current redeclarations.
184 void AddFirstDeclFromEachModule(const Decl
*D
, bool IncludeLocal
) {
185 llvm::MapVector
<ModuleFile
*, const Decl
*> Firsts
;
186 // FIXME: We can skip entries that we know are implied by others.
187 for (const Decl
*R
= D
->getMostRecentDecl(); R
; R
= R
->getPreviousDecl()) {
188 if (R
->isFromASTFile())
189 Firsts
[Writer
.Chain
->getOwningModuleFile(R
)] = R
;
190 else if (IncludeLocal
)
193 for (const auto &F
: Firsts
)
194 Record
.AddDeclRef(F
.second
);
197 /// Get the specialization decl from an entry in the specialization list.
198 template <typename EntryType
>
199 typename
RedeclarableTemplateDecl::SpecEntryTraits
<EntryType
>::DeclType
*
200 getSpecializationDecl(EntryType
&T
) {
201 return RedeclarableTemplateDecl::SpecEntryTraits
<EntryType
>::getDecl(&T
);
204 /// Get the list of partial specializations from a template's common ptr.
206 decltype(T::PartialSpecializations
) &getPartialSpecializations(T
*Common
) {
207 return Common
->PartialSpecializations
;
209 ArrayRef
<Decl
> getPartialSpecializations(FunctionTemplateDecl::Common
*) {
213 template<typename DeclTy
>
214 void AddTemplateSpecializations(DeclTy
*D
) {
215 auto *Common
= D
->getCommonPtr();
217 // If we have any lazy specializations, and the external AST source is
218 // our chained AST reader, we can just write out the DeclIDs. Otherwise,
219 // we need to resolve them to actual declarations.
220 if (Writer
.Chain
!= Writer
.Context
->getExternalSource() &&
221 Common
->LazySpecializations
) {
222 D
->LoadLazySpecializations();
223 assert(!Common
->LazySpecializations
);
226 ArrayRef
<GlobalDeclID
> LazySpecializations
;
227 if (auto *LS
= Common
->LazySpecializations
)
228 LazySpecializations
= llvm::ArrayRef(LS
+ 1, LS
[0].getRawValue());
230 // Add a slot to the record for the number of specializations.
231 unsigned I
= Record
.size();
234 // AddFirstDeclFromEachModule might trigger deserialization, invalidating
235 // *Specializations iterators.
236 llvm::SmallVector
<const Decl
*, 16> Specs
;
237 for (auto &Entry
: Common
->Specializations
)
238 Specs
.push_back(getSpecializationDecl(Entry
));
239 for (auto &Entry
: getPartialSpecializations(Common
))
240 Specs
.push_back(getSpecializationDecl(Entry
));
242 for (auto *D
: Specs
) {
243 assert(D
->isCanonicalDecl() && "non-canonical decl in set");
244 AddFirstDeclFromEachModule(D
, /*IncludeLocal*/true);
247 DeclIDIterator
<GlobalDeclID
, DeclID
>(LazySpecializations
.begin()),
248 DeclIDIterator
<GlobalDeclID
, DeclID
>(LazySpecializations
.end()));
250 // Update the size entry we added earlier.
251 Record
[I
] = Record
.size() - I
- 1;
254 /// Ensure that this template specialization is associated with the specified
255 /// template on reload.
256 void RegisterTemplateSpecialization(const Decl
*Template
,
257 const Decl
*Specialization
) {
258 Template
= Template
->getCanonicalDecl();
260 // If the canonical template is local, we'll write out this specialization
262 // FIXME: We can do the same thing if there is any local declaration of
263 // the template, to avoid emitting an update record.
264 if (!Template
->isFromASTFile())
267 // We only need to associate the first local declaration of the
268 // specialization. The other declarations will get pulled in by it.
269 if (Writer
.getFirstLocalDecl(Specialization
) != Specialization
)
272 Writer
.DeclUpdates
[Template
].push_back(ASTWriter::DeclUpdate(
273 UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION
, Specialization
));
278 bool clang::CanElideDeclDef(const Decl
*D
) {
279 if (auto *FD
= dyn_cast
<FunctionDecl
>(D
)) {
280 if (FD
->isInlined() || FD
->isConstexpr())
283 if (FD
->isDependentContext())
286 if (FD
->getTemplateSpecializationKind() == TSK_ImplicitInstantiation
)
290 if (auto *VD
= dyn_cast
<VarDecl
>(D
)) {
291 if (!VD
->getDeclContext()->getRedeclContext()->isFileContext() ||
292 VD
->isInline() || VD
->isConstexpr() || isa
<ParmVarDecl
>(VD
) ||
293 // Constant initialized variable may not affect the ABI, but they
294 // may be used in constant evaluation in the frontend, so we have
296 VD
->hasConstantInitialization())
299 if (VD
->getTemplateSpecializationKind() == TSK_ImplicitInstantiation
)
306 void ASTDeclWriter::Visit(Decl
*D
) {
307 DeclVisitor
<ASTDeclWriter
>::Visit(D
);
309 // Source locations require array (variable-length) abbreviations. The
310 // abbreviation infrastructure requires that arrays are encoded last, so
311 // we handle it here in the case of those classes derived from DeclaratorDecl
312 if (auto *DD
= dyn_cast
<DeclaratorDecl
>(D
)) {
313 if (auto *TInfo
= DD
->getTypeSourceInfo())
314 Record
.AddTypeLoc(TInfo
->getTypeLoc());
317 // Handle FunctionDecl's body here and write it after all other Stmts/Exprs
318 // have been written. We want it last because we will not read it back when
319 // retrieving it from the AST, we'll just lazily set the offset.
320 if (auto *FD
= dyn_cast
<FunctionDecl
>(D
)) {
321 if (!GeneratingReducedBMI
|| !CanElideDeclDef(FD
)) {
322 Record
.push_back(FD
->doesThisDeclarationHaveABody());
323 if (FD
->doesThisDeclarationHaveABody())
324 Record
.AddFunctionDefinition(FD
);
329 // Similar to FunctionDecls, handle VarDecl's initializer here and write it
330 // after all other Stmts/Exprs. We will not read the initializer until after
331 // we have finished recursive deserialization, because it can recursively
332 // refer back to the variable.
333 if (auto *VD
= dyn_cast
<VarDecl
>(D
)) {
334 if (!GeneratingReducedBMI
|| !CanElideDeclDef(VD
))
335 Record
.AddVarDeclInit(VD
);
340 // And similarly for FieldDecls. We already serialized whether there is a
341 // default member initializer.
342 if (auto *FD
= dyn_cast
<FieldDecl
>(D
)) {
343 if (FD
->hasInClassInitializer()) {
344 if (Expr
*Init
= FD
->getInClassInitializer()) {
346 Record
.AddStmt(Init
);
349 // Initializer has not been instantiated yet.
354 // If this declaration is also a DeclContext, write blocks for the
355 // declarations that lexically stored inside its context and those
356 // declarations that are visible from its context.
357 if (auto *DC
= dyn_cast
<DeclContext
>(D
))
358 VisitDeclContext(DC
);
361 void ASTDeclWriter::VisitDecl(Decl
*D
) {
364 // The order matters here. It will be better to put the bit with higher
365 // probability to be 0 in the end of the bits.
367 // Since we're using VBR6 format to store it.
368 // It will be pretty effient if all the higher bits are 0.
369 // For example, if we need to pack 8 bits into a value and the stored value
370 // is 0xf0, the actual stored value will be 0b000111'110000, which takes 12
371 // bits actually. However, if we changed the order to be 0x0f, then we can
372 // store it as 0b001111, which takes 6 bits only now.
373 DeclBits
.addBits((uint64_t)D
->getModuleOwnershipKind(), /*BitWidth=*/3);
374 DeclBits
.addBit(D
->isReferenced());
375 DeclBits
.addBit(D
->isUsed(false));
376 DeclBits
.addBits(D
->getAccess(), /*BitWidth=*/2);
377 DeclBits
.addBit(D
->isImplicit());
378 DeclBits
.addBit(D
->getDeclContext() != D
->getLexicalDeclContext());
379 DeclBits
.addBit(D
->hasAttrs());
380 DeclBits
.addBit(D
->isTopLevelDeclInObjCContainer());
381 DeclBits
.addBit(D
->isInvalidDecl());
382 Record
.push_back(DeclBits
);
384 Record
.AddDeclRef(cast_or_null
<Decl
>(D
->getDeclContext()));
385 if (D
->getDeclContext() != D
->getLexicalDeclContext())
386 Record
.AddDeclRef(cast_or_null
<Decl
>(D
->getLexicalDeclContext()));
389 Record
.AddAttributes(D
->getAttrs());
391 Record
.push_back(Writer
.getSubmoduleID(D
->getOwningModule()));
393 // If this declaration injected a name into a context different from its
394 // lexical context, and that context is an imported namespace, we need to
395 // update its visible declarations to include this name.
397 // This happens when we instantiate a class with a friend declaration or a
398 // function with a local extern declaration, for instance.
400 // FIXME: Can we handle this in AddedVisibleDecl instead?
401 if (D
->isOutOfLine()) {
402 auto *DC
= D
->getDeclContext();
403 while (auto *NS
= dyn_cast
<NamespaceDecl
>(DC
->getRedeclContext())) {
404 if (!NS
->isFromASTFile())
406 Writer
.UpdatedDeclContexts
.insert(NS
->getPrimaryContext());
407 if (!NS
->isInlineNamespace())
409 DC
= NS
->getParent();
414 void ASTDeclWriter::VisitPragmaCommentDecl(PragmaCommentDecl
*D
) {
415 StringRef Arg
= D
->getArg();
416 Record
.push_back(Arg
.size());
418 Record
.AddSourceLocation(D
->getBeginLoc());
419 Record
.push_back(D
->getCommentKind());
420 Record
.AddString(Arg
);
421 Code
= serialization::DECL_PRAGMA_COMMENT
;
424 void ASTDeclWriter::VisitPragmaDetectMismatchDecl(
425 PragmaDetectMismatchDecl
*D
) {
426 StringRef Name
= D
->getName();
427 StringRef Value
= D
->getValue();
428 Record
.push_back(Name
.size() + 1 + Value
.size());
430 Record
.AddSourceLocation(D
->getBeginLoc());
431 Record
.AddString(Name
);
432 Record
.AddString(Value
);
433 Code
= serialization::DECL_PRAGMA_DETECT_MISMATCH
;
436 void ASTDeclWriter::VisitTranslationUnitDecl(TranslationUnitDecl
*D
) {
437 llvm_unreachable("Translation units aren't directly serialized");
440 void ASTDeclWriter::VisitNamedDecl(NamedDecl
*D
) {
442 Record
.AddDeclarationName(D
->getDeclName());
443 Record
.push_back(needsAnonymousDeclarationNumber(D
)
444 ? Writer
.getAnonymousDeclarationNumber(D
)
448 void ASTDeclWriter::VisitTypeDecl(TypeDecl
*D
) {
450 Record
.AddSourceLocation(D
->getBeginLoc());
451 Record
.AddTypeRef(QualType(D
->getTypeForDecl(), 0));
454 void ASTDeclWriter::VisitTypedefNameDecl(TypedefNameDecl
*D
) {
455 VisitRedeclarable(D
);
457 Record
.AddTypeSourceInfo(D
->getTypeSourceInfo());
458 Record
.push_back(D
->isModed());
460 Record
.AddTypeRef(D
->getUnderlyingType());
461 Record
.AddDeclRef(D
->getAnonDeclWithTypedefName(false));
464 void ASTDeclWriter::VisitTypedefDecl(TypedefDecl
*D
) {
465 VisitTypedefNameDecl(D
);
466 if (D
->getDeclContext() == D
->getLexicalDeclContext() &&
469 D
->getFirstDecl() == D
->getMostRecentDecl() &&
470 !D
->isInvalidDecl() &&
471 !D
->isTopLevelDeclInObjCContainer() &&
472 !D
->isModulePrivate() &&
473 !needsAnonymousDeclarationNumber(D
) &&
474 D
->getDeclName().getNameKind() == DeclarationName::Identifier
)
475 AbbrevToUse
= Writer
.getDeclTypedefAbbrev();
477 Code
= serialization::DECL_TYPEDEF
;
480 void ASTDeclWriter::VisitTypeAliasDecl(TypeAliasDecl
*D
) {
481 VisitTypedefNameDecl(D
);
482 Record
.AddDeclRef(D
->getDescribedAliasTemplate());
483 Code
= serialization::DECL_TYPEALIAS
;
486 void ASTDeclWriter::VisitTagDecl(TagDecl
*D
) {
487 static_assert(DeclContext::NumTagDeclBits
== 23,
488 "You need to update the serializer after you change the "
491 VisitRedeclarable(D
);
493 Record
.push_back(D
->getIdentifierNamespace());
495 BitsPacker TagDeclBits
;
496 TagDeclBits
.addBits(llvm::to_underlying(D
->getTagKind()), /*BitWidth=*/3);
497 TagDeclBits
.addBit(!isa
<CXXRecordDecl
>(D
) ? D
->isCompleteDefinition() : 0);
498 TagDeclBits
.addBit(D
->isEmbeddedInDeclarator());
499 TagDeclBits
.addBit(D
->isFreeStanding());
500 TagDeclBits
.addBit(D
->isCompleteDefinitionRequired());
502 D
->hasExtInfo() ? 1 : (D
->getTypedefNameForAnonDecl() ? 2 : 0),
504 Record
.push_back(TagDeclBits
);
506 Record
.AddSourceRange(D
->getBraceRange());
508 if (D
->hasExtInfo()) {
509 Record
.AddQualifierInfo(*D
->getExtInfo());
510 } else if (auto *TD
= D
->getTypedefNameForAnonDecl()) {
511 Record
.AddDeclRef(TD
);
512 Record
.AddIdentifierRef(TD
->getDeclName().getAsIdentifierInfo());
516 void ASTDeclWriter::VisitEnumDecl(EnumDecl
*D
) {
517 static_assert(DeclContext::NumEnumDeclBits
== 43,
518 "You need to update the serializer after you change the "
522 Record
.AddTypeSourceInfo(D
->getIntegerTypeSourceInfo());
523 if (!D
->getIntegerTypeSourceInfo())
524 Record
.AddTypeRef(D
->getIntegerType());
525 Record
.AddTypeRef(D
->getPromotionType());
527 BitsPacker EnumDeclBits
;
528 EnumDeclBits
.addBits(D
->getNumPositiveBits(), /*BitWidth=*/8);
529 EnumDeclBits
.addBits(D
->getNumNegativeBits(), /*BitWidth=*/8);
530 EnumDeclBits
.addBit(D
->isScoped());
531 EnumDeclBits
.addBit(D
->isScopedUsingClassTag());
532 EnumDeclBits
.addBit(D
->isFixed());
533 Record
.push_back(EnumDeclBits
);
535 Record
.push_back(D
->getODRHash());
537 if (MemberSpecializationInfo
*MemberInfo
= D
->getMemberSpecializationInfo()) {
538 Record
.AddDeclRef(MemberInfo
->getInstantiatedFrom());
539 Record
.push_back(MemberInfo
->getTemplateSpecializationKind());
540 Record
.AddSourceLocation(MemberInfo
->getPointOfInstantiation());
542 Record
.AddDeclRef(nullptr);
545 if (D
->getDeclContext() == D
->getLexicalDeclContext() && !D
->hasAttrs() &&
546 !D
->isInvalidDecl() && !D
->isImplicit() && !D
->hasExtInfo() &&
547 !D
->getTypedefNameForAnonDecl() &&
548 D
->getFirstDecl() == D
->getMostRecentDecl() &&
549 !D
->isTopLevelDeclInObjCContainer() &&
550 !CXXRecordDecl::classofKind(D
->getKind()) &&
551 !D
->getIntegerTypeSourceInfo() && !D
->getMemberSpecializationInfo() &&
552 !needsAnonymousDeclarationNumber(D
) &&
553 D
->getDeclName().getNameKind() == DeclarationName::Identifier
)
554 AbbrevToUse
= Writer
.getDeclEnumAbbrev();
556 Code
= serialization::DECL_ENUM
;
559 void ASTDeclWriter::VisitRecordDecl(RecordDecl
*D
) {
560 static_assert(DeclContext::NumRecordDeclBits
== 64,
561 "You need to update the serializer after you change the "
566 BitsPacker RecordDeclBits
;
567 RecordDeclBits
.addBit(D
->hasFlexibleArrayMember());
568 RecordDeclBits
.addBit(D
->isAnonymousStructOrUnion());
569 RecordDeclBits
.addBit(D
->hasObjectMember());
570 RecordDeclBits
.addBit(D
->hasVolatileMember());
571 RecordDeclBits
.addBit(D
->isNonTrivialToPrimitiveDefaultInitialize());
572 RecordDeclBits
.addBit(D
->isNonTrivialToPrimitiveCopy());
573 RecordDeclBits
.addBit(D
->isNonTrivialToPrimitiveDestroy());
574 RecordDeclBits
.addBit(D
->hasNonTrivialToPrimitiveDefaultInitializeCUnion());
575 RecordDeclBits
.addBit(D
->hasNonTrivialToPrimitiveDestructCUnion());
576 RecordDeclBits
.addBit(D
->hasNonTrivialToPrimitiveCopyCUnion());
577 RecordDeclBits
.addBit(D
->isParamDestroyedInCallee());
578 RecordDeclBits
.addBits(llvm::to_underlying(D
->getArgPassingRestrictions()), 2);
579 Record
.push_back(RecordDeclBits
);
581 // Only compute this for C/Objective-C, in C++ this is computed as part
583 if (!isa
<CXXRecordDecl
>(D
))
584 Record
.push_back(D
->getODRHash());
586 if (D
->getDeclContext() == D
->getLexicalDeclContext() && !D
->hasAttrs() &&
587 !D
->isImplicit() && !D
->isInvalidDecl() && !D
->hasExtInfo() &&
588 !D
->getTypedefNameForAnonDecl() &&
589 D
->getFirstDecl() == D
->getMostRecentDecl() &&
590 !D
->isTopLevelDeclInObjCContainer() &&
591 !CXXRecordDecl::classofKind(D
->getKind()) &&
592 !needsAnonymousDeclarationNumber(D
) &&
593 D
->getDeclName().getNameKind() == DeclarationName::Identifier
)
594 AbbrevToUse
= Writer
.getDeclRecordAbbrev();
596 Code
= serialization::DECL_RECORD
;
599 void ASTDeclWriter::VisitValueDecl(ValueDecl
*D
) {
601 Record
.AddTypeRef(D
->getType());
604 void ASTDeclWriter::VisitEnumConstantDecl(EnumConstantDecl
*D
) {
606 Record
.push_back(D
->getInitExpr()? 1 : 0);
607 if (D
->getInitExpr())
608 Record
.AddStmt(D
->getInitExpr());
609 Record
.AddAPSInt(D
->getInitVal());
611 Code
= serialization::DECL_ENUM_CONSTANT
;
614 void ASTDeclWriter::VisitDeclaratorDecl(DeclaratorDecl
*D
) {
616 Record
.AddSourceLocation(D
->getInnerLocStart());
617 Record
.push_back(D
->hasExtInfo());
618 if (D
->hasExtInfo()) {
619 DeclaratorDecl::ExtInfo
*Info
= D
->getExtInfo();
620 Record
.AddQualifierInfo(*Info
);
621 Record
.AddStmt(Info
->TrailingRequiresClause
);
623 // The location information is deferred until the end of the record.
624 Record
.AddTypeRef(D
->getTypeSourceInfo() ? D
->getTypeSourceInfo()->getType()
628 void ASTDeclWriter::VisitFunctionDecl(FunctionDecl
*D
) {
629 static_assert(DeclContext::NumFunctionDeclBits
== 44,
630 "You need to update the serializer after you change the "
633 VisitRedeclarable(D
);
635 Record
.push_back(D
->getTemplatedKind());
636 switch (D
->getTemplatedKind()) {
637 case FunctionDecl::TK_NonTemplate
:
639 case FunctionDecl::TK_DependentNonTemplate
:
640 Record
.AddDeclRef(D
->getInstantiatedFromDecl());
642 case FunctionDecl::TK_FunctionTemplate
:
643 Record
.AddDeclRef(D
->getDescribedFunctionTemplate());
645 case FunctionDecl::TK_MemberSpecialization
: {
646 MemberSpecializationInfo
*MemberInfo
= D
->getMemberSpecializationInfo();
647 Record
.AddDeclRef(MemberInfo
->getInstantiatedFrom());
648 Record
.push_back(MemberInfo
->getTemplateSpecializationKind());
649 Record
.AddSourceLocation(MemberInfo
->getPointOfInstantiation());
652 case FunctionDecl::TK_FunctionTemplateSpecialization
: {
653 FunctionTemplateSpecializationInfo
*
654 FTSInfo
= D
->getTemplateSpecializationInfo();
656 RegisterTemplateSpecialization(FTSInfo
->getTemplate(), D
);
658 Record
.AddDeclRef(FTSInfo
->getTemplate());
659 Record
.push_back(FTSInfo
->getTemplateSpecializationKind());
661 // Template arguments.
662 Record
.AddTemplateArgumentList(FTSInfo
->TemplateArguments
);
664 // Template args as written.
665 Record
.push_back(FTSInfo
->TemplateArgumentsAsWritten
!= nullptr);
666 if (FTSInfo
->TemplateArgumentsAsWritten
)
667 Record
.AddASTTemplateArgumentListInfo(
668 FTSInfo
->TemplateArgumentsAsWritten
);
670 Record
.AddSourceLocation(FTSInfo
->getPointOfInstantiation());
672 if (MemberSpecializationInfo
*MemberInfo
=
673 FTSInfo
->getMemberSpecializationInfo()) {
675 Record
.AddDeclRef(MemberInfo
->getInstantiatedFrom());
676 Record
.push_back(MemberInfo
->getTemplateSpecializationKind());
677 Record
.AddSourceLocation(MemberInfo
->getPointOfInstantiation());
682 if (D
->isCanonicalDecl()) {
683 // Write the template that contains the specializations set. We will
684 // add a FunctionTemplateSpecializationInfo to it when reading.
685 Record
.AddDeclRef(FTSInfo
->getTemplate()->getCanonicalDecl());
689 case FunctionDecl::TK_DependentFunctionTemplateSpecialization
: {
690 DependentFunctionTemplateSpecializationInfo
*
691 DFTSInfo
= D
->getDependentSpecializationInfo();
694 Record
.push_back(DFTSInfo
->getCandidates().size());
695 for (FunctionTemplateDecl
*FTD
: DFTSInfo
->getCandidates())
696 Record
.AddDeclRef(FTD
);
699 Record
.push_back(DFTSInfo
->TemplateArgumentsAsWritten
!= nullptr);
700 if (DFTSInfo
->TemplateArgumentsAsWritten
)
701 Record
.AddASTTemplateArgumentListInfo(
702 DFTSInfo
->TemplateArgumentsAsWritten
);
707 VisitDeclaratorDecl(D
);
708 Record
.AddDeclarationNameLoc(D
->DNLoc
, D
->getDeclName());
709 Record
.push_back(D
->getIdentifierNamespace());
711 // The order matters here. It will be better to put the bit with higher
712 // probability to be 0 in the end of the bits. See the comments in VisitDecl
714 BitsPacker FunctionDeclBits
;
715 // FIXME: stable encoding
716 FunctionDeclBits
.addBits(llvm::to_underlying(D
->getLinkageInternal()), 3);
717 FunctionDeclBits
.addBits((uint32_t)D
->getStorageClass(), /*BitWidth=*/3);
718 FunctionDeclBits
.addBit(D
->isInlineSpecified());
719 FunctionDeclBits
.addBit(D
->isInlined());
720 FunctionDeclBits
.addBit(D
->hasSkippedBody());
721 FunctionDeclBits
.addBit(D
->isVirtualAsWritten());
722 FunctionDeclBits
.addBit(D
->isPureVirtual());
723 FunctionDeclBits
.addBit(D
->hasInheritedPrototype());
724 FunctionDeclBits
.addBit(D
->hasWrittenPrototype());
725 FunctionDeclBits
.addBit(D
->isDeletedBit());
726 FunctionDeclBits
.addBit(D
->isTrivial());
727 FunctionDeclBits
.addBit(D
->isTrivialForCall());
728 FunctionDeclBits
.addBit(D
->isDefaulted());
729 FunctionDeclBits
.addBit(D
->isExplicitlyDefaulted());
730 FunctionDeclBits
.addBit(D
->isIneligibleOrNotSelected());
731 FunctionDeclBits
.addBits((uint64_t)(D
->getConstexprKind()), /*BitWidth=*/2);
732 FunctionDeclBits
.addBit(D
->hasImplicitReturnZero());
733 FunctionDeclBits
.addBit(D
->isMultiVersion());
734 FunctionDeclBits
.addBit(D
->isLateTemplateParsed());
735 FunctionDeclBits
.addBit(D
->FriendConstraintRefersToEnclosingTemplate());
736 FunctionDeclBits
.addBit(D
->usesSEHTry());
737 Record
.push_back(FunctionDeclBits
);
739 Record
.AddSourceLocation(D
->getEndLoc());
740 if (D
->isExplicitlyDefaulted())
741 Record
.AddSourceLocation(D
->getDefaultLoc());
743 Record
.push_back(D
->getODRHash());
745 if (D
->isDefaulted() || D
->isDeletedAsWritten()) {
746 if (auto *FDI
= D
->getDefalutedOrDeletedInfo()) {
747 // Store both that there is an DefaultedOrDeletedInfo and whether it
748 // contains a DeletedMessage.
749 StringLiteral
*DeletedMessage
= FDI
->getDeletedMessage();
750 Record
.push_back(1 | (DeletedMessage
? 2 : 0));
752 Record
.AddStmt(DeletedMessage
);
754 Record
.push_back(FDI
->getUnqualifiedLookups().size());
755 for (DeclAccessPair P
: FDI
->getUnqualifiedLookups()) {
756 Record
.AddDeclRef(P
.getDecl());
757 Record
.push_back(P
.getAccess());
764 Record
.push_back(D
->param_size());
765 for (auto *P
: D
->parameters())
766 Record
.AddDeclRef(P
);
767 Code
= serialization::DECL_FUNCTION
;
770 static void addExplicitSpecifier(ExplicitSpecifier ES
,
771 ASTRecordWriter
&Record
) {
772 uint64_t Kind
= static_cast<uint64_t>(ES
.getKind());
773 Kind
= Kind
<< 1 | static_cast<bool>(ES
.getExpr());
774 Record
.push_back(Kind
);
776 Record
.AddStmt(ES
.getExpr());
780 void ASTDeclWriter::VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl
*D
) {
781 addExplicitSpecifier(D
->getExplicitSpecifier(), Record
);
782 Record
.AddDeclRef(D
->Ctor
);
783 VisitFunctionDecl(D
);
784 Record
.push_back(static_cast<unsigned char>(D
->getDeductionCandidateKind()));
785 Code
= serialization::DECL_CXX_DEDUCTION_GUIDE
;
788 void ASTDeclWriter::VisitObjCMethodDecl(ObjCMethodDecl
*D
) {
789 static_assert(DeclContext::NumObjCMethodDeclBits
== 37,
790 "You need to update the serializer after you change the "
791 "ObjCMethodDeclBits");
794 // FIXME: convert to LazyStmtPtr?
795 // Unlike C/C++, method bodies will never be in header files.
796 bool HasBodyStuff
= D
->getBody() != nullptr;
797 Record
.push_back(HasBodyStuff
);
799 Record
.AddStmt(D
->getBody());
801 Record
.AddDeclRef(D
->getSelfDecl());
802 Record
.AddDeclRef(D
->getCmdDecl());
803 Record
.push_back(D
->isInstanceMethod());
804 Record
.push_back(D
->isVariadic());
805 Record
.push_back(D
->isPropertyAccessor());
806 Record
.push_back(D
->isSynthesizedAccessorStub());
807 Record
.push_back(D
->isDefined());
808 Record
.push_back(D
->isOverriding());
809 Record
.push_back(D
->hasSkippedBody());
811 Record
.push_back(D
->isRedeclaration());
812 Record
.push_back(D
->hasRedeclaration());
813 if (D
->hasRedeclaration()) {
814 assert(Context
.getObjCMethodRedeclaration(D
));
815 Record
.AddDeclRef(Context
.getObjCMethodRedeclaration(D
));
818 // FIXME: stable encoding for @required/@optional
819 Record
.push_back(llvm::to_underlying(D
->getImplementationControl()));
820 // FIXME: stable encoding for in/out/inout/bycopy/byref/oneway/nullability
821 Record
.push_back(D
->getObjCDeclQualifier());
822 Record
.push_back(D
->hasRelatedResultType());
823 Record
.AddTypeRef(D
->getReturnType());
824 Record
.AddTypeSourceInfo(D
->getReturnTypeSourceInfo());
825 Record
.AddSourceLocation(D
->getEndLoc());
826 Record
.push_back(D
->param_size());
827 for (const auto *P
: D
->parameters())
828 Record
.AddDeclRef(P
);
830 Record
.push_back(D
->getSelLocsKind());
831 unsigned NumStoredSelLocs
= D
->getNumStoredSelLocs();
832 SourceLocation
*SelLocs
= D
->getStoredSelLocs();
833 Record
.push_back(NumStoredSelLocs
);
834 for (unsigned i
= 0; i
!= NumStoredSelLocs
; ++i
)
835 Record
.AddSourceLocation(SelLocs
[i
]);
837 Code
= serialization::DECL_OBJC_METHOD
;
840 void ASTDeclWriter::VisitObjCTypeParamDecl(ObjCTypeParamDecl
*D
) {
841 VisitTypedefNameDecl(D
);
842 Record
.push_back(D
->Variance
);
843 Record
.push_back(D
->Index
);
844 Record
.AddSourceLocation(D
->VarianceLoc
);
845 Record
.AddSourceLocation(D
->ColonLoc
);
847 Code
= serialization::DECL_OBJC_TYPE_PARAM
;
850 void ASTDeclWriter::VisitObjCContainerDecl(ObjCContainerDecl
*D
) {
851 static_assert(DeclContext::NumObjCContainerDeclBits
== 64,
852 "You need to update the serializer after you change the "
853 "ObjCContainerDeclBits");
856 Record
.AddSourceLocation(D
->getAtStartLoc());
857 Record
.AddSourceRange(D
->getAtEndRange());
858 // Abstract class (no need to define a stable serialization::DECL code).
861 void ASTDeclWriter::VisitObjCInterfaceDecl(ObjCInterfaceDecl
*D
) {
862 VisitRedeclarable(D
);
863 VisitObjCContainerDecl(D
);
864 Record
.AddTypeRef(QualType(D
->getTypeForDecl(), 0));
865 AddObjCTypeParamList(D
->TypeParamList
);
867 Record
.push_back(D
->isThisDeclarationADefinition());
868 if (D
->isThisDeclarationADefinition()) {
869 // Write the DefinitionData
870 ObjCInterfaceDecl::DefinitionData
&Data
= D
->data();
872 Record
.AddTypeSourceInfo(D
->getSuperClassTInfo());
873 Record
.AddSourceLocation(D
->getEndOfDefinitionLoc());
874 Record
.push_back(Data
.HasDesignatedInitializers
);
875 Record
.push_back(D
->getODRHash());
877 // Write out the protocols that are directly referenced by the @interface.
878 Record
.push_back(Data
.ReferencedProtocols
.size());
879 for (const auto *P
: D
->protocols())
880 Record
.AddDeclRef(P
);
881 for (const auto &PL
: D
->protocol_locs())
882 Record
.AddSourceLocation(PL
);
884 // Write out the protocols that are transitively referenced.
885 Record
.push_back(Data
.AllReferencedProtocols
.size());
886 for (ObjCList
<ObjCProtocolDecl
>::iterator
887 P
= Data
.AllReferencedProtocols
.begin(),
888 PEnd
= Data
.AllReferencedProtocols
.end();
890 Record
.AddDeclRef(*P
);
893 if (ObjCCategoryDecl
*Cat
= D
->getCategoryListRaw()) {
894 // Ensure that we write out the set of categories for this class.
895 Writer
.ObjCClassesWithCategories
.insert(D
);
897 // Make sure that the categories get serialized.
898 for (; Cat
; Cat
= Cat
->getNextClassCategoryRaw())
899 (void)Writer
.GetDeclRef(Cat
);
903 Code
= serialization::DECL_OBJC_INTERFACE
;
906 void ASTDeclWriter::VisitObjCIvarDecl(ObjCIvarDecl
*D
) {
908 // FIXME: stable encoding for @public/@private/@protected/@package
909 Record
.push_back(D
->getAccessControl());
910 Record
.push_back(D
->getSynthesize());
912 if (D
->getDeclContext() == D
->getLexicalDeclContext() &&
916 !D
->isInvalidDecl() &&
917 !D
->isReferenced() &&
918 !D
->isModulePrivate() &&
922 AbbrevToUse
= Writer
.getDeclObjCIvarAbbrev();
924 Code
= serialization::DECL_OBJC_IVAR
;
927 void ASTDeclWriter::VisitObjCProtocolDecl(ObjCProtocolDecl
*D
) {
928 VisitRedeclarable(D
);
929 VisitObjCContainerDecl(D
);
931 Record
.push_back(D
->isThisDeclarationADefinition());
932 if (D
->isThisDeclarationADefinition()) {
933 Record
.push_back(D
->protocol_size());
934 for (const auto *I
: D
->protocols())
935 Record
.AddDeclRef(I
);
936 for (const auto &PL
: D
->protocol_locs())
937 Record
.AddSourceLocation(PL
);
938 Record
.push_back(D
->getODRHash());
941 Code
= serialization::DECL_OBJC_PROTOCOL
;
944 void ASTDeclWriter::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl
*D
) {
946 Code
= serialization::DECL_OBJC_AT_DEFS_FIELD
;
949 void ASTDeclWriter::VisitObjCCategoryDecl(ObjCCategoryDecl
*D
) {
950 VisitObjCContainerDecl(D
);
951 Record
.AddSourceLocation(D
->getCategoryNameLoc());
952 Record
.AddSourceLocation(D
->getIvarLBraceLoc());
953 Record
.AddSourceLocation(D
->getIvarRBraceLoc());
954 Record
.AddDeclRef(D
->getClassInterface());
955 AddObjCTypeParamList(D
->TypeParamList
);
956 Record
.push_back(D
->protocol_size());
957 for (const auto *I
: D
->protocols())
958 Record
.AddDeclRef(I
);
959 for (const auto &PL
: D
->protocol_locs())
960 Record
.AddSourceLocation(PL
);
961 Code
= serialization::DECL_OBJC_CATEGORY
;
964 void ASTDeclWriter::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl
*D
) {
966 Record
.AddDeclRef(D
->getClassInterface());
967 Code
= serialization::DECL_OBJC_COMPATIBLE_ALIAS
;
970 void ASTDeclWriter::VisitObjCPropertyDecl(ObjCPropertyDecl
*D
) {
972 Record
.AddSourceLocation(D
->getAtLoc());
973 Record
.AddSourceLocation(D
->getLParenLoc());
974 Record
.AddTypeRef(D
->getType());
975 Record
.AddTypeSourceInfo(D
->getTypeSourceInfo());
976 // FIXME: stable encoding
977 Record
.push_back((unsigned)D
->getPropertyAttributes());
978 Record
.push_back((unsigned)D
->getPropertyAttributesAsWritten());
979 // FIXME: stable encoding
980 Record
.push_back((unsigned)D
->getPropertyImplementation());
981 Record
.AddDeclarationName(D
->getGetterName());
982 Record
.AddSourceLocation(D
->getGetterNameLoc());
983 Record
.AddDeclarationName(D
->getSetterName());
984 Record
.AddSourceLocation(D
->getSetterNameLoc());
985 Record
.AddDeclRef(D
->getGetterMethodDecl());
986 Record
.AddDeclRef(D
->getSetterMethodDecl());
987 Record
.AddDeclRef(D
->getPropertyIvarDecl());
988 Code
= serialization::DECL_OBJC_PROPERTY
;
991 void ASTDeclWriter::VisitObjCImplDecl(ObjCImplDecl
*D
) {
992 VisitObjCContainerDecl(D
);
993 Record
.AddDeclRef(D
->getClassInterface());
994 // Abstract class (no need to define a stable serialization::DECL code).
997 void ASTDeclWriter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl
*D
) {
998 VisitObjCImplDecl(D
);
999 Record
.AddSourceLocation(D
->getCategoryNameLoc());
1000 Code
= serialization::DECL_OBJC_CATEGORY_IMPL
;
1003 void ASTDeclWriter::VisitObjCImplementationDecl(ObjCImplementationDecl
*D
) {
1004 VisitObjCImplDecl(D
);
1005 Record
.AddDeclRef(D
->getSuperClass());
1006 Record
.AddSourceLocation(D
->getSuperClassLoc());
1007 Record
.AddSourceLocation(D
->getIvarLBraceLoc());
1008 Record
.AddSourceLocation(D
->getIvarRBraceLoc());
1009 Record
.push_back(D
->hasNonZeroConstructors());
1010 Record
.push_back(D
->hasDestructors());
1011 Record
.push_back(D
->NumIvarInitializers
);
1012 if (D
->NumIvarInitializers
)
1013 Record
.AddCXXCtorInitializers(
1014 llvm::ArrayRef(D
->init_begin(), D
->init_end()));
1015 Code
= serialization::DECL_OBJC_IMPLEMENTATION
;
1018 void ASTDeclWriter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl
*D
) {
1020 Record
.AddSourceLocation(D
->getBeginLoc());
1021 Record
.AddDeclRef(D
->getPropertyDecl());
1022 Record
.AddDeclRef(D
->getPropertyIvarDecl());
1023 Record
.AddSourceLocation(D
->getPropertyIvarDeclLoc());
1024 Record
.AddDeclRef(D
->getGetterMethodDecl());
1025 Record
.AddDeclRef(D
->getSetterMethodDecl());
1026 Record
.AddStmt(D
->getGetterCXXConstructor());
1027 Record
.AddStmt(D
->getSetterCXXAssignment());
1028 Code
= serialization::DECL_OBJC_PROPERTY_IMPL
;
1031 void ASTDeclWriter::VisitFieldDecl(FieldDecl
*D
) {
1032 VisitDeclaratorDecl(D
);
1033 Record
.push_back(D
->isMutable());
1035 Record
.push_back((D
->StorageKind
<< 1) | D
->BitField
);
1036 if (D
->StorageKind
== FieldDecl::ISK_CapturedVLAType
)
1037 Record
.AddTypeRef(QualType(D
->getCapturedVLAType(), 0));
1038 else if (D
->BitField
)
1039 Record
.AddStmt(D
->getBitWidth());
1041 if (!D
->getDeclName())
1042 Record
.AddDeclRef(Context
.getInstantiatedFromUnnamedFieldDecl(D
));
1044 if (D
->getDeclContext() == D
->getLexicalDeclContext() &&
1047 !D
->isUsed(false) &&
1048 !D
->isInvalidDecl() &&
1049 !D
->isReferenced() &&
1050 !D
->isTopLevelDeclInObjCContainer() &&
1051 !D
->isModulePrivate() &&
1052 !D
->getBitWidth() &&
1053 !D
->hasInClassInitializer() &&
1054 !D
->hasCapturedVLAType() &&
1056 !ObjCIvarDecl::classofKind(D
->getKind()) &&
1057 !ObjCAtDefsFieldDecl::classofKind(D
->getKind()) &&
1059 AbbrevToUse
= Writer
.getDeclFieldAbbrev();
1061 Code
= serialization::DECL_FIELD
;
1064 void ASTDeclWriter::VisitMSPropertyDecl(MSPropertyDecl
*D
) {
1065 VisitDeclaratorDecl(D
);
1066 Record
.AddIdentifierRef(D
->getGetterId());
1067 Record
.AddIdentifierRef(D
->getSetterId());
1068 Code
= serialization::DECL_MS_PROPERTY
;
1071 void ASTDeclWriter::VisitMSGuidDecl(MSGuidDecl
*D
) {
1073 MSGuidDecl::Parts Parts
= D
->getParts();
1074 Record
.push_back(Parts
.Part1
);
1075 Record
.push_back(Parts
.Part2
);
1076 Record
.push_back(Parts
.Part3
);
1077 Record
.append(std::begin(Parts
.Part4And5
), std::end(Parts
.Part4And5
));
1078 Code
= serialization::DECL_MS_GUID
;
1081 void ASTDeclWriter::VisitUnnamedGlobalConstantDecl(
1082 UnnamedGlobalConstantDecl
*D
) {
1084 Record
.AddAPValue(D
->getValue());
1085 Code
= serialization::DECL_UNNAMED_GLOBAL_CONSTANT
;
1088 void ASTDeclWriter::VisitTemplateParamObjectDecl(TemplateParamObjectDecl
*D
) {
1090 Record
.AddAPValue(D
->getValue());
1091 Code
= serialization::DECL_TEMPLATE_PARAM_OBJECT
;
1094 void ASTDeclWriter::VisitIndirectFieldDecl(IndirectFieldDecl
*D
) {
1096 Record
.push_back(D
->getChainingSize());
1098 for (const auto *P
: D
->chain())
1099 Record
.AddDeclRef(P
);
1100 Code
= serialization::DECL_INDIRECTFIELD
;
1103 void ASTDeclWriter::VisitVarDecl(VarDecl
*D
) {
1104 VisitRedeclarable(D
);
1105 VisitDeclaratorDecl(D
);
1107 // The order matters here. It will be better to put the bit with higher
1108 // probability to be 0 in the end of the bits. See the comments in VisitDecl
1110 BitsPacker VarDeclBits
;
1111 VarDeclBits
.addBits(llvm::to_underlying(D
->getLinkageInternal()),
1114 bool ModulesCodegen
= false;
1115 if (Writer
.WritingModule
&& D
->getStorageDuration() == SD_Static
&&
1116 !D
->getDescribedVarTemplate()) {
1117 // When building a C++20 module interface unit or a partition unit, a
1118 // strong definition in the module interface is provided by the
1119 // compilation of that unit, not by its users. (Inline variables are still
1120 // emitted in module users.)
1122 (Writer
.WritingModule
->isInterfaceOrPartition() ||
1123 (D
->hasAttr
<DLLExportAttr
>() &&
1124 Writer
.Context
->getLangOpts().BuildingPCHWithObjectFile
)) &&
1125 Writer
.Context
->GetGVALinkageForVariable(D
) >= GVA_StrongExternal
;
1127 VarDeclBits
.addBit(ModulesCodegen
);
1129 VarDeclBits
.addBits(D
->getStorageClass(), /*BitWidth=*/3);
1130 VarDeclBits
.addBits(D
->getTSCSpec(), /*BitWidth=*/2);
1131 VarDeclBits
.addBits(D
->getInitStyle(), /*BitWidth=*/2);
1132 VarDeclBits
.addBit(D
->isARCPseudoStrong());
1134 bool HasDeducedType
= false;
1135 if (!isa
<ParmVarDecl
>(D
)) {
1136 VarDeclBits
.addBit(D
->isThisDeclarationADemotedDefinition());
1137 VarDeclBits
.addBit(D
->isExceptionVariable());
1138 VarDeclBits
.addBit(D
->isNRVOVariable());
1139 VarDeclBits
.addBit(D
->isCXXForRangeDecl());
1141 VarDeclBits
.addBit(D
->isInline());
1142 VarDeclBits
.addBit(D
->isInlineSpecified());
1143 VarDeclBits
.addBit(D
->isConstexpr());
1144 VarDeclBits
.addBit(D
->isInitCapture());
1145 VarDeclBits
.addBit(D
->isPreviousDeclInSameBlockScope());
1147 VarDeclBits
.addBit(D
->isEscapingByref());
1148 HasDeducedType
= D
->getType()->getContainedDeducedType();
1149 VarDeclBits
.addBit(HasDeducedType
);
1151 if (const auto *IPD
= dyn_cast
<ImplicitParamDecl
>(D
))
1152 VarDeclBits
.addBits(llvm::to_underlying(IPD
->getParameterKind()),
1155 VarDeclBits
.addBits(0, /*Width=*/3);
1157 VarDeclBits
.addBit(D
->isObjCForDecl());
1160 Record
.push_back(VarDeclBits
);
1163 Writer
.AddDeclRef(D
, Writer
.ModularCodegenDecls
);
1165 if (D
->hasAttr
<BlocksAttr
>()) {
1166 BlockVarCopyInit Init
= Writer
.Context
->getBlockVarCopyInit(D
);
1167 Record
.AddStmt(Init
.getCopyExpr());
1168 if (Init
.getCopyExpr())
1169 Record
.push_back(Init
.canThrow());
1173 VarNotTemplate
= 0, VarTemplate
, StaticDataMemberSpecialization
1175 if (VarTemplateDecl
*TemplD
= D
->getDescribedVarTemplate()) {
1176 Record
.push_back(VarTemplate
);
1177 Record
.AddDeclRef(TemplD
);
1178 } else if (MemberSpecializationInfo
*SpecInfo
1179 = D
->getMemberSpecializationInfo()) {
1180 Record
.push_back(StaticDataMemberSpecialization
);
1181 Record
.AddDeclRef(SpecInfo
->getInstantiatedFrom());
1182 Record
.push_back(SpecInfo
->getTemplateSpecializationKind());
1183 Record
.AddSourceLocation(SpecInfo
->getPointOfInstantiation());
1185 Record
.push_back(VarNotTemplate
);
1188 if (D
->getDeclContext() == D
->getLexicalDeclContext() && !D
->hasAttrs() &&
1189 !D
->isTopLevelDeclInObjCContainer() &&
1190 !needsAnonymousDeclarationNumber(D
) &&
1191 D
->getDeclName().getNameKind() == DeclarationName::Identifier
&&
1192 !D
->hasExtInfo() && D
->getFirstDecl() == D
->getMostRecentDecl() &&
1193 D
->getKind() == Decl::Var
&& !D
->isInline() && !D
->isConstexpr() &&
1194 !D
->isInitCapture() && !D
->isPreviousDeclInSameBlockScope() &&
1195 !D
->isEscapingByref() && !HasDeducedType
&&
1196 D
->getStorageDuration() != SD_Static
&& !D
->getDescribedVarTemplate() &&
1197 !D
->getMemberSpecializationInfo() && !D
->isObjCForDecl() &&
1198 !isa
<ImplicitParamDecl
>(D
) && !D
->isEscapingByref())
1199 AbbrevToUse
= Writer
.getDeclVarAbbrev();
1201 Code
= serialization::DECL_VAR
;
1204 void ASTDeclWriter::VisitImplicitParamDecl(ImplicitParamDecl
*D
) {
1206 Code
= serialization::DECL_IMPLICIT_PARAM
;
1209 void ASTDeclWriter::VisitParmVarDecl(ParmVarDecl
*D
) {
1212 // See the implementation of `ParmVarDecl::getParameterIndex()`, which may
1213 // exceed the size of the normal bitfield. So it may be better to not pack
1215 Record
.push_back(D
->getFunctionScopeIndex());
1217 BitsPacker ParmVarDeclBits
;
1218 ParmVarDeclBits
.addBit(D
->isObjCMethodParameter());
1219 ParmVarDeclBits
.addBits(D
->getFunctionScopeDepth(), /*BitsWidth=*/7);
1220 // FIXME: stable encoding
1221 ParmVarDeclBits
.addBits(D
->getObjCDeclQualifier(), /*BitsWidth=*/7);
1222 ParmVarDeclBits
.addBit(D
->isKNRPromoted());
1223 ParmVarDeclBits
.addBit(D
->hasInheritedDefaultArg());
1224 ParmVarDeclBits
.addBit(D
->hasUninstantiatedDefaultArg());
1225 ParmVarDeclBits
.addBit(D
->getExplicitObjectParamThisLoc().isValid());
1226 Record
.push_back(ParmVarDeclBits
);
1228 if (D
->hasUninstantiatedDefaultArg())
1229 Record
.AddStmt(D
->getUninstantiatedDefaultArg());
1230 if (D
->getExplicitObjectParamThisLoc().isValid())
1231 Record
.AddSourceLocation(D
->getExplicitObjectParamThisLoc());
1232 Code
= serialization::DECL_PARM_VAR
;
1234 // If the assumptions about the DECL_PARM_VAR abbrev are true, use it. Here
1235 // we dynamically check for the properties that we optimize for, but don't
1236 // know are true of all PARM_VAR_DECLs.
1237 if (D
->getDeclContext() == D
->getLexicalDeclContext() && !D
->hasAttrs() &&
1238 !D
->hasExtInfo() && D
->getStorageClass() == 0 && !D
->isInvalidDecl() &&
1239 !D
->isTopLevelDeclInObjCContainer() &&
1240 D
->getInitStyle() == VarDecl::CInit
&& // Can params have anything else?
1241 D
->getInit() == nullptr) // No default expr.
1242 AbbrevToUse
= Writer
.getDeclParmVarAbbrev();
1244 // Check things we know are true of *every* PARM_VAR_DECL, which is more than
1245 // just us assuming it.
1246 assert(!D
->getTSCSpec() && "PARM_VAR_DECL can't use TLS");
1247 assert(!D
->isThisDeclarationADemotedDefinition()
1248 && "PARM_VAR_DECL can't be demoted definition.");
1249 assert(D
->getAccess() == AS_none
&& "PARM_VAR_DECL can't be public/private");
1250 assert(!D
->isExceptionVariable() && "PARM_VAR_DECL can't be exception var");
1251 assert(D
->getPreviousDecl() == nullptr && "PARM_VAR_DECL can't be redecl");
1252 assert(!D
->isStaticDataMember() &&
1253 "PARM_VAR_DECL can't be static data member");
1256 void ASTDeclWriter::VisitDecompositionDecl(DecompositionDecl
*D
) {
1257 // Record the number of bindings first to simplify deserialization.
1258 Record
.push_back(D
->bindings().size());
1261 for (auto *B
: D
->bindings())
1262 Record
.AddDeclRef(B
);
1263 Code
= serialization::DECL_DECOMPOSITION
;
1266 void ASTDeclWriter::VisitBindingDecl(BindingDecl
*D
) {
1268 Record
.AddStmt(D
->getBinding());
1269 Code
= serialization::DECL_BINDING
;
1272 void ASTDeclWriter::VisitFileScopeAsmDecl(FileScopeAsmDecl
*D
) {
1274 Record
.AddStmt(D
->getAsmString());
1275 Record
.AddSourceLocation(D
->getRParenLoc());
1276 Code
= serialization::DECL_FILE_SCOPE_ASM
;
1279 void ASTDeclWriter::VisitTopLevelStmtDecl(TopLevelStmtDecl
*D
) {
1281 Record
.AddStmt(D
->getStmt());
1282 Code
= serialization::DECL_TOP_LEVEL_STMT_DECL
;
1285 void ASTDeclWriter::VisitEmptyDecl(EmptyDecl
*D
) {
1287 Code
= serialization::DECL_EMPTY
;
1290 void ASTDeclWriter::VisitLifetimeExtendedTemporaryDecl(
1291 LifetimeExtendedTemporaryDecl
*D
) {
1293 Record
.AddDeclRef(D
->getExtendingDecl());
1294 Record
.AddStmt(D
->getTemporaryExpr());
1295 Record
.push_back(static_cast<bool>(D
->getValue()));
1297 Record
.AddAPValue(*D
->getValue());
1298 Record
.push_back(D
->getManglingNumber());
1299 Code
= serialization::DECL_LIFETIME_EXTENDED_TEMPORARY
;
1301 void ASTDeclWriter::VisitBlockDecl(BlockDecl
*D
) {
1303 Record
.AddStmt(D
->getBody());
1304 Record
.AddTypeSourceInfo(D
->getSignatureAsWritten());
1305 Record
.push_back(D
->param_size());
1306 for (ParmVarDecl
*P
: D
->parameters())
1307 Record
.AddDeclRef(P
);
1308 Record
.push_back(D
->isVariadic());
1309 Record
.push_back(D
->blockMissingReturnType());
1310 Record
.push_back(D
->isConversionFromLambda());
1311 Record
.push_back(D
->doesNotEscape());
1312 Record
.push_back(D
->canAvoidCopyToHeap());
1313 Record
.push_back(D
->capturesCXXThis());
1314 Record
.push_back(D
->getNumCaptures());
1315 for (const auto &capture
: D
->captures()) {
1316 Record
.AddDeclRef(capture
.getVariable());
1319 if (capture
.isByRef()) flags
|= 1;
1320 if (capture
.isNested()) flags
|= 2;
1321 if (capture
.hasCopyExpr()) flags
|= 4;
1322 Record
.push_back(flags
);
1324 if (capture
.hasCopyExpr()) Record
.AddStmt(capture
.getCopyExpr());
1327 Code
= serialization::DECL_BLOCK
;
1330 void ASTDeclWriter::VisitCapturedDecl(CapturedDecl
*CD
) {
1331 Record
.push_back(CD
->getNumParams());
1333 Record
.push_back(CD
->getContextParamPosition());
1334 Record
.push_back(CD
->isNothrow() ? 1 : 0);
1335 // Body is stored by VisitCapturedStmt.
1336 for (unsigned I
= 0; I
< CD
->getNumParams(); ++I
)
1337 Record
.AddDeclRef(CD
->getParam(I
));
1338 Code
= serialization::DECL_CAPTURED
;
1341 void ASTDeclWriter::VisitLinkageSpecDecl(LinkageSpecDecl
*D
) {
1342 static_assert(DeclContext::NumLinkageSpecDeclBits
== 17,
1343 "You need to update the serializer after you change the"
1344 "LinkageSpecDeclBits");
1347 Record
.push_back(llvm::to_underlying(D
->getLanguage()));
1348 Record
.AddSourceLocation(D
->getExternLoc());
1349 Record
.AddSourceLocation(D
->getRBraceLoc());
1350 Code
= serialization::DECL_LINKAGE_SPEC
;
1353 void ASTDeclWriter::VisitExportDecl(ExportDecl
*D
) {
1355 Record
.AddSourceLocation(D
->getRBraceLoc());
1356 Code
= serialization::DECL_EXPORT
;
1359 void ASTDeclWriter::VisitLabelDecl(LabelDecl
*D
) {
1361 Record
.AddSourceLocation(D
->getBeginLoc());
1362 Code
= serialization::DECL_LABEL
;
1366 void ASTDeclWriter::VisitNamespaceDecl(NamespaceDecl
*D
) {
1367 VisitRedeclarable(D
);
1370 BitsPacker NamespaceDeclBits
;
1371 NamespaceDeclBits
.addBit(D
->isInline());
1372 NamespaceDeclBits
.addBit(D
->isNested());
1373 Record
.push_back(NamespaceDeclBits
);
1375 Record
.AddSourceLocation(D
->getBeginLoc());
1376 Record
.AddSourceLocation(D
->getRBraceLoc());
1378 if (D
->isFirstDecl())
1379 Record
.AddDeclRef(D
->getAnonymousNamespace());
1380 Code
= serialization::DECL_NAMESPACE
;
1382 if (Writer
.hasChain() && D
->isAnonymousNamespace() &&
1383 D
== D
->getMostRecentDecl()) {
1384 // This is a most recent reopening of the anonymous namespace. If its parent
1385 // is in a previous PCH (or is the TU), mark that parent for update, because
1386 // the original namespace always points to the latest re-opening of its
1387 // anonymous namespace.
1388 Decl
*Parent
= cast
<Decl
>(
1389 D
->getParent()->getRedeclContext()->getPrimaryContext());
1390 if (Parent
->isFromASTFile() || isa
<TranslationUnitDecl
>(Parent
)) {
1391 Writer
.DeclUpdates
[Parent
].push_back(
1392 ASTWriter::DeclUpdate(UPD_CXX_ADDED_ANONYMOUS_NAMESPACE
, D
));
1397 void ASTDeclWriter::VisitNamespaceAliasDecl(NamespaceAliasDecl
*D
) {
1398 VisitRedeclarable(D
);
1400 Record
.AddSourceLocation(D
->getNamespaceLoc());
1401 Record
.AddSourceLocation(D
->getTargetNameLoc());
1402 Record
.AddNestedNameSpecifierLoc(D
->getQualifierLoc());
1403 Record
.AddDeclRef(D
->getNamespace());
1404 Code
= serialization::DECL_NAMESPACE_ALIAS
;
1407 void ASTDeclWriter::VisitUsingDecl(UsingDecl
*D
) {
1409 Record
.AddSourceLocation(D
->getUsingLoc());
1410 Record
.AddNestedNameSpecifierLoc(D
->getQualifierLoc());
1411 Record
.AddDeclarationNameLoc(D
->DNLoc
, D
->getDeclName());
1412 Record
.AddDeclRef(D
->FirstUsingShadow
.getPointer());
1413 Record
.push_back(D
->hasTypename());
1414 Record
.AddDeclRef(Context
.getInstantiatedFromUsingDecl(D
));
1415 Code
= serialization::DECL_USING
;
1418 void ASTDeclWriter::VisitUsingEnumDecl(UsingEnumDecl
*D
) {
1420 Record
.AddSourceLocation(D
->getUsingLoc());
1421 Record
.AddSourceLocation(D
->getEnumLoc());
1422 Record
.AddTypeSourceInfo(D
->getEnumType());
1423 Record
.AddDeclRef(D
->FirstUsingShadow
.getPointer());
1424 Record
.AddDeclRef(Context
.getInstantiatedFromUsingEnumDecl(D
));
1425 Code
= serialization::DECL_USING_ENUM
;
1428 void ASTDeclWriter::VisitUsingPackDecl(UsingPackDecl
*D
) {
1429 Record
.push_back(D
->NumExpansions
);
1431 Record
.AddDeclRef(D
->getInstantiatedFromUsingDecl());
1432 for (auto *E
: D
->expansions())
1433 Record
.AddDeclRef(E
);
1434 Code
= serialization::DECL_USING_PACK
;
1437 void ASTDeclWriter::VisitUsingShadowDecl(UsingShadowDecl
*D
) {
1438 VisitRedeclarable(D
);
1440 Record
.AddDeclRef(D
->getTargetDecl());
1441 Record
.push_back(D
->getIdentifierNamespace());
1442 Record
.AddDeclRef(D
->UsingOrNextShadow
);
1443 Record
.AddDeclRef(Context
.getInstantiatedFromUsingShadowDecl(D
));
1445 if (D
->getDeclContext() == D
->getLexicalDeclContext() &&
1446 D
->getFirstDecl() == D
->getMostRecentDecl() && !D
->hasAttrs() &&
1447 !needsAnonymousDeclarationNumber(D
) &&
1448 D
->getDeclName().getNameKind() == DeclarationName::Identifier
)
1449 AbbrevToUse
= Writer
.getDeclUsingShadowAbbrev();
1451 Code
= serialization::DECL_USING_SHADOW
;
1454 void ASTDeclWriter::VisitConstructorUsingShadowDecl(
1455 ConstructorUsingShadowDecl
*D
) {
1456 VisitUsingShadowDecl(D
);
1457 Record
.AddDeclRef(D
->NominatedBaseClassShadowDecl
);
1458 Record
.AddDeclRef(D
->ConstructedBaseClassShadowDecl
);
1459 Record
.push_back(D
->IsVirtual
);
1460 Code
= serialization::DECL_CONSTRUCTOR_USING_SHADOW
;
1463 void ASTDeclWriter::VisitUsingDirectiveDecl(UsingDirectiveDecl
*D
) {
1465 Record
.AddSourceLocation(D
->getUsingLoc());
1466 Record
.AddSourceLocation(D
->getNamespaceKeyLocation());
1467 Record
.AddNestedNameSpecifierLoc(D
->getQualifierLoc());
1468 Record
.AddDeclRef(D
->getNominatedNamespace());
1469 Record
.AddDeclRef(dyn_cast
<Decl
>(D
->getCommonAncestor()));
1470 Code
= serialization::DECL_USING_DIRECTIVE
;
1473 void ASTDeclWriter::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl
*D
) {
1475 Record
.AddSourceLocation(D
->getUsingLoc());
1476 Record
.AddNestedNameSpecifierLoc(D
->getQualifierLoc());
1477 Record
.AddDeclarationNameLoc(D
->DNLoc
, D
->getDeclName());
1478 Record
.AddSourceLocation(D
->getEllipsisLoc());
1479 Code
= serialization::DECL_UNRESOLVED_USING_VALUE
;
1482 void ASTDeclWriter::VisitUnresolvedUsingTypenameDecl(
1483 UnresolvedUsingTypenameDecl
*D
) {
1485 Record
.AddSourceLocation(D
->getTypenameLoc());
1486 Record
.AddNestedNameSpecifierLoc(D
->getQualifierLoc());
1487 Record
.AddSourceLocation(D
->getEllipsisLoc());
1488 Code
= serialization::DECL_UNRESOLVED_USING_TYPENAME
;
1491 void ASTDeclWriter::VisitUnresolvedUsingIfExistsDecl(
1492 UnresolvedUsingIfExistsDecl
*D
) {
1494 Code
= serialization::DECL_UNRESOLVED_USING_IF_EXISTS
;
1497 void ASTDeclWriter::VisitCXXRecordDecl(CXXRecordDecl
*D
) {
1501 CXXRecNotTemplate
= 0,
1503 CXXRecMemberSpecialization
,
1506 if (ClassTemplateDecl
*TemplD
= D
->getDescribedClassTemplate()) {
1507 Record
.push_back(CXXRecTemplate
);
1508 Record
.AddDeclRef(TemplD
);
1509 } else if (MemberSpecializationInfo
*MSInfo
1510 = D
->getMemberSpecializationInfo()) {
1511 Record
.push_back(CXXRecMemberSpecialization
);
1512 Record
.AddDeclRef(MSInfo
->getInstantiatedFrom());
1513 Record
.push_back(MSInfo
->getTemplateSpecializationKind());
1514 Record
.AddSourceLocation(MSInfo
->getPointOfInstantiation());
1515 } else if (D
->isLambda()) {
1516 // For a lambda, we need some information early for merging.
1517 Record
.push_back(CXXLambda
);
1518 if (auto *Context
= D
->getLambdaContextDecl()) {
1519 Record
.AddDeclRef(Context
);
1520 Record
.push_back(D
->getLambdaIndexInContext());
1522 Record
.push_back(0);
1525 Record
.push_back(CXXRecNotTemplate
);
1528 Record
.push_back(D
->isThisDeclarationADefinition());
1529 if (D
->isThisDeclarationADefinition())
1530 Record
.AddCXXDefinitionData(D
);
1532 if (D
->isCompleteDefinition() && D
->isInNamedModule())
1533 Writer
.AddDeclRef(D
, Writer
.ModularCodegenDecls
);
1535 // Store (what we currently believe to be) the key function to avoid
1536 // deserializing every method so we can compute it.
1538 // FIXME: Avoid adding the key function if the class is defined in
1539 // module purview since in that case the key function is meaningless.
1540 if (D
->isCompleteDefinition())
1541 Record
.AddDeclRef(Context
.getCurrentKeyFunction(D
));
1543 Code
= serialization::DECL_CXX_RECORD
;
1546 void ASTDeclWriter::VisitCXXMethodDecl(CXXMethodDecl
*D
) {
1547 VisitFunctionDecl(D
);
1548 if (D
->isCanonicalDecl()) {
1549 Record
.push_back(D
->size_overridden_methods());
1550 for (const CXXMethodDecl
*MD
: D
->overridden_methods())
1551 Record
.AddDeclRef(MD
);
1553 // We only need to record overridden methods once for the canonical decl.
1554 Record
.push_back(0);
1557 if (D
->getDeclContext() == D
->getLexicalDeclContext() &&
1558 D
->getFirstDecl() == D
->getMostRecentDecl() && !D
->isInvalidDecl() &&
1559 !D
->hasAttrs() && !D
->isTopLevelDeclInObjCContainer() &&
1560 D
->getDeclName().getNameKind() == DeclarationName::Identifier
&&
1561 !D
->hasExtInfo() && !D
->isExplicitlyDefaulted()) {
1562 if (D
->getTemplatedKind() == FunctionDecl::TK_NonTemplate
||
1563 D
->getTemplatedKind() == FunctionDecl::TK_FunctionTemplate
||
1564 D
->getTemplatedKind() == FunctionDecl::TK_MemberSpecialization
||
1565 D
->getTemplatedKind() == FunctionDecl::TK_DependentNonTemplate
)
1566 AbbrevToUse
= Writer
.getDeclCXXMethodAbbrev(D
->getTemplatedKind());
1567 else if (D
->getTemplatedKind() ==
1568 FunctionDecl::TK_FunctionTemplateSpecialization
) {
1569 FunctionTemplateSpecializationInfo
*FTSInfo
=
1570 D
->getTemplateSpecializationInfo();
1572 if (FTSInfo
->TemplateArguments
->size() == 1) {
1573 const TemplateArgument
&TA
= FTSInfo
->TemplateArguments
->get(0);
1574 if (TA
.getKind() == TemplateArgument::Type
&&
1575 !FTSInfo
->TemplateArgumentsAsWritten
&&
1576 !FTSInfo
->getMemberSpecializationInfo())
1577 AbbrevToUse
= Writer
.getDeclCXXMethodAbbrev(D
->getTemplatedKind());
1579 } else if (D
->getTemplatedKind() ==
1580 FunctionDecl::TK_DependentFunctionTemplateSpecialization
) {
1581 DependentFunctionTemplateSpecializationInfo
*DFTSInfo
=
1582 D
->getDependentSpecializationInfo();
1583 if (!DFTSInfo
->TemplateArgumentsAsWritten
)
1584 AbbrevToUse
= Writer
.getDeclCXXMethodAbbrev(D
->getTemplatedKind());
1588 Code
= serialization::DECL_CXX_METHOD
;
1591 void ASTDeclWriter::VisitCXXConstructorDecl(CXXConstructorDecl
*D
) {
1592 static_assert(DeclContext::NumCXXConstructorDeclBits
== 64,
1593 "You need to update the serializer after you change the "
1594 "CXXConstructorDeclBits");
1596 Record
.push_back(D
->getTrailingAllocKind());
1597 addExplicitSpecifier(D
->getExplicitSpecifier(), Record
);
1598 if (auto Inherited
= D
->getInheritedConstructor()) {
1599 Record
.AddDeclRef(Inherited
.getShadowDecl());
1600 Record
.AddDeclRef(Inherited
.getConstructor());
1603 VisitCXXMethodDecl(D
);
1604 Code
= serialization::DECL_CXX_CONSTRUCTOR
;
1607 void ASTDeclWriter::VisitCXXDestructorDecl(CXXDestructorDecl
*D
) {
1608 VisitCXXMethodDecl(D
);
1610 Record
.AddDeclRef(D
->getOperatorDelete());
1611 if (D
->getOperatorDelete())
1612 Record
.AddStmt(D
->getOperatorDeleteThisArg());
1614 Code
= serialization::DECL_CXX_DESTRUCTOR
;
1617 void ASTDeclWriter::VisitCXXConversionDecl(CXXConversionDecl
*D
) {
1618 addExplicitSpecifier(D
->getExplicitSpecifier(), Record
);
1619 VisitCXXMethodDecl(D
);
1620 Code
= serialization::DECL_CXX_CONVERSION
;
1623 void ASTDeclWriter::VisitImportDecl(ImportDecl
*D
) {
1625 Record
.push_back(Writer
.getSubmoduleID(D
->getImportedModule()));
1626 ArrayRef
<SourceLocation
> IdentifierLocs
= D
->getIdentifierLocs();
1627 Record
.push_back(!IdentifierLocs
.empty());
1628 if (IdentifierLocs
.empty()) {
1629 Record
.AddSourceLocation(D
->getEndLoc());
1630 Record
.push_back(1);
1632 for (unsigned I
= 0, N
= IdentifierLocs
.size(); I
!= N
; ++I
)
1633 Record
.AddSourceLocation(IdentifierLocs
[I
]);
1634 Record
.push_back(IdentifierLocs
.size());
1636 // Note: the number of source locations must always be the last element in
1638 Code
= serialization::DECL_IMPORT
;
1641 void ASTDeclWriter::VisitAccessSpecDecl(AccessSpecDecl
*D
) {
1643 Record
.AddSourceLocation(D
->getColonLoc());
1644 Code
= serialization::DECL_ACCESS_SPEC
;
1647 void ASTDeclWriter::VisitFriendDecl(FriendDecl
*D
) {
1648 // Record the number of friend type template parameter lists here
1649 // so as to simplify memory allocation during deserialization.
1650 Record
.push_back(D
->NumTPLists
);
1652 bool hasFriendDecl
= D
->Friend
.is
<NamedDecl
*>();
1653 Record
.push_back(hasFriendDecl
);
1655 Record
.AddDeclRef(D
->getFriendDecl());
1657 Record
.AddTypeSourceInfo(D
->getFriendType());
1658 for (unsigned i
= 0; i
< D
->NumTPLists
; ++i
)
1659 Record
.AddTemplateParameterList(D
->getFriendTypeTemplateParameterList(i
));
1660 Record
.AddDeclRef(D
->getNextFriend());
1661 Record
.push_back(D
->UnsupportedFriend
);
1662 Record
.AddSourceLocation(D
->FriendLoc
);
1663 Code
= serialization::DECL_FRIEND
;
1666 void ASTDeclWriter::VisitFriendTemplateDecl(FriendTemplateDecl
*D
) {
1668 Record
.push_back(D
->getNumTemplateParameters());
1669 for (unsigned i
= 0, e
= D
->getNumTemplateParameters(); i
!= e
; ++i
)
1670 Record
.AddTemplateParameterList(D
->getTemplateParameterList(i
));
1671 Record
.push_back(D
->getFriendDecl() != nullptr);
1672 if (D
->getFriendDecl())
1673 Record
.AddDeclRef(D
->getFriendDecl());
1675 Record
.AddTypeSourceInfo(D
->getFriendType());
1676 Record
.AddSourceLocation(D
->getFriendLoc());
1677 Code
= serialization::DECL_FRIEND_TEMPLATE
;
1680 void ASTDeclWriter::VisitTemplateDecl(TemplateDecl
*D
) {
1683 Record
.AddTemplateParameterList(D
->getTemplateParameters());
1684 Record
.AddDeclRef(D
->getTemplatedDecl());
1687 void ASTDeclWriter::VisitConceptDecl(ConceptDecl
*D
) {
1688 VisitTemplateDecl(D
);
1689 Record
.AddStmt(D
->getConstraintExpr());
1690 Code
= serialization::DECL_CONCEPT
;
1693 void ASTDeclWriter::VisitImplicitConceptSpecializationDecl(
1694 ImplicitConceptSpecializationDecl
*D
) {
1695 Record
.push_back(D
->getTemplateArguments().size());
1697 for (const TemplateArgument
&Arg
: D
->getTemplateArguments())
1698 Record
.AddTemplateArgument(Arg
);
1699 Code
= serialization::DECL_IMPLICIT_CONCEPT_SPECIALIZATION
;
1702 void ASTDeclWriter::VisitRequiresExprBodyDecl(RequiresExprBodyDecl
*D
) {
1703 Code
= serialization::DECL_REQUIRES_EXPR_BODY
;
1706 void ASTDeclWriter::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl
*D
) {
1707 VisitRedeclarable(D
);
1709 // Emit data to initialize CommonOrPrev before VisitTemplateDecl so that
1710 // getCommonPtr() can be used while this is still initializing.
1711 if (D
->isFirstDecl()) {
1712 // This declaration owns the 'common' pointer, so serialize that data now.
1713 Record
.AddDeclRef(D
->getInstantiatedFromMemberTemplate());
1714 if (D
->getInstantiatedFromMemberTemplate())
1715 Record
.push_back(D
->isMemberSpecialization());
1718 VisitTemplateDecl(D
);
1719 Record
.push_back(D
->getIdentifierNamespace());
1722 void ASTDeclWriter::VisitClassTemplateDecl(ClassTemplateDecl
*D
) {
1723 VisitRedeclarableTemplateDecl(D
);
1725 if (D
->isFirstDecl())
1726 AddTemplateSpecializations(D
);
1728 // Force emitting the corresponding deduction guide in reduced BMI mode.
1729 // Otherwise, the deduction guide may be optimized out incorrectly.
1730 if (Writer
.isGeneratingReducedBMI()) {
1731 auto Name
= Context
.DeclarationNames
.getCXXDeductionGuideName(D
);
1732 for (auto *DG
: D
->getDeclContext()->noload_lookup(Name
))
1733 Writer
.GetDeclRef(DG
->getCanonicalDecl());
1736 Code
= serialization::DECL_CLASS_TEMPLATE
;
1739 void ASTDeclWriter::VisitClassTemplateSpecializationDecl(
1740 ClassTemplateSpecializationDecl
*D
) {
1741 RegisterTemplateSpecialization(D
->getSpecializedTemplate(), D
);
1743 VisitCXXRecordDecl(D
);
1745 llvm::PointerUnion
<ClassTemplateDecl
*,
1746 ClassTemplatePartialSpecializationDecl
*> InstFrom
1747 = D
->getSpecializedTemplateOrPartial();
1748 if (Decl
*InstFromD
= InstFrom
.dyn_cast
<ClassTemplateDecl
*>()) {
1749 Record
.AddDeclRef(InstFromD
);
1751 Record
.AddDeclRef(InstFrom
.get
<ClassTemplatePartialSpecializationDecl
*>());
1752 Record
.AddTemplateArgumentList(&D
->getTemplateInstantiationArgs());
1755 Record
.AddTemplateArgumentList(&D
->getTemplateArgs());
1756 Record
.AddSourceLocation(D
->getPointOfInstantiation());
1757 Record
.push_back(D
->getSpecializationKind());
1758 Record
.push_back(D
->isCanonicalDecl());
1760 if (D
->isCanonicalDecl()) {
1761 // When reading, we'll add it to the folding set of the following template.
1762 Record
.AddDeclRef(D
->getSpecializedTemplate()->getCanonicalDecl());
1765 bool ExplicitInstantiation
=
1766 D
->getTemplateSpecializationKind() ==
1767 TSK_ExplicitInstantiationDeclaration
||
1768 D
->getTemplateSpecializationKind() == TSK_ExplicitInstantiationDefinition
;
1769 Record
.push_back(ExplicitInstantiation
);
1770 if (ExplicitInstantiation
) {
1771 Record
.AddSourceLocation(D
->getExternKeywordLoc());
1772 Record
.AddSourceLocation(D
->getTemplateKeywordLoc());
1775 const ASTTemplateArgumentListInfo
*ArgsWritten
=
1776 D
->getTemplateArgsAsWritten();
1777 Record
.push_back(!!ArgsWritten
);
1779 Record
.AddASTTemplateArgumentListInfo(ArgsWritten
);
1781 Code
= serialization::DECL_CLASS_TEMPLATE_SPECIALIZATION
;
1784 void ASTDeclWriter::VisitClassTemplatePartialSpecializationDecl(
1785 ClassTemplatePartialSpecializationDecl
*D
) {
1786 Record
.AddTemplateParameterList(D
->getTemplateParameters());
1788 VisitClassTemplateSpecializationDecl(D
);
1790 // These are read/set from/to the first declaration.
1791 if (D
->getPreviousDecl() == nullptr) {
1792 Record
.AddDeclRef(D
->getInstantiatedFromMember());
1793 Record
.push_back(D
->isMemberSpecialization());
1796 Code
= serialization::DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
;
1799 void ASTDeclWriter::VisitVarTemplateDecl(VarTemplateDecl
*D
) {
1800 VisitRedeclarableTemplateDecl(D
);
1802 if (D
->isFirstDecl())
1803 AddTemplateSpecializations(D
);
1804 Code
= serialization::DECL_VAR_TEMPLATE
;
1807 void ASTDeclWriter::VisitVarTemplateSpecializationDecl(
1808 VarTemplateSpecializationDecl
*D
) {
1809 RegisterTemplateSpecialization(D
->getSpecializedTemplate(), D
);
1811 llvm::PointerUnion
<VarTemplateDecl
*, VarTemplatePartialSpecializationDecl
*>
1812 InstFrom
= D
->getSpecializedTemplateOrPartial();
1813 if (Decl
*InstFromD
= InstFrom
.dyn_cast
<VarTemplateDecl
*>()) {
1814 Record
.AddDeclRef(InstFromD
);
1816 Record
.AddDeclRef(InstFrom
.get
<VarTemplatePartialSpecializationDecl
*>());
1817 Record
.AddTemplateArgumentList(&D
->getTemplateInstantiationArgs());
1820 bool ExplicitInstantiation
=
1821 D
->getTemplateSpecializationKind() ==
1822 TSK_ExplicitInstantiationDeclaration
||
1823 D
->getTemplateSpecializationKind() == TSK_ExplicitInstantiationDefinition
;
1824 Record
.push_back(ExplicitInstantiation
);
1825 if (ExplicitInstantiation
) {
1826 Record
.AddSourceLocation(D
->getExternKeywordLoc());
1827 Record
.AddSourceLocation(D
->getTemplateKeywordLoc());
1830 const ASTTemplateArgumentListInfo
*ArgsWritten
=
1831 D
->getTemplateArgsAsWritten();
1832 Record
.push_back(!!ArgsWritten
);
1834 Record
.AddASTTemplateArgumentListInfo(ArgsWritten
);
1836 Record
.AddTemplateArgumentList(&D
->getTemplateArgs());
1837 Record
.AddSourceLocation(D
->getPointOfInstantiation());
1838 Record
.push_back(D
->getSpecializationKind());
1839 Record
.push_back(D
->IsCompleteDefinition
);
1843 Record
.push_back(D
->isCanonicalDecl());
1845 if (D
->isCanonicalDecl()) {
1846 // When reading, we'll add it to the folding set of the following template.
1847 Record
.AddDeclRef(D
->getSpecializedTemplate()->getCanonicalDecl());
1850 Code
= serialization::DECL_VAR_TEMPLATE_SPECIALIZATION
;
1853 void ASTDeclWriter::VisitVarTemplatePartialSpecializationDecl(
1854 VarTemplatePartialSpecializationDecl
*D
) {
1855 Record
.AddTemplateParameterList(D
->getTemplateParameters());
1857 VisitVarTemplateSpecializationDecl(D
);
1859 // These are read/set from/to the first declaration.
1860 if (D
->getPreviousDecl() == nullptr) {
1861 Record
.AddDeclRef(D
->getInstantiatedFromMember());
1862 Record
.push_back(D
->isMemberSpecialization());
1865 Code
= serialization::DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION
;
1868 void ASTDeclWriter::VisitFunctionTemplateDecl(FunctionTemplateDecl
*D
) {
1869 VisitRedeclarableTemplateDecl(D
);
1871 if (D
->isFirstDecl())
1872 AddTemplateSpecializations(D
);
1873 Code
= serialization::DECL_FUNCTION_TEMPLATE
;
1876 void ASTDeclWriter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl
*D
) {
1877 Record
.push_back(D
->hasTypeConstraint());
1880 Record
.push_back(D
->wasDeclaredWithTypename());
1882 const TypeConstraint
*TC
= D
->getTypeConstraint();
1883 Record
.push_back(/*TypeConstraintInitialized=*/TC
!= nullptr);
1885 auto *CR
= TC
->getConceptReference();
1886 Record
.push_back(CR
!= nullptr);
1888 Record
.AddConceptReference(CR
);
1889 Record
.AddStmt(TC
->getImmediatelyDeclaredConstraint());
1890 Record
.push_back(D
->isExpandedParameterPack());
1891 if (D
->isExpandedParameterPack())
1892 Record
.push_back(D
->getNumExpansionParameters());
1895 bool OwnsDefaultArg
= D
->hasDefaultArgument() &&
1896 !D
->defaultArgumentWasInherited();
1897 Record
.push_back(OwnsDefaultArg
);
1899 Record
.AddTemplateArgumentLoc(D
->getDefaultArgument());
1901 if (!D
->hasTypeConstraint() && !OwnsDefaultArg
&&
1902 D
->getDeclContext() == D
->getLexicalDeclContext() &&
1903 !D
->isInvalidDecl() && !D
->hasAttrs() &&
1904 !D
->isTopLevelDeclInObjCContainer() && !D
->isImplicit() &&
1905 D
->getDeclName().getNameKind() == DeclarationName::Identifier
)
1906 AbbrevToUse
= Writer
.getDeclTemplateTypeParmAbbrev();
1908 Code
= serialization::DECL_TEMPLATE_TYPE_PARM
;
1911 void ASTDeclWriter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl
*D
) {
1912 // For an expanded parameter pack, record the number of expansion types here
1913 // so that it's easier for deserialization to allocate the right amount of
1915 Expr
*TypeConstraint
= D
->getPlaceholderTypeConstraint();
1916 Record
.push_back(!!TypeConstraint
);
1917 if (D
->isExpandedParameterPack())
1918 Record
.push_back(D
->getNumExpansionTypes());
1920 VisitDeclaratorDecl(D
);
1921 // TemplateParmPosition.
1922 Record
.push_back(D
->getDepth());
1923 Record
.push_back(D
->getPosition());
1925 Record
.AddStmt(TypeConstraint
);
1927 if (D
->isExpandedParameterPack()) {
1928 for (unsigned I
= 0, N
= D
->getNumExpansionTypes(); I
!= N
; ++I
) {
1929 Record
.AddTypeRef(D
->getExpansionType(I
));
1930 Record
.AddTypeSourceInfo(D
->getExpansionTypeSourceInfo(I
));
1933 Code
= serialization::DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK
;
1935 // Rest of NonTypeTemplateParmDecl.
1936 Record
.push_back(D
->isParameterPack());
1937 bool OwnsDefaultArg
= D
->hasDefaultArgument() &&
1938 !D
->defaultArgumentWasInherited();
1939 Record
.push_back(OwnsDefaultArg
);
1941 Record
.AddTemplateArgumentLoc(D
->getDefaultArgument());
1942 Code
= serialization::DECL_NON_TYPE_TEMPLATE_PARM
;
1946 void ASTDeclWriter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl
*D
) {
1947 // For an expanded parameter pack, record the number of expansion types here
1948 // so that it's easier for deserialization to allocate the right amount of
1950 if (D
->isExpandedParameterPack())
1951 Record
.push_back(D
->getNumExpansionTemplateParameters());
1953 VisitTemplateDecl(D
);
1954 Record
.push_back(D
->wasDeclaredWithTypename());
1955 // TemplateParmPosition.
1956 Record
.push_back(D
->getDepth());
1957 Record
.push_back(D
->getPosition());
1959 if (D
->isExpandedParameterPack()) {
1960 for (unsigned I
= 0, N
= D
->getNumExpansionTemplateParameters();
1962 Record
.AddTemplateParameterList(D
->getExpansionTemplateParameters(I
));
1963 Code
= serialization::DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK
;
1965 // Rest of TemplateTemplateParmDecl.
1966 Record
.push_back(D
->isParameterPack());
1967 bool OwnsDefaultArg
= D
->hasDefaultArgument() &&
1968 !D
->defaultArgumentWasInherited();
1969 Record
.push_back(OwnsDefaultArg
);
1971 Record
.AddTemplateArgumentLoc(D
->getDefaultArgument());
1972 Code
= serialization::DECL_TEMPLATE_TEMPLATE_PARM
;
1976 void ASTDeclWriter::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl
*D
) {
1977 VisitRedeclarableTemplateDecl(D
);
1978 Code
= serialization::DECL_TYPE_ALIAS_TEMPLATE
;
1981 void ASTDeclWriter::VisitStaticAssertDecl(StaticAssertDecl
*D
) {
1983 Record
.AddStmt(D
->getAssertExpr());
1984 Record
.push_back(D
->isFailed());
1985 Record
.AddStmt(D
->getMessage());
1986 Record
.AddSourceLocation(D
->getRParenLoc());
1987 Code
= serialization::DECL_STATIC_ASSERT
;
1990 /// Emit the DeclContext part of a declaration context decl.
1991 void ASTDeclWriter::VisitDeclContext(DeclContext
*DC
) {
1992 static_assert(DeclContext::NumDeclContextBits
== 13,
1993 "You need to update the serializer after you change the "
1996 uint64_t LexicalOffset
= 0;
1997 uint64_t VisibleOffset
= 0;
1999 if (Writer
.isGeneratingReducedBMI() && isa
<NamespaceDecl
>(DC
) &&
2000 cast
<NamespaceDecl
>(DC
)->isFromExplicitGlobalModule()) {
2001 // In reduced BMI, delay writing lexical and visible block for namespace
2002 // in the global module fragment. See the comments of DelayedNamespace for
2004 Writer
.DelayedNamespace
.push_back(cast
<NamespaceDecl
>(DC
));
2006 LexicalOffset
= Writer
.WriteDeclContextLexicalBlock(Context
, DC
);
2007 VisibleOffset
= Writer
.WriteDeclContextVisibleBlock(Context
, DC
);
2010 Record
.AddOffset(LexicalOffset
);
2011 Record
.AddOffset(VisibleOffset
);
2014 const Decl
*ASTWriter::getFirstLocalDecl(const Decl
*D
) {
2015 assert(IsLocalDecl(D
) && "expected a local declaration");
2017 const Decl
*Canon
= D
->getCanonicalDecl();
2018 if (IsLocalDecl(Canon
))
2021 const Decl
*&CacheEntry
= FirstLocalDeclCache
[Canon
];
2025 for (const Decl
*Redecl
= D
; Redecl
; Redecl
= Redecl
->getPreviousDecl())
2026 if (IsLocalDecl(Redecl
))
2028 return CacheEntry
= D
;
2031 template <typename T
>
2032 void ASTDeclWriter::VisitRedeclarable(Redeclarable
<T
> *D
) {
2033 T
*First
= D
->getFirstDecl();
2034 T
*MostRecent
= First
->getMostRecentDecl();
2035 T
*DAsT
= static_cast<T
*>(D
);
2036 if (MostRecent
!= First
) {
2037 assert(isRedeclarableDeclKind(DAsT
->getKind()) &&
2038 "Not considered redeclarable?");
2040 Record
.AddDeclRef(First
);
2042 // Write out a list of local redeclarations of this declaration if it's the
2043 // first local declaration in the chain.
2044 const Decl
*FirstLocal
= Writer
.getFirstLocalDecl(DAsT
);
2045 if (DAsT
== FirstLocal
) {
2046 // Emit a list of all imported first declarations so that we can be sure
2047 // that all redeclarations visible to this module are before D in the
2049 unsigned I
= Record
.size();
2050 Record
.push_back(0);
2052 AddFirstDeclFromEachModule(DAsT
, /*IncludeLocal*/false);
2053 // This is the number of imported first declarations + 1.
2054 Record
[I
] = Record
.size() - I
;
2056 // Collect the set of local redeclarations of this declaration, from
2057 // newest to oldest.
2058 ASTWriter::RecordData LocalRedecls
;
2059 ASTRecordWriter
LocalRedeclWriter(Record
, LocalRedecls
);
2060 for (const Decl
*Prev
= FirstLocal
->getMostRecentDecl();
2061 Prev
!= FirstLocal
; Prev
= Prev
->getPreviousDecl())
2062 if (!Prev
->isFromASTFile())
2063 LocalRedeclWriter
.AddDeclRef(Prev
);
2065 // If we have any redecls, write them now as a separate record preceding
2066 // the declaration itself.
2067 if (LocalRedecls
.empty())
2068 Record
.push_back(0);
2070 Record
.AddOffset(LocalRedeclWriter
.Emit(LOCAL_REDECLARATIONS
));
2072 Record
.push_back(0);
2073 Record
.AddDeclRef(FirstLocal
);
2076 // Make sure that we serialize both the previous and the most-recent
2077 // declarations, which (transitively) ensures that all declarations in the
2078 // chain get serialized.
2080 // FIXME: This is not correct; when we reach an imported declaration we
2081 // won't emit its previous declaration.
2082 (void)Writer
.GetDeclRef(D
->getPreviousDecl());
2083 (void)Writer
.GetDeclRef(MostRecent
);
2085 // We use the sentinel value 0 to indicate an only declaration.
2086 Record
.push_back(0);
2090 void ASTDeclWriter::VisitHLSLBufferDecl(HLSLBufferDecl
*D
) {
2092 VisitDeclContext(D
);
2093 Record
.push_back(D
->isCBuffer());
2094 Record
.AddSourceLocation(D
->getLocStart());
2095 Record
.AddSourceLocation(D
->getLBraceLoc());
2096 Record
.AddSourceLocation(D
->getRBraceLoc());
2098 Code
= serialization::DECL_HLSL_BUFFER
;
2101 void ASTDeclWriter::VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl
*D
) {
2102 Record
.writeOMPChildren(D
->Data
);
2104 Code
= serialization::DECL_OMP_THREADPRIVATE
;
2107 void ASTDeclWriter::VisitOMPAllocateDecl(OMPAllocateDecl
*D
) {
2108 Record
.writeOMPChildren(D
->Data
);
2110 Code
= serialization::DECL_OMP_ALLOCATE
;
2113 void ASTDeclWriter::VisitOMPRequiresDecl(OMPRequiresDecl
*D
) {
2114 Record
.writeOMPChildren(D
->Data
);
2116 Code
= serialization::DECL_OMP_REQUIRES
;
2119 void ASTDeclWriter::VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl
*D
) {
2120 static_assert(DeclContext::NumOMPDeclareReductionDeclBits
== 15,
2121 "You need to update the serializer after you change the "
2122 "NumOMPDeclareReductionDeclBits");
2125 Record
.AddSourceLocation(D
->getBeginLoc());
2126 Record
.AddStmt(D
->getCombinerIn());
2127 Record
.AddStmt(D
->getCombinerOut());
2128 Record
.AddStmt(D
->getCombiner());
2129 Record
.AddStmt(D
->getInitOrig());
2130 Record
.AddStmt(D
->getInitPriv());
2131 Record
.AddStmt(D
->getInitializer());
2132 Record
.push_back(llvm::to_underlying(D
->getInitializerKind()));
2133 Record
.AddDeclRef(D
->getPrevDeclInScope());
2134 Code
= serialization::DECL_OMP_DECLARE_REDUCTION
;
2137 void ASTDeclWriter::VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl
*D
) {
2138 Record
.writeOMPChildren(D
->Data
);
2140 Record
.AddDeclarationName(D
->getVarName());
2141 Record
.AddDeclRef(D
->getPrevDeclInScope());
2142 Code
= serialization::DECL_OMP_DECLARE_MAPPER
;
2145 void ASTDeclWriter::VisitOMPCapturedExprDecl(OMPCapturedExprDecl
*D
) {
2147 Code
= serialization::DECL_OMP_CAPTUREDEXPR
;
2150 //===----------------------------------------------------------------------===//
2151 // ASTWriter Implementation
2152 //===----------------------------------------------------------------------===//
2155 template <FunctionDecl::TemplatedKind Kind
>
2156 std::shared_ptr
<llvm::BitCodeAbbrev
>
2157 getFunctionDeclAbbrev(serialization::DeclCode Code
) {
2158 using namespace llvm
;
2160 auto Abv
= std::make_shared
<BitCodeAbbrev
>();
2161 Abv
->Add(BitCodeAbbrevOp(Code
));
2163 Abv
->Add(BitCodeAbbrevOp(0)); // CanonicalDecl
2164 Abv
->Add(BitCodeAbbrevOp(Kind
));
2165 if constexpr (Kind
== FunctionDecl::TK_NonTemplate
) {
2167 } else if constexpr (Kind
== FunctionDecl::TK_FunctionTemplate
) {
2168 // DescribedFunctionTemplate
2169 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6));
2170 } else if constexpr (Kind
== FunctionDecl::TK_DependentNonTemplate
) {
2171 // Instantiated From Decl
2172 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6));
2173 } else if constexpr (Kind
== FunctionDecl::TK_MemberSpecialization
) {
2174 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // InstantiatedFrom
2175 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
,
2176 3)); // TemplateSpecializationKind
2177 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Specialized Location
2178 } else if constexpr (Kind
==
2179 FunctionDecl::TK_FunctionTemplateSpecialization
) {
2180 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Template
2181 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
,
2182 3)); // TemplateSpecializationKind
2183 Abv
->Add(BitCodeAbbrevOp(1)); // Template Argument Size
2184 Abv
->Add(BitCodeAbbrevOp(TemplateArgument::Type
)); // Template Argument Kind
2186 BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Template Argument Type
2187 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 1)); // Is Defaulted
2188 Abv
->Add(BitCodeAbbrevOp(0)); // TemplateArgumentsAsWritten
2189 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // SourceLocation
2190 Abv
->Add(BitCodeAbbrevOp(0));
2192 BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Canonical Decl of template
2193 } else if constexpr (Kind
== FunctionDecl::
2194 TK_DependentFunctionTemplateSpecialization
) {
2195 // Candidates of specialization
2196 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array
));
2197 Abv
->Add(BitCodeAbbrevOp(0)); // TemplateArgumentsAsWritten
2199 llvm_unreachable("Unknown templated kind?");
2202 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
,
2203 8)); // Packed DeclBits: ModuleOwnershipKind,
2204 // isUsed, isReferenced, AccessSpecifier,
2207 // The following bits should be 0:
2208 // HasStandaloneLexicalDC, HasAttrs,
2209 // TopLevelDeclInObjCContainer,
2211 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // DeclContext
2212 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // SubmoduleID
2214 Abv
->Add(BitCodeAbbrevOp(DeclarationName::Identifier
)); // NameKind
2215 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Identifier
2216 Abv
->Add(BitCodeAbbrevOp(0)); // AnonDeclNumber
2218 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Type
2220 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // InnerLocStart
2221 Abv
->Add(BitCodeAbbrevOp(0)); // HasExtInfo
2222 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // TSIType
2224 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 11)); // IDNS
2225 Abv
->Add(BitCodeAbbrevOp(
2226 BitCodeAbbrevOp::Fixed
,
2227 28)); // Packed Function Bits: StorageClass, Inline, InlineSpecified,
2228 // VirtualAsWritten, Pure, HasInheritedProto, HasWrittenProto,
2229 // Deleted, Trivial, TrivialForCall, Defaulted, ExplicitlyDefaulted,
2230 // IsIneligibleOrNotSelected, ImplicitReturnZero, Constexpr,
2231 // UsesSEHTry, SkippedBody, MultiVersion, LateParsed,
2232 // FriendConstraintRefersToEnclosingTemplate, Linkage,
2233 // ShouldSkipCheckingODR
2234 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // LocEnd
2235 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 32)); // ODRHash
2236 // This Array slurps the rest of the record. Fortunately we want to encode
2237 // (nearly) all the remaining (variable number of) fields in the same way.
2240 // NumParams and Params[] from FunctionDecl, and
2241 // NumOverriddenMethods, OverriddenMethods[] from CXXMethodDecl.
2243 // Add an AbbrevOp for 'size then elements' and use it here.
2244 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array
));
2245 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6));
2249 template <FunctionDecl::TemplatedKind Kind
>
2250 std::shared_ptr
<llvm::BitCodeAbbrev
> getCXXMethodAbbrev() {
2251 return getFunctionDeclAbbrev
<Kind
>(serialization::DECL_CXX_METHOD
);
2255 void ASTWriter::WriteDeclAbbrevs() {
2256 using namespace llvm
;
2258 std::shared_ptr
<BitCodeAbbrev
> Abv
;
2260 // Abbreviation for DECL_FIELD
2261 Abv
= std::make_shared
<BitCodeAbbrev
>();
2262 Abv
->Add(BitCodeAbbrevOp(serialization::DECL_FIELD
));
2264 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
,
2265 7)); // Packed DeclBits: ModuleOwnershipKind,
2266 // isUsed, isReferenced, AccessSpecifier,
2268 // The following bits should be 0:
2269 // isImplicit, HasStandaloneLexicalDC, HasAttrs,
2270 // TopLevelDeclInObjCContainer,
2272 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // DeclContext
2273 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // SubmoduleID
2275 Abv
->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
2276 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Name
2277 Abv
->Add(BitCodeAbbrevOp(0)); // AnonDeclNumber
2279 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Type
2281 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // InnerStartLoc
2282 Abv
->Add(BitCodeAbbrevOp(0)); // hasExtInfo
2283 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // TSIType
2285 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 1)); // isMutable
2286 Abv
->Add(BitCodeAbbrevOp(0)); // StorageKind
2288 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array
));
2289 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // TypeLoc
2290 DeclFieldAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2292 // Abbreviation for DECL_OBJC_IVAR
2293 Abv
= std::make_shared
<BitCodeAbbrev
>();
2294 Abv
->Add(BitCodeAbbrevOp(serialization::DECL_OBJC_IVAR
));
2296 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
,
2297 12)); // Packed DeclBits: HasStandaloneLexicalDC,
2298 // isInvalidDecl, HasAttrs, isImplicit, isUsed,
2299 // isReferenced, TopLevelDeclInObjCContainer,
2300 // AccessSpecifier, ModuleOwnershipKind
2301 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // DeclContext
2302 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // SubmoduleID
2304 Abv
->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
2305 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Name
2306 Abv
->Add(BitCodeAbbrevOp(0)); // AnonDeclNumber
2308 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Type
2310 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // InnerStartLoc
2311 Abv
->Add(BitCodeAbbrevOp(0)); // hasExtInfo
2312 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // TSIType
2314 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 1)); // isMutable
2315 Abv
->Add(BitCodeAbbrevOp(0)); // InitStyle
2317 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // getAccessControl
2318 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // getSynthesize
2320 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array
));
2321 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // TypeLoc
2322 DeclObjCIvarAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2324 // Abbreviation for DECL_ENUM
2325 Abv
= std::make_shared
<BitCodeAbbrev
>();
2326 Abv
->Add(BitCodeAbbrevOp(serialization::DECL_ENUM
));
2328 Abv
->Add(BitCodeAbbrevOp(0)); // No redeclaration
2330 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
,
2331 7)); // Packed DeclBits: ModuleOwnershipKind,
2332 // isUsed, isReferenced, AccessSpecifier,
2334 // The following bits should be 0:
2335 // isImplicit, HasStandaloneLexicalDC, HasAttrs,
2336 // TopLevelDeclInObjCContainer,
2338 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // DeclContext
2339 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // SubmoduleID
2341 Abv
->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
2342 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Name
2343 Abv
->Add(BitCodeAbbrevOp(0)); // AnonDeclNumber
2345 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Source Location
2346 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Type Ref
2348 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // IdentifierNamespace
2349 Abv
->Add(BitCodeAbbrevOp(
2350 BitCodeAbbrevOp::Fixed
,
2351 9)); // Packed Tag Decl Bits: getTagKind, isCompleteDefinition,
2352 // EmbeddedInDeclarator, IsFreeStanding,
2353 // isCompleteDefinitionRequired, ExtInfoKind
2354 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // SourceLocation
2355 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // SourceLocation
2357 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // AddTypeRef
2358 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // IntegerType
2359 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // getPromotionType
2360 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 20)); // Enum Decl Bits
2361 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 32));// ODRHash
2362 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // InstantiatedMembEnum
2364 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // LexicalOffset
2365 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // VisibleOffset
2366 DeclEnumAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2368 // Abbreviation for DECL_RECORD
2369 Abv
= std::make_shared
<BitCodeAbbrev
>();
2370 Abv
->Add(BitCodeAbbrevOp(serialization::DECL_RECORD
));
2372 Abv
->Add(BitCodeAbbrevOp(0)); // No redeclaration
2374 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
,
2375 7)); // Packed DeclBits: ModuleOwnershipKind,
2376 // isUsed, isReferenced, AccessSpecifier,
2378 // The following bits should be 0:
2379 // isImplicit, HasStandaloneLexicalDC, HasAttrs,
2380 // TopLevelDeclInObjCContainer,
2382 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // DeclContext
2383 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // SubmoduleID
2385 Abv
->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
2386 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Name
2387 Abv
->Add(BitCodeAbbrevOp(0)); // AnonDeclNumber
2389 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Source Location
2390 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Type Ref
2392 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // IdentifierNamespace
2393 Abv
->Add(BitCodeAbbrevOp(
2394 BitCodeAbbrevOp::Fixed
,
2395 9)); // Packed Tag Decl Bits: getTagKind, isCompleteDefinition,
2396 // EmbeddedInDeclarator, IsFreeStanding,
2397 // isCompleteDefinitionRequired, ExtInfoKind
2398 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // SourceLocation
2399 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // SourceLocation
2401 Abv
->Add(BitCodeAbbrevOp(
2402 BitCodeAbbrevOp::Fixed
,
2403 13)); // Packed Record Decl Bits: FlexibleArrayMember,
2404 // AnonymousStructUnion, hasObjectMember, hasVolatileMember,
2405 // isNonTrivialToPrimitiveDefaultInitialize,
2406 // isNonTrivialToPrimitiveCopy, isNonTrivialToPrimitiveDestroy,
2407 // hasNonTrivialToPrimitiveDefaultInitializeCUnion,
2408 // hasNonTrivialToPrimitiveDestructCUnion,
2409 // hasNonTrivialToPrimitiveCopyCUnion, isParamDestroyedInCallee,
2410 // getArgPassingRestrictions
2412 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 26));
2415 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // LexicalOffset
2416 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // VisibleOffset
2417 DeclRecordAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2419 // Abbreviation for DECL_PARM_VAR
2420 Abv
= std::make_shared
<BitCodeAbbrev
>();
2421 Abv
->Add(BitCodeAbbrevOp(serialization::DECL_PARM_VAR
));
2423 Abv
->Add(BitCodeAbbrevOp(0)); // No redeclaration
2425 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
,
2426 8)); // Packed DeclBits: ModuleOwnershipKind, isUsed,
2427 // isReferenced, AccessSpecifier,
2428 // HasStandaloneLexicalDC, HasAttrs, isImplicit,
2429 // TopLevelDeclInObjCContainer,
2431 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // DeclContext
2432 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // SubmoduleID
2434 Abv
->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
2435 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Name
2436 Abv
->Add(BitCodeAbbrevOp(0)); // AnonDeclNumber
2438 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Type
2440 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // InnerStartLoc
2441 Abv
->Add(BitCodeAbbrevOp(0)); // hasExtInfo
2442 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // TSIType
2445 BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
,
2446 12)); // Packed Var Decl bits: SClass, TSCSpec, InitStyle,
2447 // isARCPseudoStrong, Linkage, ModulesCodegen
2448 Abv
->Add(BitCodeAbbrevOp(0)); // VarKind (local enum)
2450 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // ScopeIndex
2451 Abv
->Add(BitCodeAbbrevOp(
2452 BitCodeAbbrevOp::Fixed
,
2453 19)); // Packed Parm Var Decl bits: IsObjCMethodParameter, ScopeDepth,
2454 // ObjCDeclQualifier, KNRPromoted,
2455 // HasInheritedDefaultArg, HasUninstantiatedDefaultArg
2457 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array
));
2458 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // TypeLoc
2459 DeclParmVarAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2461 // Abbreviation for DECL_TYPEDEF
2462 Abv
= std::make_shared
<BitCodeAbbrev
>();
2463 Abv
->Add(BitCodeAbbrevOp(serialization::DECL_TYPEDEF
));
2465 Abv
->Add(BitCodeAbbrevOp(0)); // No redeclaration
2467 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
,
2468 7)); // Packed DeclBits: ModuleOwnershipKind,
2469 // isReferenced, isUsed, AccessSpecifier. Other
2470 // higher bits should be 0: isImplicit,
2471 // HasStandaloneLexicalDC, HasAttrs,
2472 // TopLevelDeclInObjCContainer, isInvalidDecl
2473 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // DeclContext
2474 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // SubmoduleID
2476 Abv
->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
2477 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Name
2478 Abv
->Add(BitCodeAbbrevOp(0)); // AnonDeclNumber
2480 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Source Location
2481 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Type Ref
2483 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array
));
2484 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // TypeLoc
2485 DeclTypedefAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2487 // Abbreviation for DECL_VAR
2488 Abv
= std::make_shared
<BitCodeAbbrev
>();
2489 Abv
->Add(BitCodeAbbrevOp(serialization::DECL_VAR
));
2491 Abv
->Add(BitCodeAbbrevOp(0)); // No redeclaration
2493 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
,
2494 12)); // Packed DeclBits: HasStandaloneLexicalDC,
2495 // isInvalidDecl, HasAttrs, isImplicit, isUsed,
2496 // isReferenced, TopLevelDeclInObjCContainer,
2497 // AccessSpecifier, ModuleOwnershipKind
2498 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // DeclContext
2499 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // SubmoduleID
2501 Abv
->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
2502 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Name
2503 Abv
->Add(BitCodeAbbrevOp(0)); // AnonDeclNumber
2505 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Type
2507 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // InnerStartLoc
2508 Abv
->Add(BitCodeAbbrevOp(0)); // hasExtInfo
2509 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // TSIType
2511 Abv
->Add(BitCodeAbbrevOp(
2512 BitCodeAbbrevOp::Fixed
,
2513 21)); // Packed Var Decl bits: Linkage, ModulesCodegen,
2514 // SClass, TSCSpec, InitStyle,
2515 // isARCPseudoStrong, IsThisDeclarationADemotedDefinition,
2516 // isExceptionVariable, isNRVOVariable, isCXXForRangeDecl,
2517 // isInline, isInlineSpecified, isConstexpr,
2518 // isInitCapture, isPrevDeclInSameScope,
2519 // EscapingByref, HasDeducedType, ImplicitParamKind, isObjCForDecl
2520 Abv
->Add(BitCodeAbbrevOp(0)); // VarKind (local enum)
2522 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array
));
2523 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // TypeLoc
2524 DeclVarAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2526 // Abbreviation for DECL_CXX_METHOD
2527 DeclCXXMethodAbbrev
=
2528 Stream
.EmitAbbrev(getCXXMethodAbbrev
<FunctionDecl::TK_NonTemplate
>());
2529 DeclTemplateCXXMethodAbbrev
= Stream
.EmitAbbrev(
2530 getCXXMethodAbbrev
<FunctionDecl::TK_FunctionTemplate
>());
2531 DeclDependentNonTemplateCXXMethodAbbrev
= Stream
.EmitAbbrev(
2532 getCXXMethodAbbrev
<FunctionDecl::TK_DependentNonTemplate
>());
2533 DeclMemberSpecializedCXXMethodAbbrev
= Stream
.EmitAbbrev(
2534 getCXXMethodAbbrev
<FunctionDecl::TK_MemberSpecialization
>());
2535 DeclTemplateSpecializedCXXMethodAbbrev
= Stream
.EmitAbbrev(
2536 getCXXMethodAbbrev
<FunctionDecl::TK_FunctionTemplateSpecialization
>());
2537 DeclDependentSpecializationCXXMethodAbbrev
= Stream
.EmitAbbrev(
2539 FunctionDecl::TK_DependentFunctionTemplateSpecialization
>());
2541 // Abbreviation for DECL_TEMPLATE_TYPE_PARM
2542 Abv
= std::make_shared
<BitCodeAbbrev
>();
2543 Abv
->Add(BitCodeAbbrevOp(serialization::DECL_TEMPLATE_TYPE_PARM
));
2544 Abv
->Add(BitCodeAbbrevOp(0)); // hasTypeConstraint
2546 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
,
2547 7)); // Packed DeclBits: ModuleOwnershipKind,
2548 // isReferenced, isUsed, AccessSpecifier. Other
2549 // higher bits should be 0: isImplicit,
2550 // HasStandaloneLexicalDC, HasAttrs,
2551 // TopLevelDeclInObjCContainer, isInvalidDecl
2552 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // DeclContext
2553 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // SubmoduleID
2555 Abv
->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
2556 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Name
2557 Abv
->Add(BitCodeAbbrevOp(0));
2559 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Source Location
2560 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Type Ref
2561 // TemplateTypeParmDecl
2563 BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 1)); // wasDeclaredWithTypename
2564 Abv
->Add(BitCodeAbbrevOp(0)); // TypeConstraintInitialized
2565 Abv
->Add(BitCodeAbbrevOp(0)); // OwnsDefaultArg
2566 DeclTemplateTypeParmAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2568 // Abbreviation for DECL_USING_SHADOW
2569 Abv
= std::make_shared
<BitCodeAbbrev
>();
2570 Abv
->Add(BitCodeAbbrevOp(serialization::DECL_USING_SHADOW
));
2572 Abv
->Add(BitCodeAbbrevOp(0)); // No redeclaration
2574 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
,
2575 12)); // Packed DeclBits: HasStandaloneLexicalDC,
2576 // isInvalidDecl, HasAttrs, isImplicit, isUsed,
2577 // isReferenced, TopLevelDeclInObjCContainer,
2578 // AccessSpecifier, ModuleOwnershipKind
2579 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // DeclContext
2580 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // SubmoduleID
2582 Abv
->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
2583 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Name
2584 Abv
->Add(BitCodeAbbrevOp(0));
2586 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // TargetDecl
2587 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 11)); // IDNS
2588 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // UsingOrNextShadow
2589 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
,
2590 6)); // InstantiatedFromUsingShadowDecl
2591 DeclUsingShadowAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2593 // Abbreviation for EXPR_DECL_REF
2594 Abv
= std::make_shared
<BitCodeAbbrev
>();
2595 Abv
->Add(BitCodeAbbrevOp(serialization::EXPR_DECL_REF
));
2598 // PackingBits: DependenceKind, ValueKind. ObjectKind should be 0.
2599 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 7));
2600 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Type
2602 // Packing Bits: , HadMultipleCandidates, RefersToEnclosingVariableOrCapture,
2603 // IsImmediateEscalating, NonOdrUseReason.
2604 // GetDeclFound, HasQualifier and ExplicitTemplateArgs should be 0.
2605 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 5));
2606 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // DeclRef
2607 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Location
2608 DeclRefExprAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2610 // Abbreviation for EXPR_INTEGER_LITERAL
2611 Abv
= std::make_shared
<BitCodeAbbrev
>();
2612 Abv
->Add(BitCodeAbbrevOp(serialization::EXPR_INTEGER_LITERAL
));
2615 // DependenceKind, ValueKind, ObjectKind
2616 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 10));
2617 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Type
2619 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Location
2620 Abv
->Add(BitCodeAbbrevOp(32)); // Bit Width
2621 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Value
2622 IntegerLiteralAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2624 // Abbreviation for EXPR_CHARACTER_LITERAL
2625 Abv
= std::make_shared
<BitCodeAbbrev
>();
2626 Abv
->Add(BitCodeAbbrevOp(serialization::EXPR_CHARACTER_LITERAL
));
2629 // DependenceKind, ValueKind, ObjectKind
2630 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 10));
2631 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Type
2632 // Character Literal
2633 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // getValue
2634 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Location
2635 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 3)); // getKind
2636 CharacterLiteralAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2638 // Abbreviation for EXPR_IMPLICIT_CAST
2639 Abv
= std::make_shared
<BitCodeAbbrev
>();
2640 Abv
->Add(BitCodeAbbrevOp(serialization::EXPR_IMPLICIT_CAST
));
2643 // Packing Bits: DependenceKind, ValueKind, ObjectKind,
2644 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 10));
2645 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Type
2647 Abv
->Add(BitCodeAbbrevOp(0)); // PathSize
2648 // Packing Bits: CastKind, StoredFPFeatures, isPartOfExplicitCast
2649 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 9));
2651 ExprImplicitCastAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2653 // Abbreviation for EXPR_BINARY_OPERATOR
2654 Abv
= std::make_shared
<BitCodeAbbrev
>();
2655 Abv
->Add(BitCodeAbbrevOp(serialization::EXPR_BINARY_OPERATOR
));
2658 // Packing Bits: DependenceKind. ValueKind and ObjectKind should
2659 // be 0 in this case.
2660 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 5));
2661 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Type
2664 BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // OpCode and HasFPFeatures
2665 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Source Location
2666 BinaryOperatorAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2668 // Abbreviation for EXPR_COMPOUND_ASSIGN_OPERATOR
2669 Abv
= std::make_shared
<BitCodeAbbrev
>();
2670 Abv
->Add(BitCodeAbbrevOp(serialization::EXPR_COMPOUND_ASSIGN_OPERATOR
));
2673 // Packing Bits: DependenceKind. ValueKind and ObjectKind should
2674 // be 0 in this case.
2675 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 5));
2676 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Type
2678 // Packing Bits: OpCode. The HasFPFeatures bit should be 0
2680 BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // OpCode and HasFPFeatures
2681 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Source Location
2682 // CompoundAssignOperator
2683 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // LHSType
2684 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Result Type
2685 CompoundAssignOperatorAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2687 // Abbreviation for EXPR_CALL
2688 Abv
= std::make_shared
<BitCodeAbbrev
>();
2689 Abv
->Add(BitCodeAbbrevOp(serialization::EXPR_CALL
));
2692 // Packing Bits: DependenceKind, ValueKind, ObjectKind,
2693 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 10));
2694 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Type
2696 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // NumArgs
2697 Abv
->Add(BitCodeAbbrevOp(0)); // ADLCallKind
2698 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Source Location
2699 CallExprAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2701 // Abbreviation for EXPR_CXX_OPERATOR_CALL
2702 Abv
= std::make_shared
<BitCodeAbbrev
>();
2703 Abv
->Add(BitCodeAbbrevOp(serialization::EXPR_CXX_OPERATOR_CALL
));
2706 // Packing Bits: DependenceKind, ValueKind, ObjectKind,
2707 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 10));
2708 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Type
2710 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // NumArgs
2711 Abv
->Add(BitCodeAbbrevOp(0)); // ADLCallKind
2712 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Source Location
2713 // CXXOperatorCallExpr
2714 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Operator Kind
2715 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Source Location
2716 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Source Location
2717 CXXOperatorCallExprAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2719 // Abbreviation for EXPR_CXX_MEMBER_CALL
2720 Abv
= std::make_shared
<BitCodeAbbrev
>();
2721 Abv
->Add(BitCodeAbbrevOp(serialization::EXPR_CXX_MEMBER_CALL
));
2724 // Packing Bits: DependenceKind, ValueKind, ObjectKind,
2725 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed
, 10));
2726 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Type
2728 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // NumArgs
2729 Abv
->Add(BitCodeAbbrevOp(0)); // ADLCallKind
2730 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Source Location
2731 // CXXMemberCallExpr
2732 CXXMemberCallExprAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2734 // Abbreviation for STMT_COMPOUND
2735 Abv
= std::make_shared
<BitCodeAbbrev
>();
2736 Abv
->Add(BitCodeAbbrevOp(serialization::STMT_COMPOUND
));
2739 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Num Stmts
2740 Abv
->Add(BitCodeAbbrevOp(0)); // hasStoredFPFeatures
2741 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Source Location
2742 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR
, 6)); // Source Location
2743 CompoundStmtAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2745 Abv
= std::make_shared
<BitCodeAbbrev
>();
2746 Abv
->Add(BitCodeAbbrevOp(serialization::DECL_CONTEXT_LEXICAL
));
2747 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob
));
2748 DeclContextLexicalAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2750 Abv
= std::make_shared
<BitCodeAbbrev
>();
2751 Abv
->Add(BitCodeAbbrevOp(serialization::DECL_CONTEXT_VISIBLE
));
2752 Abv
->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob
));
2753 DeclContextVisibleLookupAbbrev
= Stream
.EmitAbbrev(std::move(Abv
));
2756 /// isRequiredDecl - Check if this is a "required" Decl, which must be seen by
2757 /// consumers of the AST.
2759 /// Such decls will always be deserialized from the AST file, so we would like
2760 /// this to be as restrictive as possible. Currently the predicate is driven by
2761 /// code generation requirements, if other clients have a different notion of
2762 /// what is "required" then we may have to consider an alternate scheme where
2763 /// clients can iterate over the top-level decls and get information on them,
2764 /// without necessary deserializing them. We could explicitly require such
2765 /// clients to use a separate API call to "realize" the decl. This should be
2766 /// relatively painless since they would presumably only do it for top-level
2768 static bool isRequiredDecl(const Decl
*D
, ASTContext
&Context
,
2769 Module
*WritingModule
) {
2770 // Named modules have different semantics than header modules. Every named
2771 // module units owns a translation unit. So the importer of named modules
2772 // doesn't need to deserilize everything ahead of time.
2773 if (WritingModule
&& WritingModule
->isNamedModule()) {
2774 // The PragmaCommentDecl and PragmaDetectMismatchDecl are MSVC's extension.
2775 // And the behavior of MSVC for such cases will leak this to the module
2776 // users. Given pragma is not a standard thing, the compiler has the space
2777 // to do their own decision. Let's follow MSVC here.
2778 if (isa
<PragmaCommentDecl
, PragmaDetectMismatchDecl
>(D
))
2783 // An ObjCMethodDecl is never considered as "required" because its
2784 // implementation container always is.
2786 // File scoped assembly or obj-c or OMP declare target implementation must be
2788 if (isa
<FileScopeAsmDecl
, TopLevelStmtDecl
, ObjCImplDecl
>(D
))
2791 if (WritingModule
&& isPartOfPerModuleInitializer(D
)) {
2792 // These declarations are part of the module initializer, and are emitted
2793 // if and when the module is imported, rather than being emitted eagerly.
2797 return Context
.DeclMustBeEmitted(D
);
2800 void ASTWriter::WriteDecl(ASTContext
&Context
, Decl
*D
) {
2801 PrettyDeclStackTraceEntry
CrashInfo(Context
, D
, SourceLocation(),
2804 // Determine the ID for this declaration.
2806 assert(!D
->isFromASTFile() && "should not be emitting imported decl");
2807 LocalDeclID
&IDR
= DeclIDs
[D
];
2808 if (IDR
.isInvalid())
2813 assert(ID
>= FirstDeclID
&& "invalid decl ID");
2816 ASTDeclWriter
W(*this, Context
, Record
, GeneratingReducedBMI
);
2818 // Build a record for this declaration
2821 // Emit this declaration to the bitstream.
2822 uint64_t Offset
= W
.Emit(D
);
2824 // Record the offset for this declaration
2825 SourceLocation Loc
= D
->getLocation();
2826 SourceLocationEncoding::RawLocEncoding RawLoc
=
2827 getRawSourceLocationEncoding(getAdjustedLocation(Loc
));
2829 unsigned Index
= ID
.getRawValue() - FirstDeclID
.getRawValue();
2830 if (DeclOffsets
.size() == Index
)
2831 DeclOffsets
.emplace_back(RawLoc
, Offset
, DeclTypesBlockStartOffset
);
2832 else if (DeclOffsets
.size() < Index
) {
2833 // FIXME: Can/should this happen?
2834 DeclOffsets
.resize(Index
+1);
2835 DeclOffsets
[Index
].setRawLoc(RawLoc
);
2836 DeclOffsets
[Index
].setBitOffset(Offset
, DeclTypesBlockStartOffset
);
2838 llvm_unreachable("declarations should be emitted in ID order");
2841 SourceManager
&SM
= Context
.getSourceManager();
2842 if (Loc
.isValid() && SM
.isLocalSourceLocation(Loc
))
2843 associateDeclWithFile(D
, ID
);
2845 // Note declarations that should be deserialized eagerly so that we can add
2846 // them to a record in the AST file later.
2847 if (isRequiredDecl(D
, Context
, WritingModule
))
2848 AddDeclRef(D
, EagerlyDeserializedDecls
);
2851 void ASTRecordWriter::AddFunctionDefinition(const FunctionDecl
*FD
) {
2852 // Switch case IDs are per function body.
2853 Writer
->ClearSwitchCaseIDs();
2855 assert(FD
->doesThisDeclarationHaveABody());
2856 bool ModulesCodegen
= false;
2857 if (!FD
->isDependentContext()) {
2858 std::optional
<GVALinkage
> Linkage
;
2859 if (Writer
->WritingModule
&&
2860 Writer
->WritingModule
->isInterfaceOrPartition()) {
2861 // When building a C++20 module interface unit or a partition unit, a
2862 // strong definition in the module interface is provided by the
2863 // compilation of that unit, not by its users. (Inline functions are still
2864 // emitted in module users.)
2865 Linkage
= Writer
->Context
->GetGVALinkageForFunction(FD
);
2866 ModulesCodegen
= *Linkage
>= GVA_StrongExternal
;
2868 if (Writer
->Context
->getLangOpts().ModulesCodegen
||
2869 (FD
->hasAttr
<DLLExportAttr
>() &&
2870 Writer
->Context
->getLangOpts().BuildingPCHWithObjectFile
)) {
2872 // Under -fmodules-codegen, codegen is performed for all non-internal,
2873 // non-always_inline functions, unless they are available elsewhere.
2874 if (!FD
->hasAttr
<AlwaysInlineAttr
>()) {
2876 Linkage
= Writer
->Context
->GetGVALinkageForFunction(FD
);
2878 *Linkage
!= GVA_Internal
&& *Linkage
!= GVA_AvailableExternally
;
2882 Record
->push_back(ModulesCodegen
);
2884 Writer
->AddDeclRef(FD
, Writer
->ModularCodegenDecls
);
2885 if (auto *CD
= dyn_cast
<CXXConstructorDecl
>(FD
)) {
2886 Record
->push_back(CD
->getNumCtorInitializers());
2887 if (CD
->getNumCtorInitializers())
2888 AddCXXCtorInitializers(llvm::ArrayRef(CD
->init_begin(), CD
->init_end()));
2890 AddStmt(FD
->getBody());