1
Fork 0

rustc: First steps to determine whether tydescs escape

This commit is contained in:
Patrick Walton 2011-04-29 14:59:52 -07:00
parent 7b95b5c033
commit 1acf404361

View file

@ -1253,7 +1253,7 @@ fn dynamic_size_of(@block_ctxt cx, ty.t t) -> result {
alt (ty.struct(cx.fcx.lcx.ccx.tcx, t)) { alt (ty.struct(cx.fcx.lcx.ccx.tcx, t)) {
case (ty.ty_param(?p)) { case (ty.ty_param(?p)) {
auto szptr = field_of_tydesc(cx, t, abi.tydesc_field_size); auto szptr = field_of_tydesc(cx, t, false, abi.tydesc_field_size);
ret res(szptr.bcx, szptr.bcx.build.Load(szptr.val)); ret res(szptr.bcx, szptr.bcx.build.Load(szptr.val));
} }
case (ty.ty_tup(?elts)) { case (ty.ty_tup(?elts)) {
@ -1307,7 +1307,7 @@ fn dynamic_size_of(@block_ctxt cx, ty.t t) -> result {
fn dynamic_align_of(@block_ctxt cx, ty.t t) -> result { fn dynamic_align_of(@block_ctxt cx, ty.t t) -> result {
alt (ty.struct(cx.fcx.lcx.ccx.tcx, t)) { alt (ty.struct(cx.fcx.lcx.ccx.tcx, t)) {
case (ty.ty_param(?p)) { case (ty.ty_param(?p)) {
auto aptr = field_of_tydesc(cx, t, abi.tydesc_field_align); auto aptr = field_of_tydesc(cx, t, false, abi.tydesc_field_align);
ret res(aptr.bcx, aptr.bcx.build.Load(aptr.val)); ret res(aptr.bcx, aptr.bcx.build.Load(aptr.val));
} }
case (ty.ty_tup(?elts)) { case (ty.ty_tup(?elts)) {
@ -1525,8 +1525,9 @@ fn trans_malloc_boxed(@block_ctxt cx, ty.t t) -> result {
// Given a type and a field index into its corresponding type descriptor, // Given a type and a field index into its corresponding type descriptor,
// returns an LLVM ValueRef of that field from the tydesc, generating the // returns an LLVM ValueRef of that field from the tydesc, generating the
// tydesc if necessary. // tydesc if necessary.
fn field_of_tydesc(@block_ctxt cx, ty.t t, int field) -> result { fn field_of_tydesc(@block_ctxt cx, ty.t t, bool escapes, int field)
auto tydesc = get_tydesc(cx, t); -> result {
auto tydesc = get_tydesc(cx, t, escapes);
ret res(tydesc.bcx, ret res(tydesc.bcx,
tydesc.bcx.build.GEP(tydesc.val, vec(C_int(0), C_int(field)))); tydesc.bcx.build.GEP(tydesc.val, vec(C_int(0), C_int(field))));
} }
@ -1572,7 +1573,7 @@ fn linearize_ty_params(@block_ctxt cx, ty.t t) ->
ret tup(x.defs, x.vals); ret tup(x.defs, x.vals);
} }
fn get_tydesc(&@block_ctxt cx, ty.t t) -> result { fn get_tydesc(&@block_ctxt cx, ty.t t, bool escapes) -> result {
// Is the supplied type a type param? If so, return the passed-in tydesc. // Is the supplied type a type param? If so, return the passed-in tydesc.
alt (ty.type_param(cx.fcx.lcx.ccx.tcx, t)) { alt (ty.type_param(cx.fcx.lcx.ccx.tcx, t)) {
case (some[uint](?id)) { ret res(cx, cx.fcx.lltydescs.(id)); } case (some[uint](?id)) { ret res(cx, cx.fcx.lltydescs.(id)); }
@ -2703,8 +2704,8 @@ fn call_tydesc_glue_full(@block_ctxt cx, ValueRef v,
} }
fn call_tydesc_glue(@block_ctxt cx, ValueRef v, fn call_tydesc_glue(@block_ctxt cx, ValueRef v,
ty.t t, int field) -> result { ty.t t, bool escapes, int field) -> result {
auto td = get_tydesc(cx, t); auto td = get_tydesc(cx, t, escapes);
call_tydesc_glue_full(td.bcx, call_tydesc_glue_full(td.bcx,
spill_if_immediate(td.bcx, v, t), spill_if_immediate(td.bcx, v, t),
td.val, field); td.val, field);
@ -2732,7 +2733,10 @@ fn maybe_call_dtor(@block_ctxt cx, ValueRef v) -> @block_ctxt {
ret after_cx; ret after_cx;
} }
fn call_cmp_glue(@block_ctxt cx, ValueRef lhs, ValueRef rhs, ty.t t, fn call_cmp_glue(@block_ctxt cx,
ValueRef lhs,
ValueRef rhs,
ty.t t,
ValueRef llop) -> result { ValueRef llop) -> result {
// We can't use call_tydesc_glue_full() and friends here because compare // We can't use call_tydesc_glue_full() and friends here because compare
// glue has a special signature. // glue has a special signature.
@ -2743,7 +2747,7 @@ fn call_cmp_glue(@block_ctxt cx, ValueRef lhs, ValueRef rhs, ty.t t,
auto llrawlhsptr = cx.build.BitCast(lllhs, T_ptr(T_i8())); auto llrawlhsptr = cx.build.BitCast(lllhs, T_ptr(T_i8()));
auto llrawrhsptr = cx.build.BitCast(llrhs, T_ptr(T_i8())); auto llrawrhsptr = cx.build.BitCast(llrhs, T_ptr(T_i8()));
auto r = get_tydesc(cx, t); auto r = get_tydesc(cx, t, false);
auto lltydescs = auto lltydescs =
r.bcx.build.GEP(r.val, vec(C_int(0), r.bcx.build.GEP(r.val, vec(C_int(0),
C_int(abi.tydesc_field_first_param))); C_int(abi.tydesc_field_first_param)));
@ -2770,7 +2774,7 @@ fn call_cmp_glue(@block_ctxt cx, ValueRef lhs, ValueRef rhs, ty.t t,
fn take_ty(@block_ctxt cx, ValueRef v, ty.t t) -> result { fn take_ty(@block_ctxt cx, ValueRef v, ty.t t) -> result {
if (!ty.type_is_scalar(cx.fcx.lcx.ccx.tcx, t)) { if (!ty.type_is_scalar(cx.fcx.lcx.ccx.tcx, t)) {
ret call_tydesc_glue(cx, v, t, abi.tydesc_field_take_glue); ret call_tydesc_glue(cx, v, t, false, abi.tydesc_field_take_glue);
} }
ret res(cx, C_nil()); ret res(cx, C_nil());
} }
@ -2792,7 +2796,7 @@ fn drop_ty(@block_ctxt cx,
ty.t t) -> result { ty.t t) -> result {
if (!ty.type_is_scalar(cx.fcx.lcx.ccx.tcx, t)) { if (!ty.type_is_scalar(cx.fcx.lcx.ccx.tcx, t)) {
ret call_tydesc_glue(cx, v, t, abi.tydesc_field_drop_glue); ret call_tydesc_glue(cx, v, t, false, abi.tydesc_field_drop_glue);
} }
ret res(cx, C_nil()); ret res(cx, C_nil());
} }
@ -2822,7 +2826,7 @@ fn memcpy_ty(@block_ctxt cx,
ValueRef src, ValueRef src,
ty.t t) -> result { ty.t t) -> result {
if (ty.type_has_dynamic_size(cx.fcx.lcx.ccx.tcx, t)) { if (ty.type_has_dynamic_size(cx.fcx.lcx.ccx.tcx, t)) {
auto llszptr = field_of_tydesc(cx, t, abi.tydesc_field_size); auto llszptr = field_of_tydesc(cx, t, false, abi.tydesc_field_size);
auto llsz = llszptr.bcx.build.Load(llszptr.val); auto llsz = llszptr.bcx.build.Load(llszptr.val);
ret call_memcpy(llszptr.bcx, dst, src, llsz); ret call_memcpy(llszptr.bcx, dst, src, llsz);
@ -3084,10 +3088,10 @@ fn trans_vec_append(@block_ctxt cx, ty.t t,
auto bcx = cx; auto bcx = cx;
auto llvec_tydesc = get_tydesc(bcx, t); auto llvec_tydesc = get_tydesc(bcx, t, false);
bcx = llvec_tydesc.bcx; bcx = llvec_tydesc.bcx;
auto llelt_tydesc = get_tydesc(bcx, elt_ty); auto llelt_tydesc = get_tydesc(bcx, elt_ty, false);
bcx = llelt_tydesc.bcx; bcx = llelt_tydesc.bcx;
auto dst = bcx.build.PointerCast(lhs, T_ptr(T_opaque_vec_ptr())); auto dst = bcx.build.PointerCast(lhs, T_ptr(T_opaque_vec_ptr()));
@ -3976,7 +3980,8 @@ fn lval_generic_fn(@block_ctxt cx,
auto bcx = lv.res.bcx; auto bcx = lv.res.bcx;
let vec[ValueRef] tydescs = vec(); let vec[ValueRef] tydescs = vec();
for (ty.t t in tys) { for (ty.t t in tys) {
auto td = get_tydesc(bcx, t); // TODO: Doesn't always escape.
auto td = get_tydesc(bcx, t, true);
bcx = td.bcx; bcx = td.bcx;
_vec.push[ValueRef](tydescs, td.val); _vec.push[ValueRef](tydescs, td.val);
} }
@ -4542,7 +4547,7 @@ fn trans_bind(@block_ctxt cx, @ast.expr f,
bcx.build.GEP(closure, bcx.build.GEP(closure,
vec(C_int(0), vec(C_int(0),
C_int(abi.closure_elt_tydesc))); C_int(abi.closure_elt_tydesc)));
auto bindings_tydesc = get_tydesc(bcx, bindings_ty); auto bindings_tydesc = get_tydesc(bcx, bindings_ty, true);
bcx = bindings_tydesc.bcx; bcx = bindings_tydesc.bcx;
bcx.build.Store(bindings_tydesc.val, bound_tydesc); bcx.build.Store(bindings_tydesc.val, bound_tydesc);
@ -6329,7 +6334,15 @@ fn trans_obj(@local_ctxt cx, &ast._obj ob, ast.def_id oid,
vec(0, abi.obj_body_elt_tydesc)); vec(0, abi.obj_body_elt_tydesc));
bcx = body_tydesc.bcx; bcx = body_tydesc.bcx;
auto body_td = get_tydesc(bcx, body_ty); auto body_td = get_tydesc(bcx, body_ty, true);
auto dtor = C_null(T_ptr(T_glue_fn(ccx.tn)));
alt (ob.dtor) {
case (some[@ast.method](?d)) {
dtor = trans_dtor(cx, llself_ty, self_ty, ty_params, d);
}
case (none[@ast.method]) {}
}
bcx = body_td.bcx; bcx = body_td.bcx;
bcx.build.Store(body_td.val, body_tydesc.val); bcx.build.Store(body_td.val, body_tydesc.val);