mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-29 16:40:13 +01:00
radeon/llvm: Handle ELF formatted binary output from the LLVM backend
This commit is contained in:
parent
7782d19cdc
commit
9277b04c02
4 changed files with 39 additions and 5 deletions
|
|
@ -1781,6 +1781,8 @@ radeon_llvm_check() {
|
|||
fi
|
||||
LLVM_COMPONENTS="${LLVM_COMPONENTS} r600 bitreader"
|
||||
NEED_RADEON_LLVM=yes
|
||||
AC_CHECK_LIB([elf], [elf_memory], [ELF_LIB=-lelf],
|
||||
[AC_MSG_ERROR([radeonsi and r600g require libelf when using LLVM])])
|
||||
}
|
||||
|
||||
dnl Gallium drivers
|
||||
|
|
@ -1999,6 +2001,7 @@ AM_CONDITIONAL(HAVE_MESA_LLVM, test x$MESA_LLVM = x1)
|
|||
AM_CONDITIONAL(LLVM_NEEDS_FNORTTI, test $LLVM_VERSION_INT -ge 302)
|
||||
|
||||
AC_SUBST([GALLIUM_MAKE_DIRS])
|
||||
AC_SUBST([ELF_LIB])
|
||||
|
||||
AM_CONDITIONAL(NEED_LIBPROGRAM, test "x$with_gallium_drivers" != x -o \
|
||||
"x$enable_xlib_glx" = xyes -o \
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
@179164
|
||||
@179544
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ libllvmradeon@VERSION@_la_SOURCES = \
|
|||
libllvmradeon@VERSION@_la_LIBADD = \
|
||||
$(LIBGALLIUM_LIBS) \
|
||||
$(CLOCK_LIB) \
|
||||
$(LLVM_LIBS)
|
||||
$(LLVM_LIBS) \
|
||||
$(ELF_LIB)
|
||||
|
||||
endif
|
||||
|
|
|
|||
|
|
@ -52,6 +52,8 @@
|
|||
#include <iostream>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <libelf.h>
|
||||
#include <gelf.h>
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
|
|
@ -154,10 +156,38 @@ radeon_llvm_compile(LLVMModuleRef M, struct radeon_llvm_binary *binary,
|
|||
out.flush();
|
||||
std::string &data = oStream.str();
|
||||
|
||||
char *elf_buffer;
|
||||
|
||||
binary->code = (unsigned char*)malloc(data.length() * sizeof(unsigned char));
|
||||
memcpy(binary->code, data.c_str(), data.length() * sizeof(unsigned char));
|
||||
binary->code_size = data.length();
|
||||
elf_buffer = (char*)malloc(data.length());
|
||||
memcpy(elf_buffer, data.c_str(), data.length());
|
||||
|
||||
Elf *elf = elf_memory(elf_buffer, data.length());
|
||||
Elf_Scn *section = NULL;
|
||||
size_t section_str_index;
|
||||
|
||||
elf_getshdrstrndx(elf, §ion_str_index);
|
||||
|
||||
while ((section = elf_nextscn(elf, section))) {
|
||||
const char *name;
|
||||
Elf_Data *section_data = NULL;
|
||||
GElf_Shdr section_header;
|
||||
if (gelf_getshdr(section, §ion_header) != §ion_header) {
|
||||
fprintf(stderr, "Failed to read ELF section header\n");
|
||||
return 1;
|
||||
}
|
||||
name = elf_strptr(elf, section_str_index, section_header.sh_name);
|
||||
if (!strcmp(name, ".text")) {
|
||||
section_data = elf_getdata(section, section_data);
|
||||
binary->code_size = section_data->d_size;
|
||||
binary->code = (unsigned char*)malloc(binary->code_size * sizeof(unsigned char));
|
||||
memcpy(binary->code, section_data->d_buf, binary->code_size);
|
||||
} else if (!strcmp(name, ".AMDGPU.config")) {
|
||||
section_data = elf_getdata(section, section_data);
|
||||
binary->config_size = section_data->d_size;
|
||||
binary->config = (unsigned char*)malloc(binary->config_size * sizeof(unsigned char));
|
||||
memcpy(binary->config, section_data->d_buf, binary->config_size);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue