[clang] e44bbed - Make ParsedAttrInfo and subclasses use constexpr construction
Benjamin Kramer via cfe-commits
cfe-commits at lists.llvm.org
Sat Mar 5 11:41:05 PST 2022
Author: Benjamin Kramer
Date: 2022-03-05T20:37:21+01:00
New Revision: e44bbedb3261e918dcbd77d271dcdf0c89a41ce0
URL: https://github.com/llvm/llvm-project/commit/e44bbedb3261e918dcbd77d271dcdf0c89a41ce0
DIFF: https://github.com/llvm/llvm-project/commit/e44bbedb3261e918dcbd77d271dcdf0c89a41ce0.diff
LOG: Make ParsedAttrInfo and subclasses use constexpr construction
This removes a 30 kB global initializer. NFCI.
Added:
Modified:
clang/include/clang/Sema/ParsedAttr.h
clang/utils/TableGen/ClangAttrEmitter.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Sema/ParsedAttr.h b/clang/include/clang/Sema/ParsedAttr.h
index ef59e14b58c46..f8abb8cb119ba 100644
--- a/clang/include/clang/Sema/ParsedAttr.h
+++ b/clang/include/clang/Sema/ParsedAttr.h
@@ -74,12 +74,29 @@ struct ParsedAttrInfo {
// The names of the known arguments of this attribute.
ArrayRef<const char *> ArgNames;
- ParsedAttrInfo(AttributeCommonInfo::Kind AttrKind =
- AttributeCommonInfo::NoSemaHandlerAttribute)
- : AttrKind(AttrKind), NumArgs(0), OptArgs(0), HasCustomParsing(0),
- IsTargetSpecific(0), IsType(0), IsStmt(0), IsKnownToGCC(0),
- IsSupportedByPragmaAttribute(0) {}
+protected:
+ constexpr ParsedAttrInfo(AttributeCommonInfo::Kind AttrKind =
+ AttributeCommonInfo::NoSemaHandlerAttribute)
+ : AttrKind(AttrKind), NumArgs(0), OptArgs(0), NumArgMembers(0),
+ HasCustomParsing(0), AcceptsExprPack(0), IsTargetSpecific(0), IsType(0),
+ IsStmt(0), IsKnownToGCC(0), IsSupportedByPragmaAttribute(0) {}
+
+ constexpr ParsedAttrInfo(AttributeCommonInfo::Kind AttrKind, unsigned NumArgs,
+ unsigned OptArgs, unsigned NumArgMembers,
+ unsigned HasCustomParsing, unsigned AcceptsExprPack,
+ unsigned IsTargetSpecific, unsigned IsType,
+ unsigned IsStmt, unsigned IsKnownToGCC,
+ unsigned IsSupportedByPragmaAttribute,
+ ArrayRef<Spelling> Spellings,
+ ArrayRef<const char *> ArgNames)
+ : AttrKind(AttrKind), NumArgs(NumArgs), OptArgs(OptArgs),
+ NumArgMembers(NumArgMembers), HasCustomParsing(HasCustomParsing),
+ AcceptsExprPack(AcceptsExprPack), IsTargetSpecific(IsTargetSpecific),
+ IsType(IsType), IsStmt(IsStmt), IsKnownToGCC(IsKnownToGCC),
+ IsSupportedByPragmaAttribute(IsSupportedByPragmaAttribute),
+ Spellings(Spellings), ArgNames(ArgNames) {}
+public:
virtual ~ParsedAttrInfo() = default;
/// Check if this attribute appertains to D, and issue a diagnostic if not.
diff --git a/clang/utils/TableGen/ClangAttrEmitter.cpp b/clang/utils/TableGen/ClangAttrEmitter.cpp
index 3a9df85b017b3..47c06cdd147cb 100644
--- a/clang/utils/TableGen/ClangAttrEmitter.cpp
+++ b/clang/utils/TableGen/ClangAttrEmitter.cpp
@@ -3577,9 +3577,9 @@ static void emitArgInfo(const Record &R, raw_ostream &OS) {
// If there is a variadic argument, we will set the optional argument count
// to its largest value. Since it's currently a 4-bit number, we set it to 15.
- OS << " NumArgs = " << ArgCount << ";\n";
- OS << " OptArgs = " << (HasVariadic ? 15 : OptCount) << ";\n";
- OS << " NumArgMembers = " << ArgMemberCount << ";\n";
+ OS << " /*NumArgs=*/" << ArgCount << ",\n";
+ OS << " /*OptArgs=*/" << (HasVariadic ? 15 : OptCount) << ",\n";
+ OS << " /*NumArgMembers=*/" << ArgMemberCount << ",\n";
}
static std::string GetDiagnosticSpelling(const Record &R) {
@@ -4205,30 +4205,34 @@ void EmitClangAttrParsedAttrImpl(RecordKeeper &Records, raw_ostream &OS) {
OS << "struct ParsedAttrInfo" << I->first
<< " final : public ParsedAttrInfo {\n";
- OS << " ParsedAttrInfo" << I->first << "() {\n";
- OS << " AttrKind = ParsedAttr::AT_" << AttrName << ";\n";
+ OS << " constexpr ParsedAttrInfo" << I->first << "() : ParsedAttrInfo(\n";
+ OS << " /*AttrKind=*/ParsedAttr::AT_" << AttrName << ",\n";
emitArgInfo(Attr, OS);
- OS << " HasCustomParsing = ";
- OS << Attr.getValueAsBit("HasCustomParsing") << ";\n";
- OS << " AcceptsExprPack = ";
- OS << Attr.getValueAsBit("AcceptsExprPack") << ";\n";
- OS << " IsTargetSpecific = ";
- OS << Attr.isSubClassOf("TargetSpecificAttr") << ";\n";
- OS << " IsType = ";
- OS << (Attr.isSubClassOf("TypeAttr") ||
- Attr.isSubClassOf("DeclOrTypeAttr")) << ";\n";
- OS << " IsStmt = ";
+ OS << " /*HasCustomParsing=*/";
+ OS << Attr.getValueAsBit("HasCustomParsing") << ",\n";
+ OS << " /*AcceptsExprPack=*/";
+ OS << Attr.getValueAsBit("AcceptsExprPack") << ",\n";
+ OS << " /*IsTargetSpecific=*/";
+ OS << Attr.isSubClassOf("TargetSpecificAttr") << ",\n";
+ OS << " /*IsType=*/";
+ OS << (Attr.isSubClassOf("TypeAttr") || Attr.isSubClassOf("DeclOrTypeAttr"))
+ << ",\n";
+ OS << " /*IsStmt=*/";
OS << (Attr.isSubClassOf("StmtAttr") || Attr.isSubClassOf("DeclOrStmtAttr"))
- << ";\n";
- OS << " IsKnownToGCC = ";
- OS << IsKnownToGCC(Attr) << ";\n";
- OS << " IsSupportedByPragmaAttribute = ";
- OS << PragmaAttributeSupport.isAttributedSupported(*I->second) << ";\n";
+ << ",\n";
+ OS << " /*IsKnownToGCC=*/";
+ OS << IsKnownToGCC(Attr) << ",\n";
+ OS << " /*IsSupportedByPragmaAttribute=*/";
+ OS << PragmaAttributeSupport.isAttributedSupported(*I->second) << ",\n";
if (!Spellings.empty())
- OS << " Spellings = " << I->first << "Spellings;\n";
+ OS << " /*Spellings=*/" << I->first << "Spellings,\n";
+ else
+ OS << " /*Spellings=*/{},\n";
if (!ArgNames.empty())
- OS << " ArgNames = " << I->first << "ArgNames;\n";
- OS << " }\n";
+ OS << " /*ArgNames=*/" << I->first << "ArgNames";
+ else
+ OS << " /*ArgNames=*/{}";
+ OS << ") {}\n";
GenerateAppertainsTo(Attr, OS);
GenerateMutualExclusionsChecks(Attr, Records, OS, MergeDeclOS, MergeStmtOS);
GenerateLangOptRequirements(Attr, OS);
More information about the cfe-commits
mailing list