From a42a50dcf26d126e8079950369dfaf555e901078 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Wed, 17 Nov 2021 15:49:26 -0800 Subject: [PATCH 01/12] [SYCL] Add supplemental tool for SPIR-V to LLVM-IR conversions Tool name: spir-to-ir Function: Provides an interface used within the compiler driver toolchain which converts SPIR-V to LLVM-IR. Using llvm-spirv as the main conversion tool, the purpose of this is to be able to take binaries and convert them to LLVM-IR. The conversion only takes place if the input is SPIR-V, and if the LLVM-IR is provided it is simply copied and passed through. This tool is useful for handling generated fat objects/archives that contain SPIR-V as opposed to typical LLVM-IR. We do not now the type of files within the device objects, so we use this tool to make sure that file consumed after unbundling is always LLVM-IR. Example usage: spir-to-ir input.spv -o output.bc // creates LLVM-IR output.bc spir-to-ir input.bc -o output.bc // no conversion, creates output.bc --- llvm/test/CMakeLists.txt | 1 + llvm/test/tools/spir-to-ir/spir-to-ir.ll | 49 ++++++++ llvm/tools/spir-to-ir/CMakeLists.txt | 16 +++ llvm/tools/spir-to-ir/spir-to-ir.cpp | 135 +++++++++++++++++++++++ sycl/CMakeLists.txt | 2 + 5 files changed, 203 insertions(+) create mode 100644 llvm/test/tools/spir-to-ir/spir-to-ir.ll create mode 100644 llvm/tools/spir-to-ir/CMakeLists.txt create mode 100644 llvm/tools/spir-to-ir/spir-to-ir.cpp diff --git a/llvm/test/CMakeLists.txt b/llvm/test/CMakeLists.txt index fe5d24b429dae..64f47f39a446b 100644 --- a/llvm/test/CMakeLists.txt +++ b/llvm/test/CMakeLists.txt @@ -133,6 +133,7 @@ set(LLVM_TEST_DEPENDS opt sancov sanstats + spir-to-ir sycl-post-link split-file verify-uselistorder diff --git a/llvm/test/tools/spir-to-ir/spir-to-ir.ll b/llvm/test/tools/spir-to-ir/spir-to-ir.ll new file mode 100644 index 0000000000000..d5279915089b1 --- /dev/null +++ b/llvm/test/tools/spir-to-ir/spir-to-ir.ll @@ -0,0 +1,49 @@ +; Check for passthrough abilities +; RUN: llvm-as %s -o %t.bc +; RUN: spir-to-ir %t.bc -o %t_1.bc +; RUN: llvm-dis %t_1.bc -o %t_1.ll +; RUN: FileCheck %s --input-file %t_1.ll + +; Check for SPIR-V conversion +; RUN: llvm-spirv %t.bc -o %t.spv +; RUN: spir-to-ir %t.spv -o %t_2.bc +; RUN: llvm-dis %t_2.bc -o %t_2.ll +; RUN: FileCheck %s --input-file %t_2.ll + +; CHECK: target datalayout +; CHECK-NEXT: target triple = "spir-unknown-unknown" +; CHECK: Function Attrs: nounwind +; CHECK-NEXT: define spir_kernel void @foo(i32 addrspace(1)* %a) +; CHECK-NEXT: entry: +; CHECK-NEXT: %a.addr = alloca i32 addrspace(1)*, align 4 +; CHECK-NEXT: store i32 addrspace(1)* %a, i32 addrspace(1)** %a.addr, align 4 +; CHECK-NEXT: ret void + +target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024" +target triple = "spir-unknown-unknown" + +; Function Attrs: nounwind +define spir_kernel void @foo(i32 addrspace(1)* %a) #0 !kernel_arg_addr_space !1 !kernel_arg_access_qual !2 !kernel_arg_type !3 !kernel_arg_base_type !4 !kernel_arg_type_qual !5 { +entry: + %a.addr = alloca i32 addrspace(1)*, align 4 + store i32 addrspace(1)* %a, i32 addrspace(1)** %a.addr, align 4 + ret void +} + +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!opencl.enable.FP_CONTRACT = !{} +!opencl.spir.version = !{!6} +!opencl.ocl.version = !{!6} +!opencl.used.extensions = !{!7} +!opencl.used.optional.core.features = !{!7} +!opencl.compiler.options = !{!7} + +!1 = !{i32 1} +!2 = !{!"none"} +!3 = !{!"int*"} +!4 = !{!"int*"} +!5 = !{!""} +!6 = !{i32 1, i32 2} +!7 = !{} + diff --git a/llvm/tools/spir-to-ir/CMakeLists.txt b/llvm/tools/spir-to-ir/CMakeLists.txt new file mode 100644 index 0000000000000..f957029b261c5 --- /dev/null +++ b/llvm/tools/spir-to-ir/CMakeLists.txt @@ -0,0 +1,16 @@ +set(LLVM_LINK_COMPONENTS + Core + Support + SPIRVLib + ) + +include_directories( + ${LLVM_EXTERNAL_LLVM_SPIRV_SOURCE_DIR}/include + ) + +add_llvm_tool(spir-to-ir + spir-to-ir.cpp + ) + +# DEPENDS +# intrinsics_gen diff --git a/llvm/tools/spir-to-ir/spir-to-ir.cpp b/llvm/tools/spir-to-ir/spir-to-ir.cpp new file mode 100644 index 0000000000000..f0a8e86f24290 --- /dev/null +++ b/llvm/tools/spir-to-ir/spir-to-ir.cpp @@ -0,0 +1,135 @@ +//===--- spir-to-ir.cpp - Utility to convert to ir if needed --------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This utility checks if the input file is SPIR based. If so, convert to IR +// The input can be either SPIR-V or LLVM-IR. When LLVM-IR, copy the file to +// the specified output. +// +// Uses llvm-spirv to perform the conversion if needed. +// +// The output file is used to allow for proper input and output flow within +// the driver toolchain. +// +// Usage: spir-to-ir input.spv -o output.bc +// +//===----------------------------------------------------------------------===// + +#include "LLVMSPIRVLib.h" +#include "llvm/BinaryFormat/Magic.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/Error.h" +#include "llvm/Support/FileSystem.h" +#include "llvm/Support/InitLLVM.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/Program.h" +#include "llvm/Support/SourceMgr.h" +#include "llvm/Support/StringSaver.h" + +using namespace llvm; + +// InputFilename - The filename to read from. +static cl::opt InputFilename(cl::Positional, + cl::desc(""), + cl::init("-"), + cl::value_desc("filename")); + +// Output - The filename to output to. +static cl::opt Output("o", + cl::desc(""), + cl::value_desc("filename")); + +// LlvmSpirvOpts - The filename to output to. +static cl::opt + LlvmSpirvOpts("llvm-spirv-opts", cl::desc(""), + cl::value_desc("options to pass to llvm-spirv")); + +static void error(const Twine &Message) { + llvm::errs() << "spir-to-ir: " << Message << '\n'; + exit(1); +} + +// Convert the SPIR-V to LLVM-IR. +static int convertSPIRVToLLVMIR(const char *Argv0) { + // Find llvm-spirv. It is expected this resides in the same directory + // as spir-to-ir. + StringRef ParentPath = llvm::sys::path::parent_path(Argv0); + llvm::ErrorOr LlvmSpirvBinary = + llvm::sys::findProgramByName("llvm-spirv", ParentPath); + if (!LlvmSpirvBinary) + LlvmSpirvBinary = llvm::sys::findProgramByName("llvm-spirv"); + + SmallVector LlvmSpirvArgs = {"llvm-spirv", "-r", InputFilename, + "-o", Output}; + + // Add any additional options specified by the user. + if (!LlvmSpirvOpts.empty()) { + SmallVector TargetArgs; + llvm::BumpPtrAllocator BPA; + llvm::StringSaver S(BPA); + // Tokenize the string. + llvm::cl::TokenizeGNUCommandLine(LlvmSpirvOpts, S, TargetArgs); + llvm::transform(TargetArgs, std::back_inserter(LlvmSpirvArgs), + [](StringRef A) { return SmallString<32>(A); }); + } + return llvm::sys::ExecuteAndWait(LlvmSpirvBinary.get(), LlvmSpirvArgs); +} + +static int copyInputLLVMIRToOutput(void) { + // When given an output file, just copy the input to the output + if (!Output.empty() && !InputFilename.empty()) { + llvm::sys::fs::copy_file(InputFilename, Output); + } + return 0; +} + +static bool isLLVMIRBinary(const std::string &File) { + if (File.size() < sizeof(unsigned)) + return false; + + StringRef Ext = llvm::sys::path::has_extension(File) + ? llvm::sys::path::extension(File).drop_front() + : ""; + llvm::file_magic Magic; + llvm::identify_magic(File, Magic); + + // Only .bc and bitcode files are to be considered. + return (Ext == "bc" || Magic == llvm::file_magic::bitcode); +} + +static int checkInputFileIsAlreadyLLVM(const char *Argv0) { + if (InputFilename == "-") + return SPIRV::isSpirvBinary(InputFilename) ? convertSPIRVToLLVMIR(Argv0) + : copyInputLLVMIRToOutput(); + + if (isLLVMIRBinary(InputFilename)) + return copyInputLLVMIRToOutput(); + + StringRef Ext = llvm::sys::path::has_extension(InputFilename) + ? llvm::sys::path::extension(InputFilename).drop_front() + : ""; + if (Ext == "spv" || SPIRV::isSpirvBinary(InputFilename)) + return convertSPIRVToLLVMIR(Argv0); + + error("Could not determine input type for " + InputFilename); + return -1; +} + +int main(int argc, char **argv) { + InitLLVM X(argc, argv); + + LLVMContext Context; + cl::ParseCommandLineOptions(argc, argv, "spir-to-ir\n"); + + if (!llvm::sys::fs::exists(InputFilename)) + error("Input file \'" + InputFilename + "\' not found"); + + if (Output.empty()) + error("Output file not provided"); + + return checkInputFileIsAlreadyLLVM(argv[0]); +} diff --git a/sycl/CMakeLists.txt b/sycl/CMakeLists.txt index 2718ebd141a42..2d75eaef039c5 100644 --- a/sycl/CMakeLists.txt +++ b/sycl/CMakeLists.txt @@ -229,6 +229,7 @@ add_custom_target(sycl-compiler llvm-spirv llvm-link llvm-objcopy + spir-to-ir sycl-post-link opencl-aot ) @@ -292,6 +293,7 @@ set( SYCL_TOOLCHAIN_DEPLOY_COMPONENTS llvm-spirv llvm-link llvm-objcopy + spir-to-ir sycl-post-link sycl-ls clang-resource-headers From bbc3875892343bdf5fedaa615138338b5b721152 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Wed, 15 Dec 2021 17:49:33 -0800 Subject: [PATCH 02/12] clang format --- llvm/tools/spir-to-ir/spir-to-ir.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/llvm/tools/spir-to-ir/spir-to-ir.cpp b/llvm/tools/spir-to-ir/spir-to-ir.cpp index f0a8e86f24290..4a881ad6e5fbb 100644 --- a/llvm/tools/spir-to-ir/spir-to-ir.cpp +++ b/llvm/tools/spir-to-ir/spir-to-ir.cpp @@ -39,8 +39,7 @@ static cl::opt InputFilename(cl::Positional, cl::value_desc("filename")); // Output - The filename to output to. -static cl::opt Output("o", - cl::desc(""), +static cl::opt Output("o", cl::desc(""), cl::value_desc("filename")); // LlvmSpirvOpts - The filename to output to. From 397a75edf8c98d0abc4c6c0497701b34bbea0c23 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Fri, 17 Dec 2021 17:08:55 -0800 Subject: [PATCH 03/12] Rename tool to spir-to-ir-wrapper --- llvm/test/CMakeLists.txt | 2 +- .../spir-to-ir-wrapper.ll} | 4 +- .../CMakeLists.txt | 7 +--- .../spir-to-ir-wrapper.cpp} | 39 +++++++++---------- sycl/CMakeLists.txt | 4 +- 5 files changed, 26 insertions(+), 30 deletions(-) rename llvm/test/tools/{spir-to-ir/spir-to-ir.ll => spir-to-ir-wrapper/spir-to-ir-wrapper.ll} (95%) rename llvm/tools/{spir-to-ir => spir-to-ir-wrapper}/CMakeLists.txt (65%) rename llvm/tools/{spir-to-ir/spir-to-ir.cpp => spir-to-ir-wrapper/spir-to-ir-wrapper.cpp} (77%) diff --git a/llvm/test/CMakeLists.txt b/llvm/test/CMakeLists.txt index 64f47f39a446b..76a555b772674 100644 --- a/llvm/test/CMakeLists.txt +++ b/llvm/test/CMakeLists.txt @@ -133,7 +133,7 @@ set(LLVM_TEST_DEPENDS opt sancov sanstats - spir-to-ir + spir-to-ir-wrapper sycl-post-link split-file verify-uselistorder diff --git a/llvm/test/tools/spir-to-ir/spir-to-ir.ll b/llvm/test/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.ll similarity index 95% rename from llvm/test/tools/spir-to-ir/spir-to-ir.ll rename to llvm/test/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.ll index d5279915089b1..a17716e3e53b8 100644 --- a/llvm/test/tools/spir-to-ir/spir-to-ir.ll +++ b/llvm/test/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.ll @@ -1,12 +1,12 @@ ; Check for passthrough abilities ; RUN: llvm-as %s -o %t.bc -; RUN: spir-to-ir %t.bc -o %t_1.bc +; RUN: spir-to-ir-wrapper %t.bc -o %t_1.bc ; RUN: llvm-dis %t_1.bc -o %t_1.ll ; RUN: FileCheck %s --input-file %t_1.ll ; Check for SPIR-V conversion ; RUN: llvm-spirv %t.bc -o %t.spv -; RUN: spir-to-ir %t.spv -o %t_2.bc +; RUN: spir-to-ir-wrapper %t.spv -o %t_2.bc ; RUN: llvm-dis %t_2.bc -o %t_2.ll ; RUN: FileCheck %s --input-file %t_2.ll diff --git a/llvm/tools/spir-to-ir/CMakeLists.txt b/llvm/tools/spir-to-ir-wrapper/CMakeLists.txt similarity index 65% rename from llvm/tools/spir-to-ir/CMakeLists.txt rename to llvm/tools/spir-to-ir-wrapper/CMakeLists.txt index f957029b261c5..8dbb43ae59f9b 100644 --- a/llvm/tools/spir-to-ir/CMakeLists.txt +++ b/llvm/tools/spir-to-ir-wrapper/CMakeLists.txt @@ -8,9 +8,6 @@ include_directories( ${LLVM_EXTERNAL_LLVM_SPIRV_SOURCE_DIR}/include ) -add_llvm_tool(spir-to-ir - spir-to-ir.cpp +add_llvm_tool(spir-to-ir-wrapper + spir-to-ir-wrapper.cpp ) - -# DEPENDS -# intrinsics_gen diff --git a/llvm/tools/spir-to-ir/spir-to-ir.cpp b/llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp similarity index 77% rename from llvm/tools/spir-to-ir/spir-to-ir.cpp rename to llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp index 4a881ad6e5fbb..ac94098cf4cb9 100644 --- a/llvm/tools/spir-to-ir/spir-to-ir.cpp +++ b/llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp @@ -1,4 +1,4 @@ -//===--- spir-to-ir.cpp - Utility to convert to ir if needed --------------===// +//===--- spir-to-ir-wrapper.cpp - Utility to convert to ir if needed ------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -15,7 +15,7 @@ // The output file is used to allow for proper input and output flow within // the driver toolchain. // -// Usage: spir-to-ir input.spv -o output.bc +// Usage: spir-to-ir-wrapper input.spv -o output.bc // //===----------------------------------------------------------------------===// @@ -34,28 +34,27 @@ using namespace llvm; // InputFilename - The filename to read from. static cl::opt InputFilename(cl::Positional, - cl::desc(""), - cl::init("-"), - cl::value_desc("filename")); + cl::value_desc(""), + cl::desc("")); // Output - The filename to output to. -static cl::opt Output("o", cl::desc(""), - cl::value_desc("filename")); +static cl::opt Output("o", cl::value_desc("output IR filename"), + cl::desc("output filename")); // LlvmSpirvOpts - The filename to output to. static cl::opt - LlvmSpirvOpts("llvm-spirv-opts", cl::desc(""), - cl::value_desc("options to pass to llvm-spirv")); + LlvmSpirvOpts("llvm-spirv-opts", cl::value_desc("llvm-spirv options"), + cl::desc("options to pass to llvm-spirv")); static void error(const Twine &Message) { - llvm::errs() << "spir-to-ir: " << Message << '\n'; + llvm::errs() << "spir-to-ir-wrapper: " << Message << '\n'; exit(1); } // Convert the SPIR-V to LLVM-IR. static int convertSPIRVToLLVMIR(const char *Argv0) { // Find llvm-spirv. It is expected this resides in the same directory - // as spir-to-ir. + // as spir-to-ir-wrapper. StringRef ParentPath = llvm::sys::path::parent_path(Argv0); llvm::ErrorOr LlvmSpirvBinary = llvm::sys::findProgramByName("llvm-spirv", ParentPath); @@ -78,7 +77,7 @@ static int convertSPIRVToLLVMIR(const char *Argv0) { return llvm::sys::ExecuteAndWait(LlvmSpirvBinary.get(), LlvmSpirvArgs); } -static int copyInputLLVMIRToOutput(void) { +static int copyInputToOutput(void) { // When given an output file, just copy the input to the output if (!Output.empty() && !InputFilename.empty()) { llvm::sys::fs::copy_file(InputFilename, Output); @@ -101,12 +100,8 @@ static bool isLLVMIRBinary(const std::string &File) { } static int checkInputFileIsAlreadyLLVM(const char *Argv0) { - if (InputFilename == "-") - return SPIRV::isSpirvBinary(InputFilename) ? convertSPIRVToLLVMIR(Argv0) - : copyInputLLVMIRToOutput(); - if (isLLVMIRBinary(InputFilename)) - return copyInputLLVMIRToOutput(); + return copyInputToOutput(); StringRef Ext = llvm::sys::path::has_extension(InputFilename) ? llvm::sys::path::extension(InputFilename).drop_front() @@ -114,15 +109,19 @@ static int checkInputFileIsAlreadyLLVM(const char *Argv0) { if (Ext == "spv" || SPIRV::isSpirvBinary(InputFilename)) return convertSPIRVToLLVMIR(Argv0); - error("Could not determine input type for " + InputFilename); - return -1; + // We could not directly determine the input file, so we just copy it + // to the output file. + return copyInputToOutput(); } int main(int argc, char **argv) { InitLLVM X(argc, argv); LLVMContext Context; - cl::ParseCommandLineOptions(argc, argv, "spir-to-ir\n"); + cl::ParseCommandLineOptions(argc, argv, "spir-to-ir-wrapper\n"); + + if (InputFilename.empty()) + error("No input file provided"); if (!llvm::sys::fs::exists(InputFilename)) error("Input file \'" + InputFilename + "\' not found"); diff --git a/sycl/CMakeLists.txt b/sycl/CMakeLists.txt index 2d75eaef039c5..47a4cfc65c022 100644 --- a/sycl/CMakeLists.txt +++ b/sycl/CMakeLists.txt @@ -229,7 +229,7 @@ add_custom_target(sycl-compiler llvm-spirv llvm-link llvm-objcopy - spir-to-ir + spir-to-ir-wrapper sycl-post-link opencl-aot ) @@ -293,7 +293,7 @@ set( SYCL_TOOLCHAIN_DEPLOY_COMPONENTS llvm-spirv llvm-link llvm-objcopy - spir-to-ir + spir-to-ir-wrapper sycl-post-link sycl-ls clang-resource-headers From 65ee0d5d0832a92c5a5ed5497c1799d6d978723c Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Fri, 17 Dec 2021 16:15:08 -0800 Subject: [PATCH 04/12] [Driver][SYCL] Enable ability to consume fat objects containing SPIR-V When a user creates objects/archives based off of -fsycl-device-obj=spirv we want to be able to consume these objects seamlessly. After any objects are unbundled, we will pass these through spir-to-ir-wrapper to potentially convert them to LLVM-IR before performing the device link. Toolchain flow will resemble: fat object | unbundle | +-------+------+ | | spir-to-ir | | | llvm-link | | | wrap | | | +-------+------+ | link --- clang/include/clang/Driver/Action.h | 12 ++++++++ clang/include/clang/Driver/ToolChain.h | 2 ++ clang/lib/Driver/Action.cpp | 8 ++++++ clang/lib/Driver/Driver.cpp | 21 +++++++++++++- clang/lib/Driver/ToolChain.cpp | 9 ++++++ clang/lib/Driver/ToolChains/Clang.cpp | 38 ++++++++++++++++++++++++++ clang/lib/Driver/ToolChains/Clang.h | 14 ++++++++++ 7 files changed, 103 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Driver/Action.h b/clang/include/clang/Driver/Action.h index 3621348f6a2ec..a05339d5e1d68 100644 --- a/clang/include/clang/Driver/Action.h +++ b/clang/include/clang/Driver/Action.h @@ -82,6 +82,7 @@ class Action { BackendCompileJobClass, FileTableTformJobClass, AppendFooterJobClass, + SpirToIrWrapperJobClass, StaticLibJobClass, JobClassFirst = PreprocessJobClass, @@ -858,6 +859,17 @@ class AppendFooterJobAction : public JobAction { } }; +class SpirToIrWrapperJobAction : public JobAction { + void anchor() override; + +public: + SpirToIrWrapperJobAction(Action *Input, types::ID Type); + + static bool classof(const Action *A) { + return A->getKind() == SpirToIrWrapperJobClass; + } +}; + class StaticLibJobAction : public JobAction { void anchor() override; diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index d0467e30d1b81..37758e6280580 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -158,6 +158,7 @@ class ToolChain { mutable std::unique_ptr BackendCompiler; mutable std::unique_ptr AppendFooter; mutable std::unique_ptr FileTableTform; + mutable std::unique_ptr SpirToIrWrapper; Tool *getClang() const; Tool *getFlang() const; @@ -175,6 +176,7 @@ class ToolChain { Tool *getBackendCompiler() const; Tool *getAppendFooter() const; Tool *getTableTform() const; + Tool *getSpirToIrWrapper() const; mutable bool SanitizerArgsChecked = false; mutable std::unique_ptr XRayArguments; diff --git a/clang/lib/Driver/Action.cpp b/clang/lib/Driver/Action.cpp index 3a1b5261d6810..0a4873f3ca5d5 100644 --- a/clang/lib/Driver/Action.cpp +++ b/clang/lib/Driver/Action.cpp @@ -61,6 +61,8 @@ const char *Action::getClassName(ActionClass AC) { return "static-lib-linker"; case ForEachWrappingClass: return "foreach"; + case SpirToIrWrapperJobClass: + return "spir-to-ir-wrapper"; } llvm_unreachable("invalid class"); @@ -544,6 +546,12 @@ void StaticLibJobAction::anchor() {} StaticLibJobAction::StaticLibJobAction(ActionList &Inputs, types::ID Type) : JobAction(StaticLibJobClass, Inputs, Type) {} +void SpirToIrWrapperJobAction::anchor() {} + +SpirToIrWrapperJobAction::SpirToIrWrapperJobAction(Action *Input, + types::ID Type) + : JobAction(SpirToIrWrapperJobClass, Input, Type) {} + ForEachWrappingAction::ForEachWrappingAction(JobAction *TFormInput, JobAction *Job) : Action(ForEachWrappingClass, {TFormInput, Job}, Job->getType()) {} diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index a51ffd68c16c1..427058d504302 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -3056,6 +3056,14 @@ bool Driver::checkForOffloadStaticLib(Compilation &C, return false; } +/// Check whether the given input tree contains any clang-offload-dependency +/// actions. +static bool ContainsOffloadDepsAction(const Action *A) { + if (isa(A)) + return true; + return llvm::any_of(A->inputs(), ContainsOffloadDepsAction); +} + namespace { /// Provides a convenient interface for different programming models to generate /// the required device actions. @@ -4538,7 +4546,18 @@ class OffloadingActionBuilder final { DA.add(*DeviceWrappingAction, *TC, BoundArch, Action::OFK_SYCL); continue; } else if (!types::isFPGA(Input->getType())) { - LinkObjects.push_back(Input); + // No need for any conversion if we are coming in from the + // clang-offload-deps or regular compilation path. + if (ContainsOffloadDepsAction(Input) || + ContainsCompileOrAssembleAction(Input)) { + LinkObjects.push_back(Input); + continue; + } + Action *ConvertSPIRVAction = C.MakeAction( + Input, Input->getType() == types::TY_Archive + ? types::TY_Tempfilelist + : types::TY_LLVM_BC); + LinkObjects.push_back(ConvertSPIRVAction); } } if (LinkObjects.empty()) diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 88faad62df1ee..c9a654f3cb1b1 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -371,6 +371,12 @@ Tool *ToolChain::getTableTform() const { return FileTableTform.get(); } +Tool *ToolChain::getSpirToIrWrapper() const { + if (!SpirToIrWrapper) + SpirToIrWrapper.reset(new tools::SpirToIrWrapper(*this)); + return SpirToIrWrapper.get(); +} + Tool *ToolChain::getTool(Action::ActionClass AC) const { switch (AC) { case Action::AssembleJobClass: @@ -431,6 +437,9 @@ Tool *ToolChain::getTool(Action::ActionClass AC) const { case Action::FileTableTformJobClass: return getTableTform(); + + case Action::SpirToIrWrapperJobClass: + return getSpirToIrWrapper(); } llvm_unreachable("Invalid tool kind."); diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 0bfb9b94759e7..0b601d6791d00 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -8503,6 +8503,9 @@ void OffloadBundler::ConstructJobMultipleOutputs( if (IsFPGADepUnbundle) TypeArg = "o"; + if (InputType == types::TY_Archive && getToolChain().getTriple().isSPIR()) + TypeArg = "aoo"; + // Get the type. CmdArgs.push_back(TCArgs.MakeArgString(Twine("-type=") + TypeArg)); @@ -9305,3 +9308,38 @@ void AppendFooter::ConstructJob(Compilation &C, const JobAction &JA, TCArgs.MakeArgString(getToolChain().GetProgramPath(getShortName())), CmdArgs, None)); } + +void SpirToIrWrapper::ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, + const InputInfoList &Inputs, + const llvm::opt::ArgList &TCArgs, + const char *LinkingOutput) const { + InputInfoList ForeachInputs; + ArgStringList CmdArgs; + + assert(Inputs.size() == 1 && "Only one input expected to spir-to-ir-wrapper"); + + // Input File + for (const auto &I : Inputs) { + if (I.getType() == types::TY_Archive) + ForeachInputs.push_back(I); + addArgs(CmdArgs, TCArgs, {I.getFilename()}); + } + + // Output File + addArgs(CmdArgs, TCArgs, {"-o", Output.getFilename()}); + + auto Cmd = std::make_unique( + JA, *this, ResponseFileSupport::None(), + TCArgs.MakeArgString(getToolChain().GetProgramPath(getShortName())), + CmdArgs, None); + if (!ForeachInputs.empty()) { + StringRef ParallelJobs = + TCArgs.getLastArgValue(options::OPT_fsycl_max_parallel_jobs_EQ); + const Tool *Creator = &Cmd->getCreator(); + tools::SYCL::constructLLVMForeachCommand( + C, JA, std::move(Cmd), ForeachInputs, Output, Creator, "", + types::getTypeTempSuffix(types::TY_Tempfilelist), ParallelJobs); + } else + C.addCommand(std::move(Cmd)); +} diff --git a/clang/lib/Driver/ToolChains/Clang.h b/clang/lib/Driver/ToolChains/Clang.h index cfc5cc573dc4d..95acb743199fe 100644 --- a/clang/lib/Driver/ToolChains/Clang.h +++ b/clang/lib/Driver/ToolChains/Clang.h @@ -261,6 +261,20 @@ class LLVM_LIBRARY_VISIBILITY AppendFooter final : public Tool { const char *LinkingOutput) const override; }; +/// SPIR-V to LLVM-IR wrapper tool +class LLVM_LIBRARY_VISIBILITY SpirToIrWrapper final : public Tool { +public: + SpirToIrWrapper(const ToolChain &TC) + : Tool("Convert SPIR-V to LLVM-IR if needed", "spir-to-ir-wrapper", TC) {} + + bool hasIntegratedCPP() const override { return false; } + bool hasGoodDiagnostics() const override { return true; } + void ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, const InputInfoList &Inputs, + const llvm::opt::ArgList &TCArgs, + const char *LinkingOutput) const override; +}; + } // end namespace tools } // end namespace driver From 15d84db9ab8e6ad6211282bfaaa1bca2bf62d0c6 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Sun, 19 Dec 2021 09:24:10 -0800 Subject: [PATCH 05/12] Update SPIR-V check --- .../spir-to-ir-wrapper/spir-to-ir-wrapper.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp b/llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp index ac94098cf4cb9..316bf3f64e97e 100644 --- a/llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp +++ b/llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp @@ -85,6 +85,15 @@ static int copyInputToOutput(void) { return 0; } +static bool isSPIRVBinary(const std::string &File) { + auto FileOrError = MemoryBuffer::getFile(File, /*IsText=*/false, + /*RequiresNullTerminator=*/false); + if (!FileOrError) + return false; + std::unique_ptr FileBuffer = std::move(*FileOrError); + return SPIRV::isSpirvBinary(FileBuffer->getBuffer().str()); +} + static bool isLLVMIRBinary(const std::string &File) { if (File.size() < sizeof(unsigned)) return false; @@ -100,13 +109,12 @@ static bool isLLVMIRBinary(const std::string &File) { } static int checkInputFileIsAlreadyLLVM(const char *Argv0) { - if (isLLVMIRBinary(InputFilename)) - return copyInputToOutput(); - StringRef Ext = llvm::sys::path::has_extension(InputFilename) ? llvm::sys::path::extension(InputFilename).drop_front() : ""; - if (Ext == "spv" || SPIRV::isSpirvBinary(InputFilename)) + if (Ext == "bc" || isLLVMIRBinary(InputFilename)) + return copyInputToOutput(); + if (Ext == "spv" || isSPIRVBinary(InputFilename)) return convertSPIRVToLLVMIR(Argv0); // We could not directly determine the input file, so we just copy it From 84f6e8b8c3dfc4088ad7bde2487cc3205835de28 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Sun, 19 Dec 2021 12:54:24 -0800 Subject: [PATCH 06/12] Update tests to reflect added spir-to-ir-wrapper behavior --- clang/lib/Driver/Driver.cpp | 2 +- clang/lib/Driver/ToolChains/SYCL.cpp | 2 +- clang/test/Driver/sycl-device-lib.cpp | 2 +- clang/test/Driver/sycl-intelfpga-aoco.cpp | 27 ++++--- .../test/Driver/sycl-intelfpga-static-lib.cpp | 21 ++--- .../Driver/sycl-offload-intelfpga-emu.cpp | 12 ++- clang/test/Driver/sycl-offload-intelfpga.cpp | 37 +++++---- .../test/Driver/sycl-offload-static-lib-2.cpp | 76 ++++++++++++------- clang/test/Driver/sycl-offload-static-lib.cpp | 63 ++++++++------- clang/test/Driver/sycl-offload-win.c | 38 ++++++---- clang/test/Driver/sycl-offload-with-split.c | 30 ++++---- clang/test/Driver/sycl-offload.c | 30 ++++---- clang/test/Driver/sycl-offload.cpp | 2 +- 13 files changed, 197 insertions(+), 145 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 427058d504302..64e7e38cb084f 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -4548,7 +4548,7 @@ class OffloadingActionBuilder final { } else if (!types::isFPGA(Input->getType())) { // No need for any conversion if we are coming in from the // clang-offload-deps or regular compilation path. - if (ContainsOffloadDepsAction(Input) || + if (isNVPTX || isAMDGCN || ContainsOffloadDepsAction(Input) || ContainsCompileOrAssembleAction(Input)) { LinkObjects.push_back(Input); continue; diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index c6c43b4b15401..185394704049a 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -236,7 +236,7 @@ const char *SYCL::Linker::constructLLVMLinkCommand( if (II.getType() == types::TY_Tempfilelist) { // Pass the unbundled list with '@' to be processed. std::string FileName(II.getFilename()); - Objs.push_back(C.getArgs().MakeArgString("@" + FileName)); + Libs.push_back(C.getArgs().MakeArgString("@" + FileName)); } else if (II.getType() == types::TY_Archive && !LinkSYCLDeviceLibs) { Libs.push_back(II.getFilename()); } else diff --git a/clang/test/Driver/sycl-device-lib.cpp b/clang/test/Driver/sycl-device-lib.cpp index 69ab4dced9891..9865eb3fdc37e 100644 --- a/clang/test/Driver/sycl-device-lib.cpp +++ b/clang/test/Driver/sycl-device-lib.cpp @@ -139,5 +139,5 @@ // RUN: touch libsycl-crt.o // RUN: %clangxx -fsycl libsycl-crt.o --sysroot=%S/Inputs/SYCL -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=SYCL_LLVM_LINK_USER_ONLY_NEEDED -// SYCL_LLVM_LINK_USER_ONLY_NEEDED: llvm-link{{.*}} "{{.*}}.o" "-o" "{{.*}}.bc" "--suppress-warnings" +// SYCL_LLVM_LINK_USER_ONLY_NEEDED: llvm-link{{.*}} "{{.*}}.bc" "-o" "{{.*}}.bc" "--suppress-warnings" // SYCL_LLVM_LINK_USER_ONLY_NEEDED: llvm-link{{.*}} "-only-needed" "{{.*}}" "-o" "{{.*}}.bc" "--suppress-warnings" diff --git a/clang/test/Driver/sycl-intelfpga-aoco.cpp b/clang/test/Driver/sycl-intelfpga-aoco.cpp index f38f5f020791e..439e43ae7269e 100755 --- a/clang/test/Driver/sycl-intelfpga-aoco.cpp +++ b/clang/test/Driver/sycl-intelfpga-aoco.cpp @@ -83,24 +83,27 @@ // CHK-FPGA-AOCO-PHASES-EMU: 13: clang-offload-deps, {12}, ir, (host-sycl) // CHK-FPGA-AOCO-PHASES-EMU: 14: input, "[[INPUTA]]", archive // CHK-FPGA-AOCO-PHASES-EMU: 15: clang-offload-unbundler, {14}, archive -// CHK-FPGA-AOCO-PHASES-EMU: 16: linker, {6, 13, 15}, ir, (device-sycl) -// CHK-FPGA-AOCO-PHASES-EMU: 17: sycl-post-link, {16}, tempfiletable, (device-sycl) -// CHK-FPGA-AOCO-PHASES-EMU: 18: file-table-tform, {17}, tempfilelist, (device-sycl) -// CHK-FPGA-AOCO-PHASES-EMU: 19: llvm-spirv, {18}, tempfilelist, (device-sycl) -// CHK-FPGA-AOCO-PHASES-EMU: 20: input, "[[INPUTA]]", archive -// CHK-FPGA-AOCO-PHASES-EMU: 21: clang-offload-unbundler, {20}, fpga_dep_list -// CHK-FPGA-AOCO-PHASES-EMU: 22: backend-compiler, {19, 21}, fpga_aocx, (device-sycl) -// CHK-FPGA-AOCO-PHASES-EMU: 23: file-table-tform, {17, 22}, tempfiletable, (device-sycl) -// CHK-FPGA-AOCO-PHASES-EMU: 24: clang-offload-wrapper, {23}, object, (device-sycl) -// CHK-FPGA-AOCO-PHASES-EMU: 25: offload, "host-sycl (x86_64-unknown-linux-gnu)" {11}, "device-sycl (spir64_fpga-unknown-unknown)" {24}, image +// CHK-FPGA-AOCO-PHASES-EMU: 16: spir-to-ir-wrapper, {15}, tempfilelist, (device-sycl) +// CHK-FPGA-AOCO-PHASES-EMU: 17: linker, {6, 13, 16}, ir, (device-sycl) +// CHK-FPGA-AOCO-PHASES-EMU: 18: sycl-post-link, {17}, tempfiletable, (device-sycl) +// CHK-FPGA-AOCO-PHASES-EMU: 19: file-table-tform, {18}, tempfilelist, (device-sycl) +// CHK-FPGA-AOCO-PHASES-EMU: 20: llvm-spirv, {19}, tempfilelist, (device-sycl) +// CHK-FPGA-AOCO-PHASES-EMU: 21: input, "[[INPUTA]]", archive +// CHK-FPGA-AOCO-PHASES-EMU: 22: clang-offload-unbundler, {21}, fpga_dep_list +// CHK-FPGA-AOCO-PHASES-EMU: 23: backend-compiler, {20, 22}, fpga_aocx, (device-sycl) +// CHK-FPGA-AOCO-PHASES-EMU: 24: file-table-tform, {18, 23}, tempfiletable, (device-sycl) +// CHK-FPGA-AOCO-PHASES-EMU: 25: clang-offload-wrapper, {24}, object, (device-sycl) +// CHK-FPGA-AOCO-PHASES-EMU: 26: offload, "host-sycl (x86_64-unknown-linux-gnu)" {11}, "device-sycl (spir64_fpga-unknown-unknown)" {25}, image + /// aoco emulation test, checking tools // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all -fintelfpga %t_aoco.a -### %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO-EMU,CHK-FPGA-AOCO-EMU-LIN %s // RUN: %clang_cl -fsycl -fno-sycl-device-lib=all -fintelfpga %t_aoco_cl.a -### %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO-EMU,CHK-FPGA-AOCO-EMU-WIN %s -// CHK-FPGA-AOCO-EMU: clang-offload-bundler{{.*}} "-type=a" "-targets=sycl-spir64_fpga-unknown-unknown" "-inputs=[[INPUTLIB:.+\.a]]" "-outputs=[[OUTLIB:.+\.a]]" "-unbundle" -// CHK-FPGA-AOCO-EMU: llvm-link{{.*}} "[[OUTLIB]]" "-o" "[[LINKEDBC:.+\.bc]]" +// CHK-FPGA-AOCO-EMU: clang-offload-bundler{{.*}} "-type=aoo" "-targets=sycl-spir64_fpga-unknown-unknown" "-inputs=[[INPUTLIB:.+\.a]]" "-outputs=[[OUTLIB:.+\.a]]" "-unbundle" +// CHK-FPGA-AOCO-EMU: spir-to-ir-wrapper{{.*}} "[[OUTLIB]]" "-o" "[[DEVICELIST:.+\.txt]]" +// CHK-FPGA-AOCO-EMU: llvm-link{{.*}} "@[[DEVICELIST]]" "-o" "[[LINKEDBC:.+\.bc]]" // CHK-FPGA-AOCO-EMU: sycl-post-link{{.*}} "-split-esimd"{{.*}} "-O2" "-spec-const=default" "-o" "[[SPLTABLE:.+\.table]]" "[[LINKEDBC]]" // CHK-FPGA-AOCO-EMU: file-table-tform{{.*}} "-o" "[[TABLEOUT:.+\.txt]]" "[[SPLTABLE]]" // CHK-FPGA-AOCO-EMU: llvm-spirv{{.*}} "-o" "[[TARGSPV:.+\.txt]]" {{.*}} "[[TABLEOUT]]" diff --git a/clang/test/Driver/sycl-intelfpga-static-lib.cpp b/clang/test/Driver/sycl-intelfpga-static-lib.cpp index b9f5c12c7ac45..db24dcc524799 100644 --- a/clang/test/Driver/sycl-intelfpga-static-lib.cpp +++ b/clang/test/Driver/sycl-intelfpga-static-lib.cpp @@ -18,16 +18,17 @@ // CHECK_PHASES: 3: clang-offload-deps, {2}, ir, (host-sycl) // CHECK_PHASES: 4: input, "[[INPUT]]", archive // CHECK_PHASES: 5: clang-offload-unbundler, {4}, archive -// CHECK_PHASES: 6: linker, {3, 5}, ir, (device-sycl) -// CHECK_PHASES: 7: sycl-post-link, {6}, tempfiletable, (device-sycl) -// CHECK_PHASES: 8: file-table-tform, {7}, tempfilelist, (device-sycl) -// CHECK_PHASES: 9: llvm-spirv, {8}, tempfilelist, (device-sycl) -// CHECK_PHASES: 10: input, "[[INPUT]]", archive -// CHECK_PHASES: 11: clang-offload-unbundler, {10}, fpga_dep_list -// CHECK_PHASES: 12: backend-compiler, {9, 11}, fpga_aocx, (device-sycl) -// CHECK_PHASES: 13: file-table-tform, {7, 12}, tempfiletable, (device-sycl) -// CHECK_PHASES: 14: clang-offload-wrapper, {13}, object, (device-sycl) -// CHECK_PHASES: 15: offload, "host-sycl (x86_64-unknown-linux-gnu)" {1}, "device-sycl (spir64_fpga-unknown-unknown)" {14}, image +// CHECK_PHASES: 6: spir-to-ir-wrapper, {5}, tempfilelist, (device-sycl) +// CHECK_PHASES: 7: linker, {3, 6}, ir, (device-sycl) +// CHECK_PHASES: 8: sycl-post-link, {7}, tempfiletable, (device-sycl) +// CHECK_PHASES: 9: file-table-tform, {8}, tempfilelist, (device-sycl) +// CHECK_PHASES: 10: llvm-spirv, {9}, tempfilelist, (device-sycl) +// CHECK_PHASES: 11: input, "[[INPUT]]", archive +// CHECK_PHASES: 12: clang-offload-unbundler, {11}, fpga_dep_list +// CHECK_PHASES: 13: backend-compiler, {10, 12}, fpga_aocx, (device-sycl) +// CHECK_PHASES: 14: file-table-tform, {8, 13}, tempfiletable, (device-sycl) +// CHECK_PHASES: 15: clang-offload-wrapper, {14}, object, (device-sycl) +// CHECK_PHASES: 16: offload, "host-sycl (x86_64-unknown-linux-gnu)" {1}, "device-sycl (spir64_fpga-unknown-unknown)" {15}, image /// Check for unbundle and use of deps in static lib // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all -fintelfpga -Xshardware %t.a -### 2>&1 \ diff --git a/clang/test/Driver/sycl-offload-intelfpga-emu.cpp b/clang/test/Driver/sycl-offload-intelfpga-emu.cpp index 324b42fd1dce3..e285499f35c36 100644 --- a/clang/test/Driver/sycl-offload-intelfpga-emu.cpp +++ b/clang/test/Driver/sycl-offload-intelfpga-emu.cpp @@ -14,7 +14,8 @@ // RUN: %clangxx -### -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all -fsycl-targets=spir64_fpga-unknown-unknown -g -fsycl-link=image %t.o -o libfoo.a 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-LINK,CHK-FPGA-IMAGE %s // CHK-FPGA-LINK: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64_fpga-unknown-unknown" "-inputs=[[INPUT:.+\.o]]" "-outputs=[[OUTPUT1:.+\.o]]" "-unbundle" -// CHK-FPGA-LINK: llvm-link{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT2_1:.+\.bc]]" +// CHK-FPGA-LINK: spir-to-ir-wrapper{{.*}} "[[OUTPUT1]]" "-o" "[[IROUTPUT1:.+\.bc]]" +// CHK-FPGA-LINK: llvm-link{{.*}} "[[IROUTPUT1]]" "-o" "[[OUTPUT2_1:.+\.bc]]" // CHK-FPGA-LINK: sycl-post-link{{.*}} "-O2" "-spec-const=default" "-o" "[[OUTPUT2:.+\.table]]" "[[OUTPUT2_1]]" // CHK-FPGA-LINK: file-table-tform{{.*}} "-o" "[[TABLEOUT:.+\.txt]]" "[[OUTPUT2]]" // CHK-FPGA-LINK: llvm-spirv{{.*}} "-o" "[[OUTPUT3:.+\.txt]]" "-spirv-max-version={{.*}}"{{.*}} "[[TABLEOUT]]" @@ -36,7 +37,8 @@ // RUN: %clang_cl -### -fsycl -fintelfpga -fno-sycl-device-lib=all -fsycl-link %t.obj -o libfoo.lib 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-LINK-WIN %s // CHK-FPGA-LINK-WIN: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64_fpga-unknown-unknown{{.*}}" "-inputs=[[INPUT:.+\.obj]]" "-outputs=[[OUTPUT1:.+\.obj]]" "-unbundle" -// CHK-FPGA-LINK-WIN: llvm-link{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT2_1:.+\.bc]]" +// CHK-FPGA-LINK-WIN: spir-to-ir-wrapper{{.*}} "[[OUTPUT1]]" "-o" "[[IROUTPUT1:.+\.bc]]" +// CHK-FPGA-LINK-WIN: llvm-link{{.*}} "[[IROUTPUT1]]" "-o" "[[OUTPUT2_1:.+\.bc]]" // CHK-FPGA-LINK-WIN: sycl-post-link{{.*}} "-O2" "-spec-const=default" "-o" "[[OUTPUT2:.+\.table]]" "[[OUTPUT2_1]]" // CHK-FPGA-LINK-WIN: file-table-tform{{.*}} "-o" "[[TABLEOUT:.+\.txt]]" "[[OUTPUT2]]" // CHK-FPGA-LINK-WIN: llvm-spirv{{.*}} "-o" "[[OUTPUT3:.+\.txt]]" "-spirv-max-version={{.*}}"{{.*}} "[[TABLEOUT]]" @@ -90,7 +92,8 @@ // CHK-FPGA: clang-offload-wrapper{{.*}} "-o=[[OUTPUT_AOCX_BC:.+\.bc]]" "-host=x86_64-unknown-linux-gnu" "-target=spir64_fpga" "-kind=sycl" "-batch" "[[OUTPUT4]]" // CHK-FPGA: llc{{.*}} "-filetype=obj" "-o" "[[FINALLINK:.+\.o]]" "[[OUTPUT_AOCX_BC]]" // CHK-FPGA: clang-offload-bundler{{.*}} "-type=o" "-targets=host-x86_64-unknown-linux-gnu,sycl-spir64_fpga-unknown-unknown" {{.*}} "-outputs=[[FINALLINK2:.+\.o]],[[OUTPUT1:.+\.o]]" "-unbundle" -// CHK-FPGA: llvm-link{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT2_BC:.+\.bc]]" +// CHK-FPGA: spir-to-ir-wrapper{{.*}} "[[OUTPUT1]]" "-o" "[[IROUTPUT1:.+\.bc]]" +// CHK-FPGA: llvm-link{{.*}} "[[IROUTPUT1]]" "-o" "[[OUTPUT2_BC:.+\.bc]]" // CHK-FPGA: sycl-post-link{{.*}} "-O2" "-spec-const=default" "-o" "[[OUTPUT2:.+\.table]]" "[[OUTPUT2_BC]]" // CHK-FPGA: file-table-tform{{.*}} "-o" "[[TABLEOUT:.+\.txt]]" "[[OUTPUT2]]" // CHK-FPGA: llvm-spirv{{.*}} "-o" "[[OUTPUT3:.+\.txt]]" "-spirv-max-version={{.*}}"{{.*}} "[[TABLEOUT]]" @@ -167,7 +170,8 @@ // CHK-FPGA-AOCX-OBJ: clang-offload-wrapper{{.*}} "-o=[[WRAPOUT:.+\.bc]]" {{.*}} "-target=spir64_fpga" "-kind=sycl" "-batch" "[[TABLEOUT]]" // CHK-FPGA-AOCX-OBJ: llc{{.*}} "-filetype=obj" "-o" "[[LLCOUT:.+\.(o|obj)]]" "[[WRAPOUT]]" // CHK-FPGA-AOCX-OBJ: clang-offload-bundler{{.*}} "-type=o" {{.*}} "-outputs=[[HOSTOBJ:.+\.(o|obj)]],[[DEVICEOBJ:.+\.(o|obj)]]" "-unbundle" -// CHK-FPGA-AOCX-OBJ: llvm-link{{.*}} "[[DEVICEOBJ]]" "-o" "[[LLVMLINKOUT:.+\.bc]]" "--suppress-warnings" +// CHK-FPGA-AOCX-OBJ: spir-to-ir-wrapper{{.*}} "[[DEVICEOBJ]]" "-o" "[[IROUTPUT:.+\.bc]]" +// CHK-FPGA-AOCX-OBJ: llvm-link{{.*}} "[[IROUTPUT]]" "-o" "[[LLVMLINKOUT:.+\.bc]]" "--suppress-warnings" // CHK-FPGA-AOCX-OBJ: sycl-post-link{{.*}} "-O2" "-spec-const=default" "-o" "[[OUTPUT2:.+\.table]]" "[[LLVMLINKOUT]]" // CHK-FPGA-AOCX-OBJ: file-table-tform{{.*}} "-o" "[[TABLEOUT:.+\.txt]]" "[[OUTPUT2]]" // CHK-FPGA-AOCX-OBJ: llvm-spirv{{.*}} "-o" "[[OUTPUT3:.+\.txt]]" "-spirv-max-version={{.*}}"{{.*}} "[[TABLEOUT]]" diff --git a/clang/test/Driver/sycl-offload-intelfpga.cpp b/clang/test/Driver/sycl-offload-intelfpga.cpp index c5e8ab9188044..17aa4275d5aa9 100644 --- a/clang/test/Driver/sycl-offload-intelfpga.cpp +++ b/clang/test/Driver/sycl-offload-intelfpga.cpp @@ -66,7 +66,8 @@ // RUN: | FileCheck -check-prefixes=CHK-FPGA-LINK,CHK-FPGA-IMAGE %s // CHK-FPGA-LINK: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64_fpga-unknown-unknown" "-inputs=[[INPUT:.+\.o]]" "-outputs=[[OUTPUT1:.+\.o]]" "-unbundle" // CHK-FPGA-LINK-NOT: clang-offload-bundler{{.*}} -// CHK-FPGA-LINK: llvm-link{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT2_1:.+\.bc]]" +// CHK-FPGA-LINK: spir-to-ir-wrapper{{.*}} "[[OUTPUT1]]" "-o" "[[IROUTPUT1:.+\.bc]]" +// CHK-FPGA-LINK: llvm-link{{.*}} "[[IROUTPUT1]]" "-o" "[[OUTPUT2_1:.+\.bc]]" // CHK-FPGA-LINK: sycl-post-link{{.*}} "-O2" "-spec-const=default" "-o" "[[OUTPUT2:.+\.table]]" "[[OUTPUT2_1]]" // CHK-FPGA-LINK: file-table-tform{{.*}} "-o" "[[TABLEOUT:.+\.txt]]" "[[OUTPUT2]]" // CHK-FPGA-LINK: llvm-spirv{{.*}} "-o" "[[OUTPUT3:.+\.txt]]" "-spirv-max-version={{.*}}"{{.*}} "[[TABLEOUT]]" @@ -99,7 +100,8 @@ // RUN: | FileCheck -check-prefixes=CHK-FPGA-LINK-WIN %s // CHK-FPGA-LINK-WIN: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64_fpga-unknown-unknown{{.*}}" "-inputs=[[INPUT:.+\.obj]]" "-outputs=[[OUTPUT1:.+\.obj]]" "-unbundle" // CHK-FPGA-LINK-WIN-NOT: clang-offload-bundler{{.*}} -// CHK-FPGA-LINK-WIN: llvm-link{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT2_1:.+\.bc]]" +// CHK-FPGA-LINK-WIN: spir-to-ir-wrapper{{.*}} "[[OUTPUT1]]" "-o" "[[IROUTPUT1:.+\.bc]]" +// CHK-FPGA-LINK-WIN: llvm-link{{.*}} "[[IROUTPUT1]]" "-o" "[[OUTPUT2_1:.+\.bc]]" // CHK-FPGA-LINK-WIN: sycl-post-link{{.*}} "-O2" "-spec-const=default" "-o" "[[OUTPUT2:.+\.table]]" "[[OUTPUT2_1]]" // CHK-FPGA-LINK-WIN: file-table-tform{{.*}} "-o" "[[TABLEOUT:.+\.txt]]" "[[OUTPUT2]]" // CHK-FPGA-LINK-WIN: llvm-spirv{{.*}} "-o" "[[OUTPUT3:.+\.txt]]" "-spirv-max-version={{.*}}"{{.*}} "[[TABLEOUT]]" @@ -163,7 +165,8 @@ // CHK-FPGA: clang-offload-wrapper{{.*}} "-o=[[OUTPUT_AOCX_BC:.+\.bc]]" "-host=x86_64-unknown-linux-gnu" "-target=spir64_fpga" "-kind=sycl" "-batch" "[[OUTPUT4]]" // CHK-FPGA: llc{{.*}} "-filetype=obj" "-o" "[[FINALLINK:.+\.o]]" "[[OUTPUT_AOCX_BC]]" // CHK-FPGA: clang-offload-bundler{{.*}} "-type=o" "-targets=host-x86_64-unknown-linux-gnu,sycl-spir64_fpga-unknown-unknown" {{.*}} "-outputs=[[FINALLINK2:.+\.o]],[[OUTPUT1:.+\.o]]" "-unbundle" -// CHK-FPGA: llvm-link{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT2_BC:.+\.bc]]" +// CHK-FPGA: spir-to-ir-wrapper{{.*}} "[[OUTPUT1]]" "-o" "[[IROUTPUT1:.+\.bc]]" +// CHK-FPGA: llvm-link{{.*}} "[[IROUTPUT1]]" "-o" "[[OUTPUT2_BC:.+\.bc]]" // CHK-FPGA: sycl-post-link{{.*}} "-O2" "-spec-const=default" "-o" "[[OUTPUT3_TABLE:.+\.table]]" "[[OUTPUT2_BC]]" // CHK-FPGA: file-table-tform{{.*}} "-o" "[[TABLEOUT:.+\.txt]]" "[[OUTPUT3_TABLE]]" // CHK-FPGA: llvm-spirv{{.*}} "-o" "[[OUTPUT5:.+\.txt]]" "-spirv-max-version={{.*}}"{{.*}} "[[TABLEOUT]]" @@ -246,7 +249,8 @@ // CHK-FPGA-AOCX-OBJ: clang-offload-wrapper{{.*}} "-o=[[WRAPOUT:.+\.bc]]" {{.*}} "-target=spir64_fpga" "-kind=sycl" "-batch" "[[TABLEOUT]]" // CHK-FPGA-AOCX-OBJ: llc{{.*}} "-filetype=obj" "-o" "[[LLCOUT:.+\.(o|obj)]]" "[[WRAPOUT]]" // CHK-FPGA-AOCX-OBJ: clang-offload-bundler{{.*}} "-type=o" {{.*}} "-outputs=[[HOSTOBJ:.+\.(o|obj)]],[[DEVICEOBJ:.+\.(o|obj)]]" "-unbundle" -// CHK-FPGA-AOCX-OBJ: llvm-link{{.*}} "[[DEVICEOBJ]]" "-o" "[[LLVMLINKOUT:.+\.bc]]" "--suppress-warnings" +// CHK-FPGA-AOCX-OBJ: spir-to-ir-wrapper{{.*}} "[[DEVICEOBJ]]" "-o" "[[IROUTPUT:.+\.bc]]" +// CHK-FPGA-AOCX-OBJ: llvm-link{{.*}} "[[IROUTPUT]]" "-o" "[[LLVMLINKOUT:.+\.bc]]" "--suppress-warnings" // CHK-FPGA-AOCX-OBJ: sycl-post-link{{.*}} "-O2" "-spec-const=default" "-o" "[[POSTLINKOUT:.+\.table]]" "[[LLVMLINKOUT]] // CHK-FPGA-AOCX-OBJ: file-table-tform{{.*}} "-o" "[[TABLEOUT:.+\.txt]]" "[[POSTLINKOUT]]" // CHK-FPGA-AOCX-OBJ: llvm-spirv{{.*}} "-o" "[[LLVMSPVOUT:.+\.txt]]" {{.*}} "[[TABLEOUT]]" @@ -264,7 +268,8 @@ // RUN: %clang_cl -fsycl -fno-sycl-device-lib=all -fsycl-targets=spir64,spir64_fpga -Xshardware %t.o %t_aocx.a -### 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCX-OBJ2 %s // CHK-FPGA-AOCX-OBJ2: clang-offload-bundler{{.*}} "-type=o" {{.*}} "-outputs=[[HOSTOBJ:.+\.(o|obj)]],[[DEVICEOBJ:.+\.(o|obj)]],[[DEVICEOBJ2:.+\.(o|obj)]]" "-unbundle" -// CHK-FPGA-AOCX-OBJ2: llvm-link{{.*}} "[[DEVICEOBJ]]" "-o" "[[LLVMLINKOUT:.+\.bc]]" "--suppress-warnings" +// CHK-FPGA-AOCX-OBJ2: spir-to-ir-wrapper{{.*}} "[[DEVICEOBJ]]" "-o" "[[IROUTPUT:.+\.bc]]" +// CHK-FPGA-AOCX-OBJ2: llvm-link{{.*}} "[[IROUTPUT]]" "-o" "[[LLVMLINKOUT:.+\.bc]]" "--suppress-warnings" // CHK-FPGA-AOCX-OBJ2: sycl-post-link{{.*}} "-O2" "-spec-const=rt" "-o" "[[POSTLINKOUT:.+\.table]]" "[[LLVMLINKOUT]]" // CHK-FPGA-AOCX-OBJ2: file-table-tform{{.*}} "-o" "[[TABLEOUT:.+\.txt]]" "[[POSTLINKOUT]]" // CHK-FPGA-AOCX-OBJ2: llvm-spirv{{.*}} "-o" "[[LLVMSPVOUT:.+\.txt]]" {{.*}} "[[TABLEOUT]]" @@ -274,7 +279,8 @@ // CHK-FPGA-AOCX-OBJ2: file-table-tform{{.*}} "-rename=0,Code" "-o" "[[TABLEOUT:.+\.txt]]" "[[BUNDLEOUT]]" // CHK-FPGA-AOCX-OBJ2: clang-offload-wrapper{{.*}} "-o=[[WRAPOUT:.+\.bc]]" {{.*}} "-target=spir64_fpga" "-kind=sycl" "-batch" "[[TABLEOUT]]" // CHK-FPGA-AOCX-OBJ2: llc{{.*}} "-filetype=obj" "-o" "[[LLCOUT2:.+\.(o|obj)]]" "[[WRAPOUT]]" -// CHK-FPGA-AOCX-OBJ2: llvm-link{{.*}} "[[DEVICEOBJ2]]" "-o" "[[LLVMLINKOUT2:.+\.bc]]" "--suppress-warnings" +// CHK-FPGA-AOCX-OBJ2: spir-to-ir-wrapper{{.*}} "[[DEVICEOBJ2]]" "-o" "[[IROUTPUT2:.+\.bc]]" +// CHK-FPGA-AOCX-OBJ2: llvm-link{{.*}} "[[IROUTPUT2]]" "-o" "[[LLVMLINKOUT2:.+\.bc]]" "--suppress-warnings" // CHK-FPGA-AOCX-OBJ2: sycl-post-link{{.*}} "-O2" "-spec-const=default" "-o" "[[POSTLINKOUT2:.+\.table]]" "[[LLVMLINKOUT2]]" // CHK-FPGA-AOCX-OBJ2: file-table-tform{{.*}} "-o" "[[TABLEOUT2:.+\.txt]]" "[[POSTLINKOUT2]]" // CHK-FPGA-AOCX-OBJ2: llvm-spirv{{.*}} "-o" "[[LLVMSPVOUT2:.+\.txt]]" {{.*}} "[[TABLEOUT2]]" @@ -390,15 +396,16 @@ // CHK-FPGA-DEP-FILES-OBJ-PHASES: 0: input, "{{.*}}-1.o", object, (host-sycl) // CHK-FPGA-DEP-FILES-OBJ-PHASES: 1: clang-offload-unbundler, {0}, object, (host-sycl) // CHK-FPGA-DEP-FILES-OBJ-PHASES: 2: linker, {1}, image, (host-sycl) -// CHK-FPGA-DEP-FILES-OBJ-PHASES: 3: linker, {1}, ir, (device-sycl) -// CHK-FPGA-DEP-FILES-OBJ-PHASES: 4: sycl-post-link, {3}, tempfiletable, (device-sycl) -// CHK-FPGA-DEP-FILES-OBJ-PHASES: 5: file-table-tform, {4}, tempfilelist, (device-sycl) -// CHK-FPGA-DEP-FILES-OBJ-PHASES: 6: llvm-spirv, {5}, tempfilelist, (device-sycl) -// CHK-FPGA-DEP-FILES-OBJ-PHASES: 7: clang-offload-unbundler, {0}, fpga_dep -// CHK-FPGA-DEP-FILES-OBJ-PHASES: 8: backend-compiler, {6, 7}, fpga_aocx, (device-sycl) -// CHK-FPGA-DEP-FILES-OBJ-PHASES: 9: file-table-tform, {4, 8}, tempfiletable, (device-sycl) -// CHK-FPGA-DEP-FILES-OBJ-PHASES: 10: clang-offload-wrapper, {9}, object, (device-sycl) -// CHK-FPGA-DEP-FILES-OBJ-PHASES: 11: offload, "host-sycl ({{.*}})" {2}, "device-sycl (spir64_fpga-unknown-unknown)" {10}, image +// CHK-FPGA-DEP-FILES-OBJ-PHASES: 3: spir-to-ir-wrapper, {1}, ir, (device-sycl) +// CHK-FPGA-DEP-FILES-OBJ-PHASES: 4: linker, {3}, ir, (device-sycl) +// CHK-FPGA-DEP-FILES-OBJ-PHASES: 5: sycl-post-link, {4}, tempfiletable, (device-sycl) +// CHK-FPGA-DEP-FILES-OBJ-PHASES: 6: file-table-tform, {5}, tempfilelist, (device-sycl) +// CHK-FPGA-DEP-FILES-OBJ-PHASES: 7: llvm-spirv, {6}, tempfilelist, (device-sycl) +// CHK-FPGA-DEP-FILES-OBJ-PHASES: 8: clang-offload-unbundler, {0}, fpga_dep +// CHK-FPGA-DEP-FILES-OBJ-PHASES: 9: backend-compiler, {7, 8}, fpga_aocx, (device-sycl) +// CHK-FPGA-DEP-FILES-OBJ-PHASES: 10: file-table-tform, {5, 9}, tempfiletable, (device-sycl) +// CHK-FPGA-DEP-FILES-OBJ-PHASES: 11: clang-offload-wrapper, {10}, object, (device-sycl) +// CHK-FPGA-DEP-FILES-OBJ-PHASES: 12: offload, "host-sycl ({{.*}})" {2}, "device-sycl (spir64_fpga-unknown-unknown)" {11}, image /// -fintelfpga output report file test // RUN: mkdir -p %t_dir diff --git a/clang/test/Driver/sycl-offload-static-lib-2.cpp b/clang/test/Driver/sycl-offload-static-lib-2.cpp index 072d16dc0b9f7..b34c1dd498fbf 100644 --- a/clang/test/Driver/sycl-offload-static-lib-2.cpp +++ b/clang/test/Driver/sycl-offload-static-lib-2.cpp @@ -18,17 +18,20 @@ // RUN: touch %t_lib.lo // RUN: touch %t_obj.o // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -L/dummy/dir %t_lib.a -### %t_obj.o 2>&1 \ -// RUN: | FileCheck %s -check-prefix=STATIC_LIB -DBUNDLE_TRIPLE=sycl-spir64-unknown-unknown +// RUN: | FileCheck %s -check-prefixes=STATIC_LIB,STATIC_LIB_DEF -DBUNDLE_TRIPLE=sycl-spir64-unknown-unknown // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -L/dummy/dir %t_lib.lo -### %t_obj.o 2>&1 \ -// RUN: | FileCheck %s -check-prefix=STATIC_LIB -DBUNDLE_TRIPLE=sycl-spir64-unknown-unknown +// RUN: | FileCheck %s -check-prefixes=STATIC_LIB,STATIC_LIB_DEF -DBUNDLE_TRIPLE=sycl-spir64-unknown-unknown // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=nvptx64-nvidia-cuda -L/dummy/dir %t_lib.a -### %t_obj.o 2>&1 \ -// RUN: | FileCheck %s -check-prefix=STATIC_LIB -DBUNDLE_TRIPLE=sycl-nvptx64-nvidia-cuda-sm_50 +// RUN: | FileCheck %s -check-prefixes=STATIC_LIB,STATIC_LIB_NVPTX -DBUNDLE_TRIPLE=sycl-nvptx64-nvidia-cuda-sm_50 // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=nvptx64-nvidia-cuda -L/dummy/dir %t_lib.lo -### %t_obj.o 2>&1 \ -// RUN: | FileCheck %s -check-prefix=STATIC_LIB -DBUNDLE_TRIPLE=sycl-nvptx64-nvidia-cuda-sm_50 +// RUN: | FileCheck %s -check-prefixes=STATIC_LIB,STATIC_LIB_NVPTX -DBUNDLE_TRIPLE=sycl-nvptx64-nvidia-cuda-sm_50 // STATIC_LIB: clang-offload-bundler{{.*}} "-type=o" "-targets={{.*}},[[BUNDLE_TRIPLE]]" "-inputs=[[INPUTO:.+\.o]]" "-outputs=[[HOSTOBJ:.+\.o]],{{.+\.o}}" // STATIC_LIB: clang-offload-deps{{.*}} "-targets=[[BUNDLE_TRIPLE]]" -// STATIC_LIB: clang-offload-bundler{{.*}} "-type=a" "-targets=[[BUNDLE_TRIPLE]]" "-inputs={{.*}}" "-outputs=[[OUTFILE:.+\.a]]" -// STATIC_LIB: llvm-link{{.*}} "[[OUTFILE]]" +// STATIC_LIB_DEF: clang-offload-bundler{{.*}} "-type=aoo" "-targets=[[BUNDLE_TRIPLE]]" "-inputs={{.*}}" "-outputs=[[OUTFILE:.+\.a]]" +// STATIC_LIB_NVPTX: clang-offload-bundler{{.*}} "-type=a" "-targets=[[BUNDLE_TRIPLE]]" "-inputs={{.*}}" "-outputs=[[OUTFILE:.+\.a]]" +// STATIC_LIB_DEF: spir-to-ir-wrapper{{.*}} "[[OUTFILE]]" "-o" "[[IROUTFILE:.+\.txt]]" +// STATIC_LIB_DEF: llvm-link{{.*}} "@[[IROUTFILE]]" +// STATIC_LIB_NVPTX: llvm-link{{.*}} "[[OUTFILE]]" // STATIC_LIB: ld{{.*}} "{{.*}}_lib.{{(a|lo)}}" "[[HOSTOBJ]]" /// ########################################################################### @@ -39,15 +42,18 @@ // RUN: touch %t-2.o // RUN: touch %t-3.o // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl %t_lib.a -### %t-1.o %t-2.o %t-3.o 2>&1 \ -// RUN: | FileCheck %s -check-prefix=STATIC_LIB_MULTI_O -DBUNDLE_TRIPLE=sycl-spir64-unknown-unknown +// RUN: | FileCheck %s -check-prefixes=STATIC_LIB_MULTI_O,STATIC_LIB_MULTI_O_DEF -DBUNDLE_TRIPLE=sycl-spir64-unknown-unknown // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=nvptx64-nvidia-cuda %t_lib.a -### %t-1.o %t-2.o %t-3.o 2>&1 \ -// RUN: | FileCheck %s -check-prefix=STATIC_LIB_MULTI_O -DBUNDLE_TRIPLE=sycl-nvptx64-nvidia-cuda-sm_50 +// RUN: | FileCheck %s -check-prefixes=STATIC_LIB_MULTI_O,STATIC_LIB_MULTI_O_NVPTX -DBUNDLE_TRIPLE=sycl-nvptx64-nvidia-cuda-sm_50 // STATIC_LIB_MULTI_O: clang-offload-bundler{{.*}} "-type=o" "-targets={{.*}},[[BUNDLE_TRIPLE]]" "-inputs={{.+}}-1.o" // STATIC_LIB_MULTI_O: clang-offload-bundler{{.*}} "-type=o" "-targets={{.*}},[[BUNDLE_TRIPLE]]" "-inputs={{.+}}-2.o" // STATIC_LIB_MULTI_O: clang-offload-bundler{{.*}} "-type=o" "-targets={{.*}},[[BUNDLE_TRIPLE]]" "-inputs={{.+}}-3.o" // STATIC_LIB_MULTI_O: clang-offload-deps{{.*}} "-targets=[[BUNDLE_TRIPLE]]" -// STATIC_LIB_MULTI_O: clang-offload-bundler{{.*}} "-type=a" "-targets=[[BUNDLE_TRIPLE]]" {{.*}} "-outputs=[[OUTFILE:.+\.a]]" -// STATIC_LIB_MULTI_O: llvm-link{{.*}} "[[OUTFILE]]" +// STATIC_LIB_MULTI_O_DEF: clang-offload-bundler{{.*}} "-type=aoo" "-targets=[[BUNDLE_TRIPLE]]" {{.*}} "-outputs=[[OUTFILE:.+\.a]]" +// STATIC_LIB_MULTI_O_NVPTX: clang-offload-bundler{{.*}} "-type=a" "-targets=[[BUNDLE_TRIPLE]]" {{.*}} "-outputs=[[OUTFILE:.+\.a]]" +// STATIC_LIB_MULTI_O_DEF: spir-to-ir-wrapper{{.*}} "[[OUTFILE]]" "-o" "[[IROUTFILE:.+\.txt]]" +// STATIC_LIB_MULTI_O_DEF: llvm-link{{.*}} "@[[IROUTFILE]]" +// STATIC_LIB_MULTI_O_NVPTX: llvm-link{{.*}} "[[OUTFILE]]" /// ########################################################################### @@ -73,13 +79,14 @@ // STATIC_LIB_SRC: 13: clang-offload-deps, {12}, ir, (host-sycl) // STATIC_LIB_SRC: 14: input, "[[INPUTA]]", archive // STATIC_LIB_SRC: 15: clang-offload-unbundler, {14}, archive -// STATIC_LIB_SRC: 16: linker, {6, 13, 15}, ir, (device-sycl) -// STATIC_LIB_SRC: 17: sycl-post-link, {16}, tempfiletable, (device-sycl) -// STATIC_LIB_SRC: 18: file-table-tform, {17}, tempfilelist, (device-sycl) -// STATIC_LIB_SRC: 19: llvm-spirv, {18}, tempfilelist, (device-sycl) -// STATIC_LIB_SRC: 20: file-table-tform, {17, 19}, tempfiletable, (device-sycl) -// STATIC_LIB_SRC: 21: clang-offload-wrapper, {20}, object, (device-sycl) -// STATIC_LIB_SRC: 22: offload, "host-sycl (x86_64-unknown-linux-gnu)" {11}, "device-sycl (spir64-unknown-unknown)" {21}, image +// STATIC_LIB_SRC: 16: spir-to-ir-wrapper, {15}, tempfilelist, (device-sycl) +// STATIC_LIB_SRC: 17: linker, {6, 13, 16}, ir, (device-sycl) +// STATIC_LIB_SRC: 18: sycl-post-link, {17}, tempfiletable, (device-sycl) +// STATIC_LIB_SRC: 19: file-table-tform, {18}, tempfilelist, (device-sycl) +// STATIC_LIB_SRC: 20: llvm-spirv, {19}, tempfilelist, (device-sycl) +// STATIC_LIB_SRC: 21: file-table-tform, {18, 20}, tempfiletable, (device-sycl) +// STATIC_LIB_SRC: 22: clang-offload-wrapper, {21}, object, (device-sycl) +// STATIC_LIB_SRC: 23: offload, "host-sycl (x86_64-unknown-linux-gnu)" {11}, "device-sycl (spir64-unknown-unknown)" {22}, image // STATIC_LIB_SRC-CUDA: 0: input, "[[INPUTA:.+\.a]]", object, (host-sycl) // STATIC_LIB_SRC-CUDA: 1: input, "[[INPUTC:.+\.cpp]]", c++, (host-sycl) @@ -118,9 +125,12 @@ // STATIC_LIB_SRC2: clang{{.*}} "-emit-obj" {{.*}} "-o" "[[HOSTOBJ:.+\.o]]" // STATIC_LIB_SRC2: ld{{(.exe)?}}" {{.*}} "-o" "[[HOSTEXE:.+\.out]]" // STATIC_LIB_SRC2: clang-offload-deps{{.*}} "-targets=[[DEPS_TRIPLE]]" "-outputs=[[OUTDEPS:.+\.bc]]" "[[HOSTEXE]]" -// STATIC_LIB_SRC2: clang-offload-bundler{{.*}} "-type=a" "-targets=[[BUNDLE_TRIPLE]]" {{.*}} "-outputs=[[OUTLIB:.+\.a]]" +// STATIC_LIB_SRC2_DEF: clang-offload-bundler{{.*}} "-type=aoo" "-targets=[[BUNDLE_TRIPLE]]" {{.*}} "-outputs=[[OUTLIB:.+\.a]]" +// STATIC_LIB_SRC2_NVPTX: clang-offload-bundler{{.*}} "-type=a" "-targets=[[BUNDLE_TRIPLE]]" {{.*}} "-outputs=[[OUTLIB:.+\.a]]" +// STATIC_LIB_SRC2_DEF: spir-to-ir-wrapper{{.*}} "[[OUTLIB]]" "-o" [[OUTLIBLIST:\+:.txt]]" // STATIC_LIB_SRC2: llvm-link{{.*}} "[[OUTDEPS]]" "-o" "[[OUTTEMP:.+\.bc]]" -// STATIC_LIB_SRC2: llvm-link{{.*}} "--only-needed" "[[OUTTEMP]]" "[[OUTLIB]]" +// STATIC_LIB_SRC2_DEF: llvm-link{{.*}} "--only-needed" "[[OUTTEMP]]" "@[[OUTLIBLIST]]" +// STATIC_LIB_SRC2_NVPTX: llvm-link{{.*}} "--only-needed" "[[OUTTEMP]]" "[[OUTLIB]]" // STATIC_LIB_SRC2: ld{{(.exe)?}}" {{.*}} "[[HOSTOBJ]]" /// ########################################################################### @@ -130,7 +140,7 @@ // RUN: | FileCheck %s -check-prefix=STATIC_LIB_SRC3 -DBUNDLE_TRIPLE=sycl-spir64-unknown-unknown // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=nvptx64-nvidia-cuda %t_lib.a -o output_name -lstdc++ -z relro -### %s 2>&1 \ // RUN: | FileCheck %s -check-prefix=STATIC_LIB_SRC3 -DBUNDLE_TRIPLE=sycl-nvptx64-nvidia-cuda-sm_50 -// STATIC_LIB_SRC3: clang-offload-bundler{{.*}} "-type=a" "-targets=[[BUNDLE_TRIPLE]]" +// STATIC_LIB_SRC3: clang-offload-bundler{{.*}} "-type=a{{(oo)*}}" "-targets=[[BUNDLE_TRIPLE]]" // STATIC_LIB_SRC3: llvm-link{{.*}} "{{.*}}" // STATIC_LIB_SRC3: ld{{(.exe)?}}" {{.*}} "-o" "output_name" {{.*}} "-lstdc++" "-z" "relro" @@ -143,17 +153,22 @@ // RUN: touch %t_obj.o // RUN: echo "--whole-archive %/t_lib.a %/t_lib_2.a --no-whole-archive" > %t_arg.arg // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -L/dummy/dir %t_obj.o -Wl,--whole-archive %t_lib.a %t_lib_2.a -Wl,--no-whole-archive -### 2>&1 \ -// RUN: | FileCheck %s -check-prefixes=WHOLE_STATIC_LIB,WHOLE_STATIC_LIB_1 -DBUNDLE_TRIPLE=sycl-spir64-unknown-unknown +// RUN: | FileCheck %s -check-prefixes=WHOLE_STATIC_LIB,WHOLE_STATIC_LIB_1,WHOLE_STATIC_LIB_DEF -DBUNDLE_TRIPLE=sycl-spir64-unknown-unknown // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -L/dummy/dir %t_obj.o -Wl,@%/t_arg.arg -### 2>&1 \ -// RUN: | FileCheck %s -check-prefix=WHOLE_STATIC_LIB -DBUNDLE_TRIPLE=sycl-spir64-unknown-unknown +// RUN: | FileCheck %s -check-prefixes=WHOLE_STATIC_LIB,WHOLE_STATIC_LIB_DEF -DBUNDLE_TRIPLE=sycl-spir64-unknown-unknown // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=nvptx64-nvidia-cuda -L/dummy/dir %t_obj.o -Wl,--whole-archive %t_lib.a %t_lib_2.a -Wl,--no-whole-archive -### 2>&1 \ -// RUN: | FileCheck %s -check-prefixes=WHOLE_STATIC_LIB,WHOLE_STATIC_LIB_1 -DBUNDLE_TRIPLE=sycl-nvptx64-nvidia-cuda-sm_50 +// RUN: | FileCheck %s -check-prefixes=WHOLE_STATIC_LIB,WHOLE_STATIC_LIB_1,WHOLE_STATIC_LIB_NVPTX -DBUNDLE_TRIPLE=sycl-nvptx64-nvidia-cuda-sm_50 // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=nvptx64-nvidia-cuda -L/dummy/dir %t_obj.o -Wl,@%/t_arg.arg -### 2>&1 \ -// RUN: | FileCheck %s -check-prefix=WHOLE_STATIC_LIB -DBUNDLE_TRIPLE=sycl-nvptx64-nvidia-cuda-sm_50 +// RUN: | FileCheck %s -check-prefixes=WHOLE_STATIC_LIB,WHOLE_STATIC_LIB_NVPTX -DBUNDLE_TRIPLE=sycl-nvptx64-nvidia-cuda-sm_50 // WHOLE_STATIC_LIB: clang-offload-bundler{{.*}} "-type=o" "-targets={{.*}},[[BUNDLE_TRIPLE]]" -// WHOLE_STATIC_LIB: clang-offload-bundler{{.*}} "-type=a" "-targets=[[BUNDLE_TRIPLE]]" "-inputs=[[INPUTA:.+\.a]]" "-outputs=[[OUTPUTA:.+\.a]]" -// WHOLE_STATIC_LIB: clang-offload-bundler{{.*}} "-type=a" "-targets=[[BUNDLE_TRIPLE]]" "-inputs=[[INPUTB:.+\.a]]" "-outputs=[[OUTPUTB:.+\.a]]" -// WHOLE_STATIC_LIB: llvm-link{{.*}} "[[OUTPUTA]]" "[[OUTPUTB]]" +// WHOLE_STATIC_LIB_DEF: clang-offload-bundler{{.*}} "-type=aoo" "-targets=[[BUNDLE_TRIPLE]]" "-inputs=[[INPUTA:.+\.a]]" "-outputs=[[OUTPUTA:.+\.a]]" +// WHOLE_STATIC_LIB_DEF: spir-to-ir-wrapper{{.*}} "[[OUTPUTA]]" "-o" "[[OUTLISTA:.+\.txt]]" +// WHOLE_STATIC_LIB_DEF: clang-offload-bundler{{.*}} "-type=aoo" "-targets=[[BUNDLE_TRIPLE]]" "-inputs=[[INPUTB:.+\.a]]" "-outputs=[[OUTPUTB:.+\.a]]" +// WHOLE_STATIC_LIB_DEF: spir-to-ir-wrapper{{.*}} "[[OUTPUTB]]" "-o" "[[OUTLISTB:.+\.txt]]" +// WHOLE_STATIC_LIB_DEF: llvm-link{{.*}} "@[[OUTLISTA]]" "@[[OUTLISTB]]" +// WHOLE_STATIC_LIB_NVPTX: clang-offload-bundler{{.*}} "-type=a" "-targets=[[BUNDLE_TRIPLE]]" "-inputs=[[INPUTA:.+\.a]]" "-outputs=[[OUTPUTA:.+\.a]]" +// WHOLE_STATIC_LIB_NVPTX: clang-offload-bundler{{.*}} "-type=a" "-targets=[[BUNDLE_TRIPLE]]" "-inputs=[[INPUTB:.+\.a]]" "-outputs=[[OUTPUTB:.+\.a]]" +// WHOLE_STATIC_LIB_NVPTX: llvm-link{{.*}} "[[OUTPUTA]]" "[[OUTPUTB]]" // WHOLE_STATIC_LIB: clang-offload-wrapper{{.*}} // WHOLE_STATIC_LIB: llc{{.*}} // WHOLE_STATIC_LIB_1: ld{{.*}} "--whole-archive" "[[INPUTA]]" "[[INPUTB]]" "--no-whole-archive" @@ -177,8 +192,11 @@ // RUN: | FileCheck %s -check-prefix=STATIC_LIB_NOSRC -check-prefix=STATIC_LIB_NOSRC-CUDA -DTARGET=nvptx64 -DBUNDLE_TRIPLE=sycl-nvptx64-nvidia-cuda-sm_50 // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=nvptx64-nvidia-cuda -fno-sycl-device-lib=all -L/dummy/dir %t_lib.lo -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=STATIC_LIB_NOSRC -check-prefix=STATIC_LIB_NOSRC-CUDA -DTARGET=nvptx64 -DBUNDLE_TRIPLE=sycl-nvptx64-nvidia-cuda-sm_50 -// STATIC_LIB_NOSRC: clang-offload-bundler{{.*}} "-type=a" "-targets=[[BUNDLE_TRIPLE]]" "-inputs={{.*}}_lib.{{(a|lo)}}" "-outputs=[[DEVICELIB:.+\.a]]" "-unbundle" -// STATIC_LIB_NOSRC: llvm-link{{.*}} "[[DEVICELIB]]" "-o" "[[BCFILE:.+\.bc]]" +// STATIC_LIB_NOSRC-SPIR: clang-offload-bundler{{.*}} "-type=aoo" "-targets=[[BUNDLE_TRIPLE]]" "-inputs={{.*}}_lib.{{(a|lo)}}" "-outputs=[[DEVICELIB:.+\.a]]" "-unbundle" +// STATIC_LIB_NOSRC-SPIR: spir-to-ir-wrapper{{.*}} "[[DEVICELIB]]" "-o" "[[DEVICELIST:.+\.txt]]" +// STATIC_LIB_NOSRC-SPIR: llvm-link{{.*}} "@[[DEVICELIST]]" "-o" "[[BCFILE:.+\.bc]]" +// STATIC_LIB_NOSRC-CUDA: clang-offload-bundler{{.*}} "-type=a" "-targets=[[BUNDLE_TRIPLE]]" "-inputs={{.*}}_lib.{{(a|lo)}}" "-outputs=[[DEVICELIB:.+\.a]]" "-unbundle" +// STATIC_LIB_NOSRC-CUDA: llvm-link{{.*}} "[[DEVICELIB]]" "-o" "[[BCFILE:.+\.bc]]" // STATIC_LIB_NOSRC: sycl-post-link{{.*}} "-o" "[[TABLE:.+]]" "[[BCFILE]]" // STATIC_LIB_NOSRC: file-table-tform{{.*}} "-o" "[[LIST:.+]]" "[[TABLE]]" // STATIC_LIB_NOSRC-SPIR: llvm-foreach{{.*}}llvm-spirv{{.*}} "-o" "[[OBJLIST:.+\.txt]]"{{.*}} "[[LIST]]" diff --git a/clang/test/Driver/sycl-offload-static-lib.cpp b/clang/test/Driver/sycl-offload-static-lib.cpp index 6ae649c4f1ea5..d126f95f81a54 100644 --- a/clang/test/Driver/sycl-offload-static-lib.cpp +++ b/clang/test/Driver/sycl-offload-static-lib.cpp @@ -18,8 +18,9 @@ // RUN: touch %t.o // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -L/dummy/dir -foffload-static-lib=%t.a -### %t.o 2>&1 \ // RUN: | FileCheck %s -check-prefix=FOFFLOAD_STATIC_LIB -// FOFFLOAD_STATIC_LIB: clang-offload-bundler{{.*}} "-type=a" {{.*}} "-outputs=[[OUTLIB:.+\.a]]" -// FOFFLOAD_STATIC_LIB: llvm-link{{.*}} "[[OUTLIB]]" +// FOFFLOAD_STATIC_LIB: clang-offload-bundler{{.*}} "-type=aoo" {{.*}} "-outputs=[[OUTLIB:.+\.a]]" +// FOFFLOAD_STATIC_LIB: spir-to-ir-wrapper{{.*}} "[[OUTLIB]]" "-o" "[[OUTLIST:.+\.txt]]" +// FOFFLOAD_STATIC_LIB: llvm-link{{.*}} "@[[OUTLIST]]" /// Use of -foffload-static-lib and -foffload-whole-static-lib are deprecated // RUN: touch dummy.a @@ -41,8 +42,9 @@ // FOFFLOAD_STATIC_LIB_MULTI_O: clang-offload-bundler{{.*}} "-type=o" {{.*}} "-inputs={{.+}}-1.o" // FOFFLOAD_STATIC_LIB_MULTI_O: clang-offload-bundler{{.*}} "-type=o" {{.*}} "-inputs={{.+}}-2.o" // FOFFLOAD_STATIC_LIB_MULTI_O: clang-offload-bundler{{.*}} "-type=o" {{.*}} "-inputs={{.+}}-3.o" -// FOFFLOAD_STATIC_LIB_MULTI_O: clang-offload-bundler{{.*}} "-type=a" {{.*}} "-outputs=[[OUTLIB:.+\.a]]" -// FOFFLOAD_STATIC_LIB_MULTI_O: llvm-link{{.*}} "[[OUTLIB]]" +// FOFFLOAD_STATIC_LIB_MULTI_O: clang-offload-bundler{{.*}} "-type=aoo" {{.*}} "-outputs=[[OUTLIB:.+\.a]]" +// FOFFLOAD_STATIC_LIB_MULTI_O: spir-to-ir-wrapper{{.*}} "[[OUTLIB]]" "-o" "[[OUTLIST:.+\.txt]]" +// FOFFLOAD_STATIC_LIB_MULTI_O: llvm-link{{.*}} "@[[OUTLIST]]" /// ########################################################################### @@ -67,13 +69,14 @@ // FOFFLOAD_STATIC_LIB_SRC: 13: clang-offload-deps, {12}, ir, (host-sycl) // FOFFLOAD_STATIC_LIB_SRC: 14: input, "[[INPUTA]]", archive // FOFFLOAD_STATIC_LIB_SRC: 15: clang-offload-unbundler, {14}, archive -// FOFFLOAD_STATIC_LIB_SRC: 16: linker, {6, 13, 15}, ir, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 17: sycl-post-link, {16}, tempfiletable, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 18: file-table-tform, {17}, tempfilelist, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 19: llvm-spirv, {18}, tempfilelist, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 20: file-table-tform, {17, 19}, tempfiletable, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 21: clang-offload-wrapper, {20}, object, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 22: offload, "host-sycl (x86_64-unknown-linux-gnu)" {11}, "device-sycl (spir64-unknown-unknown)" {21}, image +// FOFFLOAD_STATIC_LIB_SRC: 16: spir-to-ir-wrapper, {15}, tempfilelist, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 17: linker, {6, 13, 16}, ir, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 18: sycl-post-link, {17}, tempfiletable, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 19: file-table-tform, {18}, tempfilelist, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 20: llvm-spirv, {19}, tempfilelist, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 21: file-table-tform, {18, 20}, tempfiletable, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 22: clang-offload-wrapper, {21}, object, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 23: offload, "host-sycl (x86_64-unknown-linux-gnu)" {11}, "device-sycl (spir64-unknown-unknown)" {22}, image /// ########################################################################### @@ -83,9 +86,10 @@ // FOFFLOAD_STATIC_LIB_SRC2: clang{{.*}} "-emit-obj" {{.*}} "-o" "[[HOSTOBJ:.+\.o]]" // FOFFLOAD_STATIC_LIB_SRC2: ld{{(.exe)?}}" {{.*}} "-o" "[[HOSTEXE:.+\.out]]" // FOFFLOAD_STATIC_LIB_SRC2: clang-offload-deps{{.*}} "-outputs=[[OUTDEPS:.+\.bc]]" "[[HOSTEXE]]" -// FOFFLOAD_STATIC_LIB_SRC2: clang-offload-bundler{{.*}} "-type=a" {{.*}} "-outputs=[[OUTLIB:.+\.a]]" +// FOFFLOAD_STATIC_LIB_SRC2: clang-offload-bundler{{.*}} "-type=aoo" {{.*}} "-outputs=[[OUTLIB:.+\.a]]" +// FOFFLOAD_STATIC_LIB_SRC2: spir-to-ir-wrapper{{.*}} "[[OUTLIB]]" "-o" "[[OUTLIST:.+\.txt]]" // FOFFLOAD_STATIC_LIB_SRC2: llvm-link{{.*}} "[[OUTDEPS]]" "-o" "[[OUTTEMP:.+\.bc]]" -// FOFFLOAD_STATIC_LIB_SRC2: llvm-link{{.*}} "--only-needed" "[[OUTTEMP]]" "[[OUTLIB]]" +// FOFFLOAD_STATIC_LIB_SRC2: llvm-link{{.*}} "--only-needed" "[[OUTTEMP]]" "@[[OUTLIST]]" // FOFFLOAD_STATIC_LIB_SRC2: ld{{(.exe)?}}" {{.*}} "[[HOSTOBJ]]" /// ########################################################################### @@ -93,8 +97,9 @@ // RUN: touch %t.a // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -foffload-static-lib=%t.a -o output_name -lOpenCL -### %s 2>&1 \ // RUN: | FileCheck %s -check-prefix=FOFFLOAD_STATIC_LIB_SRC3 -// FOFFLOAD_STATIC_LIB_SRC3: clang-offload-bundler{{.*}} "-type=a" {{.*}} "-outputs=[[OUTLIB:.+\.a]]" -// FOFFLOAD_STATIC_LIB_SRC3: llvm-link{{.*}} "[[OUTLIB]]" +// FOFFLOAD_STATIC_LIB_SRC3: clang-offload-bundler{{.*}} "-type=aoo" {{.*}} "-outputs=[[OUTLIB:.+\.a]]" +// FOFFLOAD_STATIC_LIB_SRC3: spir-to-ir-wrapper{{.*}} "[[OUTLIB]]" "-o" "[[OUTLIST:.+\.txt]]" +// FOFFLOAD_STATIC_LIB_SRC3: llvm-link{{.*}} "@[[OUTLIST]]" // FOFFLOAD_STATIC_LIB_SRC3: ld{{(.exe)?}}" {{.*}} "-o" "output_name" {{.*}} "-lOpenCL" /// ########################################################################### @@ -102,8 +107,9 @@ // RUN: touch %t.a // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -foffload-static-lib=%t.a -o output_name -lstdc++ -z relro -### %s 2>&1 \ // RUN: | FileCheck %s -check-prefix=FOFFLOAD_STATIC_LIB_SRC4 -// FOFFLOAD_STATIC_LIB_SRC4: clang-offload-bundler{{.*}} "-type=a" {{.*}} "-outputs=[[OUTLIB:.+\.a]]" -// FOFFLOAD_STATIC_LIB_SRC4: llvm-link{{.*}} "[[OUTLIB]]" +// FOFFLOAD_STATIC_LIB_SRC4: clang-offload-bundler{{.*}} "-type=aoo" {{.*}} "-outputs=[[OUTLIB:.+\.a]]" +// FOFFLOAD_STATIC_LIB_SRC4: spir-to-ir-wrapper{{.*}} "[[OUTLIB]]" "-o" "[[OUTLIST:.+\.txt]]" +// FOFFLOAD_STATIC_LIB_SRC4: llvm-link{{.*}} "@[[OUTLIST]]" // FOFFLOAD_STATIC_LIB_SRC4: ld{{(.exe)?}}" {{.*}} "-o" "output_name" {{.*}} "-lstdc++" "-z" "relro" /// ########################################################################### @@ -115,9 +121,11 @@ // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -L/dummy/dir -foffload-whole-static-lib=%t.a -foffload-whole-static-lib=%t_2.a -### %t.o 2>&1 \ // RUN: | FileCheck %s -check-prefix=FOFFLOAD_WHOLE_STATIC_LIB // FOFFLOAD_WHOLE_STATIC_LIB: clang-offload-bundler{{.*}} "-type=o" {{.*}} -// FOFFLOAD_WHOLE_STATIC_LIB: clang-offload-bundler{{.*}} "-type=a" {{.*}} "-inputs=[[INPUTA:.+\.a]]" "-outputs=[[OUTLIBA:.+\.a]]" -// FOFFLOAD_WHOLE_STATIC_LIB: clang-offload-bundler{{.*}} "-type=a" {{.*}} "-inputs=[[INPUTB:.+\.a]]" "-outputs=[[OUTLIBB:.+\.a]]" -// FOFFLOAD_WHOLE_STATIC_LIB: llvm-link{{.*}} "[[OUTLIBA]]" "[[OUTLIBB]]" +// FOFFLOAD_WHOLE_STATIC_LIB: clang-offload-bundler{{.*}} "-type=aoo" {{.*}} "-inputs=[[INPUTA:.+\.a]]" "-outputs=[[OUTLIBA:.+\.a]]" +// FOFFLOAD_WHOLE_STATIC_LIB: spir-to-ir-wrapper{{.*}} "[[OUTLIBA]]" "-o" "[[OUTLISTA:.+\.txt]]" +// FOFFLOAD_WHOLE_STATIC_LIB: clang-offload-bundler{{.*}} "-type=aoo" {{.*}} "-inputs=[[INPUTB:.+\.a]]" "-outputs=[[OUTLIBB:.+\.a]]" +// FOFFLOAD_WHOLE_STATIC_LIB: spir-to-ir-wrapper{{.*}} "[[OUTLIBB]]" "-o" "[[OUTLISTB:.+\.txt]]" +// FOFFLOAD_WHOLE_STATIC_LIB: llvm-link{{.*}} "@[[OUTLISTA]]" "@[[OUTLISTB]]" // FOFFLOAD_WHOLE_STATIC_LIB: llvm-spirv{{.*}} // FOFFLOAD_WHOLE_STATIC_LIB: clang-offload-wrapper{{.*}} // FOFFLOAD_WHOLE_STATIC_LIB: llc{{.*}} @@ -136,13 +144,14 @@ // FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 3: clang-offload-deps, {2}, ir, (host-sycl) // FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 4: input, "[[INPUTA]]", archive // FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 5: clang-offload-unbundler, {4}, archive -// FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 6: linker, {3, 5}, ir, (device-sycl) -// FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 7: sycl-post-link, {6}, tempfiletable, (device-sycl) -// FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 8: file-table-tform, {7}, tempfilelist, (device-sycl) -// FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 9: llvm-spirv, {8}, tempfilelist, (device-sycl) -// FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 10: file-table-tform, {7, 9}, tempfiletable, (device-sycl) -// FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 11: clang-offload-wrapper, {10}, object, (device-sycl) -// FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 12: offload, "host-sycl (x86_64-unknown-linux-gnu)" {1}, "device-sycl (spir64-unknown-unknown)" {11}, image +// FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 6: spir-to-ir-wrapper, {5}, tempfilelist, (device-sycl) +// FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 7: linker, {3, 6}, ir, (device-sycl) +// FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 8: sycl-post-link, {7}, tempfiletable, (device-sycl) +// FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 9: file-table-tform, {8}, tempfilelist, (device-sycl) +// FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 10: llvm-spirv, {9}, tempfilelist, (device-sycl) +// FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 11: file-table-tform, {8, 10}, tempfiletable, (device-sycl) +// FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 12: clang-offload-wrapper, {11}, object, (device-sycl) +// FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 13: offload, "host-sycl (x86_64-unknown-linux-gnu)" {1}, "device-sycl (spir64-unknown-unknown)" {12}, image /// ########################################################################### diff --git a/clang/test/Driver/sycl-offload-win.c b/clang/test/Driver/sycl-offload-win.c index 6b035d74ce8a6..bee5d1f5cc25c 100644 --- a/clang/test/Driver/sycl-offload-win.c +++ b/clang/test/Driver/sycl-offload-win.c @@ -15,8 +15,9 @@ // RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl -fno-sycl-device-lib=all %t-orig.lib %t-orig.obj -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=FOFFLOAD_STATIC_LIB // FOFFLOAD_STATIC_LIB: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=o" "-targets=host-x86_64-pc-windows-msvc,sycl-spir64-unknown-unknown" "-inputs={{.*}}-orig.obj" "-outputs={{.+}}.{{(o|obj)}},{{.+}}.{{(o|obj)}}" "-unbundle" -// FOFFLOAD_STATIC_LIB: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=a" "-targets=sycl-spir64-{{.+}}" "-inputs={{.*}}-orig.lib" "-outputs=[[OUTLIB:.+\.a]]" "-unbundle" -// FOFFLOAD_STATIC_LIB: llvm-link{{(.exe)?}}{{.*}} "[[OUTLIB]]" +// FOFFLOAD_STATIC_LIB: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=aoo" "-targets=sycl-spir64-{{.+}}" "-inputs={{.*}}-orig.lib" "-outputs=[[OUTLIB:.+\.a]]" "-unbundle" +// FOFFLOAD_STATIC_LIB: spir-to-ir-wrapper{{.*}} "[[OUTLIB]]" "-o" "[[OUTLIST:.+\.txt]]" +// FOFFLOAD_STATIC_LIB: llvm-link{{(.exe)?}}{{.*}} "@[[OUTLIST]]" // FOFFLOAD_STATIC_LIB: link{{(.exe)?}}{{.+}} "{{.*}}-orig.lib" /// ########################################################################### @@ -33,8 +34,9 @@ // FOFFLOAD_STATIC_LIB_MULTI_O: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=o"{{.+}} "-inputs={{.*}}-1.obj"{{.+}} "-unbundle" // FOFFLOAD_STATIC_LIB_MULTI_O: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=o"{{.+}} "-inputs={{.*}}-2.obj"{{.+}} "-unbundle" // FOFFLOAD_STATIC_LIB_MULTI_O: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=o"{{.+}} "-inputs={{.*}}-3.obj"{{.+}} "-unbundle" -// FOFFLOAD_STATIC_LIB_MULTI_O: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=a" "-targets=sycl-spir64-{{.+}}" "-inputs={{.*}}-orig.lib" "-outputs=[[OUTLIB:.+\.a]]" "-unbundle" -// FOFFLOAD_STATIC_LIB_MULTI_O: llvm-link{{(.exe)?}}{{.*}} "[[OUTLIB]]" +// FOFFLOAD_STATIC_LIB_MULTI_O: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=aoo" "-targets=sycl-spir64-{{.+}}" "-inputs={{.*}}-orig.lib" "-outputs=[[OUTLIB:.+\.a]]" "-unbundle" +// FOFFLOAD_STATIC_LIB_MULTI_O: spir-to-ir-wrapper{{.*}} "[[OUTLIB]]" "-o" "[[OUTLIST:.+\.txt]]" +// FOFFLOAD_STATIC_LIB_MULTI_O: llvm-link{{(.exe)?}}{{.*}} "@[[OUTLIST]]" // FOFFLOAD_STATIC_LIB_MULTI_O: link{{(.exe)?}}{{.+}} "{{.*}}-orig.lib" /// ########################################################################### @@ -48,9 +50,11 @@ // RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl %t1.lib %t2.lib %t-orig.obj -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=FOFFLOAD_STATIC_MULTI_LIB // FOFFLOAD_STATIC_MULTI_LIB: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=o"{{.+}} "-inputs={{.*}}-orig.obj"{{.+}} "-unbundle" -// FOFFLOAD_STATIC_MULTI_LIB: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=a" "-targets=sycl-spir64-{{.+}}" "-inputs={{.*}}1.lib" "-outputs=[[OUTLIB1:.+\.a]]" "-unbundle" -// FOFFLOAD_STATIC_MULTI_LIB: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=a" "-targets=sycl-spir64-{{.+}}" "-inputs={{.*}}2.lib" "-outputs=[[OUTLIB2:.+\.a]]" "-unbundle" -// FOFFLOAD_STATIC_MULTI_LIB: llvm-link{{(.exe)?}}{{.*}} "[[OUTLIB1]]" "[[OUTLIB2]]" +// FOFFLOAD_STATIC_MULTI_LIB: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=aoo" "-targets=sycl-spir64-{{.+}}" "-inputs={{.*}}1.lib" "-outputs=[[OUTLIB1:.+\.a]]" "-unbundle" +// FOFFLOAD_STATIC_MULTI_LIB: spir-to-ir-wrapper{{.*}} "[[OUTLIB1]]" "-o" "[[OUTLIST1:.+\.txt]]" +// FOFFLOAD_STATIC_MULTI_LIB: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=aoo" "-targets=sycl-spir64-{{.+}}" "-inputs={{.*}}2.lib" "-outputs=[[OUTLIB2:.+\.a]]" "-unbundle" +// FOFFLOAD_STATIC_MULTI_LIB: spir-to-ir-wrapper{{.*}} "[[OUTLIB2]]" "-o" "[[OUTLIST2:.+\.txt]]" +// FOFFLOAD_STATIC_MULTI_LIB: llvm-link{{(.exe)?}}{{.*}} "@[[OUTLIST1]]" "@[[OUTLIST2]]" // FOFFLOAD_STATIC_MULTI_LIB: link{{(.exe)?}}{{.+}} "{{.*}}1.lib" "{{.*}}2.lib" /// ########################################################################### @@ -77,13 +81,14 @@ // FOFFLOAD_STATIC_LIB_SRC: 13: clang-offload-deps, {12}, ir, (host-sycl) // FOFFLOAD_STATIC_LIB_SRC: 14: input, "[[INPUTLIB]]", archive // FOFFLOAD_STATIC_LIB_SRC: 15: clang-offload-unbundler, {14}, archive -// FOFFLOAD_STATIC_LIB_SRC: 16: linker, {6, 13, 15}, ir, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 17: sycl-post-link, {16}, tempfiletable, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 18: file-table-tform, {17}, tempfilelist, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 19: llvm-spirv, {18}, tempfilelist, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 20: file-table-tform, {17, 19}, tempfiletable, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 21: clang-offload-wrapper, {20}, object, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 22: offload, "host-sycl (x86_64-pc-windows-msvc)" {11}, "device-sycl (spir64-unknown-unknown)" {21}, image +// FOFFLOAD_STATIC_LIB_SRC: 16: spir-to-ir-wrapper, {15}, tempfilelist, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 17: linker, {6, 13, 16}, ir, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 18: sycl-post-link, {17}, tempfiletable, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 19: file-table-tform, {18}, tempfilelist, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 20: llvm-spirv, {19}, tempfilelist, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 21: file-table-tform, {18, 20}, tempfiletable, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 22: clang-offload-wrapper, {21}, object, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 23: offload, "host-sycl (x86_64-pc-windows-msvc)" {11}, "device-sycl (spir64-unknown-unknown)" {22}, image /// ########################################################################### @@ -92,8 +97,9 @@ // RUN: | FileCheck %s -check-prefix=FOFFLOAD_STATIC_LIB_SRC2 // RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl -foffload-static-lib=%t-orig.lib %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=FOFFLOAD_STATIC_LIB_SRC2 -// FOFFLOAD_STATIC_LIB_SRC2: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=a" "-targets=sycl-spir64-{{.+}}" "-inputs={{.*}}-orig.lib" "-outputs=[[OUTLIB:.+\.a]]" "-unbundle" -// FOFFLOAD_STATIC_LIB_SRC2: llvm-link{{(.exe)?}}{{.*}} "[[OUTLIB]]" +// FOFFLOAD_STATIC_LIB_SRC2: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=aoo" "-targets=sycl-spir64-{{.+}}" "-inputs={{.*}}-orig.lib" "-outputs=[[OUTLIB:.+\.a]]" "-unbundle" +// FOFFLOAD_STATIC_LIB_SRC2: spir-to-ir-wrapper{{.*}} "[[OUTLIB]]" "-o" "[[OUTLIST:.+\.txt]]" +// FOFFLOAD_STATIC_LIB_SRC2: llvm-link{{(.exe)?}}{{.*}} "@[[OUTLIST]]" // FOFFLOAD_STATIC_LIB_SRC2: link{{(.exe)?}}{{.+}} "{{.*}}-orig.lib" // Check for /P behaviors diff --git a/clang/test/Driver/sycl-offload-with-split.c b/clang/test/Driver/sycl-offload-with-split.c index 7ab6c50470197..bb71d9dfa91e7 100644 --- a/clang/test/Driver/sycl-offload-with-split.c +++ b/clang/test/Driver/sycl-offload-with-split.c @@ -122,13 +122,14 @@ // CHK-UBACTIONS: 1: input, "[[INPUT]]", object, (host-sycl) // CHK-UBACTIONS: 2: clang-offload-unbundler, {1}, object, (host-sycl) // CHK-UBACTIONS: 3: linker, {0, 2}, image, (host-sycl) -// CHK-UBACTIONS: 4: linker, {2}, ir, (device-sycl) -// CHK-UBACTIONS: 5: sycl-post-link, {4}, tempfiletable, (device-sycl) -// CHK-UBACTIONS: 6: file-table-tform, {5}, tempfilelist, (device-sycl) -// CHK-UBACTIONS: 7: llvm-spirv, {6}, tempfilelist, (device-sycl) -// CHK-UBACTIONS: 8: file-table-tform, {5, 7}, tempfiletable, (device-sycl) -// CHK-UBACTIONS: 9: clang-offload-wrapper, {8}, object, (device-sycl) -// CHK-UBACTIONS: 10: offload, "host-sycl (x86_64-unknown-linux-gnu)" {3}, "device-sycl (spir64-unknown-unknown)" {9}, image +// CHK-UBACTIONS: 4: spir-to-ir-wrapper, {2}, ir, (device-sycl) +// CHK-UBACTIONS: 5: linker, {4}, ir, (device-sycl) +// CHK-UBACTIONS: 6: sycl-post-link, {5}, tempfiletable, (device-sycl) +// CHK-UBACTIONS: 7: file-table-tform, {6}, tempfilelist, (device-sycl) +// CHK-UBACTIONS: 8: llvm-spirv, {7}, tempfilelist, (device-sycl) +// CHK-UBACTIONS: 9: file-table-tform, {6, 8}, tempfiletable, (device-sycl) +// CHK-UBACTIONS: 10: clang-offload-wrapper, {9}, object, (device-sycl) +// CHK-UBACTIONS: 11: offload, "host-sycl (x86_64-unknown-linux-gnu)" {3}, "device-sycl (spir64-unknown-unknown)" {10}, image /// ########################################################################### @@ -150,13 +151,14 @@ // CHK-UBUACTIONS: 11: backend, {10}, assembler, (host-sycl) // CHK-UBUACTIONS: 12: assembler, {11}, object, (host-sycl) // CHK-UBUACTIONS: 13: linker, {0, 2, 12}, image, (host-sycl) -// CHK-UBUACTIONS: 14: linker, {2, 8}, ir, (device-sycl) -// CHK-UBUACTIONS: 15: sycl-post-link, {14}, tempfiletable, (device-sycl) -// CHK-UBUACTIONS: 16: file-table-tform, {15}, tempfilelist, (device-sycl) -// CHK-UBUACTIONS: 17: llvm-spirv, {16}, tempfilelist, (device-sycl) -// CHK-UBUACTIONS: 18: file-table-tform, {15, 17}, tempfiletable, (device-sycl) -// CHK-UBUACTIONS: 19: clang-offload-wrapper, {18}, object, (device-sycl) -// CHK-UBUACTIONS: 20: offload, "host-sycl (x86_64-unknown-linux-gnu)" {13}, "device-sycl (spir64-unknown-unknown)" {19}, image +// CHK-UBUACTIONS: 14: spir-to-ir-wrapper, {2}, ir, (device-sycl) +// CHK-UBUACTIONS: 15: linker, {14, 8}, ir, (device-sycl) +// CHK-UBUACTIONS: 16: sycl-post-link, {15}, tempfiletable, (device-sycl) +// CHK-UBUACTIONS: 17: file-table-tform, {16}, tempfilelist, (device-sycl) +// CHK-UBUACTIONS: 18: llvm-spirv, {17}, tempfilelist, (device-sycl) +// CHK-UBUACTIONS: 19: file-table-tform, {16, 18}, tempfiletable, (device-sycl) +// CHK-UBUACTIONS: 20: clang-offload-wrapper, {19}, object, (device-sycl) +// CHK-UBUACTIONS: 21: offload, "host-sycl (x86_64-unknown-linux-gnu)" {13}, "device-sycl (spir64-unknown-unknown)" {20}, image /// ########################################################################### diff --git a/clang/test/Driver/sycl-offload.c b/clang/test/Driver/sycl-offload.c index 6ea8c915837ae..e341832e06fe4 100644 --- a/clang/test/Driver/sycl-offload.c +++ b/clang/test/Driver/sycl-offload.c @@ -347,13 +347,14 @@ // CHK-UBACTIONS: 1: input, "[[INPUT]]", object, (host-sycl) // CHK-UBACTIONS: 2: clang-offload-unbundler, {1}, object, (host-sycl) // CHK-UBACTIONS: 3: linker, {0, 2}, image, (host-sycl) -// CHK-UBACTIONS: 4: linker, {2}, ir, (device-sycl) -// CHK-UBACTIONS: 5: sycl-post-link, {4}, tempfiletable, (device-sycl) -// CHK-UBACTIONS: 6: file-table-tform, {5}, tempfilelist, (device-sycl) -// CHK-UBACTIONS: 7: llvm-spirv, {6}, tempfilelist, (device-sycl) -// CHK-UBACTIONS: 8: file-table-tform, {5, 7}, tempfiletable, (device-sycl) -// CHK-UBACTIONS: 9: clang-offload-wrapper, {8}, object, (device-sycl) -// CHK-UBACTIONS: 10: offload, "host-sycl (x86_64-unknown-linux-gnu)" {3}, "device-sycl (spir64-unknown-unknown)" {9}, image +// CHK-UBACTIONS: 4: spir-to-ir-wrapper, {2}, ir, (device-sycl) +// CHK-UBACTIONS: 5: linker, {4}, ir, (device-sycl) +// CHK-UBACTIONS: 6: sycl-post-link, {5}, tempfiletable, (device-sycl) +// CHK-UBACTIONS: 7: file-table-tform, {6}, tempfilelist, (device-sycl) +// CHK-UBACTIONS: 8: llvm-spirv, {7}, tempfilelist, (device-sycl) +// CHK-UBACTIONS: 9: file-table-tform, {6, 8}, tempfiletable, (device-sycl) +// CHK-UBACTIONS: 10: clang-offload-wrapper, {9}, object, (device-sycl) +// CHK-UBACTIONS: 11: offload, "host-sycl (x86_64-unknown-linux-gnu)" {3}, "device-sycl (spir64-unknown-unknown)" {10}, image /// ########################################################################### @@ -375,13 +376,14 @@ // CHK-UBUACTIONS: 11: backend, {10}, assembler, (host-sycl) // CHK-UBUACTIONS: 12: assembler, {11}, object, (host-sycl) // CHK-UBUACTIONS: 13: linker, {0, 2, 12}, image, (host-sycl) -// CHK-UBUACTIONS: 14: linker, {2, 8}, ir, (device-sycl) -// CHK-UBUACTIONS: 15: sycl-post-link, {14}, tempfiletable, (device-sycl) -// CHK-UBUACTIONS: 16: file-table-tform, {15}, tempfilelist, (device-sycl) -// CHK-UBUACTIONS: 17: llvm-spirv, {16}, tempfilelist, (device-sycl) -// CHK-UBUACTIONS: 18: file-table-tform, {15, 17}, tempfiletable, (device-sycl) -// CHK-UBUACTIONS: 19: clang-offload-wrapper, {18}, object, (device-sycl) -// CHK-UBUACTIONS: 20: offload, "host-sycl (x86_64-unknown-linux-gnu)" {13}, "device-sycl (spir64-unknown-unknown)" {19}, image +// CHK-UBUACTIONS: 14: spir-to-ir-wrapper, {2}, ir, (device-sycl) +// CHK-UBUACTIONS: 15: linker, {14, 8}, ir, (device-sycl) +// CHK-UBUACTIONS: 16: sycl-post-link, {15}, tempfiletable, (device-sycl) +// CHK-UBUACTIONS: 17: file-table-tform, {16}, tempfilelist, (device-sycl) +// CHK-UBUACTIONS: 18: llvm-spirv, {17}, tempfilelist, (device-sycl) +// CHK-UBUACTIONS: 19: file-table-tform, {16, 18}, tempfiletable, (device-sycl) +// CHK-UBUACTIONS: 20: clang-offload-wrapper, {19}, object, (device-sycl) +// CHK-UBUACTIONS: 21: offload, "host-sycl (x86_64-unknown-linux-gnu)" {13}, "device-sycl (spir64-unknown-unknown)" {20}, image /// ########################################################################### diff --git a/clang/test/Driver/sycl-offload.cpp b/clang/test/Driver/sycl-offload.cpp index 6783ff43ae914..9b60b46e3eff8 100644 --- a/clang/test/Driver/sycl-offload.cpp +++ b/clang/test/Driver/sycl-offload.cpp @@ -78,7 +78,7 @@ // RUN: | FileCheck -check-prefix IMPLIED_DEVICE_LIB %s // RUN: %clangxx -### -target x86_64-unknown-linux-gnu -fsycl -fintelfpga %S/Inputs/SYCL/liblin64.a %s 2>&1 \ // RUN: | FileCheck -check-prefix IMPLIED_DEVICE_LIB %s -// IMPLIED_DEVICE_LIB: clang-offload-bundler{{.*}} "-type=a"{{.*}} "-targets=sycl-spir64_{{.*}}-unknown-unknown,sycl-spir64-unknown-unknown"{{.*}} "-unbundle" +// IMPLIED_DEVICE_LIB: clang-offload-bundler{{.*}} "-type=aoo"{{.*}} "-targets=sycl-spir64_{{.*}}-unknown-unknown,sycl-spir64-unknown-unknown"{{.*}} "-unbundle" /// Check that the default device triple is not used with -fno-sycl-link-spirv // RUN: %clangxx -### -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-link-spirv -fsycl-targets=spir64_x86_64 %S/Inputs/SYCL/objlin64.o %s 2>&1 \ From 33fd07bd24e322eb3684645822da6357632326fe Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Mon, 20 Dec 2021 07:19:41 -0800 Subject: [PATCH 07/12] clang format --- clang/test/Driver/sycl-intelfpga-aoco.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/clang/test/Driver/sycl-intelfpga-aoco.cpp b/clang/test/Driver/sycl-intelfpga-aoco.cpp index 439e43ae7269e..0aacbc0d73a3b 100755 --- a/clang/test/Driver/sycl-intelfpga-aoco.cpp +++ b/clang/test/Driver/sycl-intelfpga-aoco.cpp @@ -95,7 +95,6 @@ // CHK-FPGA-AOCO-PHASES-EMU: 25: clang-offload-wrapper, {24}, object, (device-sycl) // CHK-FPGA-AOCO-PHASES-EMU: 26: offload, "host-sycl (x86_64-unknown-linux-gnu)" {11}, "device-sycl (spir64_fpga-unknown-unknown)" {25}, image - /// aoco emulation test, checking tools // RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all -fintelfpga %t_aoco.a -### %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO-EMU,CHK-FPGA-AOCO-EMU-LIN %s From 190ad935c32297be550332b87bdf564b22f48d4b Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Mon, 20 Dec 2021 09:19:05 -0800 Subject: [PATCH 08/12] Fix test for Windows --- .../Driver/sycl-intelfpga-static-lib-win.cpp | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/clang/test/Driver/sycl-intelfpga-static-lib-win.cpp b/clang/test/Driver/sycl-intelfpga-static-lib-win.cpp index e14edc1879037..6402e5c3d5eba 100644 --- a/clang/test/Driver/sycl-intelfpga-static-lib-win.cpp +++ b/clang/test/Driver/sycl-intelfpga-static-lib-win.cpp @@ -19,16 +19,17 @@ // CHECK_PHASES: 3: clang-offload-deps, {2}, ir, (host-sycl) // CHECK_PHASES: 4: input, "[[INPUT]]", archive // CHECK_PHASES: 5: clang-offload-unbundler, {4}, archive -// CHECK_PHASES: 6: linker, {3, 5}, ir, (device-sycl) -// CHECK_PHASES: 7: sycl-post-link, {6}, tempfiletable, (device-sycl) -// CHECK_PHASES: 8: file-table-tform, {7}, tempfilelist, (device-sycl) -// CHECK_PHASES: 9: llvm-spirv, {8}, tempfilelist, (device-sycl) -// CHECK_PHASES: 10: input, "[[INPUT]]", archive -// CHECK_PHASES: 11: clang-offload-unbundler, {10}, fpga_dep_list -// CHECK_PHASES: 12: backend-compiler, {9, 11}, fpga_aocx, (device-sycl) -// CHECK_PHASES: 13: file-table-tform, {7, 12}, tempfiletable, (device-sycl) -// CHECK_PHASES: 14: clang-offload-wrapper, {13}, object, (device-sycl) -// CHECK_PHASES: 15: offload, "host-sycl (x86_64-pc-windows-msvc)" {1}, "device-sycl (spir64_fpga-unknown-unknown)" {14}, image +// CHECK_PHASES: 6: spir-to-ir-wrapper, {5}, tempfilelist, (device-sycl) +// CHECK_PHASES: 7: linker, {3, 6}, ir, (device-sycl) +// CHECK_PHASES: 8: sycl-post-link, {7}, tempfiletable, (device-sycl) +// CHECK_PHASES: 9: file-table-tform, {8}, tempfilelist, (device-sycl) +// CHECK_PHASES: 10: llvm-spirv, {9}, tempfilelist, (device-sycl) +// CHECK_PHASES: 11: input, "[[INPUT]]", archive +// CHECK_PHASES: 12: clang-offload-unbundler, {11}, fpga_dep_list +// CHECK_PHASES: 13: backend-compiler, {10, 12}, fpga_aocx, (device-sycl) +// CHECK_PHASES: 14: file-table-tform, {8, 13}, tempfiletable, (device-sycl) +// CHECK_PHASES: 15: clang-offload-wrapper, {14}, object, (device-sycl) +// CHECK_PHASES: 16: offload, "host-sycl (x86_64-pc-windows-msvc)" {1}, "device-sycl (spir64_fpga-unknown-unknown)" {15}, image /// Check for unbundle and use of deps in static lib // RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl -fno-sycl-device-lib=all -fintelfpga -Xshardware %t.lib -### 2>&1 \ From 50415d0249dc39eed84ab4a741408dc1d16ab829 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Tue, 21 Dec 2021 09:43:35 -0800 Subject: [PATCH 09/12] Adjust option passing for additional llvm-spirv opts --- llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp b/llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp index 316bf3f64e97e..ef408642458a9 100644 --- a/llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp +++ b/llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp @@ -65,15 +65,16 @@ static int convertSPIRVToLLVMIR(const char *Argv0) { "-o", Output}; // Add any additional options specified by the user. + SmallVector TargetArgs; + llvm::BumpPtrAllocator BPA; + llvm::StringSaver S(BPA); if (!LlvmSpirvOpts.empty()) { - SmallVector TargetArgs; - llvm::BumpPtrAllocator BPA; - llvm::StringSaver S(BPA); // Tokenize the string. llvm::cl::TokenizeGNUCommandLine(LlvmSpirvOpts, S, TargetArgs); - llvm::transform(TargetArgs, std::back_inserter(LlvmSpirvArgs), - [](StringRef A) { return SmallString<32>(A); }); + std::copy(TargetArgs.begin(), TargetArgs.end(), + std::back_inserter(LlvmSpirvArgs)); } + return llvm::sys::ExecuteAndWait(LlvmSpirvBinary.get(), LlvmSpirvArgs); } From 34cd276b3c2dcd1bbe0da08fbdde5da7b1ec7336 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Tue, 21 Dec 2021 10:09:21 -0800 Subject: [PATCH 10/12] Add codeowners for the new tool --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 33b7fcf1b442d..b525efb4fb804 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -84,6 +84,7 @@ llvm/**/append-file/ @mdtoguchi @AGindinson llvm/**/file-table-tform/ @mlychkov @AlexeySachkov @kbobrovs llvm/**/llvm-foreach/ @AlexeySachkov @Fznamznon llvm/**/llvm-no-spir-kernel/ @AGindinson @AlexeySachkov +llvm/**/spir-to-ir-wrapper/ @mdtoguchi @AGindinson llvm/**/sycl-post-link/ @mlychkov @AlexeySachkov @kbobrovs llvm/include/llvm/Support/PropertySetIO.h @mlychkov @AlexeySachkov @kbobrovs llvm/lib/Support/PropertySetIO.cpp @mlychkov @AlexeySachkov @kbobrovs From bf24e013ec23ebf19c0fc50829ee14e750694172 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Tue, 28 Dec 2021 08:48:30 -0800 Subject: [PATCH 11/12] Address review comments for copy func --- llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp b/llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp index ef408642458a9..f321b6a37b2cb 100644 --- a/llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp +++ b/llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp @@ -78,12 +78,8 @@ static int convertSPIRVToLLVMIR(const char *Argv0) { return llvm::sys::ExecuteAndWait(LlvmSpirvBinary.get(), LlvmSpirvArgs); } -static int copyInputToOutput(void) { - // When given an output file, just copy the input to the output - if (!Output.empty() && !InputFilename.empty()) { - llvm::sys::fs::copy_file(InputFilename, Output); - } - return 0; +static int copyInputToOutput() { + return llvm::sys::fs::copy_file(InputFilename, Output).value(); } static bool isSPIRVBinary(const std::string &File) { From f1e81a6635b1d2fd9f23be6905e1bc48218f6f17 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Wed, 29 Dec 2021 08:47:11 -0800 Subject: [PATCH 12/12] [NFC] rename tool to spirv-to-ir-wrapper --- llvm/test/CMakeLists.txt | 2 +- .../spirv-to-ir-wrapper.ll} | 4 ++-- .../CMakeLists.txt | 4 ++-- .../spirv-to-ir-wrapper.cpp} | 12 ++++++------ sycl/CMakeLists.txt | 4 ++-- 5 files changed, 13 insertions(+), 13 deletions(-) rename llvm/test/tools/{spir-to-ir-wrapper/spir-to-ir-wrapper.ll => spirv-to-ir-wrapper/spirv-to-ir-wrapper.ll} (94%) rename llvm/tools/{spir-to-ir-wrapper => spirv-to-ir-wrapper}/CMakeLists.txt (69%) rename llvm/tools/{spir-to-ir-wrapper/spir-to-ir-wrapper.cpp => spirv-to-ir-wrapper/spirv-to-ir-wrapper.cpp} (92%) diff --git a/llvm/test/CMakeLists.txt b/llvm/test/CMakeLists.txt index 91e35e8374b78..73f1b3ae7d3e5 100644 --- a/llvm/test/CMakeLists.txt +++ b/llvm/test/CMakeLists.txt @@ -135,7 +135,7 @@ set(LLVM_TEST_DEPENDS opt sancov sanstats - spir-to-ir-wrapper + spirv-to-ir-wrapper sycl-post-link split-file verify-uselistorder diff --git a/llvm/test/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.ll b/llvm/test/tools/spirv-to-ir-wrapper/spirv-to-ir-wrapper.ll similarity index 94% rename from llvm/test/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.ll rename to llvm/test/tools/spirv-to-ir-wrapper/spirv-to-ir-wrapper.ll index a17716e3e53b8..05bf5cce9f20c 100644 --- a/llvm/test/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.ll +++ b/llvm/test/tools/spirv-to-ir-wrapper/spirv-to-ir-wrapper.ll @@ -1,12 +1,12 @@ ; Check for passthrough abilities ; RUN: llvm-as %s -o %t.bc -; RUN: spir-to-ir-wrapper %t.bc -o %t_1.bc +; RUN: spirv-to-ir-wrapper %t.bc -o %t_1.bc ; RUN: llvm-dis %t_1.bc -o %t_1.ll ; RUN: FileCheck %s --input-file %t_1.ll ; Check for SPIR-V conversion ; RUN: llvm-spirv %t.bc -o %t.spv -; RUN: spir-to-ir-wrapper %t.spv -o %t_2.bc +; RUN: spirv-to-ir-wrapper %t.spv -o %t_2.bc ; RUN: llvm-dis %t_2.bc -o %t_2.ll ; RUN: FileCheck %s --input-file %t_2.ll diff --git a/llvm/tools/spir-to-ir-wrapper/CMakeLists.txt b/llvm/tools/spirv-to-ir-wrapper/CMakeLists.txt similarity index 69% rename from llvm/tools/spir-to-ir-wrapper/CMakeLists.txt rename to llvm/tools/spirv-to-ir-wrapper/CMakeLists.txt index 8dbb43ae59f9b..09f319dcf8896 100644 --- a/llvm/tools/spir-to-ir-wrapper/CMakeLists.txt +++ b/llvm/tools/spirv-to-ir-wrapper/CMakeLists.txt @@ -8,6 +8,6 @@ include_directories( ${LLVM_EXTERNAL_LLVM_SPIRV_SOURCE_DIR}/include ) -add_llvm_tool(spir-to-ir-wrapper - spir-to-ir-wrapper.cpp +add_llvm_tool(spirv-to-ir-wrapper + spirv-to-ir-wrapper.cpp ) diff --git a/llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp b/llvm/tools/spirv-to-ir-wrapper/spirv-to-ir-wrapper.cpp similarity index 92% rename from llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp rename to llvm/tools/spirv-to-ir-wrapper/spirv-to-ir-wrapper.cpp index f321b6a37b2cb..a54c805b760ee 100644 --- a/llvm/tools/spir-to-ir-wrapper/spir-to-ir-wrapper.cpp +++ b/llvm/tools/spirv-to-ir-wrapper/spirv-to-ir-wrapper.cpp @@ -1,4 +1,4 @@ -//===--- spir-to-ir-wrapper.cpp - Utility to convert to ir if needed ------===// +//===--- spirv-to-ir-wrapper.cpp - Utility to convert to ir if needed -----===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// // -// This utility checks if the input file is SPIR based. If so, convert to IR +// This utility checks if the input file is SPIR-V based. If so, convert to IR // The input can be either SPIR-V or LLVM-IR. When LLVM-IR, copy the file to // the specified output. // @@ -15,7 +15,7 @@ // The output file is used to allow for proper input and output flow within // the driver toolchain. // -// Usage: spir-to-ir-wrapper input.spv -o output.bc +// Usage: spirv-to-ir-wrapper input.spv -o output.bc // //===----------------------------------------------------------------------===// @@ -47,14 +47,14 @@ static cl::opt cl::desc("options to pass to llvm-spirv")); static void error(const Twine &Message) { - llvm::errs() << "spir-to-ir-wrapper: " << Message << '\n'; + llvm::errs() << "spirv-to-ir-wrapper: " << Message << '\n'; exit(1); } // Convert the SPIR-V to LLVM-IR. static int convertSPIRVToLLVMIR(const char *Argv0) { // Find llvm-spirv. It is expected this resides in the same directory - // as spir-to-ir-wrapper. + // as spirv-to-ir-wrapper. StringRef ParentPath = llvm::sys::path::parent_path(Argv0); llvm::ErrorOr LlvmSpirvBinary = llvm::sys::findProgramByName("llvm-spirv", ParentPath); @@ -123,7 +123,7 @@ int main(int argc, char **argv) { InitLLVM X(argc, argv); LLVMContext Context; - cl::ParseCommandLineOptions(argc, argv, "spir-to-ir-wrapper\n"); + cl::ParseCommandLineOptions(argc, argv, "spirv-to-ir-wrapper\n"); if (InputFilename.empty()) error("No input file provided"); diff --git a/sycl/CMakeLists.txt b/sycl/CMakeLists.txt index 47a4cfc65c022..1f7fdb0411e63 100644 --- a/sycl/CMakeLists.txt +++ b/sycl/CMakeLists.txt @@ -229,7 +229,7 @@ add_custom_target(sycl-compiler llvm-spirv llvm-link llvm-objcopy - spir-to-ir-wrapper + spirv-to-ir-wrapper sycl-post-link opencl-aot ) @@ -293,7 +293,7 @@ set( SYCL_TOOLCHAIN_DEPLOY_COMPONENTS llvm-spirv llvm-link llvm-objcopy - spir-to-ir-wrapper + spirv-to-ir-wrapper sycl-post-link sycl-ls clang-resource-headers