/* * Copyright (C) 2020-2024 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include "shared/offline_compiler/source/decoder/helper.h" #include "shared/source/utilities/const_stringref.h" #include #include #include #include #include #include constexpr auto *oclocStdoutLogName = "stdout.log"; struct ProductConfigHelper; namespace NEO { class CompilerProductHelper; class ReleaseHelper; struct HardwareInfo; } // namespace NEO struct Source { const uint8_t *data; const size_t length; const char *name; Source(const uint8_t *data, const size_t length, const char *name) : data(data), length(length), name(name){}; void toVectorOfStrings(std::vector &lines, bool replaceTabs = false); inline std::vector toBinaryVector() { return std::vector(data, data + length); }; }; struct Output { std::string name; uint8_t *data; const size_t size; Output(const std::string &name, const void *data, const size_t &size); }; class OclocArgHelper { protected: std::vector inputs, headers; std::vector> outputs; uint32_t *numOutputs = nullptr; char ***nameOutputs = nullptr; uint8_t ***dataOutputs = nullptr; uint64_t **lenOutputs = nullptr; bool hasOutput = false; MessagePrinter messagePrinter; void moveOutputs(); Source *findSourceFile(const std::string &filename); bool sourceFileExists(const std::string &filename) const; inline void addOutput(const std::string &filename, const void *data, const size_t &size) { outputs.push_back(std::make_unique(filename, data, size)); } bool verbose = false; public: OclocArgHelper(); OclocArgHelper(const uint32_t numSources, const uint8_t **dataSources, const uint64_t *lenSources, const char **nameSources, const uint32_t numInputHeaders, const uint8_t **dataInputHeaders, const uint64_t *lenInputHeaders, const char **nameInputHeaders, uint32_t *numOutputs, uint8_t ***dataOutputs, uint64_t **lenOutputs, char ***nameOutputs); virtual ~OclocArgHelper(); MOCKABLE_VIRTUAL bool fileExists(const std::string &filename) const; bool setHwInfoForProductConfig(uint32_t productConfig, NEO::HardwareInfo &hwInfo, std::unique_ptr &compilerProductHelper, std::unique_ptr &releaseHelper); uint32_t getProductConfigAndSetHwInfoBasedOnDeviceAndRevId(NEO::HardwareInfo &hwInfo, unsigned short deviceID, int revisionID, std::unique_ptr &compilerProductHelper, std::unique_ptr &releaseHelper); void setHwInfoForHwInfoConfig(NEO::HardwareInfo &hwInfo, uint64_t hwInfoConfig, std::unique_ptr &compilerProductHelper, std::unique_ptr &releaseHelper); std::vector headersToVectorOfStrings(); MOCKABLE_VIRTUAL void readFileToVectorOfStrings(const std::string &filename, std::vector &lines); MOCKABLE_VIRTUAL std::vector readBinaryFile(const std::string &filename); MOCKABLE_VIRTUAL std::unique_ptr loadDataFromFile(const std::string &filename, size_t &retSize); void dontSetupOutputs() { hasOutput = false; } bool outputEnabled() const { return hasOutput; } bool hasHeaders() const { return headers.size() > 0; } const std::vector &getHeaders() const { return headers; } bool isVerbose() const { return verbose; } void setVerbose(bool verbose) { this->verbose = verbose; } MOCKABLE_VIRTUAL void saveOutput(const std::string &filename, const void *pData, const size_t &dataSize); MessagePrinter &getPrinterRef() { return messagePrinter; } void printf(const char *message) { messagePrinter.printf(message); } template void printf(const char *format, Args... args) { messagePrinter.printf(format, std::forward(args)...); } template static auto findDuplicate(const EqComparableT &lhs) { return [&lhs](const auto &rhs) { return lhs == rhs; }; } template static auto getArgsWithoutDuplicate(const Args &...args) { std::vector out{}; for (const auto *acronyms : {std::addressof(args)...}) { for (const auto &acronym : *acronyms) { if (!std::any_of(out.begin(), out.end(), findDuplicate(acronym))) { out.push_back(acronym); } } } return out; } template static auto createStringForArgs(const Args &...args) { std::ostringstream os; for (const auto *acronyms : {std::addressof(args)...}) { for (const auto &acronym : *acronyms) { if (os.tellp()) os << ", "; os << acronym.str(); } } return os.str(); } std::unique_ptr productConfigHelper; };