(** Construction 5: restore the stack after a private call *)

(* Specifications: *)
Theorem return_from_private_call:
forall (caller callee: block_classification) bound sp ge e ae v m rm am,
bc_below caller bound ->
callee sp = BCinvalid ->
caller sp = BCstack ->
(forall b, Plt b bound -> b <> sp -> caller b = callee b) ->
genv_match caller ge ->
ematch caller e ae ->
bmatch caller m sp am.(am_stack) ->
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 (Ifptr Nonstack)
/\ ematch bc e ae
/\ romatch bc m rm
/\ mmatch bc m (mafter_private_call am)
/\ genv_match bc ge
/\ bc sp = BCstack
/\ (forall b, Plt b sp -> bc b = caller b).