From df2e31dbb07339d84f32b183c87240f204a00637 Mon Sep 17 00:00:00 2001 From: Dominik Dabek Date: Thu, 23 Dec 2021 15:28:36 +0000 Subject: [PATCH] Print ocloc options from file on fail if quiet Currently if ocloc fails and options are read from file, no information about them will be printed or logged if -q is passed. With this change, ocloc will print options read from file on compilation or initialization error. Related-To: NEO-6002 Signed-off-by: Dominik Dabek --- opencl/test/unit_test/CMakeLists.txt | 1 + .../offline_compiler/ocloc_api_tests.cpp | 60 ++++++++++++++++++- .../offline_compiler_tests.cpp | 4 ++ .../test/unit_test/test_files/valid_kernel.cl | 12 ++++ .../test_files/valid_kernel_ocloc_options.txt | 8 +++ shared/offline_compiler/source/ocloc_api.cpp | 19 +++++- .../source/offline_compiler.cpp | 14 +++-- .../source/offline_compiler.h | 10 ++++ 8 files changed, 120 insertions(+), 8 deletions(-) create mode 100644 opencl/test/unit_test/test_files/valid_kernel.cl create mode 100644 opencl/test/unit_test/test_files/valid_kernel_ocloc_options.txt diff --git a/opencl/test/unit_test/CMakeLists.txt b/opencl/test/unit_test/CMakeLists.txt index 288c3bf1ad..0ae6a0d410 100644 --- a/opencl/test/unit_test/CMakeLists.txt +++ b/opencl/test/unit_test/CMakeLists.txt @@ -459,6 +459,7 @@ set(TEST_KERNEL_PRINTF_internal_options_gen9lp file(GLOB_RECURSE TEST_KERNELS test_files/*.cl) list(REMOVE_ITEM TEST_KERNELS "${CMAKE_CURRENT_SOURCE_DIR}/test_files/shouldfail.cl") +list(REMOVE_ITEM TEST_KERNELS "${CMAKE_CURRENT_SOURCE_DIR}/test_files/valid_kernel.cl") list(REMOVE_ITEM TEST_KERNELS "${CMAKE_CURRENT_SOURCE_DIR}/test_files/simple_block_kernel.cl") list(REMOVE_ITEM TEST_KERNELS "${CMAKE_CURRENT_SOURCE_DIR}/test_files/simple_nonuniform.cl") list(REMOVE_ITEM TEST_KERNELS "${CMAKE_CURRENT_SOURCE_DIR}/test_files/stateless_kernel.cl") diff --git a/opencl/test/unit_test/offline_compiler/ocloc_api_tests.cpp b/opencl/test/unit_test/offline_compiler/ocloc_api_tests.cpp index 813a7abba1..ac151b2355 100644 --- a/opencl/test/unit_test/offline_compiler/ocloc_api_tests.cpp +++ b/opencl/test/unit_test/offline_compiler/ocloc_api_tests.cpp @@ -10,6 +10,7 @@ #include "shared/offline_compiler/source/utilities/get_git_version_info.h" #include "shared/source/device_binary_format/elf/elf_decoder.h" #include "shared/source/device_binary_format/elf/ocl_elf.h" +#include "shared/source/helpers/file_io.h" #include "environment.h" #include "gtest/gtest.h" @@ -182,7 +183,7 @@ TEST(OclocApiTests, WhenArgsWithMissingFileAreGivenThenErrorMessageIsProduced) { EXPECT_NE(std::string::npos, output.find("Command was: ocloc -q -file test_files/IDoNotExist.cl -device "s + argv[5])); } -TEST(OfflineCompilerTest, givenInputOptionsAndInternalOptionsWhenCmdlineIsPrintedThenBothAreInQuotes) { +TEST(OclocApiTests, givenInputOptionsAndInternalOptionsWhenCmdlineIsPrintedThenBothAreInQuotes) { const char *argv[] = { "ocloc", "-q", @@ -208,7 +209,7 @@ TEST(OfflineCompilerTest, givenInputOptionsAndInternalOptionsWhenCmdlineIsPrinte EXPECT_EQ(quotesCount, 4u); } -TEST(OfflineCompilerTest, givenInputOptionsCalledOptionsWhenCmdlineIsPrintedThenQuotesAreCorrect) { +TEST(OclocApiTests, givenInputOptionsCalledOptionsWhenCmdlineIsPrintedThenQuotesAreCorrect) { const char *argv[] = { "ocloc", "-q", @@ -234,6 +235,61 @@ TEST(OfflineCompilerTest, givenInputOptionsCalledOptionsWhenCmdlineIsPrintedThen EXPECT_EQ(quotesCount, 4u); } +TEST(OclocApiTests, givenInvalidInputOptionsAndInternalOptionsFilesWhenCmdlineIsPrintedThenTheyArePrinted) { + ASSERT_TRUE(fileExists("test_files/shouldfail.cl")); + ASSERT_TRUE(fileExists("test_files/shouldfail_options.txt")); + ASSERT_TRUE(fileExists("test_files/shouldfail_internal_options.txt")); + + const char *argv[] = { + "ocloc", + "-q", + "-file", + "test_files/shouldfail.cl", + "-device", + gEnvironment->devicePrefix.c_str()}; + unsigned int argc = sizeof(argv) / sizeof(const char *); + + testing::internal::CaptureStdout(); + int retVal = oclocInvoke(argc, argv, + 0, nullptr, nullptr, nullptr, + 0, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr); + std::string output = testing::internal::GetCapturedStdout(); + EXPECT_NE(retVal, NEO::OfflineCompiler::ErrorCode::SUCCESS); + + EXPECT_TRUE(output.find("Compiling options read from file were:\n" + "-shouldfailOptions") != std::string::npos); + + EXPECT_TRUE(output.find("Internal options read from file were:\n" + "-shouldfailInternalOptions") != std::string::npos); +} + +TEST(OclocApiTests, givenInvalidOclocOptionsFileWhenCmdlineIsPrintedThenTheyArePrinted) { + ASSERT_TRUE(fileExists("test_files/valid_kernel.cl")); + ASSERT_TRUE(fileExists("test_files/valid_kernel_ocloc_options.txt")); + + const char *argv[] = { + "ocloc", + "-q", + "-file", + "test_files/valid_kernel.cl", + "-device", + gEnvironment->devicePrefix.c_str()}; + unsigned int argc = sizeof(argv) / sizeof(const char *); + + testing::internal::CaptureStdout(); + int retVal = oclocInvoke(argc, argv, + 0, nullptr, nullptr, nullptr, + 0, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr); + std::string output = testing::internal::GetCapturedStdout(); + EXPECT_NE(retVal, NEO::OfflineCompiler::ErrorCode::SUCCESS); + + EXPECT_TRUE(output.find("Failed with ocloc options from file:\n" + "-invalid_ocloc_option") != std::string::npos); + EXPECT_FALSE(output.find("Building with ocloc options:") != std::string::npos); +} + TEST(OclocApiTests, GivenIncludeHeadersWhenCompilingThenPassesToFclHeadersPackedAsElf) { auto prevFclDebugVars = NEO::getFclDebugVars(); auto debugVars = prevFclDebugVars; 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 2ec90f1636..e81d2d692a 100644 --- a/opencl/test/unit_test/offline_compiler/offline_compiler_tests.cpp +++ b/opencl/test/unit_test/offline_compiler/offline_compiler_tests.cpp @@ -1505,11 +1505,15 @@ TEST(OfflineCompilerTest, givenInputOptionsAndInternalOptionsFilesWhenOfflineCom auto &internalOptions = mockOfflineCompiler->internalOptions; EXPECT_STREQ(options.c_str(), "-shouldfailOptions"); EXPECT_TRUE(internalOptions.find("-shouldfailInternalOptions") != std::string::npos); + EXPECT_TRUE(mockOfflineCompiler->getOptionsReadFromFile().find("-shouldfailOptions") != std::string::npos); + EXPECT_TRUE(mockOfflineCompiler->getInternalOptionsReadFromFile().find("-shouldfailInternalOptions") != std::string::npos); mockOfflineCompiler->build(); EXPECT_STREQ(options.c_str(), "-shouldfailOptions"); EXPECT_TRUE(internalOptions.find("-shouldfailInternalOptions") != std::string::npos); + EXPECT_TRUE(mockOfflineCompiler->getOptionsReadFromFile().find("-shouldfailOptions") != std::string::npos); + EXPECT_TRUE(mockOfflineCompiler->getInternalOptionsReadFromFile().find("-shouldfailInternalOptions") != std::string::npos); } TEST(OfflineCompilerTest, givenInputOptionsFileWithSpecialCharsWhenOfflineCompilerIsInitializedThenCorrectOptionsAreSet) { diff --git a/opencl/test/unit_test/test_files/valid_kernel.cl b/opencl/test/unit_test/test_files/valid_kernel.cl new file mode 100644 index 0000000000..368fd9abbb --- /dev/null +++ b/opencl/test/unit_test/test_files/valid_kernel.cl @@ -0,0 +1,12 @@ +/* + * Copyright (C) 2018-2021 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +__kernel void CopyBuffer(__global unsigned int *src, __global unsigned int *dst) { + int id = (int)get_global_id(0); + dst[id] = lgamma((float)src[id]); + dst[id] = src[id]; +} diff --git a/opencl/test/unit_test/test_files/valid_kernel_ocloc_options.txt b/opencl/test/unit_test/test_files/valid_kernel_ocloc_options.txt new file mode 100644 index 0000000000..4181f549a2 --- /dev/null +++ b/opencl/test/unit_test/test_files/valid_kernel_ocloc_options.txt @@ -0,0 +1,8 @@ +/* + * Copyright (C) 2021 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +-invalid_ocloc_option diff --git a/shared/offline_compiler/source/ocloc_api.cpp b/shared/offline_compiler/source/ocloc_api.cpp index 84219cff49..564e7f2e89 100644 --- a/shared/offline_compiler/source/ocloc_api.cpp +++ b/shared/offline_compiler/source/ocloc_api.cpp @@ -78,6 +78,20 @@ void printOclocCmdLine(unsigned int numArgs, const char *argv[], std::unique_ptr printf("\n"); } +void printOclocOptionsReadFromFile(OfflineCompiler *pCompiler) { + if (pCompiler) { + std::string options = pCompiler->getOptionsReadFromFile(); + if (options != "") { + printf("Compiling options read from file were:\n%s\n", options.c_str()); + } + + std::string internalOptions = pCompiler->getInternalOptionsReadFromFile(); + if (internalOptions != "") { + printf("Internal options read from file were:\n%s\n", internalOptions.c_str()); + } + } +} + int oclocInvoke(unsigned int numArgs, const char *argv[], const uint32_t numSources, const uint8_t **dataSources, const uint64_t *lenSources, const char **nameSources, const uint32_t numInputHeaders, const uint8_t **dataInputHeaders, const uint64_t *lenInputHeaders, const char **nameInputHeaders, @@ -153,9 +167,10 @@ int oclocInvoke(unsigned int numArgs, const char *argv[], } } - if (retVal != OfflineCompiler::ErrorCode::SUCCESS) + if (retVal != OfflineCompiler::ErrorCode::SUCCESS) { + printOclocOptionsReadFromFile(pCompiler.get()); printOclocCmdLine(numArgs, argv, helper); - + } return retVal; } } catch (const std::exception &e) { diff --git a/shared/offline_compiler/source/offline_compiler.cpp b/shared/offline_compiler/source/offline_compiler.cpp index b760b18c03..401cc069fc 100644 --- a/shared/offline_compiler/source/offline_compiler.cpp +++ b/shared/offline_compiler/source/offline_compiler.cpp @@ -430,17 +430,17 @@ int OfflineCompiler::initialize(size_t numArgs, const std::vector & std::string oclocOptionsFromFile; bool oclocOptionsRead = readOptionsFromFile(oclocOptionsFromFile, oclocOptionsFileName, argHelper); - if (oclocOptionsRead && !isQuiet()) { - argHelper->printf("Building with ocloc options:\n%s\n", oclocOptionsFromFile.c_str()); - } - if (oclocOptionsRead) { + argHelper->printf("Building with ocloc options:\n%s\n", oclocOptionsFromFile.c_str()); std::istringstream iss(allArgs[0] + " " + oclocOptionsFromFile); std::vector tokens{ std::istream_iterator{iss}, std::istream_iterator{}}; retVal = parseCommandLine(tokens.size(), tokens); if (retVal != SUCCESS) { + if (isQuiet()) { + printf("Failed with ocloc options from file:\n%s\n", oclocOptionsFromFile.c_str()); + } return retVal; } } @@ -449,6 +449,9 @@ int OfflineCompiler::initialize(size_t numArgs, const std::vector & optionsFileName.append("_options.txt"); bool optionsRead = readOptionsFromFile(options, optionsFileName, argHelper); + if (optionsRead) { + optionsReadFromFile = std::string(options); + } if (optionsRead && !isQuiet()) { argHelper->printf("Building with options:\n%s\n", options.c_str()); } @@ -458,6 +461,9 @@ int OfflineCompiler::initialize(size_t numArgs, const std::vector & std::string internalOptionsFromFile; bool internalOptionsRead = readOptionsFromFile(internalOptionsFromFile, internalOptionsFileName, argHelper); + if (internalOptionsRead) { + internalOptionsReadFromFile = std::string(internalOptionsFromFile); + } if (internalOptionsRead && !isQuiet()) { argHelper->printf("Building with internal options:\n%s\n", internalOptionsFromFile.c_str()); } diff --git a/shared/offline_compiler/source/offline_compiler.h b/shared/offline_compiler/source/offline_compiler.h index 47cd7aead1..159251b5c2 100644 --- a/shared/offline_compiler/source/offline_compiler.h +++ b/shared/offline_compiler/source/offline_compiler.h @@ -88,6 +88,14 @@ class OfflineCompiler { return hwInfo; } + std::string getOptionsReadFromFile() const { + return optionsReadFromFile; + } + + std::string getInternalOptionsReadFromFile() const { + return internalOptionsReadFromFile; + } + protected: OfflineCompiler(); @@ -129,6 +137,8 @@ class OfflineCompiler { std::string internalOptions; std::string sourceCode; std::string buildLog; + std::string optionsReadFromFile = ""; + std::string internalOptionsReadFromFile = ""; bool dumpFiles = true; bool useLlvmText = false;