/* llmodule -> int -> ExecutionEngine.t */ CAMLprim LLVMExecutionEngineRef llvm_ee_create_jit(LLVMModuleRef M, value OptLevel) { LLVMExecutionEngineRef JIT; char *Error; if (LLVMCreateJITCompilerForModule(&JIT, M, Int_val(OptLevel), &Error)) llvm_raise(*caml_named_value("Llvm_executionengine.Error"), Error); return JIT; }
/* llmodule -> int -> ExecutionEngine.t */ CAMLprim LLVMExecutionEngineRef llvm_ee_create_jit(LLVMModuleRef M, value OptLevel) { LLVMExecutionEngineRef JIT; char *Error; if (LLVMCreateJITCompilerForModule(&JIT, M, Int_val(OptLevel), &Error)) llvm_raise(llvm_ee_error_exn, Error); return JIT; }
SWIGEXPORT jint JNICALL Java_org_jllvm_bindings_ExecutionEngineJNI_LLVMCreateJITCompilerForModule(JNIEnv *jenv, jclass jcls, jlong jarg1, jlong jarg2, jlong jarg3, jlong jarg4) { jint jresult = 0 ; LLVMExecutionEngineRef *arg1 = (LLVMExecutionEngineRef *) 0 ; LLVMModuleRef arg2 = (LLVMModuleRef) 0 ; unsigned int arg3 ; char **arg4 = (char **) 0 ; LLVMBool result; (void)jenv; (void)jcls; arg1 = *(LLVMExecutionEngineRef **)&jarg1; arg2 = *(LLVMModuleRef *)&jarg2; arg3 = (unsigned int)jarg3; arg4 = *(char ***)&jarg4; result = (LLVMBool)LLVMCreateJITCompilerForModule(arg1,arg2,arg3,arg4); jresult = (jint)result; return jresult; }
void JITImpl::init() { if (initialized) return; LLVMLinkInJIT(); LLVMInitializeNativeTarget(); LLVMMemoryBufferRef memBuffer = LLVMExtraCreateMemoryBufferWithPtr(instructionBitcode, instructionBitcodeSize); char *outMessage; if (LLVMParseBitcode(memBuffer, &module, &outMessage)) { std::cerr << "Error loading bitcode: " << outMessage << '\n'; std::abort(); } // TODO experiment with opt level. if (LLVMCreateJITCompilerForModule(&executionEngine, module, 1, &outMessage)) { std::cerr << "Error creating JIT compiler: " << outMessage << '\n'; std::abort(); } builder = LLVMCreateBuilder(); LLVMValueRef callee = LLVMGetNamedFunction(module, "jitInstructionTemplate"); assert(callee && "jitInstructionTemplate() not found in module"); jitFunctionType = LLVMGetElementType(LLVMTypeOf(callee)); functions.init(module); FPM = LLVMCreateFunctionPassManagerForModule(module); LLVMAddTargetData(LLVMGetExecutionEngineTargetData(executionEngine), FPM); LLVMAddBasicAliasAnalysisPass(FPM); LLVMAddJumpThreadingPass(FPM); LLVMAddGVNPass(FPM); LLVMAddJumpThreadingPass(FPM); LLVMAddCFGSimplificationPass(FPM); LLVMAddDeadStoreEliminationPass(FPM); LLVMAddInstructionCombiningPass(FPM); LLVMInitializeFunctionPassManager(FPM); if (DEBUG_JIT) { LLVMExtraRegisterJitDisassembler(executionEngine, LLVMGetTarget(module)); } initialized = true; }
SCM llvm_compile_module(SCM scm_llvm, SCM scm_name) { struct llvm_module_t *self = get_llvm(scm_llvm); if (self->engine != NULL) scm_misc_error("llvm-compile", "LLVM module already compiled", SCM_EOL); char *error = NULL; if (LLVMCreateJITCompilerForModule(&self->engine, self->module, 2, &error)) { SCM scm_error = scm_from_locale_string(error); LLVMDisposeMessage(error); scm_misc_error("llvm-compile", "Error initialising JIT engine: ~a", scm_list_1(scm_error)); }; LLVMPassManagerRef pass_manager = LLVMCreatePassManager(); LLVMAddConstantPropagationPass(pass_manager); LLVMAddInstructionCombiningPass(pass_manager); LLVMAddPromoteMemoryToRegisterPass(pass_manager); LLVMAddGVNPass(pass_manager); LLVMAddCFGSimplificationPass(pass_manager); LLVMRunPassManager(pass_manager, self->module); LLVMDisposePassManager(pass_manager); return SCM_UNSPECIFIED; }