Hint Extern 2 (isptr (force_val (sem_add_ptr_int _ _ _ _))) =>
apply isptr_force_sem_add_ptr_int; auto with prove_it_now.
(* Done in this tail-recursive style so that "hnf" fully reduces it *)
Fixpoint mk_varspecs' (dl: list (ident * globdef Clight.fundef type)) (el: list (ident * type)) :
list (ident * type) :=
match dl with
| (i,Gvar v)::dl' => mk_varspecs' dl' ((i, gvar_info v) :: el)
| (i, _) :: dl' => mk_varspecs' dl' el
| nil => rev_append el nil
end.
Ltac unfold_varspecs al :=
match al with
| context [gvar_info ?v] =>
let b := eval lazy beta zeta iota delta [gvar_info v] in al
in unfold_varspecs b
| _ => exact al
end.
Ltac mk_varspecs prog :=
let a := constr:(prog)
in let a := eval unfold prog in a
in match a with Clightdefs.mkprogram _ ?d _ _ _ =>
let e := constr:(mk_varspecs' d nil)
in let e := eval hnf in e
in unfold_varspecs e
end.
Hint Resolve field_address_isptr : norm.

Lemma field_address_eq_offset':
forall {cs: compspecs} t path v ofs,
field_compatible t path v ->
ofs = nested_field_offset t path ->
field_address t path v = offset_val ofs v.