@@ -719,12 +719,17 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
719
719
C.getInputArgs ().getLastArg (options::OPT_fsycl_link_targets_EQ);
720
720
Arg *SYCLAddTargets =
721
721
C.getInputArgs ().getLastArg (options::OPT_fsycl_add_targets_EQ);
722
+ Arg *SYCLLink =
723
+ C.getInputArgs ().getLastArg (options::OPT_fsycl_link);
722
724
// -fsycl-targets cannot be used with -fsycl-link-targets
723
725
if (SYCLTargets && SYCLLinkTargets)
724
726
Diag (clang::diag::err_drv_sycl_target_conflict);
725
727
// -fsycl-link-targets and -fsycl-add-targets cannot be used together
726
728
if (SYCLLinkTargets && SYCLAddTargets)
727
729
Diag (clang::diag::err_drv_sycl_add_link_conflict);
730
+ // -fsycl-link-targets is not allowed with -fsycl-link
731
+ if (SYCLLinkTargets && SYCLLink)
732
+ Diag (clang::diag::err_drv_sycl_link_link_targets_conflict);
728
733
729
734
// -fsycl-add-targets is a list of paired items (Triple and file) which are
730
735
// gathered and used to be linked into the final device binary. This can
@@ -2997,6 +3002,9 @@ class OffloadingActionBuilder final {
2997
3002
// / Flag to signal if the user requested device-only compilation.
2998
3003
bool CompileDeviceOnly = false ;
2999
3004
3005
+ // / Flag to signal if the user requested the device object to be wrapped
3006
+ bool WrapDeviceOnlyBinary = false ;
3007
+
3000
3008
// / The SYCL actions for the current input.
3001
3009
ActionList SYCLDeviceActions;
3002
3010
@@ -3061,8 +3069,17 @@ class OffloadingActionBuilder final {
3061
3069
for (auto SDA : SYCLDeviceActions) {
3062
3070
SYCLLinkBinaryList.push_back (SDA);
3063
3071
}
3064
- SYCLLinkBinary = C.MakeAction <LinkJobAction>(SYCLLinkBinaryList,
3065
- types::TY_Image);
3072
+ if (WrapDeviceOnlyBinary) {
3073
+ auto *DeviceLinkAction =
3074
+ C.MakeAction <LinkJobAction>(SYCLLinkBinaryList, types::TY_Image);
3075
+ // Wrap the binary when -fsycl-link is given
3076
+ SYCLLinkBinary =
3077
+ C.MakeAction <OffloadWrappingJobAction>(DeviceLinkAction,
3078
+ types::TY_Object);
3079
+ }
3080
+ else
3081
+ SYCLLinkBinary = C.MakeAction <LinkJobAction>(SYCLLinkBinaryList,
3082
+ types::TY_Image);
3066
3083
3067
3084
// Remove the SYCL actions as they are already connected to an host
3068
3085
// action or fat binary.
@@ -3217,9 +3234,11 @@ class OffloadingActionBuilder final {
3217
3234
3218
3235
Arg *SYCLLinkTargets = Args.getLastArg (
3219
3236
options::OPT_fsycl_link_targets_EQ);
3220
- CompileDeviceOnly = SYCLLinkTargets &&
3221
- SYCLLinkTargets->getOption ().matches (
3222
- options::OPT_fsycl_link_targets_EQ);
3237
+ WrapDeviceOnlyBinary = Args.hasArg (options::OPT_fsycl_link);
3238
+ CompileDeviceOnly = (SYCLLinkTargets &&
3239
+ SYCLLinkTargets->getOption ().matches (
3240
+ options::OPT_fsycl_link_targets_EQ)) ||
3241
+ WrapDeviceOnlyBinary;
3223
3242
Arg *SYCLAddTargets = Args.getLastArg (
3224
3243
options::OPT_fsycl_add_targets_EQ);
3225
3244
if (SYCLAddTargets) {
@@ -4654,9 +4673,10 @@ InputInfo Driver::BuildJobsForActionNoCache(
4654
4673
Result = InputInfo (A, BaseInput);
4655
4674
else {
4656
4675
std::string OffloadingPrefix;
4657
- // When generating binaries with -fsycl-link-target, the output file prefix
4658
- // is the triple arch only
4659
- if (Args.getLastArg (options::OPT_fsycl_link_targets_EQ)) {
4676
+ // When generating binaries with -fsycl-link-target or -fsycl-link, the
4677
+ // output file prefix is the triple arch only.
4678
+ if (Args.getLastArg (options::OPT_fsycl_link_targets_EQ) ||
4679
+ Args.hasArg (options::OPT_fsycl_link)) {
4660
4680
OffloadingPrefix = " -" ;
4661
4681
OffloadingPrefix += TC->getTriple ().getArchName ();
4662
4682
} else {
0 commit comments