(** Construction 4: restore the stack after a public call *)

(* Specifications: *)
Theorem return_from_public_call:
forall (caller callee: block_classification) bound sp ge e ae v m rm,
bc_below caller bound ->
callee sp = BCother ->
caller sp = BCstack ->
(forall b, Plt b bound -> b <> sp -> caller b = callee b) ->
genv_match caller ge ->
ematch caller e ae ->
Ple bound (Mem.nextblock m) ->
vmatch callee v Vtop ->
romatch callee m rm ->
mmatch callee m mtop ->
genv_match callee ge ->
bc_nostack callee ->
exists bc,
vmatch bc v Vtop
/\ ematch bc e ae
/\ romatch bc m rm
/\ mmatch bc m mafter_public_call
/\ genv_match bc ge
/\ bc sp = BCstack
/\ (forall b, Plt b sp -> bc b = caller b).