diff options
author | Ting-Wei Lan <lantw44@gmail.com> | 2016-01-03 05:09:00 +0800 |
---|---|---|
committer | Ting-Wei Lan <lantw44@gmail.com> | 2016-01-03 05:11:26 +0800 |
commit | f3ca454b3ad56460e11a5e6367252d50792d0d40 (patch) | |
tree | 0265b167c2e55eead9cb2907709d8953d4ee6d2a | |
parent | 01b955654a766eb847e2674a7aa51d297efc3f4f (diff) | |
download | compiler2015-f3ca454b3ad56460e11a5e6367252d50792d0d40.tar compiler2015-f3ca454b3ad56460e11a5e6367252d50792d0d40.tar.gz compiler2015-f3ca454b3ad56460e11a5e6367252d50792d0d40.tar.bz2 compiler2015-f3ca454b3ad56460e11a5e6367252d50792d0d40.tar.lz compiler2015-f3ca454b3ad56460e11a5e6367252d50792d0d40.tar.xz compiler2015-f3ca454b3ad56460e11a5e6367252d50792d0d40.tar.zst compiler2015-f3ca454b3ad56460e11a5e6367252d50792d0d40.zip |
Rewrite the name of main function to work with TA's broken toolchain
-rw-r--r-- | src/code-generation.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/code-generation.c b/src/code-generation.c index 0d37f3d..c9067c4 100644 --- a/src/code-generation.c +++ b/src/code-generation.c @@ -9,6 +9,7 @@ #include <inttypes.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> static void generate_global_variable(CcmmcAst *global_decl, CcmmcState *state) { @@ -732,15 +733,20 @@ static void generate_block( static void generate_function(CcmmcAst *function, CcmmcState *state) { fputs("\t.text\n\t.align\t2\n", state->asm_output); + const char *func_name = function->child->right_sibling->value_id.name; + const char *symbol_name = func_name; + // XXX: We have to rewrite some names to workaround TA's broken toolchain + if (strcmp(func_name, "main") == 0 || strcmp(func_name, "MAIN") == 0) + symbol_name = "_start_MAIN"; fprintf(state->asm_output, "\t.type\t%s, %%function\n" "\t.global\t%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); + symbol_name, + symbol_name, + symbol_name); CcmmcAst *param_node = function->child->right_sibling->right_sibling; CcmmcAst *block_node = param_node->right_sibling; generate_block(block_node, state, 0); @@ -749,9 +755,9 @@ static void generate_function(CcmmcAst *function, CcmmcState *state) "\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, - function->child->right_sibling->value_id.name); + func_name, + symbol_name, + symbol_name); } static void generate_program(CcmmcState *state) |