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 *)
(** Construction 5: restore the stack after a private call *)

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