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 357, Mon Jun 28 08:46:30 1999 UTC revision 398, Wed Aug 25 15:36:43 1999 UTC
# Line 8  Line 8 
8   *)   *)
9  functor BootstrapCompileFn (structure MachDepVC: MACHDEP_VC  functor BootstrapCompileFn (structure MachDepVC: MACHDEP_VC
10                              val os: SMLofNJ.SysInfo.os_kind) :> sig                              val os: SMLofNJ.SysInfo.os_kind) :> sig
11        val make' : string option -> bool
12      val compile :      val make : unit -> bool
13          { dirbase: string,      val deliver' : string option -> bool
14            pcmodespec: string,      val deliver : unit -> bool
15            initgspec: string,      val reset : unit -> unit
           maingspec: string,  
           stabilize: bool }  
         -> bool  
   
16  end = struct  end = struct
17    
18      structure EM = GenericVC.ErrorMsg      structure EM = GenericVC.ErrorMsg
# Line 27  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    (*
30      (* Since the bootstrap compiler never executes any of the code      (* Since the bootstrap compiler never executes any of the code
31       * it produces, we don't need any dynamic values.  Therefore,       * it produces, we don't need any dynamic values.  Therefore,
32       * we create RecompPersstate (but not FullPersstate!) and       * we create RecompPersstate (but not FullPersstate!) and
# Line 37  Line 36 
36      structure RecompPersstate =      structure RecompPersstate =
37          RecompPersstateFn (structure MachDepVC = MachDepVC          RecompPersstateFn (structure MachDepVC = MachDepVC
38                             val discard_code = true                             val discard_code = true
39                             fun discard_value (i: SmlInfo.info) = ())                             fun stable_value_present i = false
40                               fun new_smlinfo i = ())
41    
42      structure Recomp = RecompFn (structure PS = RecompPersstate)      structure Recomp = RecompFn (structure PS = RecompPersstate)
43      structure RT = CompileGenericFn (structure CT = Recomp)      structure RT = CompileGenericFn (structure CT = Recomp)
44    
45      fun recomp gp g = isSome (RT.group gp g)      fun recomp gp g = isSome (RT.group gp g)
46    *)
47    
48        structure Compile =
49            CompileFn (structure MachDepVC = MachDepVC)
50    
51      (* instantiate Stabilize... *)      (* instantiate Stabilize... *)
52    (*
53      structure Stabilize =      structure Stabilize =
54          StabilizeFn (fun bn2statenv gp i = #1 (#stat (valOf (RT.bnode gp i)))          StabilizeFn (fun bn2statenv gp i = #1 (#stat (valOf (RT.bnode' gp i)))
                      val getPid = RecompPersstate.pid_fetch_sml  
55                       fun warmup (i, p) = ()                       fun warmup (i, p) = ()
56                       val recomp = recomp)                       val recomp = recomp
57                         val transfer_state = RecompPersstate.transfer_state)
58    *)
59        structure Stabilize =
60            StabilizeFn (fun transfer_state _ = raise Fail "transfer_state"
61                         val writeBFC = Compile.writeBFC
62                         val sizeBFC = Compile.sizeBFC
63                         val getII = Compile.getII
64                         val recomp = Compile.recomp)
65    
66      (* ... and Parse *)      (* ... and Parse *)
67      structure Parse = ParseFn (structure Stabilize = Stabilize)      structure Parse = ParseFn (structure Stabilize = Stabilize
68                                   fun pending () = SymbolMap.empty)
69    
70      fun compile { dirbase, pcmodespec, initgspec, maingspec, stabilize } = let      (* copying an input file to an output file safely... *)
71        fun copyFile (oi, ci, oo, co, inp, outp, eof) (inf, outf) = let
72            fun workIn is = let
73                fun workOut os = let
74                    val N = 4096
75                    fun loop () =
76                        if eof is then () else (outp (os, inp (is, N)); loop ())
77                in
78                    loop ()
79                end
80            in
81                SafeIO.perform { openIt = fn () => oo outf,
82                                 closeIt = co,
83                                 work = workOut,
84                                 cleanup = fn () =>
85                                     (F.remove outf handle _ => ()) }
86            end
87        in
88            SafeIO.perform { openIt = fn () => oi inf,
89                             closeIt = ci,
90                             work = workIn,
91                             cleanup = fn () => () }
92        end
93    
94        val copyTextFile =
95            copyFile (TextIO.openIn, TextIO.closeIn,
96                      AutoDir.openTextOut, TextIO.closeOut,
97                      TextIO.inputN, TextIO.output, TextIO.endOfStream)
98    
99        val copyBinFile =
100            copyFile (BinIO.openIn, BinIO.closeIn,
101                      AutoDir.openBinOut, BinIO.closeOut,
102                      BinIO.inputN, BinIO.output, BinIO.endOfStream)
103    
104        fun compile deliver dbopt = let
105    
106            val dirbase = getOpt (dbopt, BtNames.dirbaseDefault)
107            val pcmodespec = BtNames.pcmodespec
108            val initgspec = BtNames.initgspec
109            val maingspec = BtNames.maingspec
110    
111          val arch = MachDepVC.architecture          val arch = MachDepVC.architecture
112          val osname = FilenamePolicy.kind2name os          val osname = FilenamePolicy.kind2name os
113          val bindir = concat [dirbase, ".bin.", arch, "-", osname]          val bindir = concat [dirbase, ".bin.", arch, "-", osname]
114          val bootdir = concat [dirbase, ".boot.", arch, "-", osname]          val bootdir = concat [dirbase, ".boot.", arch, "-", osname]
115    
116            fun listName (p, copy) =
117                case P.fromString p of
118                    { vol = "", isAbs = false, arcs = arc0 :: arc1 :: arcn } => let
119                        fun win32name () =
120                            concat (arc1 ::
121                                    foldr (fn (a, r) => "\\" :: a :: r) [] arcn)
122                        fun doCopy () = let
123                            val bootpath =
124                                P.toString { isAbs = false, vol = "",
125                                             arcs = bootdir :: arc1 :: arcn }
126                        in
127                            copyBinFile (p, bootpath)
128                        end
129                    in
130                        if copy andalso arc0 = bindir then doCopy () else ();
131                        case os of
132                            SMLofNJ.SysInfo.WIN32 => win32name ()
133                          | _ => P.toString { isAbs = false, vol = "",
134                                              arcs = arc1 :: arcn }
135                    end
136                  | _ => raise Fail "BootstrapCompile:listName: bad name"
137    
138          val keep_going = EnvConfig.getSet StdConfig.keep_going NONE          val keep_going = EnvConfig.getSet StdConfig.keep_going NONE
139    
140          val ctxt = SrcPath.cwdContext ()          val ctxt = SrcPath.cwdContext ()
141    
142          val pidfile = OS.Path.joinDirFile { dir = bootdir, file = "RTPID" }          val pidfile = P.joinDirFile { dir = bootdir, file = "RTPID" }
143          val listfile = OS.Path.joinDirFile { dir = bootdir, file = "BINLIST" }          val listfile = P.joinDirFile { dir = bootdir, file = "BOOTLIST" }
144    
145          val pcmode = let          val pcmode = PathConfig.new ()
146              fun work s = let          val _ = PathConfig.processSpecFile (pcmode, pcmodespec)
                 fun loop l = let  
                     val line = TextIO.inputLine s  
                 in  
                     if line = "" then PathConfig.hardwire l  
                     else case String.tokens Char.isSpace line of  
                         [a, s] => loop ((a, s) :: l)  
                       | _ => (Say.say [pcmodespec,  
                                        ": malformed line (ignored)\n"];  
                               loop l)  
                 end  
             in  
                 loop []  
             end  
         in  
             SafeIO.perform { openIt = fn () => TextIO.openIn pcmodespec,  
                              closeIt = TextIO.closeIn,  
                              work = work,  
                              cleanup = fn () => () }  
         end  
