-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathcompile.ml
139 lines (130 loc) · 5.44 KB
/
compile.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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
(***********************************************************************)
(* *)
(* OCaml *)
(* *)
(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
(* *)
(* Copyright 2002 Institut National de Recherche en Informatique et *)
(* en Automatique. All rights reserved. This file is distributed *)
(* under the terms of the Q Public License version 1.0. *)
(* *)
(***********************************************************************)
(* The batch compiler *)
open Misc
open Config
open Format
open Typedtree
open Compenv
(* Compile a .mli file *)
let interface ppf sourcefile outputprefix =
Location.input_name := sourcefile;
Compmisc.init_path false;
let modulename =
String.capitalize(Filename.basename(chop_extension_if_any sourcefile)) in
check_unit_name ppf sourcefile modulename;
Env.set_unit_name modulename;
let inputfile = Pparse.preprocess sourcefile in
let initial_env = Compmisc.initial_env () in
try
let ast =
Pparse.file ppf inputfile Parse.interface ast_intf_magic_number in
if !Clflags.dump_parsetree then fprintf ppf "%a@." Printast.interface ast;
if !Clflags.dump_source then fprintf ppf "%a@." Pprintast.signature ast;
let tsg = Typemod.transl_signature initial_env ast in
if !Clflags.dump_typedtree then fprintf ppf "%a@." Printtyped.interface tsg;
let sg = tsg.sig_type in
if !Clflags.print_types then
Printtyp.wrap_printing_env initial_env (fun () ->
fprintf std_formatter "%a@."
Printtyp.signature (Typemod.simplify_signature sg));
ignore (Includemod.signatures initial_env sg sg);
Typecore.force_delayed_checks ();
Warnings.check_fatal ();
if not !Clflags.print_types then begin
Printf.eprintf "cmi begins!\n";
let sg = Env.save_signature sg modulename (outputprefix ^ ".cmi") in
Typemod.save_signature modulename tsg outputprefix sourcefile
initial_env sg ;
end;
Pparse.remove_preprocessed inputfile
with e ->
Pparse.remove_preprocessed inputfile;
raise e
(* Compile a .ml file *)
let print_if ppf flag printer arg =
if !flag then fprintf ppf "%a@." printer arg;
arg
let (++) x f = f x
let implementation ppf sourcefile outputprefix =
Location.input_name := sourcefile;
Compmisc.init_path false;
let modulename =
String.capitalize(Filename.basename(chop_extension_if_any sourcefile)) in
check_unit_name ppf sourcefile modulename;
Env.set_unit_name modulename;
let inputfile = Pparse.preprocess sourcefile in
let env = Compmisc.initial_env() in
if !Clflags.print_types then begin
try ignore(
Pparse.file ppf inputfile Parse.implementation ast_impl_magic_number
++ print_if ppf Clflags.dump_parsetree Printast.implementation
++ print_if ppf Clflags.dump_source Pprintast.structure
++ Typemod.type_implementation sourcefile outputprefix modulename env
++ print_if ppf Clflags.dump_typedtree
Printtyped.implementation_with_coercion);
Warnings.check_fatal ();
Pparse.remove_preprocessed inputfile;
Stypes.dump (Some (outputprefix ^ ".annot"));
with x ->
Pparse.remove_preprocessed inputfile;
Stypes.dump (Some (outputprefix ^ ".annot"));
raise x
end else begin
let objfile = outputprefix ^ ".cmo" in
let oc = open_out_bin objfile in
try
Pparse.file ppf inputfile Parse.implementation ast_impl_magic_number
++ print_if ppf Clflags.dump_parsetree Printast.implementation
++ print_if ppf Clflags.dump_source Pprintast.structure
++ (fun ptree ->
(* Prevent inferred .mli file from being written twice *)
let wf = !Clflags.dont_write_files in
Clflags.dont_write_files := true;
let str = Typemod.type_implementation sourcefile outputprefix modulename env ptree in
Clflags.dont_write_files := wf;
str
)
(* ++ (fun (str, _) -> str)*)
++ (fun (str, _) -> Mod.structure str)
++ (fun str ->
let ptree = Untypeast.untype_structure str in
Format.eprintf "%a@." Pprintast.structure ptree;
ptree)
++ (fun str -> Mod.splice_in str)
++ (fun ptree ->
Format.eprintf "%a@." Pprintast.structure ptree;
ptree)
++ Typemod.type_implementation sourcefile outputprefix modulename env
++ print_if ppf Clflags.dump_typedtree
Printtyped.implementation_with_coercion
++ Translmod.transl_implementation modulename
++ print_if ppf Clflags.dump_rawlambda Printlambda.lambda
++ Simplif.simplify_lambda
++ print_if ppf Clflags.dump_lambda Printlambda.lambda
++ Bytegen.compile_implementation modulename
++ print_if ppf Clflags.dump_instr Printinstr.instrlist
++ Emitcode.to_file oc modulename;
Warnings.check_fatal ();
close_out oc;
Pparse.remove_preprocessed inputfile;
Stypes.dump (Some (outputprefix ^ ".annot"));
with x ->
close_out oc;
remove_file objfile;
Pparse.remove_preprocessed inputfile;
Stypes.dump (Some (outputprefix ^ ".annot"));
raise x
end
let c_file name =
Location.input_name := name;
if Ccomp.compile_file name <> 0 then exit 2