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

SCM Repository

[diderot] Annotation of /branches/pure-cfg/src/compiler/codegen/clang.sml
ViewVC logotype

Annotation of /branches/pure-cfg/src/compiler/codegen/clang.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 638 - (view) (download)

1 : jhr 520 (* clang.sml
2 :     *
3 :     * COPYRIGHT (c) 2011 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     * All rights reserved.
5 :     *
6 :     * An tree representation of programs in a C-like language (e.g., C, CUDA,
7 : jhr 522 * or OpenCL). The purpose of this code is to commonality between the various
8 :     * backends, which are all generating C-like code.
9 : jhr 520 *)
10 :    
11 :     structure CLang =
12 : jhr 521 struct
13 : jhr 520
14 : jhr 522 type var = string
15 :     type attr = string (* e.g., "static", "kernel", etc ... *)
16 :    
17 :     datatype ty
18 :     = T_Num of RawTypes.ty
19 :     | T_Ptr of ty
20 : jhr 573 | T_Array of ty * int option
21 : jhr 522 | T_Named of string
22 :    
23 : jhr 533 val voidTy = T_Named "void"
24 : jhr 638 val charPtr = T_Ptr(T_Named "char")
25 : jhr 525 val int32 = T_Num(RawTypes.RT_Int32)
26 : jhr 623 val uint32 = T_Num(RawTypes.RT_UInt32)
27 : jhr 525 val int64 = T_Num(RawTypes.RT_Int64)
28 :     val float = T_Num(RawTypes.RT_Float)
29 :     val double = T_Num(RawTypes.RT_Double)
30 :    
31 : jhr 522 datatype decl
32 : jhr 525 = D_Comment of string list
33 : jhr 547 (* verbatim text (e.g., preprocessor directives) *)
34 :     | D_Verbatim of string list
35 : jhr 544 (* global variable declaration *)
36 : jhr 573 | D_Var of attr list * ty * var * initializer option
37 : jhr 544 (* function definition *)
38 : jhr 525 | D_Func of attr list * ty * string * param list * stm
39 : jhr 544 (* typedef of struct type *)
40 :     | D_StructDef of (ty * string) list * string
41 : jhr 522
42 : jhr 573 and initializer
43 :     = I_Exp of exp
44 :     | I_Struct of (string * initializer) list
45 :     | I_Array of (int * initializer) list
46 :    
47 : jhr 544 and param = PARAM of attr list * ty * var
48 : jhr 522
49 :     and stm
50 : jhr 525 = S_Block of stm list (* "{" stms "}" *)
51 :     | S_Comment of string list
52 : jhr 623 | S_Decl of ty * var * initializer option (* ty var [ '=' exp ]';' *)
53 : jhr 525 | S_Assign of exp * exp (* lvalue '=' exp ';' *)
54 :     | S_If of exp * stm * stm (* 'if' exp stm 'else' stm *)
55 :     | S_While of exp * stm (* 'while' exp stm *)
56 : jhr 617 | S_For of (ty * var * exp) list * exp * exp list * stm
57 :     (* 'for' '(' inits ';' exp ';' incrs ')' stm *)
58 : jhr 522 | S_Call of string * exp list
59 : jhr 525 | S_Return of exp option (* 'return' [ exp ] ';' *)
60 : jhr 522
61 :     and exp
62 : jhr 520 = E_Grp of exp (* "(" e ")" *)
63 :     | E_BinOp of exp * binop * exp (* e op e *)
64 :     | E_UnOp of unop * exp (* op e *)
65 : jhr 616 | E_PostOp of exp * postfix (* e op *)
66 : jhr 520 | E_Apply of string * exp list (* f "(" ... ")" *)
67 : jhr 521 | E_Subscript of exp * exp (* e "[" e "]" *)
68 :     | E_Select of exp * string (* e "." f *)
69 : jhr 525 | E_Indirect of exp * string (* e "->" f *)
70 : jhr 521 | E_Cast of ty * exp (* "(" ty ")" e *)
71 :     | E_Var of var
72 : jhr 525 | E_Int of IntegerLit.integer * ty
73 :     | E_Flt of FloatLit.float * ty
74 :     | E_Bool of bool
75 : jhr 528 | E_Str of string
76 : jhr 573 | E_Sizeof of ty (* "sizeof(" ty ")" *)
77 : jhr 520
78 : jhr 521 (* binary operators in increasing order of precedence *)
79 :     and binop
80 :     = #||
81 :     | #&&
82 :     | #== | #!=
83 :     | #< | #<= | #>= | #>
84 :     | #+ | #-
85 :     | #* | #/ | #%
86 :    
87 : jhr 616 and unop = %- | %! | %& | %* | %~ | %++ | %--
88 : jhr 521
89 : jhr 616 and postfix = ^++ | ^--
90 :    
91 : jhr 522 (* smart constructors that add E_Grp wrappers based on operator precedence *)
92 : jhr 521 local
93 :     val commaP = 0
94 :     val assignP = 1
95 :     val condP = 2
96 :     val lorP = 3
97 :     val landP = 4
98 :     val borP = 5
99 :     val bandP = 6
100 :     val eqP = 7
101 :     val relP = 8
102 :     val shiftP = 9
103 :     val addP = 10
104 :     val mulP = 11
105 :     val unaryP = 12
106 :     val preP = 13
107 :     val compundP = 14 (* compound literal *)
108 :     val postP = 15
109 :     val callP = 16
110 :     val subP = 17
111 :     val atomP = 18
112 :     fun precOfBinop rator = (case rator
113 :     of #|| => lorP
114 :     | #&& => landP
115 :     | #== => eqP | #!= => eqP
116 :     | #< => relP | #<= => relP | #>= => relP | #> => relP
117 :     | #+ => addP | #- => addP
118 :     | #* => mulP | #/ => mulP | #% => mulP
119 :     (* end case *))
120 :     fun prec (E_Grp _) = atomP
121 :     | prec (E_BinOp(_, rator, _)) = precOfBinop rator
122 : jhr 616 | prec (E_UnOp _) = preP
123 :     | prec (E_PostOp _) = postP
124 : jhr 521 | prec (E_Apply _) = callP
125 :     | prec (E_Subscript _) = postP
126 :     | prec (E_Select _) = postP
127 : jhr 525 | prec (E_Indirect _) = postP
128 : jhr 521 | prec (E_Cast _) = unaryP
129 :     | prec (E_Var _) = atomP
130 : jhr 525 | prec (E_Int _) = atomP
131 :     | prec (E_Flt _) = atomP
132 :     | prec (E_Bool _) = atomP
133 : jhr 528 | prec (E_Str _) = atomP
134 : jhr 573 | prec (E_Sizeof _) = callP
135 : jhr 521 in
136 :     fun mkGrp e = if (prec e < atomP) then E_Grp e else e
137 : jhr 522 (* Note that all C binary operators are left associative. *)
138 : jhr 521 fun mkBinOp (e1, rator, e2) = let
139 :     val p = precOfBinop rator
140 :     val e1' = if prec e1 < p then E_Grp e1 else e1
141 :     val e2' = if prec e2 <= p then E_Grp e2 else e2
142 :     in
143 :     E_BinOp(e1', rator, e2')
144 :     end
145 :     fun mkUnOp (rator, e) = if prec e < unaryP
146 :     then E_UnOp(rator, E_Grp e)
147 :     else E_UnOp(rator, e)
148 : jhr 616 fun mkPostOp (e, rator) = if prec e < postP
149 :     then E_PostOp(E_Grp e, rator)
150 :     else E_PostOp(e, rator)
151 : jhr 521 fun mkApply (f, args) = E_Apply(f, args)
152 :     fun mkSubscript(e1, e2) = if prec e1 < postP
153 :     then E_Subscript(E_Grp e1, e2)
154 :     else E_Subscript(e1, e2)
155 :     fun mkSelect (e, f) = if prec e < postP
156 :     then E_Select(E_Grp e, f)
157 :     else E_Select(e, f)
158 : jhr 525 fun mkIndirect (e, f) = if prec e < postP
159 :     then E_Indirect(E_Grp e, f)
160 :     else E_Indirect(e, f)
161 : jhr 521 fun mkCast (ty, e) = E_Cast(ty, e)
162 :     val mkVar = E_Var
163 : jhr 525 val mkInt = E_Int
164 :     val mkFlt = E_Flt
165 :     val mkBool = E_Bool
166 : jhr 528 val mkStr = E_Str
167 : jhr 573 val mkSizeof = E_Sizeof
168 : jhr 521 end (* local *)
169 :    
170 : jhr 525 val skip = S_Block[]
171 : jhr 522
172 :     local
173 :     fun paren (e as E_Grp _) = e
174 :     | paren e = E_Grp e
175 :     in
176 : jhr 525 fun mkBlock [stm] = stm
177 :     | mkBlock stms = S_Block stms
178 : jhr 528 val mkDecl = S_Decl
179 : jhr 525 val mkAssign = S_Assign
180 : jhr 522 fun mkIfThenElse (e, b1, b2) = S_If(paren e, b1, b2)
181 :     fun mkIfThen (e, b) = mkIfThenElse (e, b, skip)
182 : jhr 617 val mkFor = S_For
183 : jhr 522 fun mkWhile (e, b) = S_While(paren e, b)
184 : jhr 554 val mkCall = S_Call
185 : jhr 562 val mkReturn = S_Return
186 : jhr 522 end (* local *)
187 :    
188 : jhr 525 (* utility functions *)
189 :    
190 :     fun varToString x = x
191 :    
192 :     fun binopToString rator = (case rator
193 :     of #|| => "||"
194 :     | #&& => "&&"
195 :     | #== => "=="
196 :     | #!= => "!="
197 :     | #< => "<"
198 :     | #<= => "<="
199 :     | #>= => ">="
200 :     | #> => ">"
201 :     | #+ => "+"
202 :     | #- => "-"
203 :     | #* => "*"
204 :     | #/ => "/"
205 :     | #% => "%"
206 :     (* end case *))
207 :    
208 :     fun unopToString rator = (case rator
209 :     of %- => "-"
210 :     | %! => "!"
211 :     | %& => "&"
212 :     | %* => "*"
213 :     | %~ => "~"
214 : jhr 616 | %++ => "++"
215 :     | %-- => "--"
216 : jhr 525 (* end case *))
217 :    
218 : jhr 616 fun postopToString rator = (case rator
219 :     of ^++ => "++"
220 :     | ^-- => "--"
221 :     (* end case *))
222 :    
223 : jhr 548 fun expToString e = let
224 :     fun e2s (e, l) = (case e
225 :     of E_Grp e => "(" :: e2s(e, ")"::l)
226 :     | E_BinOp(e1, rator, e2) => e2s(e1, binopToString rator :: e2s(e2, l))
227 :     | E_UnOp(rator, e) => unopToString rator :: e2s(e, l)
228 : jhr 616 | E_PostOp(e, rator) => e2s(e, postopToString rator :: l)
229 : jhr 548 | E_Apply(f, es) => let
230 :     fun args2s ([], l) = l
231 :     | args2s ([e], l) = e2s(e, l)
232 :     | args2s (e::es, l) = e2s(e, ","::args2s(es, l))
233 :     in
234 :     f :: "(" :: args2s(es, ")"::l)
235 :     end
236 :     | E_Subscript(e1, e2) => e2s(e1, "[" :: e2s(e2, "]"::l))
237 :     | E_Select(e, f) => e2s(e, "." :: f :: l)
238 :     | E_Indirect(e, f) => e2s(e, "->" :: f :: l)
239 :     | E_Cast(ty, e) => "(ty)" :: e2s(e, l) (* FIXME *)
240 :     | E_Var x => x::l
241 :     | E_Int(n, _) => IntegerLit.toString n :: l
242 :     | E_Flt(f, _) => FloatLit.toString f :: l
243 :     | E_Bool b => Bool.toString b :: l
244 :     | E_Str s => concat["\"", String.toCString s, "\""] :: l
245 : jhr 573 | E_Sizeof ty => "sizeof(ty)" :: l
246 : jhr 548 (* end case *))
247 :     in
248 :     String.concat(e2s(e, []))
249 :     end
250 :    
251 : jhr 520 end

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