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); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits