Skip to content

Commit dc410f9

Browse files
authored
[Clang][Driver] Fix --save-temps for OpenCL AoT compilation (#78333)
We can directly call `clang -c -x cl -target amdgcn -mcpu=gfx90a test.cl -o test.o` to compile an OpenCL kernel file. However, when `--save-temps` is enabled, it doesn't work because the preprocessed file (`.i` file) is taken as C source file when it is fed to the front end, thus causing compilation error because those OpenCL keywords can't be recognized. This patch fixes the issue.
1 parent 729657d commit dc410f9

File tree

3 files changed

+26
-3
lines changed

3 files changed

+26
-3
lines changed

clang/include/clang/Driver/Types.def

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,10 @@
3737
// C family source language (with and without preprocessing).
3838
TYPE("cpp-output", PP_C, INVALID, "i", phases::Compile, phases::Backend, phases::Assemble, phases::Link)
3939
TYPE("c", C, PP_C, "c", phases::Preprocess, phases::Compile, phases::Backend, phases::Assemble, phases::Link)
40-
TYPE("cl", CL, PP_C, "cl", phases::Preprocess, phases::Compile, phases::Backend, phases::Assemble, phases::Link)
41-
TYPE("clcpp", CLCXX, PP_CXX, "clcpp", phases::Preprocess, phases::Compile, phases::Backend, phases::Assemble, phases::Link)
40+
TYPE("cl", CL, PP_CL, "cl", phases::Preprocess, phases::Compile, phases::Backend, phases::Assemble, phases::Link)
41+
TYPE("cl-cpp-output", PP_CL, INVALID, "cli", phases::Compile, phases::Backend, phases::Assemble, phases::Link)
42+
TYPE("clcpp", CLCXX, PP_CLCXX, "clcpp", phases::Preprocess, phases::Compile, phases::Backend, phases::Assemble, phases::Link)
43+
TYPE("clcpp-cpp-output", PP_CLCXX, INVALID, "clii", phases::Compile, phases::Backend, phases::Assemble, phases::Link)
4244
TYPE("cuda-cpp-output", PP_CUDA, INVALID, "cui", phases::Compile, phases::Backend, phases::Assemble, phases::Link)
4345
TYPE("cuda", CUDA, PP_CUDA, "cu", phases::Preprocess, phases::Compile, phases::Backend, phases::Assemble, phases::Link)
4446
TYPE("cuda", CUDA_DEVICE, PP_CUDA, "cu", phases::Preprocess, phases::Compile, phases::Backend, phases::Assemble, phases::Link)

clang/lib/Driver/Types.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ bool types::isAcceptedByClang(ID Id) {
133133

134134
case TY_Asm:
135135
case TY_C: case TY_PP_C:
136-
case TY_CL: case TY_CLCXX:
136+
case TY_CL: case TY_PP_CL: case TY_CLCXX: case TY_PP_CLCXX:
137137
case TY_CUDA: case TY_PP_CUDA:
138138
case TY_CUDA_DEVICE:
139139
case TY_HIP:
@@ -181,7 +181,9 @@ bool types::isDerivedFromC(ID Id) {
181181
case TY_PP_C:
182182
case TY_C:
183183
case TY_CL:
184+
case TY_PP_CL:
184185
case TY_CLCXX:
186+
case TY_PP_CLCXX:
185187
case TY_PP_CUDA:
186188
case TY_CUDA:
187189
case TY_CUDA_DEVICE:
@@ -241,6 +243,7 @@ bool types::isCXX(ID Id) {
241243
case TY_PP_CXXHeaderUnit:
242244
case TY_ObjCXXHeader: case TY_PP_ObjCXXHeader:
243245
case TY_CXXModule: case TY_PP_CXXModule:
246+
case TY_PP_CLCXX:
244247
case TY_CUDA: case TY_PP_CUDA: case TY_CUDA_DEVICE:
245248
case TY_HIP:
246249
case TY_PP_HIP:
@@ -310,7 +313,9 @@ types::ID types::lookupTypeForExtension(llvm::StringRef Ext) {
310313
.Case("cc", TY_CXX)
311314
.Case("CC", TY_CXX)
312315
.Case("cl", TY_CL)
316+
.Case("cli", TY_PP_CL)
313317
.Case("clcpp", TY_CLCXX)
318+
.Case("clii", TY_PP_CLCXX)
314319
.Case("cp", TY_CXX)
315320
.Case("cu", TY_CUDA)
316321
.Case("hh", TY_CXXHeader)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// RUN: %clang -x cl --save-temps -c -### %s 2>&1 | FileCheck %s
2+
// RUN: %clang -x cl -ccc-print-phases -c %s 2>&1 | FileCheck %s -check-prefix=CHECK-PHASES
3+
4+
// CHECK: "-o" "[[CLI_NAME:.+]].cli" "-x" "cl"
5+
// CHECK-NEXT: "-o" "[[CLI_NAME]].bc" "-x" "cl-cpp-output"{{.*}}"[[CLI_NAME:.+]].cli"
6+
7+
// CHECK-PHASES: 0: input, {{.*}}, cl
8+
// CHECK-PHASES: 1: preprocessor, {0}, cl-cpp-output
9+
// CHECK-PHASES: 2: compiler, {1}, ir
10+
11+
uint3 add(uint3 a, uint3 b) {
12+
ulong x = a.x + (ulong)b.x;
13+
ulong y = a.y + (ulong)b.y + (x >> 32);
14+
uint z = a.z + b.z + (y >> 32);
15+
return (uint3)(x, y, z);
16+
}

0 commit comments

Comments
 (0)