Validate OpenCL memory and addressing model environment rules (#2589)

Signed-off-by: Kevin Petit <kevin.petit@arm.com>
This commit is contained in:
Kévin Petit 2019-05-17 13:25:20 +01:00 committed by alan-baker
parent ff4feb44b4
commit 47741f0504
4 changed files with 77 additions and 1 deletions

View File

@ -511,6 +511,19 @@ spv_result_t InstructionPass(ValidationState_t& _, const Instruction* inst) {
<< "Memory model must be VulkanKHR for WebGPU environment.";
}
}
if (spvIsOpenCLEnv(_.context()->target_env)) {
if ((_.addressing_model() != SpvAddressingModelPhysical32) &&
(_.addressing_model() != SpvAddressingModelPhysical64)) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
<< "Addressing model must be Physical32 or Physical64 "
<< "in the OpenCL environment.";
}
if (_.memory_model() != SpvMemoryModelOpenCL) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
<< "Memory model must be OpenCL in the OpenCL environment.";
}
}
} else if (opcode == SpvOpExecutionMode) {
const uint32_t entry_point = inst->word(1);
_.RegisterExecutionModeForEntryPoint(entry_point,

View File

@ -63,6 +63,7 @@ add_spvtools_unittest(TARGET val_fghijklmnop
val_memory_test.cpp
val_modes_test.cpp
val_non_uniform_test.cpp
val_opencl_test.cpp
val_primitives_test.cpp
${VAL_TEST_COMMON_SRCS}
LIBS ${SPIRV_TOOLS}

View File

@ -0,0 +1,61 @@
// Copyright (c) 2019 The Khronos Group Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Validation tests for OpenCL env specific checks
#include <string>
#include "gmock/gmock.h"
#include "test/val/val_fixtures.h"
namespace spvtools {
namespace val {
namespace {
using testing::HasSubstr;
using ValidateOpenCL = spvtest::ValidateBase<bool>;
TEST_F(ValidateOpenCL, NonPhysicalAddressingModelBad) {
std::string spirv = R"(
OpCapability Kernel
OpMemoryModel Logical OpenCL
)";
CompileSuccessfully(spirv);
EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_OPENCL_1_2));
EXPECT_THAT(getDiagnosticString(),
HasSubstr("Addressing model must be Physical32 or Physical64 "
"in the OpenCL environment.\n OpMemoryModel Logical "
"OpenCL\n"));
}
TEST_F(ValidateOpenCL, NonOpenCLMemoryModelBad) {
std::string spirv = R"(
OpCapability Kernel
OpMemoryModel Physical32 GLSL450
)";
CompileSuccessfully(spirv);
EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_OPENCL_1_2));
EXPECT_THAT(getDiagnosticString(),
HasSubstr("Memory model must be OpenCL in the OpenCL environment."
"\n OpMemoryModel Physical32 GLSL450\n"));
}
} // namespace
} // namespace val
} // namespace spvtools

View File

@ -56,9 +56,10 @@ OpFunctionEnd
)";
const std::string opencl_spirv = R"(
OpCapability Addresses
OpCapability Kernel
OpCapability Linkage
OpMemoryModel Logical OpenCL
OpMemoryModel Physical32 OpenCL
)";
std::string version(spv_target_env env) {