diff options
author | Tom Stellard <thomas.stellard@amd.com> | 2013-03-07 16:51:13 -0500 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2013-03-13 16:01:31 +0000 |
commit | 1c4f283151b191c51cbd76d7f304cc1fe7be3019 (patch) | |
tree | f4999004dba953df04f802da9ce124d8bf8203d5 /src/gallium/drivers/radeon/radeon_llvm_util.c | |
parent | 3958c104c63d6675fd3e938ddff6efcfb1d67cde (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.c | 49 |
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; +} |