@@ -6737,6 +6737,10 @@ fn decl_native_fn_and_pair(@crate_ctxt ccx,
6737
6737
arg_n += 1 u;
6738
6738
}
6739
6739
}
6740
+ case ( ast. native_abi_rust_intrinsic) {
6741
+ pass_task = true ;
6742
+ call_args += vec( lltaskptr) ;
6743
+ }
6740
6744
case ( ast. native_abi_cdecl) {
6741
6745
pass_task = false ;
6742
6746
}
@@ -6772,46 +6776,69 @@ fn decl_native_fn_and_pair(@crate_ctxt ccx,
6772
6776
args += vec( vp2i( cx, v) ) ;
6773
6777
}
6774
6778
6775
- auto r ;
6776
- auto rptr ;
6777
- auto args = ty. ty_fn_args ( ccx . tcx , fn_type ) ;
6778
- if ( abi == ast . native_abi_llvm ) {
6779
- let vec [ ValueRef ] call_args = vec ( ) ;
6779
+ fn trans_simple_native_abi ( @block_ctxt bcx ,
6780
+ str name ,
6781
+ vec [ ty. arg ] args ,
6782
+ & mutable vec [ ValueRef ] call_args ,
6783
+ ty . t fn_type ) -> tup ( ValueRef , ValueRef ) {
6780
6784
let vec[ TypeRef ] call_arg_tys = vec( ) ;
6781
6785
auto i = 0 u;
6782
6786
while ( i < _vec. len[ ty. arg ] ( args ) ) {
6783
- auto call_arg = llvm. LLVMGetParam ( fcx. llfn , i + 3 u) ;
6787
+ auto call_arg = llvm. LLVMGetParam ( bcx . fcx . llfn , i + 3 u) ;
6784
6788
call_args += vec ( call_arg) ;
6785
6789
call_arg_tys += vec ( val_ty ( call_arg) ) ;
6786
6790
i += 1 u;
6787
6791
}
6788
- auto llnativefnty = T_fn ( call_arg_tys,
6789
- type_of ( ccx,
6790
- ty. ty_fn_ret ( ccx. tcx , fn_type) ) ) ;
6791
- auto llnativefn = get_extern_fn ( ccx. externs , ccx. llmod , name,
6792
- lib. llvm . LLVMCCallConv , llnativefnty) ;
6793
- r = bcx. build . Call ( llnativefn, call_args) ;
6794
- rptr = fcx. llretptr ;
6795
- } else {
6792
+ auto llnativefnty =
6793
+ T_fn ( call_arg_tys,
6794
+ type_of ( bcx. fcx . lcx . ccx ,
6795
+ ty. ty_fn_ret ( bcx. fcx . lcx . ccx . tcx , fn_type) ) ) ;
6796
+ auto llnativefn = get_extern_fn ( bcx. fcx . lcx . ccx . externs ,
6797
+ bcx. fcx . lcx . ccx . llmod ,
6798
+ name,
6799
+ lib. llvm . LLVMCCallConv ,
6800
+ llnativefnty) ;
6796
6801
6797
- let vec[ tup( ValueRef , ty. t) ] drop_args = vec ( ) ;
6802
+ auto r = bcx. build . Call ( llnativefn, call_args) ;
6803
+ auto rptr = bcx. fcx . llretptr ;
6804
+ ret tup( r, rptr) ;
6805
+ }
6798
6806
6799
- for ( ty. arg arg in args ) {
6800
- auto llarg = llvm. LLVMGetParam ( fcx. llfn , arg_n) ;
6801
- assert ( llarg as int != 0 ) ;
6802
- push_arg ( bcx, call_args, llarg, arg. ty , arg. mode ) ;
6803
- if ( arg. mode == ast. val ) {
6804
- drop_args += vec ( tup ( llarg, arg. ty ) ) ;
6805
- }
6806
- arg_n += 1 u;
6807
+ auto r;
6808
+ auto rptr;
6809
+ auto args = ty. ty_fn_args ( ccx. tcx , fn_type) ;
6810
+ alt ( abi) {
6811
+ case ( ast. native_abi_llvm ) {
6812
+ auto result = trans_simple_native_abi ( bcx, name, args, call_args,
6813
+ fn_type) ;
6814
+ r = result. _0 ; rptr = result. _1 ;
6815
+ }
6816
+ case ( ast. native_abi_rust_intrinsic ) {
6817
+ auto result = trans_simple_native_abi ( bcx, name, args, call_args,
6818
+ fn_type) ;
6819
+ r = result. _0 ; rptr = result. _1 ;
6807
6820
}
6821
+ case ( _) {
6822
+ let vec[ tup ( ValueRef , ty. t ) ] drop_args = vec ( ) ;
6808
6823
6809
- r = trans_native_call ( bcx. build , ccx. glues , lltaskptr, ccx. externs ,
6810
- ccx. tn , ccx. llmod , name, pass_task, call_args) ;
6811
- rptr = bcx. build . BitCast ( fcx. llretptr , T_ptr ( T_i32 ( ) ) ) ;
6824
+ for ( ty. arg arg in args) {
6825
+ auto llarg = llvm. LLVMGetParam ( fcx. llfn, arg_n) ;
6826
+ assert ( llarg as int != 0 ) ;
6827
+ push_arg( bcx, call_args, llarg, arg. ty, arg. mode) ;
6828
+ if ( arg. mode == ast. val) {
6829
+ drop_args += vec( tup( llarg, arg. ty) ) ;
6830
+ }
6831
+ arg_n += 1 u;
6832
+ }
6812
6833
6813
- for ( tup( ValueRef , ty. t) d in drop_args) {
6814
- bcx = drop_ty ( bcx, d. _0 , d. _1 ) . bcx ;
6834
+ r = trans_native_call( bcx. build, ccx. glues, lltaskptr,
6835
+ ccx. externs, ccx. tn, ccx. llmod, name,
6836
+ pass_task, call_args) ;
6837
+ rptr = bcx. build. BitCast ( fcx. llretptr, T_ptr ( T_i32 ( ) ) ) ;
6838
+
6839
+ for ( tup( ValueRef , ty. t) d in drop_args) {
6840
+ bcx = drop_ty( bcx, d. _0, d. _1) . bcx;
6841
+ }
6815
6842
}
6816
6843
}
6817
6844
0 commit comments