Section INIT.
Variable bc: block_classification.
Hypothesis GMATCH: genv_match bc ge.
Definition initial_mem_match (bc: block_classification) (m: mem) (g: genv) :=
forall id b v,
Genv.find_symbol g id = Some b -> Genv.find_var_info g b = Some v ->
v.(gvar_volatile) = false -> v.(gvar_readonly) = true ->
bmatch bc m b (store_init_data_list (ablock_init Pbot) 0 v.(gvar_init)).
Definition romem_consistent (defmap: PTree.t (globdef fundef unit)) (rm: romem) :=
forall id ab,
rm!id = Some ab ->
exists v,
defmap!id = Some (Gvar v)
/\ v.(gvar_readonly) = true
/\ v.(gvar_volatile) = false
/\ definitive_initializer v.(gvar_init) = true
/\ ab = store_init_data_list (ablock_init Pbot) 0 v.(gvar_init).
End INIT.

Theorem initial_mem_matches:
forall m,
Genv.init_mem prog = Some m ->
exists bc,
genv_match bc ge
/\ bc_below bc (Mem.nextblock m)
/\ bc_nostack bc
/\ (forall cunit, linkorder cunit prog -> romatch bc m (romem_for cunit))
/\ (forall b, Mem.valid_block m b -> bc b <> BCinvalid).