From 21b1e16c2db4fd62e5b90cfa9aef5959828b820c Mon Sep 17 00:00:00 2001 From: Artem Gindinson Date: Wed, 22 Jan 2020 19:53:11 +0300 Subject: [PATCH 1/3] [SYCL] Improve the error mechanism of llvm-no-spir-kernel This patch improves the tool's diagnostic upon finding a SPIR kernel within an LLVM module. Despite that the tool's only current use is within the SYCL FPGA flow, it's important to make the message target-agnostic, so that the tool is not tied to a particular device BE. A related commit to the Clang driver has extended these diagnostics with SYCL FPGA specifics without affecting the tool itself. This patch also introduces testing for the return code value. For example, this should allow the Clang driver users/developers to differentiate between the two possible causes of llvm-no-spir-kernel failure. Signed-off-by: Artem Gindinson --- .../llvm-no-spir-kernel/has-spir-kernel.ll | 7 +++++-- .../llvm-no-spir-kernel/has-spir-kernel2.ll | 9 ++++++-- .../llvm-no-spir-kernel/invalid-input.ll | 2 ++ .../llvm-no-spir-kernel.cpp | 21 ++++++++++++++----- 4 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 llvm/test/tools/llvm-no-spir-kernel/invalid-input.ll diff --git a/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel.ll b/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel.ll index b0f6b84fd4164..398d250ceef23 100755 --- a/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel.ll +++ b/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel.ll @@ -1,9 +1,12 @@ -; RUN: not llvm-no-spir-kernel %s +; RUN: not llvm-no-spir-kernel %s 2>&1 | FileCheck %s ; expected failure +; CHECK: error: Unexpected SPIR kernel occurrence: foo define spir_kernel void @foo() { bb: ret void } - +; Check the return code +; RUN: llvm-no-spir-kernel %s; \ +; RUN: if [ $? = 1 ]; then exit 0; else exit 1; fi diff --git a/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel2.ll b/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel2.ll index 32fcf6f77003e..f3d2f3db779d1 100755 --- a/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel2.ll +++ b/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel2.ll @@ -1,14 +1,19 @@ -; RUN: not llvm-no-spir-kernel %s -; expected failure +; RUN: not llvm-no-spir-kernel %s 2>&1 | FileCheck %s +; expected no failures define void @foo() { bb: ret void } ; expected failure +; CHECK: error: Unexpected SPIR kernel occurrence: +; CHECK-SAME: foo2 define spir_kernel void @foo2() { bb: ret void } +; Check the return code +; RUN: llvm-no-spir-kernel %s; \ +; RUN: if [ $? = 1 ]; then exit 0; else exit 1; fi diff --git a/llvm/test/tools/llvm-no-spir-kernel/invalid-input.ll b/llvm/test/tools/llvm-no-spir-kernel/invalid-input.ll new file mode 100644 index 0000000000000..dab8826bef675 --- /dev/null +++ b/llvm/test/tools/llvm-no-spir-kernel/invalid-input.ll @@ -0,0 +1,2 @@ +; RUN: echo garbage > garbage.ll +; RUN: not llvm-no-spir-kernel garbage.ll diff --git a/llvm/tools/llvm-no-spir-kernel/llvm-no-spir-kernel.cpp b/llvm/tools/llvm-no-spir-kernel/llvm-no-spir-kernel.cpp index ada07eb14ad41..8d7615af68af1 100644 --- a/llvm/tools/llvm-no-spir-kernel/llvm-no-spir-kernel.cpp +++ b/llvm/tools/llvm-no-spir-kernel/llvm-no-spir-kernel.cpp @@ -6,15 +6,20 @@ // //===----------------------------------------------------------------------===// // -// This utility checks if the input module contains functions that is a spir -// kernel. Return 0 if no, return 1 if yes. Use of an output file is not -// required for a successful check. It is used to allow for proper input and -// output flow within the driver toolchain. +// This utility checks if the input module contains functions that are a SPIR +// kernel. +// +// - Return 0 if the LLVM module is "clean" from SPIR kernels +// - Return 1 upon the first SPIR kernel occurence +// +// Use of an output file is not required for a successful check. It is used +// to allow for proper input and output flow within the driver toolchain. // // Usage: llvm-no-spir-kernel input.bc/input.ll -o output.bc/output.ll // //===----------------------------------------------------------------------===// +#include "llvm/Demangle/Demangle.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/IRReader/IRReader.h" @@ -44,15 +49,21 @@ int main(int argc, char **argv) { // Use lazy loading, since we only care about function calling convention SMDiagnostic Err; + const char *ProgramName = llvm::sys::path::filename(argv[0]).data(); std::unique_ptr M = getLazyIRFileModule(InputFilename, Err, Context); if (!M.get()) { - Err.print(argv[0], errs()); + Err.print(ProgramName, errs()); return 1; } for (auto &F : *M) { if (F.getCallingConv() == CallingConv::SPIR_KERNEL) { + std::string SPIRKernelMsg = + "Unexpected SPIR kernel occurrence: " + demangle(F.getName().str()); + SMDiagnostic SPIRKernelDiag(InputFilename, SourceMgr::DiagKind::DK_Error, + SPIRKernelMsg); + SPIRKernelDiag.print(ProgramName, errs()); return 1; } } From eb923407998d1adf3afeaa7490cda6d07dd13f13 Mon Sep 17 00:00:00 2001 From: Artem Gindinson Date: Mon, 17 Feb 2020 06:02:41 +0300 Subject: [PATCH 2/3] Introduce a Linux-specific return code test Signed-off-by: Artem Gindinson --- llvm/test/tools/llvm-no-spir-kernel/error-code.ll | 11 +++++++++++ .../test/tools/llvm-no-spir-kernel/has-spir-kernel.ll | 4 ---- .../tools/llvm-no-spir-kernel/has-spir-kernel2.ll | 4 ---- 3 files changed, 11 insertions(+), 8 deletions(-) create mode 100644 llvm/test/tools/llvm-no-spir-kernel/error-code.ll diff --git a/llvm/test/tools/llvm-no-spir-kernel/error-code.ll b/llvm/test/tools/llvm-no-spir-kernel/error-code.ll new file mode 100644 index 0000000000000..ea556960180a3 --- /dev/null +++ b/llvm/test/tools/llvm-no-spir-kernel/error-code.ll @@ -0,0 +1,11 @@ +; UNSUPPORTED: system-windows + +; Check the return code +; RUN: llvm-no-spir-kernel %s; \ +; RUN: if [ $? = 1 ]; then exit 0; else exit 1; fi + +; expected failure +define spir_kernel void @foo() { +bb: + ret void +} diff --git a/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel.ll b/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel.ll index 398d250ceef23..feed58769a106 100755 --- a/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel.ll +++ b/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel.ll @@ -6,7 +6,3 @@ define spir_kernel void @foo() { bb: ret void } - -; Check the return code -; RUN: llvm-no-spir-kernel %s; \ -; RUN: if [ $? = 1 ]; then exit 0; else exit 1; fi diff --git a/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel2.ll b/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel2.ll index f3d2f3db779d1..a1f8990b46429 100755 --- a/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel2.ll +++ b/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel2.ll @@ -13,7 +13,3 @@ define spir_kernel void @foo2() { bb: ret void } - -; Check the return code -; RUN: llvm-no-spir-kernel %s; \ -; RUN: if [ $? = 1 ]; then exit 0; else exit 1; fi From 6b58ea41752679089071313349e08ebb0dab32ec Mon Sep 17 00:00:00 2001 From: Artem Gindinson Date: Mon, 17 Feb 2020 15:36:31 +0300 Subject: [PATCH 3/3] Remove the duplicating test Signed-off-by: Artem Gindinson --- .../tools/llvm-no-spir-kernel/has-spir-kernel.ll | 11 +++++++++-- .../tools/llvm-no-spir-kernel/has-spir-kernel2.ll | 15 --------------- 2 files changed, 9 insertions(+), 17 deletions(-) delete mode 100755 llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel2.ll diff --git a/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel.ll b/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel.ll index feed58769a106..a1f8990b46429 100755 --- a/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel.ll +++ b/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel.ll @@ -1,8 +1,15 @@ ; RUN: not llvm-no-spir-kernel %s 2>&1 | FileCheck %s +; expected no failures +define void @foo() { +bb: + ret void +} + ; expected failure -; CHECK: error: Unexpected SPIR kernel occurrence: foo -define spir_kernel void @foo() { +; CHECK: error: Unexpected SPIR kernel occurrence: +; CHECK-SAME: foo2 +define spir_kernel void @foo2() { bb: ret void } diff --git a/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel2.ll b/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel2.ll deleted file mode 100755 index a1f8990b46429..0000000000000 --- a/llvm/test/tools/llvm-no-spir-kernel/has-spir-kernel2.ll +++ /dev/null @@ -1,15 +0,0 @@ -; RUN: not llvm-no-spir-kernel %s 2>&1 | FileCheck %s - -; expected no failures -define void @foo() { -bb: - ret void -} - -; expected failure -; CHECK: error: Unexpected SPIR kernel occurrence: -; CHECK-SAME: foo2 -define spir_kernel void @foo2() { -bb: - ret void -}