@@ -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,38 @@ 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+ if (EPI.AArch64SMEAttributes &
7766+ (FunctionType::SME_ZAMask | FunctionType::SME_ZT0Mask)) {
7767+ S.Diag (Attr.getLoc (), diag::err_conflicting_attributes_arm_agnostic);
7768+ Attr.setInvalid ();
7769+ return true ;
7770+ }
7771+ EPI.setArmSMEAttribute (FunctionType::SME_AgnosticZAStateMask);
7772+ } else {
7773+ S.Diag (LiteralLoc, diag::err_unknown_arm_state) << StateName;
7774+ Attr.setInvalid ();
7775+ return true ;
7776+ }
7777+ }
7778+ return false ;
7779+ }
7780+
77487781static bool handleArmStateAttribute (Sema &S,
77497782 FunctionProtoType::ExtProtoInfo &EPI,
77507783 ParsedAttr &Attr,
@@ -7775,6 +7808,12 @@ static bool handleArmStateAttribute(Sema &S,
77757808 return true ;
77767809 }
77777810
7811+ if (EPI.AArch64SMEAttributes & FunctionType::SME_AgnosticZAStateMask) {
7812+ S.Diag (LiteralLoc, diag::err_conflicting_attributes_arm_agnostic);
7813+ Attr.setInvalid ();
7814+ return true ;
7815+ }
7816+
77787817 // __arm_in(S), __arm_out(S), __arm_inout(S) and __arm_preserves(S)
77797818 // are all mutually exclusive for the same S, so check if there are
77807819 // conflicting attributes.
@@ -7925,7 +7964,8 @@ static bool handleFunctionTypeAttr(TypeProcessingState &state, ParsedAttr &attr,
79257964 attr.getKind () == ParsedAttr::AT_ArmPreserves ||
79267965 attr.getKind () == ParsedAttr::AT_ArmIn ||
79277966 attr.getKind () == ParsedAttr::AT_ArmOut ||
7928- attr.getKind () == ParsedAttr::AT_ArmInOut) {
7967+ attr.getKind () == ParsedAttr::AT_ArmInOut ||
7968+ attr.getKind () == ParsedAttr::AT_ArmAgnostic) {
79297969 if (S.CheckAttrTarget (attr))
79307970 return true ;
79317971
@@ -7976,6 +8016,10 @@ static bool handleFunctionTypeAttr(TypeProcessingState &state, ParsedAttr &attr,
79768016 if (handleArmStateAttribute (S, EPI, attr, FunctionType::ARM_InOut))
79778017 return true ;
79788018 break ;
8019+ case ParsedAttr::AT_ArmAgnostic:
8020+ if (handleArmAgnosticAttribute (S, EPI, attr))
8021+ return true ;
8022+ break ;
79798023 default :
79808024 llvm_unreachable (" Unsupported attribute" );
79818025 }
0 commit comments