Fixpoint load_store_init_data (m: mem) (b: block) (p: Z) (il: list init_data) {struct il} : Prop :=
match il with
| nil => True
| Init_int8 n :: il' =>
Mem.load Mint8unsigned m b p = Some(Vint(Int.zero_ext 8 n))
/\ load_store_init_data m b (p + 1) il'
| Init_int16 n :: il' =>
Mem.load Mint16unsigned m b p = Some(Vint(Int.zero_ext 16 n))
/\ load_store_init_data m b (p + 2) il'
| Init_int32 n :: il' =>
Mem.load Mint32 m b p = Some(Vint n)
/\ load_store_init_data m b (p + 4) il'
| Init_int64 n :: il' =>
Mem.load Mint64 m b p = Some(Vlong n)
/\ load_store_init_data m b (p + 8) il'
| Init_float32 n :: il' =>
Mem.load Mfloat32 m b p = Some(Vsingle n)
/\ load_store_init_data m b (p + 4) il'
| Init_float64 n :: il' =>
Mem.load Mfloat64 m b p = Some(Vfloat n)
/\ load_store_init_data m b (p + 8) il'
| Init_addrof symb ofs :: il' =>
(exists b', find_symbol ge symb = Some b' /\ Mem.load Mptr m b p = Some(Vptr b' ofs))
/\ load_store_init_data m b (p + size_chunk Mptr) il'
| Init_space n :: il' =>
read_as_zero m b p n
/\ load_store_init_data m b (p + Z.max n 0) il'
end.

Lemma store_init_data_list_charact:
forall b il m p m',
store_init_data_list m b p il = Some m' ->
read_as_zero m b p (init_data_list_size il) ->
load_store_init_data m' b p il.