From c650169df65539e27c2d5907a0167760260cd14e Mon Sep 17 00:00:00 2001
From: Ting-Wei Lan <lantw44@gmail.com>
Date: Fri, 1 Jan 2016 18:14:43 +0800
Subject: Add .size and .type to all global symbols except for uninitialized
 variables

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

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

diff --git a/src/code-generation.c b/src/code-generation.c
index 7abf51b..bd1e490 100644
--- a/src/code-generation.c
+++ b/src/code-generation.c
@@ -31,7 +31,11 @@ static void generate_global_variable(CcmmcAst *global_decl, CcmmcState *state)
                 } break;
             case CCMMC_KIND_ID_WITH_INIT: {
                 CcmmcAst *init_value = var_decl->child;
-                fprintf(state->asm_output, "\t.size\t%s, 4\n", var_sym->name);
+                fprintf(state->asm_output,
+                    "\t.type\t%s, %%object\n"
+                    "\t.size\t%s, 4\n"
+                    "\t.global\t%s\n",
+                    var_sym->name, var_sym->name, var_sym->name);
                 if (var_sym->type.type_base == CCMMC_AST_VALUE_INT) {
                     int int_value;
                     if (init_value->type_node == CCMMC_AST_NODE_CONST_VALUE) {
@@ -45,8 +49,9 @@ static void generate_global_variable(CcmmcAst *global_decl, CcmmcState *state)
                         assert(false);
                     }
                     fprintf(state->asm_output,
-                        "\t.global\t%s\n%s:\n\t.word\t%d\n",
-                        var_sym->name, var_sym->name, int_value);
+                        "%s:\n"
+                        "\t.word\t%d\n",
+                        var_sym->name, int_value);
                 } else if (var_sym->type.type_base == CCMMC_AST_VALUE_FLOAT) {
                     float float_value;
                     if (init_value->type_node == CCMMC_AST_NODE_CONST_VALUE) {
@@ -60,8 +65,9 @@ static void generate_global_variable(CcmmcAst *global_decl, CcmmcState *state)
                         assert(false);
                     }
                     fprintf(state->asm_output,
-                        "\t.global\t%s\n%s:\n\t.float\t%.9g\n",
-                        var_sym->name, var_sym->name, float_value);
+                        "%s:\n"
+                        "\t.float\t%.9g\n",
+                       var_sym->name, float_value);
                 } else {
                     assert(false);
                 }
@@ -195,12 +201,20 @@ static void generate_block(
 static void generate_function(CcmmcAst *function, CcmmcState *state)
 {
     fputs("\t.text\n\t.align\t2\n", state->asm_output);
-    fprintf(state->asm_output, "\t.global\t%s\n%s:\n",
+    fprintf(state->asm_output,
+        "\t.type\t%s, %%function\n"
+        "\t.global\t%s\n"
+        "%s:\n",
+        function->child->right_sibling->value_id.name,
         function->child->right_sibling->value_id.name,
         function->child->right_sibling->value_id.name);
     CcmmcAst *param_node = function->child->right_sibling->right_sibling;
     CcmmcAst *block_node = param_node->right_sibling;
     generate_block(block_node, state, 0);
+    fprintf(state->asm_output,
+        "\t.size\t%s, .-%s\n",
+        function->child->right_sibling->value_id.name,
+        function->child->right_sibling->value_id.name);
 }
 
 static void generate_program(CcmmcState *state)
-- 
cgit