Skip to content

Commit f5434f8

Browse files
committed
Compiler: control warnings - WIP
1 parent b8b75b9 commit f5434f8

File tree

34 files changed

+391
-173
lines changed

34 files changed

+391
-173
lines changed

compiler/bin-js_of_ocaml/compile.ml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -226,10 +226,11 @@ let run
226226
let check_debug (one : Parse_bytecode.one) =
227227
if Option.is_some source_map && Parse_bytecode.Debug.is_empty one.debug
228228
then
229-
warn
230-
"Warning: '--source-map' is enabled but the bytecode program was compiled with \
231-
no debugging information.\n\
232-
Warning: Consider passing '-g' option to ocamlc.\n\
229+
Warning.warn
230+
`Missing_debug_event
231+
"'--source-map' is enabled but the bytecode program was compiled with no \
232+
debugging information.\n\
233+
Consider passing '-g' option to ocamlc.\n\
233234
%!"
234235
in
235236
let pseudo_fs_instr prim debug cmis =

compiler/bin-js_of_ocaml/js_of_ocaml.ml

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ open Js_of_ocaml_compiler
2323

2424
let () =
2525
Sys.catch_break true;
26-
let argv = Jsoo_cmdline.normalize_argv ~warn:(warn "%s") Sys.argv in
26+
let argv = Sys.argv in
2727
let argv =
2828
let like_arg x = String.length x > 0 && Char.equal x.[0] '-' in
2929
let like_command x =
@@ -59,11 +59,8 @@ let () =
5959
])
6060
with
6161
| Ok (`Ok () | `Help | `Version) ->
62-
if !warnings > 0 && !werror
63-
then (
64-
Format.eprintf "%s: all warnings being treated as errors@." Sys.argv.(0);
65-
exit 1)
66-
else exit 0
62+
Warning.process_warnings ();
63+
exit 0
6764
| Error `Term -> exit 1
6865
| Error `Parse -> exit Cmdliner.Cmd.Exit.cli_error
6966
| Error `Exn -> ()

compiler/bin-jsoo_minify/jsoo_minify.ml

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,7 @@ let main =
9292
Cmdliner.Cmd.v Cmd_arg.info t
9393

9494
let (_ : int) =
95-
try
96-
Cmdliner.Cmd.eval
97-
~catch:false
98-
~argv:(Jsoo_cmdline.normalize_argv ~warn:(warn "%s") Sys.argv)
99-
main
100-
with
95+
try Cmdliner.Cmd.eval ~catch:false ~argv:Sys.argv main with
10196
| (Match_failure _ | Assert_failure _ | Not_found) as exc ->
10297
let backtrace = Printexc.get_backtrace () in
10398
Format.eprintf

compiler/bin-wasm_of_ocaml/compile.ml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -414,9 +414,10 @@ let run
414414
&& Parse_bytecode.Debug.is_empty one.debug
415415
&& not (Code.is_empty one.code)
416416
then
417-
warn
418-
"Warning: '--source-map' is enabled but the bytecode program was compiled with \
419-
no debugging information.\n\
417+
Warning.warn
418+
`Missing_debug_event
419+
"'--source-map' is enabled but the bytecode program was compiled with no \
420+
debugging information.\n\
420421
Warning: Consider passing '-g' option to ocamlc.\n\
421422
%!"
422423
in

compiler/bin-wasm_of_ocaml/gen/gen.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ let check_js_file fname =
1717
let freenames = StringSet.diff freenames Reserved.provided in
1818
if not (StringSet.is_empty freenames)
1919
then (
20-
Format.eprintf "warning: free variables in %S@." fname;
20+
Format.eprintf "Warning: free variables in %S@." fname;
2121
Format.eprintf "vars: %s@." (String.concat ~sep:", " (StringSet.elements freenames));
2222
exit 2);
2323
()

compiler/bin-wasm_of_ocaml/wasm_of_ocaml.ml

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ open Js_of_ocaml_compiler
2121

