#include <cstdint>
#include "Shared/Debug.h"
#include "Shared/Utils.h"
#include "Utils/ELF.h"
#include "omptarget.h"
#include "llvm/Frontend/Offloading/Utility.h"
namespace llvm {
namespace omp {
namespace target {
namespace plugin {
namespace hsa_utils {
struct alignas(alignof(void *)) AMDGPUImplicitArgsTy {
uint32_t BlockCountX;
uint32_t BlockCountY;
uint32_t BlockCountZ;
uint16_t GroupSizeX;
uint16_t GroupSizeY;
uint16_t GroupSizeZ;
uint8_t Unused0[46];
uint16_t GridDims;
uint8_t Unused1[54];
uint32_t DynamicLdsSize;
uint8_t Unused2[132];
};
inline uint32_t getImplicitArgsSize(uint16_t Version) {
return sizeof(AMDGPUImplicitArgsTy);
}
inline Error readAMDGPUMetaDataFromImage(
MemoryBufferRef MemBuffer,
StringMap<offloading::amdgpu::AMDGPUKernelMetaData> &KernelInfoMap,
uint16_t &ELFABIVersion) {
Error Err = llvm::offloading::amdgpu::getAMDGPUMetaDataFromImage(
MemBuffer, KernelInfoMap, ELFABIVersion);
if (!Err)
return Err;
DP("ELFABIVERSION Version: %u\n", ELFABIVersion);
return Err;
}
template <typename MemberTy, typename T>
void initImplArg(AMDGPUImplicitArgsTy *Base,
MemberTy AMDGPUImplicitArgsTy::*Member, size_t AvailableSize,
T Value) {
uint64_t Offset = utils::getPtrDiff(&(Base->*Member), Base);
if (Offset + sizeof(MemberTy) <= AvailableSize)
Base->*Member = static_cast<MemberTy>(Value);
}
}
}
}
}
}