//===----RTLs/amdgpu/utils/UtilitiesRTL.h ------------------------- C++ -*-===// // // 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 // //===----------------------------------------------------------------------===// // // RTL Utilities for AMDGPU plugins // //===----------------------------------------------------------------------===// #include #include "Shared/Debug.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 { // The implicit arguments of COV5 AMDGPU kernels. struct AMDGPUImplicitArgsTy { uint32_t BlockCountX; uint32_t BlockCountY; uint32_t BlockCountZ; uint16_t GroupSizeX; uint16_t GroupSizeY; uint16_t GroupSizeZ; uint8_t Unused0[46]; // 46 byte offset. uint16_t GridDims; uint8_t Unused1[54]; // 54 byte offset. uint32_t DynamicLdsSize; uint8_t Unused2[132]; // 132 byte offset. }; // Dummy struct for COV4 implicitargs. struct AMDGPUImplicitArgsTyCOV4 { uint8_t Unused[56]; }; /// Returns the size in bytes of the implicit arguments of AMDGPU kernels. /// `Version` is the ELF ABI version, e.g. COV5. inline uint32_t getImplicitArgsSize(uint16_t Version) { return Version < ELF::ELFABIVERSION_AMDGPU_HSA_V5 ? sizeof(AMDGPUImplicitArgsTyCOV4) : sizeof(AMDGPUImplicitArgsTy); } /// Reads the AMDGPU specific metadata from the ELF file and propagates the /// KernelInfoMap inline Error readAMDGPUMetaDataFromImage( MemoryBufferRef MemBuffer, StringMap &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; } } // namespace hsa_utils } // namespace plugin } // namespace target } // namespace omp } // namespace llvm