@@ -27,6 +27,7 @@ import syntax::ast;
27
27
import driver:: session;
28
28
import middle:: ty;
29
29
import middle:: freevars:: * ;
30
+ import middle:: gc;
30
31
import back:: link;
31
32
import back:: x86;
32
33
import back:: abi;
@@ -5634,24 +5635,29 @@ fn lldynamicallocas_block_ctxt(fcx: &@fn_ctxt) -> @block_ctxt {
5634
5635
5635
5636
5636
5637
fn alloc_ty ( cx : & @block_ctxt , t : & ty:: t ) -> result {
5638
+ let bcx = cx;
5637
5639
let val = C_int ( 0 ) ;
5638
- if ty:: type_has_dynamic_size ( bcx_tcx ( cx ) , t) {
5640
+ if ty:: type_has_dynamic_size ( bcx_tcx ( bcx ) , t) {
5639
5641
// NB: we have to run this particular 'size_of' in a
5640
5642
// block_ctxt built on the llderivedtydescs block for the fn,
5641
5643
// so that the size dominates the array_alloca that
5642
5644
// comes next.
5643
5645
5644
- let n = size_of ( llderivedtydescs_block_ctxt ( cx. fcx ) , t) ;
5645
- cx. fcx . llderivedtydescs = n. bcx . llbb ;
5646
- val = array_alloca ( cx, T_i8 ( ) , n. val ) ;
5647
- } else { val = alloca ( cx, type_of ( bcx_ccx ( cx) , cx. sp , t) ) ; }
5646
+ let n = size_of ( llderivedtydescs_block_ctxt ( bcx. fcx ) , t) ;
5647
+ bcx. fcx . llderivedtydescs = n. bcx . llbb ;
5648
+ val = array_alloca ( bcx, T_i8 ( ) , n. val ) ;
5649
+ } else {
5650
+ val = alloca ( bcx, type_of ( bcx_ccx ( cx) , cx. sp , t) ) ;
5651
+ }
5648
5652
// NB: since we've pushed all size calculations in this
5649
5653
// function up to the alloca block, we actually return the
5650
5654
// block passed into us unmodified; it doesn't really
5651
5655
// have to be passed-and-returned here, but it fits
5652
5656
// past caller conventions and may well make sense again,
5653
5657
// so we leave it as-is.
5654
5658
5659
+ bcx = gc:: add_gc_root ( bcx, val, t) ;
5660
+
5655
5661
ret rslt( cx, val) ;
5656
5662
}
5657
5663
@@ -6756,9 +6762,6 @@ fn declare_intrinsics(llmod: ModuleRef) -> hashmap[str, ValueRef] {
6756
6762
let T_memset64_args : [ TypeRef ] =
6757
6763
~[ T_ptr ( T_i8 ( ) ) , T_i8 ( ) , T_i64 ( ) , T_i32 ( ) , T_i1 ( ) ] ;
6758
6764
let T_trap_args : [ TypeRef ] = ~[ ] ;
6759
- let gcroot =
6760
- decl_cdecl_fn ( llmod, "llvm.gcroot" ,
6761
- T_fn ( ~[ T_ptr ( T_ptr ( T_i8 ( ) ) ) , T_ptr ( T_i8 ( ) ) ] , T_void ( ) ) ) ;
6762
6765
let gcread =
6763
6766
decl_cdecl_fn ( llmod, "llvm.gcread" ,
6764
6767
T_fn ( ~[ T_ptr ( T_i8 ( ) ) , T_ptr ( T_ptr ( T_i8 ( ) ) ) ] , T_void ( ) ) ) ;
@@ -6776,7 +6779,6 @@ fn declare_intrinsics(llmod: ModuleRef) -> hashmap[str, ValueRef] {
6776
6779
T_fn ( T_memset64_args , T_void ( ) ) ) ;
6777
6780
let trap = decl_cdecl_fn ( llmod, "llvm.trap" , T_fn ( T_trap_args , T_void ( ) ) ) ;
6778
6781
let intrinsics = new_str_hash[ ValueRef ] ( ) ;
6779
- intrinsics. insert ( "llvm.gcroot" , gcroot) ;
6780
6782
intrinsics. insert ( "llvm.gcread" , gcread) ;
6781
6783
intrinsics. insert ( "llvm.memmove.p0i8.p0i8.i32" , memmove32) ;
6782
6784
intrinsics. insert ( "llvm.memmove.p0i8.p0i8.i64" , memmove64) ;
0 commit comments