From 125ca8ddfee1da241d86f82439e24467b25b310a Mon Sep 17 00:00:00 2001 From: Jacob Moody Date: Thu, 16 Mar 2023 04:56:17 +0000 Subject: cc: add NORET --- sys/src/cmd/cc/cc.h | 11 ++++++----- sys/src/cmd/cc/cc.y | 3 ++- sys/src/cmd/cc/dcl.c | 2 ++ sys/src/cmd/cc/lex.c | 1 + sys/src/cmd/cc/pgen.c | 16 ++++++++++++++++ sys/src/cmd/cc/sub.c | 9 ++++++--- 6 files changed, 33 insertions(+), 9 deletions(-) (limited to 'sys/src') diff --git a/sys/src/cmd/cc/cc.h b/sys/src/cmd/cc/cc.h index 043719efe..663250fa7 100644 --- a/sys/src/cmd/cc/cc.h +++ b/sys/src/cmd/cc/cc.h @@ -327,7 +327,7 @@ enum TVOLATILE, TUNSIGNED, TSIGNED, - TFILE, + TNORET, TOLD, NALLTYPES, @@ -354,9 +354,10 @@ enum 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 @@ enum BSTRUCT = 1L<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; diff --git a/sys/src/cmd/cc/lex.c b/sys/src/cmd/cc/lex.c index 5c87c6310..01107318e 100644 --- a/sys/src/cmd/cc/lex.c +++ b/sys/src/cmd/cc/lex.c @@ -1209,6 +1209,7 @@ struct "inline", LINLINE, 0, "int", LINT, TINT, "long", LLONG, TLONG, + "NORET", LNORET, 0, "register", LREGISTER, 0, "restrict", LRESTRICT, 0, "return", LRETURN, 0, diff --git a/sys/src/cmd/cc/pgen.c b/sys/src/cmd/cc/pgen.c index c9002ac33..2b382bda1 100644 --- a/sys/src/cmd/cc/pgen.c +++ b/sys/src/cmd/cc/pgen.c @@ -165,6 +165,22 @@ loop: 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); diff --git a/sys/src/cmd/cc/sub.c b/sys/src/cmd/cc/sub.c index 9be762a0c..dd120e978 100644 --- a/sys/src/cmd/cc/sub.c +++ b/sys/src/cmd/cc/sub.c @@ -168,6 +168,8 @@ simpleg(long b) return GVOLATILE; case BVOLATILE|BCONSTNT: return GCONSTNT|GVOLATILE; + case BNORET: + return GNORET; } return GXXX; } @@ -1351,7 +1353,7 @@ Init thashinit[] = 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 @@ Init tnamesinit[] = 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 @@ Init gnamesinit[] = GCONSTNT, 0, "CONST", GVOLATILE, 0, "VOLATILE", GVOLATILE|GCONSTNT, 0, "CONST-VOLATILE", + GNORET, 0, "NORET", -1, 0, 0, }; @@ -1445,7 +1448,7 @@ Init qnamesinit[] = TUNSIGNED, 0, "UNSIGNED", TSIGNED, 0, "SIGNED", TDOT, 0, "DOT", - TFILE, 0, "FILE", + TNORET, 0, "NORET", TOLD, 0, "OLD", -1, 0, 0, }; -- cgit v1.2.3