ref: 125ca8ddfee1da241d86f82439e24467b25b310a
parent: 8560a458d2b4ade92ff8354e2a16db3256bead43
author: Jacob Moody <[email protected]>
date: Thu Mar 16 00:56:17 EDT 2023
cc: add NORET
--- a/sys/src/cmd/cc/cc.h
+++ b/sys/src/cmd/cc/cc.h
@@ -327,7 +327,7 @@
TVOLATILE,
TUNSIGNED,
TSIGNED,
- TFILE,
+ TNORET,
TOLD,
NALLTYPES,
@@ -354,9 +354,10 @@
GXXX = 0,
GCONSTNT = 1<<0,
GVOLATILE = 1<<1,
- NGTYPES = 1<<2,
+ GNORET = 1<<2,
+ NGTYPES = 1<<4,
- GINCOMPLETE = 1<<2,
+ GINCOMPLETE = 1<<3,
};
enum
{
@@ -379,7 +380,6 @@
BSTRUCT = 1L<<TSTRUCT,
BUNION = 1L<<TUNION,
BENUM = 1L<<TENUM,
- BFILE = 1L<<TFILE,
BDOT = 1L<<TDOT,
BCONSTNT = 1L<<TCONSTNT,
BVOLATILE = 1L<<TVOLATILE,
@@ -391,6 +391,7 @@
BTYPEDEF = 1L<<TTYPEDEF,
BTYPESTR = 1L<<TTYPESTR,
BREGISTER = 1L<<TREGISTER,
+ BNORET = 1L<<TNORET,
BINTEGER = BCHAR|BUCHAR|BSHORT|BUSHORT|BINT|BUINT|
BLONG|BULONG|BVLONG|BUVLONG,
@@ -399,7 +400,7 @@
/* these can be overloaded with complex types */
BCLASS = BAUTO|BEXTERN|BSTATIC|BTYPEDEF|BTYPESTR|BREGISTER,
- BGARB = BCONSTNT|BVOLATILE,
+ BGARB = BCONSTNT|BVOLATILE|BNORET
};
struct Funct
--- a/sys/src/cmd/cc/cc.y
+++ b/sys/src/cmd/cc/cc.y
@@ -64,7 +64,7 @@
%token LIF LINT LLONG LREGISTER LRETURN LSHORT LSIZEOF LUSED
%token LSTATIC LSTRUCT LSWITCH LTYPEDEF LTYPESTR LUNION LUNSIGNED
%token LWHILE LVOID LENUM LSIGNED LCONSTNT LVOLATILE LSET LSIGNOF
-%token LRESTRICT LINLINE
+%token LRESTRICT LINLINE LNORET
%%
prog:
| prog xdecl
@@ -1149,6 +1149,7 @@
LCONSTNT { $$ = BCONSTNT; }
| LVOLATILE { $$ = BVOLATILE; }
| LRESTRICT { $$ = 0; }
+| LNORET { $$ = BNORET; }
name:
LNAME
--- a/sys/src/cmd/cc/dcl.c
+++ b/sys/src/cmd/cc/dcl.c
@@ -950,6 +950,8 @@
et = t1->etype;
if(et != t2->etype)
return 0;
+ if((t1->garb & GNORET) != (t2->garb & GNORET))
+ return 0;
if(et == TFUNC) {
if(!rsametype(t1->link, t2->link, n, 0))
return 0;
--- a/sys/src/cmd/cc/lex.c
+++ b/sys/src/cmd/cc/lex.c
@@ -1209,6 +1209,7 @@
"inline", LINLINE, 0,
"int", LINT, TINT,
"long", LLONG, TLONG,
+ "NORET", LNORET, 0,
"register", LREGISTER, 0,
"restrict", LRESTRICT, 0,
"return", LRETURN, 0,
--- a/sys/src/cmd/cc/pgen.c
+++ b/sys/src/cmd/cc/pgen.c
@@ -165,6 +165,22 @@
cgen(n, Z);
break;
+ case OFUNC:
+ complex(n);
+ cgen(n, Z);
+ if((n->type->garb & GNORET) == 0)
+ break;
+
+ canreach = 0;
+ warnreach = !suppress;
+ /* existing assumption that branches are at least two jumps */
+ scc = pc;
+ gbranch(OGOTO);
+ patch(p, pc);
+ gbranch(OGOTO);
+ patch(p, scc);
+ break;
+
case OLIST:
case OCOMMA:
gen(n->left);
--- a/sys/src/cmd/cc/sub.c
+++ b/sys/src/cmd/cc/sub.c
@@ -168,6 +168,8 @@
return GVOLATILE;
case BVOLATILE|BCONSTNT:
return GCONSTNT|GVOLATILE;
+ case BNORET:
+ return GNORET;
}
return GXXX;
}
@@ -1351,7 +1353,7 @@
TSTRUCT, 0x7c2da3bf, 0,
TUNION, 0x3eb25e98, 0,
TENUM, 0x44b54f61, 0,
- TFILE, 0x19242ac3, 0,
+ TNORET, 0x19242ac3, 0,
TOLD, 0x22b15988, 0,
TDOT, 0x0204f6b3, 0,
-1, 0, 0,
@@ -1394,7 +1396,7 @@
TSTRUCT, 0, "STRUCT",
TUNION, 0, "UNION",
TENUM, 0, "ENUM",
- TFILE, 0, "FILE",
+ TNORET, 0, "NORET",
TOLD, 0, "OLD",
TDOT, 0, "DOT",
-1, 0, 0,
@@ -1407,6 +1409,7 @@
GCONSTNT, 0, "CONST",
GVOLATILE, 0, "VOLATILE",
GVOLATILE|GCONSTNT, 0, "CONST-VOLATILE",
+ GNORET, 0, "NORET",
-1, 0, 0,
};
@@ -1445,7 +1448,7 @@
TUNSIGNED, 0, "UNSIGNED",
TSIGNED, 0, "SIGNED",
TDOT, 0, "DOT",
- TFILE, 0, "FILE",
+ TNORET, 0, "NORET",
TOLD, 0, "OLD",
-1, 0, 0,
};