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

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