Index: lib/IR/Verifier.cpp =================================================================== --- lib/IR/Verifier.cpp +++ lib/IR/Verifier.cpp @@ -2006,6 +2006,20 @@ default: case CallingConv::C: break; + case CallingConv::AMDGPU_KERNEL: + case CallingConv::SPIR_KERNEL: + Assert(F.getReturnType()->isVoidTy(), + "Calling convention requires void return type", &F); + LLVM_FALLTHROUGH; + + case CallingConv::AMDGPU_VS: + case CallingConv::AMDGPU_GS: + case CallingConv::AMDGPU_PS: + case CallingConv::AMDGPU_CS: + Assert(!F.hasStructRetAttr(), + "Calling convention does not allow sret", &F); + + LLVM_FALLTHROUGH; case CallingConv::Fast: case CallingConv::Cold: case CallingConv::Intel_OCL_BI: Index: test/Verifier/amdgpu-cc.ll =================================================================== --- /dev/null +++ test/Verifier/amdgpu-cc.ll @@ -0,0 +1,55 @@ +; RUN: not llvm-as < %s 2>&1 | FileCheck %s + +; CHECK: Calling convention requires void return type +; CHECK-NEXT: i32 ()* @nonvoid_cc_amdgpu_kernel +define amdgpu_kernel i32 @nonvoid_cc_amdgpu_kernel() { + ret i32 0 +} + +; CHECK: Calling convention does not support varargs or perfect forwarding! +; CHECK-NEXT: void (...)* @varargs_amdgpu_kernel +define amdgpu_kernel void @varargs_amdgpu_kernel(...) { + ret void +} + +; CHECK: Calling convention does not allow sret +; CHECK-NEXT: void (i32*)* @sret_cc_amdgpu_kernel +define amdgpu_kernel void @sret_cc_amdgpu_kernel(i32* sret %ptr) { + ret void +} + +; CHECK: Calling convention does not support varargs or perfect forwarding! +; CHECK-NEXT: void (...)* @varargs_amdgpu_vs +define amdgpu_vs void @varargs_amdgpu_vs(...) { + ret void +} + +; CHECK: Calling convention does not support varargs or perfect forwarding! +; CHECK-NEXT: void (...)* @varargs_amdgpu_gs +define amdgpu_gs void @varargs_amdgpu_gs(...) { + ret void +} + +; CHECK: Calling convention does not support varargs or perfect forwarding! +; CHECK-NEXT: void (...)* @varargs_amdgpu_ps +define amdgpu_ps void @varargs_amdgpu_ps(...) { + ret void +} + +; CHECK: Calling convention does not support varargs or perfect forwarding! +; CHECK-NEXT: void (...)* @varargs_amdgpu_cs +define amdgpu_cs void @varargs_amdgpu_cs(...) { + ret void +} + +; CHECK: Calling convention requires void return type +; CHECK-NEXT: i32 ()* @nonvoid_cc_spir_kernel +define spir_kernel i32 @nonvoid_cc_spir_kernel() { + ret i32 0 +} + +; CHECK: Calling convention does not support varargs or perfect forwarding! +; CHECK-NEXT: void (...)* @varargs_spir_kernel +define spir_kernel void @varargs_spir_kernel(...) { + ret void +}