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
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 \
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
+#include <libelf.h>
+#include <gelf.h>
using namespace llvm;
out.flush();
std::string &data = oStream.str();
-
- 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();
+ char *elf_buffer;
+
+ 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;
}