shithub: mc

Download patch

ref: 9cd6941cb091231cf2931cad0df63c75b27febab
parent: c74ca51a461eb6090b3d534425d4d988ec27ce98
author: Ori Bernstein <ori@eigenstate.org>
date: Mon Jul 30 21:33:09 EDT 2012

Use RIP relative addressing.

    OSX insists on it, stupidly enough.

--- a/8/isel.c
+++ b/8/isel.c
@@ -78,9 +78,9 @@
 
 static Loc *loc(Isel *s, Node *n)
 {
-    Loc *l;
-    Node *v;
     size_t stkoff;
+    Loc *l, *rip;
+    Node *v;
 
     switch (exprop(n)) {
         case Ovar:
@@ -88,7 +88,11 @@
                 stkoff = (size_t)htget(s->locs, n);
                 l = locmem(-stkoff, locphysreg(Rrbp), NULL, mode(n));
             } else if (hthas(s->globls, n)) {
-                l = locmeml(htget(s->globls, n), NULL, NULL, mode(n));
+                if (tybase(exprtype(n))->type == Tyfunc)
+                    rip = NULL;
+                else
+                    rip = locphysreg(Rrip);
+                l = locmeml(htget(s->globls, n), rip, NULL, mode(n));
             } else {
                 die("%s (id=%ld) not found", namestr(n->expr.args[0]), n->expr.did);
             }
--- a/8/regs.def
+++ b/8/regs.def
@@ -78,4 +78,4 @@
 Reg(R14, "%r14", ModeQ)
 Reg(R15, "%r15", ModeQ)
 
-
+Reg(Rrip, "%rip", ModeQ)
--