1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- // Copyright (c) 2018 Google LLC.
- //
- // 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.
- #include "source/val/validate.h"
- #include "source/val/function.h"
- #include "source/val/validation_state.h"
- namespace spvtools {
- namespace val {
- spv_result_t ValidateExecutionLimitations(ValidationState_t& _,
- const Instruction* inst) {
- if (inst->opcode() != SpvOpFunction) {
- return SPV_SUCCESS;
- }
- const auto func = _.function(inst->id());
- if (!func) {
- return _.diag(SPV_ERROR_INTERNAL, inst)
- << "Internal error: missing function id " << inst->id() << ".";
- }
- for (uint32_t entry_id : _.FunctionEntryPoints(inst->id())) {
- const auto* models = _.GetExecutionModels(entry_id);
- if (models) {
- if (models->empty()) {
- return _.diag(SPV_ERROR_INTERNAL, inst)
- << "Internal error: empty execution models for function id "
- << entry_id << ".";
- }
- for (const auto model : *models) {
- std::string reason;
- if (!func->IsCompatibleWithExecutionModel(model, &reason)) {
- return _.diag(SPV_ERROR_INVALID_ID, inst)
- << "OpEntryPoint Entry Point <id> '" << _.getIdName(entry_id)
- << "'s callgraph contains function <id> "
- << _.getIdName(inst->id())
- << ", which cannot be used with the current execution "
- "model:\n"
- << reason;
- }
- }
- }
- }
- return SPV_SUCCESS;
- }
- } // namespace val
- } // namespace spvtools
|