aboutsummaryrefslogtreecommitdiffstats
path: root/driver/Interp.ml
diff options
context:
space:
mode:
authorBernhard Schommer <bernhardschommer@gmail.com>2016-08-17 08:35:21 +0200
committerBernhard Schommer <bernhardschommer@gmail.com>2016-08-17 08:35:21 +0200
commitb08fd2ea809b87af8551ff6bc50e544209798d24 (patch)
tree284f2b93e8b7c62ef95e8b48ec387e0cfa8397d7 /driver/Interp.ml
parent6c70ceb179798478f29efda5358c4660c38b7392 (diff)
downloadcompcert-kvx-b08fd2ea809b87af8551ff6bc50e544209798d24.tar.gz
compcert-kvx-b08fd2ea809b87af8551ff6bc50e544209798d24.zip
Fixed issue with emulation of printf
The emulated printf in the interpreter did always return 0 instead of the numbers of bytes printed. Bug 19564
Diffstat (limited to 'driver/Interp.ml')
-rw-r--r--driver/Interp.ml6
1 files changed, 4 insertions, 2 deletions
diff --git a/driver/Interp.ml b/driver/Interp.ml
index 5c2158ae..f42bed32 100644
--- a/driver/Interp.ml
+++ b/driver/Interp.ml
@@ -387,10 +387,12 @@ let do_external_function id sg ge w args m =
match camlstring_of_coqstring id, args with
| "printf", Vptr(b, ofs) :: args' ->
extract_string m b ofs >>= fun fmt ->
- print_string (do_printf m fmt args');
+ let fmt' = do_printf m fmt args' in
+ let len = coqint_of_camlint (Int32.of_int (String.length fmt')) in
+ print_string fmt';
flush stdout;
convert_external_args ge args sg.sig_args >>= fun eargs ->
- Some(((w, [Event_syscall(id, eargs, EVint Int.zero)]), Vint Int.zero), m)
+ Some(((w, [Event_syscall(id, eargs, EVint len)]), Vint len), m)
| _ ->
None