浏览代码

improve range-checking macros

They are now linear and can be
safely used with arguments that
have side-effects. This patch
also introduces an iscall()
macro and uses it to fix a
missing check for Ovacall in
liveness analysis.
Quentin Carbonneaux 6 年之前
父节点
当前提交
fd65f4275b
共有 3 个文件被更改,包括 10 次插入8 次删除
  1. 8 6
      all.h
  2. 1 1
      live.c
  3. 1 1
      load.c

+ 8 - 6
all.h

@@ -171,12 +171,14 @@ enum {
 	Jjf1 = Jjffuo,
 };
 
-#define isstore(o) (Ostoreb <= o && o <= Ostored)
-#define isload(o) (Oloadsb <= o && o <= Oload)
-#define isext(o) (Oextsb <= o && o <= Oextuw)
-#define ispar(o) (Opar <= o && o <= Opare)
-#define isarg(o) (Oarg <= o && o <= Oarge)
-#define isret(j) (Jret0 <= j && j <= Jretc)
+#define INRANGE(x, l, u) ((unsigned)(x) - l <= u - l) /* linear in x */
+#define iscall(o) INRANGE(o, Ocall, Ovacall)
+#define isstore(o) INRANGE(o, Ostoreb, Ostored)
+#define isload(o) INRANGE(o, Oloadsb, Oload)
+#define isext(o) INRANGE(o, Oextsb, Oextuw)
+#define ispar(o) INRANGE(o, Opar, Opare)
+#define isarg(o) INRANGE(o, Oarg, Oarge)
+#define isret(j) INRANGE(j, Jret0, Jretc)
 
 enum Class {
 	Kx = -1, /* "top" class (see usecheck() and clsmerge()) */

+ 1 - 1
live.c

@@ -82,7 +82,7 @@ Again:
 		for (k=0; k<2; k++)
 			b->nlive[k] = nlv[k];
 		for (i=&b->ins[b->nins]; i!=b->ins;) {
-			if ((--i)->op == Ocall && rtype(i->arg[1]) == RCall) {
+			if (iscall((--i)->op) && rtype(i->arg[1]) == RCall) {
 				b->in->t[0] &= ~T.retregs(i->arg[1], m);
 				for (k=0; k<2; k++) {
 					nlv[k] -= m[k];

+ 1 - 1
load.c

@@ -231,7 +231,7 @@ def(Slice sl, bits msk, Blk *b, Ins *i, Loc *il)
 	while (i > b->ins) {
 		--i;
 		if (killsl(i->to, sl)
-		|| ((i->op == Ocall || i->op == Ovacall) && escapes(sl.ref, curf)))
+		|| (iscall(i->op) && escapes(sl.ref, curf)))
 			goto Load;
 		ld = isload(i->op);
 		if (ld) {