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

SCM Repository

[diderot] Diff of /branches/vis12/src/compiler/c-target/c-target.sml
ViewVC logotype

Diff of /branches/vis12/src/compiler/c-target/c-target.sml

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

revision 1772, Sat Mar 31 12:25:20 2012 UTC revision 1773, Sat Mar 31 13:29:34 2012 UTC
# Line 341  Line 341 
341    
342        (***** OUTPUT *****)        (***** OUTPUT *****)
343    
344          (* create the target-specific substitution list *)
345            fun mkSubs (tgt : target_desc, Strand{name, tyName, ...}) = [
346                    ("CFILE",       OS.Path.joinBaseExt{base= #outBase tgt, ext= SOME "c"}),
347                    ("HDRFILE",     OS.Path.joinBaseExt{base= #outBase tgt, ext= SOME "h"}),
348                    ("PREFIX",      #namespace tgt),
349                    ("SRCFILE",     #srcFile tgt),
350                    ("STRAND",      name),
351                    ("STRANDTY",    tyName)
352                  ]
353    
354            fun condCons (true, x, xs) = x::xs
355              | condCons (false, _, xs) = xs
356    
357            fun compile (tgt : target_desc, basename) = let
358                (* generate the C compiler flags *)
359                  val cflags = ["-I" ^ Paths.diderotInclude, "-I" ^ Paths.teemInclude]
360                  val cflags = condCons (#parallel tgt, #pthread Paths.cflags, cflags)
361                  val cflags = if #debug tgt
362                        then #debug Paths.cflags :: cflags
363                        else #ndebug Paths.cflags :: cflags
364                  val cflags = #base Paths.cflags :: cflags
365                  in
366                    RunCC.compile (basename, cflags)
367                  end
368    
369            fun ldFlags (tgt : target_desc) = if #exec tgt
370                  then let
371                    val extraLibs = condCons (#parallel tgt, #pthread Paths.extraLibs, [])
372                    val extraLibs = Paths.teemLinkFlags @ #base Paths.extraLibs :: extraLibs
373                    val rtLib = TargetUtil.runtimeName tgt
374                    in
375                      rtLib :: extraLibs
376                    end
377                  else [TargetUtil.runtimeName tgt]
378    
379          fun genStrand (tgt : target_desc, Strand{name, tyName, state, output, code}) = let          fun genStrand (tgt : target_desc, Strand{name, tyName, state, output, code}) = let
380              (* the type declaration for the strand's state struct *)              (* the type declaration for the strand's state struct *)
381                val selfTyDef = CL.D_StructDef(                val selfTyDef = CL.D_StructDef(
# Line 371  Line 406 
406   * utility module in c-util.   * utility module in c-util.
407   *)   *)
408        (* generate the struct declaration for the world representation *)        (* generate the struct declaration for the world representation *)
409          fun genWorldStruct (tgt : target_desc, Strand{tyName, ...}) = CL.D_StructDef(          fun genWorldStruct (isTypedef, tgt : target_desc, Strand{tyName, ...}) = let
410                SOME(#namespace tgt ^ "struct_world"),                val body = [
               [  
411                  (* WORLD_STRUCT_PREFIX componenets (see Diderot/world.h) *)                  (* WORLD_STRUCT_PREFIX componenets (see Diderot/world.h) *)
412                    (CL.T_Ptr(CL.T_Named "const char"),           "name"),                    (CL.T_Ptr(CL.T_Named "const char"),           "name"),
413                    (CL.charPtr,                                  "err"),                    (CL.charPtr,                                  "err"),
# Line 389  Line 423 
423                    (CL.T_Ptr CL.uint8,                           "status"),                    (CL.T_Ptr CL.uint8,                           "status"),
424                    (CL.T_Ptr(CL.T_Ptr(CL.T_Named tyName)),       "inState"),                    (CL.T_Ptr(CL.T_Ptr(CL.T_Named tyName)),       "inState"),
425                    (CL.T_Ptr(CL.T_Ptr(CL.T_Named tyName)),       "outState")                    (CL.T_Ptr(CL.T_Ptr(CL.T_Named tyName)),       "outState")
426                  ],                      ]
427                NONE)                in
428                    if isTypedef
429                      then CL.D_StructDef(NONE, body, SOME(#namespace tgt ^ "World_t"))
430                      else CL.D_StructDef(SOME(#namespace tgt ^ "struct_world"), body, NONE)
431                  end
432    
433        (* generate the table of strand descriptors *)        (* generate the table of strand descriptors *)
434          fun ppStrandTable (ppStrm, strands) = let          fun ppStrandTable (ppStrm, strands) = let
# Line 408  Line 446 
446                    SOME(CL.I_Array(genInits (0, strands)))))                    SOME(CL.I_Array(genInits (0, strands)))))
447                end                end
448    
         fun genExecSrc (baseName, prog) = let  
               val Prog{tgt, globals, topDecls, strands, initially, ...} = prog  
               val fileName = OS.Path.joinBaseExt{base=baseName, ext=SOME "c"}  
               val outS = TextIO.openOut fileName  
               val ppStrm = PrintAsC.new outS  
               fun ppDecl dcl = PrintAsC.output(ppStrm, dcl)  
               val strands = AtomTable.listItems strands  
               in  
                 List.app ppDecl (List.rev (!globals));  
                 List.app ppDecl (List.rev (!topDecls));  
                 List.app (fn strand => List.app ppDecl (genStrand(tgt, strand))) strands;  
                 ppStrandTable (ppStrm, strands);  
                 ppDecl (!initially);  
                 PrintAsC.close ppStrm;  
                 TextIO.closeOut outS  
               end  
   
         fun condCons (true, x, xs) = x::xs  
           | condCons (false, _, xs) = xs  
   
         fun compile (tgt : target_desc, basename) = let  
             (* generate the C compiler flags *)  
               val cflags = ["-I" ^ Paths.diderotInclude, "-I" ^ Paths.teemInclude]  
               val cflags = condCons (#parallel tgt, #pthread Paths.cflags, cflags)  
               val cflags = if #debug tgt  
                     then #debug Paths.cflags :: cflags  
                     else #ndebug Paths.cflags :: cflags  
               val cflags = #base Paths.cflags :: cflags  
               in  
                 RunCC.compile (basename, cflags)  
               end  
   
         fun ldFlags (tgt : target_desc) = if #exec tgt  
               then let  
                 val extraLibs = condCons (#parallel tgt, #pthread Paths.extraLibs, [])  
                 val extraLibs = Paths.teemLinkFlags @ #base Paths.extraLibs :: extraLibs  
                 val rtLib = TargetUtil.runtimeName tgt  
                 in  
                   rtLib :: extraLibs  
                 end  
               else [TargetUtil.runtimeName tgt]  
   
       (* output the code to a file.  The string is the basename of the file, the extension  
        * is provided by the target.  
        *)  
         fun generateExec (prog as Prog{tgt, ...}) = let  
               val {outDir, outBase, exec, double, parallel, debug, ...} = tgt  
               val basename = OS.Path.joinDirFile{dir=outDir, file=outBase}  
               in  
                 genExecSrc (basename, prog);  
                 compile (tgt, basename);  
                 RunCC.linkExec (basename, ldFlags tgt)  
               end  
   
         fun mkSubs (tgt : target_desc, Strand{name, tyName, ...}) = [  
                 ("CFILE",       OS.Path.joinBaseExt{base= #outBase tgt, ext= SOME "c"}),  
                 ("HDRFILE",     OS.Path.joinBaseExt{base= #outBase tgt, ext= SOME "h"}),  
                 ("PREFIX",      #namespace tgt),  
                 ("SRCFILE",     #srcFile tgt),  
                 ("STRAND",      name),  
                 ("STRANDTY",    tyName)  
               ]  
   
449          fun outputLibSrc (baseName, Prog{          fun outputLibSrc (baseName, Prog{
450                  tgt, globals, topDecls, strands, nAxes, initially, ...                  tgt, globals, topDecls, strands, nAxes, initially, ...
451                }) = let                }) = let
# Line 485  Line 460 
460                in                in
461  (* FIXME: use a fragment for this part of the file *)  (* FIXME: use a fragment for this part of the file *)
462                  ppDecl (CL.verbatim [CHeadFrag.text] substitutions);                  ppDecl (CL.verbatim [CHeadFrag.text] substitutions);
463                  ppDecl (genWorldStruct(tgt, strand));                  ppDecl (genWorldStruct(false, tgt, strand));
464                  List.app ppDecl (List.rev (!globals));                  List.app ppDecl (List.rev (!globals));
465                  List.app ppDecl (List.rev (!topDecls));                  List.app ppDecl (List.rev (!topDecls));
466                  List.app ppDecl (genStrand(tgt, strand));                  List.app ppDecl (genStrand(tgt, strand));
# Line 520  Line 495 
495                  RunCC.linkLib (basename, ldFlags tgt)                  RunCC.linkLib (basename, ldFlags tgt)
496                end                end
497    
498            fun genExecSrc (baseName, prog) = let
499                  val Prog{tgt, globals, topDecls, strands, initially, ...} = prog
500                  val [strand as Strand{name, tyName, state, output, ...}] = AtomTable.listItems strands
501                  val substitutions =
502                        ("DIDEROT_FLOAT_PRECISION", TargetUtil.floatPrecisionDef tgt) ::
503                        ("DIDEROT_INT_PRECISION", TargetUtil.intPrecisionDef tgt) ::
504                        ("DIDEROT_TARGET", TargetUtil.targetDef tgt) ::
505                        mkSubs (tgt, strand)
506                  val fileName = OS.Path.joinBaseExt{base=baseName, ext=SOME "c"}
507                  val outS = TextIO.openOut fileName
508                  val ppStrm = PrintAsC.new outS
509                  fun ppDecl dcl = PrintAsC.output(ppStrm, dcl)
510                  val mainFrag = if (#parallel tgt)
511                        then ParMainFrag.text
512                        else SeqMainFrag.text
513                  in
514                    ppDecl (CL.verbatim [ExecHdr.text] substitutions);
515                    ppDecl (genWorldStruct(true, tgt, strand));
516                    List.app ppDecl (List.rev (!globals));
517                    List.app ppDecl (List.rev (!topDecls));
518                    List.app ppDecl (genStrand(tgt, strand));
519    (* outputs *)
520                    ppStrandTable (ppStrm, [strand]);
521                    ppDecl (CL.verbatim [InitFrag.text] substitutions);
522    (* FIXME: the XXX_Init function needs to include code to initialize the globals with defaults *)
523                    ppDecl (CL.verbatim [AllocFrag.text] substitutions);
524                    ppDecl (!initially);
525                    ppDecl (CL.verbatim [RunFrag.text] substitutions);
526                    ppDecl (CL.verbatim [ShutdownFrag.text] substitutions);
527                    ppDecl (CL.verbatim [mainFrag] substitutions);
528                    PrintAsC.close ppStrm;
529                    TextIO.closeOut outS
530                  end
531    
532          (* output the code to a file.  The string is the basename of the file, the extension
533           * is provided by the target.
534           *)
535            fun generateExec (prog as Prog{tgt, ...}) = let
536                  val {outDir, outBase, exec, double, parallel, debug, ...} = tgt
537                  val basename = OS.Path.joinDirFile{dir=outDir, file=outBase}
538                  in
539                    genExecSrc (basename, prog);
540                    compile (tgt, basename);
541                    RunCC.linkExec (basename, ldFlags tgt)
542                  end
543    
544          fun generate (prog as Prog{tgt, ...}) = if #exec tgt          fun generate (prog as Prog{tgt, ...}) = if #exec tgt
545                then generateExec prog                then generateExec prog
546                else generateLib prog                else generateLib prog

Legend:
Removed from v.1772  
changed lines
  Added in v.1773

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