From b01d7048fdfa1b56d2b419a9e705de1e9b50b3b8 Mon Sep 17 00:00:00 2001 From: foreman Date: Sat, 15 Oct 2016 15:27:15 -0500 Subject: [PATCH] P4 to Git Change 1326945 by lmoriche@lmoriche_opencl_dev on 2016/10/15 16:11:48 SWDEV-105136 - [OCL-LC-ROCm] Missing CL_PROGRAM_GLOBAL_VARIABLE_TOTAL_SIZE implementation - iterate over the elf sections and add up the section size for SHF_ALLOC && ! SHF_EXECINSTR Affected files ... ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocprogram.cpp#41 edit [ROCm/clr commit: 1ab3f8fc9b2712370f9f245b0e93cde6107a865f] --- .../rocclr/runtime/device/rocm/rocprogram.cpp | 78 ++++++++++++------- 1 file changed, 52 insertions(+), 26 deletions(-) diff --git a/projects/clr/rocclr/runtime/device/rocm/rocprogram.cpp b/projects/clr/rocclr/runtime/device/rocm/rocprogram.cpp index fa94a24d96..a14554de6b 100644 --- a/projects/clr/rocclr/runtime/device/rocm/rocprogram.cpp +++ b/projects/clr/rocclr/runtime/device/rocm/rocprogram.cpp @@ -7,10 +7,10 @@ #include "rocprogram.hpp" -#include "compiler/lib/loaders/elf/elf.hpp" #include "compiler/lib/utils/options.hpp" #include "rockernel.hpp" #if defined(WITH_LIGHTNING_COMPILER) +#include "libelf/gelf.h" #include "driver/AmdCompiler.h" #include "libraries.amdgcn.inc" #else // !defined(WITH_LIGHTNING_COMPILER) @@ -1004,22 +1004,64 @@ HSAILProgram::setKernels_LC(amd::option::Options *options, void* binary, size_t return false; } - // load the runtime metadata - amd::OclElf elf(ELFCLASS64, (char*) binary, binSize, NULL, ELF_C_READ); + size_t progvarsTotalSize = 0; - char* data; - size_t size; - if (!elf.getSection(amd::OclElf::RUNTIME_METADATA, &data, &size)) { - buildLog_ += "Error while access runtime metadata.\n"; + // Begin the Elf image from memory + Elf* e = elf_memory((char*) binary, binSize, NULL); + if (elf_kind(e) != ELF_K_ELF) { + buildLog_ += "Error while reading the ELF program binary\n"; + return false; + } + size_t shstrndx; + if (elf_getshdrstrndx(e, &shstrndx) != 0) { + buildLog_ += "Error while reading the ELF program binary\n"; return false; } - metadata_ = new amd::hsa::code::Program::Metadata(); - if (!metadata_->ReadFrom((void *) data, size)) { - buildLog_ += "Error while parsing runtime metadata.\n"; + // Iterate over the sections + for (Elf_Scn* scn = elf_nextscn(e, 0); scn; scn = elf_nextscn(e, scn)) { + GElf_Shdr shdr; + if (gelf_getshdr(scn, &shdr) != &shdr) { + continue; + } + // Skip non-program sections + if (shdr.sh_type != SHT_PROGBITS) { + continue; + } + // Accumulate the size of A & !X sections + if ((shdr.sh_flags & SHF_ALLOC) && !(shdr.sh_flags & SHF_EXECINSTR)) { + progvarsTotalSize += shdr.sh_size; + } + // Check if this is the metadata section + const char* name = elf_strptr(e, shstrndx , shdr.sh_name); + if (name && !strcmp(name, ".AMDGPU.runtime_metadata")) { + // Assume a single Elf_Data, the parser will fail if it isn't + Elf_Data* data = elf_getdata(scn, NULL); + if (!data) { + buildLog_ += "Error while reading ELF program binary " \ + "runtime metadata section\n"; + return false; + } + + metadata_ = new amd::hsa::code::Program::Metadata(); + if (!metadata_ || !metadata_->ReadFrom(data->d_buf, data->d_size)) { + buildLog_ += "Error while parsing ELF program binary " \ + "runtime metadata section\n"; + return false; + } + } + } + + elf_end(e); + + if (!metadata_) { + buildLog_ += "Error: runtime metadata section not present in " \ + "ELF program binary\n"; return false; } + setGlobalVariableTotalSize(progvarsTotalSize); + saveBinaryAndSetType(TYPE_EXECUTABLE); // Get the list of kernels @@ -1098,22 +1140,6 @@ HSAILProgram::setKernels_LC(amd::option::Options *options, void* binary, size_t return false; } -#if 0 - for (auto s = elf.nextSymbol(NULL); s != NULL; s = elf.nextSymbol(s)) { - amd::OclElf::SymbolInfo si; - if (!elf.getSymbolInfo(s, &si) - || strcmp(si.sec_name, ".text") != 0 - || strcmp(si.sym_name, kernelName.c_str()) != 0) { - continue; - } - const amd_kernel_code_t* akc = (amd_kernel_code_t*) - ((address) out_exec->Buf().data() + (si.address - si.sec_addr)); - - // FIXME_lmoriche: this is where we could get the SGPRs and VGPRs - break; - } -#endif - Kernel *aKernel = new roc::Kernel( kernelName, this,