Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /branches/charisee/src/compiler/driver/main.sml
ViewVC logotype

Annotation of /branches/charisee/src/compiler/driver/main.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3260 - (view) (download)

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

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0