From 7ef9e82f51de73e89759910fd1b45ce5ccc363b3 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Sun, 25 Jul 2010 21:27:28 -0700 Subject: [PATCH] Don't write to NULL after calling C natives returning void. --- src/boot/be/abi.ml | 2 +- src/boot/be/x86.ml | 9 ++++++--- src/boot/me/trans.ml | 8 ++++++-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/boot/be/abi.ml b/src/boot/be/abi.ml index 8084c7cfc05..975ff0324ba 100644 --- a/src/boot/be/abi.ml +++ b/src/boot/be/abi.ml @@ -149,7 +149,7 @@ type abi = -> unit); abi_emit_native_call_in_thunk: (Il.emitter - -> Il.cell (* ret *) + -> Il.cell option (* ret *) -> Common.nabi -> Il.operand (* callee *) -> Il.operand array (* args *) diff --git a/src/boot/be/x86.ml b/src/boot/be/x86.ml index d5541eb1f82..0d0206d7fc4 100644 --- a/src/boot/be/x86.ml +++ b/src/boot/be/x86.ml @@ -700,7 +700,7 @@ let emit_native_void_call let emit_native_call_in_thunk (e:Il.emitter) - (ret:Il.cell) + (ret:Il.cell option) (nabi:nabi) (fn:Il.operand) (args:Il.operand array) @@ -734,9 +734,12 @@ let emit_native_call_in_thunk end; match ret with - Il.Reg (r, _) -> mov (word_at r) (ro eax) - | _ -> mov (rc edx) (c ret); + Some (Il.Reg (r, _)) -> + mov (word_at r) (ro eax) + | Some ret -> + mov (rc edx) (c ret); mov (word_at (h edx)) (ro eax) + | _ -> () ;; diff --git a/src/boot/me/trans.ml b/src/boot/me/trans.ml index 069fdb59f53..832ccd1f90e 100644 --- a/src/boot/me/trans.ml +++ b/src/boot/me/trans.ml @@ -4998,8 +4998,12 @@ let trans_visitor libstr; symstr |]; - abi.Abi.abi_emit_native_call_in_thunk (emitter()) - out nabi (Il.Cell f) args; + abi.Abi.abi_emit_native_call_in_thunk + (emitter()) + (if pointee_type out = Il.NilTy then None else Some out) + nabi + (Il.Cell f) + args; end | _ -> bug ()