[NFC] [Serialization] Packing more bits
This patch tries to reduce the size of the BMIs by packing more bits into an unsigned integer.
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
@@ -3024,8 +3034,9 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
|
||||
|
||||
case EXPR_CALL:
|
||||
S = CallExpr::CreateEmpty(
|
||||
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields],
|
||||
/*HasFPFeatures=*/Record[ASTStmtReader::NumExprFields + 1], Empty);
|
||||
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields] & 0xffff,
|
||||
/*HasFPFeatures=*/
|
||||
((Record[ASTStmtReader::NumExprFields] >> 16) & 0x1), Empty);
|
||||
break;
|
||||
|
||||
case EXPR_RECOVERY:
|
||||
@@ -3766,14 +3777,16 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
|
||||
|
||||
case EXPR_CXX_OPERATOR_CALL:
|
||||
S = CXXOperatorCallExpr::CreateEmpty(
|
||||
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields],
|
||||
/*HasFPFeatures=*/Record[ASTStmtReader::NumExprFields + 1], Empty);
|
||||
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields] & 0xffff,
|
||||
/*HasFPFeatures=*/
|
||||
((Record[ASTStmtReader::NumExprFields] >> 16) & 0x1), Empty);
|
||||
break;
|
||||
|
||||
case EXPR_CXX_MEMBER_CALL:
|
||||
S = CXXMemberCallExpr::CreateEmpty(
|
||||
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields],
|
||||
/*HasFPFeatures=*/Record[ASTStmtReader::NumExprFields + 1], Empty);
|
||||
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields] & 0xffff,
|
||||
/*HasFPFeatures=*/
|
||||
((Record[ASTStmtReader::NumExprFields] >> 16) & 0x1), Empty);
|
||||
break;
|
||||
|
||||
case EXPR_CXX_REWRITTEN_BINARY_OPERATOR:
|
||||
@@ -3948,23 +3961,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:
|
||||
@@ -4026,8 +4037,9 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
|
||||
|
||||
case EXPR_CUDA_KERNEL_CALL:
|
||||
S = CUDAKernelCallExpr::CreateEmpty(
|
||||
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields],
|
||||
/*HasFPFeatures=*/Record[ASTStmtReader::NumExprFields + 1], Empty);
|
||||
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields] & 0xffff,
|
||||
/*HasFPFeatures=*/
|
||||
((Record[ASTStmtReader::NumExprFields] >> 16) & 0x1), Empty);
|
||||
break;
|
||||
|
||||
case EXPR_ASTYPE:
|
||||
|
||||
@@ -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
|
||||
@@ -2353,9 +2346,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));
|
||||
//DeclRefExpr
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //HasQualifier
|
||||
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); //GetDeclFound
|
||||
@@ -2374,9 +2366,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 +2380,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 +2394,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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user