/* * Copyright (C) 2018-2020 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include "offline_compiler/decoder/helper.h" #include "offline_compiler/decoder/iga_wrapper.h" #include #include #include #include struct PTField { uint8_t size = 0U; std::string name; }; struct BinaryHeader { std::vector fields; uint32_t size = 0U; }; struct PatchToken : BinaryHeader { std::string name; }; using PTMap = std::unordered_map>; class BinaryDecoder { public: BinaryDecoder() : iga(new IgaWrapper) { iga->setMessagePrinter(messagePrinter); } BinaryDecoder(const std::string &file, const std::string &patch, const std::string &dump) : binaryFile(file), pathToPatch(patch), pathToDump(dump){}; int decode(); int validateInput(uint32_t argc, const char **argv); void setMessagePrinter(const MessagePrinter &messagePrinter); protected: bool ignoreIsaPadding = false; BinaryHeader programHeader, kernelHeader; std::vector binary; std::unique_ptr iga; PTMap patchTokens; std::string binaryFile, pathToPatch, pathToDump; MessagePrinter messagePrinter; void dumpField(const void *&binaryPtr, const PTField &field, std::ostream &ptmFile); uint8_t getSize(const std::string &typeStr); const void *getDevBinary(); void parseTokens(); void printHelp(); int processBinary(const void *&ptr, std::ostream &ptmFile); void processKernel(const void *&ptr, std::ostream &ptmFile); void readPatchTokens(const void *&patchListPtr, uint32_t patchListSize, std::ostream &ptmFile); uint32_t readStructFields(const std::vector &patchList, const size_t &structPos, std::vector &fields); };