Skip to content

Commit 00fb0ac

Browse files
committed
---
yaml --- r: 1314 b: refs/heads/master c: ea42911 h: refs/heads/master v: v3
1 parent 490a79b commit 00fb0ac

File tree

2 files changed

+54
-41
lines changed

2 files changed

+54
-41
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 65f0f8e64d9dd5310a6f4692fb6e223df5861689
2+
refs/heads/master: ea42911561842b4331c3fa5a5a30b97497cbf871

trunk/src/comp/middle/trans.rs

Lines changed: 53 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -237,18 +237,27 @@ fn T_task() -> TypeRef {
237237
}
238238

239239
fn T_tydesc() -> TypeRef {
240+
241+
auto th = mk_type_handle();
242+
auto abs_tydesc = llvm.LLVMResolveTypeHandle(th.llth);
243+
240244
auto pvoid = T_ptr(T_i8());
241-
auto glue_fn_ty = T_ptr(T_fn(vec(T_taskptr(), pvoid), T_void()));
242-
ret T_struct(vec(pvoid, // first_param
243-
T_int(), // size
244-
T_int(), // align
245-
glue_fn_ty, // take_glue_off
246-
glue_fn_ty, // drop_glue_off
247-
glue_fn_ty, // free_glue_off
248-
glue_fn_ty, // sever_glue_off
249-
glue_fn_ty, // mark_glue_off
250-
glue_fn_ty, // obj_drop_glue_off
251-
glue_fn_ty)); // is_stateful
245+
auto glue_fn_ty = T_ptr(T_fn(vec(T_taskptr(),
246+
T_ptr(abs_tydesc),
247+
pvoid), T_void()));
248+
auto tydesc = T_struct(vec(T_ptr(abs_tydesc), // first_param
249+
T_int(), // size
250+
T_int(), // align
251+
glue_fn_ty, // take_glue_off
252+
glue_fn_ty, // drop_glue_off
253+
glue_fn_ty, // free_glue_off
254+
glue_fn_ty, // sever_glue_off
255+
glue_fn_ty, // mark_glue_off
256+
glue_fn_ty, // obj_drop_glue_off
257+
glue_fn_ty)); // is_stateful
258+
259+
llvm.LLVMRefineType(abs_tydesc, tydesc);
260+
ret llvm.LLVMResolveTypeHandle(th.llth);
252261
}
253262

