diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 2015-01-27 16:57:20 +0100 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 2015-01-27 16:57:20 +0100 |
commit | e096fa7aa6161e1f5a74001185eb3873a684c48d (patch) | |
tree | ca928bcb3f7b6b2237a626fbb1dbc1ce62b2e5d1 /driver/Interp.ml | |
parent | f00b70b6a17fdfb4e8606df891f6becc8102ef12 (diff) | |
download | compcert-e096fa7aa6161e1f5a74001185eb3873a684c48d.tar.gz compcert-e096fa7aa6161e1f5a74001185eb3873a684c48d.zip |
ABI compatibility for struct/union function arguments passed by value.
The passing of struct/union arguments by value implemented in the verified
part of CompCert is not compatible with the ARM, PowerPC and x86 ABI.
Here we enrich the StructReturn source-to-source emulation pass
so that it implements the calling conventions defined in these ABIs.
Plus: for x86, implement the returning of struct/union results by value
in a way compatible with the ABI.
Diffstat (limited to 'driver/Interp.ml')
-rw-r--r-- | driver/Interp.ml | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/driver/Interp.ml b/driver/Interp.ml index ab22cebb..57f252b0 100644 --- a/driver/Interp.ml +++ b/driver/Interp.ml @@ -380,6 +380,7 @@ let do_printf m fmt args = let (>>=) opt f = match opt with None -> None | Some arg -> f arg +(* (* Like eventval_of_val, but accepts static globals as well *) let convert_external_arg ge v t = @@ -399,6 +400,7 @@ let rec convert_external_args ge vl tl = convert_external_arg ge v1 t1 >>= fun e1 -> convert_external_args ge vl tl >>= fun el -> Some (e1 :: el) | _, _ -> None +*) let do_external_function id sg ge w args m = match extern_atom id, args with @@ -406,8 +408,12 @@ let do_external_function id sg ge w args m = extract_string m b ofs >>= fun fmt -> print_string (do_printf m fmt args'); flush stdout; + Some(((w, [Event_syscall(id, [], EVint Int.zero)]), Vint Int.zero), m) +(* convert_external_args ge args sg.sig_args >>= fun eargs -> Some(((w, [Event_syscall(id, eargs, EVint Int.zero)]), Vint Int.zero), m) +*) + | _ -> None |