radeon/llvm: Implement radeon_llvm_get_kernel_module() using the C API
authorTom Stellard <thomas.stellard@amd.com>
Thu, 7 Mar 2013 21:51:11 +0000 (16:51 -0500)
committerTom Stellard <thomas.stellard@amd.com>
Wed, 13 Mar 2013 16:01:31 +0000 (16:01 +0000)
src/gallium/drivers/radeon/Makefile.am
src/gallium/drivers/radeon/radeon_llvm_util.cpp

index e6eb2419d86531cbcfcdbd31a423f2a3cb3d92cd..678a0cb31d9c8eb2e20353341e3dc865b2508ea0 100644 (file)
@@ -14,6 +14,7 @@ noinst_LTLIBRARIES = libllvmradeon@VERSION@.la
 endif
 
 AM_CXXFLAGS = \
+       $(GALLIUM_CFLAGS) \
        $(filter-out -DDEBUG, $(LLVM_CXXFLAGS)) \
        $(DEFINES)
 
index fcfb6d8966d8a14c7494dcad0f2da303556d0b6e..17a312280874159eff17bc5e38b26d3265dbbc03 100644 (file)
@@ -14,6 +14,7 @@
 #include <llvm-c/Core.h>
 
 #include "radeon_llvm_util.h"
+#include "util/u_memory.h"
 
 
 static LLVMModuleRef radeon_llvm_parse_bitcode(const unsigned char * bitcode,
@@ -49,13 +50,19 @@ extern "C" unsigned radeon_llvm_get_num_kernels(const unsigned char *bitcode,
 extern "C" LLVMModuleRef radeon_llvm_get_kernel_module(unsigned index,
                const unsigned char *bitcode, unsigned bitcode_len)
 {
-       LLVMModuleRef mod = radeon_llvm_parse_bitcode(bitcode, bitcode_len);
-       llvm::Module *M = llvm::unwrap(mod);
-       const llvm::NamedMDNode *kernel_node =
-                               M->getNamedMetadata("opencl.kernels");
-       const char* kernel_name = kernel_node->getOperand(index)->
-                                       getOperand(0)->getName().data();
+       LLVMModuleRef mod;
+       unsigned num_kernels;
+       LLVMValueRef *kernel_metadata;
+       LLVMValueRef kernel_signature, kernel_function;
+
+       mod = radeon_llvm_parse_bitcode(bitcode, bitcode_len);
+       num_kernels = LLVMGetNamedMetadataNumOperands(mod, "opencl.kernels");
+       kernel_metadata = (LLVMValueRef*)MALLOC(num_kernels * sizeof(LLVMValueRef));
+       LLVMGetNamedMetadataOperands(mod, "opencl.kernels", kernel_metadata);
+       kernel_signature = kernel_metadata[index];
+       LLVMGetMDNodeOperands(kernel_signature, &kernel_function);
+       const char* kernel_name = LLVMGetValueName(kernel_function);
        radeon_llvm_strip_unused_kernels(mod, kernel_name);
+       FREE(kernel_metadata);
        return mod;
-
 }