From df75165cf4ed8dc06576f12b5867ac8672cde3c6 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Tue, 13 Jul 2010 18:11:23 -0700 Subject: [PATCH] Make the x86 backend push an extra word as closure/obj arg when emitting any code that amounts to a glue or native call. --- src/boot/be/abi.ml | 2 +- src/boot/be/x86.ml | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/boot/be/abi.ml b/src/boot/be/abi.ml index 18c49460576..bd71229d22d 100644 --- a/src/boot/be/abi.ml +++ b/src/boot/be/abi.ml @@ -79,7 +79,7 @@ let iterator_args_elt_outer_frame_ptr = 1;; let indirect_args_elt_closure = 0;; (* dst, taskptr, closure-ptr, ty_params, src, src2=target_task *) -let worst_case_glue_call_args = 5;; +let worst_case_glue_call_args = 6;; type abi = { diff --git a/src/boot/be/x86.ml b/src/boot/be/x86.ml index a6f60e7b304..811da12a3c7 100644 --- a/src/boot/be/x86.ml +++ b/src/boot/be/x86.ml @@ -536,11 +536,12 @@ let frame_base_sz = Int64.mul (Int64.of_int frame_base_words) word_sz;; let frame_info_words = 2 (* crate ptr, crate-rel frame info disp *) ;; let frame_info_sz = Int64.mul (Int64.of_int frame_info_words) word_sz;; -let implicit_arg_words = 2 (* task ptr,out ptr *);; -let implicit_args_sz = Int64.mul (Int64.of_int implicit_arg_words) word_sz;; +let implicit_arg_words = 3 (* task ptr, out ptr, closure ptr *);; +let implicit_args_sz = Int64.mul (Int64.of_int implicit_arg_words) word_sz;; let out_ptr = wordptr_n (Il.Hreg ebp) (frame_base_words);; let task_ptr = wordptr_n (Il.Hreg ebp) (frame_base_words+1);; +let closure_ptr = wordptr_n (Il.Hreg ebp) (frame_base_words+2);; let ty_param_n i = wordptr_n (Il.Hreg ebp) (frame_base_words + implicit_arg_words + i);; @@ -855,6 +856,7 @@ let sweep_gc_chain (c (ecx_n Abi.tydesc_field_first_param)); push (ro eax); (* Push typarams ptr. *) + push (immi 0L); (* Push null closure-ptr *) push (c task_ptr); (* Push task ptr. *) push (immi 0L); (* Push null outptr. *)