adam@1677: (* Copyright (c) 2008-2012, Adam Chlipala adamc@1: * All rights reserved. adamc@1: * adamc@1: * Redistribution and use in source and binary forms, with or without adamc@1: * modification, are permitted provided that the following conditions are met: adamc@1: * adamc@1: * - Redistributions of source code must retain the above copyright notice, adamc@1: * this list of conditions and the following disclaimer. adamc@1: * - Redistributions in binary form must reproduce the above copyright notice, adamc@1: * this list of conditions and the following disclaimer in the documentation adamc@1: * and/or other materials provided with the distribution. adamc@1: * - The names of contributors may not be used to endorse or promote products adamc@1: * derived from this software without specific prior written permission. adamc@1: * adamc@1: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" adamc@1: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE adamc@1: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE adamc@1: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ziv@2202: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR adamc@1: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF adamc@1: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS adamc@1: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN adamc@1: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) adamc@1: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE adamc@1: * POSSIBILITY OF SUCH DAMAGE. adamc@1: *) adamc@1: adamc@244: (* Ur/Web main compiler interface *) adamc@1: adamc@1: signature COMPILER = sig adamc@1: adamc@270: type job = { adamc@385: prefix : string, adamc@270: database : string option, adamc@274: sources : string list, adamc@274: exe : string, adamc@274: sql : string option, adamc@502: debug : bool, adamc@673: profile : bool, adamc@764: timeout : int, adamc@764: ffi : string list, adamc@764: link : string list, adam@1725: linker : string option, adamc@765: headers : string list, adamc@766: scripts : string list, adamc@765: clientToServer : Settings.ffi list, adamc@765: effectful : Settings.ffi list, adamc@1171: benignEffectful : Settings.ffi list, adamc@765: clientOnly : Settings.ffi list, adamc@765: serverOnly : Settings.ffi list, adamc@768: jsFuncs : (Settings.ffi * string) list, adamc@769: rewrites : Settings.rewrite list, adamc@769: filterUrl : Settings.rule list, adamc@866: filterMime : Settings.rule list, adam@1465: filterRequest : Settings.rule list, adam@1465: filterResponse : Settings.rule list, adam@1799: filterEnv : Settings.rule list, adamc@866: protocol : string option, adamc@1164: dbms : string option, adamc@1183: sigFile : string option, adam@1294: safeGets : string list, adam@1332: onError : (string * string list * string) option, adam@1332: minHeap : int adamc@270: } adamc@1045: val compile : string -> bool adamc@1045: val compiler : string -> unit adamc@742: val compileC : {cname : string, oname : string, ename : string, libs : string, adam@1725: profile : bool, debug : bool, linker : string option, link : string list} -> bool adamc@29: adam@1540: val beforeC : (unit -> unit) ref adam@1540: (* This function is called before beginning C compilation. adam@1540: * The current use is for MLton to compact its heap here, to avoid hogging adam@1540: * space after all the interesting ML code is done. *) adam@1540: adamc@201: type ('src, 'dst) phase adamc@201: type ('src, 'dst) transform adamc@55: adamc@201: val transform : ('src, 'dst) phase -> string -> ('src, 'dst) transform adamc@270: val o : ('b, 'c) transform * ('a, 'b) transform -> ('a, 'c) transform adamc@1: adamc@346: val check : ('src, 'dst) transform -> 'src -> unit adamc@201: val run : ('src, 'dst) transform -> 'src -> 'dst option adamc@201: val runPrint : ('src, 'dst) transform -> 'src -> unit adam@1362: val runPrintToFile : ('src, 'dst) transform -> 'src -> string -> unit adamc@201: val time : ('src, 'dst) transform -> 'src -> unit adamc@201: val timePrint : ('src, 'dst) transform -> 'src -> unit adamc@56: adam@1362: val runPrintCoreFuncs : ('src, Core.file) transform -> 'src -> unit adam@1362: adamc@244: val parseUr : (string, Source.file) phase adamc@244: val parseUrs : (string, Source.sgn_item list) phase adamc@270: val parseUrp : (string, job) phase adamc@1082: val parseUrp' : (string, {Job : job, Libs : string list}) phase adamc@201: adamc@201: val parse : (job, Source.file) phase adamc@201: val elaborate : (Source.file, Elab.file) phase adamc@448: val unnest : (Elab.file, Elab.file) phase adamc@313: val termination : (Elab.file, Elab.file) phase adamc@201: val explify : (Elab.file, Expl.file) phase adamc@201: val corify : (Expl.file, Core.file) phase adamc@454: val core_untangle : (Core.file, Core.file) phase adamc@202: val shake : (Core.file, Core.file) phase adamc@607: val rpcify : (Core.file, Core.file) phase adamc@202: val tag : (Core.file, Core.file) phase adamc@202: val reduce : (Core.file, Core.file) phase adamc@315: val unpoly : (Core.file, Core.file) phase adamc@1186: val especialize : (Core.file, Core.file) phase adamc@202: val specialize : (Core.file, Core.file) phase adamc@692: val marshalcheck : (Core.file, Core.file) phase adamc@732: val effectize : (Core.file, Core.file) phase adamc@1170: val css : (Core.file, Css.report) phase adamc@202: val monoize : (Core.file, Mono.file) phase adamc@202: val mono_opt : (Mono.file, Mono.file) phase adamc@202: val untangle : (Mono.file, Mono.file) phase adamc@202: val mono_reduce : (Mono.file, Mono.file) phase adamc@202: val mono_shake : (Mono.file, Mono.file) phase ziv@2294: (* val iflow : (Mono.file, Mono.file) phase *) adam@1800: val namejs : (Mono.file, Mono.file) phase adam@1845: val scriptcheck : (Mono.file, Mono.file) phase adamc@567: val jscomp : (Mono.file, Mono.file) phase adamc@506: val fuse : (Mono.file, Mono.file) phase adamc@377: val pathcheck : (Mono.file, Mono.file) phase adam@1595: val sidecheck : (Mono.file, Mono.file) phase adam@1856: val sigcheck : (Mono.file, Mono.file) phase ziv@2209: val sqlcache : (Mono.file, Mono.file) phase adamc@202: val cjrize : (Mono.file, Cjr.file) phase adamc@282: val prepare : (Cjr.file, Cjr.file) phase adamc@879: val checknest : (Cjr.file, Cjr.file) phase adamc@274: val sqlify : (Mono.file, Cjr.file) phase adamc@201: adamc@270: val toParseJob : (string, job) transform adamc@1082: val toParseJob' : (string, {Job : job, Libs : string list}) transform adamc@270: val toParse : (string, Source.file) transform adamc@270: val toElaborate : (string, Elab.file) transform adamc@448: val toUnnest : (string, Elab.file) transform adamc@313: val toTermination : (string, Elab.file) transform adamc@270: val toExplify : (string, Expl.file) transform adamc@270: val toCorify : (string, Core.file) transform adamc@454: val toCore_untangle : (string, Core.file) transform adamc@270: val toShake1 : (string, Core.file) transform ziv@2202: val toEspecialize1' : (string, Core.file) transform adam@1362: val toShake1' : (string, Core.file) transform adamc@607: val toRpcify : (string, Core.file) transform adamc@642: val toCore_untangle2 : (string, Core.file) transform adamc@642: val toShake2 : (string, Core.file) transform ziv@2202: val toEspecialize1 : (string, Core.file) transform adamc@1062: val toCore_untangle3 : (string, Core.file) transform adamc@1062: val toShake3 : (string, Core.file) transform adamc@270: val toTag : (string, Core.file) transform adamc@270: val toReduce : (string, Core.file) transform adamc@1186: val toShakey : (string, Core.file) transform adamc@1272: val toUnpoly : (string, Core.file) transform adamc@1272: val toSpecialize : (string, Core.file) transform adamc@1062: val toShake4 : (string, Core.file) transform adamc@1272: val toEspecialize2 : (string, Core.file) transform adamc@1272: val toShake4' : (string, Core.file) transform adamc@1276: val toSpecialize2 : (string, Core.file) transform adamc@1272: val toUnpoly2 : (string, Core.file) transform adamc@1272: val toShake4'' : (string, Core.file) transform adamc@1272: val toEspecialize3 : (string, Core.file) transform adamc@898: val toReduce2 : (string, Core.file) transform adamc@1062: val toShake5 : (string, Core.file) transform adamc@692: val toMarshalcheck : (string, Core.file) transform adamc@732: val toEffectize : (string, Core.file) transform adamc@1170: val toCss : (string, Css.report) transform adamc@270: val toMonoize : (string, Mono.file) transform adamc@270: val toMono_opt1 : (string, Mono.file) transform adamc@270: val toUntangle : (string, Mono.file) transform adamc@270: val toMono_reduce : (string, Mono.file) transform adamc@270: val toMono_shake : (string, Mono.file) transform adamc@572: val toMono_opt2 : (string, Mono.file) transform ziv@2294: (* val toIflow : (string, Mono.file) transform *) adam@1800: val toNamejs : (string, Mono.file) transform adam@1800: val toNamejs_untangle : (string, Mono.file) transform adam@1845: val toScriptcheck : (string, Mono.file) transform adam@2056: val toDbmodecheck : (string, Mono.file) transform adamc@567: val toJscomp : (string, Mono.file) transform adamc@572: val toMono_opt3 : (string, Mono.file) transform adamc@506: val toFuse : (string, Mono.file) transform adamc@506: val toUntangle2 : (string, Mono.file) transform adamc@601: val toMono_reduce2 : (string, Mono.file) transform adamc@506: val toMono_shake2 : (string, Mono.file) transform adamc@916: val toMono_opt4 : (string, Mono.file) transform adamc@1017: val toMono_reduce3 : (string, Mono.file) transform adamc@916: val toFuse2 : (string, Mono.file) transform adamc@916: val toUntangle3 : (string, Mono.file) transform adamc@916: val toMono_shake3 : (string, Mono.file) transform adamc@377: val toPathcheck : (string, Mono.file) transform adam@1595: val toSidecheck : (string, Mono.file) transform adam@1856: val toSigcheck : (string, Mono.file) transform ziv@2209: val toSqlcache : (string, Mono.file) transform adamc@270: val toCjrize : (string, Cjr.file) transform adamc@282: val toPrepare : (string, Cjr.file) transform adamc@879: val toChecknest : (string, Cjr.file) transform adamc@274: val toSqlify : (string, Cjr.file) transform adamc@1: adamc@1079: val debug : bool ref adam@1677: val dumpSource : bool ref ezyang@1739: val enableBoot : unit -> unit adam@1677: adamc@1235: val doIflow : bool ref adamc@1079: adamc@1089: val addPath : string * string -> unit adamc@1090: val addModuleRoot : string * string -> unit adamc@1089: adamc@1266: val moduleOf : string -> string adamc@1266: adam@1961: val setStop : string -> unit adam@1961: (* Stop compilation after this phase. *) adam@1961: adamc@1: end