Section NOSTACK.
Variable bc: block_classification.
Hypothesis NOSTACK: bc_nostack bc.
End NOSTACK.
(** ** Construction 1: allocating the stack frame at function entry *)
Ltac splitall := repeat (match goal with |- _ /\ _ => split end).
(** Construction 2: turn the stack into an "other" block, at public calls or function returns *)
(** Construction 3: turn the stack into an invalid block, at private calls *)
(** Construction 4: restore the stack after a public call *)

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).