@@ -237,18 +237,27 @@ fn T_task() -> TypeRef {
237
237
}
238
238
239
239
fn T_tydesc ( ) -> TypeRef {
240
+
241
+ auto th = mk_type_handle ( ) ;
242
+ auto abs_tydesc = llvm. LLVMResolveTypeHandle ( th. llth ) ;
243
+
240
244
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 ) ;
252
261
}
253
262
254
263
fn T_array ( TypeRef t, uint n) -> TypeRef {
@@ -960,8 +969,10 @@ fn make_tydesc(@crate_ctxt cx, @ty.t t) {
960
969
961
970
auto llty = type_of ( cx, t) ;
962
971
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 ( ) ) ) ,
965
976
llsize_of ( llty) ,
966
977
llalign_of ( llty) ,
967
978
take_glue, // take_glue_off
@@ -983,7 +994,9 @@ fn make_tydesc(@crate_ctxt cx, @ty.t t) {
983
994
984
995
fn make_generic_glue ( @crate_ctxt cx , @ty. t t , str name ,
985
996
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 ( ) ) ;
987
1000
988
1001
auto fn_name = cx. names . next ( "_rust_" + name) + "." + ty. ty_to_str ( t) ;
989
1002
fn_name = sanitize ( fn_name) ;
@@ -1001,7 +1014,7 @@ fn make_generic_glue(@crate_ctxt cx, @ty.t t, str name,
1001
1014
llty = type_of ( cx, t) ;
1002
1015
}
1003
1016
1004
- auto llrawptr = llvm. LLVMGetParam ( llfn, 1 u ) ;
1017
+ auto llrawptr = llvm. LLVMGetParam ( llfn, 2 u ) ;
1005
1018
auto llval = bcx. build . BitCast ( llrawptr, llty) ;
1006
1019
1007
1020
re = helper ( bcx, llval, t) ;
@@ -1097,19 +1110,13 @@ fn make_drop_glue(@block_ctxt cx, ValueRef v, @ty.t t) -> result {
1097
1110
cx. build . GEP ( body,
1098
1111
vec ( C_int ( 0 ) ,
1099
1112
C_int ( abi. obj_body_elt_fields ) ) ) ;
1100
- auto llrawptr = cx. build . BitCast ( fields, T_ptr ( T_i8 ( ) ) ) ;
1101
-
1102
1113
auto tydescptr =
1103
1114
cx. build . GEP ( body,
1104
1115
vec ( C_int ( 0 ) ,
1105
1116
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 ) ;
1113
1120
1114
1121
// Then free the body.
1115
1122
// 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 {
1141
1148
cx. build . GEP ( body,
1142
1149
vec ( C_int ( 0 ) ,
1143
1150
C_int ( abi. closure_elt_bindings ) ) ) ;
1144
- auto llrawptr = cx. build . BitCast ( bindings, T_ptr ( T_i8 ( ) ) ) ;
1145
1151
1146
1152
auto tydescptr =
1147
1153
cx. build . GEP ( body,
1148
1154
vec ( C_int ( 0 ) ,
1149
1155
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
+
1157
1160
1158
1161
// Then free the body.
1159
1162
// FIXME: switch gc/non-gc on layer of the type.
@@ -1469,15 +1472,28 @@ fn iter_sequence(@block_ctxt cx,
1469
1472
fail;
1470
1473
}
1471
1474
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
+
1472
1491
fn incr_all_refcnts( @block_ctxt cx,
1473
1492
ValueRef v,
1474
1493
@ty. t t) -> result {
1475
1494
1476
1495
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) ;
1481
1497
}
1482
1498
ret res( cx, C_nil ( ) ) ;
1483
1499
}
@@ -1499,10 +1515,7 @@ fn drop_ty(@block_ctxt cx,
1499
1515
@ty. t t) -> result {
1500
1516
1501
1517
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) ;
1506
1519
}
1507
1520
ret res( cx, C_nil ( ) ) ;
1508
1521
}
0 commit comments