From 4f99b1e1a4528d679b64915446663091ca09bb7a Mon Sep 17 00:00:00 2001 From: Mustafa Quraish Date: Sat, 5 Feb 2022 20:28:56 -0500 Subject: [compiler.cup] Add support for function calls! --- compiler/codegen.cup | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'compiler/codegen.cup') diff --git a/compiler/codegen.cup b/compiler/codegen.cup index 407fab5..975844d 100644 --- a/compiler/codegen.cup +++ b/compiler/codegen.cup @@ -27,6 +27,11 @@ fn emit_asm(msg: char*) { } fn emit_num(num: int) { + // FIXME: Just support printing negatives directly. + if (num < 0) { + emit_asm("-"); + num = -num; + } fputu(gen_out_file, num); } @@ -35,6 +40,8 @@ fn generate_syscall(num: int) { emit_asm(" syscall\n"); } +fn generate_expr_into_rax(node: Node*); + fn generate_lvalue_into_rax(node: Node*) { if (node.typ == AST_LOCAL_VAR) { let offset = node.d.variable.offset; @@ -45,6 +52,20 @@ fn generate_lvalue_into_rax(node: Node*) { } } +fn generate_function_call(node: Node*) { + let total_size = 0; + let n = node.d.call.args.size; + for (let i = n-1; i >= 0; --i) { + let expr: Node* = node.d.call.args.data[i]; + generate_expr_into_rax(expr); + emit_asm(" push rax\n"); + // TODO: this might be an issue if we pass structs some day + total_size = total_size + 8; + } + emit_asm3(" call func_", node.d.call.func.d.func.name, "\n"); + emit_asm(" add rsp, "); emit_num(total_size); emit_asm("\n"); +} + fn generate_expr_into_rax(node: Node*) { if (node.typ == AST_LITERAL) { if (node.etyp.typ == TYPE_INT) { @@ -233,6 +254,9 @@ fn generate_expr_into_rax(node: Node*) { emit_asm(" pop rbx\n"); emit_asm(" mov [rbx], rax\n"); + } else if (node.typ == AST_FUNCCALL) { + generate_function_call(node); + } else { die2("Unsupported node type in generate_expr_into_rax: ", node_type_to_string(node.typ)); } -- cgit v1.2.3