[llvm-branch-commits] [clang] [Clang][NFC] Introduce LanguageID::HIP_LANG and reclassify AtomicBuitins (PR #185403)

Sameer Sahasrabuddhe via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Mar 10 22:53:32 PDT 2026


https://github.com/ssahasra updated https://github.com/llvm/llvm-project/pull/185403

>From b4d22e6a9730ee227b66b21f46ab9ea7806b36ea Mon Sep 17 00:00:00 2001
From: Sameer Sahasrabuddhe <sameer.sahasrabuddhe at amd.com>
Date: Mon, 9 Mar 2026 13:38:59 +0530
Subject: [PATCH] [Clang][NFC] Introduce LanguageID::HIP_LANG and reclassify
 AtomicBuiltins

The TableGen class AtomicBuiltin is currently used for both OpenCL and HIP
atomic builtins, but there is no way to classify them. That class now takes
language as an argument. HIP is represented by a new enum member
LanguageID::HIP_LANG in this scheme.

Assisted-By: Claude Sonnet 4.5
---
 clang/include/clang/AST/Expr.h                |  4 +-
 clang/include/clang/Basic/Builtins.h          |  1 +
 clang/include/clang/Basic/Builtins.td         | 50 +++++++++----------
 clang/include/clang/Basic/BuiltinsBase.td     |  4 +-
 clang/lib/AST/StmtPrinter.cpp                 |  6 +--
 clang/lib/Sema/SemaChecking.cpp               |  2 +-
 clang/utils/TableGen/ClangBuiltinsEmitter.cpp |  8 ++-
 7 files changed, 41 insertions(+), 34 deletions(-)

diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h
index 37a1af584716a..ab2ab72a5c454 100644
--- a/clang/include/clang/AST/Expr.h
+++ b/clang/include/clang/AST/Expr.h
@@ -6927,7 +6927,7 @@ class PseudoObjectExpr final
 class AtomicExpr : public Expr {
 public:
   enum AtomicOp {
-#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) AO ## ID,
+#define ATOMIC_BUILTIN(ID, TYPE, ATTRS, LANGS) AO##ID,
 #include "clang/Basic/Builtins.inc"
     // Avoid trailing comma
     BI_First = 0
@@ -6990,7 +6990,7 @@ class AtomicExpr : public Expr {
   AtomicOp getOp() const { return Op; }
   StringRef getOpAsString() const {
     switch (Op) {
-#define ATOMIC_BUILTIN(ID, TYPE, ATTRS)                                        \
+#define ATOMIC_BUILTIN(ID, TYPE, ATTRS, LANGS)                                 \
   case AO##ID:                                                                 \
     return #ID;
 #include "clang/Basic/Builtins.inc"
diff --git a/clang/include/clang/Basic/Builtins.h b/clang/include/clang/Basic/Builtins.h
index 51f0745d47015..2e661419ac6dc 100644
--- a/clang/include/clang/Basic/Builtins.h
+++ b/clang/include/clang/Basic/Builtins.h
@@ -46,6 +46,7 @@ enum LanguageID : uint16_t {
   ALL_OCL_LANGUAGES = 0x800, // builtin for OCL languages.
   HLSL_LANG = 0x1000,        // builtin requires HLSL.
   C23_LANG = 0x2000,         // builtin requires C23 or later.
+  HIP_LANG = 0x4000,         // builtin requires HIP.
   ALL_LANGUAGES = C_LANG | CXX_LANG | OBJC_LANG, // builtin for all languages.
   ALL_GNU_LANGUAGES = ALL_LANGUAGES | GNU_LANG,  // builtin requires GNU mode.
   ALL_MS_LANGUAGES = ALL_LANGUAGES | MS_LANG     // builtin requires MS mode.
diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td
index 4981711fe786d..b74695e5f84de 100644
--- a/clang/include/clang/Basic/Builtins.td
+++ b/clang/include/clang/Basic/Builtins.td
@@ -2345,79 +2345,79 @@ def ScopedAtomicUDec : AtomicBuiltin {
 }
 
 // OpenCL 2.0 atomic builtins.
-def OpenCLAtomicInit : AtomicBuiltin {
+def OpenCLAtomicInit : AtomicBuiltin<"ALL_OCL_LANGUAGES"> {
   let Spellings = ["__opencl_atomic_init"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def OpenCLAtomicLoad : AtomicBuiltin {
+def OpenCLAtomicLoad : AtomicBuiltin<"ALL_OCL_LANGUAGES"> {
   let Spellings = ["__opencl_atomic_load"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def OpenCLAtomicStore : AtomicBuiltin {
+def OpenCLAtomicStore : AtomicBuiltin<"ALL_OCL_LANGUAGES"> {
   let Spellings = ["__opencl_atomic_store"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def OpenCLAtomicCompareExchangeWeak : AtomicBuiltin {
+def OpenCLAtomicCompareExchangeWeak : AtomicBuiltin<"ALL_OCL_LANGUAGES"> {
   let Spellings = ["__opencl_atomic_compare_exchange_weak"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def OpenCLAtomicCompareExchangeStrong : AtomicBuiltin {
+def OpenCLAtomicCompareExchangeStrong : AtomicBuiltin<"ALL_OCL_LANGUAGES"> {
   let Spellings = ["__opencl_atomic_compare_exchange_strong"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def OpenCLAtomicExchange : AtomicBuiltin {
+def OpenCLAtomicExchange : AtomicBuiltin<"ALL_OCL_LANGUAGES"> {
   let Spellings = ["__opencl_atomic_exchange"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def OpenCLAtomicFetchAdd : AtomicBuiltin {
+def OpenCLAtomicFetchAdd : AtomicBuiltin<"ALL_OCL_LANGUAGES"> {
   let Spellings = ["__opencl_atomic_fetch_add"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def OpenCLAtomicFetchSub : AtomicBuiltin {
+def OpenCLAtomicFetchSub : AtomicBuiltin<"ALL_OCL_LANGUAGES"> {
   let Spellings = ["__opencl_atomic_fetch_sub"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def OpenCLAtomicFetchAnd : AtomicBuiltin {
+def OpenCLAtomicFetchAnd : AtomicBuiltin<"ALL_OCL_LANGUAGES"> {
   let Spellings = ["__opencl_atomic_fetch_and"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def OpenCLAtomicFetchOr : AtomicBuiltin {
+def OpenCLAtomicFetchOr : AtomicBuiltin<"ALL_OCL_LANGUAGES"> {
   let Spellings = ["__opencl_atomic_fetch_or"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def OpenCLAtomicFetchXor : AtomicBuiltin {
+def OpenCLAtomicFetchXor : AtomicBuiltin<"ALL_OCL_LANGUAGES"> {
   let Spellings = ["__opencl_atomic_fetch_xor"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def OpenCLAtomicFetchMin : AtomicBuiltin {
+def OpenCLAtomicFetchMin : AtomicBuiltin<"ALL_OCL_LANGUAGES"> {
   let Spellings = ["__opencl_atomic_fetch_min"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def OpenCLAtomicFetchMax : AtomicBuiltin {
+def OpenCLAtomicFetchMax : AtomicBuiltin<"ALL_OCL_LANGUAGES"> {
   let Spellings = ["__opencl_atomic_fetch_max"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
@@ -2449,73 +2449,73 @@ def AtomicFetchUDec : AtomicBuiltin {
 }
 
 // HIP atomic builtins.
-def HipAtomicLoad : AtomicBuiltin {
+def HipAtomicLoad : AtomicBuiltin<"HIP_LANG"> {
   let Spellings = ["__hip_atomic_load"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def HipAtomicStore : AtomicBuiltin {
+def HipAtomicStore : AtomicBuiltin<"HIP_LANG"> {
   let Spellings = ["__hip_atomic_store"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def HipAtomicCompareExchangeWeak : AtomicBuiltin {
+def HipAtomicCompareExchangeWeak : AtomicBuiltin<"HIP_LANG"> {
   let Spellings = ["__hip_atomic_compare_exchange_weak"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def HipAtomicCompareExchangeStrong : AtomicBuiltin {
+def HipAtomicCompareExchangeStrong : AtomicBuiltin<"HIP_LANG"> {
   let Spellings = ["__hip_atomic_compare_exchange_strong"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def HipAtomicExchange : AtomicBuiltin {
+def HipAtomicExchange : AtomicBuiltin<"HIP_LANG"> {
   let Spellings = ["__hip_atomic_exchange"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def HipAtomicFetchAdd : AtomicBuiltin {
+def HipAtomicFetchAdd : AtomicBuiltin<"HIP_LANG"> {
   let Spellings = ["__hip_atomic_fetch_add"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def HipAtomicFetchSub : AtomicBuiltin {
+def HipAtomicFetchSub : AtomicBuiltin<"HIP_LANG"> {
   let Spellings = ["__hip_atomic_fetch_sub"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def HipAtomicFetchAnd : AtomicBuiltin {
+def HipAtomicFetchAnd : AtomicBuiltin<"HIP_LANG"> {
   let Spellings = ["__hip_atomic_fetch_and"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def HipAtomicFetchOr : AtomicBuiltin {
+def HipAtomicFetchOr : AtomicBuiltin<"HIP_LANG"> {
   let Spellings = ["__hip_atomic_fetch_or"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def HipAtomicFetchXor : AtomicBuiltin {
+def HipAtomicFetchXor : AtomicBuiltin<"HIP_LANG"> {
   let Spellings = ["__hip_atomic_fetch_xor"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def HipAtomicFetchMin : AtomicBuiltin {
+def HipAtomicFetchMin : AtomicBuiltin<"HIP_LANG"> {
   let Spellings = ["__hip_atomic_fetch_min"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
 }
 
-def HipAtomicFetchMax : AtomicBuiltin {
+def HipAtomicFetchMax : AtomicBuiltin<"HIP_LANG"> {
   let Spellings = ["__hip_atomic_fetch_max"];
   let Attributes = [CustomTypeChecking];
   let Prototype = "void(...)";
diff --git a/clang/include/clang/Basic/BuiltinsBase.td b/clang/include/clang/Basic/BuiltinsBase.td
index af9c0fd7d3cef..2ce58f18ca531 100644
--- a/clang/include/clang/Basic/BuiltinsBase.td
+++ b/clang/include/clang/Basic/BuiltinsBase.td
@@ -171,7 +171,9 @@ class Builtin {
   list<string> ArgNames = [];
 }
 
-class AtomicBuiltin : Builtin;
+class AtomicBuiltin<string languages = "ALL_LANGUAGES"> : Builtin {
+  string Languages = languages;
+}
 
 class LibBuiltin<string header, string languages = "ALL_LANGUAGES"> : Builtin {
   string Header = header;
diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp
index 4d364fdcd5502..9369645c80aa0 100644
--- a/clang/lib/AST/StmtPrinter.cpp
+++ b/clang/lib/AST/StmtPrinter.cpp
@@ -2043,9 +2043,9 @@ void StmtPrinter::VisitPseudoObjectExpr(PseudoObjectExpr *Node) {
 void StmtPrinter::VisitAtomicExpr(AtomicExpr *Node) {
   const char *Name = nullptr;
   switch (Node->getOp()) {
-#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \
-  case AtomicExpr::AO ## ID: \
-    Name = #ID "("; \
+#define ATOMIC_BUILTIN(ID, TYPE, ATTRS, LANGS)                                 \
+  case AtomicExpr::AO##ID:                                                     \
+    Name = #ID "(";                                                            \
     break;
 #include "clang/Basic/Builtins.inc"
   }
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 29add9d092e6b..85aa21f2480fb 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -3208,7 +3208,7 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
       CheckNonNullArgument(*this, TheCall->getArg(0), TheCall->getExprLoc());
     break;
   }
-#define ATOMIC_BUILTIN(ID, TYPE, ATTRS)                                        \
+#define ATOMIC_BUILTIN(ID, TYPE, ATTRS, LANGS)                                 \
   case Builtin::BI##ID:                                                        \
     return AtomicOpsOverloaded(TheCallResult, AtomicExpr::AO##ID);
 #include "clang/Basic/Builtins.inc"
diff --git a/clang/utils/TableGen/ClangBuiltinsEmitter.cpp b/clang/utils/TableGen/ClangBuiltinsEmitter.cpp
index f628a993a23cc..49bfb28bcaa30 100644
--- a/clang/utils/TableGen/ClangBuiltinsEmitter.cpp
+++ b/clang/utils/TableGen/ClangBuiltinsEmitter.cpp
@@ -90,7 +90,8 @@ struct Builtin {
     }
     OS << ", ";
     if (BT == BuiltinType::LibBuiltin || BT == BuiltinType::LangBuiltin ||
-        BT == BuiltinType::TargetLibBuiltin) {
+        BT == BuiltinType::TargetLibBuiltin ||
+        BT == BuiltinType::AtomicBuiltin) {
       OS << BuiltinRecord->getValueAsString("Languages");
     } else {
       OS << "ALL_LANGUAGES";
@@ -144,7 +145,10 @@ struct Builtin {
       OS << ", \"" << BuiltinRecord->getValueAsString("Features") << "\"";
       break;
     }
-    case BuiltinType::AtomicBuiltin:
+    case BuiltinType::AtomicBuiltin: {
+      OS << ", " << BuiltinRecord->getValueAsString("Languages");
+      break;
+    }
     case BuiltinType::Builtin:
       break;
     }



More information about the llvm-branch-commits mailing list