Skip to content

Commit 5bed747

Browse files
Update Program::extractInternalOptions
Change-Id: Ie67a8ef7b6f010a44b252666e9d9ef48fdeac9e0 Signed-off-by: Filip Hazubski <filip.hazubski@intel.com>
1 parent 0193b3e commit 5bed747

File tree

5 files changed

+116
-30
lines changed

5 files changed

+116
-30
lines changed

runtime/program/build.cpp

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
#include "runtime/source_level_debugger/source_level_debugger.h"
1919

2020
#include <cstring>
21+
#include <iterator>
22+
#include <sstream>
2123

2224
namespace NEO {
2325

@@ -198,14 +200,27 @@ cl_int Program::build(const cl_device_id device, const char *buildOptions, bool
198200
return ret;
199201
}
200202

201-
void Program::extractInternalOptions(std::string &options) {
203+
void Program::extractInternalOptions(const std::string &options) {
204+
std::istringstream inputStringStream(options);
205+
std::vector<std::string> optionsVector{std::istream_iterator<std::string>{inputStringStream},
206+
std::istream_iterator<std::string>{}};
202207
for (auto &optionString : internalOptionsToExtract) {
203-
size_t pos = options.find(optionString);
204-
if (pos != std::string::npos) {
205-
options.erase(pos, optionString.length());
208+
auto element = std::find(optionsVector.begin(), optionsVector.end(), optionString);
209+
if (element == optionsVector.end()) {
210+
continue;
211+
}
212+
213+
if (isFlagOption(optionString)) {
206214
internalOptions.append(optionString);
207215
internalOptions.append(" ");
216+
} else if ((element + 1 != optionsVector.end()) &&
217+
isOptionValueValid(optionString, *(element + 1))) {
218+
internalOptions.append(optionString);
219+
internalOptions.append(" ");
220+
internalOptions.append(*(element + 1));
221+
internalOptions.append(" ");
208222
}
209223
}
210224
}
225+
211226
} // namespace NEO

runtime/program/internal_options.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,15 @@
1010
#include <vector>
1111

1212
namespace NEO {
13+
1314
const std::vector<std::string> Program::internalOptionsToExtract = {"-cl-intel-gtpin-rera", "-cl-intel-greater-than-4GB-buffer-required"};
14-
};
15+
16+
bool Program::isFlagOption(const std::string &option) {
17+
return true;
18+
}
19+
20+
bool Program::isOptionValueValid(const std::string &option, const std::string &value) {
21+
return false;
22+
}
23+
24+
}; // namespace NEO

runtime/program/program.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,9 @@ class Program : public BaseObject<_cl_program> {
273273
void updateNonUniformFlag();
274274
void updateNonUniformFlag(const Program **inputProgram, size_t numInputPrograms);
275275

276-
void extractInternalOptions(std::string &options);
276+
void extractInternalOptions(const std::string &options);
277+
MOCKABLE_VIRTUAL bool isFlagOption(const std::string &option);
278+
MOCKABLE_VIRTUAL bool isOptionValueValid(const std::string &option, const std::string &value);
277279
MOCKABLE_VIRTUAL void applyAdditionalOptions();
278280

279281
MOCKABLE_VIRTUAL bool appendKernelDebugOptions();

unit_tests/mocks/mock_program.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class MockProgram : public Program {
4949
using Program::genBinarySize;
5050
using Program::getKernelInfo;
5151
using Program::globalSurface;
52+
using Program::internalOptionsToExtract;
5253
using Program::irBinary;
5354
using Program::irBinarySize;
5455
using Program::isProgramBinaryResolved;
@@ -129,6 +130,20 @@ class MockProgram : public Program {
129130
extractInternalOptions(buildOptions);
130131
}
131132

133+
bool isFlagOption(const std::string &option) override {
134+
if (isFlagOptionOverride != -1) {
135+
return (isFlagOptionOverride > 0);
136+
}
137+
return Program::isFlagOption(option);
138+
}
139+
140+
bool isOptionValueValid(const std::string &option, const std::string &value) override {
141+
if (isOptionValueValidOverride != -1) {
142+
return (isOptionValueValidOverride > 0);
143+
}
144+
return Program::isOptionValueValid(option, value);
145+
}
146+
132147
cl_int isHandled(const PatchTokenBinary::ProgramFromPatchtokens &decodedProgram) const override {
133148
if (skipValidationOfBinary) {
134149
return CL_SUCCESS;
@@ -138,6 +153,8 @@ class MockProgram : public Program {
138153

139154
bool contextSet = false;
140155
bool skipValidationOfBinary = false;
156+
int isFlagOptionOverride = -1;
157+
int isOptionValueValidOverride = -1;
141158
};
142159

143160
class GlobalMockSipProgram : public Program {

unit_tests/program/program_tests.cpp

Lines changed: 66 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2555,14 +2555,14 @@ class Program32BitTests : public ProgramTests {
25552555
};
25562556

25572557
TEST_F(Program32BitTests, givenDeviceWithForce32BitAddressingOnWhenBuiltinIsCreatedThenNoFlagsArePassedAsInternalOptions) {
2558-
MockProgram pProgram(*pDevice->getExecutionEnvironment());
2559-
auto &internalOptions = pProgram.getInternalOptions();
2558+
MockProgram program(*pDevice->getExecutionEnvironment());
2559+
auto &internalOptions = program.getInternalOptions();
25602560
EXPECT_THAT(internalOptions, testing::HasSubstr(std::string("")));
25612561
}
25622562

25632563
TEST_F(Program32BitTests, givenDeviceWithForce32BitAddressingOnWhenProgramIsCreatedThen32bitFlagIsPassedAsInternalOption) {
2564-
MockProgram pProgram(*pDevice->getExecutionEnvironment(), pContext, false);
2565-
auto &internalOptions = pProgram.getInternalOptions();
2564+
MockProgram program(*pDevice->getExecutionEnvironment(), pContext, false);
2565+
auto &internalOptions = program.getInternalOptions();
25662566
std::string s1 = internalOptions;
25672567
size_t pos = s1.find("-m32");
25682568
if (is64bit) {
@@ -2886,13 +2886,13 @@ TEST_F(ProgramTests, givenSeparateBlockKernelsWhenSubgroupKernelWithChildKernelT
28862886

28872887
TEST(SimpleProgramTests, givenDefaultProgramWhenSetDeviceIsCalledThenDeviceIsSet) {
28882888
ExecutionEnvironment executionEnvironment;
2889-
MockProgram pProgram(executionEnvironment);
2890-
EXPECT_EQ(nullptr, pProgram.getDevicePtr());
2889+
MockProgram program(executionEnvironment);
2890+
EXPECT_EQ(nullptr, program.getDevicePtr());
28912891
auto dummyDevice = (Device *)0x1337;
2892-
pProgram.SetDevice(dummyDevice);
2893-
EXPECT_EQ(dummyDevice, pProgram.getDevicePtr());
2894-
pProgram.SetDevice(nullptr);
2895-
EXPECT_EQ(nullptr, pProgram.getDevicePtr());
2892+
program.SetDevice(dummyDevice);
2893+
EXPECT_EQ(dummyDevice, program.getDevicePtr());
2894+
program.SetDevice(nullptr);
2895+
EXPECT_EQ(nullptr, program.getDevicePtr());
28962896
}
28972897

28982898
TEST(ProgramDestructionTests, givenProgramUsingDeviceWhenItIsDestroyedAfterPlatfromCleanupThenItIsCleanedUpProperly) {
@@ -2982,28 +2982,70 @@ TEST_F(ProgramTests, whenRebuildingProgramThenStoreDeviceBinaryProperly) {
29822982
EXPECT_EQ(0, memcmp(binaryToReturn, program->genBinary.get(), program->genBinarySize));
29832983
}
29842984

2985-
TEST_F(ProgramTests, givenProgramWhenInternalOptionsArePassedThenTheyAreRemovedFromBuildOptions) {
2985+
TEST_F(ProgramTests, givenProgramWhenInternalOptionsArePassedThenTheyAreAddedToProgramInternalOptions) {
29862986
ExecutionEnvironment executionEnvironment;
2987-
MockProgram pProgram(executionEnvironment);
2988-
pProgram.getInternalOptions().erase();
2989-
EXPECT_EQ(nullptr, pProgram.getDevicePtr());
2987+
MockProgram program(executionEnvironment);
2988+
program.getInternalOptions().erase();
2989+
EXPECT_EQ(nullptr, program.getDevicePtr());
29902990
const char *internalOption = "-cl-intel-gtpin-rera";
29912991
std::string buildOptions(internalOption);
2992-
pProgram.extractInternalOptionsForward(buildOptions);
2993-
EXPECT_EQ(0u, buildOptions.length());
2994-
EXPECT_TRUE(pProgram.getInternalOptions() == std::string(internalOption) + " ");
2992+
program.extractInternalOptionsForward(buildOptions);
2993+
EXPECT_TRUE(program.getInternalOptions() == std::string(internalOption) + " ");
29952994
}
29962995

2997-
TEST_F(ProgramTests, givenProgramWhenUnknownInternalOptionsArePassedThenTheyAreNotRemovedFromBuildOptions) {
2996+
TEST_F(ProgramTests, givenProgramWhenUnknownInternalOptionsArePassedThenTheyAreNotAddedToProgramInternalOptions) {
29982997
ExecutionEnvironment executionEnvironment;
2999-
MockProgram pProgram(executionEnvironment);
3000-
pProgram.getInternalOptions().erase();
3001-
EXPECT_EQ(nullptr, pProgram.getDevicePtr());
2998+
MockProgram program(executionEnvironment);
2999+
program.getInternalOptions().erase();
3000+
EXPECT_EQ(nullptr, program.getDevicePtr());
30023001
const char *internalOption = "-unknown-internal-options-123";
30033002
std::string buildOptions(internalOption);
3004-
pProgram.extractInternalOptionsForward(buildOptions);
3005-
EXPECT_EQ(0u, pProgram.getInternalOptions().length());
3006-
EXPECT_TRUE(buildOptions == internalOption);
3003+
program.extractInternalOptionsForward(buildOptions);
3004+
EXPECT_EQ(0u, program.getInternalOptions().length());
3005+
}
3006+
3007+
TEST_F(ProgramTests, givenProgramWhenAllInternalOptionsArePassedMixedWithUnknownInputThenTheyAreParsedCorrectly) {
3008+
ExecutionEnvironment executionEnvironment;
3009+
MockProgram program(executionEnvironment);
3010+
program.getInternalOptions().erase();
3011+
EXPECT_EQ(nullptr, program.getDevicePtr());
3012+
std::string buildOptions = "### -cl-intel-gtpin-rera ### -cl-intel-greater-than-4GB-buffer-required ###";
3013+
std::string expectedOutput = "-cl-intel-gtpin-rera -cl-intel-greater-than-4GB-buffer-required ";
3014+
program.extractInternalOptionsForward(buildOptions);
3015+
EXPECT_EQ(expectedOutput, program.getInternalOptions());
3016+
}
3017+
3018+
TEST_F(ProgramTests, givenProgramWhenInternalOptionsArePassedWithValidValuesThenTheyAreAddedToProgramInternalOptions) {
3019+
ExecutionEnvironment executionEnvironment;
3020+
MockProgram program(executionEnvironment);
3021+
program.getInternalOptions().erase();
3022+
EXPECT_EQ(nullptr, program.getDevicePtr());
3023+
3024+
program.isFlagOptionOverride = false;
3025+
program.isOptionValueValidOverride = true;
3026+
std::string buildOptions = "-cl-intel-gtpin-rera someValue";
3027+
std::string expectedOutput = "-cl-intel-gtpin-rera someValue ";
3028+
program.extractInternalOptionsForward(buildOptions);
3029+
EXPECT_EQ(expectedOutput, program.getInternalOptions());
3030+
}
3031+
3032+
TEST_F(ProgramTests, givenProgramWhenInternalOptionsArePassedWithInvalidValuesThenTheyAreNotAddedToProgramInternalOptions) {
3033+
ExecutionEnvironment executionEnvironment;
3034+
MockProgram program(executionEnvironment);
3035+
EXPECT_EQ(nullptr, program.getDevicePtr());
3036+
3037+
program.isFlagOptionOverride = false;
3038+
std::string buildOptions = "-cl-intel-gtpin-rera someValue";
3039+
std::string expectedOutput = "";
3040+
program.getInternalOptions().erase();
3041+
program.extractInternalOptionsForward(buildOptions);
3042+
EXPECT_EQ(expectedOutput, program.getInternalOptions());
3043+
3044+
program.isOptionValueValidOverride = true;
3045+
buildOptions = "-cl-intel-gtpin-rera ";
3046+
program.getInternalOptions().erase();
3047+
program.extractInternalOptionsForward(buildOptions);
3048+
EXPECT_EQ(expectedOutput, program.getInternalOptions());
30073049
}
30083050

30093051
TEST_F(ProgramTests, givenProgramWhenGetSymbolsIsCalledThenMapWithExportedSymbolsIsReturned) {

0 commit comments

Comments
 (0)