// Copyright (c) 2020 André Perez Maselco
//
// 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/fuzzer_pass_toggle_access_chain_instruction.h"

#include "source/fuzz/fuzzer_util.h"
#include "source/fuzz/instruction_descriptor.h"
#include "source/fuzz/transformation_toggle_access_chain_instruction.h"

namespace spvtools {
namespace fuzz {

FuzzerPassToggleAccessChainInstruction::FuzzerPassToggleAccessChainInstruction(
    opt::IRContext* ir_context, TransformationContext* transformation_context,
    FuzzerContext* fuzzer_context,
    protobufs::TransformationSequence* transformations)
    : FuzzerPass(ir_context, transformation_context, fuzzer_context,
                 transformations) {}

void FuzzerPassToggleAccessChainInstruction::Apply() {
  auto context = GetIRContext();
  // Iterates over the module's instructions and checks whether it is
  // OpAccessChain or OpInBoundsAccessChain. In this case, the transformation is
  // probabilistically applied.
  context->module()->ForEachInst([this,
                                  context](opt::Instruction* instruction) {
    SpvOp opcode = instruction->opcode();
    if ((opcode == SpvOpAccessChain || opcode == SpvOpInBoundsAccessChain) &&
        GetFuzzerContext()->ChoosePercentage(
            GetFuzzerContext()->GetChanceOfTogglingAccessChainInstruction())) {
      auto instructionDescriptor =
          MakeInstructionDescriptor(context, instruction);
      auto transformation =
          TransformationToggleAccessChainInstruction(instructionDescriptor);
      ApplyTransformation(transformation);
    }
  });
}

}  // namespace fuzz
}  // namespace spvtools
