From 1ff62f8ff85b32fc92ee1be0f1e61f1bee1a7ef7 Mon Sep 17 00:00:00 2001
From: kugwa <kugwa2000@gmail.com>
Date: Sun, 3 Jan 2016 23:08:05 +0800
Subject: Callers have to pass extend_name[]

---
 src/code-generation.c | 10 ++++++----
 src/register.c        |  6 ++----
 src/register.h        |  2 +-
 3 files changed, 9 insertions(+), 9 deletions(-)

(limited to 'src')

diff --git a/src/code-generation.c b/src/code-generation.c
index f304cf8..41272e5 100644
--- a/src/code-generation.c
+++ b/src/code-generation.c
@@ -144,6 +144,7 @@ static void load_variable(CcmmcAst *id, CcmmcState *state, CcmmcTmp *dist,
             ccmmc_register_unlock(state->reg_pool, dist);
         }
         else {
+            // TODO: global array
         }
     } else {
         if (id->value_id.kind != CCMMC_KIND_ID_ARRAY) {
@@ -164,7 +165,7 @@ static void load_variable(CcmmcAst *id, CcmmcState *state, CcmmcTmp *dist,
         else {
             CcmmcTmp *offset;
             const char *offset_reg;
-            char *extend;
+            char extend[8];
 
             offset = ccmmc_register_alloc(state->reg_pool, current_offset);
             calc_array_offset(id, &var_sym->type, state, offset, current_offset);
@@ -172,7 +173,7 @@ static void load_variable(CcmmcAst *id, CcmmcState *state, CcmmcTmp *dist,
             dist_reg = ccmmc_register_lock(state->reg_pool, dist);
             offset_reg = ccmmc_register_lock(state->reg_pool, offset);
 
-            extend = ccmmc_register_extend_name(offset);
+            ccmmc_register_extend_name(offset, extend);
             fprintf(state->asm_output,
                 "\tldr\t" REG_TMP ", =%" PRIu64 "\n"
                 "\tsub\t" REG_TMP ", fp, " REG_TMP "\n"
@@ -208,6 +209,7 @@ static void store_variable(CcmmcAst *id, CcmmcState *state, CcmmcTmp *src,
             ccmmc_register_unlock(state->reg_pool, src);
         }
         else {
+            // TODO: global array
         }
     } else {
         if (id->value_id.kind != CCMMC_KIND_ID_ARRAY) {
@@ -227,7 +229,7 @@ static void store_variable(CcmmcAst *id, CcmmcState *state, CcmmcTmp *src,
         else {
             CcmmcTmp *offset;
             const char *offset_reg;
-            char *extend;
+            char extend[8];
 
             offset = ccmmc_register_alloc(state->reg_pool, current_offset);
             calc_array_offset(id, &var_sym->type, state, offset, current_offset);
@@ -235,7 +237,7 @@ static void store_variable(CcmmcAst *id, CcmmcState *state, CcmmcTmp *src,
             src_reg = ccmmc_register_lock(state->reg_pool, src);
             offset_reg = ccmmc_register_lock(state->reg_pool, offset);
 
-            extend = ccmmc_register_extend_name(offset);
+            ccmmc_register_extend_name(offset, extend);
             fprintf(state->asm_output,
                 "\tldr\t" REG_TMP ", =%" PRIu64 "\n"
                 "\tsub\t" REG_TMP ", fp, " REG_TMP "\n"
diff --git a/src/register.c b/src/register.c
index 77571fe..00280c0 100644
--- a/src/register.c
+++ b/src/register.c
@@ -13,7 +13,6 @@
 #define REG_SIZE 4
 #define SPILL_MAX 64
 
-static char extend_name[8];
 static const char *reg_name[REG_NUM] = {
     "w10", "w11", "w12", "w13", "w14", "w15"};
 
@@ -192,14 +191,13 @@ void ccmmc_register_free(CcmmcRegPool *pool, CcmmcTmp *tmp, uint64_t *offset)
     }
 }
 
-char *ccmmc_register_extend_name(CcmmcTmp *tmp)
+void ccmmc_register_extend_name(CcmmcTmp *tmp, char *extend_name)
 {
     if (tmp->reg != NULL) {
         strcpy(extend_name, tmp->reg->name);
         extend_name[0] = 'x';
-        return extend_name;
     }
-    return NULL;
+    else extend_name[0] = '\0';
 }
 
 void ccmmc_register_caller_save(CcmmcRegPool *pool)
diff --git a/src/register.h b/src/register.h
index 6589438..e218b66 100644
--- a/src/register.h
+++ b/src/register.h
@@ -36,7 +36,7 @@ void             ccmmc_register_unlock              (CcmmcRegPool *pool,
 void             ccmmc_register_free                (CcmmcRegPool *pool,
                                                      CcmmcTmp *tmp,
                                                      uint64_t *offset);
-char            *ccmmc_register_extend_name         (CcmmcTmp *tmp);
+void             ccmmc_register_extend_name         (CcmmcTmp *tmp, char *extend_name);
 void             ccmmc_register_caller_save         (CcmmcRegPool *pool);
 void             ccmmc_register_caller_load         (CcmmcRegPool *pool);
 void             ccmmc_register_fini                (CcmmcRegPool *pool);
-- 
cgit