summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTing-Wei Lan <lantw44@gmail.com>2016-01-03 05:09:00 +0800
committerTing-Wei Lan <lantw44@gmail.com>2016-01-03 05:11:26 +0800
commitf3ca454b3ad56460e11a5e6367252d50792d0d40 (patch)
tree0265b167c2e55eead9cb2907709d8953d4ee6d2a
parent01b955654a766eb847e2674a7aa51d297efc3f4f (diff)
downloadcompiler2015-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.c18
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)