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 <jaroslaw.chodor@intel.com>
This commit is contained in:
Chodor, Jaroslaw
2025-09-15 14:51:08 +00:00
committed by Compute-Runtime-Automation
parent 84f7b538df
commit d8ef0aa99d
5 changed files with 61 additions and 4 deletions

View File

@@ -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<IGC::CodeType::CodeType_t, const char *> 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

View File

@@ -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);

View File

@@ -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() {

View File

@@ -10,6 +10,7 @@
#include "CL/cl.h"
#include <algorithm>
#include <cstdint>
#include <cstring>
#include <string>
@@ -83,4 +84,14 @@ inline std::vector<std::string> split(const std::string &input, const char *deli
inline uint32_t toUint32t(const std::string &input) {
return static_cast<uint32_t>(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

View File

@@ -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;