(** ** Sufficient and necessary conditions for the initial memory to exist. *)

(** Alignment properties *)

Definition init_data_alignment (i: init_data) : Z :=
  match i with
  | Init_int8 n => 1
  | Init_int16 n => 2
  | Init_int32 n => 4
  | Init_int64 n => 8
  | Init_float32 n => 4
  | Init_float64 n => 4
  | Init_addrof symb ofs => if Archi.ptr64 then 8 else 4
  | Init_space n => 1
  end.

Lemma store_init_data_list_exists: forall b il m p, Mem.range_perm m b p (p + init_data_list_size il) Cur Writable -> init_data_list_aligned p il -> (forall id ofs, In (Init_addrof id ofs) il -> exists b, find_symbol ge id = Some b) -> exists m', store_init_data_list ge m b p il = Some m'.