Update Program::extractInternalOptions

Change-Id: Ie67a8ef7b6f010a44b252666e9d9ef48fdeac9e0
Signed-off-by: Filip Hazubski <filip.hazubski@intel.com>
This commit is contained in:
Filip Hazubski 2019-11-27 14:56:48 +01:00 committed by sys_ocldev
parent 0193b3ea69
commit 5bed747e33
5 changed files with 116 additions and 30 deletions

View File

@ -18,6 +18,8 @@
#include "runtime/source_level_debugger/source_level_debugger.h"
#include <cstring>
#include <iterator>
#include <sstream>
namespace NEO {
@ -198,14 +200,27 @@ cl_int Program::build(const cl_device_id device, const char *buildOptions, bool
return ret;
}
void Program::extractInternalOptions(std::string &options) {
void Program::extractInternalOptions(const std::string &options) {
std::istringstream inputStringStream(options);
std::vector<std::string> optionsVector{std::istream_iterator<std::string>{inputStringStream},
std::istream_iterator<std::string>{}};
for (auto &optionString : internalOptionsToExtract) {
size_t pos = options.find(optionString);
if (pos != std::string::npos) {
options.erase(pos, optionString.length());
auto element = std::find(optionsVector.begin(), optionsVector.end(), optionString);
if (element == optionsVector.end()) {
continue;
}
if (isFlagOption(optionString)) {
internalOptions.append(optionString);
internalOptions.append(" ");
} else if ((element + 1 != optionsVector.end()) &&
isOptionValueValid(optionString, *(element + 1))) {
internalOptions.append(optionString);
internalOptions.append(" ");
internalOptions.append(*(element + 1));
internalOptions.append(" ");
}
}
}
} // namespace NEO

View File

@ -10,5 +10,15 @@
#include <vector>
namespace NEO {
const std::vector<std::string> Program::internalOptionsToExtract = {"-cl-intel-gtpin-rera", "-cl-intel-greater-than-4GB-buffer-required"};
};
bool Program::isFlagOption(const std::string &option) {
return true;
}
bool Program::isOptionValueValid(const std::string &option, const std::string &value) {
return false;
}
}; // namespace NEO

View File

@ -273,7 +273,9 @@ class Program : public BaseObject<_cl_program> {
void updateNonUniformFlag();
void updateNonUniformFlag(const Program **inputProgram, size_t numInputPrograms);
void extractInternalOptions(std::string &options);
void extractInternalOptions(const std::string &options);
MOCKABLE_VIRTUAL bool isFlagOption(const std::string &option);
MOCKABLE_VIRTUAL bool isOptionValueValid(const std::string &option, const std::string &value);
MOCKABLE_VIRTUAL void applyAdditionalOptions();
MOCKABLE_VIRTUAL bool appendKernelDebugOptions();

View File

@ -49,6 +49,7 @@ class MockProgram : public Program {
using Program::genBinarySize;
using Program::getKernelInfo;
using Program::globalSurface;
using Program::internalOptionsToExtract;
using Program::irBinary;
using Program::irBinarySize;
using Program::isProgramBinaryResolved;
@ -129,6 +130,20 @@ class MockProgram : public Program {
extractInternalOptions(buildOptions);
}
bool isFlagOption(const std::string &option) override {
if (isFlagOptionOverride != -1) {
return (isFlagOptionOverride > 0);
}
return Program::isFlagOption(option);
}
bool isOptionValueValid(const std::string &option, const std::string &value) override {
if (isOptionValueValidOverride != -1) {
return (isOptionValueValidOverride > 0);
}
return Program::isOptionValueValid(option, value);
}
cl_int isHandled(const PatchTokenBinary::ProgramFromPatchtokens &decodedProgram) const override {
if (skipValidationOfBinary) {
return CL_SUCCESS;
@ -138,6 +153,8 @@ class MockProgram : public Program {
bool contextSet = false;
bool skipValidationOfBinary = false;
int isFlagOptionOverride = -1;
int isOptionValueValidOverride = -1;
};
class GlobalMockSipProgram : public Program {

View File

@ -2555,14 +2555,14 @@ class Program32BitTests : public ProgramTests {
};
TEST_F(Program32BitTests, givenDeviceWithForce32BitAddressingOnWhenBuiltinIsCreatedThenNoFlagsArePassedAsInternalOptions) {
MockProgram pProgram(*pDevice->getExecutionEnvironment());
auto &internalOptions = pProgram.getInternalOptions();
MockProgram program(*pDevice->getExecutionEnvironment());
auto &internalOptions = program.getInternalOptions();
EXPECT_THAT(internalOptions, testing::HasSubstr(std::string("")));
}
TEST_F(Program32BitTests, givenDeviceWithForce32BitAddressingOnWhenProgramIsCreatedThen32bitFlagIsPassedAsInternalOption) {
MockProgram pProgram(*pDevice->getExecutionEnvironment(), pContext, false);
auto &internalOptions = pProgram.getInternalOptions();
MockProgram program(*pDevice->getExecutionEnvironment(), pContext, false);
auto &internalOptions = program.getInternalOptions();
std::string s1 = internalOptions;
size_t pos = s1.find("-m32");
if (is64bit) {
@ -2886,13 +2886,13 @@ TEST_F(ProgramTests, givenSeparateBlockKernelsWhenSubgroupKernelWithChildKernelT
TEST(SimpleProgramTests, givenDefaultProgramWhenSetDeviceIsCalledThenDeviceIsSet) {
ExecutionEnvironment executionEnvironment;
MockProgram pProgram(executionEnvironment);
EXPECT_EQ(nullptr, pProgram.getDevicePtr());
MockProgram program(executionEnvironment);
EXPECT_EQ(nullptr, program.getDevicePtr());
auto dummyDevice = (Device *)0x1337;
pProgram.SetDevice(dummyDevice);
EXPECT_EQ(dummyDevice, pProgram.getDevicePtr());
pProgram.SetDevice(nullptr);
EXPECT_EQ(nullptr, pProgram.getDevicePtr());
program.SetDevice(dummyDevice);
EXPECT_EQ(dummyDevice, program.getDevicePtr());
program.SetDevice(nullptr);
EXPECT_EQ(nullptr, program.getDevicePtr());
}
TEST(ProgramDestructionTests, givenProgramUsingDeviceWhenItIsDestroyedAfterPlatfromCleanupThenItIsCleanedUpProperly) {
@ -2982,28 +2982,70 @@ TEST_F(ProgramTests, whenRebuildingProgramThenStoreDeviceBinaryProperly) {
EXPECT_EQ(0, memcmp(binaryToReturn, program->genBinary.get(), program->genBinarySize));
}
TEST_F(ProgramTests, givenProgramWhenInternalOptionsArePassedThenTheyAreRemovedFromBuildOptions) {
TEST_F(ProgramTests, givenProgramWhenInternalOptionsArePassedThenTheyAreAddedToProgramInternalOptions) {
ExecutionEnvironment executionEnvironment;
MockProgram pProgram(executionEnvironment);
pProgram.getInternalOptions().erase();
EXPECT_EQ(nullptr, pProgram.getDevicePtr());
MockProgram program(executionEnvironment);
program.getInternalOptions().erase();
EXPECT_EQ(nullptr, program.getDevicePtr());
const char *internalOption = "-cl-intel-gtpin-rera";
std::string buildOptions(internalOption);
pProgram.extractInternalOptionsForward(buildOptions);
EXPECT_EQ(0u, buildOptions.length());
EXPECT_TRUE(pProgram.getInternalOptions() == std::string(internalOption) + " ");
program.extractInternalOptionsForward(buildOptions);
EXPECT_TRUE(program.getInternalOptions() == std::string(internalOption) + " ");
}
TEST_F(ProgramTests, givenProgramWhenUnknownInternalOptionsArePassedThenTheyAreNotRemovedFromBuildOptions) {
TEST_F(ProgramTests, givenProgramWhenUnknownInternalOptionsArePassedThenTheyAreNotAddedToProgramInternalOptions) {
ExecutionEnvironment executionEnvironment;
MockProgram pProgram(executionEnvironment);
pProgram.getInternalOptions().erase();
EXPECT_EQ(nullptr, pProgram.getDevicePtr());
MockProgram program(executionEnvironment);
program.getInternalOptions().erase();
EXPECT_EQ(nullptr, program.getDevicePtr());
const char *internalOption = "-unknown-internal-options-123";
std::string buildOptions(internalOption);
pProgram.extractInternalOptionsForward(buildOptions);
EXPECT_EQ(0u, pProgram.getInternalOptions().length());
EXPECT_TRUE(buildOptions == internalOption);
program.extractInternalOptionsForward(buildOptions);
EXPECT_EQ(0u, program.getInternalOptions().length());
}
TEST_F(ProgramTests, givenProgramWhenAllInternalOptionsArePassedMixedWithUnknownInputThenTheyAreParsedCorrectly) {
ExecutionEnvironment executionEnvironment;
MockProgram program(executionEnvironment);
program.getInternalOptions().erase();
EXPECT_EQ(nullptr, program.getDevicePtr());
std::string buildOptions = "### -cl-intel-gtpin-rera ### -cl-intel-greater-than-4GB-buffer-required ###";
std::string expectedOutput = "-cl-intel-gtpin-rera -cl-intel-greater-than-4GB-buffer-required ";
program.extractInternalOptionsForward(buildOptions);
EXPECT_EQ(expectedOutput, program.getInternalOptions());
}
TEST_F(ProgramTests, givenProgramWhenInternalOptionsArePassedWithValidValuesThenTheyAreAddedToProgramInternalOptions) {
ExecutionEnvironment executionEnvironment;
MockProgram program(executionEnvironment);
program.getInternalOptions().erase();
EXPECT_EQ(nullptr, program.getDevicePtr());
program.isFlagOptionOverride = false;
program.isOptionValueValidOverride = true;
std::string buildOptions = "-cl-intel-gtpin-rera someValue";
std::string expectedOutput = "-cl-intel-gtpin-rera someValue ";
program.extractInternalOptionsForward(buildOptions);
EXPECT_EQ(expectedOutput, program.getInternalOptions());
}
TEST_F(ProgramTests, givenProgramWhenInternalOptionsArePassedWithInvalidValuesThenTheyAreNotAddedToProgramInternalOptions) {
ExecutionEnvironment executionEnvironment;
MockProgram program(executionEnvironment);
EXPECT_EQ(nullptr, program.getDevicePtr());
program.isFlagOptionOverride = false;
std::string buildOptions = "-cl-intel-gtpin-rera someValue";
std::string expectedOutput = "";
program.getInternalOptions().erase();
program.extractInternalOptionsForward(buildOptions);
EXPECT_EQ(expectedOutput, program.getInternalOptions());
program.isOptionValueValidOverride = true;
buildOptions = "-cl-intel-gtpin-rera ";
program.getInternalOptions().erase();
program.extractInternalOptionsForward(buildOptions);
EXPECT_EQ(expectedOutput, program.getInternalOptions());
}
TEST_F(ProgramTests, givenProgramWhenGetSymbolsIsCalledThenMapWithExportedSymbolsIsReturned) {