Implement returns.

This commit is contained in:
Sergey Pepyakin
2018-12-11 20:13:20 +01:00
committed by Dan Gohman
parent 38590cbcb9
commit d6b300c87f
2 changed files with 12 additions and 5 deletions

View File

@@ -361,11 +361,20 @@ pub fn pass_outgoing_args(ctx: &mut Context, arity: u32) {
} }
} }
pub fn call_direct(ctx: &mut Context, index: u32) { pub fn call_direct(ctx: &mut Context, index: u32, return_arity: u32) {
assert!(return_arity == 0 || return_arity == 1);
let label = &ctx.func_starts[index as usize].1; let label = &ctx.func_starts[index as usize].1;
dynasm!(ctx.asm dynasm!(ctx.asm
; call =>*label ; call =>*label
); );
if return_arity == 1 {
dynasm!(ctx.asm
; push rax
);
ctx.sp_depth.reserve(1);
}
} }
pub fn prologue(ctx: &mut Context, stack_slots: u32) { pub fn prologue(ctx: &mut Context, stack_slots: u32) {

View File

@@ -222,13 +222,11 @@ pub fn translate(
} }
Operator::Call { function_index } => { Operator::Call { function_index } => {
let callee_ty = translation_ctx.func_type(function_index); let callee_ty = translation_ctx.func_type(function_index);
assert!(callee_ty.returns.len() == 0, "is not supported");
// TODO: ensure that this function is locally defined // TODO: this implementation assumes that this function is locally defined.
// We would like to support imported functions at some point
pass_outgoing_args(&mut ctx, callee_ty.params.len() as u32); pass_outgoing_args(&mut ctx, callee_ty.params.len() as u32);
call_direct(&mut ctx, function_index); call_direct(&mut ctx, function_index, callee_ty.returns.len() as u32);
} }
_ => { _ => {
trap(&mut ctx); trap(&mut ctx);