SCM Repository
Annotation of /branches/charisee_dev/src/compiler/driver/main.sml
Parent Directory
|
Revision Log
Revision 3680 - (view) (download)
1 : | jhr | 33 | (* main.sml |
2 : | * | ||
3 : | jhr | 3349 | * This code is part of the Diderot Project (http://diderot-language.cs.uchicago.edu) |
4 : | * | ||
5 : | * COPYRIGHT (c) 2015 The University of Chicago | ||
6 : | jhr | 33 | * All rights reserved. |
7 : | *) | ||
8 : | |||
9 : | structure Main : sig | ||
10 : | |||
11 : | val main : (string * string list) -> OS.Process.status | ||
12 : | |||
13 : | end = struct | ||
14 : | |||
15 : | jhr | 1116 | (* exception tracing magic *) |
16 : | jhr | 1166 | (* |
17 : | jhr | 1116 | val _ = ( |
18 : | SMLofNJ.Internals.TDP.mode := true; | ||
19 : | Coverage.install (); | ||
20 : | BackTrace.install ()) | ||
21 : | jhr | 1166 | *) |
22 : | jhr | 256 | |
23 : | jhr | 33 | fun err s = TextIO.output (TextIO.stdErr, s) |
24 : | fun err1 c = TextIO.output1 (TextIO.stdErr, c) | ||
25 : | fun errnl s = (err s; err1 #"\n") | ||
26 : | |||
27 : | jhr | 429 | exception ERROR |
28 : | jhr | 33 | |
29 : | jhr | 2356 | fun quitWithError srcFile = raise ERROR |
30 : | jhr | 429 | |
31 : | cchiw | 3655 | val testing = 0 |
32 : | cchiw | 3325 | fun testp e = (case testing |
33 : | of 0 => () | ||
34 : | | _=> print(String.concat ["\n\t\t------------",e,"-----------\n"])) | ||
35 : | cchiw | 2845 | |
36 : | cchiw | 3325 | (* modules for count the size of the program at various stages *) |
37 : | structure SizeOfHigh = SizeOfProgramFn(HighIL) | ||
38 : | structure SizeOfMid = SizeOfProgramFn(MidIL) | ||
39 : | structure SizeOfLow = SizeOfProgramFn(LowIL) | ||
40 : | |||
41 : | jhr | 33 | (* check for errors and report them if there are any *) |
42 : | jhr | 2356 | fun checkForErrors errStrm = |
43 : | jhr | 3003 | if Error.anyErrors errStrm |
44 : | then ( | ||
45 : | Error.report (TextIO.stdErr, errStrm); | ||
46 : | quitWithError (Error.sourceFile errStrm)) | ||
47 : | else () | ||
48 : | jhr | 33 | |
49 : | jhr | 1116 | (* compiler front end (parsing, typechecking, and simplification *) |
50 : | fun frontEnd filename = let | ||
51 : | jhr | 3003 | val errStrm = Error.mkErrStream filename |
52 : | val _ = if OS.FileSys.access(filename, [OS.FileSys.A_READ]) | ||
53 : | then () | ||
54 : | else ( | ||
55 : | err(concat["source file \"", filename, "\" does not exist or is not readable\n"]); | ||
56 : | raise ERROR) | ||
57 : | (***** PARSING *****) | ||
58 : | val parseTree = PhaseTimer.withTimer Timers.timeParser (fn () => let | ||
59 : | val inS = TextIO.openIn filename | ||
60 : | val pt = Parser.parseFile (errStrm, inS) | ||
61 : | in | ||
62 : | TextIO.closeIn inS; | ||
63 : | checkForErrors errStrm; | ||
64 : | valOf pt | ||
65 : | end) () | ||
66 : | (***** TYPECHECKING *****) | ||
67 : | val _ = PhaseTimer.start Timers.timeTypechecker | ||
68 : | val ast = (Typechecker.check errStrm parseTree) | ||
69 : | val _ = PhaseTimer.stop Timers.timeTypechecker | ||
70 : | val _ = checkForErrors errStrm | ||
71 : | val _ = ASTPP.output (Log.logFile(), ast) (* DEBUG *) | ||
72 : | (***** SIMPLIFY *****) | ||
73 : | val _ = PhaseTimer.start Timers.timeSimplify | ||
74 : | val simple = Simplify.transform (errStrm, ast) | ||
75 : | val _ = checkForErrors errStrm | ||
76 : | val _ = PhaseTimer.stop Timers.timeSimplify | ||
77 : | jhr | 2356 | (* currently handled by Simplify |
78 : | jhr | 3003 | val _ = SimplePP.output (Log.logFile(), simple) (* DEBUG *) |
79 : | jhr | 2356 | *) |
80 : | jhr | 3003 | in |
81 : | (* check for warnings and report if necessary *) | ||
82 : | if Error.anyWarnings errStrm | ||
83 : | then Error.report (TextIO.stdErr, errStrm) | ||
84 : | else (); | ||
85 : | simple | ||
86 : | end | ||
87 : | jhr | 1116 | |
88 : | jhr | 2451 | fun doFile (target : TargetUtil.target_desc, filename, optOutput) = let |
89 : | jhr | 3003 | val baseName = (case OS.Path.splitBaseExt filename |
90 : | of {base, ext=SOME "diderot"} => base | ||
91 : | | _ => (errnl "expected diderot file"; quitWithError filename) | ||
92 : | (* end case *)) | ||
93 : | val simple = PhaseTimer.withTimer Timers.timeFront frontEnd filename | ||
94 : | (***** TRANSLATION TO HIGH IL*****) | ||
95 : | cchiw | 3667 | val _ =print"\n***starting" |
96 : | cchiw | 3325 | val _ = PhaseTimer.start Timers.timeTranslate |
97 : | jhr | 3003 | val highIL = Translate.translate simple |
98 : | cchiw | 3595 | |
99 : | cchiw | 3680 | (* val _ = SizeOfHigh.count ("", highIL)*) |
100 : | cchiw | 3325 | val _ = PhaseTimer.stop Timers.timeTranslate |
101 : | jhr | 3003 | (***** HIGH-IL OPTIMIZATION *****) |
102 : | val _=testp"In HighIL" | ||
103 : | val _ = PhaseTimer.start Timers.timeHigh | ||
104 : | cchiw | 3557 | |
105 : | cchiw | 3667 | (* val _=testp "High Op"*) |
106 : | cchiw | 3557 | |
107 : | jhr | 3003 | val highIL = HighOptimizer.optimize highIL |
108 : | cchiw | 3557 | |
109 : | cchiw | 3680 | (* |
110 : | val _ = SizeOfHigh.count ("", highIL)*) | ||
111 : | cchiw | 3557 | |
112 : | cchiw | 3595 | |
113 : | val _ = PhaseTimer.stop Timers.timeHigh | ||
114 : | cchiw | 3325 | (*val _=PhaseTimer.report(TextIO.stdOut,Timers.timeHigh)*) |
115 : | jhr | 3003 | (***** TRANSLATION TO MID IL *****) |
116 : | cchiw | 3667 | (* val _=testp "High to mid"*) |
117 : | cchiw | 2845 | val midIL = PhaseTimer.withTimer Timers.timeMid HighToMid.translate highIL |
118 : | cchiw | 3680 | (* val _ = SizeOfMid.count ("", midIL)*) |
119 : | cchiw | 2845 | val _=testp "Mid Op" |
120 : | jhr | 3003 | val midIL = PhaseTimer.withTimer Timers.timeMid MidOptimizer.optimize midIL |
121 : | cchiw | 3680 | (* val _ = SizeOfMid.count ("", midIL)*) |
122 : | cchiw | 3325 | (*val _=PhaseTimer.report(TextIO.stdOut,Timers.timeMid)*) |
123 : | jhr | 3003 | (***** TRANSLATION TO LOW IL *****) |
124 : | cchiw | 2845 | val _=testp "Mid to Low IL" |
125 : | jhr | 3003 | val lowIL = PhaseTimer.withTimer Timers.timeLow MidToLow.translate midIL |
126 : | cchiw | 3680 | (* val _ = SizeOfLow.count ("", lowIL)*) |
127 : | cchiw | 2845 | val _=testp "Low IL Op" |
128 : | jhr | 3003 | val lowIL = PhaseTimer.withTimer Timers.timeLow LowOptimizer.optimize lowIL |
129 : | cchiw | 3541 | val lowIL = Normalize.transform lowIL |
130 : | cchiw | 3680 | (* val _ = SizeOfLow.count ("", lowIL)*) |
131 : | cchiw | 3667 | (* val _ = testp "Code Gen"*) |
132 : | cchiw | 3541 | (*val _=PhaseTimer.report(TextIO.stdOut,Timers.timeLow)*) |
133 : | jhr | 3003 | in |
134 : | (***** CODE GENERATION *****) | ||
135 : | PhaseTimer.withTimer Timers.timeCodegen | ||
136 : | (BackEnd.generate target) | ||
137 : | jhr | 2451 | (Option.getOpt(optOutput, baseName), lowIL) |
138 : | jhr | 3003 | end |
139 : | cchiw | 2615 | |
140 : | jhr | 1232 | fun usage cmd = TextIO.output(TextIO.stdErr, Options.usage cmd) |
141 : | jhr | 33 | |
142 : | jhr | 2356 | fun handleExn ERROR = OS.Process.failure |
143 : | | handleExn exn = ( | ||
144 : | jhr | 3003 | err (concat [ |
145 : | "uncaught exception ", General.exnName exn, | ||
146 : | " [", General.exnMessage exn, "]\n" | ||
147 : | ]); | ||
148 : | List.app (fn s => err (concat [" raised at ", s, "\n"])) (SMLofNJ.exnHistory exn); | ||
149 : | OS.Process.failure) | ||
150 : | jhr | 2356 | |
151 : | jhr | 238 | fun main (name: string, args: string list) = let |
152 : | jhr | 3003 | val {help, version, log, target, output, defs, file} = |
153 : | (Options.parseCmdLine args) | ||
154 : | handle Options.Usage msg => ( | ||
155 : | err(concat[msg, "\n"]); | ||
156 : | usage name; | ||
157 : | OS.Process.exit OS.Process.failure) | ||
158 : | in | ||
159 : | if help | ||
160 : | then (usage name; OS.Process.success) | ||
161 : | else if version | ||
162 : | then (print(Version.message ^ "\n"); OS.Process.success) | ||
163 : | else let | ||
164 : | val {base, ...} = OS.Path.splitBaseExt file | ||
165 : | in | ||
166 : | if CmdLineInputs.initFromArgs defs | ||
167 : | then ( | ||
168 : | if log then Log.init(base ^ ".log") else (); | ||
169 : | PhaseTimer.withTimer Timers.timeCompiler | ||
170 : | jhr | 2451 | doFile (target, file, output); |
171 : | jhr | 3003 | Stats.report (); |
172 : | Log.reportTiming Timers.timeCompiler; | ||
173 : | cchiw | 3174 | |
174 : | jhr | 3003 | OS.Process.success |
175 : | ) handle exn => handleExn exn | ||
176 : | else (err "invalid command-line inputs\n"; OS.Process.failure) | ||
177 : | end | ||
178 : | end | ||
179 : | jhr | 238 | |
180 : | jhr | 33 | end |
root@smlnj-gforge.cs.uchicago.edu | ViewVC Help |
Powered by ViewVC 1.0.0 |