aboutsummaryrefslogtreecommitdiffstats
path: root/backend/Machabstr.v
diff options
context:
space:
mode:
authorxleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2006-10-22 16:54:24 +0000
committerxleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2006-10-22 16:54:24 +0000
commit210352d90e5972aabfb253f7c8a38349f53917b3 (patch)
tree93ccbf36e6840118abe84ee940252a7a1fbc7720 /backend/Machabstr.v
parentee41c6eae5af0703605780e0b3d8f5c3937f3276 (diff)
downloadcompcert-210352d90e5972aabfb253f7c8a38349f53917b3.tar.gz
compcert-210352d90e5972aabfb253f7c8a38349f53917b3.zip
Lever la restriction sur les fonctions externes, restriction qui exigeait que tous les arguments resident en registres
git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@125 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'backend/Machabstr.v')
-rw-r--r--backend/Machabstr.v24
1 files changed, 22 insertions, 2 deletions
diff --git a/backend/Machabstr.v b/backend/Machabstr.v
index 33ed93ca..d83ffa51 100644
--- a/backend/Machabstr.v
+++ b/backend/Machabstr.v
@@ -88,6 +88,26 @@ Inductive set_slot: frame -> typ -> Z -> val -> frame -> Prop :=
Definition init_frame (f: function) :=
empty_block (- f.(fn_framesize)) 0.
+(** Extract the values of the arguments of an external call. *)
+
+Inductive extcall_arg: regset -> frame -> loc -> val -> Prop :=
+ | extcall_arg_reg: forall rs fr r,
+ extcall_arg rs fr (R r) (rs r)
+ | extcall_arg_stack: forall rs fr ofs ty v,
+ get_slot fr ty (Int.signed (Int.repr (4 * ofs))) v ->
+ extcall_arg rs fr (S (Outgoing ofs ty)) v.
+
+Inductive extcall_args: regset -> frame -> list loc -> list val -> Prop :=
+ | extcall_args_nil: forall rs fr,
+ extcall_args rs fr nil nil
+ | extcall_args_cons: forall rs fr l1 ll v1 vl,
+ extcall_arg rs fr l1 v1 -> extcall_args rs fr ll vl ->
+ extcall_args rs fr (l1 :: ll) (v1 :: vl).
+
+Definition extcall_arguments
+ (rs: regset) (fr: frame) (sg: signature) (args: list val) : Prop :=
+ extcall_args rs fr (Conventions.loc_arguments sg) args.
+
Section RELSEM.
Variable ge: genv.
@@ -223,7 +243,7 @@ with exec_function:
| exec_funct_external:
forall ef parent args res rs1 rs2 m t,
event_match ef args t res ->
- args = rs1##(Conventions.loc_external_arguments ef.(ef_sig)) ->
+ extcall_arguments rs1 parent ef.(ef_sig) args ->
rs2 = (rs1#(Conventions.loc_result ef.(ef_sig)) <- res) ->
exec_function (External ef) parent rs1 m t rs2 m.
@@ -367,7 +387,7 @@ Lemma exec_mutual_induction:
(res : val) (rs1 : mreg -> val) (rs2 : RegEq.t -> val) (m : mem)
(t0 : trace),
event_match ef args t0 res ->
- args = rs1 ## (Conventions.loc_external_arguments (ef_sig ef)) ->
+ extcall_arguments rs1 parent ef.(ef_sig) args ->
rs2 = rs1 # (Conventions.loc_result (ef_sig ef)) <- res ->
P2 (External ef) parent rs1 m t0 rs2 m) ->
(forall (f16 : function) (v : val) (f17 : frame) (c : code)