2020-01-12 01:25:26 +08:00
|
|
|
/*
|
2021-07-10 04:00:18 +08:00
|
|
|
* Copyright (C) 2020-2021 Intel Corporation
|
2020-01-12 01:25:26 +08:00
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: MIT
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2020-02-24 05:44:01 +08:00
|
|
|
#include "shared/source/program/program_info_from_patchtokens.h"
|
2020-01-12 01:25:26 +08:00
|
|
|
|
2020-02-24 05:44:01 +08:00
|
|
|
#include "shared/source/compiler_interface/linker.h"
|
|
|
|
#include "shared/source/debug_settings/debug_settings_manager.h"
|
|
|
|
#include "shared/source/device_binary_format/patchtokens_decoder.h"
|
2021-09-30 03:10:53 +08:00
|
|
|
#include "shared/source/program/kernel_info.h"
|
2020-02-24 05:44:01 +08:00
|
|
|
#include "shared/source/program/program_info.h"
|
2020-02-24 17:22:30 +08:00
|
|
|
|
2020-02-23 05:50:57 +08:00
|
|
|
#include "opencl/source/program/kernel_info_from_patchtokens.h"
|
2020-01-12 01:25:26 +08:00
|
|
|
|
|
|
|
namespace NEO {
|
|
|
|
|
|
|
|
bool requiresLocalMemoryWindowVA(const PatchTokenBinary::ProgramFromPatchtokens &src) {
|
2020-03-30 22:59:02 +08:00
|
|
|
for (const auto &kernel : src.kernels) {
|
2020-01-12 01:25:26 +08:00
|
|
|
if (kernel.tokens.crossThreadPayloadArgs.localMemoryStatelessWindowStartAddress) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-01-26 02:18:48 +08:00
|
|
|
void populateSingleKernelInfo(ProgramInfo &dst, const PatchTokenBinary::ProgramFromPatchtokens &decodedProgram, uint32_t kernelNum) {
|
2020-01-12 01:25:26 +08:00
|
|
|
auto kernelInfo = std::make_unique<KernelInfo>();
|
|
|
|
const PatchTokenBinary::KernelFromPatchtokens &decodedKernel = decodedProgram.kernels[kernelNum];
|
|
|
|
|
2020-01-26 02:18:48 +08:00
|
|
|
NEO::populateKernelInfo(*kernelInfo, decodedKernel, decodedProgram.header->GPUPointerSizeInBytes);
|
2020-01-12 01:25:26 +08:00
|
|
|
|
|
|
|
if (decodedKernel.tokens.programSymbolTable) {
|
|
|
|
dst.prepareLinkerInputStorage();
|
2021-07-10 04:00:18 +08:00
|
|
|
dst.linkerInput->undefinedSymbolsAllowed = dst.levelZeroDynamicLinkProgram;
|
2020-01-12 01:25:26 +08:00
|
|
|
dst.linkerInput->decodeExportedFunctionsSymbolTable(decodedKernel.tokens.programSymbolTable + 1, decodedKernel.tokens.programSymbolTable->NumEntries, kernelNum);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (decodedKernel.tokens.programRelocationTable) {
|
|
|
|
dst.prepareLinkerInputStorage();
|
|
|
|
dst.linkerInput->decodeRelocationTable(decodedKernel.tokens.programRelocationTable + 1, decodedKernel.tokens.programRelocationTable->NumEntries, kernelNum);
|
|
|
|
}
|
|
|
|
|
|
|
|
dst.kernelInfos.push_back(kernelInfo.release());
|
|
|
|
}
|
|
|
|
|
2020-01-26 02:18:48 +08:00
|
|
|
void populateProgramInfo(ProgramInfo &dst, const PatchTokenBinary::ProgramFromPatchtokens &src) {
|
2020-01-12 01:25:26 +08:00
|
|
|
for (uint32_t i = 0; i < src.kernels.size(); ++i) {
|
2020-01-26 02:18:48 +08:00
|
|
|
populateSingleKernelInfo(dst, src, i);
|
2020-01-12 01:25:26 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if (src.programScopeTokens.allocateConstantMemorySurface.empty() == false) {
|
|
|
|
auto surface = src.programScopeTokens.allocateConstantMemorySurface[0];
|
|
|
|
dst.globalConstants.size = surface->InlineDataSize;
|
|
|
|
dst.globalConstants.initData = NEO::PatchTokenBinary::getInlineData(surface);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (src.programScopeTokens.allocateGlobalMemorySurface.empty() == false) {
|
|
|
|
auto surface = src.programScopeTokens.allocateGlobalMemorySurface[0];
|
|
|
|
dst.globalVariables.size = surface->InlineDataSize;
|
|
|
|
dst.globalVariables.initData = NEO::PatchTokenBinary::getInlineData(surface);
|
|
|
|
}
|
|
|
|
|
2021-08-19 19:28:34 +08:00
|
|
|
constexpr ConstStringRef globalConstantsSymbolName = "globalConstants";
|
|
|
|
constexpr ConstStringRef globalVariablesSymbolName = "globalVariables";
|
|
|
|
|
2020-01-12 01:25:26 +08:00
|
|
|
if (false == (src.programScopeTokens.constantPointer.empty() && src.programScopeTokens.globalPointer.empty() && (src.programScopeTokens.symbolTable == nullptr))) {
|
|
|
|
UNRECOVERABLE_IF((src.header->GPUPointerSizeInBytes != 4) && (src.header->GPUPointerSizeInBytes != 8));
|
|
|
|
dst.prepareLinkerInputStorage();
|
|
|
|
dst.linkerInput->setPointerSize((src.header->GPUPointerSizeInBytes == 4) ? LinkerInput::Traits::PointerSize::Ptr32bit : LinkerInput::Traits::PointerSize::Ptr64bit);
|
2021-08-19 19:28:34 +08:00
|
|
|
|
|
|
|
dst.linkerInput->addSymbol(globalConstantsSymbolName.data(), {0U, 8U, SegmentType::GlobalConstants});
|
|
|
|
dst.linkerInput->addSymbol(globalVariablesSymbolName.data(), {0U, 8U, SegmentType::GlobalVariables});
|
2020-01-12 01:25:26 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
for (const auto &globalConstantPointerToken : src.programScopeTokens.constantPointer) {
|
|
|
|
NEO::LinkerInput::RelocationInfo relocInfo = {};
|
|
|
|
relocInfo.relocationSegment = NEO::SegmentType::GlobalConstants;
|
|
|
|
relocInfo.offset = readMisalignedUint64(&globalConstantPointerToken->ConstantPointerOffset);
|
|
|
|
relocInfo.type = NEO::LinkerInput::RelocationInfo::Type::Address;
|
2021-08-19 19:28:34 +08:00
|
|
|
relocInfo.symbolName = std::string(globalConstantsSymbolName);
|
|
|
|
if (iOpenCL::PROGRAM_SCOPE_CONSTANT_BUFFER != globalConstantPointerToken->BufferType) {
|
|
|
|
UNRECOVERABLE_IF(iOpenCL::PROGRAM_SCOPE_GLOBAL_BUFFER != globalConstantPointerToken->BufferType);
|
|
|
|
relocInfo.symbolName = std::string(globalVariablesSymbolName);
|
|
|
|
}
|
|
|
|
|
2020-01-12 01:25:26 +08:00
|
|
|
dst.linkerInput->addDataRelocationInfo(relocInfo);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (const auto &globalVariablePointerToken : src.programScopeTokens.globalPointer) {
|
|
|
|
NEO::LinkerInput::RelocationInfo relocInfo = {};
|
|
|
|
relocInfo.relocationSegment = NEO::SegmentType::GlobalVariables;
|
|
|
|
relocInfo.offset = readMisalignedUint64(&globalVariablePointerToken->GlobalPointerOffset);
|
|
|
|
relocInfo.type = NEO::LinkerInput::RelocationInfo::Type::Address;
|
2021-08-19 19:28:34 +08:00
|
|
|
relocInfo.symbolName = std::string(globalVariablesSymbolName);
|
|
|
|
if (iOpenCL::PROGRAM_SCOPE_GLOBAL_BUFFER != globalVariablePointerToken->BufferType) {
|
|
|
|
UNRECOVERABLE_IF(iOpenCL::PROGRAM_SCOPE_CONSTANT_BUFFER != globalVariablePointerToken->BufferType);
|
|
|
|
relocInfo.symbolName = std::string(globalConstantsSymbolName);
|
|
|
|
}
|
|
|
|
|
2020-01-12 01:25:26 +08:00
|
|
|
dst.linkerInput->addDataRelocationInfo(relocInfo);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (src.programScopeTokens.symbolTable != nullptr) {
|
|
|
|
const auto patch = src.programScopeTokens.symbolTable;
|
|
|
|
dst.linkerInput->decodeGlobalVariablesSymbolTable(patch + 1, patch->NumEntries);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace NEO
|