xref: /aosp_15_r20/external/clang/test/CodeGenCUDA/device-vtable.cu (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // REQUIRES: x86-registered-target
2*67e74705SXin Li // REQUIRES: nvptx-registered-target
3*67e74705SXin Li 
4*67e74705SXin Li // Make sure we don't emit vtables for classes with methods that have
5*67e74705SXin Li // inappropriate target attributes. Currently it's mostly needed in
6*67e74705SXin Li // order to avoid emitting vtables for host-only classes on device
7*67e74705SXin Li // side where we can't codegen them.
8*67e74705SXin Li 
9*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -o - %s \
10*67e74705SXin Li // RUN:     | FileCheck %s -check-prefix=CHECK-HOST -check-prefix=CHECK-BOTH
11*67e74705SXin Li // RUN: %clang_cc1 -triple nvptx64-nvidia-cuda -fcuda-is-device -emit-llvm -o - %s \
12*67e74705SXin Li // RUN:     | FileCheck %s -check-prefix=CHECK-DEVICE -check-prefix=CHECK-BOTH
13*67e74705SXin Li 
14*67e74705SXin Li #include "Inputs/cuda.h"
15*67e74705SXin Li 
16*67e74705SXin Li struct H  {
17*67e74705SXin Li   virtual void method();
18*67e74705SXin Li };
19*67e74705SXin Li //CHECK-HOST: @_ZTV1H =
20*67e74705SXin Li //CHECK-HOST-SAME: @_ZN1H6methodEv
21*67e74705SXin Li //CHECK-DEVICE-NOT: @_ZTV1H =
22*67e74705SXin Li 
23*67e74705SXin Li struct D  {
24*67e74705SXin Li    __device__ virtual void method();
25*67e74705SXin Li };
26*67e74705SXin Li 
27*67e74705SXin Li //CHECK-DEVICE: @_ZTV1D
28*67e74705SXin Li //CHECK-DEVICE-SAME: @_ZN1D6methodEv
29*67e74705SXin Li //CHECK-HOST-NOT: @_ZTV1D
30*67e74705SXin Li 
31*67e74705SXin Li // This is the case with mixed host and device virtual methods.  It's
32*67e74705SXin Li // impossible to emit a valid vtable in that case because only host or
33*67e74705SXin Li // only device methods would be available during host or device
34*67e74705SXin Li // compilation. At the moment Clang (and NVCC) emit NULL pointers for
35*67e74705SXin Li // unavailable methods,
36*67e74705SXin Li struct HD  {
37*67e74705SXin Li   virtual void h_method();
38*67e74705SXin Li   __device__ virtual void d_method();
39*67e74705SXin Li };
40*67e74705SXin Li // CHECK-BOTH: @_ZTV2HD
41*67e74705SXin Li // CHECK-DEVICE-NOT: @_ZN2HD8h_methodEv
42*67e74705SXin Li // CHECK-DEVICE-SAME: null
43*67e74705SXin Li // CHECK-DEVICE-SAME: @_ZN2HD8d_methodEv
44*67e74705SXin Li // CHECK-HOST-SAME: @_ZN2HD8h_methodEv
45*67e74705SXin Li // CHECK-HOST-NOT: @_ZN2HD8d_methodEv
46*67e74705SXin Li // CHECK-HOST-SAME: null
47*67e74705SXin Li // CHECK-BOTH-SAME: ]
48*67e74705SXin Li 
method()49*67e74705SXin Li void H::method() {}
50*67e74705SXin Li //CHECK-HOST: define void @_ZN1H6methodEv
51*67e74705SXin Li 
method()52*67e74705SXin Li void __device__ D::method() {}
53*67e74705SXin Li //CHECK-DEVICE: define void @_ZN1D6methodEv
54*67e74705SXin Li 
d_method()55*67e74705SXin Li void __device__ HD::d_method() {}
56*67e74705SXin Li // CHECK-DEVICE: define void @_ZN2HD8d_methodEv
57*67e74705SXin Li // CHECK-HOST-NOT: define void @_ZN2HD8d_methodEv
h_method()58*67e74705SXin Li void HD::h_method() {}
59*67e74705SXin Li // CHECK-HOST: define void @_ZN2HD8h_methodEv
60*67e74705SXin Li // CHECK-DEVICE-NOT: define void @_ZN2HD8h_methodEv
61*67e74705SXin Li 
62