End EVENTVAL_INV.
(** Compatibility with memory injections *)
Section EVENTVAL_INJECT.
Variable f: block -> option (block * Z).
Variable ge1 ge2: Senv.t.
Definition symbols_inject : Prop :=
(forall id, Senv.public_symbol ge2 id = Senv.public_symbol ge1 id)
/\ (forall id b1 b2 delta,
f b1 = Some(b2, delta) -> Senv.find_symbol ge1 id = Some b1 ->
delta = 0 /\ Senv.find_symbol ge2 id = Some b2)
/\ (forall id b1,
Senv.public_symbol ge1 id = true -> Senv.find_symbol ge1 id = Some b1 ->
exists b2, f b1 = Some(b2, 0) /\ Senv.find_symbol ge2 id = Some b2)
/\ (forall b1 b2 delta,
f b1 = Some(b2, delta) ->
Senv.block_is_volatile ge2 b2 = Senv.block_is_volatile ge1 b1).
Hypothesis symb_inj: symbols_inject.

Lemma eventval_match_inject:
forall ev ty v1 v2,
eventval_match ge1 ev ty v1 -> Val.inject f v1 v2 -> eventval_match ge2 ev ty v2.