@@ -816,8 +816,9 @@ let rec generate_stmt (dgfip_flags : Dgfip_options.flags) (p : Mir.program)
816816 let print = fresh_c_local " print" in
817817 let print_def = print ^ " _def" in
818818 let print_val = print ^ " _val" in
819- (* The [print] var only is needed in a few cases. *)
819+ (* The [print]* variables are needed only in a few cases. *)
820820 let print_var_is_needed = ref false in
821+ let print_def_val_are_needed = ref false in
821822 (* Iterating on the arguments and saving the associated printers in a
822823 list to check as we build it if we will need the print_var; in which
823824 case, we set the previous reference to true. *)
@@ -855,6 +856,7 @@ let rec generate_stmt (dgfip_flags : Dgfip_options.flags) (p : Mir.program)
855856 pr " @;print_string(%s, %s, %s->%s);" print_std pr_ctx ptr
856857 fld
857858 | TabAccess (m_sp_opt , v , m_idx ) ->
859+ print_def_val_are_needed := true ;
858860 fun () ->
859861 pr_sp m_sp_opt (Some v);
860862 pr " @;@[<v 2>{" ;
@@ -884,7 +886,9 @@ let rec generate_stmt (dgfip_flags : Dgfip_options.flags) (p : Mir.program)
884886 let ef =
885887 StrMap. find (Pos. unmark f) p.program_event_fields
886888 in
887- print_var_is_needed := ef.is_var;
889+ if ef.is_var then (
890+ print_var_is_needed := true ;
891+ print_def_val_are_needed := true );
888892 fun () ->
889893 pr_sp m_sp_opt None ;
890894 if ef.is_var then (
@@ -903,6 +907,7 @@ let rec generate_stmt (dgfip_flags : Dgfip_options.flags) (p : Mir.program)
903907 print_std pr_ctx print (Pos. unmark f) fld;
904908 pr " @]@;}" ))
905909 | PrintIndent e ->
910+ print_def_val_are_needed := true ;
906911 fun () ->
907912 generate_expr_with_res_in p dgfip_flags oc print_def print_val
908913 e;
@@ -911,6 +916,7 @@ let rec generate_stmt (dgfip_flags : Dgfip_options.flags) (p : Mir.program)
911916 print_val;
912917 pr " @]@;}"
913918 | PrintExpr (e , min , max ) ->
919+ print_def_val_are_needed := true ;
914920 fun () ->
915921 generate_expr_with_res_in p dgfip_flags oc print_def print_val
916922 e;
@@ -923,7 +929,8 @@ let rec generate_stmt (dgfip_flags : Dgfip_options.flags) (p : Mir.program)
923929 args
924930 in
925931 pr " @;@[<v 2>{" ;
926- pr " @;char %s;@;double %s;" print_def print_val;
932+ if ! print_def_val_are_needed then
933+ pr " @;char %s;@;double %s;" print_def print_val;
927934 if ! print_var_is_needed then pr " @;int %s;" print;
928935 List. iter (fun f -> f () ) printers;
929936 pr " @]@;}"
@@ -1150,156 +1157,179 @@ let rec generate_stmt (dgfip_flags : Dgfip_options.flags) (p : Mir.program)
11501157 let nb_events_sav = fresh_c_local " nb_events_sav" in
11511158 let nb_add = fresh_c_local " nb_add" in
11521159 let cpt_i = fresh_c_local " i" in
1153- let cpt_j = fresh_c_local " j" in
11541160 let evt = fresh_c_local " evt" in
1155- pr " @;@[<v 2>{" ;
1156- pr " @;T_event **%s = irdata->events;" events_sav;
1157- pr " @;int %s = irdata->nb_events;" nb_events_sav;
1158- pr " @;int %s = 0;" nb_add;
1159- pr " @;T_event **%s = NULL;" events_tmp;
1160- pr " @;int %s = 0;" cpt_i;
1161- pr " @;int %s = 0;" cpt_j;
1162- (match add with
1163- | Some expr ->
1164- pr " @;@[<v 2>{" ;
1165- let cond = fresh_c_local " cond" in
1166- let cond_def = cond ^ " _def" in
1167- let cond_val = cond ^ " _val" in
1168- pr " @;char %s;@;double %s;" cond_def cond_val;
1169- generate_expr_with_res_in p dgfip_flags oc cond_def cond_val expr;
1170- pr " @;%s = (int)%s;" nb_add cond_val;
1171- pr " @;if (%s < 0) %s = 0;" nb_add nb_add;
1172- pr " @;@[<v 2>if (%s && 0 < %s) {" cond_def nb_add;
1173- let cpt_k = fresh_c_local " k" in
1174- pr " @;int %s = 0;" cpt_k;
1175- pr " @;%s = (T_event **)malloc((%s + %s) * (sizeof (T_event *)));"
1176- events_tmp nb_events_sav nb_add;
1177- pr " @;@[<v 2>for (%s = 0; %s < %s; %s++) {" cpt_k cpt_k nb_add cpt_k;
1178- pr " @;T_event *%s = (T_event *)malloc(sizeof (T_event));" evt;
1179- StrMap. iter
1180- (fun f (ef : Com.event_field ) ->
1181- if ef.is_var then
1182- let _, var = StrMap. min_binding p.program_vars in
1183- pr " @;%s->field_%s_var = %s;" evt f (VID. gen_info_ptr var)
1184- else (
1185- pr " @;%s->field_%s_def = 0;" evt f;
1186- pr " @;%s->field_%s_val = 0.0;" evt f))
1187- p.program_event_fields;
1188- pr " @;%s[%s] = %s;" events_tmp cpt_k evt;
1189- pr " @]@;}" ;
1190- pr " @]@;@[<v 2>} else {" ;
1191- pr " @;%s = 0;" nb_add;
1192- pr " @;%s = (T_event **)malloc(%s * (sizeof (T_event *)));" events_tmp
1193- nb_events_sav;
1194- pr " @]@;}" ;
1195- pr " @;%s = %s;" cpt_i nb_add;
1196- pr " @]@;}"
1197- | None ->
1198- pr " @;%s = (T_event **)malloc(%s * (sizeof (T_event *)));" events_tmp
1199- nb_events_sav);
1200- (match filter with
1201- | Some (var , expr ) ->
1202- pr " @;@[<v 2>while(%s < %s) {" cpt_j nb_events_sav;
1203- let ref_def = VID. gen_def None var in
1204- (* !!! *)
1205- let ref_val = VID. gen_val None var in
1206- (* !!! *)
1207- let cond = fresh_c_local " cond" in
1208- let cond_def = cond ^ " _def" in
1209- let cond_val = cond ^ " _val" in
1210- pr " @;char %s;@;double %s;" cond_def cond_val;
1211- pr " @;%s = 1;" ref_def;
1212- pr " @;%s = (double)%s;" ref_val cpt_j;
1213- generate_expr_with_res_in p dgfip_flags oc cond_def cond_val expr;
1214- pr " @;@[<v 2>if (%s && %s != 0.0) {" cond_def cond_val;
1215- pr " @;%s[%s] = irdata->events[%s];" events_tmp cpt_i cpt_j;
1216- pr " @;%s++;" cpt_i;
1217- pr " @]@;}" ;
1218- pr " @;%s++;" cpt_j;
1219- pr " @]@;}" ;
1220- pr " @;irdata->events = %s;" events_tmp;
1221- pr " @;irdata->nb_events = %s;" cpt_i
1222- | None ->
1223- pr " @;@[<v 2>while (%s < %s) {" cpt_i nb_events_sav;
1224- pr " @;%s[%s] = irdata->events[%s];" events_tmp cpt_i cpt_i;
1225- pr " @;%s++;" cpt_i;
1226- pr " @]@;}" ;
1227- pr " @;irdata->events = %s;" events_tmp;
1228- pr " @;irdata->nb_events = %s;" cpt_i);
1229- (match sort with
1230- | Some (var0 , var1 , expr ) ->
1231- pr " @;/* merge sort */" ;
1232- pr " @;@[<v 2>{" ;
1233- pr " @;int aBeg = %s;" nb_add;
1234- pr " @;int aEnd = irdata->nb_events;" ;
1235- pr
1236- " @;\
1237- T_event **b = (T_event **)malloc(irdata->nb_events * (sizeof \
1238- (T_event *)));" ;
1239- pr " @;int width;" ;
1240- pr " @;int iLeft;" ;
1241- pr " @;int i;" ;
1242- pr
1243- " @;\
1244- @[<v 2>@[<hov 2>for (width = 1;@ width < aEnd;@ width = 2 * \
1245- width) {@]" ;
1246- pr
1247- " @;\
1248- @[<v 2>@[<hov 2>for (iLeft = aBeg;@ iLeft < aEnd;@ iLeft = iLeft \
1249- + 2 * width) {@]" ;
1250- pr " @;int iRight = iLeft + width;" ;
1251- pr " @;int iEnd = iLeft + 2 * width;" ;
1252- pr " @;if (iRight > aEnd) iRight = aEnd;" ;
1253- pr " @;if (iEnd > aEnd) iEnd = aEnd;" ;
1254- pr " @;@[<v 2>{" ;
1255- pr " @;int i = iLeft;" ;
1256- pr " @;int j = iRight;" ;
1257- pr " @;int k;" ;
1258- pr " @;@[<v 2>@[<hov 2>for (k = iLeft;@ k < iEnd;@ k++) {@]" ;
1259- pr " @;int cpt = 0;" ;
1260- pr " @;@[<v 2>{" ;
1261- (* Comparaison *)
1262- let ref0_def = VID. gen_def None var0 in
1263- (* !!! *)
1264- let ref0_val = VID. gen_val None var0 in
1265- (* !!! *)
1266- let ref1_def = VID. gen_def None var1 in
1267- (* !!! *)
1268- let ref1_val = VID. gen_val None var1 in
1269- (* !!! *)
1270- let cmp_def = fresh_c_local " cmp_def" in
1271- let cmp_val = fresh_c_local " cmp_val" in
1272- pr " @;char %s;@;double %s;" cmp_def cmp_val;
1273- pr " @;%s = 1;" ref0_def;
1274- pr " @;%s = (double)i;" ref0_val;
1275- pr " @;%s = 1;" ref1_def;
1276- pr " @;%s = (double)j;" ref1_val;
1277- generate_expr_with_res_in p dgfip_flags oc cmp_def cmp_val expr;
1278- pr " @;cpt = %s && %s != 0.0;" cmp_def cmp_val;
1279- (* ----------- *)
1280- pr " @]@;}" ;
1281- pr " @;@[<v 2>if (i < iRight && (j >= iEnd || cpt)) {" ;
1282- pr " @;b[k] = irdata->events[i];" ;
1283- pr " @;i = i + 1;" ;
1284- pr " @]@;@;@[<v 2>} else {" ;
1285- pr " @;b[k] = irdata->events[j];" ;
1286- pr " @;j = j + 1;" ;
1287- pr " @]@;}" ;
1288- pr " @]@;}" ;
1289- pr " @]@;}" ;
1290- pr " @]@;}" ;
1291- pr " @;@[<v 2>@[<hov 2>for (i = aBeg;@ i < aEnd;@ i++) {@]" ;
1292- pr " @;irdata->events[i] = b[i];" ;
1293- pr " @]@;}" ;
1294- pr " @]@;}" ;
1295- pr " @;free(b);" ;
1296- pr " @]@;}"
1297- | None -> () );
1298- pr " %a" (generate_stmts dgfip_flags p) stmts;
1299- pr " @;free(irdata->events);" ;
1300- pr " @;irdata->events = %s;" events_sav;
1301- pr " @;irdata->nb_events = %s;" nb_events_sav;
1302- pr " @]@;}"
1161+ let cpt_j = fresh_c_local " j" in
1162+ let need_j = ref false in
1163+ let init () =
1164+ pr " @;@[<v 2>{" ;
1165+ pr " @;T_event **%s = irdata->events;" events_sav;
1166+ pr " @;int %s = irdata->nb_events;" nb_events_sav;
1167+ pr " @;int %s = 0;" nb_add;
1168+ pr " @;T_event **%s = NULL;" events_tmp;
1169+ pr " @;int %s = 0;" cpt_i;
1170+ if ! need_j then pr " @;int %s = 0;" cpt_j
1171+ in
1172+ let add_printer =
1173+ match add with
1174+ | Some expr ->
1175+ fun () ->
1176+ pr " @;@[<v 2>{" ;
1177+ let cond = fresh_c_local " cond" in
1178+ let cond_def = cond ^ " _def" in
1179+ let cond_val = cond ^ " _val" in
1180+ pr " @;char %s;@;double %s;" cond_def cond_val;
1181+ generate_expr_with_res_in p dgfip_flags oc cond_def cond_val expr;
1182+ pr " @;%s = (int)%s;" nb_add cond_val;
1183+ pr " @;if (%s < 0) %s = 0;" nb_add nb_add;
1184+ pr " @;@[<v 2>if (%s && 0 < %s) {" cond_def nb_add;
1185+ let cpt_k = fresh_c_local " k" in
1186+ pr " @;int %s = 0;" cpt_k;
1187+ pr " @;%s = (T_event **)malloc((%s + %s) * (sizeof (T_event *)));"
1188+ events_tmp nb_events_sav nb_add;
1189+ pr " @;@[<v 2>for (%s = 0; %s < %s; %s++) {" cpt_k cpt_k nb_add
1190+ cpt_k;
1191+ pr " @;T_event *%s = (T_event *)malloc(sizeof (T_event));" evt;
1192+ StrMap. iter
1193+ (fun f (ef : Com.event_field ) ->
1194+ if ef.is_var then
1195+ let _, var = StrMap. min_binding p.program_vars in
1196+ pr " @;%s->field_%s_var = %s;" evt f (VID. gen_info_ptr var)
1197+ else (
1198+ pr " @;%s->field_%s_def = 0;" evt f;
1199+ pr " @;%s->field_%s_val = 0.0;" evt f))
1200+ p.program_event_fields;
1201+ pr " @;%s[%s] = %s;" events_tmp cpt_k evt;
1202+ pr " @]@;}" ;
1203+ pr " @]@;@[<v 2>} else {" ;
1204+ pr " @;%s = 0;" nb_add;
1205+ pr " @;%s = (T_event **)malloc(%s * (sizeof (T_event *)));"
1206+ events_tmp nb_events_sav;
1207+ pr " @]@;}" ;
1208+ pr " @;%s = %s;" cpt_i nb_add;
1209+ pr " @]@;}"
1210+ | None ->
1211+ fun () ->
1212+ pr " @;%s = (T_event **)malloc(%s * (sizeof (T_event *)));"
1213+ events_tmp nb_events_sav
1214+ in
1215+ let filter_printer =
1216+ match filter with
1217+ | Some (var , expr ) ->
1218+ need_j := true ;
1219+ fun () ->
1220+ pr " @;@[<v 2>while(%s < %s) {" cpt_j nb_events_sav;
1221+ let ref_def = VID. gen_def None var in
1222+ (* !!! *)
1223+ let ref_val = VID. gen_val None var in
1224+ (* !!! *)
1225+ let cond = fresh_c_local " cond" in
1226+ let cond_def = cond ^ " _def" in
1227+ let cond_val = cond ^ " _val" in
1228+ pr " @;char %s;@;double %s;" cond_def cond_val;
1229+ pr " @;%s = 1;" ref_def;
1230+ pr " @;%s = (double)%s;" ref_val cpt_j;
1231+ generate_expr_with_res_in p dgfip_flags oc cond_def cond_val expr;
1232+ pr " @;@[<v 2>if (%s && %s != 0.0) {" cond_def cond_val;
1233+ pr " @;%s[%s] = irdata->events[%s];" events_tmp cpt_i cpt_j;
1234+ pr " @;%s++;" cpt_i;
1235+ pr " @]@;}" ;
1236+ pr " @;%s++;" cpt_j;
1237+ pr " @]@;}" ;
1238+ pr " @;irdata->events = %s;" events_tmp;
1239+ pr " @;irdata->nb_events = %s;" cpt_i
1240+ | None ->
1241+ fun () ->
1242+ pr " @;@[<v 2>while (%s < %s) {" cpt_i nb_events_sav;
1243+ pr " @;%s[%s] = irdata->events[%s];" events_tmp cpt_i cpt_i;
1244+ pr " @;%s++;" cpt_i;
1245+ pr " @]@;}" ;
1246+ pr " @;irdata->events = %s;" events_tmp;
1247+ pr " @;irdata->nb_events = %s;" cpt_i
1248+ in
1249+ let sort_printer =
1250+ match sort with
1251+ | Some (var0 , var1 , expr ) ->
1252+ fun () ->
1253+ pr " @;/* merge sort */" ;
1254+ pr " @;@[<v 2>{" ;
1255+ pr " @;int aBeg = %s;" nb_add;
1256+ pr " @;int aEnd = irdata->nb_events;" ;
1257+ pr
1258+ " @;\
1259+ T_event **b = (T_event **)malloc(irdata->nb_events * (sizeof \
1260+ (T_event *)));" ;
1261+ pr " @;int width;" ;
1262+ pr " @;int iLeft;" ;
1263+ pr " @;int i;" ;
1264+ pr
1265+ " @;\
1266+ @[<v 2>@[<hov 2>for (width = 1;@ width < aEnd;@ width = 2 * \
1267+ width) {@]" ;
1268+ pr
1269+ " @;\
1270+ @[<v 2>@[<hov 2>for (iLeft = aBeg;@ iLeft < aEnd;@ iLeft = \
1271+ iLeft + 2 * width) {@]" ;
1272+ pr " @;int iRight = iLeft + width;" ;
1273+ pr " @;int iEnd = iLeft + 2 * width;" ;
1274+ pr " @;if (iRight > aEnd) iRight = aEnd;" ;
1275+ pr " @;if (iEnd > aEnd) iEnd = aEnd;" ;
1276+ pr " @;@[<v 2>{" ;
1277+ pr " @;int i = iLeft;" ;
1278+ pr " @;int j = iRight;" ;
1279+ pr " @;int k;" ;
1280+ pr " @;@[<v 2>@[<hov 2>for (k = iLeft;@ k < iEnd;@ k++) {@]" ;
1281+ pr " @;int cpt = 0;" ;
1282+ pr " @;@[<v 2>{" ;
1283+ (* Comparaison *)
1284+ let ref0_def = VID. gen_def None var0 in
1285+ (* !!! *)
1286+ let ref0_val = VID. gen_val None var0 in
1287+ (* !!! *)
1288+ let ref1_def = VID. gen_def None var1 in
1289+ (* !!! *)
1290+ let ref1_val = VID. gen_val None var1 in
1291+ (* !!! *)
1292+ let cmp_def = fresh_c_local " cmp_def" in
1293+ let cmp_val = fresh_c_local " cmp_val" in
1294+ pr " @;char %s;@;double %s;" cmp_def cmp_val;
1295+ pr " @;%s = 1;" ref0_def;
1296+ pr " @;%s = (double)i;" ref0_val;
1297+ pr " @;%s = 1;" ref1_def;
1298+ pr " @;%s = (double)j;" ref1_val;
1299+ generate_expr_with_res_in p dgfip_flags oc cmp_def cmp_val expr;
1300+ pr " @;cpt = %s && %s != 0.0;" cmp_def cmp_val;
1301+ (* ----------- *)
1302+ pr " @]@;}" ;
1303+ pr " @;@[<v 2>if (i < iRight && (j >= iEnd || cpt)) {" ;
1304+ pr " @;b[k] = irdata->events[i];" ;
1305+ pr " @;i = i + 1;" ;
1306+ pr " @]@;@;@[<v 2>} else {" ;
1307+ pr " @;b[k] = irdata->events[j];" ;
1308+ pr " @;j = j + 1;" ;
1309+ pr " @]@;}" ;
1310+ pr " @]@;}" ;
1311+ pr " @]@;}" ;
1312+ pr " @]@;}" ;
1313+ pr " @;@[<v 2>@[<hov 2>for (i = aBeg;@ i < aEnd;@ i++) {@]" ;
1314+ pr " @;irdata->events[i] = b[i];" ;
1315+ pr " @]@;}" ;
1316+ pr " @]@;}" ;
1317+ pr " @;free(b);" ;
1318+ pr " @]@;}"
1319+ | None -> ignore
1320+ in
1321+ let finalize () =
1322+ pr " %a" (generate_stmts dgfip_flags p) stmts;
1323+ pr " @;free(irdata->events);" ;
1324+ pr " @;irdata->events = %s;" events_sav;
1325+ pr " @;irdata->nb_events = %s;" nb_events_sav;
1326+ pr " @]@;}"
1327+ in
1328+ init () ;
1329+ add_printer () ;
1330+ filter_printer () ;
1331+ sort_printer () ;
1332+ finalize ()
13031333 | Restore (al , var_params , evts , evtfs , stmts ) ->
13041334 pr " @;@[<v 2>{" ;
13051335 let rest_name = fresh_c_local " restore" in
0 commit comments