(***** All the additional conditions in the above auxiliary lemmas were needed for proving the condition Events.inject_separated j j' m tm in his lemma; otherwise, the claim is as before, just updated by replacing star step by corestep_star, as ususal*)

(*NEW:*) (PG: meminj_preserves_globals ge j), exists c2' : CMin_core, exists m2' : mem, corestep_plus CMin_core_sem tge (CMin_Returnstate tv tk) tm c2' m2'  /\ match_cores  (CSharpMin_State f Csharpminor.Sskip k e (set_optvar optid v lenv)) j (CSharpMin_State f Csharpminor.Sskip k e (set_optvar optid v lenv)) m c2' m2' .  Lemma MS_step: forall (c1 : core_data) (m1 : mem) (c1' : core_data) (m1' : mem), corestep CSharpMin_core_sem ge c1 m1 c1' m1' -> forall (c2 : CMin_core) (m2 : mem) (j : meminj), match_cores c1 j c1 m1 c2 m2 -> (exists c2' : CMin_core, exists m2' : mem, exists j' : meminj, inject_incr j j' /\ Events.inject_separated j j' m1 m2 /\ corestep_plus CMin_core_sem tge c2 m2 c2' m2' /\ match_cores c1' j' c1' m1' c2' m2') \/ (MC_measure c1' < MC_measure c1)%nat /\ match_cores c1' j c1' m1' c2 m2.  Require Import sepcomp.forward_simulations.  Require Import sepcomp.forward_simulations_lemmas.  (*program structure not yet updated to module*)
Theorem transl_program_correct:
forall (R: list_norepet (map fst (prog_defs prog)))
entrypoints
(entry_points_ok :
forall v1 v2 sig,
In (v1, v2, sig) entrypoints ->
exists b f1 f2,
v1 = Vptr b Int.zero
/\ v2 = Vptr b Int.zero
/\ Genv.find_funct_ptr ge b = Some f1
/\ Genv.find_funct_ptr tge b = Some f2)
(init_mem: exists m0, Genv.init_mem prog = Some m0),
Forward_simulation_inj.Forward_simulation_inject
CSharpMin_core_sem
CMin_core_sem ge tge entrypoints.