Ltac prove_semax_prog_old :=
split3; [ | | split3; [ | | split]];
[ reflexivity || fail "duplicate identifier in prog_defs"
| reflexivity || fail "unaligned initializer"
| solve [compute; repeat f_equal; apply proof_irr] || fail "comp_specs not equal"
|
| reflexivity || fail "match_globvars failed"
| match goal with |- match ?A with _ => _ end =>
let fs := fresh "fs" in set (fs := A); hnf in fs; subst fs; cbv iota beta;
lazymatch goal with
| |- False => fail "Can't find _main in Gprog"
| |- _ =>  idtac
end;
(eexists; reflexivity) ||
fail "Funspec of _main is not in the proper form"
end
];
repeat (apply semax_func_cons_ext_vacuous; [reflexivity | reflexivity | ]).
(**************MATERIAL FOR NEW TACTIC prove_semax_prog STARTS HERE ***************)

Lemma extract_prog_main t d p m w:
prog_main (Clightdefs.mkprogram t d p m w) = m.