Path: blob/main/docs/source/user-guide/examples/ll_fpadd.py
1154 views
from __future__ import print_function12from ctypes import CFUNCTYPE, c_double34import llvmlite.binding as llvm567# All these initializations are required for code generation!8llvm.initialize_native_target()9llvm.initialize_native_asmprinter() # yes, even this one1011llvm_ir = """12; ModuleID = "examples/ir_fpadd.py"13target triple = "unknown-unknown-unknown"14target datalayout = ""1516define double @"fpadd"(double %".1", double %".2")17{18entry:19%"res" = fadd double %".1", %".2"20ret double %"res"21}22"""2324def create_execution_engine():25"""26Create an ExecutionEngine suitable for JIT code generation on27the host CPU. The engine is reusable for an arbitrary number of28modules.29"""30# Create a target machine representing the host31target = llvm.Target.from_default_triple()32target_machine = target.create_target_machine()33# And an execution engine with an empty backing module34backing_mod = llvm.parse_assembly("")35engine = llvm.create_mcjit_compiler(backing_mod, target_machine)36return engine373839def compile_ir(engine, llvm_ir):40"""41Compile the LLVM IR string with the given engine.42The compiled module object is returned.43"""44# Create a LLVM module object from the IR45mod = llvm.parse_assembly(llvm_ir)46mod.verify()47# Now add the module and make sure it is ready for execution48engine.add_module(mod)49engine.finalize_object()50engine.run_static_constructors()51return mod525354engine = create_execution_engine()55mod = compile_ir(engine, llvm_ir)5657# Look up the function pointer (a Python int)58func_ptr = engine.get_function_address("fpadd")5960# Run the function via ctypes61cfunc = CFUNCTYPE(c_double, c_double, c_double)(func_ptr)62res = cfunc(1.0, 3.5)63print("fpadd(...) =", res)646566