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)
--
⑨