From a0407ff72a19f2e6644c7068bacda3e10fbf65b8 Mon Sep 17 00:00:00 2001 From: "Chodor, Jaroslaw" Date: Fri, 12 Sep 2025 11:12:38 +0000 Subject: [PATCH] fix: Better IR file format ext handling This fix makes ocloc honor IR file format when picking extension for the output file. Additionally, this commit removes reduntant IR output when compiling from IR. Related-To: NEO-15876 Signed-off-by: Chodor, Jaroslaw --- .../offline_compiler_tests.cpp | 31 +++++++++++++++++++ .../source/offline_compiler.cpp | 2 +- .../source/offline_compiler.h | 16 ++++++++-- shared/source/helpers/string_helpers.h | 11 +++++++ .../helpers/string_to_hash_tests.cpp | 5 +++ 5 files changed, 61 insertions(+), 4 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 ceb35ed6cd..cfac41949b 100644 --- a/opencl/test/unit_test/offline_compiler/offline_compiler_tests.cpp +++ b/opencl/test/unit_test/offline_compiler/offline_compiler_tests.cpp @@ -5839,6 +5839,7 @@ TEST_F(OfflineCompilerTests, GivenDebugFlagWhenBuildingFromSourceThenTemporarySo std::string expectedSOption = "-s \"" + expectedTempFilePath.string() + "\""; EXPECT_TRUE(CompilerOptions::contains(mockOfflineCompiler.options, expectedSOption)); } + TEST_F(OfflineCompilerTests, GivenSpirvInputAndSpecConstFileWhenFileExistsThenSpecializationConstantsAreLoaded) { MockOfflineCompiler mockOfflineCompiler; mockOfflineCompiler.uniqueHelper->filesMap = filesMap; @@ -6007,4 +6008,34 @@ TEST_F(OfflineCompilerTests, GivenVariousLinesInSpecConstFileWhenParsingThenFile } } } + +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 b06e265db5..2998215f34 100644 --- a/shared/offline_compiler/source/offline_compiler.cpp +++ b/shared/offline_compiler/source/offline_compiler.cpp @@ -1702,7 +1702,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 b88be783db..bd6c738a5a 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" @@ -51,9 +52,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"; @@ -61,6 +67,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"; } } @@ -187,8 +197,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 d615d53527..454ad650f2 100644 --- a/shared/source/helpers/string_helpers.h +++ b/shared/source/helpers/string_helpers.h @@ -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 8b5f22db7a..54be473729 100644 --- a/shared/test/unit_test/helpers/string_to_hash_tests.cpp +++ b/shared/test/unit_test/helpers/string_to_hash_tests.cpp @@ -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;