aboutsummaryrefslogtreecommitdiffstats
path: root/driver/Commandline.ml
diff options
context:
space:
mode:
authorBernhard Schommer <bschommer@users.noreply.github.com>2018-02-08 16:38:54 +0100
committerXavier Leroy <xavierleroy@users.noreply.github.com>2018-02-08 16:38:54 +0100
commitf02f00a01b598567f70e138c144d9581973802e6 (patch)
treedb15b2ad60692f936435cdd784e7bb7f6a977a40 /driver/Commandline.ml
parent54fa98c3833091a75d0c1afe84b42afc35452fe3 (diff)
downloadcompcert-f02f00a01b598567f70e138c144d9581973802e6.tar.gz
compcert-f02f00a01b598567f70e138c144d9581973802e6.zip
Refactor the handling of errors and warnings (#44)
* Module Cerrors is now called Diagnostic and can be used in parts of CompCert other than cparser/ * Replaced eprintf error. Instead of having eprintf msg; exit 2 use the functions from the Diagnostics module. * Raise on error before calling external tools. * Added diagnostics to clightgen. * Fix error handling of AsmToJson. * Cleanup error handling of Elab and C2C. *The implementation of location printing (file & line) is simplified and correctly prints valid filenames with invalid lines.
Diffstat (limited to 'driver/Commandline.ml')
-rw-r--r--driver/Commandline.ml25
1 files changed, 15 insertions, 10 deletions
diff --git a/driver/Commandline.ml b/driver/Commandline.ml
index 035c33e0..f139212d 100644
--- a/driver/Commandline.ml
+++ b/driver/Commandline.ml
@@ -35,6 +35,8 @@ type action =
| Ignore
| Unit of (unit -> unit)
+exception CmdError of string
+
let match_pattern text = function
| Exact s ->
text = s
@@ -72,7 +74,8 @@ let parse_array spec argv first last =
with Not_found -> find_action s inexact_cases in
match optact with
| None ->
- eprintf "Unknown argument `%s'\n" s; exit 2
+ let msg = sprintf "Unknown argument `%s'" s in
+ raise (CmdError msg)
| Some(Set r) ->
r := true; parse (i+1)
| Some(Unset r) ->
@@ -83,7 +86,8 @@ let parse_array spec argv first last =
if i + 1 <= last then begin
fn argv.(i+1); parse (i+2)
end else begin
- eprintf "Option `%s' expects an argument\n" s; exit 2
+ let msg = sprintf "Option `%s' expects an argument" s in
+ raise (CmdError msg)
end
| Some(Integer fn) ->
if i + 1 <= last then begin
@@ -91,18 +95,20 @@ let parse_array spec argv first last =
try
int_of_string argv.(i+1)
with Failure _ ->
- eprintf "Argument to option `%s' must be an integer\n" s;
- exit 2
+ let msg = sprintf "Argument to option `%s' must be an integer" s in
+ raise (CmdError msg)
in
fn n; parse (i+2)
end else begin
- eprintf "Option `%s' expects an argument\n" s; exit 2
+ let msg = sprintf "Option `%s' expects an argument" s in
+ raise (CmdError msg)
end
| Some (Ignore) ->
if i + 1 <= last then begin
parse (i+2)
end else begin
- eprintf "Option `%s' expects an argument\n" s; exit 2
+ let msg = sprintf "Option `%s' expects an argument" s in
+ raise (CmdError msg)
end
| Some (Unit f) -> f (); parse (i+1)
end
@@ -115,8 +121,7 @@ let parse_cmdline spec =
argv := expandargv Sys.argv;
parse_array spec !argv 1 (Array.length !argv - 1)
with Responsefile.Error s ->
- eprintf "%s" s;
- exit 2
+ raise (CmdError s)
let long_int_action key s =
let ls = String.length s
@@ -126,8 +131,8 @@ let long_int_action key s =
try
int_of_string s
with Failure _ ->
- eprintf "Argument to option `%s' must be an integer\n" key;
- exit 2
+ let msg = sprintf "Argument to option `%s' must be an integer" key in
+ raise (CmdError msg)
let longopt_int key f =
let act s =