[clang] 65b12a8 - Recommit [NFC] [Serialization] Packing more bits
Chuanqi Xu via cfe-commits
cfe-commits at lists.llvm.org
Mon Dec 11 00:48:14 PST 2023
Author: Chuanqi Xu
Date: 2023-12-11T16:47:51+08:00
New Revision: 65b12a8af37ffa390ff45c8215904513eb75659e
URL: https://github.com/llvm/llvm-project/commit/65b12a8af37ffa390ff45c8215904513eb75659e
DIFF: https://github.com/llvm/llvm-project/commit/65b12a8af37ffa390ff45c8215904513eb75659e.diff
LOG: Recommit [NFC] [Serialization] Packing more bits
This patch tries to reduce the size of the BMIs by packing more bits
into an unsigned integer.
This patch was reverted due to buildbot failure report. But it should be
irrevelent after I took a double look. So I tried to recommit this NFC
change again.
Added:
Modified:
clang/include/clang/Serialization/ASTReader.h
clang/lib/Serialization/ASTReaderDecl.cpp
clang/lib/Serialization/ASTReaderStmt.cpp
clang/lib/Serialization/ASTWriterDecl.cpp
clang/lib/Serialization/ASTWriterStmt.cpp
clang/test/Modules/decl-params-determinisim.m
Removed:
################################################################################
diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h
index 7eefdca6815cda..9bb89ec9410911 100644
--- a/clang/include/clang/Serialization/ASTReader.h
+++ b/clang/include/clang/Serialization/ASTReader.h
@@ -2415,12 +2415,7 @@ class BitsUnpacker {
BitsUnpacker(BitsUnpacker &&) = delete;
BitsUnpacker operator=(const BitsUnpacker &) = delete;
BitsUnpacker operator=(BitsUnpacker &&) = delete;
- ~BitsUnpacker() {
-#ifndef NDEBUG
- while (isValid())
- assert(!getNextBit() && "There are unprocessed bits!");
-#endif
- }
+ ~BitsUnpacker() = default;
void updateValue(uint32_t V) {
Value = V;
diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp
index bc16cfc67a24f9..7140a14aefbf9b 100644
--- a/clang/lib/Serialization/ASTReaderDecl.cpp
+++ b/clang/lib/Serialization/ASTReaderDecl.cpp
@@ -583,6 +583,9 @@ void ASTDeclReader::Visit(Decl *D) {
}
void ASTDeclReader::VisitDecl(Decl *D) {
+ BitsUnpacker DeclBits(Record.readInt());
+ bool HasStandaloneLexicalDC = DeclBits.getNextBit();
+
if (D->isTemplateParameter() || D->isTemplateParameterPack() ||
isa<ParmVarDecl, ObjCTypeParamDecl>(D)) {
// We don't want to deserialize the DeclContext of a template
@@ -592,7 +595,8 @@ void ASTDeclReader::VisitDecl(Decl *D) {
// return type of the function). Use the translation unit DeclContext as a
// placeholder.
GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();
- GlobalDeclID LexicalDCIDForTemplateParmDecl = readDeclID();
+ GlobalDeclID LexicalDCIDForTemplateParmDecl =
+ HasStandaloneLexicalDC ? readDeclID() : 0;
if (!LexicalDCIDForTemplateParmDecl)
LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;
Reader.addPendingDeclContextInfo(D,
@@ -601,7 +605,8 @@ void ASTDeclReader::VisitDecl(Decl *D) {
D->setDeclContext(Reader.getContext().getTranslationUnitDecl());
} else {
auto *SemaDC = readDeclAs<DeclContext>();
- auto *LexicalDC = readDeclAs<DeclContext>();
+ auto *LexicalDC =
+ HasStandaloneLexicalDC ? readDeclAs<DeclContext>() : nullptr;
if (!LexicalDC)
LexicalDC = SemaDC;
// If the context is a class, we might not have actually merged it yet, in
@@ -618,7 +623,6 @@ void ASTDeclReader::VisitDecl(Decl *D) {
}
D->setLocation(ThisDeclLoc);
- BitsUnpacker DeclBits(Record.readInt());
D->InvalidDecl = DeclBits.getNextBit();
bool HasAttrs = DeclBits.getNextBit();
D->setImplicit(DeclBits.getNextBit());
@@ -765,7 +769,7 @@ ASTDeclReader::RedeclarableResult ASTDeclReader::VisitTagDecl(TagDecl *TD) {
TD->setCompleteDefinitionRequired(TagDeclBits.getNextBit());
TD->setBraceRange(readSourceRange());
- switch (Record.readInt()) {
+ switch (TagDeclBits.getNextBits(/*Width=*/2)) {
case 0:
break;
case 1: { // ExtInfo
@@ -1089,7 +1093,8 @@ void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) {
FD->setCachedLinkage((Linkage)FunctionDeclBits.getNextBits(/*Width=*/3));
FD->EndRangeLoc = readSourceLocation();
- FD->setDefaultLoc(readSourceLocation());
+ if (FD->isExplicitlyDefaulted())
+ FD->setDefaultLoc(readSourceLocation());
FD->ODRHash = Record.readInt();
FD->setHasODRHash(true);
@@ -1703,7 +1708,7 @@ void ASTDeclReader::VisitParmVarDecl(ParmVarDecl *PD) {
unsigned isObjCMethodParam = ParmVarDeclBits.getNextBit();
unsigned scopeDepth = ParmVarDeclBits.getNextBits(/*Width=*/7);
unsigned scopeIndex = ParmVarDeclBits.getNextBits(/*Width=*/8);
- unsigned declQualifier = Record.readInt();
+ unsigned declQualifier = ParmVarDeclBits.getNextBits(/*Width=*/7);
if (isObjCMethodParam) {
assert(scopeDepth == 0);
PD->setObjCMethodScopeInfo(scopeIndex);
@@ -1716,7 +1721,9 @@ void ASTDeclReader::VisitParmVarDecl(ParmVarDecl *PD) {
PD->ParmVarDeclBits.HasInheritedDefaultArg = ParmVarDeclBits.getNextBit();
if (ParmVarDeclBits.getNextBit()) // hasUninstantiatedDefaultArg.
PD->setUninstantiatedDefaultArg(Record.readExpr());
- PD->ExplicitObjectParameterIntroducerLoc = Record.readSourceLocation();
+
+ if (ParmVarDeclBits.getNextBit()) // Valid explicit object parameter
+ PD->ExplicitObjectParameterIntroducerLoc = Record.readSourceLocation();
// FIXME: If this is a redeclaration of a function from another module, handle
// inheritance of default arguments.
diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp
index d7d0c0e5bb21b4..d9eedb2e1089fb 100644
--- a/clang/lib/Serialization/ASTReaderStmt.cpp
+++ b/clang/lib/Serialization/ASTReaderStmt.cpp
@@ -108,7 +108,7 @@ namespace clang {
/// The number of record fields required for the Expr class
/// itself.
- static const unsigned NumExprFields = NumStmtFields + 4;
+ static const unsigned NumExprFields = NumStmtFields + 2;
/// Read and initialize a ExplicitTemplateArgumentList structure.
void ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args,
@@ -524,9 +524,13 @@ void ASTStmtReader::VisitCapturedStmt(CapturedStmt *S) {
void ASTStmtReader::VisitExpr(Expr *E) {
VisitStmt(E);
E->setType(Record.readType());
- E->setDependence(static_cast<ExprDependence>(Record.readInt()));
- E->setValueKind(static_cast<ExprValueKind>(Record.readInt()));
- E->setObjectKind(static_cast<ExprObjectKind>(Record.readInt()));
+ BitsUnpacker ExprBits(Record.readInt());
+ E->setDependence(
+ static_cast<ExprDependence>(ExprBits.getNextBits(/*Width=*/5)));
+ E->setValueKind(
+ static_cast<ExprValueKind>(ExprBits.getNextBits(/*Width=*/2)));
+ E->setObjectKind(
+ static_cast<ExprObjectKind>(ExprBits.getNextBits(/*Width=*/3)));
assert(Record.getIdx() == NumExprFields &&
"Incorrect expression field count");
}
@@ -995,14 +999,19 @@ void ASTStmtReader::VisitOMPIteratorExpr(OMPIteratorExpr *E) {
void ASTStmtReader::VisitCallExpr(CallExpr *E) {
VisitExpr(E);
- unsigned NumArgs = Record.readInt();
- bool HasFPFeatures = Record.readInt();
+
+ BitsUnpacker CallExprBits = Record.readInt();
+
+ unsigned NumArgs = CallExprBits.getNextBits(/*Width=*/16);
+ bool HasFPFeatures = CallExprBits.getNextBit();
+ E->setADLCallKind(
+ static_cast<CallExpr::ADLCallKind>(CallExprBits.getNextBit()));
assert((NumArgs == E->getNumArgs()) && "Wrong NumArgs!");
E->setRParenLoc(readSourceLocation());
E->setCallee(Record.readSubExpr());
for (unsigned I = 0; I != NumArgs; ++I)
E->setArg(I, Record.readSubExpr());
- E->setADLCallKind(static_cast<CallExpr::ADLCallKind>(Record.readInt()));
+
if (HasFPFeatures)
E->setStoredFPFeatures(
FPOptionsOverride::getFromOpaqueInt(Record.readInt()));
@@ -2013,14 +2022,15 @@ ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) {
VisitExpr(E);
- unsigned NumResults = Record.readInt();
- bool HasTemplateKWAndArgsInfo = Record.readInt();
+ BitsUnpacker OverloadExprBits = Record.readInt();
+ unsigned NumResults = OverloadExprBits.getNextBits(/*Width=*/14);
+ bool HasTemplateKWAndArgsInfo = OverloadExprBits.getNextBit();
assert((E->getNumDecls() == NumResults) && "Wrong NumResults!");
assert((E->hasTemplateKWAndArgsInfo() == HasTemplateKWAndArgsInfo) &&
"Wrong HasTemplateKWAndArgsInfo!");
if (HasTemplateKWAndArgsInfo) {
- unsigned NumTemplateArgs = Record.readInt();
+ unsigned NumTemplateArgs = OverloadExprBits.getNextBits(/*Width=*/14);
ReadTemplateKWAndArgsInfo(*E->getTrailingASTTemplateKWAndArgsInfo(),
E->getTrailingTemplateArgumentLoc(),
NumTemplateArgs);
@@ -3022,11 +3032,13 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
Record[ASTStmtReader::NumExprFields]);
break;
- case EXPR_CALL:
- S = CallExpr::CreateEmpty(
- Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields],
- /*HasFPFeatures=*/Record[ASTStmtReader::NumExprFields + 1], Empty);
+ case EXPR_CALL: {
+ BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields]);
+ auto NumArgs = CallExprBits.getNextBits(/*Width=*/16);
+ auto HasFPFeatures = CallExprBits.getNextBit();
+ S = CallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures, Empty);
break;
+ }
case EXPR_RECOVERY:
S = RecoveryExpr::CreateEmpty(
@@ -3764,17 +3776,23 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
break;
}
- case EXPR_CXX_OPERATOR_CALL:
- S = CXXOperatorCallExpr::CreateEmpty(
- Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields],
- /*HasFPFeatures=*/Record[ASTStmtReader::NumExprFields + 1], Empty);
+ case EXPR_CXX_OPERATOR_CALL: {
+ BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields]);
+ auto NumArgs = CallExprBits.getNextBits(/*Width=*/16);
+ auto HasFPFeatures = CallExprBits.getNextBit();
+ S = CXXOperatorCallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures,
+ Empty);
break;
+ }
- case EXPR_CXX_MEMBER_CALL:
- S = CXXMemberCallExpr::CreateEmpty(
- Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields],
- /*HasFPFeatures=*/Record[ASTStmtReader::NumExprFields + 1], Empty);
+ case EXPR_CXX_MEMBER_CALL: {
+ BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields]);
+ auto NumArgs = CallExprBits.getNextBits(/*Width=*/16);
+ auto HasFPFeatures = CallExprBits.getNextBit();
+ S = CXXMemberCallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures,
+ Empty);
break;
+ }
case EXPR_CXX_REWRITTEN_BINARY_OPERATOR:
S = new (Context) CXXRewrittenBinaryOperator(Empty);
@@ -3948,23 +3966,21 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
case EXPR_CXX_UNRESOLVED_MEMBER:
S = UnresolvedMemberExpr::CreateEmpty(
Context,
- /*NumResults=*/Record[ASTStmtReader::NumExprFields],
- /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 1],
- /*NumTemplateArgs=*/
- Record[ASTStmtReader::NumExprFields + 1]
- ? Record[ASTStmtReader::NumExprFields + 2]
- : 0);
+ /*NumResults=*/Record[ASTStmtReader::NumExprFields] & ((1 << 14) - 1),
+ /*HasTemplateKWAndArgsInfo=*/
+ (Record[ASTStmtReader::NumExprFields] >> 14) & (0x1),
+ /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] >> 14 &
+ ((1 << 14) - 1));
break;
case EXPR_CXX_UNRESOLVED_LOOKUP:
S = UnresolvedLookupExpr::CreateEmpty(
Context,
- /*NumResults=*/Record[ASTStmtReader::NumExprFields],
- /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 1],
- /*NumTemplateArgs=*/
- Record[ASTStmtReader::NumExprFields + 1]
- ? Record[ASTStmtReader::NumExprFields + 2]
- : 0);
+ /*NumResults=*/Record[ASTStmtReader::NumExprFields] & ((1 << 14) - 1),
+ /*HasTemplateKWAndArgsInfo=*/
+ (Record[ASTStmtReader::NumExprFields] >> 14) & (0x1),
+ /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] >> 14 &
+ ((1 << 14) - 1));
break;
case EXPR_TYPE_TRAIT:
@@ -4024,11 +4040,14 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
S = new (Context) OpaqueValueExpr(Empty);
break;
- case EXPR_CUDA_KERNEL_CALL:
- S = CUDAKernelCallExpr::CreateEmpty(
- Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields],
- /*HasFPFeatures=*/Record[ASTStmtReader::NumExprFields + 1], Empty);
+ case EXPR_CUDA_KERNEL_CALL: {
+ BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields]);
+ auto NumArgs = CallExprBits.getNextBits(/*Width=*/16);
+ auto HasFPFeatures = CallExprBits.getNextBit();
+ S = CUDAKernelCallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures,
+ Empty);
break;
+ }
case EXPR_ASTYPE:
S = new (Context) AsTypeExpr(Empty);
diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp
index bf082e5b8eac61..43169b2befc687 100644
--- a/clang/lib/Serialization/ASTWriterDecl.cpp
+++ b/clang/lib/Serialization/ASTWriterDecl.cpp
@@ -320,13 +320,8 @@ void ASTDeclWriter::Visit(Decl *D) {
}
void ASTDeclWriter::VisitDecl(Decl *D) {
- Record.AddDeclRef(cast_or_null<Decl>(D->getDeclContext()));
- if (D->getDeclContext() != D->getLexicalDeclContext())
- Record.AddDeclRef(cast_or_null<Decl>(D->getLexicalDeclContext()));
- else
- Record.push_back(0);
-
BitsPacker DeclBits;
+ DeclBits.addBit(D->getDeclContext() != D->getLexicalDeclContext());
DeclBits.addBit(D->isInvalidDecl());
DeclBits.addBit(D->hasAttrs());
DeclBits.addBit(D->isImplicit());
@@ -337,6 +332,10 @@ void ASTDeclWriter::VisitDecl(Decl *D) {
DeclBits.addBits((uint64_t)D->getModuleOwnershipKind(), /*BitWidth=*/3);
Record.push_back(DeclBits);
+ Record.AddDeclRef(cast_or_null<Decl>(D->getDeclContext()));
+ if (D->getDeclContext() != D->getLexicalDeclContext())
+ Record.AddDeclRef(cast_or_null<Decl>(D->getLexicalDeclContext()));
+
if (D->hasAttrs())
Record.AddAttributes(D->getAttrs());
@@ -450,19 +449,18 @@ void ASTDeclWriter::VisitTagDecl(TagDecl *D) {
TagDeclBits.addBit(D->isEmbeddedInDeclarator());
TagDeclBits.addBit(D->isFreeStanding());
TagDeclBits.addBit(D->isCompleteDefinitionRequired());
+ TagDeclBits.addBits(
+ D->hasExtInfo() ? 1 : (D->getTypedefNameForAnonDecl() ? 2 : 0),
+ /*BitWidth=*/2);
Record.push_back(TagDeclBits);
Record.AddSourceRange(D->getBraceRange());
if (D->hasExtInfo()) {
- Record.push_back(1);
Record.AddQualifierInfo(*D->getExtInfo());
} else if (auto *TD = D->getTypedefNameForAnonDecl()) {
- Record.push_back(2);
Record.AddDeclRef(TD);
Record.AddIdentifierRef(TD->getDeclName().getAsIdentifierInfo());
- } else {
- Record.push_back(0);
}
}
@@ -702,7 +700,8 @@ void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) {
Record.push_back(FunctionDeclBits);
Record.AddSourceLocation(D->getEndLoc());
- Record.AddSourceLocation(D->getDefaultLoc());
+ if (D->isExplicitlyDefaulted())
+ Record.AddSourceLocation(D->getDefaultLoc());
Record.push_back(D->getODRHash());
@@ -1176,15 +1175,18 @@ void ASTDeclWriter::VisitParmVarDecl(ParmVarDecl *D) {
ParmVarDeclBits.addBit(D->isObjCMethodParameter());
ParmVarDeclBits.addBits(D->getFunctionScopeDepth(), /*BitsWidth=*/7);
ParmVarDeclBits.addBits(D->getFunctionScopeIndex(), /*BitsWidth=*/8);
+ // FIXME: stable encoding
+ ParmVarDeclBits.addBits(D->getObjCDeclQualifier(), /*BitsWidth=*/7);
ParmVarDeclBits.addBit(D->isKNRPromoted());
ParmVarDeclBits.addBit(D->hasInheritedDefaultArg());
ParmVarDeclBits.addBit(D->hasUninstantiatedDefaultArg());
+ ParmVarDeclBits.addBit(D->getExplicitObjectParamThisLoc().isValid());
Record.push_back(ParmVarDeclBits);
- Record.push_back(D->getObjCDeclQualifier()); // FIXME: stable encoding
if (D->hasUninstantiatedDefaultArg())
Record.AddStmt(D->getUninstantiatedDefaultArg());
- Record.AddSourceLocation(D->getExplicitObjectParamThisLoc());
+ if (D->getExplicitObjectParamThisLoc().isValid())
+ Record.AddSourceLocation(D->getExplicitObjectParamThisLoc());
Code = serialization::DECL_PARM_VAR;
// If the assumptions about the DECL_PARM_VAR abbrev are true, use it. Here
@@ -2038,13 +2040,12 @@ void ASTWriter::WriteDeclAbbrevs() {
Abv = std::make_shared<BitCodeAbbrev>();
Abv->Add(BitCodeAbbrevOp(serialization::DECL_FIELD));
// Decl
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
+ 12)); // Packed DeclBits: HasStandaloneLexicalDC,
+ // isInvalidDecl, HasAttrs, isImplicit, isUsed,
+ // isReferenced, TopLevelDeclInObjCContainer,
+ // AccessSpecifier, ModuleOwnershipKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
- Abv->Add(BitCodeAbbrevOp(0)); // LexicalDeclContext
- Abv->Add(BitCodeAbbrevOp(
- BitCodeAbbrevOp::Fixed,
- 11)); // Packed DeclBits: isInvalidDecl, HasAttrs, isImplicit, isUsed,
- // isReferenced, TopLevelDeclInObjCContainer, AccessSpecifier,
- // ModuleOwnershipKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
// NamedDecl
Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
@@ -2068,13 +2069,12 @@ void ASTWriter::WriteDeclAbbrevs() {
Abv = std::make_shared<BitCodeAbbrev>();
Abv->Add(BitCodeAbbrevOp(serialization::DECL_OBJC_IVAR));
// Decl
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
+ 12)); // Packed DeclBits: HasStandaloneLexicalDC,
+ // isInvalidDecl, HasAttrs, isImplicit, isUsed,
+ // isReferenced, TopLevelDeclInObjCContainer,
+ // AccessSpecifier, ModuleOwnershipKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
- Abv->Add(BitCodeAbbrevOp(0)); // LexicalDeclContext
- Abv->Add(BitCodeAbbrevOp(
- BitCodeAbbrevOp::Fixed,
- 11)); // Packed DeclBits: isInvalidDecl, HasAttrs, isImplicit, isUsed,
- // isReferenced, TopLevelDeclInObjCContainer, AccessSpecifier,
- // ModuleOwnershipKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
// NamedDecl
Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
@@ -2103,13 +2103,12 @@ void ASTWriter::WriteDeclAbbrevs() {
// Redeclarable
Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration
// Decl
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
+ 12)); // Packed DeclBits: HasStandaloneLexicalDC,
+ // isInvalidDecl, HasAttrs, isImplicit, isUsed,
+ // isReferenced, TopLevelDeclInObjCContainer,
+ // AccessSpecifier, ModuleOwnershipKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
- Abv->Add(BitCodeAbbrevOp(0)); // LexicalDeclContext
- Abv->Add(BitCodeAbbrevOp(
- BitCodeAbbrevOp::Fixed,
- 11)); // Packed DeclBits: isInvalidDecl, HasAttrs, isImplicit, isUsed,
- // isReferenced, TopLevelDeclInObjCContainer, AccessSpecifier,
- // ModuleOwnershipKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
// NamedDecl
Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
@@ -2122,11 +2121,11 @@ void ASTWriter::WriteDeclAbbrevs() {
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // IdentifierNamespace
Abv->Add(BitCodeAbbrevOp(
BitCodeAbbrevOp::Fixed,
- 7)); // Packed Tag Decl Bits: getTagKind, isCompleteDefinition,
- // EmbeddedInDeclarator, IsFreeStanding, isCompleteDefinitionRequired
+ 9)); // Packed Tag Decl Bits: getTagKind, isCompleteDefinition,
+ // EmbeddedInDeclarator, IsFreeStanding,
+ // isCompleteDefinitionRequired, ExtInfoKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SourceLocation
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SourceLocation
- Abv->Add(BitCodeAbbrevOp(0)); // ExtInfoKind
// EnumDecl
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // AddTypeRef
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // IntegerType
@@ -2145,13 +2144,12 @@ void ASTWriter::WriteDeclAbbrevs() {
// Redeclarable
Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration
// Decl
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
+ 12)); // Packed DeclBits: HasStandaloneLexicalDC,
+ // isInvalidDecl, HasAttrs, isImplicit, isUsed,
+ // isReferenced, TopLevelDeclInObjCContainer,
+ // AccessSpecifier, ModuleOwnershipKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
- Abv->Add(BitCodeAbbrevOp(0)); // LexicalDeclContext
- Abv->Add(BitCodeAbbrevOp(
- BitCodeAbbrevOp::Fixed,
- 11)); // Packed DeclBits: isInvalidDecl, HasAttrs, isImplicit, isUsed,
- // isReferenced, TopLevelDeclInObjCContainer, AccessSpecifier,
- // ModuleOwnershipKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
// NamedDecl
Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
@@ -2164,11 +2162,11 @@ void ASTWriter::WriteDeclAbbrevs() {
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // IdentifierNamespace
Abv->Add(BitCodeAbbrevOp(
BitCodeAbbrevOp::Fixed,
- 7)); // Packed Tag Decl Bits: getTagKind, isCompleteDefinition,
- // EmbeddedInDeclarator, IsFreeStanding, isCompleteDefinitionRequired
+ 9)); // Packed Tag Decl Bits: getTagKind, isCompleteDefinition,
+ // EmbeddedInDeclarator, IsFreeStanding,
+ // isCompleteDefinitionRequired, ExtInfoKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SourceLocation
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SourceLocation
- Abv->Add(BitCodeAbbrevOp(0)); // ExtInfoKind
// RecordDecl
Abv->Add(BitCodeAbbrevOp(
BitCodeAbbrevOp::Fixed,
@@ -2194,13 +2192,12 @@ void ASTWriter::WriteDeclAbbrevs() {
// Redeclarable
Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration
// Decl
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
+ 12)); // Packed DeclBits: HasStandaloneLexicalDC,
+ // isInvalidDecl, HasAttrs, isImplicit, isUsed,
+ // isReferenced, TopLevelDeclInObjCContainer,
+ // AccessSpecifier, ModuleOwnershipKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
- Abv->Add(BitCodeAbbrevOp(0)); // LexicalDeclContext
- Abv->Add(BitCodeAbbrevOp(
- BitCodeAbbrevOp::Fixed,
- 11)); // Packed DeclBits: isInvalidDecl, HasAttrs, isImplicit, isUsed,
- // isReferenced, TopLevelDeclInObjCContainer, AccessSpecifier,
- // ModuleOwnershipKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
// NamedDecl
Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
@@ -2221,10 +2218,9 @@ void ASTWriter::WriteDeclAbbrevs() {
// ParmVarDecl
Abv->Add(BitCodeAbbrevOp(
BitCodeAbbrevOp::Fixed,
- 19)); // Packed Parm Var Decl bits: IsObjCMethodParameter, ScopeDepth,
- // ScopeIndex, KNRPromoted, HasInheritedDefaultArg
- Abv->Add(BitCodeAbbrevOp(0)); // ObjCDeclQualifier
- Abv->Add(BitCodeAbbrevOp(0)); // HasUninstantiatedDefaultArg
+ 27)); // Packed Parm Var Decl bits: IsObjCMethodParameter, ScopeDepth,
+ // ScopeIndex, ObjCDeclQualifier, KNRPromoted,
+ // HasInheritedDefaultArg, HasUninstantiatedDefaultArg
// Type Source Info
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TypeLoc
@@ -2236,13 +2232,12 @@ void ASTWriter::WriteDeclAbbrevs() {
// Redeclarable
Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration
// Decl
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
+ 12)); // Packed DeclBits: HasStandaloneLexicalDC,
+ // isInvalidDecl, HasAttrs, isImplicit, isUsed,
+ // isReferenced, TopLevelDeclInObjCContainer,
+ // AccessSpecifier, ModuleOwnershipKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
- Abv->Add(BitCodeAbbrevOp(0)); // LexicalDeclContext
- Abv->Add(BitCodeAbbrevOp(
- BitCodeAbbrevOp::Fixed,
- 11)); // Packed DeclBits: isInvalidDecl, HasAttrs, isImplicit, isUsed,
- // isReferenced, TopLevelDeclInObjCContainer, AccessSpecifier,
- // ModuleOwnershipKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
// NamedDecl
Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
@@ -2262,13 +2257,12 @@ void ASTWriter::WriteDeclAbbrevs() {
// Redeclarable
Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration
// Decl
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
+ 12)); // Packed DeclBits: HasStandaloneLexicalDC,
+ // isInvalidDecl, HasAttrs, isImplicit, isUsed,
+ // isReferenced, TopLevelDeclInObjCContainer,
+ // AccessSpecifier, ModuleOwnershipKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
- Abv->Add(BitCodeAbbrevOp(0)); // LexicalDeclContext
- Abv->Add(BitCodeAbbrevOp(
- BitCodeAbbrevOp::Fixed,
- 11)); // Packed DeclBits: isInvalidDecl, HasAttrs, isImplicit, isUsed,
- // isReferenced, TopLevelDeclInObjCContainer, AccessSpecifier,
- // ModuleOwnershipKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
// NamedDecl
Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier
@@ -2303,13 +2297,12 @@ void ASTWriter::WriteDeclAbbrevs() {
// FIXME: Implement abbreviation for other template kinds.
Abv->Add(BitCodeAbbrevOp(FunctionDecl::TK_NonTemplate)); // TemplateKind
// Decl
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
+ 12)); // Packed DeclBits: HasStandaloneLexicalDC,
+ // isInvalidDecl, HasAttrs, isImplicit, isUsed,
+ // isReferenced, TopLevelDeclInObjCContainer,
+ // AccessSpecifier, ModuleOwnershipKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext
- Abv->Add(BitCodeAbbrevOp(0)); // LexicalDeclContext
- Abv->Add(BitCodeAbbrevOp(
- BitCodeAbbrevOp::Fixed,
- 11)); // Packed DeclBits: isInvalidDecl, HasAttrs, isImplicit, isUsed,
- // isReferenced, TopLevelDeclInObjCContainer, AccessSpecifier,
- // ModuleOwnershipKind
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID
// NamedDecl
Abv->Add(BitCodeAbbrevOp(DeclarationName::Identifier)); // NameKind
@@ -2346,16 +2339,14 @@ void ASTWriter::WriteDeclAbbrevs() {
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
DeclCXXMethodAbbrev = Stream.EmitAbbrev(std::move(Abv));
- unsigned ExprDependenceBits = llvm::BitWidth<ExprDependence>;
// Abbreviation for EXPR_DECL_REF
Abv = std::make_shared<BitCodeAbbrev>();
Abv->Add(BitCodeAbbrevOp(serialization::EXPR_DECL_REF));
//Stmt
// Expr
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
- Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, ExprDependenceBits));
- Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind
- Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind
+ // DependenceKind, ValueKind, ObjectKind
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 10));
//DeclRefExpr
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //HasQualifier
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //GetDeclFound
@@ -2374,9 +2365,8 @@ void ASTWriter::WriteDeclAbbrevs() {
//Stmt
// Expr
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
- Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, ExprDependenceBits));
- Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind
- Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind
+ // DependenceKind, ValueKind, ObjectKind
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 10));
//Integer Literal
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Location
Abv->Add(BitCodeAbbrevOp(32)); // Bit Width
@@ -2389,9 +2379,8 @@ void ASTWriter::WriteDeclAbbrevs() {
//Stmt
// Expr
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
- Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, ExprDependenceBits));
- Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind
- Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind
+ // DependenceKind, ValueKind, ObjectKind
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 10));
//Character Literal
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getValue
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Location
@@ -2404,9 +2393,8 @@ void ASTWriter::WriteDeclAbbrevs() {
// Stmt
// Expr
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Type
- Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, ExprDependenceBits));
- Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetValueKind
- Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); //GetObjectKind
+ // DependenceKind, ValueKind, ObjectKind
+ Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 10));
// CastExpr
Abv->Add(BitCodeAbbrevOp(0)); // PathSize
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // HasFPFeatures
diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp
index 59be6828fafabf..8524484ea8a0b9 100644
--- a/clang/lib/Serialization/ASTWriterStmt.cpp
+++ b/clang/lib/Serialization/ASTWriterStmt.cpp
@@ -549,9 +549,14 @@ void ASTStmtWriter::VisitCapturedStmt(CapturedStmt *S) {
void ASTStmtWriter::VisitExpr(Expr *E) {
VisitStmt(E);
Record.AddTypeRef(E->getType());
- Record.push_back(E->getDependence());
- Record.push_back(E->getValueKind());
- Record.push_back(E->getObjectKind());
+
+ BitsPacker ExprBits;
+
+ ExprBits.addBits(E->getDependence(), /*BitsWidth=*/5);
+ ExprBits.addBits(E->getValueKind(), /*BitsWidth=*/2);
+ ExprBits.addBits(E->getObjectKind(), /*BitsWidth=*/3);
+
+ Record.push_back(ExprBits);
}
void ASTStmtWriter::VisitConstantExpr(ConstantExpr *E) {
@@ -866,14 +871,20 @@ void ASTStmtWriter::VisitOMPIteratorExpr(OMPIteratorExpr *E) {
void ASTStmtWriter::VisitCallExpr(CallExpr *E) {
VisitExpr(E);
- Record.push_back(E->getNumArgs());
- Record.push_back(E->hasStoredFPFeatures());
+
+ BitsPacker CallExprBits;
+ // 16 bits should be sufficient to store the number args;
+ CallExprBits.addBits(E->getNumArgs(), /*BitsWidth=*/16);
+ CallExprBits.addBit(E->hasStoredFPFeatures());
+ CallExprBits.addBit(static_cast<bool>(E->getADLCallKind()));
+ Record.push_back(CallExprBits);
+
Record.AddSourceLocation(E->getRParenLoc());
Record.AddStmt(E->getCallee());
for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
Arg != ArgEnd; ++Arg)
Record.AddStmt(*Arg);
- Record.push_back(static_cast<unsigned>(E->getADLCallKind()));
+
if (E->hasStoredFPFeatures())
Record.push_back(E->getFPFeatures().getAsOpaqueInt());
Code = serialization::EXPR_CALL;
@@ -1938,14 +1949,19 @@ ASTStmtWriter::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
void ASTStmtWriter::VisitOverloadExpr(OverloadExpr *E) {
VisitExpr(E);
- Record.push_back(E->getNumDecls());
- Record.push_back(E->hasTemplateKWAndArgsInfo());
+ BitsPacker OverloadExprBits;
+ // 14 Bits should enough to store the number of decls.
+ OverloadExprBits.addBits(E->getNumDecls(), /*BitWidth=*/14);
+ OverloadExprBits.addBit(E->hasTemplateKWAndArgsInfo());
if (E->hasTemplateKWAndArgsInfo()) {
const ASTTemplateKWAndArgsInfo &ArgInfo =
*E->getTrailingASTTemplateKWAndArgsInfo();
- Record.push_back(ArgInfo.NumTemplateArgs);
+ // 14 Bits should enough to store the number of template args.
+ OverloadExprBits.addBits(ArgInfo.NumTemplateArgs, /*BitWidth=*/14);
+ Record.push_back(OverloadExprBits);
AddTemplateKWAndArgsInfo(ArgInfo, E->getTrailingTemplateArgumentLoc());
- }
+ } else
+ Record.push_back(OverloadExprBits);
for (OverloadExpr::decls_iterator OvI = E->decls_begin(),
OvE = E->decls_end();
diff --git a/clang/test/Modules/decl-params-determinisim.m b/clang/test/Modules/decl-params-determinisim.m
index 351403d9af947e..9cf37ac4334cf1 100644
--- a/clang/test/Modules/decl-params-determinisim.m
+++ b/clang/test/Modules/decl-params-determinisim.m
@@ -28,23 +28,23 @@
// CHECK: <TYPE_FUNCTION_PROTO
// CHECK-NEXT: <DECL_PARM_VAR
-// CHECK-SAME: op6=2
+// CHECK-SAME: op5=2
// CHECK-NEXT: <DECL_PARM_VAR
-// CHECK-SAME: op6=3
+// CHECK-SAME: op5=3
// CHECK-NEXT: <DECL_PARM_VAR
-// CHECK-SAME: op6=4
+// CHECK-SAME: op5=4
// CHECK-NEXT: <DECL_PARM_VAR
-// CHECK-SAME: op6=5
+// CHECK-SAME: op5=5
/// Decl records start at 43
// CHECK: <DECL_RECORD
-// CHECK-SAME: op6=43
+// CHECK-SAME: op5=43
// CHECK-NEXT: <DECL_RECORD
-// CHECK-SAME: op6=44
+// CHECK-SAME: op5=44
// CHECK-NEXT: <DECL_RECORD
-// CHECK-SAME: op6=45
+// CHECK-SAME: op5=45
// CHECK-NEXT: <DECL_RECORD
-// CHECK-SAME: op6=46
+// CHECK-SAME: op5=46
//--- headers/a.h
void f(struct A0 *a0,
More information about the cfe-commits
mailing list