================ @@ -1328,4 +1328,57 @@ void SemaARM::handleInterruptAttr(Decl *D, const ParsedAttr &AL) { ARMInterruptAttr(getASTContext(), AL, Kind)); } +// Check if the function definition uses any AArch64 SME features without +// having the '+sme' feature enabled and warn user if sme locally streaming +// function returns or uses arguments with VL-based types. +void SemaARM::CheckSMEFunctionDefAttributes(const FunctionDecl *FD) { + const auto *Attr = FD->getAttr<ArmNewAttr>(); + bool UsesSM = FD->hasAttr<ArmLocallyStreamingAttr>(); + bool UsesZA = Attr && Attr->isNewZA(); + bool UsesZT0 = Attr && Attr->isNewZT0(); + + if (FD->hasAttr<ArmLocallyStreamingAttr>()) { + if (FD->getReturnType()->isSizelessVectorType()) + Diag(FD->getLocation(), + diag::warn_sme_locally_streaming_has_vl_args_returns) + << /*IsArg=*/false; + if (llvm::any_of(FD->parameters(), [](ParmVarDecl *P) { + return P->getOriginalType()->isSizelessVectorType(); + })) + Diag(FD->getLocation(), + diag::warn_sme_locally_streaming_has_vl_args_returns) + << /*IsArg=*/true; + } + if (const auto *FPT = FD->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; + } + + ASTContext &Context = getASTContext(); + if (UsesSM || UsesZA) { + llvm::StringMap<bool> FeatureMap; + Context.getFunctionFeatureMap(FeatureMap, FD); + if (!FeatureMap.contains("sme")) { + if (UsesSM) + Diag(FD->getLocation(), + diag::err_sme_definition_using_sm_in_non_sme_target); + else + Diag(FD->getLocation(), + diag::err_sme_definition_using_za_in_non_sme_target); + } + } + if (UsesZT0) { + llvm::StringMap<bool> FeatureMap; + Context.getFunctionFeatureMap(FeatureMap, FD); + if (!FeatureMap.contains("sme2")) { + Diag(FD->getLocation(), + diag::err_sme_definition_using_zt0_in_non_sme2_target); + } + } +} ---------------- MacDue wrote:
```suggestion if (UsesSM || UsesZA || UsesZT0) { llvm::StringMap<bool> FeatureMap; Context.getFunctionFeatureMap(FeatureMap, FD); if (!FeatureMap.contains("sme")) { if (UsesSM) Diag(FD->getLocation(), diag::err_sme_definition_using_sm_in_non_sme_target); else Diag(FD->getLocation(), diag::err_sme_definition_using_za_in_non_sme_target); } if (!FeatureMap.contains("sme2")) { Diag(FD->getLocation(), diag::err_sme_definition_using_zt0_in_non_sme2_target); } } } ``` https://github.com/llvm/llvm-project/pull/121777 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits