From a3f2020bf16150c32939e894ab5fa49dafc6fc48 Mon Sep 17 00:00:00 2001
From: Ting-Wei Lan <lantw44@gmail.com>
Date: Sat, 2 Jan 2016 04:11:05 +0800
Subject: Add function prologue and epilogue

---
 src/code-generation.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

(limited to 'src/code-generation.c')

diff --git a/src/code-generation.c b/src/code-generation.c
index 19c23e1..d569dd3 100644
--- a/src/code-generation.c
+++ b/src/code-generation.c
@@ -208,7 +208,9 @@ static void generate_function(CcmmcAst *function, CcmmcState *state)
     fprintf(state->asm_output,
         "\t.type\t%s, %%function\n"
         "\t.global\t%s\n"
-        "%s:\n",
+        "%s:\n"
+        "\tstp\tlr, fp, [sp, -16]!\n"
+        "\tmov\tfp, sp\n",
         function->child->right_sibling->value_id.name,
         function->child->right_sibling->value_id.name,
         function->child->right_sibling->value_id.name);
@@ -216,6 +218,8 @@ static void generate_function(CcmmcAst *function, CcmmcState *state)
     CcmmcAst *block_node = param_node->right_sibling;
     generate_block(block_node, state, 0);
     fprintf(state->asm_output,
+        "\tldp\tlr, fp, [sp], 16\n"
+        "\tret\tlr\n"
         "\t.size\t%s, .-%s\n",
         function->child->right_sibling->value_id.name,
         function->child->right_sibling->value_id.name);
@@ -246,7 +250,9 @@ void ccmmc_code_generation(CcmmcState *state)
     state->table->current = NULL;
     ccmmc_symbol_table_reopen_scope(state->table);
     state->reg_pool = ccmmc_register_init(state->asm_output);
-    fputs("fp\t.req\tx30\n", state->asm_output);
+    fputs(
+        "fp\t.req\tx29\n"
+        "lr\t.req\tx30\n", state->asm_output);
     generate_program(state);
     ccmmc_register_fini(state->reg_pool);
     state->reg_pool = NULL;
-- 
cgit