From f3ca454b3ad56460e11a5e6367252d50792d0d40 Mon Sep 17 00:00:00 2001
From: Ting-Wei Lan <lantw44@gmail.com>
Date: Sun, 3 Jan 2016 05:09:00 +0800
Subject: Rewrite the name of main function to work with TA's broken toolchain

---
 src/code-generation.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

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

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)
-- 
cgit