blob: 2fa6bb7afe152f6e9415d5a394effc39bc641a7f [file] [log] [blame]
Artem Belevich94a55e82015-09-22 17:22:59 +00001// REQUIRES: x86-registered-target
2// REQUIRES: nvptx-registered-target
3
Justin Lebare5eed042016-03-23 22:42:30 +00004// Make sure we handle target overloads correctly. Most of this is checked in
5// sema, but special functions like constructors and destructors are here.
6//
Artem Belevich94a55e82015-09-22 17:22:59 +00007// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu \
8// RUN: -fcuda-target-overloads -emit-llvm -o - %s \
9// RUN: | FileCheck -check-prefix=CHECK-BOTH -check-prefix=CHECK-HOST %s
10// RUN: %clang_cc1 -triple nvptx64-nvidia-cuda -fcuda-is-device \
11// RUN: -fcuda-target-overloads -emit-llvm -o - %s \
Artem Belevich18609102016-02-12 18:29:18 +000012// RUN: | FileCheck -check-prefix=CHECK-BOTH -check-prefix=CHECK-DEVICE \
13// RUN: -check-prefix=CHECK-DEVICE-STRICT %s
Artem Belevich94a55e82015-09-22 17:22:59 +000014
15// Check target overloads handling with disabled call target checks.
16// RUN: %clang_cc1 -DNOCHECKS -triple x86_64-unknown-linux-gnu -emit-llvm \
17// RUN: -fcuda-disable-target-call-checks -fcuda-target-overloads -o - %s \
18// RUN: | FileCheck -check-prefix=CHECK-BOTH -check-prefix=CHECK-HOST \
19// RUN: -check-prefix=CHECK-BOTH-NC -check-prefix=CHECK-HOST-NC %s
20// RUN: %clang_cc1 -DNOCHECKS -triple nvptx64-nvidia-cuda -emit-llvm \
21// RUN: -fcuda-disable-target-call-checks -fcuda-target-overloads \
22// RUN: -fcuda-is-device -o - %s \
23// RUN: | FileCheck -check-prefix=CHECK-BOTH -check-prefix=CHECK-DEVICE \
24// RUN: -check-prefix=CHECK-BOTH-NC -check-prefix=CHECK-DEVICE-NC %s
25
26#include "Inputs/cuda.h"
27
Artem Belevich94a55e82015-09-22 17:22:59 +000028// Check constructors/destructors for D/H functions
Justin Lebare5eed042016-03-23 22:42:30 +000029int x;
Artem Belevich94a55e82015-09-22 17:22:59 +000030struct s_cd_dh {
31 __host__ s_cd_dh() { x = 11; }
32 __device__ s_cd_dh() { x = 12; }
33 __host__ ~s_cd_dh() { x = 21; }
34 __device__ ~s_cd_dh() { x = 22; }
35};
36
37struct s_cd_hd {
38 __host__ __device__ s_cd_hd() { x = 31; }
39 __host__ __device__ ~s_cd_hd() { x = 32; }
40};
41
42// CHECK-BOTH: define void @_Z7wrapperv
43#if defined(__CUDA_ARCH__)
44__device__
45#else
46__host__
47#endif
48void wrapper() {
49 s_cd_dh scddh;
50 // CHECK-BOTH: call void @_ZN7s_cd_dhC1Ev(
51 s_cd_hd scdhd;
52 // CHECK-BOTH: call void @_ZN7s_cd_hdC1Ev
53
54 // CHECK-BOTH: call void @_ZN7s_cd_hdD1Ev(
55 // CHECK-BOTH: call void @_ZN7s_cd_dhD1Ev(
56}
57// CHECK-BOTH: ret void
58
59// Now it's time to check what's been generated for the methods we used.
60
61// CHECK-BOTH: define linkonce_odr void @_ZN7s_cd_dhC2Ev(
62// CHECK-HOST: store i32 11,
63// CHECK-DEVICE: store i32 12,
64// CHECK-BOTH: ret void
65
66// CHECK-BOTH: define linkonce_odr void @_ZN7s_cd_hdC2Ev(
67// CHECK-BOTH: store i32 31,
68// CHECK-BOTH: ret void
69
70// CHECK-BOTH: define linkonce_odr void @_ZN7s_cd_hdD2Ev(
71// CHECK-BOTH: store i32 32,
72// CHECK-BOTH: ret void
73
74// CHECK-BOTH: define linkonce_odr void @_ZN7s_cd_dhD2Ev(
75// CHECK-HOST: store i32 21,
76// CHECK-DEVICE: store i32 22,
77// CHECK-BOTH: ret void