diff --git a/lib/simplejit/Cargo.toml b/lib/simplejit/Cargo.toml index d9bc47b375..341e27e750 100644 --- a/lib/simplejit/Cargo.toml +++ b/lib/simplejit/Cargo.toml @@ -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"] diff --git a/lib/simplejit/examples/simplejit-minimal.rs b/lib/simplejit/examples/simplejit-minimal.rs index 054204882e..e393363768 100644 --- a/lib/simplejit/examples/simplejit-minimal.rs +++ b/lib/simplejit/examples/simplejit-minimal.rs @@ -11,24 +11,40 @@ fn main() { let mut module: Module = 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); }