forked from ocaml-flambda/flambda-backend
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcodegen_main.ml
90 lines (85 loc) · 3.7 KB
/
codegen_main.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
(**************************************************************************)
(* *)
(* OCaml *)
(* *)
(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
(* *)
(* Copyright 1996 Institut National de Recherche en Informatique et *)
(* en Automatique. *)
(* *)
(* All rights reserved. This file is distributed under the terms of *)
(* the GNU Lesser General Public License version 2.1, with the *)
(* special exception on linking described in the file LICENSE. *)
(* *)
(**************************************************************************)
open Clflags
let write_asm_file = ref false
let compile_file filename =
if !write_asm_file then begin
let out_name = Filename.chop_extension filename ^ ".s" in
Emitaux.output_channel := open_out out_name
end; (* otherwise, stdout *)
let compilation_unit =
Compilation_unit.create Compilation_unit.Prefix.empty
("test" |> Compilation_unit.Name.of_string)
in
Compilenv.reset compilation_unit;
Clflags.cmm_invariants := true;
Emit.begin_assembly();
let ic = open_in filename in
let lb = Lexing.from_channel ic in
lb.Lexing.lex_curr_p <- Lexing.{ lb.lex_curr_p with pos_fname = filename };
try
while true do
Asmgen.compile_phrase ~ppf_dump:Format.std_formatter
(Parsecmm.phrase Lexcmm.token lb)
done
with
End_of_file ->
close_in ic; Emit.end_assembly();
if !write_asm_file then close_out !Emitaux.output_channel
| Lexcmm.Error msg ->
close_in ic; Lexcmm.report_error lb msg
| Parsing.Parse_error ->
close_in ic;
let start_p = Lexing.lexeme_start_p lb in
let end_p = Lexing.lexeme_end_p lb in
Printf.eprintf "File \"%s\", line %i, characters %i-%i:\n\
Syntax error.\n%!"
filename
start_p.Lexing.pos_lnum
(start_p.Lexing.pos_cnum - start_p.Lexing.pos_bol)
(end_p.Lexing.pos_cnum - start_p.Lexing.pos_bol)
| Parsecmmaux.Error msg ->
close_in ic; Parsecmmaux.report_error msg
| x ->
close_in ic; raise x
let usage = "Usage: codegen <options> <files>\noptions are:"
let main() =
Arg.parse [
"-S", Arg.Set write_asm_file,
" Output file to filename.s (default is stdout)";
"-g", Arg.Set Clflags.debug, "";
"-dcmm", Arg.Set dump_cmm, "";
"-dcse", Arg.Set dump_cse, "";
"-dsel", Arg.Set dump_selection, "";
"-dlive", Arg.Unit(fun () -> dump_live := true ), "";
"-dspill", Arg.Set dump_spill, "";
"-dsplit", Arg.Set dump_split, "";
"-dinterf", Arg.Set dump_interf, "";
"-dprefer", Arg.Set dump_prefer, "";
"-dalloc", Arg.Set dump_regalloc, "";
"-dreload", Arg.Set dump_reload, "";
"-dscheduling", Arg.Set dump_scheduling, "";
"-dlinear", Arg.Set dump_linear, "";
"-dtimings", Arg.Unit (fun () -> profile_columns := [ `Time ]), "";
"-dcounters", Arg.Unit (fun () -> profile_columns := [ `Counters ]), "";
( "-dgranularity",
Arg.Symbol
(Clflags.all_profile_granularity_levels, Clflags.set_profile_granularity),
"" );
] compile_file usage
let () =
main ();
Profile.print Format.std_formatter !Clflags.profile_columns ~timings_precision:!Clflags.timings_precision;
exit 0