aboutsummaryrefslogtreecommitdiffstats
path: root/driver
diff options
context:
space:
mode:
authorMichael Schmidt <github@mschmidt.me>2016-08-17 16:32:56 +0200
committerMichael Schmidt <github@mschmidt.me>2016-08-17 16:32:56 +0200
commite0f0f573a4a8fc1f564a31388afa9c23e48bb016 (patch)
treeb7c004b3aae01c79bef8c8914e759a1e3ce358f7 /driver
parent18fcf2ffef8b4ba5eb0624b15371e93b4ac88cfe (diff)
parente2b4459ccd1b0f8436cb70a631772d715e642dcd (diff)
downloadcompcert-kvx-e0f0f573a4a8fc1f564a31388afa9c23e48bb016.tar.gz
compcert-kvx-e0f0f573a4a8fc1f564a31388afa9c23e48bb016.zip
fix merge conflicts
Diffstat (limited to 'driver')
-rw-r--r--driver/Commandline.ml8
-rw-r--r--driver/Configuration.ml12
-rw-r--r--driver/Configuration.mli8
-rw-r--r--driver/Driver.ml1
-rw-r--r--driver/Driveraux.ml34
-rw-r--r--driver/Driveraux.mli2
-rw-r--r--driver/Interp.ml6
7 files changed, 61 insertions, 10 deletions
diff --git a/driver/Commandline.ml b/driver/Commandline.ml
index 0a2c8fca..d125736a 100644
--- a/driver/Commandline.ml
+++ b/driver/Commandline.ml
@@ -16,6 +16,7 @@
(* Parsing of command-line flags and arguments *)
open Printf
+open Responsefile
type pattern =
| Exact of string
@@ -99,4 +100,9 @@ let parse_array spec argv first last =
in parse first
let parse_cmdline spec =
- parse_array spec Sys.argv 1 (Array.length Sys.argv - 1)
+ try
+ let argv = expandargv Sys.argv in
+ parse_array spec argv 1 (Array.length argv - 1)
+ with Responsefile.Error s ->
+ eprintf "%s" s;
+ exit 2
diff --git a/driver/Configuration.ml b/driver/Configuration.ml
index 765b075a..87e29e0f 100644
--- a/driver/Configuration.ml
+++ b/driver/Configuration.ml
@@ -176,3 +176,15 @@ let struct_return_style =
| "int1-8" -> SR_int1to8
| "ref" -> SR_ref
| v -> bad_config "struct_return_style" [v]
+
+type response_file_style =
+ | Gnu (* responsefiles in gnu compatible syntax *)
+ | Diab (* responsefiles in diab compatible syntax *)
+ | Unsupported (* responsefiles are not supported *)
+
+let response_file_style =
+ match get_config_string "response_file_style" with
+ | "unsupported" -> Unsupported
+ | "gnu" -> Gnu
+ | "diab" -> Diab
+ | v -> bad_config "response_file_style" [v]
diff --git a/driver/Configuration.mli b/driver/Configuration.mli
index 4b9c64a9..197e8ad2 100644
--- a/driver/Configuration.mli
+++ b/driver/Configuration.mli
@@ -66,3 +66,11 @@ val struct_passing_style: struct_passing_style
val struct_return_style: struct_return_style
(** Calling conventions to use for returning structs and unions as
first-class values *)
+
+type response_file_style =
+ | Gnu (* responsefiles in gnu compatible syntax *)
+ | Diab (* responsefiles in diab compatible syntax *)
+ | Unsupported (* responsefiles are not supported *)
+
+val response_file_style: response_file_style
+ (** Style of supported responsefiles *)
diff --git a/driver/Driver.ml b/driver/Driver.ml
index 9c07dba1..0bfc7167 100644
--- a/driver/Driver.ml
+++ b/driver/Driver.ml
@@ -341,6 +341,7 @@ General options:\n\
\ -v Print external commands before invoking them\n\
\ -timings Show the time spent in various compiler passes\n\
\ -version Print the version string and exit\n\
+\ @<file> Read command line options from <file>\n\
Interpreter mode:\n\
\ -interp Execute given .c files using the reference interpreter\n\
\ -quiet Suppress diagnostic messages for the interpreter\n\
diff --git a/driver/Driveraux.ml b/driver/Driveraux.ml
index 3fe22fac..33cd9215 100644
--- a/driver/Driveraux.ml
+++ b/driver/Driveraux.ml
@@ -14,13 +14,20 @@
open Printf
open Clflags
+(* Is this a gnu based tool chain *)
+let gnu_system = Configuration.system <> "diab"
+
+(* Safe removal of files *)
+let safe_remove file =
+ try Sys.remove file with Sys_error _ -> ()
+
(* Invocation of external tools *)
let rec waitpid_no_intr pid =
try Unix.waitpid [] pid
with Unix.Unix_error (Unix.EINTR, _, _) -> waitpid_no_intr pid
-let command ?stdout args =
+let command stdout args =
if !option_v then begin
eprintf "+ %s" (String.concat " " args);
begin match stdout with
@@ -51,12 +58,29 @@ let command ?stdout args =
argv.(0) fn (Unix.error_message err) param;
-1
+let command ?stdout args =
+ let resp = Sys.win32 && Configuration.response_file_style <> Configuration.Unsupported in
+ if resp && List.fold_left (fun len arg -> len + String.length arg + 1) 0 args > 7000 then
+ let quote,prefix = match Configuration.response_file_style with
+ | Configuration.Unsupported -> assert false
+ | Configuration.Gnu -> Responsefile.gnu_quote,"@"
+ | Configuration.Diab -> Responsefile.diab_quote,"-@" in
+ let file,oc = Filename.open_temp_file "compcert" "" in
+ let cmd,args = match args with
+ | cmd::args -> cmd,args
+ | [] -> assert false (* Should never happen *) in
+ List.iter (fun a -> Printf.fprintf oc "%s " (quote a)) args;
+ close_out oc;
+ let arg = prefix^file in
+ let ret = command stdout [cmd;arg] in
+ safe_remove file;
+ ret
+ else
+ command stdout args
+
let command_error n exc =
eprintf "Error: %s command failed with exit code %d (use -v to see invocation)\n" n exc
-let safe_remove file =
- try Sys.remove file with Sys_error _ -> ()
-
(* Determine names for output files. We use -o option if specified
and if this is the final destination file (not a dump file).
@@ -94,8 +118,6 @@ let print_error oc msg =
List.iter print_one_error msg;
output_char oc '\n'
-let gnu_system = Configuration.system <> "diab"
-
(* Command-line parsing *)
let explode_comma_option s =
match Str.split (Str.regexp ",") s with
diff --git a/driver/Driveraux.mli b/driver/Driveraux.mli
index 60efcc80..e6bac6e3 100644
--- a/driver/Driveraux.mli
+++ b/driver/Driveraux.mli
@@ -12,7 +12,7 @@
(* *********************************************************************)
-val command: ?stdout:string -> string list -> int
+val command: ?stdout:string -> string list -> int
(** Execute the command with the given arguments and an optional file for
the stdout. Returns the exit code. *)
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