End FSExtension.
Section FSExtension_Compilable.
Variables
(Z S T fS vS fT vT: Type)
(init_world: Z)
(csemS: CoopCoreSem (Genv.t fS vS) S)
(csemT: CoopCoreSem (Genv.t fT vT) T)
(geS: Genv.t fS vS)
(geT: Genv.t fT vT)
(entry_points: list (val*val*signature))
(core_data: Type)
(core_ord: core_data -> core_data -> Prop)
(MATCH: core_data -> meminj -> S -> mem -> T -> mem -> Prop).
Definition FS_S := FS_extension csemS init_world.
Definition FS_T := FS_extension csemT init_world.
Variable coreSim:
Forward_simulation_inject csemS csemT geS geT entry_points
core_data MATCH core_ord.
Variable genvs_eq: genvs_domain_eq geS geT.
(*ASSUMPTIONS*)
Variable csemS_det:
forall (ge : Genv.t fS vS) (c : S) (m : mem) (c' : S)
(m' : mem) (c'' : S) (m'' : mem),
corestep csemS ge c m c' m' ->
corestep csemS ge c m c'' m'' -> c' = c'' /\ m' = m''.
Variable csemT_det:
forall (ge : Genv.t fT vT) (c : T) (m : mem) (c' : T)
(m' : mem) (c'' : T) (m'' : mem),
corestep csemT ge c m c' m' ->
corestep csemT ge c m c'' m'' -> c' = c'' /\ m' = m''.
Variable match_state_runnable:
forall (cd : core_data) (j : meminj) (c1 : S) (m1 : mem)
(c2 : T) (m2 : mem),
MATCH cd j c1 m1 c2 m2 ->
linking.runnable csemS c1 = linking.runnable csemT c2.
Variable match_state_meminj:
forall (cd : core_data) (j : meminj) (c1 : S) (m1 : mem)
(c2 : T) (m2 : mem), MATCH cd j c1 m1 c2 m2 -> Mem.inject j m1 m2.
Variable match_preserves_globs:
forall (cd : core_data) (j : meminj) (c1 : S) (m1 : mem)
(c2 : T) (m2 : mem),
MATCH cd j c1 m1 c2 m2 -> meminj_preserves_globals geS j.
Variable at_extern_valid:
forall c1 m1 c2 m2 cd j ef sig args,
MATCH cd j c1 m1 c2 m2 ->
at_external csemS c1 = Some (ef, sig, args) ->
forall v, In v args -> mem_lemmas.val_valid v m1.

(* Specifications: *)
Lemma FS_extension_compilable:
@CompilableExtension.Sig _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
(FSCoopSem csemS init_world)
(FSCoopSem csemT init_world)
csemS csemT
geS geT FS_S FS_T entry_points core_data MATCH core_ord.