commit f67d0534ce16ec2ac8a50c21e5f2e87915756dfe
Author:     Roberto E. Vargas Caballero <k...@shike2.com>
AuthorDate: Fri Sep 16 14:53:08 2016 +0200
Commit:     Roberto E. Vargas Caballero <k...@shike2.com>
CommitDate: Fri Sep 16 14:53:08 2016 +0200

    [cc2-qbe] Add basic support for struct assignment
    
    At this moment there is no implementatin of struct assignment in
    qbe, so this is only a skeleton to be filled later.

diff --git a/cc2/arch/qbe/arch.h b/cc2/arch/qbe/arch.h
index 512511e..38eafbb 100644
--- a/cc2/arch/qbe/arch.h
+++ b/cc2/arch/qbe/arch.h
@@ -9,6 +9,7 @@ enum asmop {
        ASSTH,
        ASSTW,
        ASSTL,
+       ASSTM,
        ASSTS,
        ASSTD,
 
diff --git a/cc2/arch/qbe/cgen.c b/cc2/arch/qbe/cgen.c
index 4d147e9..7b176df 100644
--- a/cc2/arch/qbe/cgen.c
+++ b/cc2/arch/qbe/cgen.c
@@ -113,6 +113,10 @@ load(Type *tp, Node *np, Node *new)
 {
        int op;
 
+       if (tp->flags & AGGRF) {
+               *new = *np;
+               return new;
+       }
        switch (tp->size) {
        case 1:
                op = ASLDB;
@@ -127,8 +131,7 @@ load(Type *tp, Node *np, Node *new)
                op = (tp->flags & FLOATF) ? ASLDD : ASLDL;
                break;
        default:
-               *new = *np;
-               return new;
+               abort();
        }
        code(op, tmpnode(new, tp), np, NULL);
 
@@ -273,7 +276,8 @@ assign(Type *tp, Node *to, Node *from)
                op = (tp->flags & FLOATF) ? ASSTD : ASSTL;
                break;
        default:
-               abort();
+               op = ASSTM;
+               break;
        }
        code(op, to, from, NULL);
        return from;
diff --git a/cc2/arch/qbe/code.c b/cc2/arch/qbe/code.c
index 1d9164b..7be16c7 100644
--- a/cc2/arch/qbe/code.c
+++ b/cc2/arch/qbe/code.c
@@ -11,7 +11,7 @@
 
 static void binary(void), unary(void), store(void), jmp(void), ret(void),
             branch(void), call(void), ecall(void), param(void),
-            alloc(void), form2local(void);
+            alloc(void), form2local(void), ldir(void);
 
 static struct opdata {
        void (*fun)(void);
@@ -29,6 +29,7 @@ static struct opdata {
        [ASSTH]   =  {.fun = store,  .txt = "store", .letter = 'h'},
        [ASSTW]   =  {.fun = store,  .txt = "store", .letter = 'w'},
        [ASSTL]   =  {.fun = store,  .txt = "store", .letter = 'l'},
+       [ASSTM]   =  {.fun = ldir},
        [ASSTS]   =  {.fun = store,  .txt = "store", .letter = 's'},
        [ASSTD]   =  {.fun = store,  .txt = "store", .letter = 'd'},
 
@@ -369,6 +370,16 @@ binary(void)
 }
 
 static void
+ldir(void)
+{
+       struct opdata *p = &optbl[pc->op];
+       char to[ADDR_LEN], from[ADDR_LEN];
+       /* TODO: what type do we use for the size? */
+
+       /* TODO: it is pending */
+}
+
+static void
 store(void)
 {
        struct opdata *p = &optbl[pc->op];
diff --git a/cc2/cc2.h b/cc2/cc2.h
index 9bc248c..c5256cb 100644
--- a/cc2/cc2.h
+++ b/cc2/cc2.h
@@ -9,7 +9,7 @@ enum tflags {
        INTF    =     2,
        FLOATF  =     4,
        STRF    =     8,
-       UNIONF  =    16,
+       AGGRF   =    16,
        FUNF    =    32,
        PARF    =    64,
 };
diff --git a/cc2/parser.c b/cc2/parser.c
index 34da9a9..dfa6f1e 100644
--- a/cc2/parser.c
+++ b/cc2/parser.c
@@ -487,6 +487,7 @@ aggregate(void)
 
        tp->size = size->u.i;
        tp->align = align->u.i;
+       tp->flags = AGGRF;
        /*
         * type is the first field of Symbol so we can obtain the
         * address of the symbol from the address of the type.

Reply via email to