summaryrefslogtreecommitdiffstats
path: root/src/code-generation.c
diff options
context:
space:
mode:
authorTing-Wei Lan <lantw44@gmail.com>2016-01-02 04:11:05 +0800
committerTing-Wei Lan <lantw44@gmail.com>2016-01-02 04:11:05 +0800
commita3f2020bf16150c32939e894ab5fa49dafc6fc48 (patch)
treebf2237177f0f4901a278a838221d305034c4de95 /src/code-generation.c
parent2cb8d9fe7244aa59fdf501b5b990f511394f3ec9 (diff)
downloadcompiler2015-a3f2020bf16150c32939e894ab5fa49dafc6fc48.tar.gz
compiler2015-a3f2020bf16150c32939e894ab5fa49dafc6fc48.tar.zst
compiler2015-a3f2020bf16150c32939e894ab5fa49dafc6fc48.zip
Add function prologue and epilogue
Diffstat (limited to 'src/code-generation.c')
-rw-r--r--src/code-generation.c10
1 files changed, 8 insertions, 2 deletions
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;