Skip to content

Commit 54e7f77

Browse files
author
Justin Cai
authored
[SYCL] Forward some triple dependent options to clang-linker-wrapper in new offloading model (#19994)
The options `-f[no]sycl-remove-unused-external-funcs`, `-f[no]sycl-device-code-split-esimd`, and `-f[no]sycl-add-default-spec-consts-image` were not being processed by the driver in the new offloading model. These were "triple dependent" options, and due to the new model they need to be processed `clang-linker-wrapper`. This PR makes sure the driver forwards these options to the corresponding option for `clang-linker-wrapper`.
1 parent 9d75ffa commit 54e7f77

2 files changed

Lines changed: 76 additions & 0 deletions

File tree

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11387,6 +11387,23 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA,
1138711387
CmdArgs.push_back(
1138811388
Args.MakeArgString("--sycl-post-link-options=" + PostLinkOptString));
1138911389

11390+
if (Args.hasArg(options::OPT_fsycl_remove_unused_external_funcs))
11391+
CmdArgs.push_back(
11392+
Args.MakeArgString("-sycl-remove-unused-external-funcs"));
11393+
if (Args.hasArg(options::OPT_fno_sycl_remove_unused_external_funcs))
11394+
CmdArgs.push_back(
11395+
Args.MakeArgString("-no-sycl-remove-unused-external-funcs"));
11396+
if (Args.hasArg(options::OPT_fsycl_device_code_split_esimd))
11397+
CmdArgs.push_back(Args.MakeArgString("-sycl-device-code-split-esimd"));
11398+
if (Args.hasArg(options::OPT_fno_sycl_device_code_split_esimd))
11399+
CmdArgs.push_back(Args.MakeArgString("-no-sycl-device-code-split-esimd"));
11400+
if (Args.hasArg(options::OPT_fsycl_add_default_spec_consts_image))
11401+
CmdArgs.push_back(
11402+
Args.MakeArgString("-sycl-add-default-spec-consts-image"));
11403+
if (Args.hasArg(options::OPT_fno_sycl_add_default_spec_consts_image))
11404+
CmdArgs.push_back(
11405+
Args.MakeArgString("-no-sycl-add-default-spec-consts-image"));
11406+
1139011407
// --llvm-spirv-options="options" provides a string of options to be passed
1139111408
// along to the llvm-spirv (translation) step during device link.
1139211409
SmallString<128> OptString;

clang/test/Driver/sycl-post-link-options.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,62 @@
2929
// RUN: --sycl-post-link-options="-O2 -device-globals -O0" \
3030
// RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck --check-prefix OPTIONS_POSTLINK_JIT_NEW_SYCLBIN %s
3131
// OPTIONS_POSTLINK_JIT_NEW_SYCLBIN: sycl-post-link{{.*}} -spec-const=native -properties -split=auto -emit-only-kernels-as-entry-points -emit-param-info -symbols -emit-kernel-names -emit-exported-symbols -emit-imported-symbols -split-esimd -lower-esimd -O2 -device-globals -O0
32+
//
33+
// Ensure driver forwards these triple based options to clang-linker-wrapper.
34+
//
35+
// RUN: %clangxx %s -### -fsycl --offload-new-driver \
36+
// RUN: -fsycl-remove-unused-external-funcs \
37+
// RUN: -fsycl-device-code-split-esimd \
38+
// RUN: -fsycl-add-default-spec-consts-image \
39+
// RUN: 2>&1 | FileCheck --check-prefix=OPTIONS_FORWARD %s
40+
// RUN: %clang_cl %s -### -fsycl --offload-new-driver \
41+
// RUN: -fsycl-remove-unused-external-funcs \
42+
// RUN: -fsycl-device-code-split-esimd \
43+
// RUN: -fsycl-add-default-spec-consts-image \
44+
// RUN: 2>&1 | FileCheck --check-prefix=OPTIONS_FORWARD %s
45+
// OPTIONS_FORWARD: clang-linker-wrapper{{.*}} "-sycl-remove-unused-external-funcs" "-sycl-device-code-split-esimd" "-sycl-add-default-spec-consts-image"
46+
//
47+
// RUN: %clangxx %s -### -fsycl --offload-new-driver \
48+
// RUN: -fno-sycl-remove-unused-external-funcs \
49+
// RUN: -fno-sycl-device-code-split-esimd \
50+
// RUN: -fno-sycl-add-default-spec-consts-image \
51+
// RUN: 2>&1 | FileCheck --check-prefix=OPTIONS_FORWARD_NO %s
52+
// RUN: %clang_cl %s -### -fsycl --offload-new-driver \
53+
// RUN: -fno-sycl-remove-unused-external-funcs \
54+
// RUN: -fno-sycl-device-code-split-esimd \
55+
// RUN: -fno-sycl-add-default-spec-consts-image \
56+
// RUN: 2>&1 | FileCheck --check-prefix=OPTIONS_FORWARD_NO %s
57+
// OPTIONS_FORWARD_NO: clang-linker-wrapper{{.*}} "-no-sycl-remove-unused-external-funcs" "-no-sycl-device-code-split-esimd" "-no-sycl-add-default-spec-consts-image"
58+
//
59+
// Check -no-sycl-remove-unused-external-funcs option disables emitting
60+
// -emit-only-kernels-as-entry-points in sycl-post-link.
61+
// RUN: clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu \
62+
// RUN: -sycl-device-libraries=%t.devicelib.o \
63+
// RUN: -no-sycl-remove-unused-external-funcs \
64+
// RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck --check-prefix OPTIONS_NO_EMIT_ONLY_KERNELS %s
65+
// OPTIONS_NO_EMIT_ONLY_KERNELS: sycl-post-link{{.*}} -spec-const=native -properties -split=auto -emit-param-info -symbols -emit-exported-symbols -emit-imported-symbols -split-esimd -lower-esimd
66+
//
67+
// Check -no-sycl-device-code-split-esimd option disables emitting
68+
// -split-esimd in sycl-post-link.
69+
// RUN: clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu \
70+
// RUN: -sycl-device-libraries=%t.devicelib.o \
71+
// RUN: -no-sycl-device-code-split-esimd \
72+
// RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck --check-prefix OPTIONS_NO_SPLIT_ESIMD %s
73+
// OPTIONS_NO_SPLIT_ESIMD: sycl-post-link{{.*}} -spec-const=native -properties -split=auto -emit-only-kernels-as-entry-points -emit-param-info -symbols -emit-exported-symbols -emit-imported-symbols -lower-esimd
74+
//
75+
// Generate AOT .o file as linker wrapper input.
76+
//
77+
// RUN: %clang %s -fsycl -fsycl-targets=spir64_gen-unknown-unknown -c --offload-new-driver -o %t_aot.o
78+
//
79+
// Generate AOT .o file as SYCL device library file.
80+
//
81+
// RUN: touch %t.devicelib.cpp
82+
// RUN: %clang %t.devicelib.cpp -fsycl -fsycl-targets=spir64_gen-unknown-unknown -c --offload-new-driver -o %t.devicelib_aot.o
83+
//
84+
// Check -sycl-add-default-spec-consts-image option enables emitting
85+
// -generate-device-image-default-spec-consts in sycl-post-link.
86+
// RUN: clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu \
87+
// RUN: -sycl-device-libraries=%t.devicelib_aot.o \
88+
// RUN: -sycl-add-default-spec-consts-image \
89+
// RUN: --linker-path=/usr/bin/ld %t_aot.o -o a.out 2>&1 | FileCheck --check-prefix OPTIONS_DEFAULT_SPEC_CONSTS %s
90+
// OPTIONS_DEFAULT_SPEC_CONSTS: sycl-post-link{{.*}} -spec-const=emulation -properties -split=auto -emit-only-kernels-as-entry-points -emit-param-info -symbols -emit-exported-symbols -emit-imported-symbols -split-esimd -lower-esimd -generate-device-image-default-spec-consts

0 commit comments

Comments
 (0)