Skip to content

Commit 9406ea3

Browse files
committed
[NFC] [Serialization] Packing more bits
This patch tries to reduce the size of the BMIs by packing more bits into an unsigned integer.
1 parent 1d608fc commit 9406ea3

File tree

5 files changed

+162
-138
lines changed

5 files changed

+162
-138
lines changed

clang/lib/Serialization/ASTReaderDecl.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,9 @@ void ASTDeclReader::Visit(Decl *D) {
583583
}
584584

585585
void ASTDeclReader::VisitDecl(Decl *D) {
586+
BitsUnpacker DeclBits(Record.readInt());
587+
bool HasStandaloneLexicalDC = DeclBits.getNextBit();
588+
586589
if (D->isTemplateParameter() || D->isTemplateParameterPack() ||
587590
isa<ParmVarDecl, ObjCTypeParamDecl>(D)) {
588591
// We don't want to deserialize the DeclContext of a template
@@ -592,7 +595,8 @@ void ASTDeclReader::VisitDecl(Decl *D) {
592595
// return type of the function). Use the translation unit DeclContext as a
593596
// placeholder.
594597
GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();
595-
GlobalDeclID LexicalDCIDForTemplateParmDecl = readDeclID();
598+
GlobalDeclID LexicalDCIDForTemplateParmDecl =
599+
HasStandaloneLexicalDC ? readDeclID() : 0;
596600
if (!LexicalDCIDForTemplateParmDecl)
597601
LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;
598602
Reader.addPendingDeclContextInfo(D,
@@ -601,7 +605,8 @@ void ASTDeclReader::VisitDecl(Decl *D) {
601605
D->setDeclContext(Reader.getContext().getTranslationUnitDecl());
602606
} else {
603607
auto *SemaDC = readDeclAs<DeclContext>();
604-
auto *LexicalDC = readDeclAs<DeclContext>();
608+
auto *LexicalDC =
609+
HasStandaloneLexicalDC ? readDeclAs<DeclContext>() : nullptr;
605610
if (!LexicalDC)
606611
LexicalDC = SemaDC;
607612
// If the context is a class, we might not have actually merged it yet, in
@@ -618,7 +623,6 @@ void ASTDeclReader::VisitDecl(Decl *D) {
618623
}
619624
D->setLocation(ThisDeclLoc);
620625

621-
BitsUnpacker DeclBits(Record.readInt());
622626
D->InvalidDecl = DeclBits.getNextBit();
623627
bool HasAttrs = DeclBits.getNextBit();
624628
D->setImplicit(DeclBits.getNextBit());
@@ -765,7 +769,7 @@ ASTDeclReader::RedeclarableResult ASTDeclReader::VisitTagDecl(TagDecl *TD) {
765769
TD->setCompleteDefinitionRequired(TagDeclBits.getNextBit());
766770
TD->setBraceRange(readSourceRange());
767771

768-
switch (Record.readInt()) {
772+
switch (TagDeclBits.getNextBits(/*Width=*/2)) {
769773
case 0:
770774
break;
771775
case 1: { // ExtInfo
@@ -1089,7 +1093,8 @@ void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) {
10891093
FD->setCachedLinkage((Linkage)FunctionDeclBits.getNextBits(/*Width=*/3));
10901094

10911095
FD->EndRangeLoc = readSourceLocation();
1092-
FD->setDefaultLoc(readSourceLocation());
1096+
if (FD->isExplicitlyDefaulted())
1097+
FD->setDefaultLoc(readSourceLocation());
10931098

10941099
FD->ODRHash = Record.readInt();
10951100
FD->setHasODRHash(true);
@@ -1703,7 +1708,7 @@ void ASTDeclReader::VisitParmVarDecl(ParmVarDecl *PD) {
17031708
unsigned isObjCMethodParam = ParmVarDeclBits.getNextBit();
17041709
unsigned scopeDepth = ParmVarDeclBits.getNextBits(/*Width=*/7);
17051710
unsigned scopeIndex = ParmVarDeclBits.getNextBits(/*Width=*/8);
1706-
unsigned declQualifier = Record.readInt();
1711+
unsigned declQualifier = ParmVarDeclBits.getNextBits(/*Width=*/7);
17071712
if (isObjCMethodParam) {
17081713
assert(scopeDepth == 0);
17091714
PD->setObjCMethodScopeInfo(scopeIndex);
@@ -1716,7 +1721,9 @@ void ASTDeclReader::VisitParmVarDecl(ParmVarDecl *PD) {
17161721
PD->ParmVarDeclBits.HasInheritedDefaultArg = ParmVarDeclBits.getNextBit();
17171722
if (ParmVarDeclBits.getNextBit()) // hasUninstantiatedDefaultArg.
17181723
PD->setUninstantiatedDefaultArg(Record.readExpr());
1719-
PD->ExplicitObjectParameterIntroducerLoc = Record.readSourceLocation();
1724+
1725+
if (ParmVarDeclBits.getNextBit()) // Valid explicit object parameter
1726+
PD->ExplicitObjectParameterIntroducerLoc = Record.readSourceLocation();
17201727

17211728
// FIXME: If this is a redeclaration of a function from another module, handle
17221729
// inheritance of default arguments.

clang/lib/Serialization/ASTReaderStmt.cpp

Lines changed: 42 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ namespace clang {
108108

109109
/// The number of record fields required for the Expr class
110110
/// itself.
111-
static const unsigned NumExprFields = NumStmtFields + 4;
111+
static const unsigned NumExprFields = NumStmtFields + 2;
112112

113113
/// Read and initialize a ExplicitTemplateArgumentList structure.
114114
void ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args,
@@ -524,9 +524,13 @@ void ASTStmtReader::VisitCapturedStmt(CapturedStmt *S) {
524524
void ASTStmtReader::VisitExpr(Expr *E) {
525525
VisitStmt(E);
526526
E->setType(Record.readType());
527-
E->setDependence(static_cast<ExprDependence>(Record.readInt()));
528-
E->setValueKind(static_cast<ExprValueKind>(Record.readInt()));
529-
E->setObjectKind(static_cast<ExprObjectKind>(Record.readInt()));
527+
BitsUnpacker ExprBits(Record.readInt());
528+
E->setDependence(
529+
static_cast<ExprDependence>(ExprBits.getNextBits(/*Width=*/5)));
530+
E->setValueKind(
531+
static_cast<ExprValueKind>(ExprBits.getNextBits(/*Width=*/2)));
532+
E->setObjectKind(
533+
static_cast<ExprObjectKind>(ExprBits.getNextBits(/*Width=*/3)));
530534
assert(Record.getIdx() == NumExprFields &&
531535
"Incorrect expression field count");
532536
}
@@ -995,14 +999,19 @@ void ASTStmtReader::VisitOMPIteratorExpr(OMPIteratorExpr *E) {
995999

9961000
void ASTStmtReader::VisitCallExpr(CallExpr *E) {
9971001
VisitExpr(E);
998-
unsigned NumArgs = Record.readInt();
999-
bool HasFPFeatures = Record.readInt();
1002+
1003+
BitsUnpacker CallExprBits = Record.readInt();
1004+
1005+
unsigned NumArgs = CallExprBits.getNextBits(/*Width=*/16);
1006+
bool HasFPFeatures = CallExprBits.getNextBit();
1007+
E->setADLCallKind(
1008+
static_cast<CallExpr::ADLCallKind>(CallExprBits.getNextBit()));
10001009
assert((NumArgs == E->getNumArgs()) && "Wrong NumArgs!");
10011010
E->setRParenLoc(readSourceLocation());
10021011
E->setCallee(Record.readSubExpr());
10031012
for (unsigned I = 0; I != NumArgs; ++I)
10041013
E->setArg(I, Record.readSubExpr());
1005-
E->setADLCallKind(static_cast<CallExpr::ADLCallKind>(Record.readInt()));
1014+
10061015
if (HasFPFeatures)
10071016
E->setStoredFPFeatures(
10081017
FPOptionsOverride::getFromOpaqueInt(Record.readInt()));
@@ -2013,14 +2022,15 @@ ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
20132022
void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) {
20142023
VisitExpr(E);
20152024

2016-
unsigned NumResults = Record.readInt();
2017-
bool HasTemplateKWAndArgsInfo = Record.readInt();
2025+
BitsUnpacker OverloadExprBits = Record.readInt();
2026+
unsigned NumResults = OverloadExprBits.getNextBits(/*Width=*/14);
2027+
bool HasTemplateKWAndArgsInfo = OverloadExprBits.getNextBit();
20182028
assert((E->getNumDecls() == NumResults) && "Wrong NumResults!");
20192029
assert((E->hasTemplateKWAndArgsInfo() == HasTemplateKWAndArgsInfo) &&
20202030
"Wrong HasTemplateKWAndArgsInfo!");
20212031

20222032
if (HasTemplateKWAndArgsInfo) {
2023-
unsigned NumTemplateArgs = Record.readInt();
2033+
unsigned NumTemplateArgs = OverloadExprBits.getNextBits(/*Width=*/14);
20242034
ReadTemplateKWAndArgsInfo(*E->getTrailingASTTemplateKWAndArgsInfo(),
20252035
E->getTrailingTemplateArgumentLoc(),
20262036
NumTemplateArgs);
@@ -3024,8 +3034,9 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
30243034

30253035
case EXPR_CALL:
30263036
S = CallExpr::CreateEmpty(
3027-
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields],
3028-
/*HasFPFeatures=*/Record[ASTStmtReader::NumExprFields + 1], Empty);
3037+
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields] & 0xffff,
3038+
/*HasFPFeatures=*/
3039+
((Record[ASTStmtReader::NumExprFields] >> 16) & 0x1), Empty);
30293040
break;
30303041

30313042
case EXPR_RECOVERY:
@@ -3766,14 +3777,16 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
37663777

37673778
case EXPR_CXX_OPERATOR_CALL:
37683779
S = CXXOperatorCallExpr::CreateEmpty(
3769-
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields],
3770-
/*HasFPFeatures=*/Record[ASTStmtReader::NumExprFields + 1], Empty);
3780+
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields] & 0xffff,
3781+
/*HasFPFeatures=*/
3782+
((Record[ASTStmtReader::NumExprFields] >> 16) & 0x1), Empty);
37713783
break;
37723784

37733785
case EXPR_CXX_MEMBER_CALL:
37743786
S = CXXMemberCallExpr::CreateEmpty(
3775-
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields],
3776-
/*HasFPFeatures=*/Record[ASTStmtReader::NumExprFields + 1], Empty);
3787+
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields] & 0xffff,
3788+
/*HasFPFeatures=*/
3789+
((Record[ASTStmtReader::NumExprFields] >> 16) & 0x1), Empty);
37773790
break;
37783791

37793792
case EXPR_CXX_REWRITTEN_BINARY_OPERATOR:
@@ -3948,23 +3961,21 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
39483961
case EXPR_CXX_UNRESOLVED_MEMBER:
39493962
S = UnresolvedMemberExpr::CreateEmpty(
39503963
Context,
3951-
/*NumResults=*/Record[ASTStmtReader::NumExprFields],
3952-
/*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 1],
3953-
/*NumTemplateArgs=*/
3954-
Record[ASTStmtReader::NumExprFields + 1]
3955-
? Record[ASTStmtReader::NumExprFields + 2]
3956-
: 0);
3964+
/*NumResults=*/Record[ASTStmtReader::NumExprFields] & ((1 << 14) - 1),
3965+
/*HasTemplateKWAndArgsInfo=*/
3966+
(Record[ASTStmtReader::NumExprFields] >> 14) & (0x1),
3967+
/*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] >> 14 &
3968+
((1 << 14) - 1));
39573969
break;
39583970

39593971
case EXPR_CXX_UNRESOLVED_LOOKUP:
39603972
S = UnresolvedLookupExpr::CreateEmpty(
39613973
Context,
3962-
/*NumResults=*/Record[ASTStmtReader::NumExprFields],
3963-
/*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 1],
3964-
/*NumTemplateArgs=*/
3965-
Record[ASTStmtReader::NumExprFields + 1]
3966-
? Record[ASTStmtReader::NumExprFields + 2]
3967-
: 0);
3974+
/*NumResults=*/Record[ASTStmtReader::NumExprFields] & ((1 << 14) - 1),
3975+
/*HasTemplateKWAndArgsInfo=*/
3976+
(Record[ASTStmtReader::NumExprFields] >> 14) & (0x1),
3977+
/*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] >> 14 &
3978+
((1 << 14) - 1));
39683979
break;
39693980

39703981
case EXPR_TYPE_TRAIT:
@@ -4026,8 +4037,9 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
40264037

40274038
case EXPR_CUDA_KERNEL_CALL:
40284039
S = CUDAKernelCallExpr::CreateEmpty(
4029-
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields],
4030-
/*HasFPFeatures=*/Record[ASTStmtReader::NumExprFields + 1], Empty);
4040+
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields] & 0xffff,
4041+
/*HasFPFeatures=*/
4042+
((Record[ASTStmtReader::NumExprFields] >> 16) & 0x1), Empty);
40314043
break;
40324044

40334045
case EXPR_ASTYPE:

0 commit comments

Comments
 (0)