@@ -1042,7 +1042,8 @@ fn get_simple_extern_fn(&hashmap[str, ValueRef] externs,
1042
1042
ret get_extern_fn ( externs, llmod, name, lib. llvm . LLVMCCallConv , t) ;
1043
1043
}
1044
1044
1045
- fn trans_upcall ( @block_ctxt cx , str name , vec[ ValueRef ] args ) -> result {
1045
+ fn trans_upcall ( @block_ctxt cx , str name , vec[ ValueRef ] args , bool pure)
1046
+ -> result {
1046
1047
auto cxx = cx. fcx . lcx . ccx ;
1047
1048
auto lltaskptr = cx. build . PtrToInt ( cx. fcx . lltaskptr , T_int ( ) ) ;
1048
1049
auto args2 = vec ( lltaskptr) + args;
@@ -1080,8 +1081,7 @@ fn trans_native_call(builder b, @glue_fns glues, ValueRef lltaskptr,
1080
1081
}
1081
1082
1082
1083
fn trans_non_gc_free ( @block_ctxt cx , ValueRef v) -> result {
1083
- ret trans_upcall ( cx, "upcall_free" , vec ( vp2i ( cx, v) ,
1084
- C_int ( 0 ) ) ) ;
1084
+ ret trans_upcall ( cx, "upcall_free" , vec ( vp2i ( cx, v) , C_int ( 0 ) ) , false ) ;
1085
1085
}
1086
1086
1087
1087
fn find_scope_cx ( @block_ctxt cx ) -> @block_ctxt {
@@ -1503,7 +1503,7 @@ fn trans_raw_malloc(@block_ctxt cx, TypeRef llptr_ty, ValueRef llsize)
1503
1503
-> result {
1504
1504
// FIXME: need a table to collect tydesc globals.
1505
1505
auto tydesc = C_int ( 0 ) ;
1506
- auto rslt = trans_upcall( cx, "upcall_malloc" , vec( llsize, tydesc) ) ;
1506
+ auto rslt = trans_upcall( cx, "upcall_malloc" , vec( llsize, tydesc) , false ) ;
1507
1507
rslt = res( rslt. bcx, vi2p( rslt. bcx, rslt. val, llptr_ty) ) ;
1508
1508
ret rslt;
1509
1509
}
@@ -1616,7 +1616,7 @@ fn get_tydesc(&@block_ctxt cx, ty.t t, bool escapes) -> result {
1616
1616
sz. val,
1617
1617
align. val,
1618
1618
C_int ( ( 1 u + n_params) as int) ,
1619
- vp2i( bcx, tydescs) ) ) ;
1619
+ vp2i( bcx, tydescs) ) , true ) ;
1620
1620
1621
1621
ret res( v. bcx, vi2p( v. bcx, v. val,
1622
1622
T_ptr ( T_tydesc ( cx. fcx. lcx. ccx. tn) ) ) ) ;
@@ -1886,7 +1886,7 @@ fn make_drop_glue(@block_ctxt cx, ValueRef v0, ty.t t) {
1886
1886
case ( ty. ty_port ( _) ) {
1887
1887
fn hit_zero ( @block_ctxt cx , ValueRef v) -> result {
1888
1888
ret trans_upcall ( cx, "upcall_del_port" ,
1889
- vec ( vp2i ( cx, v) ) ) ;
1889
+ vec ( vp2i ( cx, v) ) , true ) ;
1890
1890
}
1891
1891
auto v = cx. build . Load ( v0) ;
1892
1892
rslt = decr_refcnt_and_if_zero ( cx, v,
@@ -1898,7 +1898,7 @@ fn make_drop_glue(@block_ctxt cx, ValueRef v0, ty.t t) {
1898
1898
case ( ty. ty_chan ( _) ) {
1899
1899
fn hit_zero ( @block_ctxt cx , ValueRef v) -> result {
1900
1900
ret trans_upcall ( cx, "upcall_del_chan" ,
1901
- vec ( vp2i ( cx, v) ) ) ;
1901
+ vec ( vp2i ( cx, v) ) , true ) ;
1902
1902
}
1903
1903
auto v = cx. build . Load ( v0) ;
1904
1904
rslt = decr_refcnt_and_if_zero ( cx, v,
@@ -4940,7 +4940,8 @@ fn trans_vec(@block_ctxt cx, vec[@ast.expr] args,
4940
4940
unit_sz. val) ;
4941
4941
4942
4942
// FIXME: pass tydesc properly.
4943
- auto sub = trans_upcall( bcx, "upcall_new_vec" , vec( data_sz, C_int ( 0 ) ) ) ;
4943
+ auto sub = trans_upcall( bcx, "upcall_new_vec" , vec( data_sz, C_int ( 0 ) ) ,
4944
+ false ) ;
4944
4945
bcx = sub. bcx;
4945
4946
4946
4947
auto llty = type_of( bcx. fcx. lcx. ccx, t) ;
@@ -5301,14 +5302,16 @@ fn trans_log(int lvl, @block_ctxt cx, @ast.expr e) -> result {
5301
5302
if ( is32bit) {
5302
5303
auto uval = trans_upcall( sub. bcx,
5303
5304
"upcall_log_float" ,
5304
- vec( C_int ( lvl) , sub. val) ) ;
5305
+ vec( C_int ( lvl) , sub. val) ,
5306
+ false ) ;
5305
5307
uval. bcx. build. Br ( after_cx. llbb) ;
5306
5308
} else {
5307
5309
auto tmp = alloca( sub. bcx, tr) ;
5308
5310
sub. bcx. build. Store ( sub. val, tmp) ;
5309
5311
auto uval = trans_upcall( sub. bcx,
5310
5312
"upcall_log_double" ,
5311
- vec( C_int ( lvl) , vp2i( sub. bcx, tmp) ) ) ;
5313
+ vec( C_int ( lvl) , vp2i( sub. bcx, tmp) ) ,
5314
+ false ) ;
5312
5315
uval. bcx. build. Br ( after_cx. llbb) ;
5313
5316
}
5314
5317
} else {
@@ -5317,13 +5320,14 @@ fn trans_log(int lvl, @block_ctxt cx, @ast.expr e) -> result {
5317
5320
auto v = vp2i( sub. bcx, sub. val) ;
5318
5321
trans_upcall( sub. bcx,
5319
5322
"upcall_log_str" ,
5320
- vec( C_int ( lvl) , v) ) . bcx. build. Br ( after_cx. llbb) ;
5323
+ vec( C_int ( lvl) , v) ,
5324
+ false ) . bcx. build. Br ( after_cx. llbb) ;
5321
5325
}
5322
5326
case ( _) {
5323
5327
auto v = vec( C_int ( lvl) , sub. val) ;
5324
5328
trans_upcall( sub. bcx,
5325
5329
"upcall_log_int" ,
5326
- v) . bcx. build. Br ( after_cx. llbb) ;
5330
+ v, false ) . bcx. build. Br ( after_cx. llbb) ;
5327
5331
}
5328
5332
}
5329
5333
}
@@ -5364,7 +5368,7 @@ fn trans_fail(@block_ctxt cx, option.t[common.span] sp_opt, str fail_str)
5364
5368
5365
5369
auto args = vec( V_fail_str , V_filename , C_int ( V_line ) ) ;
5366
5370
5367
- auto sub = trans_upcall( cx, "upcall_fail" , args) ;
5371
+ auto sub = trans_upcall( cx, "upcall_fail" , args, false ) ;
5368
5372
sub. bcx. build. Unreachable ( ) ;
5369
5373
ret res( sub. bcx, C_nil ( ) ) ;
5370
5374
}
@@ -5511,7 +5515,7 @@ fn trans_port(@block_ctxt cx, ast.ann ann) -> result {
5511
5515
auto bcx = cx;
5512
5516
auto unit_sz = size_of( bcx, unit_ty) ;
5513
5517
bcx = unit_sz. bcx;
5514
- auto sub = trans_upcall( bcx, "upcall_new_port" , vec( unit_sz. val) ) ;
5518
+ auto sub = trans_upcall( bcx, "upcall_new_port" , vec( unit_sz. val) , false ) ;
5515
5519
bcx = sub. bcx;
5516
5520
auto llty = type_of( cx. fcx. lcx. ccx, t) ;
5517
5521
auto port_val = vi2p( bcx, sub. val, llty) ;
@@ -5528,7 +5532,7 @@ fn trans_chan(@block_ctxt cx, @ast.expr e, ast.ann ann) -> result {
5528
5532
bcx = prt. bcx;
5529
5533
5530
5534
auto prt_val = vp2i( bcx, prt. val) ;
5531
- auto sub = trans_upcall( bcx, "upcall_new_chan", vec( prt_val) ) ;
5535
+ auto sub = trans_upcall( bcx, "upcall_new_chan", vec( prt_val) , false ) ;
5532
5536
bcx = sub. bcx;
5533
5537
5534
5538
auto chan_ty = node_ann_type( bcx. fcx. lcx. ccx, ann) ;
@@ -5571,7 +5575,7 @@ fn trans_send(@block_ctxt cx, @ast.expr lhs, @ast.expr rhs,
5571
5575
5572
5576
auto sub = trans_upcall( bcx, "upcall_send" ,
5573
5577
vec( vp2i( bcx, chn. val) ,
5574
- vp2i( bcx, data_alloc. val) ) ) ;
5578
+ vp2i( bcx, data_alloc. val) ) , false ) ;
5575
5579
bcx = sub. bcx;
5576
5580
5577
5581
ret res( bcx, chn. val) ;
@@ -5599,7 +5603,7 @@ fn recv_val(@block_ctxt cx, ValueRef lhs, @ast.expr rhs,
5599
5603
5600
5604
auto sub = trans_upcall( bcx, "upcall_recv" ,
5601
5605
vec( vp2i( bcx, lhs) ,
5602
- vp2i( bcx, prt. val) ) ) ;
5606
+ vp2i( bcx, prt. val) ) , false ) ;
5603
5607
bcx = sub. bcx;
5604
5608
5605
5609
auto data_load = load_if_immediate( bcx, lhs, unit_ty) ;
@@ -7109,11 +7113,12 @@ fn declare_intrinsics(ModuleRef llmod) -> hashmap[str,ValueRef] {
7109
7113
7110
7114
7111
7115
fn trace_str ( @block_ctxt cx , str s) {
7112
- trans_upcall ( cx, "upcall_trace_str" , vec ( p2i ( C_cstr ( cx. fcx . lcx . ccx , s) ) ) ) ;
7116
+ trans_upcall ( cx, "upcall_trace_str" , vec ( p2i ( C_cstr ( cx. fcx . lcx . ccx , s) ) ) ,
7117
+ false ) ;
7113
7118
}
7114
7119
7115
7120
fn trace_word ( @block_ctxt cx , ValueRef v) {
7116
- trans_upcall ( cx, "upcall_trace_word" , vec ( v) ) ;
7121
+ trans_upcall ( cx, "upcall_trace_word" , vec ( v) , false ) ;
7117
7122
}
7118
7123
7119
7124
fn trace_ptr ( @block_ctxt cx , ValueRef v) {
@@ -7489,7 +7494,8 @@ fn trans_vec_append_glue(@local_ctxt cx) {
7489
7494
vec ( vp2i ( bcx, lldst_vec) ,
7490
7495
vec_fill_adjusted ( bcx, llsrc_vec, llskipnull) ,
7491
7496
vp2i ( bcx, llcopy_dst_ptr) ,
7492
- vp2i ( bcx, llvec_tydesc) ) ) ;
7497
+ vp2i ( bcx, llvec_tydesc) ) ,
7498
+ false ) ;
7493
7499
7494
7500
bcx = llnew_vec_res. bcx ;
7495
7501
auto llnew_vec = vi2p ( bcx, llnew_vec_res. val ,
0 commit comments