(** ** Location of function parameters *)
(** A function finds the values of its parameter in the same locations where its caller stored them, except that the stack-allocated arguments, viewed as [Outgoing] slots by the caller, are accessed via [Incoming] slots (at the same offsets and types) in the callee. *)
Definition parameter_of_argument (l: loc) : loc :=
match l with
| S Outgoing n ty => S Incoming n ty
| _ => l
end.
Definition loc_parameters (s: signature) : list (rpair loc) :=
List.map (map_rpair parameter_of_argument) (loc_arguments s).

(* Specifications: *)
Lemma incoming_slot_in_parameters:
forall ofs ty sg,
In (S Incoming ofs ty) (regs_of_rpairs (loc_parameters sg)) ->
In (S Outgoing ofs ty) (regs_of_rpairs (loc_arguments sg)).