aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Serialization/ASTWriterDecl.cpp
diff options
context:
space:
mode:
authorHenrik G. Olsson <hnrklssn@gmail.com>2025-06-23 10:16:31 -0700
committerGitHub <noreply@github.com>2025-06-23 10:16:31 -0700
commit319a51a5ffb807b88ae7f73676894bf306a0d134 (patch)
treee863310011088db1c13a280db4316663c4dd2b63 /clang/lib/Serialization/ASTWriterDecl.cpp
parent836ff367d0bca9369fd2db237e9b5d7b929bb593 (diff)
downloadllvm-319a51a5ffb807b88ae7f73676894bf306a0d134.zip
llvm-319a51a5ffb807b88ae7f73676894bf306a0d134.tar.gz
llvm-319a51a5ffb807b88ae7f73676894bf306a0d134.tar.bz2
[Modules] Record whether VarDecl initializers contain side effects (#143739)
Calling `DeclMustBeEmitted` should not lead to more deserialization, as it may occur before previous deserialization has finished. When passed a `VarDecl` with an initializer however, `DeclMustBeEmitted` needs to know whether that initializer contains side effects. When the `VarDecl` is deserialized but the initializer is not, this triggers deserialization of the initializer. To avoid this we add a bit to the serialization format for `VarDecl`s, indicating whether its initializer contains side effects or not, so that the `ASTReader` can query this information directly without deserializing the initializer. rdar://153085264
Diffstat (limited to 'clang/lib/Serialization/ASTWriterDecl.cpp')
-rw-r--r--clang/lib/Serialization/ASTWriterDecl.cpp14
1 files changed, 8 insertions, 6 deletions
diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp
index 2d93832..2e390db 100644
--- a/clang/lib/Serialization/ASTWriterDecl.cpp
+++ b/clang/lib/Serialization/ASTWriterDecl.cpp
@@ -1306,6 +1306,7 @@ void ASTDeclWriter::VisitVarDecl(VarDecl *D) {
VarDeclBits.addBit(D->isConstexpr());
VarDeclBits.addBit(D->isInitCapture());
VarDeclBits.addBit(D->isPreviousDeclInSameBlockScope());
+ VarDeclBits.addBit(D->hasInitWithSideEffects());
VarDeclBits.addBit(D->isEscapingByref());
HasDeducedType = D->getType()->getContainedDeducedType();
@@ -1355,10 +1356,11 @@ void ASTDeclWriter::VisitVarDecl(VarDecl *D) {
!D->hasExtInfo() && D->getFirstDecl() == D->getMostRecentDecl() &&
D->getKind() == Decl::Var && !D->isInline() && !D->isConstexpr() &&
!D->isInitCapture() && !D->isPreviousDeclInSameBlockScope() &&
- !D->isEscapingByref() && !HasDeducedType &&
- D->getStorageDuration() != SD_Static && !D->getDescribedVarTemplate() &&
- !D->getMemberSpecializationInfo() && !D->isObjCForDecl() &&
- !isa<ImplicitParamDecl>(D) && !D->isEscapingByref())
+ !D->hasInitWithSideEffects() && !D->isEscapingByref() &&
+ !HasDeducedType && D->getStorageDuration() != SD_Static &&
+ !D->getDescribedVarTemplate() && !D->getMemberSpecializationInfo() &&
+ !D->isObjCForDecl() && !isa<ImplicitParamDecl>(D) &&
+ !D->isEscapingByref())
AbbrevToUse = Writer.getDeclVarAbbrev();
Code = serialization::DECL_VAR;
@@ -2731,12 +2733,12 @@ void ASTWriter::WriteDeclAbbrevs() {
// VarDecl
Abv->Add(BitCodeAbbrevOp(
BitCodeAbbrevOp::Fixed,
- 21)); // Packed Var Decl bits: Linkage, ModulesCodegen,
+ 22)); // Packed Var Decl bits: Linkage, ModulesCodegen,
// SClass, TSCSpec, InitStyle,
// isARCPseudoStrong, IsThisDeclarationADemotedDefinition,
// isExceptionVariable, isNRVOVariable, isCXXForRangeDecl,
// isInline, isInlineSpecified, isConstexpr,
- // isInitCapture, isPrevDeclInSameScope,
+ // isInitCapture, isPrevDeclInSameScope, hasInitWithSideEffects,
// EscapingByref, HasDeducedType, ImplicitParamKind, isObjCForDecl
Abv->Add(BitCodeAbbrevOp(0)); // VarKind (local enum)
// Type Source Info