/* * Copyright (C) 2018-2021 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include "shared/offline_compiler/source/decoder/helper.h" #include "shared/offline_compiler/source/decoder/iga_wrapper.h" #include "shared/offline_compiler/source/ocloc_arg_helper.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(const std::string &file, const std::string &patch, const std::string &dump) : binaryFile(file), pathToPatch(patch), pathToDump(dump){}; BinaryDecoder(OclocArgHelper *helper) : argHelper(helper), iga(new IgaWrapper) { iga->setMessagePrinter(argHelper->getPrinterRef()); }; int decode(); int validateInput(const std::vector &args); bool showHelp = false; void printHelp(); protected: OclocArgHelper *argHelper = nullptr; bool ignoreIsaPadding = false; BinaryHeader programHeader, kernelHeader; std::vector binary; std::unique_ptr iga; PTMap patchTokens; std::string binaryFile, pathToPatch, pathToDump; void dumpField(const void *&binaryPtr, const PTField &field, std::ostream &ptmFile); uint8_t getSize(const std::string &typeStr); const void *getDevBinary(); std::vector loadPatchList(); void parseTokens(); 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); };