shithub: mc

Download patch

ref: c7981a245e36b9053daac1f6e0f7e23676efa9bb
parent: 1536f46ebd0795367f7490b079b5aede0c970fcb
author: Ori Bernstein <[email protected]>
date: Sun Sep 7 16:14:20 EDT 2014

Make deref() set the type of the loaded value.

    This was causing some oddities in the size of our copies.

--- a/6/isel.c
+++ b/6/isel.c
@@ -646,6 +646,7 @@
             break;
         case Oset:
             assert(exprop(args[0]) == Ovar || exprop(args[0]) == Oderef);
+            assert(!stacknode(args[0]));
             b = selexpr(s, args[1]);
             if (exprop(args[0]) == Oderef)
                 a = memloc(s, args[0]->expr.args[0], mode(n));
--- a/6/simp.c
+++ b/6/simp.c
@@ -228,13 +228,16 @@
     return n;
 }
 
-static Node *deref(Node *a)
+static Node *deref(Node *a, Type *t)
 {
     Node *n;
 
     assert(a->expr.type->type == Typtr);
     n = mkexpr(a->line, Oderef, a, NULL);
-    n->expr.type = base(a->expr.type);
+    if (t)
+        n->expr.type = t;
+    else
+        n->expr.type = base(a->expr.type);
     return n;
 }
 
@@ -909,12 +912,14 @@
 static Node *lval(Simp *s, Node *n)
 {
     Node *r;
+    Node **args;
 
+    args = n->expr.args;
     switch (exprop(n)) {
         case Ovar:      r = n;  break;
-        case Oidx:      r = deref(idxaddr(s, n->expr.args[0], n->expr.args[1])); break;
-        case Oderef:    r = deref(rval(s, n->expr.args[0], NULL)); break;
-        case Omemb:     r = deref(membaddr(s, n)); break;
+        case Oidx:      r = deref(idxaddr(s, args[0], args[1]), NULL); break;
+        case Oderef:    r = deref(rval(s, args[0], NULL), NULL); break;
+        case Omemb:     r = deref(membaddr(s, n), NULL); break;
         default:
             die("%s cannot be an lval", opstr(exprop(n)));
             break;
@@ -1066,11 +1071,11 @@
         stbase = set(simpcast(s, t, mktyptr(t->line, tyintptr)), base);
         sz = addk(simpcast(s, t, mktyptr(t->line, tyintptr)), Ptrsz);
     } else {
-        stbase = set(deref(addr(s, t, tyintptr)), base);
+        stbase = set(deref(addr(s, t, tyintptr), NULL), base);
         sz = addk(addr(s, t, tyintptr), Ptrsz);
     }
     /* *(&slice + ptrsz) = len */
-    stlen = set(deref(sz), len);
+    stlen = set(deref(sz, NULL), len);
     append(s, stbase);
     append(s, stlen);
     return t;
@@ -1165,7 +1170,7 @@
         pval = addr(s, val, exprtype(val));
         st = mkexpr(val->line, Oblit, pdst, pval, sz, NULL);
     } else {
-        st = set(deref(pdst), val);
+        st = set(deref(pdst, val->expr.type), val);
     }
     append(s, st);
     return r;
@@ -1224,7 +1229,7 @@
     u = addr(s, tmp, mktype(n->line, Tyuint));
     tag = mkintlit(n->line, uc->id);
     tag->expr.type = mktype(n->line, Tyuint);
-    append(s, set(deref(u), tag));
+    append(s, set(deref(u, tyword), tag));
 
 
     /* fill the value, if needed */
@@ -1237,7 +1242,7 @@
         sz = disp(n->line, tysize(uc->etype));
         r = mkexpr(n->line, Oblit, u, elt, sz, NULL);
     } else {
-        r = set(deref(u), elt);
+        r = set(deref(u, uc->etype), elt);
     }
     append(s, r);
     return tmp;