1 // Tests CUDA compilation pipeline construction in Driver.
2 // REQUIRES: clang-driver
3 // REQUIRES: x86-registered-target
4 // REQUIRES: nvptx-registered-target
5 
6 // Simple compilation case:
7 // RUN: %clang -### -target x86_64-linux-gnu -c %s 2>&1 \
8 // Compile device-side to PTX assembly and make sure we use it on the host side.
9 // RUN:   | FileCheck -check-prefix CUDA-D1 -check-prefix CUDA-D1NS\
10 // Then compile host side and incorporate device code.
11 // RUN:   -check-prefix CUDA-H -check-prefix CUDA-H-I1 \
12 // Make sure we don't link anything.
13 // RUN:   -check-prefix CUDA-NL %s
14 
15 // Typical compilation + link case:
16 // RUN: %clang -### -target x86_64-linux-gnu %s 2>&1 \
17 // Compile device-side to PTX assembly and make sure we use it on the host side
18 // RUN:   | FileCheck -check-prefix CUDA-D1 -check-prefix CUDA-D1NS\
19 // Then compile host side and incorporate device code.
20 // RUN:   -check-prefix CUDA-H -check-prefix CUDA-H-I1 \
21 // Then link things.
22 // RUN:   -check-prefix CUDA-L %s
23 
24 // Verify that --cuda-host-only disables device-side compilation and linking
25 // RUN: %clang -### -target x86_64-linux-gnu --cuda-host-only %s 2>&1 \
26 // Make sure we didn't run device-side compilation.
27 // RUN:   | FileCheck -check-prefix CUDA-ND \
28 // Then compile host side and make sure we don't attempt to incorporate GPU code.
29 // RUN:    -check-prefix CUDA-H -check-prefix CUDA-H-NI \
30 // Linking is allowed to happen, even if we're missing GPU code.
31 // RUN:    -check-prefix CUDA-L %s
32 
33 // Same test as above, but with preceeding --cuda-device-only to make
34 // sure only last option has effect.
35 // RUN: %clang -### -target x86_64-linux-gnu --cuda-device-only --cuda-host-only %s 2>&1 \
36 // Make sure we didn't run device-side compilation.
37 // RUN:   | FileCheck -check-prefix CUDA-ND \
38 // Then compile host side and make sure we don't attempt to incorporate GPU code.
39 // RUN:    -check-prefix CUDA-H -check-prefix CUDA-H-NI \
40 // Linking is allowed to happen, even if we're missing GPU code.
41 // RUN:    -check-prefix CUDA-L %s
42 
43 // Verify that --cuda-device-only disables host-side compilation and linking
44 // RUN: %clang -### -target x86_64-linux-gnu --cuda-device-only %s 2>&1 \
45 // Compile device-side to PTX assembly
46 // RUN:   | FileCheck -check-prefix CUDA-D1 -check-prefix CUDA-D1NS\
47 // Make sure there are no host cmpilation or linking.
48 // RUN:   -check-prefix CUDA-NH -check-prefix CUDA-NL %s
49 
50 // Same test as above, but with preceeding --cuda-host-only to make
51 // sure only last option has effect.
52 // RUN: %clang -### -target x86_64-linux-gnu --cuda-host-only --cuda-device-only %s 2>&1 \
53 // Compile device-side to PTX assembly
54 // RUN:   | FileCheck -check-prefix CUDA-D1 -check-prefix CUDA-D1NS\
55 // Make sure there are no host cmpilation or linking.
56 // RUN:   -check-prefix CUDA-NH -check-prefix CUDA-NL %s
57 
58 // Verify that with -S we compile host and device sides to assembly
59 // and incorporate device code on the host side.
60 // RUN: %clang -### -target x86_64-linux-gnu -S -c %s 2>&1 \
61 // Compile device-side to PTX assembly
62 // RUN:   | FileCheck -check-prefix CUDA-D1 -check-prefix CUDA-D1NS\
63 // Then compile host side and incorporate GPU code.
64 // RUN:  -check-prefix CUDA-H -check-prefix CUDA-H-I1 \
65 // Make sure we don't link anything.
66 // RUN:  -check-prefix CUDA-NL %s
67 
68 // Verify that --cuda-gpu-arch option passes correct GPU
69 // archtecture info to device compilation.
70 // RUN: %clang -### -target x86_64-linux-gnu --cuda-gpu-arch=sm_35 -c %s 2>&1 \
71 // Compile device-side to PTX assembly.
72 // RUN:   | FileCheck -check-prefix CUDA-D1 -check-prefix CUDA-D1NS \
73 // RUN:   -check-prefix CUDA-D1-SM35 \
74 // Then compile host side and incorporate GPU code.
75 // RUN:   -check-prefix CUDA-H -check-prefix CUDA-H-I1 \
76 // Make sure we don't link anything.
77 // RUN:   -check-prefix CUDA-NL %s
78 
79 // Verify that there is device-side compilation per --cuda-gpu-arch args
80 // and that all results are included on the host side.
81 // RUN: %clang -### -target x86_64-linux-gnu \
82 // RUN:        --cuda-gpu-arch=sm_35 --cuda-gpu-arch=sm_30 -c %s 2>&1 \
83 // Compile both device-sides to PTX assembly
84 // RUN:   | FileCheck \
85 // RUN: -check-prefix CUDA-D1 -check-prefix CUDA-D1NS -check-prefix CUDA-D1-SM35 \
86 // RUN: -check-prefix CUDA-D2 -check-prefix CUDA-D2-SM30 \
87 // Then compile host side and incorporate both device-side outputs
88 // RUN:   -check-prefix CUDA-H -check-prefix CUDA-HNS \
89 // RUN:   -check-prefix CUDA-H-I1 -check-prefix CUDA-H-I2 \
90 // Make sure we don't link anything.
91 // RUN:   -check-prefix CUDA-NL %s
92 
93 // Verify that device-side results are passed to correct tool when
94 // -save-temps is used
95 // RUN: %clang -### -target x86_64-linux-gnu -save-temps -c %s 2>&1 \
96 // Compile device-side to PTX assembly and make sure we use it on the host side.
97 // RUN:   | FileCheck -check-prefix CUDA-D1 -check-prefix CUDA-D1S \
98 // Then compile host side and incorporate device code.
99 // RUN:   -check-prefix CUDA-H -check-prefix CUDA-HS -check-prefix CUDA-HS-I1 \
100 // Make sure we don't link anything.
101 // RUN:   -check-prefix CUDA-NL %s
102 
103 // Verify that device-side results are passed to correct tool when
104 // -fno-integrated-as is used
105 // RUN: %clang -### -target x86_64-linux-gnu -fno-integrated-as -c %s 2>&1 \
106 // Compile device-side to PTX assembly and make sure we use it on the host side.
107 // RUN:   | FileCheck -check-prefix CUDA-D1 -check-prefix CUDA-D1NS \
108 // Then compile host side and incorporate device code.
109 // RUN:   -check-prefix CUDA-H -check-prefix CUDA-HNS -check-prefix CUDA-HS-I1 \
110 // RUN:   -check-prefix CUDA-H-AS \
111 // Make sure we don't link anything.
112 // RUN:   -check-prefix CUDA-NL %s
113 
114 // --cuda-host-only should never trigger unused arg warning.
115 // RUN: %clang -### -target x86_64-linux-gnu --cuda-host-only -c %s 2>&1 | \
116 // RUN:    FileCheck -check-prefix CUDA-NO-UNUSED-CHO %s
117 // RUN: %clang -### -target x86_64-linux-gnu --cuda-host-only -x c -c %s 2>&1 | \
118 // RUN:    FileCheck -check-prefix CUDA-NO-UNUSED-CHO %s
119 
120 // --cuda-device-only should not produce warning compiling CUDA files
121 // RUN: %clang -### -target x86_64-linux-gnu --cuda-device-only -c %s 2>&1 | \
122 // RUN:    FileCheck -check-prefix CUDA-NO-UNUSED-CDO %s
123 
124 // --cuda-device-only should warn during non-CUDA compilation.
125 // RUN: %clang -### -target x86_64-linux-gnu --cuda-device-only -x c -c %s 2>&1 | \
126 // RUN:    FileCheck -check-prefix CUDA-UNUSED-CDO %s
127 
128 // Match device-side preprocessor, and compiler phases with -save-temps
129 // CUDA-D1S: "-cc1" "-triple" "nvptx64-nvidia-cuda"
130 // CUDA-D1S-SAME: "-aux-triple" "x86_64--linux-gnu"
131 // CUDA-D1S-SAME: "-fcuda-is-device"
132 // CUDA-D1S-SAME: "-x" "cuda"
133 
134 // CUDA-D1S: "-cc1" "-triple" "nvptx64-nvidia-cuda"
135 // CUDA-D1S-SAME: "-aux-triple" "x86_64--linux-gnu"
136 // CUDA-D1S-SAME: "-fcuda-is-device"
137 // CUDA-D1S-SAME: "-x" "cuda-cpp-output"
138 
139 // Match the job that produces PTX assembly
140 // CUDA-D1: "-cc1" "-triple" "nvptx64-nvidia-cuda"
141 // CUDA-D1NS-SAME: "-aux-triple" "x86_64--linux-gnu"
142 // CUDA-D1-SAME: "-fcuda-is-device"
143 // CUDA-D1-SM35-SAME: "-target-cpu" "sm_35"
144 // CUDA-D1-SAME: "-o" "[[GPUBINARY1:[^"]*]]"
145 // CUDA-D1NS-SAME: "-x" "cuda"
146 // CUDA-D1S-SAME: "-x" "ir"
147 
148 // Match another device-side compilation
149 // CUDA-D2: "-cc1" "-triple" "nvptx64-nvidia-cuda"
150 // CUDA-D2-SAME: "-aux-triple" "x86_64--linux-gnu"
151 // CUDA-D2-SAME: "-fcuda-is-device"
152 // CUDA-D2-SM30-SAME: "-target-cpu" "sm_30"
153 // CUDA-D2-SAME: "-o" "[[GPUBINARY2:[^"]*]]"
154 // CUDA-D2-SAME: "-x" "cuda"
155 
156 // Match no device-side compilation
157 // CUDA-ND-NOT: "-cc1" "-triple" "nvptx64-nvidia-cuda"
158 // CUDA-ND-SAME-NOT: "-fcuda-is-device"
159 
160 // Match host-side preprocessor job with -save-temps
161 // CUDA-HS: "-cc1" "-triple" "x86_64--linux-gnu"
162 // CUDA-HS-SAME: "-aux-triple" "nvptx64-nvidia-cuda"
163 // CUDA-HS-SAME-NOT: "-fcuda-is-device"
164 // CUDA-HS-SAME: "-x" "cuda"
165 
166 // Match host-side compilation
167 // CUDA-H: "-cc1" "-triple" "x86_64--linux-gnu"
168 // CUDA-H-SAME: "-aux-triple" "nvptx64-nvidia-cuda"
169 // CUDA-H-SAME-NOT: "-fcuda-is-device"
170 // CUDA-H-SAME: "-o" "[[HOSTOUTPUT:[^"]*]]"
171 // CUDA-HNS-SAME: "-x" "cuda"
172 // CUDA-HS-SAME: "-x" "cuda-cpp-output"
173 // CUDA-H-I1-SAME: "-fcuda-include-gpubinary" "[[GPUBINARY1]]"
174 // CUDA-H-I2-SAME: "-fcuda-include-gpubinary" "[[GPUBINARY2]]"
175 
176 // Match external assembler that uses compilation output
177 // CUDA-H-AS: "-o" "{{.*}}.o" "[[HOSTOUTPUT]]"
178 
179 // Match no GPU code inclusion.
180 // CUDA-H-NI-NOT: "-fcuda-include-gpubinary"
181 
182 // Match no CUDA compilation
183 // CUDA-NH-NOT: "-cc1" "-triple"
184 // CUDA-NH-SAME-NOT: "-x" "cuda"
185 
186 // Match linker
187 // CUDA-L: "{{.*}}{{ld|link}}{{(.exe)?}}"
188 // CUDA-L-SAME: "[[HOSTOUTPUT]]"
189 
190 // Match no linker
191 // CUDA-NL-NOT: "{{.*}}{{ld|link}}{{(.exe)?}}"
192 
193 // CUDA-NO-UNUSED-CHO-NOT: warning: argument unused during compilation: '--cuda-host-only'
194 // CUDA-UNUSED-CDO: warning: argument unused during compilation: '--cuda-device-only'
195 // CUDA-NO-UNUSED-CDO-NOT: warning: argument unused during compilation: '--cuda-device-only'
196