Skip to content

Commit

Permalink
[SYCL] Always set NoUnwind attribute for SYCL.
Browse files Browse the repository at this point in the history
Like CUDA and OpenCL, the SYCL specification says that throwing and
catching exceptions in device functions is not supported, so this change
extends the logic for adding the NoUnwind attribute to SYCL.

The existing convergent.cpp test, which tests that the convergent
attribute is added to functions by default, is renamed and reused to
test that the nounwind attribute is added by default. This test now has
-fexceptions added to it, which the driver adds by default as well.

The obvious question here is why not simply change the driver to remove
-fexceptions. This change follows the direction given by the TODO
comment because removing -fexceptions would also disable the
__EXCEPTIONS macro, which should reflect whether exceptions are enabled
on the host, rather than on the device, to avoid conflicts in types
shared between host and device.

Reviewed By: bader

Differential Revision: https://reviews.llvm.org/D147097
  • Loading branch information
hvdijk committed Mar 30, 2023
1 parent 46a384d commit 6b86813
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 22 deletions.
5 changes: 2 additions & 3 deletions clang/lib/CodeGen/CGCall.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1971,10 +1971,9 @@ void CodeGenModule::getDefaultFunctionAttributes(StringRef Name,
}

// TODO: NoUnwind attribute should be added for other GPU modes HIP,
// SYCL, OpenMP offload. AFAIK, none of them support exceptions in device
// code.
// OpenMP offload. AFAIK, neither of them support exceptions in device code.
if ((getLangOpts().CUDA && getLangOpts().CUDAIsDevice) ||
getLangOpts().OpenCL) {
getLangOpts().OpenCL || getLangOpts().SYCLIsDevice) {
FuncAttrs.addAttribute(llvm::Attribute::NoUnwind);
}

Expand Down
19 changes: 0 additions & 19 deletions clang/test/CodeGenSYCL/convergent.cpp

This file was deleted.

26 changes: 26 additions & 0 deletions clang/test/CodeGenSYCL/function-attrs.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// RUN: %clang_cc1 -fsycl-is-device -emit-llvm -disable-llvm-passes \
// RUN: -triple spir64 -fexceptions -emit-llvm %s -o - | FileCheck %s

int foo();

// CHECK: define dso_local spir_func void @_Z3barv() [[BAR:#[0-9]+]]
// CHECK: attributes [[BAR]] =
// CHECK-SAME: convergent
// CHECK-SAME: nounwind
void bar() {
int a = foo();
}

int foo() {
return 1;
}

template <typename Name, typename Func>
__attribute__((sycl_kernel)) void kernel_single_task(const Func &kernelFunc) {
kernelFunc();
}

int main() {
kernel_single_task<class fake_kernel>([] { bar(); });
return 0;
}

0 comments on commit 6b86813

Please sign in to comment.