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 364, Fri Jul 2 07:33:12 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      (* 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 37  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 48  Line 48 
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 getPid = RecompPersstate.pid_fetch_sml                       val getPid = RecompPersstate.pid_fetch_sml
50                       fun warmup (i, p) = ()                       fun warmup (i, p) = ()
51                       val recomp = recomp)                       val recomp = recomp
52                         val transfer_state = RecompPersstate.transfer_state)
53      (* ... and Parse *)      (* ... and Parse *)
54      structure Parse = ParseFn (structure Stabilize = Stabilize)      structure Parse = ParseFn (structure Stabilize = Stabilize
55                                   val pending = AutoLoad.getPending)
56    
57        fun cpTextStreams (ins, outs) = let
58            val N = 4096
59            fun cp () =
60                if TextIO.endOfStream ins then ()
61                else (TextIO.output (outs,
62                                     TextIO.inputN (ins, N));
63                      cp ())
64        in
65            cp ()
66        end
67    
68        fun openTextStreams (inf, outf) () =
69            (TextIO.openIn inf, AutoDir.openTextOut outf)
70        fun closeTextStreams (ins, outs) =
71            (TextIO.closeIn ins; TextIO.closeOut outs)
72    
73        fun copyFile (inf, outf) =
74            SafeIO.perform { openIt = openTextStreams (inf, outf),
75                             closeIt = closeTextStreams,
76                             work = cpTextStreams,
77                             cleanup = fn () =>
78                                (F.remove outf handle _ => ()) }
79    
80        fun compile deliver dbopt = let
81    
82      fun compile { dirbase, pcmodespec, initgspec, maingspec, stabilize } = let          val dirbase = getOpt (dbopt, BtNames.dirbaseDefault)
83            val pcmodespec = BtNames.pcmodespec
84            val initgspec = BtNames.initgspec
85            val maingspec = BtNames.maingspec
86    
87          val arch = MachDepVC.architecture          val arch = MachDepVC.architecture
88          val osname = FilenamePolicy.kind2name os          val osname = FilenamePolicy.kind2name os
89          val bindir = concat [dirbase, ".bin.", arch, "-", osname]          val bindir = concat [dirbase, ".bin.", arch, "-", osname]
90          val bootdir = concat [dirbase, ".boot.", arch, "-", osname]          val bootdir = concat [dirbase, ".boot.", arch, "-", osname]
91    
92            fun listName (p, copy) =
93                case P.fromString p of
94                    { vol = "", isAbs = false, arcs = arc0 :: arc1 :: arcn } => let
95                        fun win32name () =
96                            concat (arc1 ::
97                                    foldr (fn (a, r) => "\\" :: a :: r) [] arcn)
98                        fun doCopy () = let
99                            val bootpath =
100                                P.toString { isAbs = false, vol = "",
101                                             arcs = bootdir :: arc1 :: arcn }
102                        in
103                            copyFile (p, bootpath)
104                        end
105                    in
106                        if copy andalso arc0 = bindir then doCopy () else ();
107                        case os of
108                            SMLofNJ.SysInfo.WIN32 => win32name ()
109                          | _ => P.toString { isAbs = false, vol = "",
110                                              arcs = arc1 :: arcn }
111                    end
112                  | _ => raise Fail "BootstrapCompile:listName: bad name"
113    
114          val keep_going = EnvConfig.getSet StdConfig.keep_going NONE          val keep_going = EnvConfig.getSet StdConfig.keep_going NONE
115    
116          val ctxt = SrcPath.cwdContext ()          val ctxt = SrcPath.cwdContext ()
117    
118          val pidfile = OS.Path.joinDirFile { dir = bootdir, file = "RTPID" }          val pidfile = P.joinDirFile { dir = bootdir, file = "RTPID" }
119          val listfile = OS.Path.joinDirFile { dir = bootdir, file = "BINLIST" }          val listfile = P.joinDirFile { dir = bootdir, file = "BOOTLIST" }
120    
121          val pcmode = let          val pcmode = PathConfig.new ()
122              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  
123    
124          fun stdpath s = SrcPath.standard pcmode { context = ctxt, spec = s }          fun stdpath s = SrcPath.standard pcmode { context = ctxt, spec = s }
125    
126          val initgspec = stdpath initgspec          val initgspec = stdpath initgspec
127          val maingspec = stdpath maingspec          val maingspec = stdpath maingspec
128    
129          val initfnpolicy =          val cmifile = valOf (SrcPath.reAnchoredName (initgspec, bootdir))
130              FilenamePolicy.separate { bindir = bootdir, bootdir = bootdir }              handle Option => raise Fail "BootstrapCompile: cmifile"
                 { arch = arch, os = os }  