2222
let () =
2323
Sys.catch_break true;
24-
let argv = Jsoo_cmdline.normalize_argv ~warn:(warn "%s") Sys.argv in
24+
let argv = Sys.argv in
2525
let argv =
2626
let like_arg x = String.length x > 0 && Char.equal x.[0] '-' in
2727
let like_command x =
@@ -57,11 +57,8 @@ let () =
5757
])
5858
with
5959
| Ok (`Ok () | `Help | `Version) ->
60-
if !warnings > 0 && !werror
61-
then (
62-
Format.eprintf "%s: all warnings being treated as errors@." Sys.argv.(0);
63-
exit 1)
64-
else exit 0
60+
Warning.process_warnings ();
61+
exit 0
6562
| Error `Term -> exit 1
6663
| Error `Parse -> exit Cmdliner.Cmd.Exit.cli_error
6764
| Error `Exn -> ()

compiler/bin-wasm_of_ocaml/wasmoo_link_wasm.ml

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,7 @@
2020
open Js_of_ocaml_compiler.Stdlib
2121

2222
let (_ : int) =
23-
try
24-
Cmdliner.Cmd.eval
25-
~catch:false
26-
~argv:(Jsoo_cmdline.normalize_argv ~warn:(warn "%s") Sys.argv)
27-
Link_wasm.command
28-
with
23+
try Cmdliner.Cmd.eval ~catch:false ~argv:Sys.argv Link_wasm.command with
2924
| (Match_failure _ | Assert_failure _ | Not_found) as exc ->
3025
let backtrace = Printexc.get_backtrace () in
3126
Format.eprintf

compiler/lib-cmdline/arg.ml

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ type t =
3131
; optim : string list on_off
3232
; quiet : bool
3333
; werror : bool
34+
; warnings : (bool * Warning.t) list
3435
; custom_header : string option
3536
}
3637

@@ -61,6 +62,35 @@ let disable =
6162
in
6263
Term.(const List.flatten $ arg))
6364

65+
let parse_warning s =
66+
let err s = `Msg (Printf.sprintf "Unknown warning %s" s) in
67+
if String.is_empty s
68+
then Error (err s)
69+
else
70+
match Warning.parse s with
71+
| Some n -> Ok (true, n)
72+
| None -> (
73+
match String.drop_prefix ~prefix:"no-" s with
74+
| Some n -> (
75+
match Warning.parse n with
76+
| Some n -> Ok (false, n)
77+
| None -> Error (err n))
78+
| None -> Error (err s))
79+
80+
let print_warning fmt (b, w) =
81+
Format.fprintf
82+
fmt
83+
"%s%s"
84+
(match b with
85+
| true -> ""
86+
| false -> "")
87+
(Warning.name w)
88+
89+
let warnings : (bool * Warning.t) list Term.t =
90+
let doc = "Enable or disable the warnings specified by the argument [$(docv)]." in
91+
let c : 'a Arg.conv = Arg.conv ~docv:"" (parse_warning, print_warning) in
92+
Arg.(value & opt_all c [] & info [ "w" ] ~docv:"WARN" ~doc)
93+
6494
let pretty =
6595
let doc = "Pretty print the output." in
6696
Arg.(value & flag & info [ "pretty" ] ~doc)
@@ -91,7 +121,19 @@ let custom_header =
91121
let t =
92122
lazy
93123
Term.(
94-
const (fun debug enable disable pretty debuginfo noinline quiet werror c_header ->
124+
const
125+
(fun
126+
debug
127+
enable
128+
disable
129+
pretty
130+
debuginfo
131+
noinline
132+
quiet
133+
(warnings : (bool * Warning.t) list)
134+
werror
135+
c_header
136+
->
95137
let enable = if pretty then "pretty" :: enable else enable in
96138
let enable = if debuginfo then "debuginfo" :: enable else enable in
97139
let disable = if noinline then "inline" :: disable else disable in
@@ -104,6 +146,7 @@ let t =
104146
let disable = disable_if_pretty "share" disable in
105147
{ debug = { enable = debug; disable = [] }
106148
; optim = { enable; disable }
149+
; warnings
107150
; quiet
108151
; werror
109152
; custom_header = c_header
@@ -115,6 +158,7 @@ let t =
115158
$ debuginfo
116159
$ noinline
117160
$ is_quiet
161+
$ warnings
118162
$ is_werror
119163
$ custom_header)
120164

@@ -125,5 +169,8 @@ let on_off on off t =
125169
let eval t =
126170
Config.Flag.(on_off enable disable t.optim);
127171
Debug.(on_off enable disable t.debug);
128-
quiet := t.quiet;
129-
werror := t.werror
172+
List.iter t.warnings ~f:(function
173+
| true, w -> Warning.enable w
174+
| false, w -> Warning.disable w);
175+
Warning.quiet := t.quiet;
176+
Warning.werror := t.werror

compiler/lib-cmdline/arg.mli

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ type t =
2727
; optim : string list on_off
2828
; quiet : bool
2929
; werror : bool
30+
; warnings : (bool * Js_of_ocaml_compiler.Warning.t) list
3031
; custom_header : string option
3132
}
3233

compiler/lib-cmdline/jsoo_cmdline.ml

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,33 +17,4 @@
1717
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
1818
*)
1919

20-
open Js_of_ocaml_compiler.Stdlib
2120
module Arg = Arg
22-
23-
let normalize_argv ?(warn = fun _ -> ()) a =
24-
let bad = ref [] in
25-
let a =
26-
Array.map
27-
~f:(fun s ->
28-
let size = String.length s in
29-
if size <= 2
30-
then s
31-
else if
32-
Char.equal s.[0] '-'
33-
&& (not (Char.equal s.[1] '-'))
34-
&& not (Char.equal s.[2] '=')
35-
then (
36-
bad := s :: !bad;
37-
(* long option with one dash lets double the dash *)
38-
"-" ^ s)
39-
else s)
40-
a
41-
in
42-
if not (List.is_empty !bad)
43-
then
44-
warn
45-
(Format.sprintf
46-
"[Warning] long options with a single '-' are now deprecated. Please use '--' \
47-
for the following options: %s@."
48-
(String.concat ~sep:", " !bad));
49-
a

compiler/lib-wasm/generate.ml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1397,7 +1397,6 @@ module Generate (Target : Target_sig.S) = struct
13971397
~live_vars
13981398
~in_cps (*
13991399
~should_export
1400-
~warn_on_unhandled_effect
14011400
*)
14021401
~deadcode_sentinal
14031402
~global_flow_info

compiler/lib-wasm/link.ml

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -409,12 +409,15 @@ let output_js js =
409409

410410
let report_missing_primitives missing =
411411
if not (List.is_empty missing)
412-
then (
413-
warn "There are some missing Wasm primitives@.";
414-
warn "Dummy implementations (raising an exception) ";
415-
warn "will be provided.@.";
416-
warn "Missing primitives:@.";
417-
List.iter ~f:(fun nm -> warn " %s@." nm) missing)
412+
then
413+
Warning.warn
414+
`Missing_primitive
415+
"There are some missing Wasm primitives\n\
416+
Dummy implementations (raising an exception) will be provided.\n\
417+
Missing primitives:\n\
418+
%a"
419+
(Format.pp_print_list Format.pp_print_string)
420+
missing
418421

