diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index b6e71082be66d..0428079fc79ad 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -520,6 +520,9 @@ def warn_drv_no_floating_point_registers: Warning< InGroup; def warn_ignoring_ftabstop_value : Warning< "ignoring invalid -ftabstop value '%0', using default value %1">; +def warn_ignoring_value_using_default : Warning< + "ignoring invalid '%0' value '%1', using default value '%2'">, + InGroup; def warn_drv_overriding_option : Warning< "overriding '%0' option with '%1'">, InGroup>; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index c888733f1d885..047f712aa0d3b 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1169,6 +1169,19 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, C.getInputArgs().getLastArg(options::OPT_fsycl_range_rounding_EQ); checkSingleArgValidity(RangeRoundingPreference, {"disable", "force", "on"}); + // Evaluation of -fsycl-device-obj is slightly different, we will emit + // a warning and inform the user of the default behavior used. + // TODO: General usage of this option is to check for 'spirv' and fallthrough + // to using llvmir. This can be improved to be more obvious in usage. + if (Arg *DeviceObj = C.getInputArgs().getLastArgNoClaim( + options::OPT_fsycl_device_obj_EQ)) { + StringRef ArgValue(DeviceObj->getValue()); + SmallVector DeviceObjValues = {"spirv", "llvmir"}; + if (llvm::find(DeviceObjValues, ArgValue) == DeviceObjValues.end()) + Diag(clang::diag::warn_ignoring_value_using_default) + << DeviceObj->getSpelling().split('=').first << ArgValue << "llvmir"; + } + Arg *SYCLForceTarget = getArgRequiringSYCLRuntime(options::OPT_fsycl_force_target_EQ); if (SYCLForceTarget) { diff --git a/clang/test/Driver/sycl-offload.c b/clang/test/Driver/sycl-offload.c index 60db00bea9c4f..17602ad2ed614 100644 --- a/clang/test/Driver/sycl-offload.c +++ b/clang/test/Driver/sycl-offload.c @@ -69,6 +69,13 @@ // RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s // CHK-SYCL-TARGET-NOT: error: SYCL target is invalid +/// -fsycl-device-obj argument check +// RUN: %clang -### -fsycl-device-obj=test -fsycl %s 2>&1 \ +// RUN: | FileCheck -check-prefix=DEVICE_OBJ_WARN %s +// RUN: %clang_cl -### -fsycl-device-obj=test -fsycl %s 2>&1 \ +// RUN: | FileCheck -check-prefix=DEVICE_OBJ_WARN %s +// DEVICE_OBJ_WARN: warning: ignoring invalid '-fsycl-device-obj' value 'test', using default value 'llvmir' [-Wunused-command-line-argument] + /// ########################################################################### /// Check warning for duplicate offloading targets.