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 b5682b7bb2..3baf63b86b 100644 --- a/opencl/test/unit_test/offline_compiler/offline_compiler_tests.cpp +++ b/opencl/test/unit_test/offline_compiler/offline_compiler_tests.cpp @@ -5840,6 +5840,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; @@ -6391,4 +6392,34 @@ TEST_F(OfflineCompilerTests, givenMixedValidFormatsInDeviceOptionsWhenParsingThe EXPECT_NE(mockOfflineCompiler->perDeviceOptions.end(), mockOfflineCompiler->perDeviceOptions.find(ipVersion)); } + +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 c57ab30a40..48496ebda8 100644 --- a/shared/offline_compiler/source/offline_compiler.cpp +++ b/shared/offline_compiler/source/offline_compiler.cpp @@ -1769,7 +1769,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;