419422
let build_runtime_arguments
420423
~link_spec

compiler/lib/builtins.ml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ let register ~name ~content ~fragments =
4040
let name = "+" ^ name in
4141
let t = { File.name; content; fragments } in
4242
if String.Hashtbl.mem tbl name
43-
then warn "The builtin runtime file %S was registered multiple time" name;
43+
then
44+
failwith
45+
(Printf.sprintf "The builtin runtime file %S was registered multiple time" name);
4446
String.Hashtbl.add tbl name t;
4547
t
4648

compiler/lib/config.ml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,6 @@ module Flag = struct
8989

9090
let improved_stacktrace = o ~name:"with-js-error" ~default:false
9191

92-
let warn_unused = o ~name:"warn-unused" ~default:false
93-
9492
let inline_callgen = o ~name:"callgen" ~default:false
9593

9694
let safe_string = o ~name:"safestring" ~default:true
@@ -130,7 +128,7 @@ module Param = struct
130128
let set : string -> unit =
131129
fun v ->
132130
try state := convert v
133-
with _ -> warn "Warning: malformed option %s=%s. IGNORE@." name v
131+
with _ -> Warning.warn `Malformed_params "malformed option %s=%s. IGNORE@." name v
134132
in
135133
params := (name, (set, desc)) :: !params;
136134
fun () -> !state

compiler/lib/config.mli

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@ module Flag : sig
6060

6161
val improved_stacktrace : unit -> bool
6262

63-
val warn_unused : unit -> bool
64-
6563
val inline_callgen : unit -> bool
6664

6765
val safe_string : unit -> bool

compiler/lib/debug.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ let find ?(even_if_quiet = false) s =
5757
in
5858
fun () ->
5959
if String.equal s "times" then take_snapshot ();
60-
(even_if_quiet || not !quiet) && !state
60+
(even_if_quiet || not !Warning.quiet) && !state
6161

6262
let enable s =
6363
match List.string_assoc s !debugs with

0 commit comments

Comments
 (0)