diff options
| author | Patrick Walton <[email protected]> | 2011-04-29 15:39:10 -0700 |
|---|---|---|
| committer | Patrick Walton <[email protected]> | 2011-04-29 15:39:48 -0700 |
| commit | 593fb195a4c14252909745e6eec0d48a23061611 (patch) | |
| tree | 0bdce53c9e8c8dbfb0ae0077c4056875c2e65b38 /src | |
| parent | Un-XFAIL most library tests. (diff) | |
| download | rust-593fb195a4c14252909745e6eec0d48a23061611.tar.xz rust-593fb195a4c14252909745e6eec0d48a23061611.zip | |
rustc: Start threading a purity flag through upcalls
Diffstat (limited to 'src')
| -rw-r--r-- | src/comp/middle/trans.rs | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index e61768a1..cb6badf4 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -1042,7 +1042,8 @@ fn get_simple_extern_fn(&hashmap[str, ValueRef] externs, ret get_extern_fn(externs, llmod, name, lib.llvm.LLVMCCallConv, t); } -fn trans_upcall(@block_ctxt cx, str name, vec[ValueRef] args) -> result { +fn trans_upcall(@block_ctxt cx, str name, vec[ValueRef] args, bool pure) + -> result { auto cxx = cx.fcx.lcx.ccx; auto lltaskptr = cx.build.PtrToInt(cx.fcx.lltaskptr, T_int()); auto args2 = vec(lltaskptr) + args; @@ -1080,8 +1081,7 @@ fn trans_native_call(builder b, @glue_fns glues, ValueRef lltaskptr, } fn trans_non_gc_free(@block_ctxt cx, ValueRef v) -> result { - ret trans_upcall(cx, "upcall_free", vec(vp2i(cx, v), - C_int(0))); + ret trans_upcall(cx, "upcall_free", vec(vp2i(cx, v), C_int(0)), false); } 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) -> result { // FIXME: need a table to collect tydesc globals. auto tydesc = C_int(0); - auto rslt = trans_upcall(cx, "upcall_malloc", vec(llsize, tydesc)); + auto rslt = trans_upcall(cx, "upcall_malloc", vec(llsize, tydesc), false); rslt = res(rslt.bcx, vi2p(rslt.bcx, rslt.val, llptr_ty)); ret rslt; } @@ -1616,7 +1616,7 @@ fn get_tydesc(&@block_ctxt cx, ty.t t, bool escapes) -> result { sz.val, align.val, C_int((1u + n_params) as int), - vp2i(bcx, tydescs))); + vp2i(bcx, tydescs)), true); ret res(v.bcx, vi2p(v.bcx, v.val, 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) { case (ty.ty_port(_)) { fn hit_zero(@block_ctxt cx, ValueRef v) -> result { ret trans_upcall(cx, "upcall_del_port", - vec(vp2i(cx, v))); + vec(vp2i(cx, v)), true); } auto v = cx.build.Load(v0); rslt = decr_refcnt_and_if_zero(cx, v, @@ -1898,7 +1898,7 @@ fn make_drop_glue(@block_ctxt cx, ValueRef v0, ty.t t) { case (ty.ty_chan(_)) { fn hit_zero(@block_ctxt cx, ValueRef v) -> result { ret trans_upcall(cx, "upcall_del_chan", - vec(vp2i(cx, v))); + vec(vp2i(cx, v)), true); } auto v = cx.build.Load(v0); rslt = decr_refcnt_and_if_zero(cx, v, @@ -4940,7 +4940,8 @@ fn trans_vec(@block_ctxt cx, vec[@ast.expr] args, unit_sz.val); // FIXME: pass tydesc properly. - auto sub = trans_upcall(bcx, "upcall_new_vec", vec(data_sz, C_int(0))); + auto sub = trans_upcall(bcx, "upcall_new_vec", vec(data_sz, C_int(0)), + false); bcx = sub.bcx; 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 { if (is32bit) { auto uval = trans_upcall(sub.bcx, "upcall_log_float", - vec(C_int(lvl), sub.val)); + vec(C_int(lvl), sub.val), + false); uval.bcx.build.Br(after_cx.llbb); } else { auto tmp = alloca(sub.bcx, tr); sub.bcx.build.Store(sub.val, tmp); auto uval = trans_upcall(sub.bcx, "upcall_log_double", - vec(C_int(lvl), vp2i(sub.bcx, tmp))); + vec(C_int(lvl), vp2i(sub.bcx, tmp)), + false); uval.bcx.build.Br(after_cx.llbb); } } else { @@ -5317,13 +5320,14 @@ fn trans_log(int lvl, @block_ctxt cx, @ast.expr e) -> result { auto v = vp2i(sub.bcx, sub.val); trans_upcall(sub.bcx, "upcall_log_str", - vec(C_int(lvl), v)).bcx.build.Br(after_cx.llbb); + vec(C_int(lvl), v), + false).bcx.build.Br(after_cx.llbb); } case (_) { auto v = vec(C_int(lvl), sub.val); trans_upcall(sub.bcx, "upcall_log_int", - v).bcx.build.Br(after_cx.llbb); + v, false).bcx.build.Br(after_cx.llbb); } } } @@ -5364,7 +5368,7 @@ fn trans_fail(@block_ctxt cx, option.t[common.span] sp_opt, str fail_str) auto args = vec(V_fail_str, V_filename, C_int(V_line)); - auto sub = trans_upcall(cx, "upcall_fail", args); + auto sub = trans_upcall(cx, "upcall_fail", args, false); sub.bcx.build.Unreachable(); ret res(sub.bcx, C_nil()); } @@ -5511,7 +5515,7 @@ fn trans_port(@block_ctxt cx, ast.ann ann) -> result { auto bcx = cx; auto unit_sz = size_of(bcx, unit_ty); bcx = unit_sz.bcx; - auto sub = trans_upcall(bcx, "upcall_new_port", vec(unit_sz.val)); + auto sub = trans_upcall(bcx, "upcall_new_port", vec(unit_sz.val), false); bcx = sub.bcx; auto llty = type_of(cx.fcx.lcx.ccx, t); 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 { bcx = prt.bcx; auto prt_val = vp2i(bcx, prt.val); - auto sub = trans_upcall(bcx, "upcall_new_chan", vec(prt_val)); + auto sub = trans_upcall(bcx, "upcall_new_chan", vec(prt_val), false); bcx = sub.bcx; 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, auto sub = trans_upcall(bcx, "upcall_send", vec(vp2i(bcx, chn.val), - vp2i(bcx, data_alloc.val))); + vp2i(bcx, data_alloc.val)), false); bcx = sub.bcx; ret res(bcx, chn.val); @@ -5599,7 +5603,7 @@ fn recv_val(@block_ctxt cx, ValueRef lhs, @ast.expr rhs, auto sub = trans_upcall(bcx, "upcall_recv", vec(vp2i(bcx, lhs), - vp2i(bcx, prt.val))); + vp2i(bcx, prt.val)), false); bcx = sub.bcx; auto data_load = load_if_immediate(bcx, lhs, unit_ty); @@ -7109,11 +7113,12 @@ fn declare_intrinsics(ModuleRef llmod) -> hashmap[str,ValueRef] { fn trace_str(@block_ctxt cx, str s) { - trans_upcall(cx, "upcall_trace_str", vec(p2i(C_cstr(cx.fcx.lcx.ccx, s)))); + trans_upcall(cx, "upcall_trace_str", vec(p2i(C_cstr(cx.fcx.lcx.ccx, s))), + false); } fn trace_word(@block_ctxt cx, ValueRef v) { - trans_upcall(cx, "upcall_trace_word", vec(v)); + trans_upcall(cx, "upcall_trace_word", vec(v), false); } fn trace_ptr(@block_ctxt cx, ValueRef v) { @@ -7489,7 +7494,8 @@ fn trans_vec_append_glue(@local_ctxt cx) { vec(vp2i(bcx, lldst_vec), vec_fill_adjusted(bcx, llsrc_vec, llskipnull), vp2i(bcx, llcopy_dst_ptr), - vp2i(bcx, llvec_tydesc))); + vp2i(bcx, llvec_tydesc)), + false); bcx = llnew_vec_res.bcx; auto llnew_vec = vi2p(bcx, llnew_vec_res.val, |