Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Diff of /sml/trunk/src/cm/bootstrap/btcompile.sml
ViewVC logotype

Diff of /sml/trunk/src/cm/bootstrap/btcompile.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 355, Sat Jun 26 13:17:30 1999 UTC revision 372, Tue Jul 6 09:05:57 1999 UTC
# Line 7  Line 7 
7   * Author: Matthias Blume (blume@kurims.kyoto-u.ac.jp)   * Author: Matthias Blume (blume@kurims.kyoto-u.ac.jp)
8   *)   *)
9  functor BootstrapCompileFn (structure MachDepVC: MACHDEP_VC  functor BootstrapCompileFn (structure MachDepVC: MACHDEP_VC
10                              val os: SMLofNJ.SysInfo.os_kind) = struct                              val os: SMLofNJ.SysInfo.os_kind) :> sig
11        val make' : string option -> bool
12        val make : unit -> bool
13        val deliver' : string option -> bool
14        val deliver : unit -> bool
15        val reset : unit -> unit
16    end = struct
17    
18      structure EM = GenericVC.ErrorMsg      structure EM = GenericVC.ErrorMsg
19      structure E = GenericVC.Environment      structure E = GenericVC.Environment
# Line 17  Line 23 
23      structure CoerceEnv = GenericVC.CoerceEnv      structure CoerceEnv = GenericVC.CoerceEnv
24      structure SSV = SpecificSymValFn (structure MachDepVC = MachDepVC      structure SSV = SpecificSymValFn (structure MachDepVC = MachDepVC
25                                        val os = os)                                        val os = os)
26        structure P = OS.Path
27        structure F = OS.FileSys
28    
29      (* Since the bootstrap compiler never executes any of the code      (* Since the bootstrap compiler never executes any of the code
30       * it produces, we don't need any dynamic values.  Therefore,       * it produces, we don't need any dynamic values.  Therefore,
# Line 27  Line 35 
35      structure RecompPersstate =      structure RecompPersstate =
36          RecompPersstateFn (structure MachDepVC = MachDepVC          RecompPersstateFn (structure MachDepVC = MachDepVC
37                             val discard_code = true                             val discard_code = true
38                             fun discard_value (i: SmlInfo.info) = ())                             fun stable_value_present i = false
39                               fun new_smlinfo i = ())
40    
41      structure Recomp = RecompFn (structure PS = RecompPersstate)      structure Recomp = RecompFn (structure PS = RecompPersstate)
42      structure RT = CompileGenericFn (structure CT = Recomp)      structure RT = CompileGenericFn (structure CT = Recomp)
43    
# Line 35  Line 45 
45    
46      (* instantiate Stabilize... *)      (* instantiate Stabilize... *)
47      structure Stabilize =      structure Stabilize =
48          StabilizeFn (fun bn2statenv gp i = #1 (#stat (valOf (RT.bnode gp i)))          StabilizeFn (fun bn2statenv gp i = #1 (#stat (valOf (RT.bnode' gp i)))
49                       val recomp = recomp)                       fun warmup (i, p) = ()
50                         val recomp = recomp
51                         val transfer_state = RecompPersstate.transfer_state)
52      (* ... and Parse *)      (* ... and Parse *)
53      structure Parse = ParseFn (structure Stabilize = Stabilize)      structure Parse = ParseFn (structure Stabilize = Stabilize
54                                   fun pending () = SymbolMap.empty)
     fun compile { binroot, pcmodespec, initgspec, maingspec, stabilize } = let  
   
         val keep_going = EnvConfig.getSet StdConfig.keep_going NONE  
   
         val ctxt = SrcPath.cwdContext ()  
   
         val pidfile = OS.Path.joinDirFile { dir = binroot, file = "RTPID" }  
         val listfile = OS.Path.joinDirFile { dir = binroot, file = "BINLIST" }  
55    
56          val pcmode = let      (* copying an input file to an output file safely... *)
57              fun work s = let      fun copyFile (oi, ci, oo, co, inp, outp, eof) (inf, outf) = let
58                  fun loop l = let          fun workIn is = let
59                      val line = TextIO.inputLine s              fun workOut os = let
60                    val N = 4096
61                    fun loop () =
62                        if eof is then () else (outp (os, inp (is, N)); loop ())
63                  in                  in
64                      if line = "" then PathConfig.hardwire l                  loop ()
                     else case String.tokens Char.isSpace line of  
                         [a, s] => loop ((a, s) :: l)  
                       | _ => (Say.say [pcmodespec,  
                                        ": malformed line (ignored)\n"];  
                               loop l)  
65                  end                  end
66              in              in
67                  loop []              SafeIO.perform { openIt = fn () => oo outf,
68                                 closeIt = co,
69                                 work = workOut,
70                                 cleanup = fn () =>
71                                     (F.remove outf handle _ => ()) }
72              end              end
73          in          in
74              SafeIO.perform { openIt = fn () => TextIO.openIn pcmodespec,          SafeIO.perform { openIt = fn () => oi inf,
75                               closeIt = TextIO.closeIn,                           closeIt = ci,
76                               work = work,                           work = workIn,
77                               cleanup = fn () => () }                               cleanup = fn () => () }
78          end          end
79    
80        val copyTextFile =
81            copyFile (TextIO.openIn, TextIO.closeIn,
82                      AutoDir.openTextOut, TextIO.closeOut,
83                      TextIO.inputN, TextIO.output, TextIO.endOfStream)
84    
85        val copyBinFile =
86            copyFile (BinIO.openIn, BinIO.closeIn,
87                      AutoDir.openBinOut, BinIO.closeOut,
88                      BinIO.inputN, BinIO.output, BinIO.endOfStream)
89    
90        fun compile deliver dbopt = let
91    
92            val dirbase = getOpt (dbopt, BtNames.dirbaseDefault)
93            val pcmodespec = BtNames.pcmodespec
94            val initgspec = BtNames.initgspec
95            val maingspec = BtNames.maingspec
96    
97            val arch = MachDepVC.architecture
98            val osname = FilenamePolicy.kind2name os
99            val bindir = concat [dirbase, ".bin.", arch, "-", osname]
100            val bootdir = concat [dirbase, ".boot.", arch, "-", osname]
101    
102            fun listName (p, copy) =
103                case P.fromString p of
104                    { vol = "", isAbs = false, arcs = arc0 :: arc1 :: arcn } => let
105                        fun win32name () =
106                            concat (arc1 ::
107                                    foldr (fn (a, r) => "\\" :: a :: r) [] arcn)
108                        fun doCopy () = let
109                            val bootpath =
110                                P.toString { isAbs = false, vol = "",
111                                             arcs = bootdir :: arc1 :: arcn }
112                        in
113                            copyBinFile (p, bootpath)
114                        end
115                    in
116                        if copy andalso arc0 = bindir then doCopy () else ();
117                        case os of
118                            SMLofNJ.SysInfo.WIN32 => win32name ()
119                          | _ => P.toString { isAbs = false, vol = "",
120                                              arcs = arc1 :: arcn }
121                    end
122                  | _ => raise Fail "BootstrapCompile:listName: bad name"
123    
124            val keep_going = EnvConfig.getSet StdConfig.keep_going NONE
125    
126            val ctxt = SrcPath.cwdContext ()
127    
128            val pidfile = P.joinDirFile { dir = bootdir, file = "RTPID" }
129            val listfile = P.joinDirFile { dir = bootdir, file = "BOOTLIST" }
130    
131            val pcmode = PathConfig.new ()
132            val _ = PathConfig.processSpecFile (pcmode, pcmodespec)
133    
134          fun stdpath s = SrcPath.standard pcmode { context = ctxt, spec = s }          fun stdpath s = SrcPath.standard pcmode { context = ctxt, spec = s }
135    
136          val initgspec = stdpath initgspec          val initgspec = stdpath initgspec
137          val maingspec = stdpath maingspec          val maingspec = stdpath maingspec
138    
139            val cmifile = valOf (SrcPath.reAnchoredName (initgspec, bootdir))
140                handle Option => raise Fail "BootstrapCompile: cmifile"
141    
142          val fnpolicy =          val fnpolicy =
143              FilenamePolicy.separate binroot              FilenamePolicy.separate { bindir = bindir, bootdir = bootdir }
144                  { arch = MachDepVC.architecture, os = os }                  { arch = arch, os = os }
145    
146          fun mkParam { primconf, pervasive, pervcorepids } { corenv } =          fun mkParam { primconf, pervasive, pervcorepids }
147                        { corenv } =
148              { primconf = primconf,              { primconf = primconf,
149                fnpolicy = fnpolicy,                fnpolicy = fnpolicy,
150                pcmode = pcmode,                pcmode = pcmode,
# Line 94  Line 158 
158    
159          (* first, build an initial GeneralParam.info, so we can          (* first, build an initial GeneralParam.info, so we can
160           * deal with the pervasive env and friends... *)           * deal with the pervasive env and friends... *)
         local  
             (* We could actually go and calculate the actual pid of primEnv.  
              * But in reality it's pretty pointless to do so... *)  
             val bogusPid = PS.fromBytes (Byte.stringToBytes "0123456789abcdef")  
             val pspec = { name = "primitive",  
                           env = E.mkenv { static = E.primEnv,  
                                           symbolic = E.symbolicPart E.emptyEnv,  
                                           dynamic = emptydyn },  
                           pidInfo = { statpid = bogusPid,  
                                       sympid = bogusPid,  
                                       ctxt = SE.empty } }  
         in  
             val primconf = Primitive.configuration [pspec]  
         end  
161    
162            val primconf = Primitive.primEnvConf
163          val mkInitParam = mkParam { primconf = primconf,          val mkInitParam = mkParam { primconf = primconf,
164                                      pervasive = E.emptyEnv,                                      pervasive = E.emptyEnv,
165                                      pervcorepids = PidSet.empty }                                      pervcorepids = PidSet.empty }
# Line 126  Line 177 
177              val ovldR = GenericVC.Control.overloadKW              val ovldR = GenericVC.Control.overloadKW
178              val savedOvld = !ovldR              val savedOvld = !ovldR
179              val _ = ovldR := true              val _ = ovldR := true
180                val ts = RT.start ()
181    
182              (* here we build a new gp -- the one that uses the freshly              (* here we build a new gp -- the one that uses the freshly
183               * brewed pervasive env, core env, and primitives *)               * brewed pervasive env, core env, and primitives *)
184              val core = valOf (RT.snode ginfo_nocore core)              val core = valOf (RT.sbnode ts ginfo_nocore core)
185              val corenv =  CoerceEnv.es2bs (#1 (#stat core))              val corenv =  CoerceEnv.es2bs (#1 (#stat core))
186                val core_sym = #1 (#sym core)
187    
188              (* The following is a bit of a hack (but corenv is a hack anyway):              (* The following is a bit of a hack (but corenv is a hack anyway):
189               * As soon as we have core available, we have to patch the               * As soon as we have core available, we have to patch the
# Line 140  Line 193 
193              val ginfo_justcore = { param = param_justcore, groupreg = groupreg,              val ginfo_justcore = { param = param_justcore, groupreg = groupreg,
194                                     errcons = errcons }                                     errcons = errcons }
195    
196              fun rt n = valOf (RT.snode ginfo_justcore n)              fun rt n = valOf (RT.sbnode ts ginfo_justcore n)
197              val rts = rt rts              val rts = rt rts
198              val pervasive = rt pervasive              val pervasive = rt pervasive
199    
200              fun sn2pspec (name, n) = let              fun sn2pspec (name, n) = let
201                  val { stat = (s, sp), sym = (sy, syp), ctxt } = rt n                  val { stat = (s, sp), sym = (sy, syp), ctxt, bfc } = rt n
202                  val env =                  val env =
203                      E.mkenv { static = s, symbolic = sy, dynamic = emptydyn }                      E.mkenv { static = s, symbolic = sy, dynamic = emptydyn }
204                  val pidInfo = { statpid = sp, sympid = syp, ctxt = ctxt }                  val pidInfo = { statpid = sp, sympid = syp, ctxt = ctxt }
# Line 157  Line 210 
210    
211              val _ = ovldR := savedOvld              val _ = ovldR := savedOvld
212    
213                (* To be consistent, we would have to call RT.finish here.
214                 * However, this isn't really necessary because no dynamic
215                 * values exist and we drop "ts" at this point anyway. *)
216                (* val _ = RT.finish ts *)
217    
218                (* The following is a hack but must be done for both the symbolic
219                 * and later the dynamic part of the core environment:
220                 * we must include these parts in the pervasive env. *)
221                val perv_sym = E.layerSymbolic (#1 (#sym pervasive), core_sym)
222    
223              val param =              val param =
224                  mkParam { primconf = Primitive.configuration pspecs,                  mkParam { primconf = Primitive.configuration pspecs,
225                            pervasive = E.mkenv { static = #1 (#stat pervasive),                            pervasive = E.mkenv { static = #1 (#stat pervasive),
226                                                  symbolic = #1 (#sym pervasive),                                                  symbolic = perv_sym,
227                                                  dynamic = emptydyn },                                                  dynamic = emptydyn },
228                            pervcorepids =                            pervcorepids =
229                              PidSet.addList (PidSet.empty,                              PidSet.addList (PidSet.empty,
# Line 168  Line 231 
231                                               #2 (#sym pervasive),                                               #2 (#sym pervasive),
232                                               #2 (#stat core)]) }                                               #2 (#stat core)]) }
233                          { corenv = corenv }                          { corenv = corenv }
234              val stableflag = if stabilize then SOME true else NONE              val stab =
235                    if deliver then SOME true else NONE
236          in          in
237              case Parse.parse NONE param stableflag maingspec of              case Parse.parse NONE param stab maingspec of
238                  NONE => false                  NONE => false
239                | SOME (g, gp) =>                | SOME (g, gp) =>
240                      if recomp gp g then let                      if recomp gp g then let
241                          val rtspid = PS.toHex (#2 (#stat rts))                          val rtspid = PS.toHex (#2 (#stat rts))
                         val bootfiles =  
                             map (fn x => (x, NONE)) binpaths @  
                             MkBootList.group g  
242                          fun writeList s = let                          fun writeList s = let
243                              fun offset NONE = ["\n"]                              fun add ((p, flag), l) = let
244                                | offset (SOME i) = ["@", Int.toString i, "\n"]                                  val n = listName (p, true)
                             fun showBootFile (p, off) =  
                                 TextIO.output (s, concat (p :: offset off))  
245                          in                          in
246                              app showBootFile bootfiles                                  if flag then n :: l else l
247                          end                          end
248                                fun transcribe (p, NONE) = listName (p, true)
249                                  | transcribe (p, SOME (off, desc)) =
250                                    concat [listName (p, false),
251                                            "@", Int.toString off, ":", desc]
252                                val bootstrings =
253                                    foldr add (map transcribe (MkBootList.group g))
254                                          binpaths
255                                fun show str =
256                                    (TextIO.output (s, str);
257                                     TextIO.output (s, "\n"))
258                      in                      in
259                          Say.say ["Runtime System PID is: ", rtspid, "\n"];                              app show bootstrings
260                          SafeIO.perform { openIt = fn () =>                          end
261                        in
262                          if deliver then
263                           (SafeIO.perform { openIt = fn () =>
264                                             AutoDir.openTextOut pidfile,                                             AutoDir.openTextOut pidfile,
265                                           closeIt = TextIO.closeOut,                                           closeIt = TextIO.closeOut,
266                                           work = fn s =>                                           work = fn s =>
# Line 203  Line 275 
275                                           cleanup = fn () =>                                           cleanup = fn () =>
276                                             OS.FileSys.remove listfile                                             OS.FileSys.remove listfile
277                                             handle _ => () };                                             handle _ => () };
278                            copyTextFile (SrcPath.osstring initgspec, cmifile);
279                            Say.say ["Runtime System PID is: ", rtspid, "\n"])
280                          else ();
281                          true                          true
282                      end                      end
283                      else false                      else false
# Line 213  Line 288 
288              SOME x => main_compile x              SOME x => main_compile x
289            | NONE => false            | NONE => false
290      end      end
291    
292        val make' = compile false
293        fun make () = make' NONE
294        val deliver' = compile true
295        fun deliver () = deliver' NONE
296        fun reset () =
297            (RecompPersstate.reset ();
298             RT.reset ();
299             Recomp.reset ();
300             Parse.reset ())
301  end  end

Legend:
Removed from v.355  
changed lines
  Added in v.372

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