diff options
author | Sander de Smalen <sander.desmalen@arm.com> | 2024-01-23 12:35:16 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-23 12:35:16 +0100 |
commit | 1652d44d8da83b0a01d5f0b378f10882f5ec8d22 (patch) | |
tree | e70c058cc4c8a3e9d2a7e8da170f9164e190b4b4 /clang/lib/Sema/SemaDecl.cpp | |
parent | 5c7bbe383bf2de0c1de36c7231bbd7f75bfccb1e (diff) | |
download | llvm-1652d44d8da83b0a01d5f0b378f10882f5ec8d22.zip llvm-1652d44d8da83b0a01d5f0b378f10882f5ec8d22.tar.gz llvm-1652d44d8da83b0a01d5f0b378f10882f5ec8d22.tar.bz2 |
[Clang] Amend SME attributes with support for ZT0. (#77941)
This patch builds on top of #76971 and implements support for:
* __arm_new("zt0")
* __arm_in("zt0")
* __arm_out("zt0")
* __arm_inout("zt0")
* __arm_preserves("zt0")
Diffstat (limited to 'clang/lib/Sema/SemaDecl.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 13ca438..f9bf1d1 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -12234,12 +12234,15 @@ bool Sema::CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, const auto *Attr = NewFD->getAttr<ArmNewAttr>(); bool UsesSM = NewFD->hasAttr<ArmLocallyStreamingAttr>(); bool UsesZA = Attr && Attr->isNewZA(); + bool UsesZT0 = Attr && Attr->isNewZT0(); if (const auto *FPT = NewFD->getType()->getAs<FunctionProtoType>()) { FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo(); UsesSM |= EPI.AArch64SMEAttributes & FunctionType::SME_PStateSMEnabledMask; UsesZA |= FunctionType::getArmZAState(EPI.AArch64SMEAttributes) != FunctionType::ARM_None; + UsesZT0 |= FunctionType::getArmZT0State(EPI.AArch64SMEAttributes) != + FunctionType::ARM_None; } if (UsesSM || UsesZA) { @@ -12254,6 +12257,14 @@ bool Sema::CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, diag::err_sme_definition_using_za_in_non_sme_target); } } + if (UsesZT0) { + llvm::StringMap<bool> FeatureMap; + Context.getFunctionFeatureMap(FeatureMap, NewFD); + if (!FeatureMap.contains("sme2")) { + Diag(NewFD->getLocation(), + diag::err_sme_definition_using_zt0_in_non_sme2_target); + } + } } return Redeclaration; |