Skip to content

Commit ad064bb

Browse files
author
Jakub Chlanda
committed
-S and -fsycl-device-only
1 parent 2e37246 commit ad064bb

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

clang/include/clang/Basic/DiagnosticDriverKinds.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,11 @@ def err_drv_fsycl_wrong_optimization_options : Error<
420420
def warn_drv_fsycl_add_default_spec_consts_image_flag_in_non_AOT : Warning<
421421
"-fsycl-add-default-spec-consts-image flag has an effect only in Ahead of Time Compilation mode (AOT)">,
422422
InGroup<SyclTarget>;
423+
def warn_drv_fsycl_device_obj_asm_device_only : Warning<
424+
"-fsycl-device-obj=asm flag has an effect only when compailing device code "
425+
"and emitting assembly, make sure both -fsycl-device-only and -S flags are "
426+
"present. The option will be ignored">,
427+
InGroup<SyclTarget>;
423428
def warn_drv_ftarget_register_alloc_mode_pvc : Warning<
424429
"using '%0' to set GRF mode on PVC hardware is deprecated; use '-ftarget-register-alloc-mode=pvc:%1'">,
425430
InGroup<Deprecated>;

clang/lib/Driver/Driver.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1303,11 +1303,15 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
13031303
// to using llvmir. This can be improved to be more obvious in usage.
13041304
if (Arg *DeviceObj = C.getInputArgs().getLastArgNoClaim(
13051305
options::OPT_fsycl_device_obj_EQ)) {
1306+
const bool SYCLDeviceOnly = C.getDriver().offloadDeviceOnly();
1307+
const bool EmitAsm = C.getInputArgs().getLastArgNoClaim(options::OPT_S);
13061308
StringRef ArgValue(DeviceObj->getValue());
13071309
SmallVector<StringRef, 3> DeviceObjValues = {"spirv", "llvmir", "asm"};
13081310
if (llvm::find(DeviceObjValues, ArgValue) == DeviceObjValues.end())
13091311
Diag(clang::diag::warn_ignoring_value_using_default)
13101312
<< DeviceObj->getSpelling().split('=').first << ArgValue << "llvmir";
1313+
else if (ArgValue == "asm" && (!SYCLDeviceOnly || !EmitAsm))
1314+
Diag(clang::diag::warn_drv_fsycl_device_obj_asm_device_only);
13111315
}
13121316

13131317
Arg *SYCLForceTarget =
@@ -5321,7 +5325,7 @@ class OffloadingActionBuilder final {
53215325
types::TY_SPIRV);
53225326
if (SYCLDeviceOnly)
53235327
continue;
5324-
} else if ((SYCLDeviceOnly || FinalPhase != phases::Link) &&
5328+
} else if (SYCLDeviceOnly && Args.hasArg(options::OPT_S) &&
53255329
Args.getLastArgValue(options::OPT_fsycl_device_obj_EQ)
53265330
.equals_insensitive("asm")) {
53275331
auto *CompileAction =

clang/test/Driver/sycl-device-obj-ptx.cpp renamed to clang/test/Driver/sycl-device-obj-asm.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,26 @@
1414
// CHECK-AMD: 4: offload, "device-sycl (amdgcn-amd-amdhsa:gfx90a)" {3}, assembler
1515

1616
/// Check -fsycl-device-obj=asm for Nvidia.
17-
// RUN: %clang -fsycl-device-only -fsycl -fsycl-targets=nvptx64-nvidia-cuda -Xsycl-target-backend=nvptx64-nvidia-cuda "--cuda-gpu-arch=sm_50" -fsycl-device-obj=asm -S %s 2>&1 -ccc-print-phases -o - | FileCheck %s --check-prefix=CHECK-PTX
17+
// RUN: %clang -fsycl-device-only -fsycl -fsycl-targets=nvptx64-nvidia-cuda -Xsycl-target-backend=nvptx64-nvidia-cuda --cuda-gpu-arch=sm_50 -fsycl-device-obj=asm -S %s 2>&1 -ccc-print-phases -o - | FileCheck %s --check-prefix=CHECK-PTX
1818
// CHECK-PTX: 0: input, "{{.+\.cpp}}", c++, (device-sycl, sm_50)
1919
// CHECK-PTX: 1: preprocessor, {0}, c++-cpp-output, (device-sycl, sm_50)
2020
// CHECK-PTX: 2: compiler, {1}, ir, (device-sycl, sm_50)
2121
// CHECK-PTX: 3: backend, {2}, assembler, (device-sycl, sm_50)
2222
// CHECK-PTX: 4: offload, "device-sycl (nvptx64-nvidia-cuda:sm_50)" {3}, assembler
2323

2424
/// Check -fsycl-device-obj option when emitting llvm IR.
25-
// RUN: %clang -fsycl-device-only -fsycl -fsycl-targets=nvptx64-nvidia-cuda -Xsycl-target-backend=nvptx64-nvidia-cuda "--cuda-gpu-arch=sm_50" -fsycl-device-obj=llvmir -S %s 2>&1 -ccc-print-phases -o - | FileCheck %s --check-prefix=CHECK-LLVMIR
25+
// RUN: %clang -fsycl-device-only -fsycl -fsycl-targets=nvptx64-nvidia-cuda -Xsycl-target-backend=nvptx64-nvidia-cuda --cuda-gpu-arch=sm_50 -fsycl-device-obj=llvmir -S %s 2>&1 -ccc-print-phases -o - | FileCheck %s --check-prefix=CHECK-LLVMIR
2626
// CHECK-LLVMIR: 0: input, "{{.+\.cpp}}", c++, (device-sycl, sm_50)
2727
// CHECK-LLVMIR: 1: preprocessor, {0}, c++-cpp-output, (device-sycl, sm_50)
2828
// CHECK-LLVMIR: 2: compiler, {1}, ir, (device-sycl, sm_50)
2929
// CHECK-LLVMIR: 3: offload, "device-sycl (nvptx64-nvidia-cuda:sm_50)" {2}, ir
30+
31+
/// -fsycl-device-obj=asm should always be accompanied by -fsycl-device-only
32+
/// and -S, check that the compiler issues a correct warning message:
33+
// RUN: %clang -fsycl-device-only -fsycl -fsycl-targets=nvptx64-nvidia-cuda -Xsycl-target-backend=nvptx64-nvidia-cuda --cuda-gpu-arch=sm_50 -fsycl-device-obj=asm %s 2>&1 -o - | FileCheck %s --check-prefix=CHECK-NO-DEV-ONLY-NO-S
34+
// CHECK-NO-DEV-ONLY-NO-S: warning: -fsycl-device-obj=asm flag has an effect only when compailing device code and emitting assembly, make sure both -fsycl-device-only and -S flags are present. The option will be ignored [-Wsycl-target]
35+
36+
/// -fsycl-device-obj=asm will finish at generating assembly stage, hence
37+
/// inform users that generating library will not be possible (ignore -c)
38+
// RUN: %clang -fsycl-device-only -fsycl -fsycl-targets=nvptx64-nvidia-cuda -Xsycl-target-backend=nvptx64-nvidia-cuda --cuda-gpu-arch=sm_50 -fsycl-device-obj=asm %s 2>&1 -fsycl-device-only -S -c -o - | FileCheck %s --check-prefix=CHECK-DASH-C-IGNORE
39+
// CHECK-DASH-C-IGNORE: warning: argument unused during compilation: '-c' [-Wunused-command-line-argument]

0 commit comments

Comments
 (0)