diff options
author | Sander de Smalen <sander.desmalen@arm.com> | 2024-01-23 17:41:12 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-23 17:41:12 +0100 |
commit | 1f6f19935c1b4512190f1bc94ebf94f3d2b69911 (patch) | |
tree | 99986ca4c928cd41d4c4ece6bf7705adc35af3ec /clang/lib/Sema/SemaChecking.cpp | |
parent | d3a6a90ae5e80b074293ebfbcb2f15da9c57acc5 (diff) | |
download | llvm-1f6f19935c1b4512190f1bc94ebf94f3d2b69911.zip llvm-1f6f19935c1b4512190f1bc94ebf94f3d2b69911.tar.gz llvm-1f6f19935c1b4512190f1bc94ebf94f3d2b69911.tar.bz2 |
[Clang][AArch64] Add diagnostics for builtins that use ZT0. (#79140)
Similar to what we did for ZA, this patch adds diagnostics to flag when
using a ZT0 builtin in a function that does not have ZT0 state.
Diffstat (limited to 'clang/lib/Sema/SemaChecking.cpp')
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 1f83dcf..7833d5a 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -3013,6 +3013,11 @@ enum ArmSMEState : unsigned { ArmOutZA = 0b10, ArmInOutZA = 0b11, ArmZAMask = 0b11, + + ArmInZT0 = 0b01 << 2, + ArmOutZT0 = 0b10 << 2, + ArmInOutZT0 = 0b11 << 2, + ArmZT0Mask = 0b11 << 2 }; bool Sema::ParseSVEImmChecks( @@ -3206,6 +3211,13 @@ static bool hasArmZAState(const FunctionDecl *FD) { (FD->hasAttr<ArmNewAttr>() && FD->getAttr<ArmNewAttr>()->isNewZA()); } +static bool hasArmZT0State(const FunctionDecl *FD) { + const auto *T = FD->getType()->getAs<FunctionProtoType>(); + return (T && FunctionType::getArmZT0State(T->getAArch64SMEAttributes()) != + FunctionType::ARM_None) || + (FD->hasAttr<ArmNewAttr>() && FD->getAttr<ArmNewAttr>()->isNewZT0()); +} + static ArmSMEState getSMEState(unsigned BuiltinID) { switch (BuiltinID) { default: @@ -3233,6 +3245,11 @@ bool Sema::CheckSMEBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { Diag(TheCall->getBeginLoc(), diag::warn_attribute_arm_za_builtin_no_za_state) << TheCall->getSourceRange(); + + if ((getSMEState(BuiltinID) & ArmZT0Mask) && !hasArmZT0State(FD)) + Diag(TheCall->getBeginLoc(), + diag::warn_attribute_arm_zt0_builtin_no_zt0_state) + << TheCall->getSourceRange(); } // Range check SME intrinsics that take immediate values. |