================
@@ -2794,6 +2794,14 @@ void ItaniumCXXABI::registerGlobalDtor(CodeGenFunction 
&CGF, const VarDecl &D,
   if (D.isNoDestroy(CGM.getContext()))
     return;
 
+  // OpenMP offloading supports C++ constructors and destructors but we do not
+  // always have 'atexit' available. Instead lower these to use the LLVM global
+  // destructors which we can handle directly in the runtime.
+  if (CGM.getLangOpts().OpenMP && CGM.getLangOpts().OpenMPIsTargetDevice &&
+      !D.isStaticLocal() &&
+      (CGM.getTriple().isAMDGPU() || CGM.getTriple().isNVPTX()))
----------------
jhuber6 wrote:

Yeah, these types of things are problematic especially if we consider getting 
SPIR-V support eventually. The logic basically goes like this. OpenMP supports 
global destructors but does not always support the `atexit` function. The old 
logic used to replace everything. This now at least lets CPU based targets use 
regular handling. I could make this unconditional for OpenMP, but I figured 
it'd be better to allow the CPU based targets to use the regular handling.

More or less this is just a concession to prevent regressions from this patch. 
The old logic looked like this, which did this unconditionally. Like I said, 
could remove the AMD and PTX checks and just do this on the CPU as well if it 
would be better.
```c++
  if (CGM.getLangOpts().OMPTargetTriples.empty() &&
      !CGM.getLangOpts().OpenMPIsTargetDevice)
    return false;
```

https://github.com/llvm/llvm-project/pull/71739
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to