@@ -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
0 commit comments