blob: e3ac0b8d5f9cca38f4d1649e1999f3bf3c7b33a4 [file]
//===------------ Program.cpp - liboffload program abstraction ------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "Program.h"
#include "OffloadError.h"
#include <cstdint>
using namespace llvm;
Expected<ProgramTy> ProgramTy::create(ol_context_handle_t Context,
ol_device_handle_t Device,
__tgt_device_image *Img) {
ol_program_handle_t Handle;
size_t ImageSize = reinterpret_cast<uintptr_t>(Img->ImageEnd) -
reinterpret_cast<uintptr_t>(Img->ImageStart);
if (auto Res =
olCreateProgram(Context, Device, Img->ImageStart, ImageSize, &Handle))
return error::createOffloadError(error::ErrorCode::INVALID_BINARY,
"failed to load binary %p: %s", Img,
Res->Details);
return ProgramTy(Handle);
}
Expected<void *> ProgramTy::getGlobalAddress(const char *Name,
size_t *Size) const {
ol_symbol_handle_t Symbol;
if (auto Res =
olGetSymbol(Handle, Name, OL_SYMBOL_KIND_GLOBAL_VARIABLE, &Symbol))
return error::createOffloadError(error::ErrorCode::INVALID_BINARY,
"failed to find global symbol %s: %s",
Name, Res->Details);
void *Address = nullptr;
if (auto Res = olGetSymbolInfo(Symbol, OL_SYMBOL_INFO_GLOBAL_VARIABLE_ADDRESS,
sizeof(Address), &Address))
return error::createOffloadError(
error::ErrorCode::INVALID_BINARY,
"failed to get device address of global symbol %s: %s", Name,
Res->Details);
if (Size) {
if (auto Res = olGetSymbolInfo(Symbol, OL_SYMBOL_INFO_GLOBAL_VARIABLE_SIZE,
sizeof(*Size), Size))
return error::createOffloadError(
error::ErrorCode::INVALID_BINARY,
"failed to get size of global symbol %s: %s", Name, Res->Details);
}
return Address;
}
Expected<ol_symbol_handle_t>
ProgramTy::getKernelAddress(const char *Name) const {
ol_symbol_handle_t Symbol;
if (auto Res = olGetSymbol(Handle, Name, OL_SYMBOL_KIND_KERNEL, &Symbol))
return error::createOffloadError(error::ErrorCode::INVALID_BINARY,
"failed to find kernel symbol %s: %s",
Name, Res->Details);
return Symbol;
}