Skip to content

Commit 3599e7a

Browse files
Add warning when device binary had to be recompiled
Introduced a new warning, which is printed to build log, when the binary needs to be recompiled. Added a new flag -Wno-recompiled-from-ir to allow suppression of that message. Removed a bug related to memcpy_s from ModuleBuildLogImp::getString() and aligned it with specification. Related-To: NEO-5819 Signed-off-by: Patryk Wrobel <[email protected]>
1 parent 35f6cd0 commit 3599e7a

File tree

14 files changed

+275
-15
lines changed

14 files changed

+275
-15
lines changed

level_zero/core/source/module/module_build_log.cpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,21 @@ struct ModuleBuildLogImp : public ModuleBuildLog {
2525
}
2626

2727
ze_result_t getString(size_t *pSize, char *pBuildLog) override {
28-
const char *buildLog = this->buildLog.c_str();
28+
const size_t requiredSize{buildLog.size() + 1};
29+
if (pBuildLog == nullptr) {
30+
*pSize = requiredSize;
31+
return ZE_RESULT_SUCCESS;
32+
}
33+
34+
if (*pSize < requiredSize) {
35+
return ZE_RESULT_ERROR_INVALID_SIZE;
36+
}
2937

30-
if (buildLog != nullptr) {
31-
auto szLog = this->buildLog.size();
38+
memcpy_s(pBuildLog, *pSize, buildLog.c_str(), buildLog.size());
39+
pBuildLog[buildLog.size()] = '\0';
3240

33-
if (pBuildLog) {
34-
memcpy_s(pBuildLog, szLog, buildLog, szLog);
35-
pBuildLog[szLog] = '\0';
36-
}
41+
*pSize = requiredSize;
3742

38-
*pSize = szLog + 1;
39-
} else {
40-
*pSize = 0;
41-
}
4243
return ZE_RESULT_SUCCESS;
4344
}
4445

level_zero/core/source/module/module_imp.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include "level_zero/core/source/module/module_imp.h"
99

10+
#include "shared/source/compiler_interface/compiler_warnings/compiler_warnings.h"
1011
#include "shared/source/compiler_interface/intermediate_representations.h"
1112
#include "shared/source/compiler_interface/linker.h"
1213
#include "shared/source/device/device.h"
@@ -276,6 +277,10 @@ bool ModuleTranslationUnit::createFromNativeBinary(const char *input, size_t inp
276277
}
277278

