use llvm_quick::execution_engine::{link_in_mc_jit, ExecutionEngine};
use llvm_quick::target::{initialize_native_asm_printer, initialize_native_target};
use llvm_quick::Context;
fn main() {
let context = Context::create();
let module = context.create_module(c"sum");
let builder = context.create_builder();
let i64_type = context.i64_type();
let function_type = i64_type.fun((i64_type, i64_type, i64_type));
let function = module.add_function(c"sum", function_type);
let bb = context.append_basic_block(function, c"entry");
builder.position_at_end(bb);
let (x, y, z) = function.get_params();
let sum = builder.add(x, y, c"sum.1");
let sum = builder.add(sum, z, c"sum.2");
builder.return_value(sum);
drop(builder);
module.dump();
link_in_mc_jit();
initialize_native_target();
initialize_native_asm_printer();
let ee = ExecutionEngine::create_execution_engine_for_module(module)
.expect("Failed to create execution engine:");
let addr = ee.get_function_address(c"sum");
let f =
unsafe { std::mem::transmute::<u64, Option<extern "C" fn(u64, u64, u64) -> u64>>(addr) }
.unwrap();
let x: u64 = 1;
let y: u64 = 1;
let z: u64 = 1;
let res = f(x, y, z);
println!("{} + {} + {} = {}", x, y, z, res);
drop(ee);
drop(context);
}