https://github.com/lrzlin updated https://github.com/llvm/llvm-project/pull/191811
>From 8a1e1ef597f131997a5763b47c3251acea5b8a43 Mon Sep 17 00:00:00 2001 From: Lin Runze <[email protected]> Date: Tue, 14 Apr 2026 16:50:28 +0800 Subject: [PATCH] [clang][LoongArch] Check target features in CheckLoongArchBuiltinFunctionCall --- .../include/clang/Basic/DiagnosticSemaKinds.td | 4 ++++ clang/lib/Sema/SemaLoongArch.cpp | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 4cd4efc55c416..0cffc28d27582 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -13539,6 +13539,10 @@ def err_riscv_attribute_interrupt_invalid_combination : Error< "RISC-V 'interrupt' attribute contains invalid combination of interrupt types">; def err_riscv_builtin_invalid_twiden : Error<"RISC-V XSfmm twiden must be 1, 2 or 4">; +// LoongArch builtin required extension warning +def err_loongarch_builtin_requires_extension : Error< + "builtin requires%select{| at least one of the following extensions}0: %1">; + def err_std_source_location_impl_not_found : Error< "'std::source_location::__impl' was not found; it must be defined before '__builtin_source_location' is called">; def err_std_source_location_impl_malformed : Error< diff --git a/clang/lib/Sema/SemaLoongArch.cpp b/clang/lib/Sema/SemaLoongArch.cpp index c57a6f91a3dfc..dbbff8be70a93 100644 --- a/clang/lib/Sema/SemaLoongArch.cpp +++ b/clang/lib/Sema/SemaLoongArch.cpp @@ -12,7 +12,9 @@ #include "clang/Sema/SemaLoongArch.h" #include "clang/Basic/TargetBuiltins.h" +#include "clang/Basic/TargetInfo.h" #include "clang/Sema/Sema.h" +#include "llvm/ADT/StringRef.h" #include "llvm/Support/MathExtras.h" namespace clang { @@ -22,6 +24,21 @@ SemaLoongArch::SemaLoongArch(Sema &S) : SemaBase(S) {} bool SemaLoongArch::CheckLoongArchBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, CallExpr *TheCall) { + ASTContext &Context = getASTContext(); + const FunctionDecl *FD = SemaRef.getCurFunctionDecl(); + + llvm::StringRef Features = Context.BuiltinInfo.getRequiredFeatures(BuiltinID); + // Only check it when the builtin is not used in a function. + if (!Features.empty() && FD == NULL) { + llvm::SmallVector<StringRef> RequiredFeatures; + Features.split(RequiredFeatures, ','); + for (auto RF : RequiredFeatures) + if (!TI.hasFeature(RF)) + return Diag(TheCall->getBeginLoc(), + diag::err_loongarch_builtin_requires_extension) + << /* IsExtension */ true << TheCall->getSourceRange() << RF; + } + switch (BuiltinID) { default: break; _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