131    
132          val mainfnpolicy =          val fnpolicy =
133              FilenamePolicy.separate { bindir = bindir, bootdir = bootdir }              FilenamePolicy.separate { bindir = bindir, bootdir = bootdir }
134                  { arch = arch, os = os }                  { arch = arch, os = os }
135    
136          fun mkParam { primconf, pervasive, pervcorepids, fnpolicy }          fun mkParam { primconf, pervasive, pervcorepids }
137                      { corenv } =                      { corenv } =
138              { primconf = primconf,              { primconf = primconf,
139                fnpolicy = fnpolicy,                fnpolicy = fnpolicy,
# Line 116  Line 148 
148    
149          (* first, build an initial GeneralParam.info, so we can          (* first, build an initial GeneralParam.info, so we can
150           * 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  
151    
152            val primconf = Primitive.primEnvConf
153          val mkInitParam = mkParam { primconf = primconf,          val mkInitParam = mkParam { primconf = primconf,
154                                      pervasive = E.emptyEnv,                                      pervasive = E.emptyEnv,
155                                      pervcorepids = PidSet.empty,                                      pervcorepids = PidSet.empty }
                                     fnpolicy = initfnpolicy }  
156    
157          val param_nocore = mkInitParam { corenv = BE.staticPart BE.emptyEnv }          val param_nocore = mkInitParam { corenv = BE.staticPart BE.emptyEnv }
158    
# Line 152  Line 170 
170    
171              (* here we build a new gp -- the one that uses the freshly              (* here we build a new gp -- the one that uses the freshly
172               * brewed pervasive env, core env, and primitives *)               * brewed pervasive env, core env, and primitives *)
173              val core = valOf (RT.snode ginfo_nocore core)              val core = valOf (RT.sbnode ginfo_nocore core)
174              val corenv =  CoerceEnv.es2bs (#1 (#stat core))              val corenv =  CoerceEnv.es2bs (#1 (#stat core))
175              val core_sym = #1 (#sym core)              val core_sym = #1 (#sym core)
176    
# Line 164  Line 182 
182              val ginfo_justcore = { param = param_justcore, groupreg = groupreg,              val ginfo_justcore = { param = param_justcore, groupreg = groupreg,
183                                     errcons = errcons }                                     errcons = errcons }
184    
185              fun rt n = valOf (RT.snode ginfo_justcore n)              fun rt n = valOf (RT.sbnode ginfo_justcore n)
186              val rts = rt rts              val rts = rt rts
187              val pervasive = rt pervasive              val pervasive = rt pervasive
188    
# Line 195  Line 213 
213                              PidSet.addList (PidSet.empty,                              PidSet.addList (PidSet.empty,
214                                              [#2 (#stat pervasive),                                              [#2 (#stat pervasive),
215                                               #2 (#sym pervasive),                                               #2 (#sym pervasive),
216                                               #2 (#stat core)]),                                               #2 (#stat core)]) }
                           fnpolicy = mainfnpolicy }  
217                          { corenv = corenv }                          { corenv = corenv }
218              val stableflag = if stabilize then SOME true else NONE              val stab =
219                    if deliver then SOME true else NONE
220          in          in
221              case Parse.parse NONE param stableflag maingspec of              case Parse.parse NONE param stab maingspec of
222                  NONE => false                  NONE => false
223                | SOME (g, gp) =>                | SOME (g, gp) =>
224                      if recomp gp g then let                      if recomp gp g then let
225                          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  
226                          fun writeList s = let                          fun writeList s = let
227                              fun offset NONE = ["\n"]                              fun add ((p, flag), l) = let
228                                | offset (SOME i) = ["@", Int.toString i, "\n"]                                  val n = listName (p, true)
                             fun showBootFile (p, off) =  
                                 TextIO.output (s, concat (p :: offset off))  
229                          in                          in
230                              app showBootFile bootfiles                                  if flag then n :: l else l
231                                end
232                                fun transcribe (p, NONE) = listName (p, true)
233                                  | transcribe (p, SOME (off, desc)) =
234                                    concat [listName (p, false),
235                                            "@", Int.toString off, ":", desc]
236                                val bootstrings =
237                                    foldr add (map transcribe (MkBootList.group g))
238                                          binpaths
239                                fun show str =
240                                    (TextIO.output (s, str);
241                                     TextIO.output (s, "\n"))
242                            in
243                                app show bootstrings
244                          end                          end
245                      in                      in
246                          Say.say ["Runtime System PID is: ", rtspid, "\n"];                          Say.say ["Runtime System PID is: ", rtspid, "\n"];
247                          SafeIO.perform { openIt = fn () =>                        if deliver then
248                           (SafeIO.perform { openIt = fn () =>
249                                             AutoDir.openTextOut pidfile,                                             AutoDir.openTextOut pidfile,
250                                           closeIt = TextIO.closeOut,                                           closeIt = TextIO.closeOut,
251                                           work = fn s =>                                           work = fn s =>
# Line 233  Line 260 
260                                           cleanup = fn () =>                                           cleanup = fn () =>
261                                             OS.FileSys.remove listfile                                             OS.FileSys.remove listfile
262                                             handle _ => () };                                             handle _ => () };
263                            copyFile (SrcPath.osstring initgspec, cmifile))
264                          else ();
265                          true                          true
266                      end                      end
267                      else false                      else false
# Line 243  Line 272 
272              SOME x => main_compile x              SOME x => main_compile x
273            | NONE => false            | NONE => false
274      end      end
275    
276        val make' = compile false
277        fun make () = make' NONE
278        val deliver' = compile true
279        fun deliver () = deliver' NONE
280        fun reset () =
281            (RecompPersstate.reset ();
282             RT.resetAll ();
283             Recomp.reset ())
284  end  end

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

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