@@ -594,13 +594,7 @@ fn make_ty_info(@crate_ctxt cx, @typeck.ty ty) {
594
594
595
595
fn make_generic_glue ( @crate_ctxt cx , @typeck. ty t , str name ,
596
596
val_and_ty_fn helper) -> ValueRef {
597
- auto arg_t;
598
- if ( typeck. type_is_structural ( t) ) {
599
- arg_t = T_ptr ( type_of ( cx, t) ) ;
600
- } else {
601
- arg_t = type_of ( cx, t) ;
602
- }
603
- auto llfnty = T_fn ( vec ( T_taskptr ( ) , arg_t) , T_void ( ) ) ;
597
+ auto llfnty = T_fn ( vec ( T_taskptr ( ) , T_ptr ( T_i8 ( ) ) ) , T_void ( ) ) ;
604
598
605
599
auto fn_name = cx. names . next ( "_rust_" + name) + "." + typeck. ty_to_str ( t) ;
606
600
fn_name = sanitize ( fn_name) ;
@@ -609,11 +603,24 @@ fn make_generic_glue(@crate_ctxt cx, @typeck.ty t, str name,
609
603
auto fcx = new_fn_ctxt ( cx, fn_name, llfn) ;
610
604
auto bcx = new_top_block_ctxt ( fcx) ;
611
605
612
- auto llval = llvm. LLVMGetParam ( llfn, 1 u) ;
606
+ auto re;
607
+ if ( !typeck. type_is_scalar ( t) ) {
608
+ auto llty;
609
+ if ( typeck. type_is_structural ( t) ) {
610
+ llty = T_ptr ( type_of ( cx, t) ) ;
611
+ } else {
612
+ llty = type_of ( cx, t) ;
613
+ }
613
614
614
- auto res = helper ( bcx, llval, t) ;
615
+ auto llrawptr = llvm. LLVMGetParam ( llfn, 1 u) ;
616
+ auto llval = bcx. build . BitCast ( llrawptr, llty) ;
617
+
618
+ re = helper ( bcx, llval, t) ;
619
+ } else {
620
+ re = res ( bcx, C_nil ( ) ) ;
621
+ }
615
622
616
- res . bcx . build . RetVoid ( ) ;
623
+ re . bcx . build . RetVoid ( ) ;
617
624
ret llfn;
618
625
}
619
626
@@ -960,8 +967,11 @@ fn iter_sequence(@block_ctxt cx,
960
967
fn incr_all_refcnts( @block_ctxt cx,
961
968
ValueRef v,
962
969
@typeck. ty t) -> result {
963
- cx. build. FastCall ( get_ty_info( cx. fcx. ccx, t) . take_glue,
964
- vec( cx. fcx. lltaskptr, v) ) ;
970
+ if ( !typeck. type_is_scalar( t) ) {
971
+ auto llrawptr = cx. build. BitCast ( v, T_ptr ( T_i8 ( ) ) ) ;
972
+ cx. build. FastCall ( get_ty_info( cx. fcx. ccx, t) . take_glue,
973
+ vec( cx. fcx. lltaskptr, llrawptr) ) ;
974
+ }
965
975
ret res( cx, C_nil ( ) ) ;
966
976
}
967
977
@@ -980,8 +990,11 @@ fn drop_slot(@block_ctxt cx,
980
990
fn drop_ty( @block_ctxt cx,
981
991
ValueRef v,
982
992
@typeck. ty t) -> result {
983
- cx. build. FastCall ( get_ty_info( cx. fcx. ccx, t) . drop_glue,
984
- vec( cx. fcx. lltaskptr, v) ) ;
993
+ if ( !typeck. type_is_scalar( t) ) {
994
+ auto llrawptr = cx. build. BitCast ( v, T_ptr ( T_i8 ( ) ) ) ;
995
+ cx. build. FastCall ( get_ty_info( cx. fcx. ccx, t) . drop_glue,
996
+ vec( cx. fcx. lltaskptr, llrawptr) ) ;
997
+ }
985
998
ret res( cx, C_nil ( ) ) ;
986
999
}
987
1000
0 commit comments