code: plan9front

Download patch

ref: 069fd98950440119fef047c09e8816e1e1601319
parent: caec06be08d80ed5c6d99367604dbba006d6013f
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Fri Dec 29 11:38:04 EST 2023

?c: fix nodret check

we used to compare the symbol to nodret->s to see if
we got the return pointer, but this is wrong as
nodret is a OIND, pointing to a ONAME and therefore
sym would be nil.

instead, just compare the symbol string to ".ret".

--- a/sys/src/cmd/2c/reg.c
+++ b/sys/src/cmd/2c/reg.c
@@ -617,7 +617,7 @@
 		v++;
 	}
 	if(s)
-		if(s->name[0] == '.' && s != nodret->sym)
+		if(s->name[0] == '.' && strcmp(s->name, ".ret") != 0)
 			goto none;
 	if(nvar >= NVAR) {
 		if(debug['w'] > 1 && s)
--- a/sys/src/cmd/5c/reg.c
+++ b/sys/src/cmd/5c/reg.c
@@ -585,7 +585,7 @@
 		v++;
 	}
 	if(s)
-		if(s->name[0] == '.' && s != nodret->sym)
+		if(s->name[0] == '.' && strcmp(s->name, ".ret") != 0)
 			goto none;
 	if(nvar >= NVAR) {
 		if(debug['w'] > 1 && s)
--- a/sys/src/cmd/6c/reg.c
+++ b/sys/src/cmd/6c/reg.c
@@ -752,7 +752,7 @@
 	s = a->sym;
 	if(s == S)
 		goto none;
-	if(s->name[0] == '.' && s != nodret->sym)
+	if(s->name[0] == '.' && strcmp(s->name, ".ret") != 0)
 		goto none;
 	et = a->etype;
 	o = a->offset;
--- a/sys/src/cmd/7c/reg.c
+++ b/sys/src/cmd/7c/reg.c
@@ -584,7 +584,7 @@
 		v++;
 	}
 	if(s)
-		if(s->name[0] == '.' && s != nodret->sym)
+		if(s->name[0] == '.' && strcmp(s->name, ".ret") != 0)
 			goto none;
 	if(nvar >= NVAR) {
 		if(debug['w'] > 1 && s)
--- a/sys/src/cmd/8c/reg.c
+++ b/sys/src/cmd/8c/reg.c
@@ -682,7 +682,7 @@
 	s = a->sym;
 	if(s == S)
 		goto none;
-	if(s->name[0] == '.' && s != nodret->sym)
+	if(s->name[0] == '.' && strcmp(s->name, ".ret") != 0)
 		goto none;
 	o = a->offset;
 	v = var;
--- a/sys/src/cmd/cc/pgen.c
+++ b/sys/src/cmd/cc/pgen.c
@@ -27,7 +27,7 @@
 	sp = p;
 
 	if(typecmplx[thisfn->link->etype]) {
-		if(nodret == nil) {
+		if(nodret == Z) {
 			nodret = new(ONAME, Z, Z);
 			nodret->sym = slookup(".ret");
 			nodret->class = CPARAM;
--- a/sys/src/cmd/qc/gc.h
+++ b/sys/src/cmd/qc/gc.h
@@ -150,7 +150,6 @@
 EXTERN	Node*	nodrat;
 EXTERN	Node*	nodret;
 EXTERN	Node*	nodsafe;
-EXTERN	Node*	nodretv;
 EXTERN	long	nrathole;
 EXTERN	long	nstring;
 EXTERN	Prog*	p;
--- a/sys/src/cmd/qc/reg.c
+++ b/sys/src/cmd/qc/reg.c
@@ -545,7 +545,7 @@
 		v++;
 	}
 	if(s)
-		if(s->name[0] == '.')
+		if(s->name[0] == '.' && strcmp(s->name, ".ret") != 0)
 			goto none;
 	if(nvar >= NVAR) {
 		if(debug['w'] > 1 && s)
--- a/sys/src/cmd/qc/txt.c
+++ b/sys/src/cmd/qc/txt.c
@@ -65,6 +65,14 @@
 	nodsafe->class = CAUTO;
 	complex(nodsafe);
 
+	nodret = new(ONAME, Z, Z);
+	nodret->sym = slookup(".ret");
+	nodret->type = types[TIND];
+	nodret->etype = TIND;
+	nodret->class = CPARAM;
+	nodret = new(OIND, nodret, Z);
+	complex(nodret);
+
 	t = typ(TARRAY, types[TCHAR]);
 	symrathole = slookup(".rathole");
 	symrathole->class = CGLOBL;
--- a/sys/src/cmd/vc/reg.c
+++ b/sys/src/cmd/vc/reg.c
@@ -575,7 +575,7 @@
 		v++;
 	}
 	if(s)
-		if(s->name[0] == '.' && s != nodret->sym)
+		if(s->name[0] == '.' && strcmp(s->name, ".ret") != 0)
 			goto none;
 	if(nvar >= NVAR) {
 		if(debug['w'] > 1 && s)