1 #include <llvm/ADT/OwningPtr.h>
2 #include <llvm/ADT/StringRef.h>
3 #include <llvm/LLVMContext.h>
4 #include <llvm/PassManager.h>
5 #include <llvm/Support/IRReader.h>
6 #include <llvm/Support/MemoryBuffer.h>
7 #include <llvm/Support/SourceMgr.h>
8 #include <llvm/Transforms/IPO.h>
10 #include "llvm_wrapper.h"
13 extern "C" LLVMModuleRef
llvm_parse_bitcode(const unsigned char * bitcode
, unsigned bitcode_len
)
15 llvm::OwningPtr
<llvm::Module
> M
;
16 llvm::StringRef
str((const char*)bitcode
, bitcode_len
);
17 llvm::MemoryBuffer
* buffer
= llvm::MemoryBuffer::getMemBufferCopy(str
);
18 llvm::SMDiagnostic Err
;
19 M
.reset(llvm::ParseIR(buffer
, Err
, llvm::getGlobalContext()));
20 return wrap(M
.take());
23 extern "C" void llvm_strip_unused_kernels(LLVMModuleRef mod
, const char *kernel_name
)
25 llvm::Module
*M
= llvm::unwrap(mod
);
26 std::vector
<const char *> export_list
;
27 export_list
.push_back(kernel_name
);
29 PM
.add(llvm::createInternalizePass(export_list
));
30 PM
.add(llvm::createGlobalDCEPass());
34 extern "C" unsigned llvm_get_num_kernels(const unsigned char *bitcode
,
37 LLVMModuleRef mod
= llvm_parse_bitcode(bitcode
, bitcode_len
);
38 llvm::Module
*M
= llvm::unwrap(mod
);
39 const llvm::NamedMDNode
*kernel_node
40 = M
->getNamedMetadata("opencl.kernels");
41 unsigned kernel_count
= kernel_node
->getNumOperands();
46 extern "C" LLVMModuleRef
llvm_get_kernel_module(unsigned index
,
47 const unsigned char *bitcode
, unsigned bitcode_len
)
49 LLVMModuleRef mod
= llvm_parse_bitcode(bitcode
, bitcode_len
);
50 llvm::Module
*M
= llvm::unwrap(mod
);
51 const llvm::NamedMDNode
*kernel_node
=
52 M
->getNamedMetadata("opencl.kernels");
53 const char* kernel_name
= kernel_node
->getOperand(index
)->
54 getOperand(0)->getName().data();
55 llvm_strip_unused_kernels(mod
, kernel_name
);