diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index ef75ff04320f6..70e849d37986a 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -11387,6 +11387,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; diff --git a/clang/test/Driver/sycl-post-link-options.cpp b/clang/test/Driver/sycl-post-link-options.cpp index 52cf4827c3b34..3994060805469 100644 --- a/clang/test/Driver/sycl-post-link-options.cpp +++ b/clang/test/Driver/sycl-post-link-options.cpp @@ -29,3 +29,62 @@ // 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 +// RUN: %clang_cl %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 +// RUN: %clang_cl %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