From 54bfaff62524992eed3f092083c78775574ae636 Mon Sep 17 00:00:00 2001 From: ceriel Date: Mon, 11 Apr 1988 18:32:47 +0000 Subject: [PATCH] Added a mechanism to test pointers as soon as possible --- lang/m2/comp/code.c | 41 ++++++++++++++++++++++++++++------------- lang/m2/comp/desig.c | 6 +++--- lang/m2/comp/type.c | 2 +- lang/m2/comp/walk.c | 10 +++++----- lang/m2/comp/walk.h | 1 + 5 files changed, 38 insertions(+), 22 deletions(-) diff --git a/lang/m2/comp/code.c b/lang/m2/comp/code.c index e9d2167eb..d31fe4b80 100644 --- a/lang/m2/comp/code.c +++ b/lang/m2/comp/code.c @@ -414,7 +414,7 @@ CodeParameters(param, arg) case Arrsel: case Arrow: case Def: - CodeDAddress(left); + CodeDAddress(left, IsVarParam(param)); break; default:{ arith tmp, TmpSpace(); @@ -429,7 +429,7 @@ CodeParameters(param, arg) return; } if (IsVarParam(param)) { - CodeDAddress(left); + CodeDAddress(left, 1); return; } if (left_type->tp_fund == T_STRING) { @@ -462,7 +462,7 @@ subu(sz) if (options['R']) C_sbu(sz); else { C_cal(sz == word_size ? "subu" : "subul"); - C_asp(sz); + c_asp((int)sz); } } @@ -473,7 +473,7 @@ addu(sz) if (options['R']) C_adu(sz); else { C_cal(sz == word_size ? "addu" : "addul"); - C_asp(sz); + c_asp((int)sz); } } @@ -507,7 +507,7 @@ CodeStd(nd) if (tp->tp_size == float_size) C_cal("absf"); else C_cal("absd"); } - C_asp(tp->tp_size); + c_asp((int)(tp->tp_size)); C_lfr(tp->tp_size); break; @@ -545,7 +545,7 @@ CodeStd(nd) break; case S_ADR: - CodeDAddress(left); + CodeDAddress(left, 1); break; case S_DEC: @@ -739,7 +739,7 @@ CodeOper(expr, true_label, false_label) C_cal(tp->tp_size <= word_size ? "mulu" : "mulul"); - C_asp(tp->tp_size); + c_asp((int)(tp->tp_size)); } break; case T_REAL: @@ -830,7 +830,7 @@ CodeOper(expr, true_label, false_label) if (expr->nd_symb == GREATEREQUAL) { /* A >= B is the same as A equals A + B */ - C_dup(2*tp->tp_size); + C_dup(tp->tp_size << 1); C_asp(tp->tp_size); C_ior(tp->tp_size); expr->nd_symb = '='; @@ -1027,7 +1027,7 @@ CodeEl(nd, tp) else C_loc((arith) (eltype->enm_ncst - 1)); Operands(nd); C_cal("LtoUset"); /* library routine to fill set */ - C_asp(5 * word_size); + c_asp(5 * (int)word_size); } else { CodePExpr(nd); @@ -1051,7 +1051,7 @@ CodePExpr(nd) free_desig(designator); } -CodeDAddress(nd) +CodeDAddress(nd, chk_controlvar) t_node *nd; { /* Generate code to push the address of the designator "nd" @@ -1059,12 +1059,22 @@ CodeDAddress(nd) */ register t_desig *designator = new_desig(); + int chkptr; - /* ChkForFOR(nd); ??? not quite: wrong for value conformant arrays, - where the parameter is the for-loop control variable - */ + if (chk_controlvar) ChkForFOR(nd); CodeDesig(nd, designator); + chkptr = designator->dsg_kind==DSG_PLOADED || + designator->dsg_kind==DSG_PFIXED; CodeAddress(designator); + + /* Generate dummy use of pointer, to get possible error message + as soon as possible + */ + if (chkptr && ! options['R']) { + C_dup(pointer_size); + C_loi((arith) 1); + c_asp((int)word_size); + } free_desig(designator); } @@ -1118,4 +1128,9 @@ c_lae_dlb(l) { C_lae_dlb(l, (arith) 0); } + +c_asp(n) +{ + C_asp((arith) n); +} #endif diff --git a/lang/m2/comp/desig.c b/lang/m2/comp/desig.c index d55f4f292..10903c399 100644 --- a/lang/m2/comp/desig.c +++ b/lang/m2/comp/desig.c @@ -236,7 +236,7 @@ CodeValue(ds, tp) CodeAddress(ds); CodeConst(tp->tp_size, (int) pointer_size); C_cal("load"); - C_asp(pointer_size + pointer_size); + c_asp((int)pointer_size + (int)pointer_size); break; } break; @@ -368,7 +368,7 @@ CodeMove(rhs, left, rtp) C_loc(rtp->tp_size); C_loc(tp->tp_size); C_cal("StringAssign"); - C_asp(pointer_size + pointer_size + dword_size); + c_asp((int)pointer_size + (int)pointer_size + (int)dword_size); break; } CodeStore(lhs, tp); @@ -436,7 +436,7 @@ CodeMove(rhs, left, rtp) case USE_LOI_STI: CodeConst(tp->tp_size, (int) pointer_size); C_cal("blockmove"); - C_asp(3 * pointer_size); + c_asp(3 * (int)pointer_size); break; } break; diff --git a/lang/m2/comp/type.c b/lang/m2/comp/type.c index 246a9a880..2b79ea9bb 100644 --- a/lang/m2/comp/type.c +++ b/lang/m2/comp/type.c @@ -447,7 +447,7 @@ genrck(tp) else { C_cal(btp->tp_fund == T_INTEGER ? "rckil" : "rckul"); } - C_asp(pointer_size); + c_asp((int)pointer_size); } getbounds(tp, plo, phi) diff --git a/lang/m2/comp/walk.c b/lang/m2/comp/walk.c index bc7fb0de9..b0b68e1f3 100644 --- a/lang/m2/comp/walk.c +++ b/lang/m2/comp/walk.c @@ -86,7 +86,7 @@ DoPriority() tmpprio = NewInt(); C_loc(priority->nd_INT); C_cal("stackprio"); - C_asp(word_size); + c_asp((int)word_size); C_lfr(word_size); C_stl(tmpprio); } @@ -98,7 +98,7 @@ EndPriority() if (priority) { C_lol(tmpprio); C_cal("unstackprio"); - C_asp(word_size); + c_asp((int)word_size); FreeInt(tmpprio); } } @@ -304,7 +304,7 @@ WalkProcedure(procedure) /* First compute new stackpointer */ C_lal(param->par_def->var_off); C_cal("new_stackptr"); - C_asp(pointer_size); + c_asp((int)pointer_size); C_lfr(pointer_size); C_str((arith) 1); /* adjusted stack pointer */ @@ -312,7 +312,7 @@ WalkProcedure(procedure) /* push source address */ C_cal("copy_array"); /* copy */ - C_asp(pointer_size); + c_asp((int)pointer_size); } } } @@ -407,7 +407,7 @@ MkCalls(df) if (df->df_kind == D_MODULE) { C_lxl((arith) 0); C_cal(df->mod_vis->sc_scope->sc_name); - C_asp(pointer_size); + c_asp((int)pointer_size); } } diff --git a/lang/m2/comp/walk.h b/lang/m2/comp/walk.h index 32e2b1b61..cdea0fbbf 100644 --- a/lang/m2/comp/walk.h +++ b/lang/m2/comp/walk.h @@ -22,6 +22,7 @@ extern label data_label; #include "squeeze.h" #ifndef SQUEEZE +#define c_asp(x) C_asp((arith) (x)) #define c_loc(x) C_loc((arith) (x)) #define c_lae_dlb(x) C_lae_dlb(x,(arith) 0) #endif -- 2.34.1