diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 3a948cd253aa1..183b53db5833d 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1225,11 +1225,36 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, continue; } - if (!isValidSYCLTriple(MakeSYCLDeviceTriple(UserTargetName))) { + llvm::Triple DeviceTriple(MakeSYCLDeviceTriple(UserTargetName)); + if (!isValidSYCLTriple(DeviceTriple)) { Diag(clang::diag::err_drv_invalid_sycl_target) << Val; continue; } + // For any -fsycl-targets=spir64_gen additions, we will scan the + // additional -X* options for potential -device settings. These + // need to be added as a known Arch to the packager. + if (DeviceTriple.isSPIRAOT() && Arch.empty() && + DeviceTriple.getSubArch() == llvm::Triple::SPIRSubArch_gen) { + const ToolChain *HostTC = + C.getSingleOffloadToolChain(); + auto DeviceTC = std::make_unique( + *this, DeviceTriple, *HostTC, C.getInputArgs()); + assert(DeviceTC && "Device toolchain not defined."); + ArgStringList TargetArgs; + DeviceTC->TranslateBackendTargetArgs(DeviceTC->getTriple(), + C.getInputArgs(), TargetArgs); + // Look for -device and use that as the known arch to + // be associated with the current spir64_gen entry. Grab the + // right most entry. + for (int i = TargetArgs.size() - 2; i >= 0; --i) { + if (StringRef(TargetArgs[i]) == "-device") { + Arch = TargetArgs[i + 1]; + break; + } + } + } + // Make sure we don't have a duplicate triple. std::string NormalizedName = MakeSYCLDeviceTriple(Val).normalize(); auto Duplicate = FoundNormalizedTriples.find(NormalizedName); @@ -1242,7 +1267,6 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, // Store the current triple so that we can check for duplicates in // the following iterations. FoundNormalizedTriples[NormalizedName] = Val; - llvm::Triple DeviceTriple(MakeSYCLDeviceTriple(UserTargetName)); SYCLTriples.insert(DeviceTriple.normalize()); if (!Arch.empty()) DerivedArchs[DeviceTriple.getTriple()].insert(Arch); diff --git a/clang/test/Driver/sycl-offload-new-driver.c b/clang/test/Driver/sycl-offload-new-driver.c index 229cd0d539176..8d672efe92642 100644 --- a/clang/test/Driver/sycl-offload-new-driver.c +++ b/clang/test/Driver/sycl-offload-new-driver.c @@ -91,6 +91,17 @@ // RUN: | FileCheck -check-prefix=CHK_ARCH \ // RUN: -DTRIPLE=spir64_gen-unknown-unknown -DARCH=pvc %s // RUN: %clangxx -### --target=x86_64-unknown-linux-gnu -fsycl \ +// RUN: -fsycl-targets=spir64_gen -Xsycl-target-backend=spir64_gen \ +// RUN: "-device pvc" --offload-new-driver %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHK_ARCH \ +// RUN: -DTRIPLE=spir64_gen-unknown-unknown -DARCH=pvc %s +// RUN: %clangxx -### --target=x86_64-unknown-linux-gnu -fsycl \ +// RUN: -fsycl-targets=spir64_gen -Xsycl-target-backend=spir64_gen \ +// RUN: "-device pvc" -Xsycl-target-backend=spir64_gen "-device dg1" \ +// RUN: --offload-new-driver %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHK_ARCH \ +// RUN: -DTRIPLE=spir64_gen-unknown-unknown -DARCH=dg1 %s +// RUN: %clangxx -### --target=x86_64-unknown-linux-gnu -fsycl \ // RUN: -fno-sycl-libspirv -fsycl-targets=amd_gpu_gfx900 \ // RUN: -nogpulib --offload-new-driver %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK_ARCH \