From cd8d6d873de61d1f224b4c4ccf5f5efcdbc3c393 Mon Sep 17 00:00:00 2001 From: Michael Toguchi Date: Thu, 25 Jul 2024 20:11:41 -0700 Subject: [PATCH] [Driver][SYCL] Handle invalid characters from device in temp files (#14563) When using command lines such as -fsycl -fsycl-targets=spir64_gen --offload-new-driver -Xsycl-target-backend "-device *" there is a temporary file that is generated that contains the arch value. Eliminate any possible invalid characters from being used with this temporary file. --- clang/lib/Driver/Driver.cpp | 8 ++++++-- clang/test/Driver/sycl-offload-new-driver.c | 7 +++++++ .../Driver/sycl-windows-device-filename.cpp | 20 +++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 clang/test/Driver/sycl-windows-device-filename.cpp diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 117817dbc31be..bb01673743089 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 0dedf417b497a..819dbb738913c 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 0000000000000..d179853c94fba --- /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-*