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 ArgNames = []; } -class AtomicBuiltin : Builtin; +class AtomicBuiltin : Builtin { + string Languages = languages; +} class LibBuiltin : 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; }