// 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. #ifndef SOURCE_FUZZ_REPLAYER_H_ #define SOURCE_FUZZ_REPLAYER_H_ #include #include #include "source/fuzz/protobufs/spirvfuzz_protobufs.h" #include "source/fuzz/transformation_context.h" #include "source/opt/ir_context.h" #include "spirv-tools/libspirv.hpp" namespace spvtools { namespace fuzz { // Transforms a SPIR-V module into a semantically equivalent SPIR-V module by // applying a series of pre-defined transformations. class Replayer { public: // Possible statuses that can result from running the replayer. enum class ReplayerResultStatus { kComplete, kFailedToCreateSpirvToolsInterface, kInitialBinaryInvalid, kReplayValidationFailure, kTooManyTransformationsRequested, }; struct ReplayerResult { ReplayerResultStatus status; std::unique_ptr transformed_module; std::unique_ptr transformation_context; protobufs::TransformationSequence applied_transformations; }; Replayer(spv_target_env target_env, MessageConsumer consumer, const std::vector& binary_in, const protobufs::FactSequence& initial_facts, const protobufs::TransformationSequence& transformation_sequence_in, uint32_t num_transformations_to_apply, bool validate_during_replay, spv_validator_options validator_options); // Disables copy/move constructor/assignment operations. Replayer(const Replayer&) = delete; Replayer(Replayer&&) = delete; Replayer& operator=(const Replayer&) = delete; Replayer& operator=(Replayer&&) = delete; ~Replayer(); // Attempts to apply the first |num_transformations_to_apply_| transformations // from |transformation_sequence_in_| to |binary_in_|. Initial facts about // the input binary and the context in which it will execute are provided via // |initial_facts_|. // // On success, returns a successful result status together with the // transformations that were applied, the IR for the transformed module, and // the transformation context that arises from applying these transformations. // Otherwise, returns an appropriate result status, an empty transformation // sequence, and null pointers for the IR context and transformation context. ReplayerResult Run(); private: // Target environment. const spv_target_env target_env_; // Message consumer. MessageConsumer consumer_; // The binary to which transformations are to be applied. const std::vector& binary_in_; // Initial facts known to hold in advance of applying any transformations. const protobufs::FactSequence& initial_facts_; // The transformations to be replayed. const protobufs::TransformationSequence& transformation_sequence_in_; // The number of transformations that should be replayed. const uint32_t num_transformations_to_apply_; // Controls whether the validator should be run after every replay step. const bool validate_during_replay_; // Options to control validation spv_validator_options validator_options_; }; } // namespace fuzz } // namespace spvtools #endif // SOURCE_FUZZ_REPLAYER_H_