diff options
-rw-r--r-- | asmcomp/i386/emit_nt.mlp | 12 | ||||
-rw-r--r-- | asmrun/i386nt.asm | 4 |
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 (?) |