254263
fn T_array(TypeRef t, uint n) -> TypeRef {
@@ -960,8 +969,10 @@ fn make_tydesc(@crate_ctxt cx, @ty.t t) {
960969

961970
auto llty = type_of(cx, t);
962971
auto pvoid = T_ptr(T_i8());
963-
auto glue_fn_ty = T_ptr(T_fn(vec(T_taskptr(), pvoid), T_void()));
964-
auto tydesc = C_struct(vec(C_null(pvoid),
972+
auto glue_fn_ty = T_ptr(T_fn(vec(T_taskptr(),
973+
T_ptr(T_tydesc()),
974+
pvoid), T_void()));
975+
auto tydesc = C_struct(vec(C_null(T_ptr(T_tydesc())),
965976
llsize_of(llty),
966977
llalign_of(llty),
967978
take_glue, // take_glue_off
@@ -983,7 +994,9 @@ fn make_tydesc(@crate_ctxt cx, @ty.t t) {
983994

984995
fn make_generic_glue(@crate_ctxt cx, @ty.t t, str name,
985996
val_and_ty_fn helper) -> ValueRef {
986-
auto llfnty = T_fn(vec(T_taskptr(), T_ptr(T_i8())), T_void());
997+
auto llfnty = T_fn(vec(T_taskptr(),
998+
T_ptr(T_tydesc()),
999+
T_ptr(T_i8())), T_void());
9871000

9881001
auto fn_name = cx.names.next("_rust_" + name) + "." + ty.ty_to_str(t);
9891002
fn_name = sanitize(fn_name);
@@ -1001,7 +1014,7 @@ fn make_generic_glue(@crate_ctxt cx, @ty.t t, str name,
10011014
llty = type_of(cx, t);
10021015
}
10031016

1004-
auto llrawptr = llvm.LLVMGetParam(llfn, 1u);
1017+
auto llrawptr = llvm.LLVMGetParam(llfn, 2u);
10051018
auto llval = bcx.build.BitCast(llrawptr, llty);
10061019

10071020
re = helper(bcx, llval, t);
@@ -1097,19 +1110,13 @@ fn make_drop_glue(@block_ctxt cx, ValueRef v, @ty.t t) -> result {
10971110
cx.build.GEP(body,
10981111
vec(C_int(0),
10991112
C_int(abi.obj_body_elt_fields)));
1100-
auto llrawptr = cx.build.BitCast(fields, T_ptr(T_i8()));
1101-
11021113
auto tydescptr =
11031114
cx.build.GEP(body,
11041115
vec(C_int(0),
11051116
C_int(abi.obj_body_elt_tydesc)));
1106-
auto tydesc = cx.build.Load(tydescptr);
1107-
auto llfnptr =
1108-
cx.build.GEP(tydesc,
1109-
vec(C_int(0),
1110-
C_int(abi.tydesc_field_drop_glue_off)));
1111-
auto llfn = cx.build.Load(llfnptr);
1112-
cx.build.FastCall(llfn, vec(cx.fcx.lltaskptr, llrawptr));
1117+
1118+
call_tydesc_glue_full(cx, fields, cx.build.Load(tydescptr),
1119+
abi.tydesc_field_drop_glue_off);
11131120

11141121
// Then free the body.
11151122
// FIXME: switch gc/non-gc on layer of the type.
@@ -1141,19 +1148,15 @@ fn make_drop_glue(@block_ctxt cx, ValueRef v, @ty.t t) -> result {
11411148
cx.build.GEP(body,
11421149
vec(C_int(0),
11431150
C_int(abi.closure_elt_bindings)));
1144-
auto llrawptr = cx.build.BitCast(bindings, T_ptr(T_i8()));
11451151

11461152
auto tydescptr =
11471153
cx.build.GEP(body,
11481154
vec(C_int(0),
11491155
C_int(abi.closure_elt_tydesc)));
1150-
auto tydesc = cx.build.Load(tydescptr);
1151-
auto llfnptr =
1152-
cx.build.GEP(tydesc,
1153-
vec(C_int(0),
1154-
C_int(abi.tydesc_field_drop_glue_off)));
1155-
auto llfn = cx.build.Load(llfnptr);
1156-
cx.build.FastCall(llfn, vec(cx.fcx.lltaskptr, llrawptr));
1156+
1157+
call_tydesc_glue_full(cx, bindings, cx.build.Load(tydescptr),
1158+
abi.tydesc_field_drop_glue_off);
1159+
11571160

11581161
// Then free the body.
11591162
// FIXME: switch gc/non-gc on layer of the type.
@@ -1469,15 +1472,28 @@ fn iter_sequence(@block_ctxt cx,
14691472
fail;
14701473
}
14711474

1475+
fn call_tydesc_glue_full(@block_ctxt cx, ValueRef v,
1476+
ValueRef tydesc, int field) {
1477+
auto llrawptr = cx.build.BitCast(v, T_ptr(T_i8()));
1478+
auto lltydescs = cx.build.GEP(tydesc,
1479+
vec(C_int(0),
1480+
C_int(abi.tydesc_field_first_param)));
1481+
lltydescs = cx.build.Load(lltydescs);
1482+
auto llfnptr = cx.build.GEP(tydesc, vec(C_int(0), C_int(field)));
1483+
auto llfn = cx.build.Load(llfnptr);
1484+
cx.build.FastCall(llfn, vec(cx.fcx.lltaskptr, lltydescs, llrawptr));
1485+
}
1486+
1487+
fn call_tydesc_glue(@block_ctxt cx, ValueRef v, @ty.t t, int field) {
1488+
call_tydesc_glue_full(cx, v, get_tydesc(cx, t), field);
1489+
}
1490+
14721491
fn incr_all_refcnts(@block_ctxt cx,
14731492
ValueRef v,
14741493
@ty.t t) -> result {
14751494

14761495
if (!ty.type_is_scalar(t)) {
1477-
auto llrawptr = cx.build.BitCast(v, T_ptr(T_i8()));
1478-
auto llfnptr = field_of_tydesc(cx, t, abi.tydesc_field_take_glue_off);
1479-
auto llfn = cx.build.Load(llfnptr);
1480-
cx.build.FastCall(llfn, vec(cx.fcx.lltaskptr, llrawptr));
1496+
call_tydesc_glue(cx, v, t, abi.tydesc_field_take_glue_off);
14811497
}
14821498
ret res(cx, C_nil());
14831499
}
@@ -1499,10 +1515,7 @@ fn drop_ty(@block_ctxt cx,
14991515
@ty.t t) -> result {
15001516

15011517
if (!ty.type_is_scalar(t)) {
1502-
auto llrawptr = cx.build.BitCast(v, T_ptr(T_i8()));
1503-
auto llfnptr = field_of_tydesc(cx, t, abi.tydesc_field_drop_glue_off);
1504-
auto llfn = cx.build.Load(llfnptr);
1505-
cx.build.FastCall(llfn, vec(cx.fcx.lltaskptr, llrawptr));
1518+
call_tydesc_glue(cx, v, t, abi.tydesc_field_drop_glue_off);
15061519
}
15071520
ret res(cx, C_nil());
15081521
}

0 commit comments

Comments
 (0)