llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Alex Duran (adurang)

<details>
<summary>Changes</summary>

 On systems with newer glibc (2.41) when compiling with -fopenmp-targets the 
device compilation side fails with:

&gt;     /usr/include/x86_64-linux-gnu/bits/floatn.h:83:52: error: unsupported 
machine mode '__TC__'
&gt;        83 | typedef _Complex float __cfloat128 __attribute__ ((__mode__ 
(__TC__)));
&gt;           |                                                    ^
 
 Sema::AddModeAttr already avoids diagnosing a 128-bit `mode` attribute  (e.g. 
__TC__, as used by glibc's __cfloat128) that the target can't represent, but 
only for CUDA and SYCL device compilation. OpenMP target-device compilation for 
targets also lacks a 128-bit float/complex representation so we extend the 
check to cover OpenMPIsTargetDevice as well to avoid the fail.

Assisted by Claude.

---
Full diff: https://github.com/llvm/llvm-project/pull/214497.diff


2 Files Affected:

- (modified) clang/lib/Sema/SemaDeclAttr.cpp (+2-1) 
- (added) clang/test/OpenMP/target_device_float128_mode_attr.c (+11) 


``````````diff
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index 492b125587344..813b7de3e86e6 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -5226,7 +5226,8 @@ void Sema::AddModeAttr(Decl *D, const AttributeCommonInfo 
&CI,
   if (NewElemTy.isNull()) {
     // Only emit diagnostic on host for 128-bit mode attribute
     if (!(DestWidth == 128 &&
-          (getLangOpts().CUDAIsDevice || getLangOpts().SYCLIsDevice)))
+          (getLangOpts().CUDAIsDevice || getLangOpts().SYCLIsDevice ||
+           getLangOpts().OpenMPIsTargetDevice)))
       Diag(AttrLoc, diag::err_machine_mode) << 1 /*Unsupported*/ << Name;
     return;
   }
diff --git a/clang/test/OpenMP/target_device_float128_mode_attr.c 
b/clang/test/OpenMP/target_device_float128_mode_attr.c
new file mode 100644
index 0000000000000..19bff61bfb0ed
--- /dev/null
+++ b/clang/test/OpenMP/target_device_float128_mode_attr.c
@@ -0,0 +1,11 @@
+// Host-side compilation on x86 (no errors expected).
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -aux-triple nvptx64 
-fopenmp -x c -fsyntax-only -verify=host %s
+
+// Device-side compilation for targets without 128-bit float/complex support 
(no errors expected).
+// RUN: %clang_cc1 -triple nvptx64 -aux-triple x86_64-unknown-linux-gnu 
-fopenmp -fopenmp-is-target-device -x c -fsyntax-only -verify=device %s
+// RUN: %clang_cc1 -triple amdgcn-amd-amdhsa -aux-triple 
x86_64-unknown-linux-gnu -fopenmp -fopenmp-is-target-device -x c -fsyntax-only 
-verify=device %s
+// RUN: %clang_cc1 -triple spirv64 -aux-triple x86_64-unknown-linux-gnu 
-fopenmp -fopenmp-is-target-device -x c -fsyntax-only -verify=device %s
+
+// host-no-diagnostics
+// device-no-diagnostics
+typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__)));

``````````

</details>


https://github.com/llvm/llvm-project/pull/214497
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to