@@ -426,109 +426,11 @@ static bool checkPVCDevice(std::string SingleArg, std::string &DevArg) {
426426 return false ;
427427}
428428
429- SmallVector<std::string, 8 >
430- SYCL::getDeviceLibraries (const Compilation &C, const llvm::Triple &TargetTriple,
431- bool IsSpirvAOT) {
432- SmallVector<std::string, 8 > LibraryList;
433- const llvm::opt::ArgList &Args = C.getArgs ();
434- if (Args.getLastArg (options::OPT_fsycl_device_lib_EQ,
435- options::OPT_fno_sycl_device_lib_EQ) ||
436- Args.getLastArg (options::OPT_fsycl_device_lib_jit_link,
437- options::OPT_fno_sycl_device_lib_jit_link))
438- return getDeviceLibrariesLegacy (C, TargetTriple, IsSpirvAOT);
439-
440- bool NoOffloadLib =
441- !Args.hasFlag (options::OPT_offloadlib, options::OPT_no_offloadlib, true );
442- if (TargetTriple.isNVPTX ()) {
443- if (!NoOffloadLib)
444- LibraryList.push_back (
445- Args.MakeArgString (" devicelib-nvptx64-nvidia-cuda.bc" ));
446- return LibraryList;
447- }
448-
449- if (TargetTriple.isAMDGCN ()) {
450- if (!NoOffloadLib)
451- LibraryList.push_back (
452- Args.MakeArgString (" devicelib-amdgcn-amd-amdhsa.bc" ));
453- return LibraryList;
454- }
455-
456- // Ignore no-offloadlib for NativeCPU device library, it provides some
457- // critical builtins which must be linked with user's device image.
458- if (TargetTriple.isNativeCPU ()) {
459- LibraryList.push_back (Args.MakeArgString (" libsycl-nativecpu_utils.bc" ));
460- return LibraryList;
461- }
462-
463- using SYCLDeviceLibsList = SmallVector<StringRef, 8 >;
464- const SYCLDeviceLibsList SYCLDeviceLibs = {" libsycl-crt" ,
465- " libsycl-complex" ,
466- " libsycl-complex-fp64" ,
467- " libsycl-cmath" ,
468- " libsycl-cmath-fp64" ,
469- #if defined(_WIN32)
470- " libsycl-msvc-math" ,
471- #endif
472- " libsycl-imf" ,
473- " libsycl-imf-fp64" ,
474- " libsycl-imf-bf16" ,
475- " libsycl-fallback-cassert" ,
476- " libsycl-fallback-cstring" ,
477- " libsycl-fallback-complex" ,
478- " libsycl-fallback-complex-fp64" ,
479- " libsycl-fallback-cmath" ,
480- " libsycl-fallback-cmath-fp64" ,
481- " libsycl-fallback-imf" ,
482- " libsycl-fallback-imf-fp64" ,
483- " libsycl-fallback-imf-bf16" };
484- bool IsWindowsMSVCEnv =
485- C.getDefaultToolChain ().getTriple ().isWindowsMSVCEnvironment ();
486- bool IsNewOffload = C.getDriver ().getUseNewOffloadingDriver ();
487- StringRef LibSuffix = " .bc" ;
488- if (IsNewOffload)
489- // For new offload model, we use packaged .bc files.
490- LibSuffix = IsWindowsMSVCEnv ? " .new.obj" : " .new.o" ;
491- auto addLibraries = [&](const SYCLDeviceLibsList &LibsList) {
492- for (const StringRef &Lib : LibsList) {
493- SmallString<128 > LibName (Lib);
494- llvm::sys::path::replace_extension (LibName, LibSuffix);
495- LibraryList.push_back (Args.MakeArgString (LibName));
496- }
497- };
498-
499- if (!NoOffloadLib)
500- addLibraries (SYCLDeviceLibs);
501-
502- // ITT annotation libraries are linked in separately whenever the device
503- // code instrumentation is enabled.
504- const SYCLDeviceLibsList SYCLDeviceAnnotationLibs = {
505- " libsycl-itt-user-wrappers" , " libsycl-itt-compiler-wrappers" ,
506- " libsycl-itt-stubs" };
507- if (Args.hasFlag (options::OPT_fsycl_instrument_device_code,
508- options::OPT_fno_sycl_instrument_device_code, true ))
509- addLibraries (SYCLDeviceAnnotationLibs);
510-
511- const SYCLDeviceLibsList SYCLDeviceBfloat16FallbackLib = {
512- " libsycl-fallback-bfloat16" };
513- const SYCLDeviceLibsList SYCLDeviceBfloat16NativeLib = {
514- " libsycl-native-bfloat16" };
515- bool NativeBfloatLibs;
516- bool NeedBfloatLibs = selectBfloatLibs (TargetTriple, C, NativeBfloatLibs);
517- if (NeedBfloatLibs && !NoOffloadLib) {
518- // Add native or fallback bfloat16 library.
519- if (NativeBfloatLibs)
520- addLibraries (SYCLDeviceBfloat16NativeLib);
521- else
522- addLibraries (SYCLDeviceBfloat16FallbackLib);
523- }
524-
525- return LibraryList;
526- }
527-
528429// TODO: remove getDeviceLibrariesLegacy when we remove deprecated options
529430// related to sycl device library link.
530- SmallVector<std::string, 8 > SYCL::getDeviceLibrariesLegacy (
531- const Compilation &C, const llvm::Triple &TargetTriple, bool IsSpirvAOT) {
431+ static SmallVector<std::string, 8 >
432+ getDeviceLibrariesLegacy (const Compilation &C, const llvm::Triple &TargetTriple,
433+ bool IsSpirvAOT) {
532434 SmallVector<std::string, 8 > LibraryList;
533435 const llvm::opt::ArgList &Args = C.getArgs ();
534436
@@ -837,6 +739,105 @@ SmallVector<std::string, 8> SYCL::getDeviceLibrariesLegacy(
837739 return LibraryList;
838740}
839741
742+ SmallVector<std::string, 8 >
743+ SYCL::getDeviceLibraries (const Compilation &C, const llvm::Triple &TargetTriple,
744+ bool IsSpirvAOT) {
745+ SmallVector<std::string, 8 > LibraryList;
746+ const llvm::opt::ArgList &Args = C.getArgs ();
747+ if (Args.getLastArg (options::OPT_fsycl_device_lib_EQ,
748+ options::OPT_fno_sycl_device_lib_EQ) ||
749+ Args.getLastArg (options::OPT_fsycl_device_lib_jit_link,
750+ options::OPT_fno_sycl_device_lib_jit_link))
751+ return getDeviceLibrariesLegacy (C, TargetTriple, IsSpirvAOT);
752+
753+ bool NoOffloadLib =
754+ !Args.hasFlag (options::OPT_offloadlib, options::OPT_no_offloadlib, true );
755+ if (TargetTriple.isNVPTX ()) {
756+ if (!NoOffloadLib)
757+ LibraryList.push_back (
758+ Args.MakeArgString (" devicelib-nvptx64-nvidia-cuda.bc" ));
759+ return LibraryList;
760+ }
761+
762+ if (TargetTriple.isAMDGCN ()) {
763+ if (!NoOffloadLib)
764+ LibraryList.push_back (
765+ Args.MakeArgString (" devicelib-amdgcn-amd-amdhsa.bc" ));
766+ return LibraryList;
767+ }
768+
769+ // Ignore no-offloadlib for NativeCPU device library, it provides some
770+ // critical builtins which must be linked with user's device image.
771+ if (TargetTriple.isNativeCPU ()) {
772+ LibraryList.push_back (Args.MakeArgString (" libsycl-nativecpu_utils.bc" ));
773+ return LibraryList;
774+ }
775+
776+ using SYCLDeviceLibsList = SmallVector<StringRef, 8 >;
777+ const SYCLDeviceLibsList SYCLDeviceLibs = {" libsycl-crt" ,
778+ " libsycl-complex" ,
779+ " libsycl-complex-fp64" ,
780+ " libsycl-cmath" ,
781+ " libsycl-cmath-fp64" ,
782+ #if defined(_WIN32)
783+ " libsycl-msvc-math" ,
784+ #endif
785+ " libsycl-imf" ,
786+ " libsycl-imf-fp64" ,
787+ " libsycl-imf-bf16" ,
788+ " libsycl-fallback-cassert" ,
789+ " libsycl-fallback-cstring" ,
790+ " libsycl-fallback-complex" ,
791+ " libsycl-fallback-complex-fp64" ,
792+ " libsycl-fallback-cmath" ,
793+ " libsycl-fallback-cmath-fp64" ,
794+ " libsycl-fallback-imf" ,
795+ " libsycl-fallback-imf-fp64" ,
796+ " libsycl-fallback-imf-bf16" };
797+ bool IsWindowsMSVCEnv =
798+ C.getDefaultToolChain ().getTriple ().isWindowsMSVCEnvironment ();
799+ bool IsNewOffload = C.getDriver ().getUseNewOffloadingDriver ();
800+ StringRef LibSuffix = " .bc" ;
801+ if (IsNewOffload)
802+ // For new offload model, we use packaged .bc files.
803+ LibSuffix = IsWindowsMSVCEnv ? " .new.obj" : " .new.o" ;
804+ auto addLibraries = [&](const SYCLDeviceLibsList &LibsList) {
805+ for (const StringRef &Lib : LibsList) {
806+ SmallString<128 > LibName (Lib);
807+ llvm::sys::path::replace_extension (LibName, LibSuffix);
808+ LibraryList.push_back (Args.MakeArgString (LibName));
809+ }
810+ };
811+
812+ if (!NoOffloadLib)
813+ addLibraries (SYCLDeviceLibs);
814+
815+ // ITT annotation libraries are linked in separately whenever the device
816+ // code instrumentation is enabled.
817+ const SYCLDeviceLibsList SYCLDeviceAnnotationLibs = {
818+ " libsycl-itt-user-wrappers" , " libsycl-itt-compiler-wrappers" ,
819+ " libsycl-itt-stubs" };
820+ if (Args.hasFlag (options::OPT_fsycl_instrument_device_code,
821+ options::OPT_fno_sycl_instrument_device_code, true ))
822+ addLibraries (SYCLDeviceAnnotationLibs);
823+
824+ const SYCLDeviceLibsList SYCLDeviceBfloat16FallbackLib = {
825+ " libsycl-fallback-bfloat16" };
826+ const SYCLDeviceLibsList SYCLDeviceBfloat16NativeLib = {
827+ " libsycl-native-bfloat16" };
828+ bool NativeBfloatLibs;
829+ bool NeedBfloatLibs = selectBfloatLibs (TargetTriple, C, NativeBfloatLibs);
830+ if (NeedBfloatLibs && !NoOffloadLib) {
831+ // Add native or fallback bfloat16 library.
832+ if (NativeBfloatLibs)
833+ addLibraries (SYCLDeviceBfloat16NativeLib);
834+ else
835+ addLibraries (SYCLDeviceBfloat16FallbackLib);
836+ }
837+
838+ return LibraryList;
839+ }
840+
840841// / Reads device config file to find information about the SYCL targets in
841842// / `Targets`, and defines device traits macros accordingly.
842843void SYCL::populateSYCLDeviceTraitsMacrosArgs (
0 commit comments