278279
if (nullptr == this->unpackedDeviceBinary) {
280+
if (!shouldSuppressRebuildWarning) {
281+
updateBuildLog(NEO::CompilerWarnings::recompiledFromIr.str());
282+
}
283+
279284
return buildFromSpirV(this->irBinary.get(), static_cast<uint32_t>(this->irBinarySize), this->options.c_str(), "", nullptr);
280285
} else {
281286
return processUnpackedBinary();
@@ -508,7 +513,9 @@ bool ModuleImp::initialize(const ze_module_desc_t *desc, NEO::Device *neoDevice)
508513
return false;
509514
}
510515
} else {
511-
this->createBuildOptions(desc->pBuildFlags, buildOptions, internalBuildOptions);
516+
std::string buildFlagsInput{desc->pBuildFlags != nullptr ? desc->pBuildFlags : ""};
517+
this->translationUnit->shouldSuppressRebuildWarning = NEO::CompilerOptions::extract(NEO::CompilerOptions::noRecompiledFromIr, buildFlagsInput);
518+
this->createBuildOptions(buildFlagsInput.c_str(), buildOptions, internalBuildOptions);
512519

513520
if (type == ModuleType::User && NEO::DebugManager.flags.InjectInternalBuildOptions.get() != "unk") {
514521
NEO::CompilerOptions::concatenateAppend(internalBuildOptions, NEO::DebugManager.flags.InjectInternalBuildOptions.get());

level_zero/core/source/module/module_imp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ struct ModuleTranslationUnit {
5757
NEO::ProgramInfo programInfo;
5858

5959
std::string options;
60+
bool shouldSuppressRebuildWarning{false};
6061

6162
std::string buildLog;
6263

level_zero/core/test/unit_tests/sources/module/test_module.cpp

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
*
66
*/
77

8+
#include "shared/source/compiler_interface/compiler_options/compiler_options.h"
9+
#include "shared/source/compiler_interface/compiler_warnings/compiler_warnings.h"
810
#include "shared/source/device_binary_format/debug_zebin.h"
911
#include "shared/source/gmm_helper/gmm.h"
1012
#include "shared/source/gmm_helper/gmm_helper.h"
@@ -1553,6 +1555,83 @@ HWTEST_F(ModuleTranslationUnitTest, GivenRebuildPrecompiledKernelsFlagAndFileWit
15531555
EXPECT_EQ(tu->irBinarySize != 0, tu->wasBuildFromSpirVCalled);
15541556
}
15551557

1558+
HWTEST_F(ModuleTranslationUnitTest, GivenRebuildFlagWhenCreatingModuleFromNativeBinaryThenModuleRecompilationWarningIsIssued) {
1559+
DebugManagerStateRestore dgbRestorer;
1560+
NEO::DebugManager.flags.RebuildPrecompiledKernels.set(true);
1561+
1562+
std::string testFile;
1563+
retrieveBinaryKernelFilenameNoRevision(testFile, "test_kernel_", ".bin");
1564+
1565+
size_t size = 0;
1566+
auto src = loadDataFromFile(testFile.c_str(), size);
1567+
1568+
ASSERT_NE(0u, size);
1569+
ASSERT_NE(nullptr, src);
1570+
1571+
ze_module_desc_t moduleDesc = {};
1572+
moduleDesc.format = ZE_MODULE_FORMAT_NATIVE;
1573+
moduleDesc.pInputModule = reinterpret_cast<const uint8_t *>(src.get());
1574+
moduleDesc.inputSize = size;
1575+
1576+
std::unique_ptr<ModuleBuildLog> moduleBuildLog{ModuleBuildLog::create()};
1577+
Module module(device, moduleBuildLog.get(), ModuleType::User);
1578+
MockModuleTU *tu = new MockModuleTU(device);
1579+
module.translationUnit.reset(tu);
1580+
1581+
bool success = module.initialize(&moduleDesc, neoDevice);
1582+
ASSERT_TRUE(success);
1583+
1584+
size_t buildLogSize{};
1585+
const auto querySizeResult{moduleBuildLog->getString(&buildLogSize, nullptr)};
1586+
ASSERT_EQ(ZE_RESULT_SUCCESS, querySizeResult);
1587+
1588+
std::string buildLog(buildLogSize, '\0');
1589+
const auto queryBuildLogResult{moduleBuildLog->getString(&buildLogSize, buildLog.data())};
1590+
ASSERT_EQ(ZE_RESULT_SUCCESS, queryBuildLogResult);
1591+
1592+
const auto containsWarning{buildLog.find(CompilerWarnings::recompiledFromIr.data()) != std::string::npos};
1593+
EXPECT_TRUE(containsWarning);
1594+
}
1595+
1596+
HWTEST_F(ModuleTranslationUnitTest, GivenRebuildFlagWhenCreatingModuleFromNativeBinaryAndWarningSuppressionIsPresentThenModuleRecompilationWarningIsNotIssued) {
1597+
DebugManagerStateRestore dgbRestorer;
1598+
NEO::DebugManager.flags.RebuildPrecompiledKernels.set(true);
1599+
1600+
std::string testFile;
1601+
retrieveBinaryKernelFilenameNoRevision(testFile, "test_kernel_", ".bin");
1602+
1603+
size_t size = 0;
1604+
auto src = loadDataFromFile(testFile.c_str(), size);
1605+
1606+
ASSERT_NE(0u, size);
1607+
ASSERT_NE(nullptr, src);
1608+
1609+
ze_module_desc_t moduleDesc = {};
1610+
moduleDesc.format = ZE_MODULE_FORMAT_NATIVE;
1611+
moduleDesc.pInputModule = reinterpret_cast<const uint8_t *>(src.get());
1612+
moduleDesc.inputSize = size;
1613+
moduleDesc.pBuildFlags = CompilerOptions::noRecompiledFromIr.data();
1614+
1615+
std::unique_ptr<ModuleBuildLog> moduleBuildLog{ModuleBuildLog::create()};
1616+
Module module(device, moduleBuildLog.get(), ModuleType::User);
1617+
MockModuleTU *tu = new MockModuleTU(device);
1618+
module.translationUnit.reset(tu);
1619+
1620+
bool success = module.initialize(&moduleDesc, neoDevice);
1621+
ASSERT_TRUE(success);
1622+
1623+
size_t buildLogSize{};
1624+
const auto querySizeResult{moduleBuildLog->getString(&buildLogSize, nullptr)};
1625+
ASSERT_EQ(ZE_RESULT_SUCCESS, querySizeResult);
1626+
1627+
std::string buildLog(buildLogSize, '\0');
1628+
const auto queryBuildLogResult{moduleBuildLog->getString(&buildLogSize, buildLog.data())};
1629+
ASSERT_EQ(ZE_RESULT_SUCCESS, queryBuildLogResult);
1630+
1631+
const auto containsWarning{buildLog.find(CompilerWarnings::recompiledFromIr.data()) != std::string::npos};
1632+
EXPECT_FALSE(containsWarning);
1633+
}
1634+
15561635
HWTEST_F(ModuleTranslationUnitTest, WhenCreatingFromNativeBinaryThenSetsUpRequiredTargetProductProperly) {
15571636
ZebinTestData::ValidEmptyProgram emptyProgram;
15581637
auto hwInfo = device->getNEODevice()->getHardwareInfo();

opencl/source/program/build.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77

88
#include "shared/source/compiler_interface/compiler_interface.h"
9+
#include "shared/source/compiler_interface/compiler_warnings/compiler_warnings.h"
910
#include "shared/source/device/device.h"
1011
#include "shared/source/device_binary_format/device_binary_formats.h"
1112
#include "shared/source/execution_environment/execution_environment.h"
@@ -69,6 +70,8 @@ cl_int Program::build(
6970
} else if (this->createdFrom != CreatedFrom::BINARY) {
7071
options = "";
7172
}
73+
74+
const bool shouldSuppressRebuildWarning{CompilerOptions::extract(CompilerOptions::noRecompiledFromIr, options)};
7275
extractInternalOptions(options, internalOptions);
7376
applyAdditionalOptions(internalOptions);
7477

@@ -128,6 +131,9 @@ cl_int Program::build(
128131
NEO::TranslationOutput compilerOuput = {};
129132

130133
for (const auto &clDevice : deviceVector) {
134+
if (shouldWarnAboutRebuild && !shouldSuppressRebuildWarning) {
135+
this->updateBuildLog(clDevice->getRootDeviceIndex(), CompilerWarnings::recompiledFromIr.data(), CompilerWarnings::recompiledFromIr.length());
136+
}
131137
auto compilerErr = pCompilerInterface->build(clDevice->getDevice(), inputArgs, compilerOuput);
132138
this->updateBuildLog(clDevice->getRootDeviceIndex(), compilerOuput.frontendCompilerLog.c_str(), compilerOuput.frontendCompilerLog.size());
133139
this->updateBuildLog(clDevice->getRootDeviceIndex(), compilerOuput.backendCompilerLog.c_str(), compilerOuput.backendCompilerLog.size());

opencl/source/program/compile.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77

88
#include "shared/source/compiler_interface/compiler_interface.h"
9+
#include "shared/source/compiler_interface/compiler_warnings/compiler_warnings.h"
910
#include "shared/source/device/device.h"
1011
#include "shared/source/device_binary_format/elf/elf.h"
1112
#include "shared/source/device_binary_format/elf/elf_encoder.h"
@@ -67,11 +68,11 @@ cl_int Program::compile(
6768
}
6869

6970
options = (buildOptions != nullptr) ? buildOptions : "";
71+
const auto shouldSuppressRebuildWarning{CompilerOptions::extract(CompilerOptions::noRecompiledFromIr, options)};
7072

7173
for (const auto &optionString : {CompilerOptions::gtpinRera, CompilerOptions::greaterThan4gbBuffersRequired}) {
72-
size_t pos = options.find(optionString.data());
73-
if (pos != std::string::npos) {
74-
options.erase(pos, optionString.length());
74+
const auto wasExtracted{CompilerOptions::extract(optionString, options)};
75+
if (wasExtracted) {
7576
CompilerOptions::concatenateAppend(internalOptions, optionString);
7677
}
7778
}
@@ -149,6 +150,10 @@ cl_int Program::compile(
149150
TranslationOutput compilerOuput;
150151
auto compilerErr = pCompilerInterface->compile(defaultDevice, inputArgs, compilerOuput);
151152
for (const auto &device : deviceVector) {
153+
if (shouldWarnAboutRebuild && !shouldSuppressRebuildWarning) {
154+
this->updateBuildLog(device->getRootDeviceIndex(), CompilerWarnings::recompiledFromIr.data(), CompilerWarnings::recompiledFromIr.length());
155+
}
156+
152157
this->updateBuildLog(device->getRootDeviceIndex(), compilerOuput.frontendCompilerLog.c_str(), compilerOuput.frontendCompilerLog.size());
153158
this->updateBuildLog(device->getRootDeviceIndex(), compilerOuput.backendCompilerLog.c_str(), compilerOuput.backendCompilerLog.size());
154159
}

opencl/source/program/program.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ cl_int Program::createProgramFromBinary(
199199
this->buildInfos[rootDeviceIndex].packedDeviceBinarySize = archive.size();
200200
} else {
201201
this->isCreatedFromBinary = false;
202+
this->shouldWarnAboutRebuild = true;
202203
}
203204

204205
switch (singleDeviceBinary.format) {

opencl/source/program/program.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@ class Program : public BaseObject<_cl_program> {
324324

325325
std::unordered_map<ClDevice *, DeviceBuildInfo> deviceBuildInfos;
326326
bool isCreatedFromBinary = false;
327+
bool shouldWarnAboutRebuild = false;
327328

328329
std::string sourceCode;
329330
std::string options;

opencl/test/unit_test/mocks/mock_program.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class MockProgram : public Program {
5353
using Program::Program;
5454
using Program::separateBlockKernels;
5555
using Program::setBuildStatus;
56+
using Program::shouldWarnAboutRebuild;
5657
using Program::sourceCode;
5758
using Program::specConstantsIds;
5859
using Program::specConstantsSizes;
@@ -144,11 +145,19 @@ class MockProgram : public Program {
144145

145146
cl_int rebuildProgramFromIr() {
146147
this->isCreatedFromBinary = false;
148+
this->shouldWarnAboutRebuild = true;
147149
setBuildStatus(CL_BUILD_NONE);
148150
std::unordered_map<std::string, BuiltinDispatchInfoBuilder *> builtins;
149151
return this->build(getDevices(), this->options.c_str(), false, builtins);
150152
}
151153

154+
cl_int recompile() {
155+
this->isCreatedFromBinary = false;
156+
this->shouldWarnAboutRebuild = true;
157+
setBuildStatus(CL_BUILD_NONE);
158+
return this->compile(getDevices(), this->options.c_str(), 0, nullptr, nullptr);
159+
}
160+
152161
void replaceDeviceBinary(std::unique_ptr<char[]> &&newBinary, size_t newBinarySize, uint32_t rootDeviceIndex) override {
153162
if (replaceDeviceBinaryCalledPerRootDevice.find(rootDeviceIndex) == replaceDeviceBinaryCalledPerRootDevice.end()) {
154163
replaceDeviceBinaryCalledPerRootDevice.insert({rootDeviceIndex, 1});

opencl/test/unit_test/program/program_tests.cpp

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "opencl/test/unit_test/program/program_tests.h"
99

1010
#include "shared/source/command_stream/command_stream_receiver_hw.h"
11+
#include "shared/source/compiler_interface/compiler_warnings/compiler_warnings.h"
1112
#include "shared/source/compiler_interface/intermediate_representations.h"
1213
#include "shared/source/device_binary_format/elf/elf_decoder.h"
1314
#include "shared/source/device_binary_format/elf/ocl_elf.h"
@@ -2577,6 +2578,76 @@ TEST_F(ProgramTests, givenProgramWithSpirvWhenRebuildProgramIsCalledThenSpirvPat
25772578
EXPECT_EQ(IGC::CodeType::oclGenBin, compilerInterface->requestedTranslationCtxs[0].second);
25782579
}
25792580

2581+
TEST_F(ProgramTests, givenProgramWithSpirvWhenRebuildIsCalledThenRebuildWarningIsIssued) {
2582+
const auto program{clUniquePtr(new MockProgram(toClDeviceVector(*pClDevice)))};
2583+
uint32_t spirv[16] = {0x03022307, 0x23471113, 0x17192329};
2584+
program->irBinary = makeCopy(spirv, sizeof(spirv));
2585+
program->irBinarySize = sizeof(spirv);
2586+
program->isSpirV = true;
2587+
2588+
const auto buildResult{program->rebuildProgramFromIr()};
2589+
ASSERT_EQ(CL_SUCCESS, buildResult);
2590+
2591+
const std::string buildLog{program->getBuildLog(pClDevice->getRootDeviceIndex())};
2592+
const auto containsWarning{buildLog.find(CompilerWarnings::recompiledFromIr.data()) != std::string::npos};
2593+
2594+
EXPECT_TRUE(containsWarning);
2595+
}
2596+
2597+
TEST_F(ProgramTests, givenProgramWithSpirvWhenRebuildIsCalledButSuppressFlagIsEnabledThenRebuildWarningIsNotIssued) {
2598+
const auto program{clUniquePtr(new MockProgram(toClDeviceVector(*pClDevice)))};
2599+
uint32_t spirv[16] = {0x03022307, 0x23471113, 0x17192329};
2600+
program->irBinary = makeCopy(spirv, sizeof(spirv));
2601+
program->irBinarySize = sizeof(spirv);
2602+
program->isSpirV = true;
2603+
2604+
const auto buildOptions{CompilerOptions::noRecompiledFromIr};
2605+
program->setBuildOptions(buildOptions.data());
2606+
2607+
const auto buildResult{program->rebuildProgramFromIr()};
2608+
ASSERT_EQ(CL_SUCCESS, buildResult);
2609+
2610+
const std::string buildLog{program->getBuildLog(pClDevice->getRootDeviceIndex())};
2611+
const auto containsWarning{buildLog.find(CompilerWarnings::recompiledFromIr.data()) != std::string::npos};
2612+
2613+
EXPECT_FALSE(containsWarning);
2614+
}
2615+
2616+
TEST_F(ProgramTests, givenProgramWithSpirvWhenRecompileIsCalledThenRebuildWarningIsIssued) {
2617+
const auto program{clUniquePtr(new MockProgram(toClDeviceVector(*pClDevice)))};
2618+
uint32_t spirv[16] = {0x03022307, 0x23471113, 0x17192329};
2619+
program->irBinary = makeCopy(spirv, sizeof(spirv));
2620+
program->irBinarySize = sizeof(spirv);
2621+
program->isSpirV = true;
2622+
2623+
const auto compileResult{program->recompile()};
2624+
ASSERT_EQ(CL_SUCCESS, compileResult);
2625+
2626+
const std::string buildLog{program->getBuildLog(pClDevice->getRootDeviceIndex())};
2627+
const auto containsWarning{buildLog.find(CompilerWarnings::recompiledFromIr.data()) != std::string::npos};
2628+
2629+
EXPECT_TRUE(containsWarning);
2630+
}
2631+
2632+
TEST_F(ProgramTests, givenProgramWithSpirvWhenRecompileIsCalledButSuppressFlagIsEnabledThenRebuildWarningIsNotIssued) {
2633+
const auto program{clUniquePtr(new MockProgram(toClDeviceVector(*pClDevice)))};
2634+
uint32_t spirv[16] = {0x03022307, 0x23471113, 0x17192329};
2635+
program->irBinary = makeCopy(spirv, sizeof(spirv));
2636+
program->irBinarySize = sizeof(spirv);
2637+
program->isSpirV = true;
2638+
2639+
const auto buildOptions{CompilerOptions::noRecompiledFromIr};
2640+
program->setBuildOptions(buildOptions.data());
2641+
2642+
const auto compileResult{program->recompile()};
2643+
ASSERT_EQ(CL_SUCCESS, compileResult);
2644+
2645+
const std::string buildLog{program->getBuildLog(pClDevice->getRootDeviceIndex())};
2646+
const auto containsWarning{buildLog.find(CompilerWarnings::recompiledFromIr.data()) != std::string::npos};
2647+
2648+
EXPECT_FALSE(containsWarning);
2649+
}
2650+
25802651
TEST_F(ProgramTests, whenRebuildingProgramThenStoreDeviceBinaryProperly) {
25812652
auto compilerInterface = new MockCompilerInterface();
25822653
pDevice->getExecutionEnvironment()->rootDeviceEnvironments[pDevice->getRootDeviceIndex()]->compilerInterface.reset(compilerInterface);
@@ -2766,6 +2837,25 @@ TEST(CreateProgramFromBinaryTests, givenBinaryProgramBuiltInWhenKernelRebulildIs
27662837
EXPECT_EQ(nullptr, pProgram->buildInfos[rootDeviceIndex].packedDeviceBinary);
27672838
EXPECT_EQ(0U, pProgram->buildInfos[rootDeviceIndex].packedDeviceBinarySize);
27682839
}
2840+
2841+
TEST(CreateProgramFromBinaryTests, givenBinaryProgramBuiltInWhenKernelRebulildIsForcedThenRebuildWarningIsEnabled) {
2842+
DebugManagerStateRestore dbgRestorer{};
2843+
DebugManager.flags.RebuildPrecompiledKernels.set(true);
2844+
2845+
PatchTokensTestData::ValidEmptyProgram programTokens;
2846+
cl_int retVal{CL_INVALID_BINARY};
2847+
2848+
const auto clDevice = std::make_unique<MockClDevice>(MockDevice::createWithNewExecutionEnvironment<MockDevice>(nullptr));
2849+
std::unique_ptr<MockProgram> pProgram(Program::createBuiltInFromGenBinary<MockProgram>(nullptr, toClDeviceVector(*clDevice), programTokens.storage.data(), programTokens.storage.size(), &retVal));
2850+
ASSERT_NE(nullptr, pProgram.get());
2851+
ASSERT_EQ(CL_SUCCESS, retVal);
2852+
2853+
retVal = pProgram->createProgramFromBinary(programTokens.storage.data(), programTokens.storage.size(), *clDevice);
2854+
ASSERT_EQ(CL_SUCCESS, retVal);
2855+
2856+
ASSERT_TRUE(pProgram->shouldWarnAboutRebuild);
2857+
}
2858+
27692859
TEST(CreateProgramFromBinaryTests, givenBinaryProgramNotBuiltInWhenBuiltInKernelRebulildIsForcedThenDeviceBinaryIsUsed) {
27702860
DebugManagerStateRestore dbgRestorer;
27712861
DebugManager.flags.RebuildPrecompiledKernels.set(true);

shared/source/compiler_interface/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ set(NEO_CORE_COMPILER_INTERFACE
2020
${CMAKE_CURRENT_SOURCE_DIR}/compiler_options/compiler_options_base.h
2121
${CMAKE_CURRENT_SOURCE_DIR}/compiler_options/compiler_options_base.cpp
2222
${CMAKE_CURRENT_SOURCE_DIR}/compiler_options${BRANCH_DIR_SUFFIX}compiler_options.h
23+
${CMAKE_CURRENT_SOURCE_DIR}/compiler_warnings/compiler_warnings.h
2324
)
2425

2526
set_property(GLOBAL PROPERTY NEO_CORE_COMPILER_INTERFACE ${NEO_CORE_COMPILER_INTERFACE})

0 commit comments

Comments
 (0)