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 7e73f869b9..cb3c6ca31a 100644 --- a/opencl/test/unit_test/offline_compiler/offline_compiler_tests.cpp +++ b/opencl/test/unit_test/offline_compiler/offline_compiler_tests.cpp @@ -5839,4 +5839,33 @@ TEST_F(OfflineCompilerTests, GivenDebugFlagWhenBuildingFromSourceThenTemporarySo std::string expectedSOption = "-s \"" + expectedTempFilePath.string() + "\""; EXPECT_TRUE(CompilerOptions::contains(mockOfflineCompiler.options, expectedSOption)); } + +TEST(OclocOutputFileExtensions, GivenKnownFileFormatTheChooseProperExtension) { + using namespace IGC::CodeType; + std::pair expectedExts[] = { + {llvmLl, ".ll"}, + {llvmBc, ".bc"}, + {spirV, ".spv"}, + {oclC, ".cl"}, + {oclCpp, ".cl"}, + {oclGenBin, ".bin"}, + {elf, ".bin"}, + {undefined, ".bin"}, + {invalid, ".bin"}}; + + for (const auto &[codeType, expectedExt] : expectedExts) { + auto ext = NEO::getFileExtension(codeType); + EXPECT_STREQ(expectedExt, ext.c_str()); + } +} + +TEST(OclocOutputFileExtensions, GivenCustomFileFormatThenUseItAsExtension) { + auto customCodeType = IGC::CodeType::CodeTypeCoder::Enc("TXT"); + auto ext = NEO::getFileExtension(customCodeType); + EXPECT_STREQ(".txt", ext.c_str()); + + customCodeType = IGC::CodeType::CodeTypeCoder::Enc("MD"); + ext = NEO::getFileExtension(customCodeType); + EXPECT_STREQ(".md", ext.c_str()); +} } // namespace NEO diff --git a/shared/offline_compiler/source/offline_compiler.cpp b/shared/offline_compiler/source/offline_compiler.cpp index 82552ff022..ae30806024 100644 --- a/shared/offline_compiler/source/offline_compiler.cpp +++ b/shared/offline_compiler/source/offline_compiler.cpp @@ -1625,7 +1625,7 @@ void OfflineCompiler::writeOutAllFiles() { return; } - if (irBinary && (this->inputCodeType != IGC::CodeType::spirV)) { + if (irBinary && (this->inputCodeType == IGC::CodeType::oclC)) { std::string irOutputFileName = generateFilePathForIr(fileBase) + generateOptsSuffix(); argHelper->saveOutput(irOutputFileName, irBinary, irBinarySize); diff --git a/shared/offline_compiler/source/offline_compiler.h b/shared/offline_compiler/source/offline_compiler.h index fc299197b5..912f433820 100644 --- a/shared/offline_compiler/source/offline_compiler.h +++ b/shared/offline_compiler/source/offline_compiler.h @@ -11,6 +11,7 @@ #include "shared/source/compiler_interface/compiler_options.h" #include "shared/source/helpers/hw_info.h" #include "shared/source/helpers/non_copyable_or_moveable.h" +#include "shared/source/helpers/string_helpers.h" #include "shared/source/utilities/arrayref.h" #include "shared/source/utilities/const_stringref.h" @@ -50,9 +51,14 @@ constexpr bool isIntermediateRepresentation(IGC::CodeType::CodeType_t codeType) return false == ((IGC::CodeType::oclC == codeType) || (IGC::CodeType::oclCpp == codeType) || (IGC::CodeType::oclGenBin == codeType)); } -constexpr const char *getFileExtension(IGC::CodeType::CodeType_t codeType) { +inline std::string getFileExtension(IGC::CodeType::CodeType_t codeType) { switch (codeType) { default: + return "." + StringHelpers::toLower(IGC::CodeType::CodeTypeCoder::Dec(codeType)); + case IGC::CodeType::oclGenBin: + case IGC::CodeType::elf: + case IGC::CodeType::undefined: + case IGC::CodeType::invalid: return ".bin"; case IGC::CodeType::llvmBc: return ".bc"; @@ -60,6 +66,10 @@ constexpr const char *getFileExtension(IGC::CodeType::CodeType_t codeType) { return ".ll"; case IGC::CodeType::spirV: return ".spv"; + case IGC::CodeType::oclC: + return ".cl"; + case IGC::CodeType::oclCpp: + return ".cl"; } } @@ -186,8 +196,8 @@ All supported acronyms: %s. void updateBuildLog(const char *pErrorString, const size_t errorStringSize); MOCKABLE_VIRTUAL bool generateElfBinary(); std::string generateFilePathForIr(const std::string &fileNameBase) { - const char *ext = getFileExtension(intermediateRepresentation); - return generateFilePath(outputDirectory, fileNameBase, ext); + auto ext = getFileExtension(intermediateRepresentation); + return generateFilePath(outputDirectory, fileNameBase, ext.c_str()); } std::string generateOptsSuffix() { diff --git a/shared/source/helpers/string_helpers.h b/shared/source/helpers/string_helpers.h index 65ec1d0138..454ad650f2 100644 --- a/shared/source/helpers/string_helpers.h +++ b/shared/source/helpers/string_helpers.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2022 Intel Corporation + * Copyright (C) 2021-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -10,6 +10,7 @@ #include "CL/cl.h" +#include #include #include #include @@ -83,4 +84,14 @@ inline std::vector split(const std::string &input, const char *deli inline uint32_t toUint32t(const std::string &input) { return static_cast(std::stoul(input, nullptr, 0)); } + +inline void toLowerInPlace(std::string &src) { + std::transform(src.begin(), src.end(), src.begin(), [](unsigned char c) { return std::tolower(c); }); +} + +inline std::string toLower(const std::string &src) { + std::string ret = src; + toLowerInPlace(ret); + return ret; +} } // namespace StringHelpers diff --git a/shared/test/unit_test/helpers/string_to_hash_tests.cpp b/shared/test/unit_test/helpers/string_to_hash_tests.cpp index db09ae2202..54be473729 100644 --- a/shared/test/unit_test/helpers/string_to_hash_tests.cpp +++ b/shared/test/unit_test/helpers/string_to_hash_tests.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2022 Intel Corporation + * Copyright (C) 2018-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -12,6 +12,11 @@ using NEO::Hash; +TEST(ToLower, GiventStringThenChangeItToLowerCase) { + std::string ls = StringHelpers::toLower("SomeTEXT"); + EXPECT_STREQ("sometext", ls.c_str()); +} + TEST(CreateCombinedStrings, GivenSingleStringWhenCreatingCombinedStringThenDstStringMatchesSrcString) { std::string dstString; size_t dstStringSizeInBytes = 0;