ref: ed3c7d4918d967d5d9ed8b6d1d5099d2416ee14e
parent: 505594db4b3021eecb453c188c1021983f7a588e
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Dec 27 15:19:01 EST 2025
?c: eliminate .rathole for arm, arm64, 386, arm-thumb and mips
--- a/sys/src/cmd/5c/cgen.c
+++ b/sys/src/cmd/5c/cgen.c
@@ -431,10 +431,9 @@
break;
case ODOT:
- sugen(l, nodrat, l->type->width);
+ regsalloc(&nod, l);
+ sugen(l, &nod, l->type->width);
if(nn != Z) {- warn(n, "non-interruptable temporary");
- nod = *nodrat;
if(!r || r->op != OCONST) {diag(n, "DOT and no offset");
break;
@@ -1217,9 +1216,6 @@
prtree(nn, "sugen lhs");
prtree(n, "sugen");
}
- if(nn == nodrat)
- if(w > nrathole)
- nrathole = w;
switch(n->op) {case OIND:
if(nn == Z) {@@ -1260,10 +1256,9 @@
case ODOT:
l = n->left;
- sugen(l, nodrat, l->type->width);
+ regsalloc(&nod1, l);
+ sugen(l, &nod1, l->type->width);
if(nn != Z) {- warn(n, "non-interruptable temporary");
- nod1 = *nodrat;
r = n->right;
if(!r || r->op != OCONST) {diag(n, "DOT and no offset");
@@ -1354,15 +1349,16 @@
sugen(n->right, n->left, w);
break;
}
- sugen(n->right, nodrat, w);
- warn(n, "non-interruptable temporary");
- sugen(nodrat, n->left, w);
- sugen(nodrat, nn, w);
+ regsalloc(&nod0, n->right);
+ sugen(n->right, &nod0, w);
+ sugen(&nod0, n->left, w);
+ sugen(&nod0, nn, w);
break;
case OFUNC:
if(nn == Z) {- sugen(n, nodrat, w);
+ regsalloc(&nod0, n);
+ sugen(n, &nod0, w);
break;
}
if(nn->op != OIND) {--- a/sys/src/cmd/5c/gc.h
+++ b/sys/src/cmd/5c/gc.h
@@ -149,16 +149,13 @@
EXTERN int mnstring;
EXTERN Multab multab[20];
EXTERN int hintabsize;
-EXTERN Node* nodrat;
EXTERN Node* nodret;
EXTERN Node* nodsafe;
-EXTERN long nrathole;
EXTERN long nstring;
EXTERN Prog* p;
EXTERN long pc;
EXTERN Node regnode;
EXTERN char string[NSNAME];
-EXTERN Sym* symrathole;
EXTERN Node znode;
EXTERN Prog zprog;
EXTERN char reg[NREG+NFREG];
--- a/sys/src/cmd/5c/swt.c
+++ b/sys/src/cmd/5c/swt.c
@@ -481,7 +481,7 @@
ulong sig;
n = s->name;
- if(debug['T'] && t == D_EXTERN && s->sig != SIGDONE && s->type != types[TENUM] && s != symrathole){+ if(debug['T'] && t == D_EXTERN && s->sig != SIGDONE && s->type != types[TENUM]){sig = sign(s);
bf[0] = ASIGNAME;
bf[1] = sig;
--- a/sys/src/cmd/5c/txt.c
+++ b/sys/src/cmd/5c/txt.c
@@ -5,8 +5,6 @@
void
ginit(void)
{- Type *t;
-
thechar = '5';
thestring = "arm";
exregoffset = REGEXT;
@@ -14,7 +12,6 @@
listinit();
nstring = 0;
mnstring = 0;
- nrathole = 0;
pc = 0;
breakpc = -1;
continpc = -1;
@@ -58,19 +55,6 @@
nodsafe->class = CAUTO;
complex(nodsafe);
- t = typ(TARRAY, types[TCHAR]);
- symrathole = slookup(".rathole");- symrathole->class = CGLOBL;
- symrathole->type = t;
-
- nodrat = new(ONAME, Z, Z);
- nodrat->sym = symrathole;
- nodrat->type = types[TIND];
- nodrat->etype = TVOID;
- nodrat->class = CGLOBL;
- complex(nodrat);
- nodrat->type = t;
-
nodret = new(ONAME, Z, Z);
nodret->sym = slookup(".ret");nodret->type = types[TIND];
@@ -109,7 +93,6 @@
while(mnstring)
outstring("", 1L);symstring->type->width = nstring;
- symrathole->type->width = nrathole;
for(i=0; i<NHASH; i++)
for(s = hash[i]; s != S; s = s->link) {if(s->type == T)
--- a/sys/src/cmd/7c/cgen.c
+++ b/sys/src/cmd/7c/cgen.c
@@ -488,10 +488,9 @@
break;
case ODOT:
- sugen(l, nodrat, l->type->width);
+ regsalloc(&nod, l);
+ sugen(l, &nod, l->type->width);
if(nn != Z) {- warn(n, "non-interruptable temporary");
- nod = *nodrat;
if(!r || r->op != OCONST) {diag(n, "DOT and no offset");
break;
@@ -897,9 +896,6 @@
prtree(nn, "sugen lhs");
prtree(n, "sugen");
}
- if(nn == nodrat)
- if(w > nrathole)
- nrathole = w;
switch(n->op) {case OIND:
if(nn == Z) {@@ -939,10 +935,9 @@
case ODOT:
l = n->left;
- sugen(l, nodrat, l->type->width);
+ regsalloc(&nod1, l);
+ sugen(l, &nod1, l->type->width);
if(nn != Z) {- warn(n, "non-interruptable temporary");
- nod1 = *nodrat;
r = n->right;
if(!r || r->op != OCONST) {diag(n, "DOT and no offset");
@@ -1033,15 +1028,16 @@
sugen(n->right, n->left, w);
break;
}
- sugen(n->right, nodrat, w);
- warn(n, "non-interruptable temporary");
- sugen(nodrat, n->left, w);
- sugen(nodrat, nn, w);
+ regsalloc(&nod0, n->right);
+ sugen(n->right, &nod0, w);
+ sugen(&nod0, n->left, w);
+ sugen(&nod0, nn, w);
break;
case OFUNC:
if(nn == Z) {- sugen(n, nodrat, w);
+ regsalloc(&nod0, n);
+ sugen(n, &nod0, w);
break;
}
if(nn->op != OIND) {--- a/sys/src/cmd/7c/gc.h
+++ b/sys/src/cmd/7c/gc.h
@@ -149,10 +149,8 @@
EXTERN int mnstring;
EXTERN Multab multab[20];
EXTERN int hintabsize;
-EXTERN Node* nodrat;
EXTERN Node* nodret;
EXTERN Node* nodsafe;
-EXTERN long nrathole;
EXTERN long nstring;
EXTERN Prog* p;
EXTERN long pc;
@@ -159,7 +157,6 @@
EXTERN Node regnode;
EXTERN Node qregnode;
EXTERN char string[NSNAME];
-EXTERN Sym* symrathole;
EXTERN Node znode;
EXTERN Prog zprog;
EXTERN char reg[NREG+NFREG];
--- a/sys/src/cmd/7c/swt.c
+++ b/sys/src/cmd/7c/swt.c
@@ -472,7 +472,7 @@
ulong sig;
n = s->name;
- if(debug['T'] && t == D_EXTERN && s->sig != SIGDONE && s->type != types[TENUM] && s != symrathole){+ if(debug['T'] && t == D_EXTERN && s->sig != SIGDONE && s->type != types[TENUM]){sig = sign(s);
bf[0] = ASIGNAME;
bf[1] = ASIGNAME>>8;
--- a/sys/src/cmd/7c/txt.c
+++ b/sys/src/cmd/7c/txt.c
@@ -7,8 +7,6 @@
void
ginit(void)
{- Type *t;
-
thechar = '7';
thestring = "arm64";
exregoffset = REGEXT;
@@ -17,7 +15,6 @@
listinit();
nstring = 0;
mnstring = 0;
- nrathole = 0;
pc = 0;
breakpc = -1;
continpc = -1;
@@ -75,19 +72,6 @@
nodsafe->class = CAUTO;
complex(nodsafe);
- t = typ(TARRAY, types[TCHAR]);
- symrathole = slookup(".rathole");- symrathole->class = CGLOBL;
- symrathole->type = t;
-
- nodrat = new(ONAME, Z, Z);
- nodrat->sym = symrathole;
- nodrat->type = types[TIND];
- nodrat->etype = TVOID;
- nodrat->class = CGLOBL;
- complex(nodrat);
- nodrat->type = t;
-
nodret = new(ONAME, Z, Z);
nodret->sym = slookup(".ret");nodret->type = types[TIND];
@@ -126,7 +110,6 @@
while(mnstring)
outstring("", 1L);symstring->type->width = nstring;
- symrathole->type->width = nrathole;
for(i=0; i<NHASH; i++)
for(s = hash[i]; s != S; s = s->link) {if(s->type == T)
--- a/sys/src/cmd/8c/cgen.c
+++ b/sys/src/cmd/8c/cgen.c
@@ -1023,11 +1023,10 @@
break;
case ODOT:
- sugen(l, nodrat, l->type->width);
+ regsalloc(&nod, l);
+ sugen(l, &nod, l->type->width);
if(nn == Z)
break;
- warn(n, "non-interruptable temporary");
- nod = *nodrat;
if(!r || r->op != OCONST) {diag(n, "DOT and no offset");
break;
@@ -1443,9 +1442,6 @@
prtree(nn, "sugen lhs");
prtree(n, "sugen");
}
- if(nn == nodrat)
- if(w > nrathole)
- nrathole = w;
switch(n->op) {case OIND:
if(nn == Z) {@@ -1491,11 +1487,10 @@
case ODOT:
l = n->left;
- sugen(l, nodrat, l->type->width);
+ regsalloc(&nod1, l);
+ sugen(l, &nod1, l->type->width);
if(nn == Z)
break;
- warn(n, "non-interruptable temporary");
- nod1 = *nodrat;
r = n->right;
if(!r || r->op != OCONST) {diag(n, "DOT and no offset");
@@ -1588,15 +1583,16 @@
break;
}
- sugen(n->right, nodrat, w);
- warn(n, "non-interruptable temporary");
- sugen(nodrat, n->left, w);
- sugen(nodrat, nn, w);
+ regsalloc(&nod0, n->right);
+ sugen(n->right, &nod0, w);
+ sugen(&nod0, n->left, w);
+ sugen(&nod0, nn, w);
break;
case OFUNC:
if(nn == Z) {- sugen(n, nodrat, w);
+ regsalloc(&nod0, n);
+ sugen(n, &nod0, w);
break;
}
h = nn;
--- a/sys/src/cmd/8c/gc.h
+++ b/sys/src/cmd/8c/gc.h
@@ -143,10 +143,8 @@
EXTERN Prog* lastp;
EXTERN long maxargsafe;
EXTERN int mnstring;
-EXTERN Node* nodrat;
EXTERN Node* nodret;
EXTERN Node* nodsafe;
-EXTERN long nrathole;
EXTERN long nstring;
EXTERN Prog* p;
EXTERN long pc;
@@ -154,7 +152,6 @@
EXTERN Node fregnode0;
EXTERN Node fregnode1;
EXTERN char string[NSNAME];
-EXTERN Sym* symrathole;
EXTERN Node znode;
EXTERN Prog zprog;
EXTERN int reg[D_NONE];
--- a/sys/src/cmd/8c/swt.c
+++ b/sys/src/cmd/8c/swt.c
@@ -350,7 +350,7 @@
char *n;
ulong sig;
- if(debug['T'] && t == D_EXTERN && s->sig != SIGDONE && s->type != types[TENUM] && s != symrathole){+ if(debug['T'] && t == D_EXTERN && s->sig != SIGDONE && s->type != types[TENUM]){sig = sign(s);
Bputc(b, ASIGNAME);
Bputc(b, ASIGNAME>>8);
--- a/sys/src/cmd/8c/txt.c
+++ b/sys/src/cmd/8c/txt.c
@@ -4,7 +4,6 @@
ginit(void)
{int i;
- Type *t;
thechar = '8';
thestring = "386";
@@ -13,7 +12,6 @@
listinit();
nstring = 0;
mnstring = 0;
- nrathole = 0;
pc = 0;
breakpc = -1;
continpc = -1;
@@ -64,19 +62,6 @@
nodsafe->class = CAUTO;
complex(nodsafe);
- t = typ(TARRAY, types[TCHAR]);
- symrathole = slookup(".rathole");- symrathole->class = CGLOBL;
- symrathole->type = t;
-
- nodrat = new(ONAME, Z, Z);
- nodrat->sym = symrathole;
- nodrat->type = types[TIND];
- nodrat->etype = TVOID;
- nodrat->class = CGLOBL;
- complex(nodrat);
- nodrat->type = t;
-
nodret = new(ONAME, Z, Z);
nodret->sym = slookup(".ret");nodret->type = types[TIND];
@@ -107,7 +92,6 @@
while(mnstring)
outstring("", 1L);symstring->type->width = nstring;
- symrathole->type->width = nrathole;
for(i=0; i<NHASH; i++)
for(s = hash[i]; s != S; s = s->link) {if(s->type == T)
--- a/sys/src/cmd/tc/cgen.c
+++ b/sys/src/cmd/tc/cgen.c
@@ -483,10 +483,9 @@
break;
case ODOT:
- sugen(l, nodrat, l->type->width);
+ regsalloc(&nod, l);
+ sugen(l, &nod, l->type->width);
if(nn != Z) {- warn(n, "non-interruptable temporary");
- nod = *nodrat;
if(!r || r->op != OCONST) {diag(n, "DOT and no offset");
break;
@@ -932,9 +931,6 @@
prtree(nn, "sugen lhs");
prtree(n, "sugen");
}
- if(nn == nodrat)
- if(w > nrathole)
- nrathole = w;
switch(n->op) {case OIND:
if(nn == Z) {@@ -968,10 +964,9 @@
case ODOT:
l = n->left;
- sugen(l, nodrat, l->type->width);
+ regsalloc(&nod1, l);
+ sugen(l, &nod1, l->type->width);
if(nn != Z) {- warn(n, "non-interruptable temporary");
- nod1 = *nodrat;
r = n->right;
if(!r || r->op != OCONST) {diag(n, "DOT and no offset");
@@ -1062,15 +1057,16 @@
sugen(n->right, n->left, w);
break;
}
- sugen(n->right, nodrat, w);
- warn(n, "non-interruptable temporary");
- sugen(nodrat, n->left, w);
- sugen(nodrat, nn, w);
+ regsalloc(&nod0, n->right);
+ sugen(n->right, &nod0, w);
+ sugen(&nod0, n->left, w);
+ sugen(&nod0, nn, w);
break;
case OFUNC:
if(nn == Z) {- sugen(n, nodrat, w);
+ regsalloc(&nod0, n);
+ sugen(n, &nod0, w);
break;
}
if(nn->op != OIND) {--- a/sys/src/cmd/tc/gc.h
+++ b/sys/src/cmd/tc/gc.h
@@ -148,16 +148,13 @@
EXTERN Multab multab[20];
EXTERN int retok;
extern int hintabsize;
-EXTERN Node* nodrat;
EXTERN Node* nodret;
EXTERN Node* nodsafe;
-EXTERN long nrathole;
EXTERN long nstring;
EXTERN Prog* p;
EXTERN long pc;
EXTERN Node regnode;
EXTERN char string[NSNAME];
-EXTERN Sym* symrathole;
EXTERN Node znode;
EXTERN Prog zprog;
EXTERN char reg[NREG+NFREG];
--- a/sys/src/cmd/tc/swt.c
+++ b/sys/src/cmd/tc/swt.c
@@ -538,7 +538,7 @@
ulong sig;
n = s->name;
- if(debug['T'] && t == D_EXTERN && s->sig != SIGDONE && s->type != types[TENUM] && s != symrathole){+ if(debug['T'] && t == D_EXTERN && s->sig != SIGDONE && s->type != types[TENUM]){sig = sign(s);
bf[0] = ASIGNAME;
bf[1] = sig;
--- a/sys/src/cmd/tc/txt.c
+++ b/sys/src/cmd/tc/txt.c
@@ -3,8 +3,6 @@
void
ginit(void)
{- Type *t;
-
thechar = 't';
thestring = "arm";
exregoffset = REGEXT;
@@ -12,7 +10,6 @@
listinit();
nstring = 0;
mnstring = 0;
- nrathole = 0;
pc = 0;
breakpc = -1;
continpc = -1;
@@ -55,19 +52,6 @@
nodsafe->class = CAUTO;
complex(nodsafe);
- t = typ(TARRAY, types[TCHAR]);
- symrathole = slookup(".rathole");- symrathole->class = CGLOBL;
- symrathole->type = t;
-
- nodrat = new(ONAME, Z, Z);
- nodrat->sym = symrathole;
- nodrat->type = types[TIND];
- nodrat->etype = TVOID;
- nodrat->class = CGLOBL;
- complex(nodrat);
- nodrat->type = t;
-
nodret = new(ONAME, Z, Z);
nodret->sym = slookup(".ret");nodret->type = types[TIND];
@@ -97,7 +81,6 @@
while(mnstring)
outstring("", 1L);symstring->type->width = nstring;
- symrathole->type->width = nrathole;
for(i=0; i<NHASH; i++)
for(s = hash[i]; s != S; s = s->link) {if(s->type == T)
--- a/sys/src/cmd/vc/cgen.c
+++ b/sys/src/cmd/vc/cgen.c
@@ -383,10 +383,9 @@
break;
case ODOT:
- sugen(l, nodrat, l->type->width);
+ regsalloc(&nod, l);
+ sugen(l, &nod, l->type->width);
if(nn != Z) {- warn(n, "non-interruptable temporary");
- nod = *nodrat;
if(!r || r->op != OCONST) {diag(n, "DOT and no offset");
break;
@@ -894,9 +893,6 @@
prtree(nn, "sugen lhs");
prtree(n, "sugen");
}
- if(nn == nodrat)
- if(w > nrathole)
- nrathole = w;
switch(n->op) {case OIND:
if(nn == Z) {@@ -936,10 +932,9 @@
case ODOT:
l = n->left;
- sugen(l, nodrat, l->type->width);
+ regsalloc(&nod1, l);
+ sugen(l, &nod1, l->type->width);
if(nn != Z) {- warn(n, "non-interruptable temporary");
- nod1 = *nodrat;
r = n->right;
if(!r || r->op != OCONST) {diag(n, "DOT and no offset");
@@ -1030,15 +1025,16 @@
sugen(n->right, n->left, w);
break;
}
- sugen(n->right, nodrat, w);
- warn(n, "non-interruptable temporary");
- sugen(nodrat, n->left, w);
- sugen(nodrat, nn, w);
+ regsalloc(&nod0, n->right);
+ sugen(n->right, &nod0, w);
+ sugen(&nod0, n->left, w);
+ sugen(&nod0, nn, w);
break;
case OFUNC:
if(nn == Z) {- sugen(n, nodrat, w);
+ regsalloc(&nod0, n);
+ sugen(n, &nod0, w);
break;
}
if(nn->op != OIND) {--- a/sys/src/cmd/vc/gc.h
+++ b/sys/src/cmd/vc/gc.h
@@ -143,16 +143,13 @@
EXTERN int mnstring;
EXTERN Multab multab[20];
EXTERN int hintabsize;
-EXTERN Node* nodrat;
EXTERN Node* nodret;
EXTERN Node* nodsafe;
-EXTERN long nrathole;
EXTERN long nstring;
EXTERN Prog* p;
EXTERN long pc;
EXTERN Node regnode;
EXTERN char string[NSNAME];
-EXTERN Sym* symrathole;
EXTERN Node znode;
EXTERN Prog zprog;
EXTERN int reg[NREG+NREG];
--- a/sys/src/cmd/vc/swt.c
+++ b/sys/src/cmd/vc/swt.c
@@ -447,7 +447,7 @@
ulong sig;
n = s->name;
- if(debug['T'] && t == D_EXTERN && s->sig != SIGDONE && s->type != types[TENUM] && s != symrathole){+ if(debug['T'] && t == D_EXTERN && s->sig != SIGDONE && s->type != types[TENUM]){sig = sign(s);
bf[0] = ASIGNAME;
bf[1] = sig;
--- a/sys/src/cmd/vc/txt.c
+++ b/sys/src/cmd/vc/txt.c
@@ -4,7 +4,6 @@
ginit(void)
{int i;
- Type *t;
thechar = 'v';
thestring = "mips";
@@ -13,7 +12,6 @@
listinit();
nstring = 0;
mnstring = 0;
- nrathole = 0;
pc = 0;
breakpc = -1;
continpc = -1;
@@ -56,19 +54,6 @@
nodsafe->class = CAUTO;
complex(nodsafe);
- t = typ(TARRAY, types[TCHAR]);
- symrathole = slookup(".rathole");- symrathole->class = CGLOBL;
- symrathole->type = t;
-
- nodrat = new(ONAME, Z, Z);
- nodrat->sym = symrathole;
- nodrat->type = types[TIND];
- nodrat->etype = TVOID;
- nodrat->class = CGLOBL;
- complex(nodrat);
- nodrat->type = t;
-
nodret = new(ONAME, Z, Z);
nodret->sym = slookup(".ret");nodret->type = types[TIND];
@@ -103,7 +88,6 @@
while(mnstring)
outstring("", 1L);symstring->type->width = nstring;
- symrathole->type->width = nrathole;
for(i=0; i<NHASH; i++)
for(s = hash[i]; s != S; s = s->link) {if(s->type == T)
--
⑨