Fixpoint id2pred_star   {cs: compspecs}
(Delta: tycontext) (gz: globals) (sh: share) (v: val) (dl: list init_data) : environ->mpred :=
match dl with
| d::dl' => `(init_data2pred' Delta gz d sh v)
* id2pred_star Delta gz sh (offset_val (init_data_size d) v) dl'
| nil => emp
end.
Arguments id2pred_star cs Delta gz sh v dl rho  / .

(* Specifications: *)
Lemma init_data_size_pos : forall a, init_data_size a >= 0.
Lemma init_data_list_size_pos : forall a, init_data_list_size a >= 0.
Definition globvar_all_aligned {cs: compspecs} gv : bool :=
forallb (fun a =>andb
(init_data_size a mod hardware_alignof ha_env_cs (gvar_info gv) =? 0)
(init_data_size a mod alignof (gvar_info gv) =? 0))
(gvar_init gv).
Lemma unpack_globvar_star  {cs: compspecs}:
forall Delta gz i gv,
(var_types Delta) ! i = None ->
(glob_types Delta) ! i = Some (gvar_info gv) ->
(complete_legal_cosu_type (gvar_info gv) && is_aligned cenv_cs ha_env_cs la_env_cs (gvar_info gv) 0)% bool = true ->
gvar_volatile gv = false ->
(globvar_all_aligned gv = true) ->
init_data_list_size (gvar_init gv) <= sizeof (gvar_info gv) <= Ptrofs.max_unsigned ->
local (`and (tc_environ Delta) (fun rho =>gz = globals_of_env rho)) && globvar2pred gz (i, gv) |--
id2pred_star Delta gz (readonly2share (gvar_readonly gv)) (gz i) (gvar_init gv).