From compcert Require Export Clightdefs.
Local Open Scope logic.
Module DeepEmbeddedSoundness
(Def: CLIGHT_SEPARATION_HOARE_LOGIC_DEF)
(MinimumLogic: MINIMUM_CLIGHT_SEPARATION_HOARE_LOGIC with Module CSHL_Def := Def)
(Sound: SEPARATION_HOARE_LOGIC_SOUNDNESS with Module CSHL_Def := Def)
<: SEPARATION_HOARE_LOGIC_SOUNDNESS.
Module DeepEmbedded := DeepEmbedded (Def) (MinimumLogic).
Module CSHL_Def := DeepEmbedded.DeepEmbeddedDef.
Module CSHL_Defs := DeepEmbedded.DeepEmbeddedDefs.
Arguments CSHL_Def.semax {_} {_} _ _ _ _.
Module Conseq := GenConseq (Def) (MinimumLogic).
Module ExtrFacts := GenExtrFacts (Def) (Conseq) (MinimumLogic).
Module CallF: CLIGHT_SEPARATION_HOARE_LOGIC_CALL_FORWARD with Module CSHL_Def := Def.
Module CSHL_Def := Def.
Definition semax_call_forward := @MinimumLogic.semax_call.
End CallF.
Module CallB := CallF2B (Def) (Conseq) (MinimumLogic) (CallF).
Module SetF: CLIGHT_SEPARATION_HOARE_LOGIC_SET_FORWARD with Module CSHL_Def := Def.
Module CSHL_Def := Def.
Definition semax_set_forward := @MinimumLogic.semax_set_forward.
End SetF.
Module SetB := SetF2B (Def) (Conseq) (MinimumLogic) (SetF).
Module PtrCmpF: CLIGHT_SEPARATION_HOARE_LOGIC_PTR_CMP_FORWARD with Module CSHL_Def := Def.
Module CSHL_Def := Def.
Definition semax_ptr_compare_forward := @MinimumLogic.semax_ptr_compare.
End PtrCmpF.
Module PtrCmpB := PtrCmpF2B (Def) (Conseq) (MinimumLogic) (PtrCmpF).
Module LoadF: CLIGHT_SEPARATION_HOARE_LOGIC_LOAD_FORWARD with Module CSHL_Def := Def.
Module CSHL_Def := Def.
Definition semax_load_forward := @MinimumLogic.semax_load.
End LoadF.
Module LoadB := LoadF2B (Def) (Conseq) (MinimumLogic) (LoadF).
Module CastLoadF: CLIGHT_SEPARATION_HOARE_LOGIC_CAST_LOAD_FORWARD with Module CSHL_Def := Def.
Module CSHL_Def := Def.
Definition semax_cast_load_forward := @MinimumLogic.semax_cast_load.
End CastLoadF.
Module CastLoadB := CastLoadF2B (Def) (Conseq) (MinimumLogic) (CastLoadF).
Module StoreF: CLIGHT_SEPARATION_HOARE_LOGIC_STORE_FORWARD with Module CSHL_Def := Def.
Module CSHL_Def := Def.
Definition semax_store_forward := @MinimumLogic.semax_store.
End StoreF.
Module StoreB := StoreF2B (Def) (Conseq) (MinimumLogic) (StoreF).
Module Extr : CLIGHT_SEPARATION_HOARE_LOGIC_EXTRACTION with Module CSHL_Def := Def := MinimumLogic.
Module Sset := ToSset (Def) (Conseq) (Extr) (SetB) (PtrCmpB) (LoadB) (CastLoadB).

(* Specifications: *)
Theorem semax_sound: forall Espec CS Delta P c Q,
@DeepEmbedded.DeepEmbeddedDef.semax Espec CS Delta P c Q ->
@Def.semax Espec CS Delta P c Q.
Theorem semax_body_sound: forall Vspec Gspec CS f id,
@DeepEmbedded.DeepEmbeddedDefs.semax_body Vspec Gspec CS f id ->
@MinimumLogic.CSHL_Defs.semax_body Vspec Gspec CS f id.
Theorem semax_func_sound: forall Espec Vspec Gspec CS ids fs,
@DeepEmbedded.DeepEmbeddedDef.semax_func Espec Vspec Gspec CS ids fs ->
@Def.semax_func Espec Vspec Gspec CS ids fs.
Theorem semax_prog_sound: forall Espec prog Vspec Gspec f,
@DeepEmbedded.DeepEmbeddedDefs.semax_prog Espec prog Vspec Gspec f ->
@MinimumLogic.CSHL_Defs.semax_prog Espec prog Vspec Gspec f.
Theorem semax_prog_rule :
forall {Espec: OracleKind}{CS: compspecs},
OK_ty = unit ->
forall V G prog m h,
@DeepEmbedded.DeepEmbeddedDefs.semax_prog Espec CS prog V G ->
Genv.init_mem prog = Some m ->
{ b : block & { q : corestate &
(Genv.find_symbol (globalenv prog) (prog_main prog) = Some b) *
(forall jm, m_dry jm = m -> exists jm', semantics.initial_core (juicy_core_sem (cl_core_sem (globalenv prog))) h
jm q jm' (Vptr b Ptrofs.zero) nil) *
forall n,
{ jm |
m_dry jm = m /\ level jm = n /\
(forall z, jsafeN (@OK_spec Espec) (globalenv prog) n z q jm) /\
no_locks (m_phi jm) /\
matchfunspecs (globalenv prog) G (m_phi jm) /\
app_pred (funassert (nofunc_tycontext V G) (empty_environ (globalenv prog))) (m_phi jm)
} } }%type.
Theorem semax_prog_rule' :
forall {Espec: OracleKind}{CS: compspecs},
forall V G prog m h,
@DeepEmbedded.DeepEmbeddedDefs.semax_prog Espec CS prog V G ->
Genv.init_mem prog = Some m ->
{ b : block & { q : corestate &
(Genv.find_symbol (globalenv prog) (prog_main prog) = Some b) *
(forall jm, m_dry jm = m -> exists jm', semantics.initial_core (juicy_core_sem (cl_core_sem (globalenv prog))) h
jm q jm' (Vptr b Ptrofs.zero) nil) *
forall n z,
{ jm |
m_dry jm = m /\ level jm = n /\
nth_error (ghost_of (m_phi jm)) 0 = Some (Some (ext_ghost z, NoneP)) /\
jsafeN (@OK_spec Espec) (globalenv prog) n z q jm /\
no_locks (m_phi jm) /\
matchfunspecs (globalenv prog) G (m_phi jm) /\
app_pred (funassert (nofunc_tycontext V G) (empty_environ (globalenv prog))) (m_phi jm)
} } }%type.