End EXTERNAL_ARGUMENTS.
(** Preservation of the arguments to a builtin. *)
Section BUILTIN_ARGUMENTS.
Variable f: Linear.function.
Let b := function_bounds f.
Let fe := make_env b.
Variable tf: Mach.function.
Hypothesis TRANSF_F: transf_function f = OK tf.
Variable j: meminj.
Variables m m': mem.
Variables ls ls0: locset.
Variable rs: regset.
Variables sp sp': block.
Variables parent retaddr: val.
Hypothesis INJ: j sp = Some(sp', fe.(fe_stack_data)).
Hypothesis AGR: agree_regs j ls rs.
Hypothesis SEP: m' |= frame_contents f j sp' ls ls0 parent retaddr ** minjection j m ** globalenv_inject ge j.

(* Specifications: *)
Lemma transl_builtin_arg_correct:
forall a v,
eval_builtin_arg ge ls (Vptr sp Ptrofs.zero) m a v ->
(forall l, In l (params_of_builtin_arg a) -> loc_valid f l = true) ->
(forall sl ofs ty, In (S sl ofs ty) (params_of_builtin_arg a) -> slot_within_bounds b sl ofs ty) ->
exists v',
eval_builtin_arg ge rs (Vptr sp' Ptrofs.zero) m' (transl_builtin_arg fe a) v'
/\ Val.inject j v v'.
Lemma transl_builtin_args_correct:
forall al vl,
eval_builtin_args ge ls (Vptr sp Ptrofs.zero) m al vl ->
(forall l, In l (params_of_builtin_args al) -> loc_valid f l = true) ->
(forall sl ofs ty, In (S sl ofs ty) (params_of_builtin_args al) -> slot_within_bounds b sl ofs ty) ->
exists vl',
eval_builtin_args ge rs (Vptr sp' Ptrofs.zero) m' (List.map (transl_builtin_arg fe) al) vl'
/\ Val.inject_list j vl vl'.