git: 9front

Download patch

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