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 e9927bb577cdadaf90969433f154f9b4586c26ac 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/lib/Frontend/InitPreprocessor.cpp    |  2 +-
 clang/test/Driver/check-openmp-version.hip | 26 ++++++++++++++++++++++
 3 files changed, 28 insertions(+), 2 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/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

Reply via email to