From: ceriel Date: Wed, 22 Mar 1989 09:53:47 +0000 (+0000) Subject: made the previous changes in parameter passing mechanism and return X-Git-Tag: release-5-5~2490 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=3a3b5db45ded7e1762333947b1095cba58686616;p=ack.git made the previous changes in parameter passing mechanism and return value mechanism settable with compile time constants --- diff --git a/lang/m2/comp/BigPars b/lang/m2/comp/BigPars index d22fe0880..acca3a2db 100644 --- a/lang/m2/comp/BigPars +++ b/lang/m2/comp/BigPars @@ -76,3 +76,18 @@ */ +!File: bigparam.h +#define PASS_BIG_VAL_AS_VAR 1 /* define when big value parameters must be + passed as addresses + */ + + +!File: bigresult.h +#define BIG_RESULT_ON_STACK 1 /* define when function results must be + put on the stack; in this case, caller + reserves space for it. When not defined, + callee puts result in global data area and + returns a pointer to it + */ + + diff --git a/lang/m2/comp/Makefile b/lang/m2/comp/Makefile index 805c4c685..170d427a1 100644 --- a/lang/m2/comp/Makefile +++ b/lang/m2/comp/Makefile @@ -43,7 +43,7 @@ SRC = $(CSRC) $(GENC) OBJ = $(COBJ) $(LOBJ) Lpars.o GENH= errout.h\ - idfsize.h numsize.h strsize.h target_sizes.h \ + idfsize.h numsize.h strsize.h target_sizes.h bigparam.h bigresult.h \ inputtype.h density.h squeeze.h nocross.h nostrict.h \ def.h debugcst.h type.h Lpars.h node.h desig.h strict3rd.h HFILES= LLlex.h\ @@ -178,6 +178,7 @@ $(CURRDIR)cemain: $(OBJ) $(CURRDIR)Makefile #AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO LLlex.o: LLlex.h LLlex.o: Lpars.h +LLlex.o: bigparam.h LLlex.o: class.h LLlex.o: const.h LLlex.o: debug.h @@ -212,6 +213,7 @@ error.o: warning.h main.o: LLlex.h main.o: Lpars.h main.o: SYSTEM.h +main.o: bigparam.h main.o: debug.h main.o: debugcst.h main.o: def.h @@ -236,6 +238,7 @@ input.o: f_info.h input.o: input.h input.o: inputtype.h type.o: LLlex.h +type.o: bigparam.h type.o: chk_expr.h type.o: const.h type.o: debug.h @@ -253,6 +256,7 @@ type.o: walk.h type.o: warning.h def.o: LLlex.h def.o: Lpars.h +def.o: bigparam.h def.o: debug.h def.o: debugcst.h def.o: def.h @@ -270,6 +274,7 @@ misc.o: idf.h misc.o: misc.h misc.o: node.h enter.o: LLlex.h +enter.o: bigparam.h enter.o: debug.h enter.o: debugcst.h enter.o: def.h @@ -284,6 +289,7 @@ enter.o: target_sizes.h enter.o: type.h defmodule.o: LLlex.h defmodule.o: Lpars.h +defmodule.o: bigparam.h defmodule.o: debug.h defmodule.o: debugcst.h defmodule.o: def.h @@ -299,6 +305,7 @@ defmodule.o: scope.h defmodule.o: target_sizes.h defmodule.o: type.h typequiv.o: LLlex.h +typequiv.o: bigparam.h typequiv.o: debug.h typequiv.o: debugcst.h typequiv.o: def.h @@ -311,6 +318,7 @@ typequiv.o: target_sizes.h typequiv.o: type.h typequiv.o: warning.h node.o: LLlex.h +node.o: bigparam.h node.o: debug.h node.o: debugcst.h node.o: def.h @@ -321,6 +329,7 @@ node.o: target_sizes.h node.o: type.h cstoper.o: LLlex.h cstoper.o: Lpars.h +cstoper.o: bigparam.h cstoper.o: debug.h cstoper.o: debugcst.h cstoper.o: idf.h @@ -332,6 +341,7 @@ cstoper.o: type.h cstoper.o: warning.h chk_expr.o: LLlex.h chk_expr.o: Lpars.h +chk_expr.o: bigparam.h chk_expr.o: chk_expr.h chk_expr.o: const.h chk_expr.o: debug.h @@ -349,6 +359,7 @@ chk_expr.o: strict3rd.h chk_expr.o: target_sizes.h chk_expr.o: type.h chk_expr.o: warning.h +options.o: bigparam.h options.o: class.h options.o: idfsize.h options.o: main.h @@ -361,6 +372,8 @@ options.o: type.h options.o: warning.h walk.o: LLlex.h walk.o: Lpars.h +walk.o: bigparam.h +walk.o: bigresult.h walk.o: chk_expr.h walk.o: debug.h walk.o: debugcst.h @@ -380,6 +393,7 @@ walk.o: type.h walk.o: walk.h walk.o: warning.h desig.o: LLlex.h +desig.o: bigparam.h desig.o: debug.h desig.o: debugcst.h desig.o: def.h @@ -394,6 +408,8 @@ desig.o: walk.h desig.o: warning.h code.o: LLlex.h code.o: Lpars.h +code.o: bigparam.h +code.o: bigresult.h code.o: debug.h code.o: debugcst.h code.o: def.h @@ -407,6 +423,7 @@ code.o: target_sizes.h code.o: type.h code.o: walk.h lookup.o: LLlex.h +lookup.o: bigparam.h lookup.o: debug.h lookup.o: debugcst.h lookup.o: def.h @@ -420,6 +437,7 @@ lookup.o: type.h tokenfile.o: Lpars.h program.o: LLlex.h program.o: Lpars.h +program.o: bigparam.h program.o: debug.h program.o: debugcst.h program.o: def.h @@ -435,6 +453,7 @@ program.o: type.h program.o: warning.h declar.o: LLlex.h declar.o: Lpars.h +declar.o: bigparam.h declar.o: chk_expr.h declar.o: debug.h declar.o: debugcst.h @@ -452,6 +471,7 @@ declar.o: type.h declar.o: warning.h expression.o: LLlex.h expression.o: Lpars.h +expression.o: bigparam.h expression.o: chk_expr.h expression.o: const.h expression.o: debug.h @@ -465,6 +485,7 @@ expression.o: type.h expression.o: warning.h statement.o: LLlex.h statement.o: Lpars.h +statement.o: bigparam.h statement.o: def.h statement.o: idf.h statement.o: nocross.h @@ -477,6 +498,7 @@ char.o: class.h Lpars.o: Lpars.h casestat.o: LLlex.h casestat.o: Lpars.h +casestat.o: bigparam.h casestat.o: chk_expr.h casestat.o: debug.h casestat.o: debugcst.h @@ -490,6 +512,7 @@ casestat.o: target_sizes.h casestat.o: type.h casestat.o: walk.h tmpvar.o: LLlex.h +tmpvar.o: bigparam.h tmpvar.o: debug.h tmpvar.o: debugcst.h tmpvar.o: def.h @@ -499,6 +522,7 @@ tmpvar.o: scope.h tmpvar.o: target_sizes.h tmpvar.o: type.h scope.o: LLlex.h +scope.o: bigparam.h scope.o: debug.h scope.o: debugcst.h scope.o: def.h diff --git a/lang/m2/comp/SmallPars b/lang/m2/comp/SmallPars index f879fe651..ec72d72c2 100644 --- a/lang/m2/comp/SmallPars +++ b/lang/m2/comp/SmallPars @@ -76,3 +76,18 @@ */ +!File: bigparam.h +#undef PASS_BIG_VAL_AS_VAR 1 /* define when big value parameters must be + passed as addresses + */ + + +!File: bigresult.h +#define BIG_RESULT_ON_STACK 1 /* define when function results must be + put on the stack; in this case, caller + reserves space for it. When not defined, + callee puts result in global data area and + returns a pointer to it + */ + + diff --git a/lang/m2/comp/code.c b/lang/m2/comp/code.c index 37a4c5d8c..bad650108 100644 --- a/lang/m2/comp/code.c +++ b/lang/m2/comp/code.c @@ -30,6 +30,7 @@ #include "Lpars.h" #include "standards.h" #include "walk.h" +#include "bigresult.h" extern char *long2str(); extern char *symbol2str(); @@ -321,11 +322,12 @@ CodeCall(nd) assert(IsProc(left)); - if (result_tp = ResultType(left->nd_type)) { - if (TooBigForReturnArea(result_tp)) { - C_asp(-WA(result_tp->tp_size)); - } + result_tp = ResultType(left->nd_type); +#ifdef BIG_RESULT_ON_STACK + if (result_tp && TooBigForReturnArea(result_tp)) { + C_asp(-WA(result_tp->tp_size)); } +#endif if (nd->nd_right) { CodeParameters(ParamList(left->nd_type), nd->nd_right); @@ -356,9 +358,14 @@ CodeCall(nd) } C_asp(left->nd_type->prc_nbpar); if (result_tp) { + arith sz = WA(result_tp->tp_size); if (TooBigForReturnArea(result_tp)) { +#ifndef BIG_RESULT_ON_STACK + C_lfr(pointer_size); + C_loi(sz); +#endif } - else C_lfr(WA(result_tp->tp_size)); + else C_lfr(sz); } DoFilename(needs_fn); DoLineno(nd); diff --git a/lang/m2/comp/type.H b/lang/m2/comp/type.H index ed2afdc30..753d4d8fe 100644 --- a/lang/m2/comp/type.H +++ b/lang/m2/comp/type.H @@ -226,7 +226,13 @@ extern t_type (tpx)) #define IsConstructed(tpx) ((tpx)->tp_fund & T_CONSTRUCTED) #define TooBigForReturnArea(tpx) ((tpx)->tp_size > ret_area_size) + +#include "bigparam.h" +#ifdef PASS_BIG_VAL_AS_VAR #define IsBigParamTp(tpx) ((tpx)->tp_size > double_size) +#else +#define IsBigParamTp(tpx) (0) +#endif PASS_BIG_VAL_AS_VAR extern long full_mask[]; extern long max_int[]; diff --git a/lang/m2/comp/walk.c b/lang/m2/comp/walk.c index 58a690d49..7aab1ac7f 100644 --- a/lang/m2/comp/walk.c +++ b/lang/m2/comp/walk.c @@ -38,6 +38,7 @@ #include "walk.h" #include "misc.h" #include "warning.h" +#include "bigresult.h" extern arith NewPtr(); extern arith NewInt(); @@ -234,7 +235,7 @@ WalkProcedure(procedure) register t_scope *procscope = procedure->prc_vis->sc_scope; register t_type *tp; register t_param *param; - int too_big = 0; /* returnsize larger than returnarea */ + label too_big = 0; /* returnsize larger than returnarea */ arith StackAdjustment = 0; /* space for conformant arrays */ arith retsav = 0; /* temporary space for return value */ arith func_res_size = 0; @@ -254,11 +255,25 @@ WalkProcedure(procedure) if (tp) { func_res_size = WA(tp->tp_size); if (TooBigForReturnArea(tp)) { - /* The result type of this procedure is constructed. +#ifdef BIG_RESULT_ON_STACK + /* The result type of this procedure is too big. The caller will have reserved space on its stack, above the parameters, to store the result. */ too_big = 1; +#else + /* The result type of this procedure is too big. + The actual procedure will return a pointer to a + global data area in which the function result is + stored. + Notice that this makes the code non-reentrant. + Here, we create the data area for the function + result. + */ + too_big = ++data_label; + C_df_dlb(too_big); + C_bss_cst(func_res_size, (arith)0, 0); +#endif BIG_RESULT_ON_STACK } } @@ -378,7 +393,11 @@ WalkProcedure(procedure) /* Fill the data area reserved for the function result with the result */ +#ifdef BIG_RESULT_ON_STACK C_lal(procedure->df_type->prc_nbpar); +#else + c_lae_dlb(too_big); +#endif BIG_RESULT_ON_STACK C_sti(func_res_size); if (StackAdjustment) { /* Remove copies of conformant arrays @@ -386,7 +405,12 @@ WalkProcedure(procedure) LOL(StackAdjustment, pointer_size); C_str((arith) 1); } +#ifdef BIG_RESULT_ON_STACK func_res_size = 0; +#else + c_lae_dlb(too_big); + func_res_size = pointer_size; +#endif BIG_RESULT_ON_STACK } else if (StackAdjustment) { /* First save the function result in a safe place. @@ -406,8 +430,11 @@ WalkProcedure(procedure) C_ret(func_res_size); C_beginpart(partno2); C_pro(procscope->sc_name, -procscope->sc_off); - C_ms_par(procedure->df_type->prc_nbpar + - (too_big ? func_res_size : 0)); + C_ms_par(procedure->df_type->prc_nbpar +#ifdef BIG_RESULT_ON_STACK + + (too_big ? func_res_size : 0) +#endif + ); if (! options['n']) WalkDefList(procscope->sc_def, RegisterMessage); C_endpart(partno2); C_end(-procscope->sc_off); @@ -974,9 +1001,11 @@ UseWarnings(df) warning = "never used/assigned"; break; case D_USED|D_VARPAR: +#ifdef PASS_BIG_VAL_AS_VAR if (df->df_type->tp_fund != T_EQUAL) { warning = "never assigned, could be value parameter"; } +#endif break; case D_USED: warning = "never assigned";