aboutsummaryrefslogtreecommitdiff
path: root/src/boot
diff options
context:
space:
mode:
authorRoy Frostig <[email protected]>2010-07-13 18:11:23 -0700
committerRoy Frostig <[email protected]>2010-07-15 12:30:46 -0700
commitdf75165cf4ed8dc06576f12b5867ac8672cde3c6 (patch)
tree64cb85389960239dd4f6ad6f24afef73480e8d92 /src/boot
parentAdd another null byte preceding commandline args passed to the root task, in ... (diff)
downloadrust-df75165cf4ed8dc06576f12b5867ac8672cde3c6.tar.xz
rust-df75165cf4ed8dc06576f12b5867ac8672cde3c6.zip
Make the x86 backend push an extra word as closure/obj arg when emitting any code that amounts to a glue or native call.
Diffstat (limited to 'src/boot')
-rw-r--r--src/boot/be/abi.ml2
-rw-r--r--src/boot/be/x86.ml6
2 files changed, 5 insertions, 3 deletions
diff --git a/src/boot/be/abi.ml b/src/boot/be/abi.ml
index 18c49460..bd71229d 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 a6f60e7b..811da12a 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. *)