compute-runtime/shared/offline_compiler/source/offline_linker.h

85 lines
2.4 KiB
C++

/*
* Copyright (C) 2022-2023 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#pragma once
#include "shared/source/helpers/hw_info.h"
#include "shared/source/utilities/arrayref.h"
#include "ocl_igc_interface/code_type.h"
#include <cstddef>
#include <memory>
#include <string>
#include <utility>
#include <vector>
class OclocArgHelper;
namespace NEO {
class OsLibrary;
class OclocIgcFacade;
class OfflineLinker {
protected:
enum class OperationMode {
skipExecution = 0,
showHelp = 1,
linkFiles = 2,
};
struct InputFileContent {
InputFileContent(std::unique_ptr<char[]> bytes, size_t size, IGC::CodeType::CodeType_t codeType)
: bytes{std::move(bytes)}, size{size}, codeType{codeType} {}
std::unique_ptr<char[]> bytes{};
size_t size{};
IGC::CodeType::CodeType_t codeType{};
};
public:
static std::unique_ptr<OfflineLinker> create(size_t argsCount, const std::vector<std::string> &args, int &errorCode, OclocArgHelper *argHelper);
MOCKABLE_VIRTUAL ~OfflineLinker();
int execute();
std::string getBuildLog() const;
protected:
explicit OfflineLinker(OclocArgHelper *argHelper, std::unique_ptr<OclocIgcFacade> igcFacade);
int initialize(size_t argsCount, const std::vector<std::string> &args);
int parseCommand(size_t argsCount, const std::vector<std::string> &args);
IGC::CodeType::CodeType_t parseOutputFormat(const std::string &outputFormatName);
int verifyLinkerCommand();
int loadInputFilesContent();
IGC::CodeType::CodeType_t detectCodeType(char *bytes, size_t size) const;
int initHardwareInfo();
int link();
int showHelp();
std::vector<uint8_t> createSingleInputFile() const;
std::pair<int, std::vector<uint8_t>> translateToOutputFormat(const std::vector<uint8_t> &elfInput);
void tryToStoreBuildLog(const char *buildLogRaw, size_t size);
MOCKABLE_VIRTUAL ArrayRef<const HardwareInfo *> getHardwareInfoTable() const;
OclocArgHelper *argHelper{};
OperationMode operationMode{};
std::vector<std::string> inputFilenames{};
std::vector<InputFileContent> inputFilesContent{};
std::string outputFilename{};
IGC::CodeType::CodeType_t outputFormat{};
std::string options{};
std::string internalOptions{};
std::unique_ptr<OclocIgcFacade> igcFacade;
HardwareInfo hwInfo{};
std::string buildLog{};
};
} // namespace NEO