// Copyright (c) 2017 Google Inc. // // 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 LIBSPIRV_SPIRV_STATS_H_ #define LIBSPIRV_SPIRV_STATS_H_ #include #include #include #include #include "spirv-tools/libspirv.hpp" namespace spvtools { struct SpirvStats { // Version histogram, version_word -> count. std::unordered_map version_hist; // Generator histogram, generator_word -> count. std::unordered_map generator_hist; // Capability histogram, SpvCapabilityXXX -> count. std::unordered_map capability_hist; // Extension histogram, extension_string -> count. std::unordered_map extension_hist; // Opcode histogram, SpvOpXXX -> count. std::unordered_map opcode_hist; // Histogram of words combining opcode and number of operands, // opcode | (num_operands << 16) -> count. std::unordered_map opcode_and_num_operands_hist; // OpConstant u16 histogram, value -> count. std::unordered_map u16_constant_hist; // OpConstant u32 histogram, value -> count. std::unordered_map u32_constant_hist; // OpConstant u64 histogram, value -> count. std::unordered_map u64_constant_hist; // OpConstant s16 histogram, value -> count. std::unordered_map s16_constant_hist; // OpConstant s32 histogram, value -> count. std::unordered_map s32_constant_hist; // OpConstant s64 histogram, value -> count. std::unordered_map s64_constant_hist; // OpConstant f32 histogram, value -> count. std::unordered_map f32_constant_hist; // OpConstant f64 histogram, value -> count. std::unordered_map f64_constant_hist; // Enum histogram, operand type -> operand value -> count. std::unordered_map> enum_hist; // Histogram of all non-id single words. // pair -> value -> count. // This is a generalization of enum_hist, also includes literal integers and // masks. std::map, std::map> operand_slot_non_id_words_hist; // Historgam of descriptors generated by IdDescriptorCollection. // Descriptor -> count. std::unordered_map id_descriptor_hist; // Debut labels for id descriptors, descriptor -> label. std::unordered_map id_descriptor_labels; // Historgam of descriptors generated by IdDescriptorCollection for every // operand slot. pair -> descriptor -> count. std::map, std::map> operand_slot_id_descriptor_hist; // Histogram of literal strings, sharded by opcodes, opcode -> string -> // count. // This is suboptimal if an opcode has multiple literal string operands, // as it wouldn't differentiate between operands. std::unordered_map> literal_strings_hist; // Markov chain histograms: // opcode -> next(opcode | (num_operands << 16)) -> count. // See also opcode_and_num_operands_hist, which collects global statistics. std::unordered_map> opcode_and_num_operands_markov_hist; // Used to collect statistics on opcodes triggering other opcodes. // Container scheme: gap between instructions -> cue opcode -> later opcode // -> count. // For example opcode_markov_hist[2][OpFMul][OpFAdd] corresponds to // the number of times an OpMul appears, followed by 2 other instructions, // followed by OpFAdd. // opcode_markov_hist[0][OpFMul][OpFAdd] corresponds to how many times // OpFMul appears, directly followed by OpFAdd. // The size of the outer std::vector also serves as an input parameter, // determining how many steps will be collected. // I.e. do opcode_markov_hist.resize(1) to collect data for one step only. std::vector< std::unordered_map>> opcode_markov_hist; }; // Aggregates existing |stats| with new stats extracted from |binary|. spv_result_t AggregateStats(const spv_context_t& context, const uint32_t* words, const size_t num_words, spv_diagnostic* pDiagnostic, SpirvStats* stats); } // namespace spvtools #endif // LIBSPIRV_SPIRV_STATS_H_