From 13e6598947845413b14a4bbe3469f9906f82cc63 Mon Sep 17 00:00:00 2001 From: Jesus Carabano Date: Sat, 21 Oct 2017 19:39:32 +0300 Subject: [PATCH] restrict opcodes targeting OpDecorationGroup --- source/validate_id.cpp | 22 ++++++++++++++++++++++ test/val/val_id_test.cpp | 14 ++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/source/validate_id.cpp b/source/validate_id.cpp index a3ed893ed..987b67b0e 100644 --- a/source/validate_id.cpp +++ b/source/validate_id.cpp @@ -180,6 +180,27 @@ bool idUsage::isValid(const spv_instruction_t* inst, return true; } +template <> +bool idUsage::isValid(const spv_instruction_t* inst, + const spv_opcode_desc) { + auto decorationGroupIndex = 1; + auto decorationGroup = module_.FindDef(inst->words[decorationGroupIndex]); + + for (auto pair : decorationGroup->uses()) { + auto use = pair.first; + if (use->opcode() != SpvOpDecorate && + use->opcode() != SpvOpGroupDecorate && + use->opcode() != SpvOpGroupMemberDecorate && + use->opcode() != SpvOpName ) { + DIAG(decorationGroupIndex) << "Result id of OpDecorationGroup can only " + << "be targeted by OpName, OpGroupDecorate, " + << "OpDecorate, and OpGroupMemberDecorate"; + return false; + } + } + return true; +} + template <> bool idUsage::isValid(const spv_instruction_t* inst, const spv_opcode_desc) { @@ -2362,6 +2383,7 @@ bool idUsage::isValid(const spv_instruction_t* inst) { CASE(OpLine) CASE(OpDecorate) CASE(OpMemberDecorate) + CASE(OpDecorationGroup) CASE(OpGroupDecorate) CASE(OpGroupMemberDecorate) TODO(OpExtInst) diff --git a/test/val/val_id_test.cpp b/test/val/val_id_test.cpp index fd0c8a608..da997a31a 100644 --- a/test/val/val_id_test.cpp +++ b/test/val/val_id_test.cpp @@ -218,6 +218,20 @@ TEST_F(ValidateIdWithMessage, OpGroupDecorateGood) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); } +TEST_F(ValidateIdWithMessage, OpDecorationGroupBad) { + string spirv = kGLSL450MemoryModel + R"( +%1 = OpDecorationGroup + OpDecorate %1 Uniform + OpDecorate %1 GLSLShared + OpMemberDecorate %1 0 Constant + )"; + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Result id of OpDecorationGroup can only " + "be targeted by OpName, OpGroupDecorate, " + "OpDecorate, and OpGroupMemberDecorate")); +} TEST_F(ValidateIdWithMessage, OpGroupDecorateDecorationGroupBad) { string spirv = R"( OpCapability Shader