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 61e6607a336cb..6e1fb7f85cfe4 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -991,9 +991,12 @@ void SYCLToolChain::AddImpliedTargetArgs(const llvm::Triple &Triple, CmdArgs.push_back(Args.MakeArgString(DepInfo)); } // -ftarget-compile-fast AOT - 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"); } else if (Triple.getSubArch() == llvm::Triple::NoSubArch && Triple.isSPIR()) { // -ftarget-compile-fast JIT diff --git a/clang/test/Driver/ftarget-export-symbols.cpp b/clang/test/Driver/ftarget-export-symbols.cpp new file mode 100644 index 0000000000000..5f60e2267c31a --- /dev/null +++ b/clang/test/Driver/ftarget-export-symbols.cpp @@ -0,0 +1,29 @@ +// 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" + +// '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' diff --git a/sycl/doc/UsersManual.md b/sycl/doc/UsersManual.md index 5a327eb8fd261..a6ded70d2f7d8 100644 --- a/sycl/doc/UsersManual.md +++ b/sycl/doc/UsersManual.md @@ -414,6 +414,13 @@ and not recommended to use in production environment. Instructs the target backend to reduce compilation time, potentially at the cost of runtime performance. Currently only supported on Intel GPUs. +**`-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.