summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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)