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