summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--asmcomp/i386/emit_nt.mlp12
-rw-r--r--asmrun/i386nt.asm4
2 files changed, 13 insertions, 3 deletions
diff --git a/asmcomp/i386/emit_nt.mlp b/asmcomp/i386/emit_nt.mlp
index c9636d6bb..51fa843a3 100644
--- a/asmcomp/i386/emit_nt.mlp
+++ b/asmcomp/i386/emit_nt.mlp
@@ -39,13 +39,16 @@ let frame_size () = (* includes return address *)
let slot_offset loc cl =
match loc with
- Incoming n -> frame_size() + n
+ Incoming n ->
+ assert (n >= 0);
+ frame_size() + n
| Local n ->
if cl = 0
then !stack_offset + n * 4
else !stack_offset + num_stack_slots.(0) * 4 + n * 8
- | Outgoing n -> n
-
+ | Outgoing n ->
+ assert (n >= 0);
+ n
(* Record symbols used and defined - at the end generate extern for those
used but not defined *)
@@ -75,6 +78,8 @@ let emit_align n = ` ALIGN {emit_int n}\n`
let emit_reg = function
{ loc = Reg r } ->
emit_string (register_name r)
+ | { loc = Stack(Incoming n | Outgoing n) } when n < 0 ->
+ `{emit_symbol "caml_extra_params"} + {emit_int (n + 64)}`
| { loc = Stack s; typ = Float } as r ->
let ofs = slot_offset s (register_class r) in
`REAL8 PTR {emit_int ofs}[esp]`
@@ -823,6 +828,7 @@ let begin_assembly() =
` EXTERN _caml_young_ptr: DWORD\n`;
` EXTERN _caml_young_limit: DWORD\n`;
` EXTERN _caml_exception_pointer: DWORD\n`;
+ ` EXTERN _caml_extra_params: DWORD\n`;
` EXTERN _caml_call_gc: PROC\n`;
` EXTERN _caml_c_call: PROC\n`;
` EXTERN _caml_allocN: PROC\n`;
diff --git a/asmrun/i386nt.asm b/asmrun/i386nt.asm
index 583feb741..0aee5f3b2 100644
--- a/asmrun/i386nt.asm
+++ b/asmrun/i386nt.asm
@@ -275,3 +275,7 @@ _caml_system__frametable LABEL DWORD
WORD 0 ; no roots here
END
+
+ PUBLIC _caml_extra_params
+_caml_extra_params LABEL DWORD
+ BYTE 64 DUP (?)