Cleaned up a bit more
This commit is contained in:
parent
f48f0efe60
commit
f7504dbd4b
|
@ -52,15 +52,6 @@ df_error(nd, mess, edf)
|
|||
else node_error(nd, mess);
|
||||
}
|
||||
|
||||
STATIC int
|
||||
ex_error(nd, mess)
|
||||
register t_node *nd;
|
||||
char *mess;
|
||||
{
|
||||
node_error(nd, "\"%s\": %s", symbol2str(nd->nd_symb), mess);
|
||||
return 0;
|
||||
}
|
||||
|
||||
MkCoercion(pnd, tp)
|
||||
t_node **pnd;
|
||||
register t_type *tp;
|
||||
|
@ -203,7 +194,8 @@ ChkArrow(expp)
|
|||
tp = exp->nd_RIGHT->nd_type;
|
||||
|
||||
if (tp->tp_fund != T_POINTER) {
|
||||
return ex_error(exp, "illegal operand type");
|
||||
node_error(exp, "\"^\": illegal operand type");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((tp = RemoveEqual(PointedtoType(tp))) == 0) tp = error_type;
|
||||
|
@ -910,6 +902,7 @@ ChkBinOper(expp)
|
|||
t_type *result_type;
|
||||
int allowed;
|
||||
int retval;
|
||||
char *symb;
|
||||
|
||||
/* First, check BOTH operands */
|
||||
|
||||
|
@ -941,7 +934,8 @@ ChkBinOper(expp)
|
|||
*/
|
||||
if (exp->nd_symb == IN) {
|
||||
if (tpr->tp_fund != T_SET) {
|
||||
return ex_error(exp, "right operand must be a set");
|
||||
node_error(exp, "\"IN\": right operand must be a set");
|
||||
return 0;
|
||||
}
|
||||
if (!TstAssCompat(ElementType(tpr), tpl)) {
|
||||
/* Assignment compatible ???
|
||||
|
@ -964,26 +958,27 @@ ChkBinOper(expp)
|
|||
|
||||
allowed = AllowedTypes(exp->nd_symb);
|
||||
|
||||
symb = symbol2str(exp->nd_symb);
|
||||
if (!(tpr->tp_fund & allowed) || !(tpl->tp_fund & allowed)) {
|
||||
if (!((T_CARDINAL & allowed) &&
|
||||
ChkAddressOper(tpl, tpr, exp))) {
|
||||
return ex_error(exp, "illegal operand type(s)");
|
||||
node_error(exp, "\"%s\": illegal operand type(s)", symb);
|
||||
return 0;
|
||||
}
|
||||
if (result_type == bool_type) exp->nd_type = bool_type;
|
||||
}
|
||||
else {
|
||||
if (Boolean(exp->nd_symb) && tpl != bool_type) {
|
||||
return ex_error(exp, "illegal operand type(s)");
|
||||
node_error(exp, "\"%s\": illegal operand type(s)", symb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Operands must be compatible (distilled from Def 8.2)
|
||||
*/
|
||||
if (!TstCompat(tpr, tpl)) {
|
||||
extern char *incompat();
|
||||
char buf[128];
|
||||
|
||||
sprint(buf, "%s in operand(s)", incompat(tpl, tpr));
|
||||
return ex_error(exp, buf);
|
||||
node_error(exp, "\"%s\": %s in operands", symb, incompat(tpl, tpr));
|
||||
return 0;
|
||||
}
|
||||
|
||||
MkCoercion(&(exp->nd_LEFT), tpl);
|
||||
|
@ -1080,7 +1075,8 @@ ChkUnOper(expp)
|
|||
default:
|
||||
crash("ChkUnOper");
|
||||
}
|
||||
return ex_error(exp, "illegal operand type");
|
||||
node_error(exp, "\"%s\": illegal operand type", symbol2str(exp->nd_symb));
|
||||
return 0;
|
||||
}
|
||||
|
||||
STATIC t_node *
|
||||
|
|
|
@ -185,7 +185,7 @@ CodeCoercion(t1, t2)
|
|||
case T_ENUMERATION:
|
||||
case T_CARDINAL:
|
||||
case T_INTORCARD:
|
||||
if (sz1 < word_size) sz1 = word_size;
|
||||
if ((int) sz1 < (int) word_size) sz1 = word_size;
|
||||
/* fall through */
|
||||
case T_EQUAL:
|
||||
case T_POINTER:
|
||||
|
@ -208,7 +208,7 @@ CodeCoercion(t1, t2)
|
|||
|
||||
switch(fund1) {
|
||||
case T_INTEGER:
|
||||
if (sz1 < word_size) {
|
||||
if ((int) sz1 < (int) word_size) {
|
||||
c_loc((int)sz1);
|
||||
c_loc((int) word_size);
|
||||
C_cii();
|
||||
|
@ -220,7 +220,7 @@ CodeCoercion(t1, t2)
|
|||
C_cif();
|
||||
break;
|
||||
}
|
||||
if (sz2 != sz1) {
|
||||
if ((int) sz2 != (int) sz1) {
|
||||
c_loc((int)sz1);
|
||||
c_loc((int)sz2);
|
||||
switch(fund2) {
|
||||
|
@ -244,7 +244,7 @@ CodeCoercion(t1, t2)
|
|||
C_cuf();
|
||||
break;
|
||||
}
|
||||
if (sz1 != sz2) {
|
||||
if ((int) sz1 != (int) sz2) {
|
||||
c_loc((int)sz1);
|
||||
c_loc((int)sz2);
|
||||
switch(fund2) {
|
||||
|
@ -264,7 +264,7 @@ CodeCoercion(t1, t2)
|
|||
case T_REAL:
|
||||
switch(fund2) {
|
||||
case T_REAL:
|
||||
if (sz1 != sz2) {
|
||||
if ((int) sz1 != (int) sz2) {
|
||||
c_loc((int)sz1);
|
||||
c_loc((int)sz2);
|
||||
C_cff();
|
||||
|
@ -404,7 +404,7 @@ CodeParameters(param, arg)
|
|||
}
|
||||
}
|
||||
else if (arg->nd_symb == STRING) {
|
||||
C_loc((arith)(arg->nd_SLE - 1));
|
||||
c_loc((int) arg->nd_SLE - 1);
|
||||
}
|
||||
else if (elem == word_type) {
|
||||
C_loc((arg_type->tp_size+word_size-1) / word_size - 1);
|
||||
|
@ -464,22 +464,22 @@ CodePString(nd, tp)
|
|||
|
||||
static
|
||||
subu(sz)
|
||||
arith sz;
|
||||
int sz;
|
||||
{
|
||||
if (! options['R']) {
|
||||
C_cal((int) sz == (int) word_size ? "subuchk" : "subulchk");
|
||||
C_cal(sz == (int) word_size ? "subuchk" : "subulchk");
|
||||
}
|
||||
C_sbu(sz);
|
||||
C_sbu((arith) sz);
|
||||
}
|
||||
|
||||
static
|
||||
addu(sz)
|
||||
arith sz;
|
||||
int sz;
|
||||
{
|
||||
if (! options['R']) {
|
||||
C_cal((int) sz == (int) word_size ? "adduchk" : "addulchk");
|
||||
C_cal(sz == (int) word_size ? "adduchk" : "addulchk");
|
||||
}
|
||||
C_adu(sz);
|
||||
C_adu((arith)sz);
|
||||
}
|
||||
|
||||
CodeStd(nd)
|
||||
|
@ -555,7 +555,7 @@ CodeStd(nd)
|
|||
register arith size;
|
||||
|
||||
size = left->nd_type->tp_size;
|
||||
if (size < word_size) size = word_size;
|
||||
if ((int) size < (int) word_size) size = word_size;
|
||||
CodePExpr(left);
|
||||
CodeCoercion(left->nd_type, tp);
|
||||
if (arg) {
|
||||
|
@ -568,13 +568,13 @@ CodeStd(nd)
|
|||
}
|
||||
if (std == S_DEC) {
|
||||
if (tp->tp_fund == T_INTEGER) C_sbi(size);
|
||||
else subu(size);
|
||||
else subu((int) size);
|
||||
}
|
||||
else {
|
||||
if (tp->tp_fund == T_INTEGER) C_adi(size);
|
||||
else addu(size);
|
||||
else addu((int) size);
|
||||
}
|
||||
if (size == word_size) {
|
||||
if ((int) size == (int) word_size) {
|
||||
RangeCheck(left->nd_type, tp->tp_fund == T_INTEGER ?
|
||||
int_type : card_type);
|
||||
}
|
||||
|
@ -684,7 +684,7 @@ CodeOper(expr, true_label, false_label)
|
|||
break;
|
||||
case T_CARDINAL:
|
||||
case T_INTORCARD:
|
||||
addu(tp->tp_size);
|
||||
addu((int) tp->tp_size);
|
||||
break;
|
||||
case T_SET:
|
||||
C_ior(tp->tp_size);
|
||||
|
@ -713,7 +713,7 @@ CodeOper(expr, true_label, false_label)
|
|||
break;
|
||||
case T_INTORCARD:
|
||||
case T_CARDINAL:
|
||||
subu(tp->tp_size);
|
||||
subu((int) tp->tp_size);
|
||||
break;
|
||||
case T_SET:
|
||||
C_com(tp->tp_size);
|
||||
|
@ -767,11 +767,9 @@ CodeOper(expr, true_label, false_label)
|
|||
Operands(expr);
|
||||
switch(tp->tp_fund) {
|
||||
case T_INTEGER:
|
||||
if ((int)(tp->tp_size) == word_size) {
|
||||
C_cal((int)(tp->tp_size) == (int)word_size
|
||||
? "dvi"
|
||||
: "dvil");
|
||||
}
|
||||
C_asp(2*tp->tp_size);
|
||||
C_lfr(tp->tp_size);
|
||||
break;
|
||||
|
@ -789,11 +787,9 @@ CodeOper(expr, true_label, false_label)
|
|||
Operands(expr);
|
||||
switch(tp->tp_fund) {
|
||||
case T_INTEGER:
|
||||
if ((int)(tp->tp_size) == word_size) {
|
||||
C_cal((int)(tp->tp_size) == (int)word_size
|
||||
? "rmi"
|
||||
: "rmil");
|
||||
}
|
||||
C_asp(2*tp->tp_size);
|
||||
C_lfr(tp->tp_size);
|
||||
break;
|
||||
|
|
|
@ -30,13 +30,17 @@ extern char *symbol2str();
|
|||
|
||||
#define arith_sign ((arith) (1L << (sizeof(arith) * 8 - 1)))
|
||||
|
||||
#ifndef NOCROSS
|
||||
arith full_mask[MAXSIZE];/* full_mask[1] == 0xFF, full_mask[2] == 0xFFFF, .. */
|
||||
arith max_int[MAXSIZE]; /* max_int[1] == 0x7F, max_int[2] == 0x7FFF, .. */
|
||||
arith min_int[MAXSIZE]; /* min_int[1] == 0xFFFFFF80, min_int[2] = 0xFFFF8000,
|
||||
...
|
||||
*/
|
||||
#ifndef NOCROSS
|
||||
unsigned int wrd_bits; /* number of bits in a word */
|
||||
#else
|
||||
arith full_mask[4] = { 0L, 0xFFL, 0xFFFFL, 0L, 0xFFFFFFFFL };
|
||||
arith max_int[4] = { 0L, 0x7FL, 0x7FFFL, 0L, 0x7FFFFFFFL };
|
||||
arith min_int[4] = { 0L, -128L, -32768L, 0L, -2147483647L-1 };
|
||||
#endif
|
||||
|
||||
extern char options[];
|
||||
|
@ -49,14 +53,6 @@ overflow(expp)
|
|||
}
|
||||
}
|
||||
|
||||
underflow(expp)
|
||||
t_node *expp;
|
||||
{
|
||||
if (expp->nd_type != address_type) {
|
||||
node_warning(expp, W_ORDINARY, "underflow in constant expression");
|
||||
}
|
||||
}
|
||||
|
||||
STATIC
|
||||
commonbin(expp)
|
||||
t_node **expp;
|
||||
|
@ -182,18 +178,20 @@ cstibin(expp)
|
|||
|
||||
switch (exp->nd_symb) {
|
||||
case '*':
|
||||
if (o1 > 0 && o2 > 0) {
|
||||
if (max_int[sz] / o1 < o2) overflow(exp);
|
||||
if (o1 > 0) {
|
||||
if (o2 > 0) {
|
||||
if (max_int[sz] / o1 < o2) overflow(exp);
|
||||
}
|
||||
else if (min_int[sz] / o1 > o2) overflow(exp);
|
||||
}
|
||||
else if (o1 < 0 && o2 < 0) {
|
||||
if (o1 == min_int[sz] || o2 == min_int[sz] ||
|
||||
max_int[sz] / (-o1) < (-o2)) overflow(exp);
|
||||
}
|
||||
else if (o1 > 0) {
|
||||
if (min_int[sz] / o1 > o2) overflow(exp);
|
||||
}
|
||||
else if (o2 > 0) {
|
||||
if (min_int[sz] / o2 > o1) overflow(exp);
|
||||
else if (o1 < 0) {
|
||||
if (o2 < 0) {
|
||||
if (o1 == min_int[sz] || o2 == min_int[sz] ||
|
||||
max_int[sz] / (-o1) < (-o2)) overflow(exp);
|
||||
}
|
||||
else if (o2 > 0) {
|
||||
if (min_int[sz] / o2 > o1) overflow(exp);
|
||||
}
|
||||
}
|
||||
o1 *= o2;
|
||||
break;
|
||||
|
@ -219,22 +217,16 @@ cstibin(expp)
|
|||
break;
|
||||
|
||||
case '+':
|
||||
if (o1 > 0 && o2 > 0) {
|
||||
if (max_int[sz] - o1 < o2) overflow(exp);
|
||||
}
|
||||
else if (o1 < 0 && o2 < 0) {
|
||||
if (min_int[sz] - o1 > o2) overflow(exp);
|
||||
}
|
||||
if ( (o1 > 0 && o2 > 0 && max_int[sz] - o1 < o2)
|
||||
|| (o1 < 0 && o2 < 0 && min_int[sz] - o1 > o2)
|
||||
) overflow(exp);
|
||||
o1 += o2;
|
||||
break;
|
||||
|
||||
case '-':
|
||||
if (o1 >= 0 && o2 < 0) {
|
||||
if (max_int[sz] + o2 < o1) overflow(exp);
|
||||
}
|
||||
else if (o1 < 0 && o2 >= 0) {
|
||||
if (min_int[sz] + o2 > o1) overflow(exp);
|
||||
}
|
||||
if ( (o1 >= 0 && o2 < 0 && max_int[sz] + o2 < o1)
|
||||
|| (o1 < 0 && o2 >= 0 && min_int[sz] + o2 > o1)
|
||||
) overflow(exp);
|
||||
o1 -= o2;
|
||||
break;
|
||||
|
||||
|
@ -390,20 +382,15 @@ cstubin(expp)
|
|||
break;
|
||||
|
||||
case DIV:
|
||||
if (o2 == 0) {
|
||||
node_error(exp, "division by 0");
|
||||
return;
|
||||
}
|
||||
divide(&o1, &o2);
|
||||
break;
|
||||
|
||||
case MOD:
|
||||
if (o2 == 0) {
|
||||
node_error(exp, "modulo by 0");
|
||||
node_error(exp, exp->nd_symb == DIV ?
|
||||
"division by 0" :
|
||||
"modulo by 0");
|
||||
return;
|
||||
}
|
||||
divide(&o1, &o2);
|
||||
o1 = o2;
|
||||
if (exp->nd_symb == MOD) o1 = o2;
|
||||
break;
|
||||
|
||||
case '+':
|
||||
|
@ -414,14 +401,14 @@ cstubin(expp)
|
|||
break;
|
||||
|
||||
case '-':
|
||||
if (! chk_bounds(o2, o1, T_CARDINAL)) {
|
||||
if (exp->nd_type->tp_fund == T_INTORCARD) {
|
||||
exp->nd_type = int_type;
|
||||
if (! chk_bounds(min_int[sz], o1 - o2, T_CARDINAL)) {
|
||||
underflow(exp);
|
||||
}
|
||||
}
|
||||
else underflow(exp);
|
||||
if ( exp->nd_type != address_type
|
||||
&& !chk_bounds(o2, o1, T_CARDINAL)
|
||||
&& ( exp->nd_type->tp_fund != T_INTORCARD
|
||||
|| ( exp->nd_type = int_type
|
||||
, !chk_bounds(min_int[sz], o1 - o2, T_CARDINAL) ) )
|
||||
) {
|
||||
node_warning(exp, W_ORDINARY,
|
||||
"underflow in constant expression");
|
||||
}
|
||||
o1 -= o2;
|
||||
break;
|
||||
|
@ -683,6 +670,7 @@ CutSize(expr)
|
|||
InitCst()
|
||||
{
|
||||
register int i = 0;
|
||||
#ifndef NOCROSS
|
||||
register arith bt = (arith)0;
|
||||
|
||||
while (!(bt < 0)) {
|
||||
|
@ -699,7 +687,10 @@ InitCst()
|
|||
fatal("sizeof (arith) insufficient on this machine");
|
||||
}
|
||||
|
||||
#ifndef NOCROSS
|
||||
wrd_bits = 8 * (int) word_size;
|
||||
#else
|
||||
if (options['s']) {
|
||||
for (i = 0; i < sizeof(long); i++) min_int[i] = - max_int[i];
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include "walk.h"
|
||||
#include "chk_expr.h"
|
||||
#include "warning.h"
|
||||
#include "uns_arith.h"
|
||||
|
||||
#ifndef NOCROSS
|
||||
#include "target_sizes.h"
|
||||
|
@ -302,10 +303,14 @@ chk_bounds(l1, l2, fund)
|
|||
if (fund == T_INTEGER) {
|
||||
return l2 >= l1;
|
||||
}
|
||||
#ifdef UNSIGNED_ARITH
|
||||
return (UNSIGNED_ARITH) l2 >= (UNSIGNED_ARITH) l1;
|
||||
#else
|
||||
return (l2 & arith_sign ?
|
||||
(l1 & arith_sign ? l2 >= l1 : 1) :
|
||||
(l1 & arith_sign ? 0 : l2 >= l1)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
|
|
Loading…
Reference in a new issue