From a42a50dcf26d126e8079950369dfaf555e901078 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Wed, 17 Nov 2021 15:49:26 -0800 Subject: [PATCH 1/8] [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 2/8] 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 3/8] 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 15d84db9ab8e6ad6211282bfaaa1bca2bf62d0c6 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Sun, 19 Dec 2021 09:24:10 -0800 Subject: [PATCH 4/8] 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 50415d0249dc39eed84ab4a741408dc1d16ab829 Mon Sep 17 00:00:00 2001 From: Michael D Toguchi Date: Tue, 21 Dec 2021 09:43:35 -0800 Subject: [PATCH 5/8] 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 6/8] 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 7/8] 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 8/8] [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