https://github.com/boomanaiden154 created 
https://github.com/llvm/llvm-project/pull/152556

The landing of #126324 made it so that __has_builtin returns false for aux 
triple builtins. CUDA offloading can sometimes compile where the host is in the 
aux triple (ie x86_64). This patch explicitly carves out NVPTX so that we do 
not run into redefinition errors.

>From f239993ff07a5b146a620a89bc7755afad7cd1c7 Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengross...@google.com>
Date: Thu, 7 Aug 2025 17:27:49 +0000
Subject: [PATCH] [Clang] Fix __cpuidex conflict with CUDA

The landing of #126324 made it so that __has_builtin returns false for
aux triple builtins. CUDA offloading can sometimes compile where the
host is in the aux triple (ie x86_64). This patch explicitly carves out
NVPTX so that we do not run into redefinition errors.
---
 clang/lib/Headers/cpuid.h               | 5 +++++
 clang/test/Headers/__cpuidex_conflict.c | 1 +
 2 files changed, 6 insertions(+)

diff --git a/clang/lib/Headers/cpuid.h b/clang/lib/Headers/cpuid.h
index 52addb7bfa856..ce8c79e77dc18 100644
--- a/clang/lib/Headers/cpuid.h
+++ b/clang/lib/Headers/cpuid.h
@@ -345,10 +345,15 @@ static __inline int __get_cpuid_count (unsigned int 
__leaf,
 // In some configurations, __cpuidex is defined as a builtin (primarily
 // -fms-extensions) which will conflict with the __cpuidex definition below.
 #if !(__has_builtin(__cpuidex))
+// In some cases, offloading will set the host as the aux triple and define the
+// builtin. Given __has_builtin does not detect builtins on aux triples, we 
need
+// to explicitly check for some offloading cases.
+#ifndef __NVPTX__
 static __inline void __cpuidex(int __cpu_info[4], int __leaf, int __subleaf) {
   __cpuid_count(__leaf, __subleaf, __cpu_info[0], __cpu_info[1], __cpu_info[2],
                 __cpu_info[3]);
 }
 #endif
+#endif
 
 #endif /* __CPUID_H */
diff --git a/clang/test/Headers/__cpuidex_conflict.c 
b/clang/test/Headers/__cpuidex_conflict.c
index 74f45327de2bb..d14ef293e586d 100644
--- a/clang/test/Headers/__cpuidex_conflict.c
+++ b/clang/test/Headers/__cpuidex_conflict.c
@@ -5,6 +5,7 @@
 
 // Ensure that we do not run into conflicts when offloading.
 // RUN: %clang_cc1 %s -DIS_STATIC=static -ffreestanding -fopenmp 
-fopenmp-is-target-device -aux-triple x86_64-unknown-linux-gnu
+// RUN: %clang_cc1 -DIS_STATIC="" -triple nvptx64-nvidia-cuda -aux-triple 
x86_64-unknown-linux-gnu -aux-target-cpu x86-64 -fcuda-is-device 
-internal-isystem /home/gha/llvm-project/build/lib/clang/22/include -x cuda %s 
-o -
 
 typedef __SIZE_TYPE__ size_t;
 

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to