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

Reply via email to