diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 117817dbc31b..bb0167374308 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -9417,10 +9417,14 @@ const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA, StringRef OffloadingPrefix) const { std::string BoundArch = OrigBoundArch.str(); if (is_style_windows(llvm::sys::path::Style::native)) { - // BoundArch may contains ':', which is invalid in file names on Windows, - // therefore replace it with '%'. + // BoundArch may contain ':' or '*', which is invalid in file names on + // Windows, therefore replace it with '@'. std::replace(BoundArch.begin(), BoundArch.end(), ':', '@'); + std::replace(BoundArch.begin(), BoundArch.end(), '*', '@'); } + // BoundArch may contain ',', which may create strings that interfere with + // the StringMap for the clang-offload-packager input values. + std::replace(BoundArch.begin(), BoundArch.end(), ',', '@'); llvm::PrettyStackTraceString CrashInfo("Computing output path"); // Output to a user requested destination? diff --git a/clang/test/Driver/sycl-offload-new-driver.c b/clang/test/Driver/sycl-offload-new-driver.c index 0dedf417b497..819dbb738913 100644 --- a/clang/test/Driver/sycl-offload-new-driver.c +++ b/clang/test/Driver/sycl-offload-new-driver.c @@ -181,3 +181,10 @@ // RUN: -fsycl-embed-ir %s 2>&1 \ // RUN: | FileCheck -check-prefix CHECK_EMBED_IR %s // CHECK_EMBED_IR: clang-linker-wrapper{{.*}} "-sycl-embed-ir" + +/// Verify the filename being passed to the packager does not contain commas +/// that are used in -device settings. +// RUN: %clangxx -fsycl -### -fsycl-targets=spir64_gen --offload-new-driver \ +// RUN: -Xsycl-target-backend=spir64_gen "-device pvc,bdw" %s 2>&1 \ +// RUN: | FileCheck -check-prefix COMMA_FILE %s +// COMMA_FILE: clang-offload-packager{{.*}} "--image=file={{.*}}pvc@bdw{{.*}},triple=spir64_gen-unknown-unknown,arch=pvc,bdw,kind=sycl" diff --git a/clang/test/Driver/sycl-windows-device-filename.cpp b/clang/test/Driver/sycl-windows-device-filename.cpp new file mode 100644 index 000000000000..d179853c94fb --- /dev/null +++ b/clang/test/Driver/sycl-windows-device-filename.cpp @@ -0,0 +1,20 @@ +// Test valid file names from -device values for GPU +// REQUIRES: system-windows + +// RUN: %clang -### --target=x86_64-pc-windows-msvc -fsycl \ +// RUN: -fsycl-targets=spir64_gen --offload-new-driver \ +// RUN: -Xsycl-target-backend "-device arch1:arch2" %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=CHECK_COLON + +// CHECK_COLON: sycl-windows-device-filename-arch1@arch2 +// CHECK_COLON: arch=arch1:arch2 +// CHECK_COLON-NOT: sycl-windows-device-filename-arch1:arch2 + +// RUN: %clang -### --target=x86_64-pc-windows-msvc -fsycl \ +// RUN: -fsycl-targets=spir64_gen --offload-new-driver \ +// RUN: -Xsycl-target-backend "-device *" %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=CHECK_STAR + +// CHECK_STAR: sycl-windows-device-filename-@ +// CHECK_STAR: arch=* +// CHECK_STAR-NOT: sycl-windows-device-filename-*