shithub: mc

Download patch

ref: 6db22a4b62e552e9ede23734cee42c89e80a6524
parent: 8e8131e3e7dbc21f60631a80ad3e638df80661ae
author: Ori Bernstein <[email protected]>
date: Sun Jun 17 12:38:19 EDT 2012

Start hashing by decl node, instead of decl id

--- a/8/isel.c
+++ b/8/isel.c
@@ -57,11 +57,11 @@
 
     switch (exprop(n)) {
         case Ovar:
-            if (hthas(s->locs, (void*)n->expr.did)) {
-                stkoff = (size_t)htget(s->locs, (void*)n->expr.did);
+            if (hthas(s->locs, n)) {
+                stkoff = (size_t)htget(s->locs, n);
                 l = locmem(-stkoff, locphysreg(Rebp), NULL, ModeL);
-            } else if (hthas(s->globls, (void*)n->expr.did)) {
-                l = locstrlbl(htget(s->globls, (void*)n->expr.did));
+            } else if (hthas(s->globls, n)) {
+                l = locstrlbl(htget(s->globls, n));
             } else {
                 die("%s (id=%ld) not found", namestr(n->expr.args[0]), n->expr.did);
             }
@@ -751,3 +751,4 @@
 
     writeasm(fn, &is, fd);
 }
+
--- a/8/reduce.c
+++ b/8/reduce.c
@@ -52,6 +52,30 @@
 static Node *one;
 static Node *ptrsz;
 
+static size_t did(Node *n)
+{
+    if (n->type == Ndecl) {
+        return n->decl.did;
+    } else if (n->type == Nexpr) {
+        assert(exprop(n) == Ovar);
+        return n->expr.did;
+    }
+    dump(n, stderr);
+    die("Can't get did");
+    return 0;
+}
+
+static ulong dclhash(void *dcl)
+{
+    /* large-prime hash. meh. */
+    return did(dcl) * 366787;
+}
+
+static int dcleq(void *a, void *b)
+{
+    return did(a) == did(b);
+}
+
 static void append(Simp *s, Node *n)
 {
     lappend(&s->stmts, &s->nstmts, n);
@@ -539,7 +563,7 @@
     s->stksz += size(n);
     if (debug)
         printf("DECLARE %s(%ld) at %zd\n", declname(n), n->decl.did, s->stksz);
-    htput(s->locs, (void*)n->decl.did, (void*)s->stksz);
+    htput(s->locs, n, (void*)s->stksz);
 }
 
 static void declarearg(Simp *s, Node *n)
@@ -547,7 +571,7 @@
     assert(n->type == Ndecl);
     if (debug)
         printf("DECLARE %s(%ld) at %zd\n", declname(n), n->decl.did, -(s->argsz + 8));
-    htput(s->locs, (void*)n->decl.did, (void*)-(s->argsz + 8));
+    htput(s->locs, n, (void*)-(s->argsz + 8));
     s->argsz += size(n);
 }
 
@@ -634,7 +658,7 @@
         printf("\n\nfunction %s\n", name);
 
     /* set up the simp context */
-    s.locs = mkht(ptrhash, ptreq);
+    s.locs = mkht(dclhash, dcleq);
 
     /* unwrap to the function body */
     n = n->expr.args[0];
@@ -695,7 +719,7 @@
     k = htkeys(st->dcl, &nk);
     for (i = 0; i < nk; i++) {
         s = htget(st->dcl, k[i]);
-        htput(globls, (void*)s->decl.did, asmname(s->decl.name));
+        htput(globls, s, asmname(s->decl.name));
     }
     free(k);
 
@@ -721,7 +745,7 @@
 
     n = file->file.stmts;
     nn = file->file.nstmts;
-    globls = mkht(ptrhash, ptreq);
+    globls = mkht(dclhash, dcleq);
 
     /* We need to define all global variables before use */
     fillglobls(file->file.globls, globls);
--- a/test/test.sh
+++ b/test/test.sh
@@ -7,7 +7,7 @@
 function use {
     rm -f $1
     echo $MU $1.myr -o $1.use && \
-    $MU $1.myr -o $1.use && \
+    $MU $1.myr -o $1.use
 }
 
 function build {