From b79672e3f10559e72a2adfcff86f59ac6b93e0a1 Mon Sep 17 00:00:00 2001 From: Daria Hinz Date: Mon, 6 Jul 2020 18:59:05 +0200 Subject: [PATCH] Cmd line option to generate only spirV file Related-to: NEO-4678 Change-Id: I502aede9f6e0796c1319d9c242a8b9095253cb88 Signed-off-by: Daria Hinz --- .../offline_compiler_tests.cpp | 32 +++++++++++++++++++ .../source/offline_compiler.cpp | 11 +++++-- .../source/offline_compiler.h | 5 +++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/opencl/test/unit_test/offline_compiler/offline_compiler_tests.cpp b/opencl/test/unit_test/offline_compiler/offline_compiler_tests.cpp index 3b17f47dd0..b9bd805401 100644 --- a/opencl/test/unit_test/offline_compiler/offline_compiler_tests.cpp +++ b/opencl/test/unit_test/offline_compiler/offline_compiler_tests.cpp @@ -727,6 +727,38 @@ TEST(OfflineCompilerTest, buildSourceCode) { EXPECT_NE(0u, mockOfflineCompiler->genBinarySize); } +TEST(OfflineCompilerTest, givenSpvOnlyOptionPassedWhenCmdLineParsedThenGenerateOnlySpvFile) { + std::vector argv = { + "ocloc", + "-file", + "test_files/copybuffer.cl", + "-output", + "myOutputFileName", + "-spv_only", + "-device", + gEnvironment->devicePrefix.c_str()}; + + auto mockOfflineCompiler = std::unique_ptr(new MockOfflineCompiler()); + ASSERT_NE(nullptr, mockOfflineCompiler); + + auto retVal = mockOfflineCompiler->initialize(argv.size(), argv); + EXPECT_EQ(CL_SUCCESS, retVal); + + EXPECT_FALSE(compilerOutputExists("myOutputFileName", "bc") || compilerOutputExists("myOutputFileName", "spv")); + EXPECT_FALSE(compilerOutputExists("myOutputFileName", "bin")); + EXPECT_FALSE(compilerOutputExists("myOutputFileName", "gen")); + + retVal = mockOfflineCompiler->build(); + EXPECT_EQ(CL_SUCCESS, retVal); + + EXPECT_TRUE(compilerOutputExists("myOutputFileName", "bc") || compilerOutputExists("myOutputFileName", "spv")); + EXPECT_FALSE(compilerOutputExists("myOutputFileName", "bin")); + EXPECT_FALSE(compilerOutputExists("myOutputFileName", "gen")); + + compilerOutputRemove("myOutputFileName", "bc"); + compilerOutputRemove("myOutputFileName", "spv"); +} + TEST(OfflineCompilerTest, GivenKernelWhenNoCharAfterKernelSourceThenBuildWithSuccess) { auto mockOfflineCompiler = std::unique_ptr(new MockOfflineCompiler()); ASSERT_NE(nullptr, mockOfflineCompiler); diff --git a/shared/offline_compiler/source/offline_compiler.cpp b/shared/offline_compiler/source/offline_compiler.cpp index 80f3b9979d..19a982337c 100644 --- a/shared/offline_compiler/source/offline_compiler.cpp +++ b/shared/offline_compiler/source/offline_compiler.cpp @@ -203,8 +203,11 @@ int OfflineCompiler::buildSourceCode() { int OfflineCompiler::build() { int retVal = SUCCESS; - - retVal = buildSourceCode(); + if (isOnlySpirV()) { + retVal = buildIrBinary(); + } else { + retVal = buildSourceCode(); + } generateElfBinary(); if (dumpFiles) { writeOutAllFiles(); @@ -514,6 +517,8 @@ int OfflineCompiler::parseCommandLine(size_t numArgs, const std::vectorgetPrinterRef() = MessagePrinter(true); quiet = true; + } else if ("-spv_only" == currArg) { + onlySpirV = true; } else if ("-output_no_suffix" == currArg) { outputNoSuffix = true; } else if ("--help" == currArg) { @@ -770,6 +775,8 @@ Usage: ocloc [compile] -file -device [-output