summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/radeon/radeon_llvm_util.c
diff options
context:
space:
mode:
authorTom Stellard <thomas.stellard@amd.com>2013-03-07 16:51:13 -0500
committerTom Stellard <thomas.stellard@amd.com>2013-03-13 16:01:31 +0000
commit1c4f283151b191c51cbd76d7f304cc1fe7be3019 (patch)
treef4999004dba953df04f802da9ce124d8bf8203d5 /src/gallium/drivers/radeon/radeon_llvm_util.c
parent3958c104c63d6675fd3e938ddff6efcfb1d67cde (diff)
radeon/llvm: Make radeon_llvm_util.cpp a C file
All the functions in this file are now implemented in C.
Diffstat (limited to 'src/gallium/drivers/radeon/radeon_llvm_util.c')
-rw-r--r--src/gallium/drivers/radeon/radeon_llvm_util.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/gallium/drivers/radeon/radeon_llvm_util.c b/src/gallium/drivers/radeon/radeon_llvm_util.c
new file mode 100644
index 00000000000..3d30612ffd9
--- /dev/null
+++ b/src/gallium/drivers/radeon/radeon_llvm_util.c
@@ -0,0 +1,49 @@
+#include "radeon_llvm_util.h"
+#include "util/u_memory.h"
+
+#include <llvm-c/BitReader.h>
+#include <llvm-c/Core.h>
+
+static LLVMModuleRef radeon_llvm_parse_bitcode(const unsigned char * bitcode,
+ unsigned bitcode_len)
+{
+ LLVMMemoryBufferRef buf;
+ LLVMModuleRef module = LLVMModuleCreateWithName("radeon");
+
+ buf = LLVMCreateMemoryBufferWithMemoryRangeCopy((const char*)bitcode,
+ bitcode_len, "radeon");
+ LLVMParseBitcode(buf, &module, NULL);
+ return module;
+}
+
+unsigned radeon_llvm_get_num_kernels(const unsigned char *bitcode,
+ unsigned bitcode_len)
+{
+ LLVMModuleRef mod = radeon_llvm_parse_bitcode(bitcode, bitcode_len);
+ return LLVMGetNamedMetadataNumOperands(mod, "opencl.kernels");
+}
+
+LLVMModuleRef radeon_llvm_get_kernel_module(unsigned index,
+ const unsigned char *bitcode, unsigned bitcode_len)
+{
+ LLVMModuleRef mod;
+ unsigned num_kernels;
+ LLVMValueRef *kernel_metadata;
+ unsigned i;
+
+ mod = radeon_llvm_parse_bitcode(bitcode, bitcode_len);
+ num_kernels = LLVMGetNamedMetadataNumOperands(mod, "opencl.kernels");
+ kernel_metadata = MALLOC(num_kernels * sizeof(LLVMValueRef));
+ LLVMGetNamedMetadataOperands(mod, "opencl.kernels", kernel_metadata);
+ for (i = 0; i < num_kernels; i++) {
+ LLVMValueRef kernel_signature, kernel_function;
+ if (i == index) {
+ continue;
+ }
+ kernel_signature = kernel_metadata[i];
+ LLVMGetMDNodeOperands(kernel_signature, &kernel_function);
+ LLVMDeleteFunction(kernel_function);
+ }
+ FREE(kernel_metadata);
+ return mod;
+}