summaryrefslogtreecommitdiff
path: root/source/val/validate.cpp
diff options
context:
space:
mode:
authorAlan Baker <alanbaker@google.com>2018-08-03 12:57:11 -0400
committerAlan Baker <alanbaker@google.com>2018-08-07 10:29:30 -0400
commit2896b8f0e5f85a726d724d46c0641529280a7a31 (patch)
treed7778988041482d3c5a9b9c4a2a2f22a4f629da6 /source/val/validate.cpp
parent6fea4023685f1b633b6bb9962c07e58e3c4164d6 (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.cpp50
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.