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

SCM Repository

[diderot] Annotation of /branches/vis15/src/compiler/cxx-util/gen-inputs-util.sml
ViewVC logotype

Annotation of /branches/vis15/src/compiler/cxx-util/gen-inputs-util.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3906 - (view) (download)

1 : jhr 3810 (* gen-inputs-util.sml
2 :     *
3 :     * This code is part of the Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     *
5 :     * COPYRIGHT (c) 2015 The University of Chicago
6 :     * All rights reserved.
7 :     *)
8 :    
9 :     structure GenInputsUtil : sig
10 :    
11 : jhr 3897 type input_desc = TreeGlobalVar.t Inputs.input
12 : jhr 3810
13 :     (* an l-value expression for accessing a defined-input flag for the given global input *)
14 : jhr 3897 val defined : TreeGlobalVar.t -> CLang.exp
15 : jhr 3810
16 :     (*** Support for standalone executables ***)
17 :    
18 :     (* generate the common functions that handle inputs for standalone executables. These are:
19 : jhr 3897 * init_defaults -- called to initialize the default input values
20 :     * register_inputs -- called to register the command-line options for the input globals
21 : jhr 3810 *)
22 : jhr 3897 val genExecInputFuns : CodeGenEnv.t * TreeIR.program -> CLang.decl list
23 : jhr 3810
24 :     (*** Support for libraries ***)
25 :    
26 :     (* generate the typedef for the defined-input flag struct. *)
27 : jhr 3897 val genDefinedInpStruct : input_desc list -> CLang.decl list
28 : jhr 3810
29 :     (* generate the function that initializes the defined-input flag struct. *)
30 : jhr 3897 val genDefineInp : input_desc list -> CLang.decl
31 : jhr 3810
32 :     end = struct
33 :    
34 :     structure IR = TreeIR
35 : jhr 3897 structure Ty = APITypes
36 : jhr 3866 structure GVar = TreeGlobalVar
37 : jhr 3810 structure CL = CLang
38 : jhr 3870 structure ToC = TreeToCxx
39 : jhr 3896 structure Env = CodeGenEnv
40 : jhr 3897 structure Inp = Inputs
41 : jhr 3906 structure RN = CxxNames
42 : jhr 3810
43 : jhr 3897 type input_desc = GVar.t Inp.input
44 : jhr 3810
45 : jhr 3900 val worldPtrTy = RuntimeNames.worldPtrTy
46 :     val globalPtrTy = RuntimeNames.globalPtrTy
47 : jhr 3897
48 : jhr 3810 (* translate a TreeIR type to the C types used to represent it in the external API *)
49 : jhr 3897 val trType = CodeGenUtil.trAPIType
50 : jhr 3810
51 :     (* generate code to initialize the default input values *)
52 : jhr 3897 fun genInitDefaults (env, constInit) =
53 :     CL.D_Func(
54 :     ["static"], CL.voidTy, "init_defaults",
55 :     [CL.PARAM([], globalPtrTy, Env.global env)],
56 :     ToC.trBlock (env, constInit))
57 : jhr 3810
58 :     (* generate code to register command-line options for setting the input variables *)
59 : jhr 3896 fun genRegisterInputs (env, inputs) = let
60 : jhr 3897 (* pointer to the globals *)
61 :     val globalsV = Env.global env
62 :     val globalsE = CL.mkVar globalsV
63 : jhr 3896 (* the options pointer type *)
64 :     val optionsPtrTy = CL.T_Ptr (Env.optionsTy env)
65 : jhr 3810 (* some common variables *)
66 :     val inpV = CL.mkVar "inp"
67 :     val optsV = CL.mkVar "opts"
68 :     (* register a given input *)
69 : jhr 3897 fun registerInput (Inp.INP{var, name, ty, desc, init}) =
70 :     CL.mkCallExp(
71 :     CL.mkIndirect(optsV, "add"),
72 :     [ CL.mkStr name,
73 :     CL.mkStr(Option.getOpt(desc, "")),
74 :     if Ty.isCArrayTy ty
75 :     then CL.mkIndirect(globalsE, GVar.name var)
76 :     else CL.mkAddrOf(CL.mkIndirect(globalsE, GVar.name var)),
77 :     case init of Inp.NoDefault => CL.mkBool false | _ => CL.mkBool true
78 :     ])
79 : jhr 3810 in
80 :     CL.D_Func(
81 : jhr 3897 ["static"], CL.voidTy, "register_inputs",
82 : jhr 3900 [CL.PARAM([], globalPtrTy, globalsV), CL.PARAM([], RN.optionsPtrTy env, "opts")],
83 : jhr 3810 CL.mkBlock(List.map registerInput inputs))
84 :     end
85 :    
86 :     (* generate the common functions that handle inputs for standalone executables. These are:
87 : jhr 3897 * init_defaults -- called to initialize the default input values
88 :     * register_inputs -- called to register the command-line options for the input globals
89 : jhr 3810 *)
90 : jhr 3897 fun genExecInputFuns (env, IR.Program{inputs, constInit, ...}) = [
91 :     genInitDefaults (env, constInit),
92 :     genRegisterInputs (env, inputs)
93 : jhr 3810 ]
94 :    
95 : jhr 3897 (* an l-value expression for accessing a defined-input flag *)
96 :     fun defined gv = CL.mkSelect(CL.mkIndirect(CL.mkVar "wrld", "definedInp"), GVar.name gv)
97 :    
98 : jhr 3810 (* generate the typedef for the defined-input flag struct. *)
99 : jhr 3897 fun genDefinedInpStruct [] = []
100 :     | genDefinedInpStruct inputs = let
101 :     fun mkField (Inp.INP{var, ...}) = (CL.boolTy, GVar.name var)
102 : jhr 3810 in
103 : jhr 3896 [CL.D_StructDef(NONE, List.map mkField inputs, SOME "defined_inputs")]
104 : jhr 3810 end
105 :    
106 :     (* generate the function that initializes the defined-input flag struct. *)
107 : jhr 3897 fun genDefineInp inputs = let
108 : jhr 3810 (* the world pointer type *)
109 :     val wrldParam = CL.PARAM([], worldPtrTy, "wrld")
110 : jhr 3897 fun initFlag (Inp.INP{var, ...}) = CL.mkAssign(defined var, CL.mkBool false)
111 : jhr 3810 in
112 :     CL.D_Func(
113 : jhr 3897 ["static"], CL.voidTy, "init_defined_inputs",
114 : jhr 3810 [wrldParam],
115 :     CL.mkBlock(List.map initFlag inputs))
116 :     end
117 :    
118 :     end

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