diff options
author | Alan Baker <alanbaker@google.com> | 2018-08-03 12:57:11 -0400 |
---|---|---|
committer | Alan Baker <alanbaker@google.com> | 2018-08-07 10:29:30 -0400 |
commit | 2896b8f0e5f85a726d724d46c0641529280a7a31 (patch) | |
tree | d7778988041482d3c5a9b9c4a2a2f22a4f629da6 /source/val/validate.cpp | |
parent | 6fea4023685f1b633b6bb9962c07e58e3c4164d6 (diff) |
Refactor where opcodes are validated
* Replaced uses in opcode validation of current_function()
* Added non-const accessor to function lookup in ValidationState_t
* Updated a couple bad tests due to check reordering
Diffstat (limited to 'source/val/validate.cpp')
-rw-r--r-- | source/val/validate.cpp | 50 |
1 files changed, 26 insertions, 24 deletions
diff --git a/source/val/validate.cpp b/source/val/validate.cpp index 7fd9fe85..d642ec0d 100644 --- a/source/val/validate.cpp +++ b/source/val/validate.cpp @@ -242,9 +242,7 @@ spv_result_t ValidateBinaryUsingContextAndValidationState( return error; } - for (size_t i = 0; i < vstate->ordered_instructions().size(); ++i) { - auto& instruction = vstate->ordered_instructions()[i]; - + for (auto& instruction : vstate->ordered_instructions()) { { // In order to do this work outside of Process Instruction we need to be // able to, briefly, de-const the instruction. @@ -292,28 +290,7 @@ spv_result_t ValidateBinaryUsingContextAndValidationState( if (auto error = ModuleLayoutPass(*vstate, &instruction)) return error; if (auto error = CfgPass(*vstate, &instruction)) return error; if (auto error = InstructionPass(*vstate, &instruction)) return error; - if (auto error = TypeUniquePass(*vstate, &instruction)) return error; - if (auto error = ArithmeticsPass(*vstate, &instruction)) return error; - if (auto error = CompositesPass(*vstate, &instruction)) return error; - if (auto error = ConversionPass(*vstate, &instruction)) return error; - if (auto error = DerivativesPass(*vstate, &instruction)) return error; - if (auto error = LogicalsPass(*vstate, &instruction)) return error; - if (auto error = BitwisePass(*vstate, &instruction)) return error; - if (auto error = ExtInstPass(*vstate, &instruction)) return error; - if (auto error = ImagePass(*vstate, &instruction)) return error; - if (auto error = AtomicsPass(*vstate, &instruction)) return error; - if (auto error = BarriersPass(*vstate, &instruction)) return error; - if (auto error = PrimitivesPass(*vstate, &instruction)) return error; - if (auto error = LiteralsPass(*vstate, &instruction)) return error; - if (auto error = NonUniformPass(*vstate, &instruction)) return error; - if (auto error = UpdateIdUse(*vstate, &instruction)) return error; - if (auto error = ValidateMemoryInstructions(*vstate, &instruction)) - return error; - - // Validate the preconditions involving adjacent instructions. e.g. SpvOpPhi - // must only be preceeded by SpvOpLabel, SpvOpPhi, or SpvOpLine. - if (auto error = ValidateAdjacency(*vstate, i)) return error; } if (!vstate->has_memory_model_specified()) @@ -337,6 +314,31 @@ spv_result_t ValidateBinaryUsingContextAndValidationState( // for() above as it loops over all ordered_instructions internally. if (auto error = ValidateBuiltIns(*vstate)) return error; + // Validate individual opcodes. + for (size_t i = 0; i < vstate->ordered_instructions().size(); ++i) { + auto& instruction = vstate->ordered_instructions()[i]; + if (auto error = TypeUniquePass(*vstate, &instruction)) return error; + if (auto error = ArithmeticsPass(*vstate, &instruction)) return error; + if (auto error = CompositesPass(*vstate, &instruction)) return error; + if (auto error = ConversionPass(*vstate, &instruction)) return error; + if (auto error = DerivativesPass(*vstate, &instruction)) return error; + if (auto error = LogicalsPass(*vstate, &instruction)) return error; + if (auto error = BitwisePass(*vstate, &instruction)) return error; + if (auto error = ExtInstPass(*vstate, &instruction)) return error; + if (auto error = ImagePass(*vstate, &instruction)) return error; + if (auto error = AtomicsPass(*vstate, &instruction)) return error; + if (auto error = BarriersPass(*vstate, &instruction)) return error; + if (auto error = PrimitivesPass(*vstate, &instruction)) return error; + if (auto error = LiteralsPass(*vstate, &instruction)) return error; + if (auto error = NonUniformPass(*vstate, &instruction)) return error; + if (auto error = ValidateMemoryInstructions(*vstate, &instruction)) + return error; + + // Validate the preconditions involving adjacent instructions. e.g. SpvOpPhi + // must only be preceeded by SpvOpLabel, SpvOpPhi, or SpvOpLine. + if (auto error = ValidateAdjacency(*vstate, i)) return error; + } + // NOTE: Copy each instruction for easier processing std::vector<spv_instruction_t> instructions; // Expect average instruction length to be a bit over 2 words. |