(** ** Construction 1: allocating the stack frame at function entry *)

Ltac splitall := repeat (match goal with |- _ /\ _ => split end).

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