@@ -161,6 +161,7 @@ static void diagnoseBadTypeAttribute(Sema &S, const ParsedAttr &attr,
161161 case ParsedAttr::AT_ArmIn: \
162162 case ParsedAttr::AT_ArmOut: \
163163 case ParsedAttr::AT_ArmInOut: \
164+ case ParsedAttr::AT_ArmAgnostic: \
164165 case ParsedAttr::AT_AnyX86NoCallerSavedRegisters: \
165166 case ParsedAttr::AT_AnyX86NoCfCheck: \
166167 CALLING_CONV_ATTRS_CASELIST
@@ -7745,6 +7746,40 @@ static bool checkMutualExclusion(TypeProcessingState &state,
77457746 return true ;
77467747}
77477748
7749+ static bool handleArmAgnosticAttribute (Sema &S,
7750+ FunctionProtoType::ExtProtoInfo &EPI,
7751+ ParsedAttr &Attr) {
7752+ if (!Attr.getNumArgs ()) {
7753+ S.Diag (Attr.getLoc (), diag::err_missing_arm_state) << Attr;
7754+ Attr.setInvalid ();
7755+ return true ;
7756+ }
7757+
7758+ for (unsigned I = 0 ; I < Attr.getNumArgs (); ++I) {
7759+ StringRef StateName;
7760+ SourceLocation LiteralLoc;
7761+ if (!S.checkStringLiteralArgumentAttr (Attr, I, StateName, &LiteralLoc))
7762+ return true ;
7763+
7764+ if (StateName != " sme_za_state" ) {
7765+ S.Diag (LiteralLoc, diag::err_unknown_arm_state) << StateName;
7766+ Attr.setInvalid ();
7767+ return true ;
7768+ }
7769+
7770+ if (EPI.AArch64SMEAttributes &
7771+ (FunctionType::SME_ZAMask | FunctionType::SME_ZT0Mask)) {
7772+ S.Diag (Attr.getLoc (), diag::err_conflicting_attributes_arm_agnostic);
7773+ Attr.setInvalid ();
7774+ return true ;
7775+ }
7776+
7777+ EPI.setArmSMEAttribute (FunctionType::SME_AgnosticZAStateMask);
7778+ }
7779+
7780+ return false ;
7781+ }
7782+
77487783static bool handleArmStateAttribute (Sema &S,
77497784 FunctionProtoType::ExtProtoInfo &EPI,
77507785 ParsedAttr &Attr,
@@ -7775,6 +7810,12 @@ static bool handleArmStateAttribute(Sema &S,
77757810 return true ;
77767811 }
77777812
7813+ if (EPI.AArch64SMEAttributes & FunctionType::SME_AgnosticZAStateMask) {
7814+ S.Diag (LiteralLoc, diag::err_conflicting_attributes_arm_agnostic);
7815+ Attr.setInvalid ();
7816+ return true ;
7817+ }
7818+
77787819 // __arm_in(S), __arm_out(S), __arm_inout(S) and __arm_preserves(S)
77797820 // are all mutually exclusive for the same S, so check if there are
77807821 // conflicting attributes.
@@ -7925,7 +7966,8 @@ static bool handleFunctionTypeAttr(TypeProcessingState &state, ParsedAttr &attr,
79257966 attr.getKind () == ParsedAttr::AT_ArmPreserves ||
79267967 attr.getKind () == ParsedAttr::AT_ArmIn ||
79277968 attr.getKind () == ParsedAttr::AT_ArmOut ||
7928- attr.getKind () == ParsedAttr::AT_ArmInOut) {
7969+ attr.getKind () == ParsedAttr::AT_ArmInOut ||
7970+ attr.getKind () == ParsedAttr::AT_ArmAgnostic) {
79297971 if (S.CheckAttrTarget (attr))
79307972 return true ;
79317973
@@ -7976,6 +8018,10 @@ static bool handleFunctionTypeAttr(TypeProcessingState &state, ParsedAttr &attr,
79768018 if (handleArmStateAttribute (S, EPI, attr, FunctionType::ARM_InOut))
79778019 return true ;
79788020 break ;
8021+ case ParsedAttr::AT_ArmAgnostic:
8022+ if (handleArmAgnosticAttribute (S, EPI, attr))
8023+ return true ;
8024+ break ;
79798025 default :
79808026 llvm_unreachable (" Unsupported attribute" );
79818027 }
0 commit comments