Skip to content

Commit bfa0f66

Browse files
authored
[SYCL][NewOffloadModel] add support of -no-sycl-rdc in clang-linker-wrapper (#22118)
1 parent d1dd068 commit bfa0f66

3 files changed

Lines changed: 50 additions & 6 deletions

File tree

clang/test/Driver/clang-linker-wrapper.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,3 +372,18 @@
372372
// RUN: %t.wrong_spirv_subarch.o -o %t.out 2>&1 --linker-path="/usr/bin/ld" | FileCheck %s --check-prefix=CHECK-ERROR-WITH-WRONG-SPIRV-SUBARCH
373373

374374
// CHECK-ERROR-WITH-WRONG-SPIRV-SUBARCH: SYCL device compilation is not supported for the target: spirv64v1.0
375+
376+
// Check -no-sycl-rdc
377+
// RUN: %clang %s -fsycl -fsycl-targets=spir64-unknown-unknown -c --offload-new-driver --no-offloadlib -fno-sycl-instrument-device-code -o %t1.o
378+
// RUN: %clang %s -fsycl -fsycl-targets=spir64-unknown-unknown -c --offload-new-driver --no-offloadlib -fno-sycl-instrument-device-code -o %t2.o
379+
//
380+
// RUN: clang-linker-wrapper "--host-triple=x86_64-unknown-linux-gnu" "--linker-path=/usr/bin/ld" "--" "-o" "a.out" %t1.o t2.o --dry-run 2>&1 | FileCheck -check-prefix=CHECK-RDC %s
381+
// CHECK-RDC: spirv-to-ir-wrapper{{.*}} -o [[FIRSTLLVMLINKIN:.*]].bc --llvm-spirv-opts --spirv-preserve-auxdata --spirv-target-env=SPV-IR --spirv-builtin-format=global
382+
// CHECK-RDC-NEXT: llvm-link{{.*}} --suppress-warnings [[FIRSTLLVMLINKIN]].bc -o [[LLVMLINKOUT:.*]].bc
383+
// CHECK-RDC-NEXT: sycl-post-link{{.*}} -o [[SYCLPOSTLINKOUT:.*]].table [[LLVMLINKOUT]].bc
384+
385+
// RUN: clang-linker-wrapper -no-sycl-rdc "--host-triple=x86_64-unknown-linux-gnu" "--linker-path=/usr/bin/ld" "--" "-o" "a.out" %t1.o %t2.o --dry-run 2>&1 | FileCheck -check-prefix=CHECK-NO-RDC %s
386+
// CHECK-NO-RDC-NOT: llvm-link
387+
// CHECK-NO-RDC: llvm-spirv{{.*}} -o [[FIRST_SPIRV_OUTPUT:.*]].spv
388+
// CHECK-NO-RDC: llvm-spirv{{.*}} -o [[SECOND_SPIRV_OUTPUT:.*]].spv
389+
// CHECK-NO-RDC: offload-wrapper:{{.*}} input: [[FIRST_SPIRV_OUTPUT]].spv, {{.*}} input: [[SECOND_SPIRV_OUTPUT]].spv

clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1981,13 +1981,38 @@ Expected<std::vector<module_split::SplitModule>> runSYCLOffloadingPipeline(
19811981
ArrayRef<StringRef> InputModules, const ArgList &LinkerArgs,
19821982
const std::pair<std::string, std::string> &CompileLinkOptions,
19831983
function_ref<void(StringRef)> WrappedOutputCallback) {
1984-
Expected<StringRef> LinkedModuleOrErr =
1985-
sycl::linkDevice(InputModules, LinkerArgs);
1986-
if (!LinkedModuleOrErr)
1987-
return LinkedModuleOrErr.takeError();
1984+
// Note: pipeline can skip linking due to -fno-sycl-rdc option.
1985+
// In that case, we apply sycl processing to several modules.
1986+
std::vector<StringRef> Modules;
1987+
if (LinkerArgs.hasArg(OPT_no_sycl_rdc)) {
1988+
// No need to perform any linking.
1989+
Modules = std::vector<StringRef>(InputModules.begin(), InputModules.end());
1990+
} else {
1991+
Expected<StringRef> OutputOrErr =
1992+
sycl::linkDevice(InputModules, LinkerArgs);
1993+
if (!OutputOrErr)
1994+
return OutputOrErr.takeError();
1995+
1996+
Modules.push_back(*OutputOrErr);
1997+
}
1998+
1999+
std::vector<module_split::SplitModule> OutputModules;
2000+
// TODO: parallelization of the loop below would lead to big performance
2001+
// improvement.
2002+
for (StringRef Module : Modules) {
2003+
// Note: sycl-post-link can produce more modules than incoming due to module
2004+
// split.
2005+
Expected<std::vector<module_split::SplitModule>> ModulesOrErr =
2006+
postLinkProcessModule(Module, LinkerArgs, CompileLinkOptions,
2007+
WrappedOutputCallback);
2008+
if (!ModulesOrErr)
2009+
return ModulesOrErr.takeError();
2010+
2011+
for (module_split::SplitModule &M : *ModulesOrErr)
2012+
OutputModules.push_back(std::move(M));
2013+
}
19882014

1989-
return postLinkProcessModule(*LinkedModuleOrErr, LinkerArgs,
1990-
CompileLinkOptions, WrappedOutputCallback);
2015+
return OutputModules;
19912016
}
19922017

19932018
} // namespace sycl

clang/tools/clang-linker-wrapper/LinkerWrapperOpts.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,10 @@ Flags<[WrapperOnlyOption]>, HelpText<"Link SYCL device code using thinLTO">;
213213
def sycl_embed_ir : Flag<["--", "-"], "sycl-embed-ir">,
214214
Flags<[WrapperOnlyOption]>, HelpText<"Embed LLVM IR for runtime kernel fusion">;
215215

216+
def no_sycl_rdc : Flag<["--", "-"], "no-sycl-rdc">,
217+
Flags<[WrapperOnlyOption]>,
218+
HelpText<"Disable RDC mode (Relocatable device code) for SYCL linking">;
219+
216220
def sycl_device_link
217221
: Flag<["--", "-"], "sycl-device-link">,
218222
Flags<[WrapperOnlyOption]>,

0 commit comments

Comments
 (0)