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

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

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