(* 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.

(* Specifications: *)
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.