@@ -159,6 +159,14 @@ fn C_integral(int i, TypeRef t) -> ValueRef {
159
159
ret llvm. LLVMConstIntOfString ( t, _str. buf ( istr ( i) ) , 10 ) ;
160
160
}
161
161
162
+ fn C_bool ( bool b) -> ValueRef {
163
+ if ( b) {
164
+ ret C_integral ( 1 , T_i8 ( ) ) ;
165
+ } else {
166
+ ret C_integral ( 0 , T_i8 ( ) ) ;
167
+ }
168
+ }
169
+
162
170
fn C_int ( int i) -> ValueRef {
163
171
ret C_integral ( i, T_int ( ) ) ;
164
172
}
@@ -237,33 +245,148 @@ fn trans_upcall(@block_ctxt cx, str name, vec[ValueRef] args) -> ValueRef {
237
245
ret cx. build. Call ( llglue, call_args) ;
238
246
}
239
247
248
+ fn trans_lit( @block_ctxt cx, & ast. lit lit) -> ValueRef {
249
+ alt ( lit) {
250
+ case ( ast. lit_int( ?i) ) {
251
+ ret C_int ( i) ;
252
+ }
253
+ case ( ast. lit_uint( ?u) ) {
254
+ ret C_int ( u as int) ;
255
+ }
256
+ case ( ast. lit_char( ?c) ) {
257
+ ret C_integral ( c as int, T_i32 ( ) ) ;
258
+ }
259
+ case ( ast. lit_bool( ?b) ) {
260
+ ret C_bool ( b) ;
261
+ }
262
+ case ( ast. lit_str( ?s) ) {
263
+ auto len = ( _str. byte_len( s) as int) + 1 ;
264
+ ret trans_upcall( cx, "upcall_new_str" ,
265
+ vec( p2i( C_str ( cx. fcx. tcx, s) ) ,
266
+ C_int ( len) ) ) ;
267
+ }
268
+ }
269
+ }
270
+
271
+ fn trans_unary( @block_ctxt cx, ast. unop op, & ast. expr e) -> ValueRef {
272
+ alt ( op) {
273
+ case ( ast. bitnot) {
274
+ ret cx. build. Not ( trans_expr( cx, e) ) ;
275
+ }
276
+ case ( ast. not) {
277
+ ret cx. build. And ( C_bool ( true ) ,
278
+ cx. build. Not ( trans_expr( cx, e) ) ) ;
279
+ }
280
+ case ( ast. neg) {
281
+ // FIXME: switch by signedness.
282
+ ret cx. build. Neg ( trans_expr( cx, e) ) ;
283
+ }
284
+
285
+ }
286
+ cx. fcx. tcx. sess. unimpl( "expr variant in trans_unary" ) ;
287
+ fail;
288
+ }
289
+
290
+ fn trans_binary( @block_ctxt cx, ast. binop op,
291
+ & ast. expr a, & ast. expr b) -> ValueRef {
292
+ alt ( op) {
293
+ case ( ast. add) {
294
+ ret cx. build. Add ( trans_expr( cx, a) , trans_expr( cx, b) ) ;
295
+ }
296
+
297
+ case ( ast. sub) {
298
+ ret cx. build. Sub ( trans_expr( cx, a) , trans_expr( cx, b) ) ;
299
+ }
300
+
301
+ case ( ast. mul) {
302
+ // FIXME: switch by signedness.
303
+ ret cx. build. Mul ( trans_expr( cx, a) , trans_expr( cx, b) ) ;
304
+ }
305
+
306
+ case ( ast. div) {
307
+ // FIXME: switch by signedness.
308
+ ret cx. build. SDiv ( trans_expr( cx, a) , trans_expr( cx, b) ) ;
309
+ }
310
+
311
+ case ( ast. rem) {
312
+ // FIXME: switch by signedness.
313
+ ret cx. build. SRem ( trans_expr( cx, a) , trans_expr( cx, b) ) ;
314
+ }
315
+
316
+ case ( ast. bitor) {
317
+ ret cx. build. Or ( trans_expr( cx, a) , trans_expr( cx, b) ) ;
318
+ }
319
+
320
+ case ( ast. bitand) {
321
+ ret cx. build. And ( trans_expr( cx, a) , trans_expr( cx, b) ) ;
322
+ }
323
+
324
+ case ( ast. bitxor) {
325
+ ret cx. build. Xor ( trans_expr( cx, a) , trans_expr( cx, b) ) ;
326
+ }
327
+
328
+ case ( ast. lsl) {
329
+ ret cx. build. Shl ( trans_expr( cx, a) , trans_expr( cx, b) ) ;
330
+ }
331
+
332
+ case ( ast. lsr) {
333
+ ret cx. build. LShr ( trans_expr( cx, a) , trans_expr( cx, b) ) ;
334
+ }
335
+
336
+ case ( ast. asr) {
337
+ ret cx. build. AShr ( trans_expr( cx, a) , trans_expr( cx, b) ) ;
338
+ }
339
+
340
+ case ( ast. eq) {
341
+ ret cx. build. ICmp ( lib. llvm. LLVMIntEQ ,
342
+ trans_expr( cx, a) , trans_expr( cx, b) ) ;
343
+ }
344
+
345
+ case ( ast. ne) {
346
+ ret cx. build. ICmp ( lib. llvm. LLVMIntNE ,
347
+ trans_expr( cx, a) , trans_expr( cx, b) ) ;
348
+ }
349
+
350
+ case ( ast. lt) {
351
+ // FIXME: switch by signedness.
352
+ ret cx. build. ICmp ( lib. llvm. LLVMIntSLT ,
353
+ trans_expr( cx, a) , trans_expr( cx, b) ) ;
354
+ }
355
+
356
+ case ( ast. le) {
357
+ // FIXME: switch by signedness.
358
+ ret cx. build. ICmp ( lib. llvm. LLVMIntSLE ,
359
+ trans_expr( cx, a) , trans_expr( cx, b) ) ;
360
+ }
361
+
362
+ case ( ast. ge) {
363
+ // FIXME: switch by signedness.
364
+ ret cx. build. ICmp ( lib. llvm. LLVMIntSGE ,
365
+ trans_expr( cx, a) , trans_expr( cx, b) ) ;
366
+ }
367
+
368
+ case ( ast. gt) {
369
+ // FIXME: switch by signedness.
370
+ ret cx. build. ICmp ( lib. llvm. LLVMIntSGT ,
371
+ trans_expr( cx, a) , trans_expr( cx, b) ) ;
372
+ }
373
+ }
374
+ cx. fcx. tcx. sess. unimpl( "expr variant in trans_binary" ) ;
375
+ fail;
376
+ }
377
+
240
378
fn trans_expr( @block_ctxt cx, & ast. expr e) -> ValueRef {
241
379
alt ( e) {
242
380
case ( ast. expr_lit( ?lit) ) {
243
- alt ( * lit) {
244
- case ( ast. lit_int( ?i) ) {
245
- ret C_int ( i) ;
246
- }
247
- case ( ast. lit_uint( ?u) ) {
248
- ret C_int ( u as int) ;
249
- }
250
- case ( ast. lit_char( ?c) ) {
251
- ret C_integral ( c as int, T_i32 ( ) ) ;
252
- }
253
- case ( ast. lit_bool( ?b) ) {
254
- if ( b) {
255
- ret C_integral ( 1 , T_i8 ( ) ) ;
256
- } else {
257
- ret C_integral ( 0 , T_i8 ( ) ) ;
258
- }
259
- }
260
- case ( ast. lit_str( ?s) ) {
261
- auto len = ( _str. byte_len( s) as int) + 1 ;
262
- ret trans_upcall( cx, "upcall_new_str" ,
263
- vec( p2i( C_str ( cx. fcx. tcx, s) ) ,
264
- C_int ( len) ) ) ;
265
- }
266
- }
381
+ ret trans_lit( cx, * lit) ;
382
+ }
383
+
384
+ case ( ast. expr_unary( ?op, ?x) ) {
385
+ ret trans_unary( cx, op, * x) ;
386
+ }
387
+
388
+ case ( ast. expr_binary( ?op, ?x, ?y) ) {
389
+ ret trans_binary( cx, op, * x, * y) ;
267
390
}
268
391
}
269
392
cx. fcx. tcx. sess. unimpl( "expr variant in trans_expr" ) ;
@@ -285,7 +408,8 @@ fn trans_log(@block_ctxt cx, &ast.expr e) {
285
408
}
286
409
}
287
410
case ( _) {
288
- cx. fcx. tcx. sess. unimpl( "expr variant in trans_log" ) ;
411
+ auto v = trans_expr( cx, e) ;
412
+ trans_upcall( cx, "upcall_log_int" , vec( v) ) ;
289
413
}
290
414
}
291
415
}
0 commit comments