https://github.com/jhuber6 updated https://github.com/llvm/llvm-project/pull/176791
>From c7331fbb65dd7162570a5d4a2a171cb87f14194e Mon Sep 17 00:00:00 2001 From: Joseph Huber <[email protected]> Date: Mon, 19 Jan 2026 12:01:34 -0600 Subject: [PATCH 1/2] [HIP] Define `_OPENMP` on the device for mixed OpenMP CPU compilations Summary: One issue with the CMake detection scripts is that they will use `_OPENMP` to determine the version. If we are compiling in HIP mode then this will always fail due to the device portion not having it defined. This PR adds an options to define this to zero, so if people check for features they won't get anything. Slight possibility of this corrupting some headers that try to distinguish between OpenMP and HIP offloading? But I think in most cases the OpenMP source uses pragmas and `__HIP__` for that. Meanwhile, without this it's pretty much impossible to compile standards compliant CPU OpenMP with HIP mode on. --- clang/include/clang/Basic/LangOptions.def | 1 + clang/include/clang/Options/Options.td | 3 +++ clang/lib/Driver/ToolChains/Clang.cpp | 8 ++++++++ clang/lib/Frontend/InitPreprocessor.cpp | 5 +++++ clang/test/Driver/offloading-interoperability.c | 2 +- 5 files changed, 18 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 36fec24638363..7903bfe56c0f6 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -223,6 +223,7 @@ LANGOPT(NativeInt16Type , 1, 1, NotCompatible, "Native int 16 type support") LANGOPT(CUDA , 1, 0, NotCompatible, "CUDA") LANGOPT(HIP , 1, 0, NotCompatible, "HIP") LANGOPT(OpenMP , 32, 0, NotCompatible, "OpenMP support and version of OpenMP (31, 40 or 45)") +LANGOPT(OpenMPMacros , 1, 0, NotCompatible, "Define the OpenMP Macros") LANGOPT(OpenMPExtensions , 1, 1, NotCompatible, "Enable all Clang extensions for OpenMP directives and clauses") LANGOPT(OpenMPSimd , 1, 0, NotCompatible, "Use SIMD only OpenMP support.") LANGOPT(OpenMPUseTLS , 1, 0, NotCompatible, "Use TLS for threadprivates or runtime calls") diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index 188739e72434a..301fdb3b2c7b2 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -3900,6 +3900,9 @@ def fopenmp_cuda_blocks_per_sm_EQ : Joined<["-"], "fopenmp-cuda-blocks-per-sm="> Flags<[NoArgumentUnused, HelpHidden]>, Visibility<[ClangOption, CC1Option]>; def fopenmp_cuda_teams_reduction_recs_num_EQ : Joined<["-"], "fopenmp-cuda-teams-reduction-recs-num=">, Group<f_Group>, Flags<[NoArgumentUnused, HelpHidden]>, Visibility<[ClangOption, CC1Option]>; +def fopenmp_macros : Flag<["-"], "fopenmp-macros">, Group<f_Group>, + MarshallingInfoFlag<LangOpts<"OpenMPMacros">>, + Flags<[NoArgumentUnused, HelpHidden]>, Visibility<[ClangOption, CC1Option]>; //===----------------------------------------------------------------------===// // Shared cc1 + fc1 OpenMP Target Options diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 41ee88fd5501a..3ada04e6b3f2a 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -6743,6 +6743,14 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, // semantic analysis, etc. break; } + } + if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ, + options::OPT_fno_openmp, false) && + (JA.isDeviceOffloading(Action::OFK_Cuda) || + JA.isDeviceOffloading(Action::OFK_HIP))) { + // We need to define only the OpenMP macros on the device so two-pass + // compilation can succeed when they are used on the host. + CmdArgs.push_back("-fopenmp-macros"); } else { Args.AddLastArg(CmdArgs, options::OPT_fopenmp_simd, options::OPT_fno_openmp_simd); diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 18c694579abdf..bc2eca2ce2933 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -1460,6 +1460,11 @@ static void InitializePredefinedMacros(const TargetInfo &TI, } } + // CUDA / HIP offloading only supports OpenMP's CPU support, but both + // compilations must define these macros to compile. + if (LangOpts.OpenMPMacros) + Builder.defineMacro("_OPENMP", "0"); + // CUDA device path compilaton if (LangOpts.CUDAIsDevice && !LangOpts.HIP) { // The CUDA_ARCH value is set for the GPU target specified in the NVPTX diff --git a/clang/test/Driver/offloading-interoperability.c b/clang/test/Driver/offloading-interoperability.c index f4d980e5fa5ce..8efc095750f94 100644 --- a/clang/test/Driver/offloading-interoperability.c +++ b/clang/test/Driver/offloading-interoperability.c @@ -5,7 +5,7 @@ // RUN: | FileCheck %s --check-prefix NO-OPENMP-FLAGS-FOR-CUDA-DEVICE // // NO-OPENMP-FLAGS-FOR-CUDA-DEVICE: "-cc1" "-triple" "nvptx64-nvidia-cuda" -// NO-OPENMP-FLAGS-FOR-CUDA-DEVICE-NOT: -fopenmp +// NO-OPENMP-FLAGS-FOR-CUDA-DEVICE: -fopenmp-macros // NO-OPENMP-FLAGS-FOR-CUDA-DEVICE-NEXT: ptxas" "-m64" // NO-OPENMP-FLAGS-FOR-CUDA-DEVICE-NEXT: fatbinary"{{( "--cuda")?}} "-64" // NO-OPENMP-FLAGS-FOR-CUDA-DEVICE-NEXT: "-cc1" "-triple" "powerpc64le-unknown-linux-gnu" >From 060d96a45198285d03a3f917a19b751a0e05c314 Mon Sep 17 00:00:00 2001 From: Joseph Huber <[email protected]> Date: Wed, 21 Jan 2026 11:54:13 -0600 Subject: [PATCH 2/2] comments --- clang/include/clang/Basic/LangOptions.def | 2 +- clang/include/clang/Options/Options.td | 2 +- clang/lib/Frontend/InitPreprocessor.cpp | 2 +- clang/test/Driver/check-openmp-version.hip | 26 ++++++++++++++++++++++ 4 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 clang/test/Driver/check-openmp-version.hip diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 7903bfe56c0f6..06baaf0100a7a 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -223,7 +223,7 @@ LANGOPT(NativeInt16Type , 1, 1, NotCompatible, "Native int 16 type support") LANGOPT(CUDA , 1, 0, NotCompatible, "CUDA") LANGOPT(HIP , 1, 0, NotCompatible, "HIP") LANGOPT(OpenMP , 32, 0, NotCompatible, "OpenMP support and version of OpenMP (31, 40 or 45)") -LANGOPT(OpenMPMacros , 1, 0, NotCompatible, "Define the OpenMP Macros") +LANGOPT(OpenMPMacrosOnly , 1, 0, NotCompatible, "Define only the OpenMP Macros for CUDA/HIP devices") LANGOPT(OpenMPExtensions , 1, 1, NotCompatible, "Enable all Clang extensions for OpenMP directives and clauses") LANGOPT(OpenMPSimd , 1, 0, NotCompatible, "Use SIMD only OpenMP support.") LANGOPT(OpenMPUseTLS , 1, 0, NotCompatible, "Use TLS for threadprivates or runtime calls") diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index 301fdb3b2c7b2..56fbedb28923f 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -3901,7 +3901,7 @@ def fopenmp_cuda_blocks_per_sm_EQ : Joined<["-"], "fopenmp-cuda-blocks-per-sm="> def fopenmp_cuda_teams_reduction_recs_num_EQ : Joined<["-"], "fopenmp-cuda-teams-reduction-recs-num=">, Group<f_Group>, Flags<[NoArgumentUnused, HelpHidden]>, Visibility<[ClangOption, CC1Option]>; def fopenmp_macros : Flag<["-"], "fopenmp-macros">, Group<f_Group>, - MarshallingInfoFlag<LangOpts<"OpenMPMacros">>, + MarshallingInfoFlag<LangOpts<"OpenMPMacrosOnly">>, Flags<[NoArgumentUnused, HelpHidden]>, Visibility<[ClangOption, CC1Option]>; //===----------------------------------------------------------------------===// diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index bc2eca2ce2933..d181d93d8e790 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -1462,7 +1462,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI, // CUDA / HIP offloading only supports OpenMP's CPU support, but both // compilations must define these macros to compile. - if (LangOpts.OpenMPMacros) + if (LangOpts.OpenMPMacrosOnly) Builder.defineMacro("_OPENMP", "0"); // CUDA device path compilaton diff --git a/clang/test/Driver/check-openmp-version.hip b/clang/test/Driver/check-openmp-version.hip new file mode 100644 index 0000000000000..7c572ea7641b9 --- /dev/null +++ b/clang/test/Driver/check-openmp-version.hip @@ -0,0 +1,26 @@ +// REQUIRES: amdgpu-registered-target +// REQUIRES: x86-registered-target + +// RUN: %clang -x hip %s -fopenmp=libomp \ +// RUN: --target=x86_64-unknown-linux-gnu \ +// RUN: --offload-arch=gfx906 \ +// RUN: -nogpulib -nogpuinc \ +// RUN: -nostdinc -nostdlib -nodefaultlibs \ +// RUN: -I %S/../Headers/Inputs/include \ +// RUN: -fsyntax-only + +#include <omp.h> + +const char ompver_str[] = {'I', 'N', 'F', 'O', ':', 'O', 'p', 'e', 'n', 'M', 'P', '-', + 'd', 'a', 't', 'e', '[', + ('0' + ((_OPENMP / 100000) % 10)), + ('0' + ((_OPENMP / 10000) % 10)), + ('0' + ((_OPENMP / 1000) % 10)), + ('0' + ((_OPENMP / 100) % 10)), + ('0' + ((_OPENMP / 10) % 10)), + ('0' + ((_OPENMP / 1) % 10)), + ']', '\0'}; + +int main(void) { + return 0; +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
