From 49da552a23be5af9dfdb875a023190776d750d1d Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Tue, 20 Jun 2023 09:25:36 -0700 Subject: [PATCH 1/2] [Driver][SYCL] Add support for exporting symbols for AOT Add support for -ftarget-export-symbols. This option when used with -fsycl -fsycl-targets=spir64_gen when creating shared libraries. This exposes the exported symbols in the library so they can be available for other modules. --- clang/include/clang/Driver/Options.td | 5 +++++ clang/lib/Driver/ToolChains/SYCL.cpp | 7 +++++-- clang/test/Driver/ftarget-export-symbols.cpp | 16 ++++++++++++++++ sycl/doc/UsersManual.md | 7 +++++++ 4 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 clang/test/Driver/ftarget-export-symbols.cpp diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 4eb31fc50e656..e4674b6a88149 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3131,6 +3131,11 @@ def fsycl_max_parallel_jobs_EQ : Joined<["-"], "fsycl-max-parallel-link-jobs=">, def ftarget_compile_fast : Flag<["-"], "ftarget-compile-fast">, Flags<[CoreOption]>, HelpText<"Experimental feature: Reduce target " "compilation time, with potential runtime performance trade-off.">; +def ftarget_export_symbols : Flag<["-"], "ftarget-export-symbols">, + Flags<[CoreOption]>, HelpText<"Expose exported symbols in a generated " + "target library to allow for visibilty to other modules.">; +def fno_target_export_symbols : Flag<["-"], "fno-target-export-symbols">, + Flags<[CoreOption]>; def : Flag<["-"], "fsycl-rdc">, Flags<[CoreOption]>, Alias; def : Flag<["-"], "fno-sycl-rdc">, Flags<[CoreOption]>, Alias; def fsycl_optimize_non_user_code : Flag<["-"], "fsycl-optimize-non-user-code">, diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index a44e7dc4afe5e..ef04f51776e76 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -992,9 +992,12 @@ void SYCLToolChain::AddImpliedTargetArgs(const llvm::Triple &Triple, CmdArgs.push_back(Args.MakeArgString(DepInfo)); } // -ftarget-compile-fast - if (Args.hasArg(options::OPT_ftarget_compile_fast)) { + if (Args.hasArg(options::OPT_ftarget_compile_fast)) BeArgs.push_back("-igc_opts 'PartitionUnit=1,SubroutineThreshold=50000'"); - } + // -ftarget-export-symbols + if (Args.hasFlag(options::OPT_ftarget_export_symbols, + options::OPT_fno_target_export_symbols, false)) + BeArgs.push_back("-library-compilation"); } if (BeArgs.empty()) return; diff --git a/clang/test/Driver/ftarget-export-symbols.cpp b/clang/test/Driver/ftarget-export-symbols.cpp new file mode 100644 index 0000000000000..dd0015e304c1c --- /dev/null +++ b/clang/test/Driver/ftarget-export-symbols.cpp @@ -0,0 +1,16 @@ +// Test -ftarget-export-symbols behavior + +// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl \ +// RUN: -fsycl-targets=spir64_gen -ftarget-export-symbols %s 2>&1 \ +// RUN: | FileCheck -check-prefix=TARGET_EXPORT %s +// RUN: %clang_cl -### --target=x86_64-pc-windows-msvc -fsycl \ +// RUN: -fsycl-targets=spir64_gen -ftarget-export-symbols %s 2>&1 \ +// RUN: | FileCheck -check-prefix=TARGET_EXPORT %s +// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl \ +// RUN: -fsycl-targets=spir64_gen -ftarget-export-symbols \ +// RUN: -fno-target-export-symbols %s 2>&1 \ +// RUN: | FileCheck -check-prefix=NO_TARGET_EXPORT %s + +// TARGET_EXPORT: ocloc{{.*}} "-output" +// TARGET_EXPORT: "-options" "-library-compilation" +// NO_TARGET_EXPORT-NOT: "-library-compilation" diff --git a/sycl/doc/UsersManual.md b/sycl/doc/UsersManual.md index 9bbf1ddf064b2..7c666a76bcd14 100644 --- a/sycl/doc/UsersManual.md +++ b/sycl/doc/UsersManual.md @@ -410,6 +410,13 @@ and not recommended to use in production environment. Also, some of Intel GPUs or GPU run-time/drivers may support only "stateless" memory accesses. +**`-f[no-]target-export-symbols`** + + Exposes exported symbols in a generated target library to allow for + visibility to other modules. + + NOTE: This flag is only supported for spir64_gen AOT targets. + # Example: SYCL device code compilation To invoke SYCL device compiler set `-fsycl-device-only` flag. From 29a70c72763b0f9537999eb08b78892e428d8b94 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Wed, 21 Jun 2023 15:43:47 -0700 Subject: [PATCH 2/2] Update test to check for unused diagnostic when appropriate --- clang/test/Driver/ftarget-export-symbols.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/clang/test/Driver/ftarget-export-symbols.cpp b/clang/test/Driver/ftarget-export-symbols.cpp index dd0015e304c1c..5f60e2267c31a 100644 --- a/clang/test/Driver/ftarget-export-symbols.cpp +++ b/clang/test/Driver/ftarget-export-symbols.cpp @@ -14,3 +14,16 @@ // TARGET_EXPORT: ocloc{{.*}} "-output" // TARGET_EXPORT: "-options" "-library-compilation" // NO_TARGET_EXPORT-NOT: "-library-compilation" + +// 'unused' for non-spir64_gen targets +// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl \ +// RUN: -fsycl-targets=spir64 -ftarget-export-symbols %s 2>&1 \ +// RUN: | FileCheck -check-prefix=UNUSED %s +// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl \ +// RUN: -fsycl-targets=spir64_x86_64 -ftarget-export-symbols %s 2>&1 \ +// RUN: | FileCheck -check-prefix=UNUSED %s +// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl \ +// RUN: -fsycl-targets=spir64_fpga -ftarget-export-symbols %s 2>&1 \ +// RUN: | FileCheck -check-prefix=UNUSED %s + +// UNUSED: argument unused during compilation: '-ftarget-export-symbols'