147    
148          fun stdpath s = SrcPath.standard pcmode { context = ctxt, spec = s }          fun stdpath s = SrcPath.standard pcmode { context = ctxt, spec = s }
149    
150          val initgspec = stdpath initgspec          val initgspec = stdpath initgspec
151          val maingspec = stdpath maingspec          val maingspec = stdpath maingspec
152    
153          val initfnpolicy =          val cmifile = valOf (SrcPath.reAnchoredName (initgspec, bootdir))
154              FilenamePolicy.separate { bindir = bootdir, bootdir = bootdir }              handle Option => raise Fail "BootstrapCompile: cmifile"
                 { arch = arch, os = os }  
155    
156          val mainfnpolicy =          val fnpolicy =
157              FilenamePolicy.separate { bindir = bindir, bootdir = bootdir }              FilenamePolicy.separate { bindir = bindir, bootdir = bootdir }
158                  { arch = arch, os = os }                  { arch = arch, os = os }
159    
160          fun mkParam { primconf, pervasive, pervcorepids, fnpolicy }          fun mkParam { primconf, pervasive, pervcorepids }
161                      { corenv } =                      { corenv } =
162              { primconf = primconf,              { primconf = primconf,
163                fnpolicy = fnpolicy,                fnpolicy = fnpolicy,
# Line 116  Line 172 
172    
173          (* first, build an initial GeneralParam.info, so we can          (* first, build an initial GeneralParam.info, so we can
174           * 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  
175    
176            val primconf = Primitive.primEnvConf
177          val mkInitParam = mkParam { primconf = primconf,          val mkInitParam = mkParam { primconf = primconf,
178                                      pervasive = E.emptyEnv,                                      pervasive = E.emptyEnv,
179                                      pervcorepids = PidSet.empty,                                      pervcorepids = PidSet.empty }
                                     fnpolicy = initfnpolicy }  
180    
181          val param_nocore = mkInitParam { corenv = BE.staticPart BE.emptyEnv }          val param_nocore = mkInitParam { corenv = BE.staticPart BE.emptyEnv }
182    
# Line 149  Line 191 
191              val ovldR = GenericVC.Control.overloadKW              val ovldR = GenericVC.Control.overloadKW
192              val savedOvld = !ovldR              val savedOvld = !ovldR
193              val _ = ovldR := true              val _ = ovldR := true
194                val { sbnode, ... } = Compile.newTraversal ()
195    
196              (* here we build a new gp -- the one that uses the freshly              (* here we build a new gp -- the one that uses the freshly
197               * brewed pervasive env, core env, and primitives *)               * brewed pervasive env, core env, and primitives *)
198              val core = valOf (RT.snode ginfo_nocore core)              val core = valOf (sbnode ginfo_nocore core)
199              val corenv =  CoerceEnv.es2bs (#1 (#stat core))              val corenv =  CoerceEnv.es2bs (#statenv (#ii core) ())
200              val core_sym = #1 (#sym core)              val core_sym = #symenv (#ii core) ()
201    
202              (* 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):
203               * 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 164  Line 207 
207              val ginfo_justcore = { param = param_justcore, groupreg = groupreg,              val ginfo_justcore = { param = param_justcore, groupreg = groupreg,
208                                     errcons = errcons }                                     errcons = errcons }
209    
210              fun rt n = valOf (RT.snode ginfo_justcore n)              fun rt n = valOf (sbnode ginfo_justcore n)
211              val rts = rt rts              val rts = rt rts
212              val pervasive = rt pervasive              val pervasive = rt pervasive
213    
214              fun sn2pspec (name, n) = let              fun sn2pspec (name, n) = let
215                  val { stat = (s, sp), sym = (sy, syp), ctxt } = rt n                  val { ii = { statenv, symenv, statpid, sympid }, ctxt } = rt n
216                  val env =                  val env =
217                      E.mkenv { static = s, symbolic = sy, dynamic = emptydyn }                      E.mkenv { static = statenv (),
218                  val pidInfo = { statpid = sp, sympid = syp, ctxt = ctxt }                                symbolic = symenv (),
219                                  dynamic = emptydyn }
220                    val pidInfo =
221                        { statpid = statpid, sympid = sympid, ctxt = ctxt }
222              in              in
223                  { name = name, env = env, pidInfo = pidInfo }                  { name = name, env = env, pidInfo = pidInfo }
224              end              end
# Line 181  Line 227 
227    
228              val _ = ovldR := savedOvld              val _ = ovldR := savedOvld
229    
230              (* This is a hack but must be done for both the symbolic              (* The following is a hack but must be done for both the symbolic
231               * and later the dynamic part of the core environment:               * and later the dynamic part of the core environment:
232               * we must include these parts in the pervasive env. *)               * we must include these parts in the pervasive env. *)
233              val perv_sym = E.layerSymbolic (#1 (#sym pervasive), core_sym)              val perv_sym = E.layerSymbolic (#symenv (#ii pervasive) (),
234                                                core_sym)
235    
236              val param =              val param =
237                  mkParam { primconf = Primitive.configuration pspecs,                  mkParam { primconf = Primitive.configuration pspecs,
238                            pervasive = E.mkenv { static = #1 (#stat pervasive),                            pervasive = E.mkenv { static =
239                                                     #statenv (#ii pervasive) (),
240                                                  symbolic = perv_sym,                                                  symbolic = perv_sym,
241                                                  dynamic = emptydyn },                                                  dynamic = emptydyn },
242                            pervcorepids =                            pervcorepids =
243                              PidSet.addList (PidSet.empty,                              PidSet.addList (PidSet.empty,
244                                              [#2 (#stat pervasive),                                              [#statpid (#ii pervasive),
245                                               #2 (#sym pervasive),                                               #sympid (#ii pervasive),
246                                               #2 (#stat core)]),                                               #statpid (#ii core)]) }
                           fnpolicy = mainfnpolicy }  
247                          { corenv = corenv }                          { corenv = corenv }
248              val stableflag = if stabilize then SOME true else NONE              val stab =
249                    if deliver then SOME true else NONE
250          in          in
251              case Parse.parse NONE param stableflag maingspec of              case Parse.parse NONE param stab maingspec of
252                  NONE => false                  NONE => false
253                | SOME (g, gp) =>                | SOME (g, gp) =>
254                      if recomp gp g then let                      if Compile.recomp gp g then let
255                          val rtspid = PS.toHex (#2 (#stat rts))                          val rtspid = PS.toHex (#statpid (#ii rts))
                         val bootfiles =  
                             map (fn x => (x, NONE)) binpaths @  
                             MkBootList.group g  
256                          fun writeList s = let                          fun writeList s = let
257                              fun offset NONE = ["\n"]                              fun add ((p, flag), l) = let
258                                | offset (SOME i) = ["@", Int.toString i, "\n"]                                  val n = listName (p, true)
                             fun showBootFile (p, off) =  
                                 TextIO.output (s, concat (p :: offset off))  
259                          in                          in
260                              app showBootFile bootfiles                                  if flag then n :: l else l
261                          end                          end
262                                fun transcribe (p, NONE) = listName (p, true)
263                                  | transcribe (p, SOME (off, desc)) =
264                                    concat [listName (p, false),
265                                            "@", Int.toString off, ":", desc]
266                                val bootstrings =
267                                    foldr add (map transcribe (MkBootList.group g))
268                                          binpaths
269                                fun show str =
270                                    (TextIO.output (s, str);
271                                     TextIO.output (s, "\n"))
272                      in                      in
273                          Say.say ["Runtime System PID is: ", rtspid, "\n"];                              app show bootstrings
274                          SafeIO.perform { openIt = fn () =>                          end
275                        in
276                          if deliver then
277                           (SafeIO.perform { openIt = fn () =>
278                                             AutoDir.openTextOut pidfile,                                             AutoDir.openTextOut pidfile,
279                                           closeIt = TextIO.closeOut,                                           closeIt = TextIO.closeOut,
280                                           work = fn s =>                                           work = fn s =>
# Line 233  Line 289 
289                                           cleanup = fn () =>                                           cleanup = fn () =>
290                                             OS.FileSys.remove listfile                                             OS.FileSys.remove listfile
291                                             handle _ => () };                                             handle _ => () };
292                            copyTextFile (SrcPath.osstring initgspec, cmifile);
293                            Say.say ["Runtime System PID is: ", rtspid, "\n"])
294                          else ();
295                          true                          true
296                      end                      end
297                      else false                      else false
298          end handle Option => (RT.reset (); false)          end handle Option => (Compile.reset (); false)
299                     (* to catch valOf failures in "rt" *)                     (* to catch valOf failures in "rt" *)
300      in      in
301          case BuildInitDG.build ginfo_nocore initgspec of          case BuildInitDG.build ginfo_nocore initgspec of
302              SOME x => main_compile x              SOME x => main_compile x
303            | NONE => false            | NONE => false
304      end      end
305    
306        fun reset () =
307            (Compile.reset ();
308             Parse.reset ())
309    
310        val make' = compile false
311        fun make () = make' NONE
312        fun deliver' arg =
313            SafeIO.perform { openIt = fn () => (),
314                             closeIt = reset,
315                             work = fn () => compile true arg,
316                             cleanup = fn () => () }
317        fun deliver () = deliver' NONE
318  end  end

Legend:
Removed from v.357  
changed lines
  Added in v.398

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