aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSameer Sahasrabuddhe <sameer.sahasrabuddhe@amd.com>2026-03-09 13:38:59 +0530
committerSameer Sahasrabuddhe <sameer.sahasrabuddhe@amd.com>2026-03-09 17:49:58 +0530
commitb4d22e6a9730ee227b66b21f46ab9ea7806b36ea (patch)
treed25ab22aa61f93d2849d0efedc70d06dc7c12d21
parentbbd80ea6674c23bf3e231b80a325ff815bff3d09 (diff)
downloadllvm-users/ssahsara/hip-lang-builtin.tar.gz
llvm-users/ssahsara/hip-lang-builtin.tar.bz2
llvm-users/ssahsara/hip-lang-builtin.zip
[Clang][NFC] Introduce LanguageID::HIP_LANG and reclassify AtomicBuiltinsusers/ssahsara/hip-lang-builtin
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
-rw-r--r--clang/include/clang/AST/Expr.h4
-rw-r--r--clang/include/clang/Basic/Builtins.h1
-rw-r--r--clang/include/clang/Basic/Builtins.td50
-rw-r--r--clang/include/clang/Basic/BuiltinsBase.td4
-rw-r--r--clang/lib/AST/StmtPrinter.cpp6
-rw-r--r--clang/lib/Sema/SemaChecking.cpp2
-rw-r--r--clang/utils/TableGen/ClangBuiltinsEmitter.cpp8
7 files changed, 41 insertions, 34 deletions
diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h
index 37a1af584716..ab2ab72a5c45 100644
--- a/clang/include/clang/AST/Expr.h
+++ b/clang/include/clang/AST/Expr.h
@@ -6927,7 +6927,7 @@ public:
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 @@ public:
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 51f0745d4701..2e661419ac6d 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 4981711fe786..b74695e5f84d 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 af9c0fd7d3ce..2ce58f18ca53 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 4d364fdcd550..9369645c80aa 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 29add9d092e6..85aa21f2480f 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 f628a993a23c..49bfb28bcaa3 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;
}