https://github.com/fineg74 updated https://github.com/llvm/llvm-project/pull/182215
>From 6f21c3457c751632ec5f15b66f1adf46010a2178 Mon Sep 17 00:00:00 2001 From: "Fine, Gregory" <[email protected]> Date: Wed, 18 Feb 2026 20:39:58 -0800 Subject: [PATCH 1/3] Introduce libdevice function declarartions for future use for math OpenMP wrappers --- clang/lib/Headers/CMakeLists.txt | 1 + .../__clang_spirv_libdevice_declares.h | 137 ++++++++++++++++++ .../__clang_openmp_device_functions.h | 15 ++ 3 files changed, 153 insertions(+) create mode 100644 clang/lib/Headers/__clang_spirv_libdevice_declares.h diff --git a/clang/lib/Headers/CMakeLists.txt b/clang/lib/Headers/CMakeLists.txt index 95d20bbca79ac..52c8bd5470d50 100644 --- a/clang/lib/Headers/CMakeLists.txt +++ b/clang/lib/Headers/CMakeLists.txt @@ -141,6 +141,7 @@ set(riscv_files set(spirv_files __clang_spirv_builtins.h + __clang_spirv_libdevice_declares.h ) set(systemz_files diff --git a/clang/lib/Headers/__clang_spirv_libdevice_declares.h b/clang/lib/Headers/__clang_spirv_libdevice_declares.h new file mode 100644 index 0000000000000..4cdae5f961242 --- /dev/null +++ b/clang/lib/Headers/__clang_spirv_libdevice_declares.h @@ -0,0 +1,137 @@ +/*===-- __clang_spirv_libdevice_declares.h - decls for libdevice functions --=== + * + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + * + *===-----------------------------------------------------------------------=== + */ + +#ifndef __CLANG_SPIRV_LIBDEVICE_DECLARES_H__ +#define __CLANG_SPIRV_LIBDEVICE_DECLARES_H__ + +#if defined(__cplusplus) +extern "C" { +#endif + +#define _CLC_OVERLOAD [[clang::overloadable]] +#define _CLC_CONSTFN [[gnu::const]] +_CLC_OVERLOAD _CLC_CONSTFN uint32_t __spirv_ocl_s_abs(int); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_acos(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_acos(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_acosh(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_acosh(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_asin(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_asin(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_asinh(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_asinh(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_atan(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_atan(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_atan2(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_atan2(double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_atanh(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_atanh(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_cbrt(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_cbrt(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_ceil(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_ceil(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_cos(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_cos(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_cosh(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_cosh(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_cospi(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_cospi(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_erf(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_erf(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_erfc(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_erfc(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_exp(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_exp(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_exp2(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_exp2(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_exp10(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_exp10(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_expm1(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_expm1(double); +_CLC_OVERLOAD _CLC_CONSTFN bool __spirv_IsNan(float); +_CLC_OVERLOAD _CLC_CONSTFN bool __spirv_IsNan(double); +_CLC_OVERLOAD _CLC_CONSTFN bool __spirv_IsInf(float); +_CLC_OVERLOAD _CLC_CONSTFN bool __spirv_IsInf(double); +_CLC_OVERLOAD _CLC_CONSTFN bool __spirv_IsFinite(float); +_CLC_OVERLOAD _CLC_CONSTFN bool __spirv_IsFinite(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_copysign(float,float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_copysign(double,double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_ldexp(float, int); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_ldexp(double, int); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_fabs(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_fabs(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_logb(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_logb(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_fmax(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_fmax(double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_fmin(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_fmin(double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_fdim(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_fdim(double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_floor(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_floor(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_fma(float, float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_fma(double, double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_fmod(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_fmod(double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_frexp(float,int *); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_frexp(double,int *); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_hypot(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_hypot(double, double); +_CLC_OVERLOAD _CLC_CONSTFN int __spirv_ocl_ilogb(float); +_CLC_OVERLOAD _CLC_CONSTFN int __spirv_ocl_ilogb(double); +_CLC_OVERLOAD _CLC_CONSTFN _uint64_t __spirv_ocl_s_abs(long); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_lgamma(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_lgamma(flodoubleat); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_round(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_round(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_log(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_log(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_log10(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_log10(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_log1p(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_log1p(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_log2(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_log2(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_modf(float, float *); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_modf(double, double *); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_nextafter(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_nextafter(double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_sqrt(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_sqrt(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_rsqrt(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_rsqrt(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_pow(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_pow(double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_pown(float, int); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_pown(double, int); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_remainder(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_remainder(double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_remquo(float, float, int *); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_remquo(double, double, int *); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_sin(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_sin(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_sincos(float, float *); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_sincos(double, double *); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_sinh(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_sinh(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_sinpi(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_sinpi(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_tan(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_tan(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_tanh(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_tanh(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_tgamma(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_tgamma(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_trunc(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_trunc(double); + +#if defined(__cplusplus) +} // extern "C" +#endif +#endif // __CLANG_SPIRV_LIBDEVICE_DECLARES_H__ diff --git a/clang/lib/Headers/openmp_wrappers/__clang_openmp_device_functions.h b/clang/lib/Headers/openmp_wrappers/__clang_openmp_device_functions.h index 3e354c63efc66..63a71525b6496 100644 --- a/clang/lib/Headers/openmp_wrappers/__clang_openmp_device_functions.h +++ b/clang/lib/Headers/openmp_wrappers/__clang_openmp_device_functions.h @@ -55,6 +55,21 @@ extern "C" { #pragma omp end declare variant #endif +#ifdef __SPIRV__ +#pragma omp begin declare variant match( \ + device = {arch(spirv64)}, implementation = {extension(match_any)}) + +#define __OPENMP_SPIRV__ + +/// Include declarations for libdevice functions. +#include <__clang_spirv_libdevice_declares.h> + +#undef __OPENMP_SPIRV__ + +#pragma omp end declare variant +#endif + + #ifdef __cplusplus } // extern "C" #endif >From 3753e189329a6851f261dfc4c199487890d8fabd Mon Sep 17 00:00:00 2001 From: "Fine, Gregory" <[email protected]> Date: Wed, 18 Feb 2026 20:50:36 -0800 Subject: [PATCH 2/3] Fix formatting --- clang/lib/Headers/__clang_spirv_libdevice_declares.h | 8 ++++---- .../openmp_wrappers/__clang_openmp_device_functions.h | 3 +-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/clang/lib/Headers/__clang_spirv_libdevice_declares.h b/clang/lib/Headers/__clang_spirv_libdevice_declares.h index 4cdae5f961242..950403896281b 100644 --- a/clang/lib/Headers/__clang_spirv_libdevice_declares.h +++ b/clang/lib/Headers/__clang_spirv_libdevice_declares.h @@ -59,8 +59,8 @@ _CLC_OVERLOAD _CLC_CONSTFN bool __spirv_IsInf(float); _CLC_OVERLOAD _CLC_CONSTFN bool __spirv_IsInf(double); _CLC_OVERLOAD _CLC_CONSTFN bool __spirv_IsFinite(float); _CLC_OVERLOAD _CLC_CONSTFN bool __spirv_IsFinite(double); -_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_copysign(float,float); -_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_copysign(double,double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_copysign(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_copysign(double, double); _CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_ldexp(float, int); _CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_ldexp(double, int); _CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_fabs(float); @@ -79,8 +79,8 @@ _CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_fma(float, float, float); _CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_fma(double, double, double); _CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_fmod(float, float); _CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_fmod(double, double); -_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_frexp(float,int *); -_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_frexp(double,int *); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_frexp(float, int *); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_frexp(double, int *); _CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_hypot(float, float); _CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_hypot(double, double); _CLC_OVERLOAD _CLC_CONSTFN int __spirv_ocl_ilogb(float); diff --git a/clang/lib/Headers/openmp_wrappers/__clang_openmp_device_functions.h b/clang/lib/Headers/openmp_wrappers/__clang_openmp_device_functions.h index 63a71525b6496..2e99992500620 100644 --- a/clang/lib/Headers/openmp_wrappers/__clang_openmp_device_functions.h +++ b/clang/lib/Headers/openmp_wrappers/__clang_openmp_device_functions.h @@ -57,7 +57,7 @@ extern "C" { #ifdef __SPIRV__ #pragma omp begin declare variant match( \ - device = {arch(spirv64)}, implementation = {extension(match_any)}) + device = {arch(spirv64)}, implementation = {extension(match_any)}) #define __OPENMP_SPIRV__ @@ -69,7 +69,6 @@ extern "C" { #pragma omp end declare variant #endif - #ifdef __cplusplus } // extern "C" #endif >From ca3915ffec6282fd83b229736a7b17934ab79e9e Mon Sep 17 00:00:00 2001 From: "Fine, Gregory" <[email protected]> Date: Wed, 18 Feb 2026 21:58:46 -0800 Subject: [PATCH 3/3] Fix build break --- clang/lib/Headers/__clang_spirv_libdevice_declares.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/lib/Headers/__clang_spirv_libdevice_declares.h b/clang/lib/Headers/__clang_spirv_libdevice_declares.h index 950403896281b..166914f3bc907 100644 --- a/clang/lib/Headers/__clang_spirv_libdevice_declares.h +++ b/clang/lib/Headers/__clang_spirv_libdevice_declares.h @@ -16,7 +16,7 @@ extern "C" { #define _CLC_OVERLOAD [[clang::overloadable]] #define _CLC_CONSTFN [[gnu::const]] -_CLC_OVERLOAD _CLC_CONSTFN uint32_t __spirv_ocl_s_abs(int); +_CLC_OVERLOAD _CLC_CONSTFN unsigned int __spirv_ocl_s_abs(int); _CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_acos(float); _CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_acos(double); _CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_acosh(float); @@ -85,9 +85,9 @@ _CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_hypot(float, float); _CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_hypot(double, double); _CLC_OVERLOAD _CLC_CONSTFN int __spirv_ocl_ilogb(float); _CLC_OVERLOAD _CLC_CONSTFN int __spirv_ocl_ilogb(double); -_CLC_OVERLOAD _CLC_CONSTFN _uint64_t __spirv_ocl_s_abs(long); +_CLC_OVERLOAD _CLC_CONSTFN unsigned long __spirv_ocl_s_abs(long); _CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_lgamma(float); -_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_lgamma(flodoubleat); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_lgamma(double); _CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_round(float); _CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_round(double); _CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_log(float); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
