Library compcert.backend.Conventions
Function calling conventions and other conventions regarding the use of
machine registers and stack slots.
The processor-dependent and EABI-dependent definitions are in
arch/abi/Conventions1.v. This file adds various processor-independent
definitions and lemmas.
Lemma loc_arguments_acceptable_2:
∀ s l,
In l (regs_of_rpairs (loc_arguments s)) → loc_argument_acceptable l.
Proof.
intros until l. generalize (loc_arguments_acceptable s). generalize (loc_arguments s).
induction l0 as [ | p pl]; simpl; intros.
- contradiction.
- rewrite in_app_iff in H0. destruct H0.
exploit H; eauto. destruct p; simpl in *; intuition congruence.
apply IHpl; auto.
Qed.
Location of function parameters
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).
Lemma incoming_slot_in_parameters:
∀ 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)).
Proof.
intros.
replace (regs_of_rpairs (loc_parameters sg)) with (List.map parameter_of_argument (regs_of_rpairs (loc_arguments sg))) in H.
change (S Incoming ofs ty) with (parameter_of_argument (S Outgoing ofs ty)) in H.
exploit list_in_map_inv. eexact H. intros [x [A B]]. simpl in A.
exploit loc_arguments_acceptable_2; eauto. unfold loc_argument_acceptable; intros.
destruct x; simpl in A; try discriminate.
destruct sl; try contradiction.
inv A. auto.
unfold loc_parameters. generalize (loc_arguments sg). induction l as [ | p l]; simpl; intros.
auto.
rewrite map_app. f_equal; auto. destruct p; auto.
Qed.
Tail calls
Definition tailcall_possible (s: signature) : Prop :=
∀ l, In l (regs_of_rpairs (loc_arguments s)) →
match l with R _ ⇒ True | S _ _ _ ⇒ False end.
Decide whether a tailcall is possible.
Definition tailcall_is_possible (sg: signature) : bool :=
List.forallb
(fun l ⇒ match l with R _ ⇒ true | S _ _ _ ⇒ false end)
(regs_of_rpairs (loc_arguments sg)).
Lemma tailcall_is_possible_correct:
∀ s, tailcall_is_possible s = true → tailcall_possible s.
Proof.
unfold tailcall_is_possible; intros. rewrite forallb_forall in H.
red; intros. apply H in H0. destruct l; [auto|discriminate].
Qed.
Lemma zero_size_arguments_tailcall_possible:
∀ sg, size_arguments sg = 0 → tailcall_possible sg.
Proof.
intros; red; intros. exploit loc_arguments_acceptable_2; eauto.
unfold loc_argument_acceptable.
destruct l; intros. auto. destruct sl; try contradiction. destruct H1.
generalize (loc_arguments_bounded _ _ _ H0).
generalize (typesize_pos ty). omega.
Qed.