// Copyright (c) 2019 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/fuzz/id_use_descriptor.h" #include "source/fuzz/instruction_descriptor.h" namespace spvtools { namespace fuzz { opt::Instruction* FindInstructionContainingUse( const protobufs::IdUseDescriptor& id_use_descriptor, opt::IRContext* context) { auto result = FindInstruction(id_use_descriptor.enclosing_instruction(), context); if (!result) { return nullptr; } if (id_use_descriptor.in_operand_index() >= result->NumInOperands()) { return nullptr; } if (result->GetSingleWordInOperand(id_use_descriptor.in_operand_index()) != id_use_descriptor.id_of_interest()) { return nullptr; } return result; } protobufs::IdUseDescriptor MakeIdUseDescriptor( uint32_t id_of_interest, const protobufs::InstructionDescriptor& enclosing_instruction, uint32_t in_operand_index) { protobufs::IdUseDescriptor result; result.set_id_of_interest(id_of_interest); *result.mutable_enclosing_instruction() = enclosing_instruction; result.set_in_operand_index(in_operand_index); return result; } protobufs::IdUseDescriptor MakeIdUseDescriptorFromUse( opt::IRContext* context, opt::Instruction* inst, uint32_t in_operand_index) { const auto& in_operand = inst->GetInOperand(in_operand_index); assert(in_operand.type == SPV_OPERAND_TYPE_ID); return MakeIdUseDescriptor(in_operand.words[0], MakeInstructionDescriptor(context, inst), in_operand_index); } } // namespace fuzz } // namespace spvtools