Inductive match_stacks (j: meminj):
list stackframe -> list stackframe -> block -> block -> Prop :=
| match_stacks_nil: forall bound tbound,
meminj_preserves_globals j ->
Ple (Genv.genv_next ge) bound -> Ple (Genv.genv_next tge) tbound ->
match_stacks j nil nil bound tbound
| match_stacks_cons: forall res f sp pc rs s tsp trs ts bound tbound
(STACKS: match_stacks j s ts sp tsp)
(KEPT: forall id, ref_function f id -> kept id)
(SPINJ: j sp = Some(tsp, 0))
(REGINJ: regset_inject j rs trs)
(BELOW: Plt sp bound)
(TBELOW: Plt tsp tbound),
match_stacks j (Stackframe res f (Vptr sp Ptrofs.zero) pc rs :: s)
(Stackframe res f (Vptr tsp Ptrofs.zero) pc trs :: ts)
bound tbound.

(* Specifications: *)
Lemma match_stacks_preserves_globals:
forall j s ts bound tbound,
match_stacks j s ts bound tbound ->
meminj_preserves_globals j.
Lemma match_stacks_incr:
forall j j', inject_incr j j' ->
forall s ts bound tbound, match_stacks j s ts bound tbound ->
(forall b1 b2 delta,
j b1 = None -> j' b1 = Some(b2, delta) -> Ple bound b1 /\ Ple tbound b2) ->
match_stacks j' s ts bound tbound.
Lemma match_stacks_bound:
forall j s ts bound tbound bound' tbound',
match_stacks j s ts bound tbound ->
Ple bound bound' -> Ple tbound tbound' ->
match_stacks j s ts bound' tbound'.