Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions clang/lib/Driver/ToolChains/Clang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11341,6 +11341,23 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back(
Args.MakeArgString("--sycl-post-link-options=" + PostLinkOptString));

if (Args.hasArg(options::OPT_fsycl_remove_unused_external_funcs))
CmdArgs.push_back(
Args.MakeArgString("-sycl-remove-unused-external-funcs"));
if (Args.hasArg(options::OPT_fno_sycl_remove_unused_external_funcs))
CmdArgs.push_back(
Args.MakeArgString("-no-sycl-remove-unused-external-funcs"));
if (Args.hasArg(options::OPT_fsycl_device_code_split_esimd))
CmdArgs.push_back(Args.MakeArgString("-sycl-device-code-split-esimd"));
if (Args.hasArg(options::OPT_fno_sycl_device_code_split_esimd))
CmdArgs.push_back(Args.MakeArgString("-no-sycl-device-code-split-esimd"));
if (Args.hasArg(options::OPT_fsycl_add_default_spec_consts_image))
CmdArgs.push_back(
Args.MakeArgString("-sycl-add-default-spec-consts-image"));
if (Args.hasArg(options::OPT_fno_sycl_add_default_spec_consts_image))
CmdArgs.push_back(
Args.MakeArgString("-no-sycl-add-default-spec-consts-image"));

// --llvm-spirv-options="options" provides a string of options to be passed
// along to the llvm-spirv (translation) step during device link.
SmallString<128> OptString;
Expand Down
49 changes: 49 additions & 0 deletions clang/test/Driver/sycl-post-link-options.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,52 @@
// RUN: --sycl-post-link-options="-O2 -device-globals -O0" \
// RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck --check-prefix OPTIONS_POSTLINK_JIT_NEW_SYCLBIN %s
// 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
//
// Ensure driver forwards these triple based options to clang-linker-wrapper.
//
// RUN: %clangxx %s -### -fsycl --offload-new-driver \
// RUN: -fsycl-remove-unused-external-funcs \
// RUN: -fsycl-device-code-split-esimd \
// RUN: -fsycl-add-default-spec-consts-image \
// RUN: 2>&1 | FileCheck --check-prefix=OPTIONS_FORWARD %s
// OPTIONS_FORWARD: clang-linker-wrapper{{.*}} "-sycl-remove-unused-external-funcs" "-sycl-device-code-split-esimd" "-sycl-add-default-spec-consts-image"
//
// RUN: %clangxx %s -### -fsycl --offload-new-driver \
// RUN: -fno-sycl-remove-unused-external-funcs \
// RUN: -fno-sycl-device-code-split-esimd \
// RUN: -fno-sycl-add-default-spec-consts-image \
// RUN: 2>&1 | FileCheck --check-prefix=OPTIONS_FORWARD_NO %s
// 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"
//
// Check -no-sycl-remove-unused-external-funcs option disables emitting
// -emit-only-kernels-as-entry-points in sycl-post-link.
// RUN: clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu \
// RUN: -sycl-device-libraries=%t.devicelib.o \
// RUN: -no-sycl-remove-unused-external-funcs \
// RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck --check-prefix OPTIONS_NO_EMIT_ONLY_KERNELS %s
// 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
//
// Check -no-sycl-device-code-split-esimd option disables emitting
// -split-esimd in sycl-post-link.
// RUN: clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu \
// RUN: -sycl-device-libraries=%t.devicelib.o \
// RUN: -no-sycl-device-code-split-esimd \
// RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck --check-prefix OPTIONS_NO_SPLIT_ESIMD %s
// 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
//
// Generate AOT .o file as linker wrapper input.
//
// RUN: %clang %s -fsycl -fsycl-targets=spir64_gen-unknown-unknown -c --offload-new-driver -o %t_aot.o
//
// Generate AOT .o file as SYCL device library file.
//
// RUN: touch %t.devicelib.cpp
// RUN: %clang %t.devicelib.cpp -fsycl -fsycl-targets=spir64_gen-unknown-unknown -c --offload-new-driver -o %t.devicelib_aot.o
//
// Check -sycl-add-default-spec-consts-image option enables emitting
// -generate-device-image-default-spec-consts in sycl-post-link.
// RUN: clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu \
// RUN: -sycl-device-libraries=%t.devicelib_aot.o \
// RUN: -sycl-add-default-spec-consts-image \
// RUN: --linker-path=/usr/bin/ld %t_aot.o -o a.out 2>&1 | FileCheck --check-prefix OPTIONS_DEFAULT_SPEC_CONSTS %s
// 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