Merge pull request #503 from joshuawarner32/simplejit-example-improvements
Improve simplejit-example
This commit is contained in:
@@ -22,7 +22,7 @@ target-lexicon = { version = "0.0.3", default-features = false }
|
||||
winapi = { version = "0.3", features = ["winbase", "memoryapi"] }
|
||||
|
||||
[dev-dependencies]
|
||||
cranelift = { path = "../umbrella", version = "0.21.1", default-features = false }
|
||||
cranelift = { path = "../umbrella", version = "0.21.1" }
|
||||
|
||||
[features]
|
||||
default = ["std"]
|
||||
|
||||
@@ -11,24 +11,40 @@ fn main() {
|
||||
let mut module: Module<SimpleJITBackend> = Module::new(SimpleJITBuilder::new());
|
||||
let mut ctx = module.make_context();
|
||||
let mut func_ctx = FunctionBuilderContext::new();
|
||||
let sig = module.make_signature();
|
||||
|
||||
let func_a = module.declare_function("a", Linkage::Local, &sig).unwrap();
|
||||
let func_b = module.declare_function("b", Linkage::Local, &sig).unwrap();
|
||||
let mut sig_a = module.make_signature();
|
||||
sig_a.params.push(AbiParam::new(types::I32));
|
||||
sig_a.returns.push(AbiParam::new(types::I32));
|
||||
|
||||
let mut sig_b = module.make_signature();
|
||||
sig_b.returns.push(AbiParam::new(types::I32));
|
||||
|
||||
let func_a = module
|
||||
.declare_function("a", Linkage::Local, &sig_a)
|
||||
.unwrap();
|
||||
let func_b = module
|
||||
.declare_function("b", Linkage::Local, &sig_b)
|
||||
.unwrap();
|
||||
|
||||
ctx.func.signature = sig_a;
|
||||
ctx.func.name = ExternalName::user(0, func_a.index() as u32);
|
||||
{
|
||||
let mut bcx: FunctionBuilder = FunctionBuilder::new(&mut ctx.func, &mut func_ctx);
|
||||
let ebb = bcx.create_ebb();
|
||||
|
||||
bcx.switch_to_block(ebb);
|
||||
bcx.ins().return_(&[]);
|
||||
bcx.append_ebb_params_for_function_params(ebb);
|
||||
let param = bcx.ebb_params(ebb)[0];
|
||||
let cst = bcx.ins().iconst(types::I32, 37);
|
||||
let add = bcx.ins().iadd(cst, param);
|
||||
bcx.ins().return_(&[add]);
|
||||
bcx.seal_all_blocks();
|
||||
bcx.finalize();
|
||||
}
|
||||
module.define_function(func_a, &mut ctx).unwrap();
|
||||
module.clear_context(&mut ctx);
|
||||
|
||||
ctx.func.signature = sig_b;
|
||||
ctx.func.name = ExternalName::user(0, func_b.index() as u32);
|
||||
{
|
||||
let mut bcx: FunctionBuilder = FunctionBuilder::new(&mut ctx.func, &mut func_ctx);
|
||||
@@ -36,8 +52,14 @@ fn main() {
|
||||
|
||||
bcx.switch_to_block(ebb);
|
||||
let local_func = module.declare_func_in_func(func_a, &mut bcx.func);
|
||||
bcx.ins().call(local_func, &[]);
|
||||
bcx.ins().return_(&[]);
|
||||
let arg = bcx.ins().iconst(types::I32, 5);
|
||||
let call = bcx.ins().call(local_func, &[arg]);
|
||||
let value = {
|
||||
let results = bcx.inst_results(call);
|
||||
assert_eq!(results.len(), 1);
|
||||
results[0].clone()
|
||||
};
|
||||
bcx.ins().return_(&[value]);
|
||||
bcx.seal_all_blocks();
|
||||
bcx.finalize();
|
||||
}
|
||||
@@ -51,8 +73,10 @@ fn main() {
|
||||
let code_b = module.get_finalized_function(func_b);
|
||||
|
||||
// Cast it to a rust function pointer type.
|
||||
let ptr_b = unsafe { mem::transmute::<_, fn()>(code_b) };
|
||||
let ptr_b = unsafe { mem::transmute::<_, fn() -> u32>(code_b) };
|
||||
|
||||
// Call it!
|
||||
ptr_b();
|
||||
let res = ptr_b();
|
||||
|
||||
assert_eq!(res, 42);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user