@@ -17,7 +17,6 @@ use middle::weak_lang_items;
17
17
use middle:: trans:: base:: push_ctxt;
18
18
use middle:: trans:: base;
19
19
use middle:: trans:: build:: * ;
20
- use middle:: trans:: builder:: noname;
21
20
use middle:: trans:: cabi;
22
21
use middle:: trans:: common:: * ;
23
22
use middle:: trans:: machine;
@@ -625,8 +624,8 @@ pub fn trans_rust_fn_with_foreign_abi(ccx: &CrateContext,
625
624
"the block" . with_c_str (
626
625
|s| llvm:: LLVMAppendBasicBlockInContext ( ccx. llcx , llwrapfn, s) ) ;
627
626
628
- let builder = ccx. builder . b ;
629
- llvm :: LLVMPositionBuilderAtEnd ( builder, the_block) ;
627
+ let builder = ccx. builder ( ) ;
628
+ builder. position_at_end ( the_block) ;
630
629
631
630
// Array for the arguments we will pass to the rust function.
632
631
let mut llrust_args = Vec :: new ( ) ;
@@ -666,23 +665,15 @@ pub fn trans_rust_fn_with_foreign_abi(ccx: &CrateContext,
666
665
debug ! ( "out pointer, foreign={}" ,
667
666
ccx. tn. val_to_str( llforeign_outptr) ) ;
668
667
let llrust_retptr =
669
- llvm:: LLVMBuildBitCast ( builder,
670
- llforeign_outptr,
671
- llrust_ret_ty. ptr_to ( ) . to_ref ( ) ,
672
- noname ( ) ) ;
668
+ builder. bitcast ( llforeign_outptr, llrust_ret_ty. ptr_to ( ) ) ;
673
669
debug ! ( "out pointer, foreign={} (casted)" ,
674
670
ccx. tn. val_to_str( llrust_retptr) ) ;
675
671
llrust_args. push ( llrust_retptr) ;
676
672
return_alloca = None ;
677
673
}
678
674
679
675
None => {
680
- let slot = {
681
- "return_alloca" . with_c_str (
682
- |s| llvm:: LLVMBuildAlloca ( builder,
683
- llrust_ret_ty. to_ref ( ) ,
684
- s) )
685
- } ;
676
+ let slot = builder. alloca ( llrust_ret_ty, "return_alloca" ) ;
686
677
debug ! ( "out pointer, \
687
678
allocad={}, \
688
679
llrust_ret_ty={}, \
@@ -724,11 +715,8 @@ pub fn trans_rust_fn_with_foreign_abi(ccx: &CrateContext,
724
715
// pointer). It makes adapting types easier, since we can
725
716
// always just bitcast pointers.
726
717
if !foreign_indirect {
727
- let lltemp =
728
- llvm:: LLVMBuildAlloca (
729
- builder, val_ty ( llforeign_arg) . to_ref ( ) , noname ( ) ) ;
730
- llvm:: LLVMBuildStore (
731
- builder, llforeign_arg, lltemp) ;
718
+ let lltemp = builder. alloca ( val_ty ( llforeign_arg) , "" ) ;
719
+ builder. store ( llforeign_arg, lltemp) ;
732
720
llforeign_arg = lltemp;
733
721
}
734
722
@@ -737,15 +725,13 @@ pub fn trans_rust_fn_with_foreign_abi(ccx: &CrateContext,
737
725
// Rust expects.
738
726
if llforeign_arg_ty. cast . is_some ( ) {
739
727
assert ! ( !foreign_indirect) ;
740
- llforeign_arg = llvm:: LLVMBuildBitCast (
741
- builder, llforeign_arg,
742
- llrust_ty. ptr_to ( ) . to_ref ( ) , noname ( ) ) ;
728
+ llforeign_arg = builder. bitcast ( llforeign_arg, llrust_ty. ptr_to ( ) ) ;
743
729
}
744
730
745
731
let llrust_arg = if rust_indirect {
746
732
llforeign_arg
747
733
} else {
748
- llvm :: LLVMBuildLoad ( builder, llforeign_arg , noname ( ) )
734
+ builder. load ( llforeign_arg )
749
735
} ;
750
736
751
737
debug ! ( "llrust_arg {}{}: {}" , "#" ,
@@ -755,13 +741,8 @@ pub fn trans_rust_fn_with_foreign_abi(ccx: &CrateContext,
755
741
756
742
// Perform the call itself
757
743
debug ! ( "calling llrustfn = {}, t = {}" , ccx. tn. val_to_str( llrustfn) , t. repr( ccx. tcx( ) ) ) ;
758
- let llrust_ret_val = llvm:: LLVMBuildCall ( builder, llrustfn, llrust_args. as_ptr ( ) ,
759
- llrust_args. len ( ) as c_uint , noname ( ) ) ;
760
-
761
744
let attributes = base:: get_fn_llvm_attributes ( ccx, t) ;
762
- for & ( idx, attr) in attributes. iter ( ) {
763
- llvm:: LLVMAddCallSiteAttribute ( llrust_ret_val, idx as c_uint , attr) ;
764
- }
745
+ let llrust_ret_val = builder. call ( llrustfn, llrust_args. as_slice ( ) , attributes. as_slice ( ) ) ;
765
746
766
747
// Get the return value where the foreign fn expects it.
767
748
let llforeign_ret_ty = match tys. fn_ty . ret_ty . cast {
@@ -772,20 +753,16 @@ pub fn trans_rust_fn_with_foreign_abi(ccx: &CrateContext,
772
753
None if !tys. ret_def => {
773
754
// Function returns `()` or `bot`, which in Rust is the LLVM
774
755
// type "{}" but in foreign ABIs is "Void".
775
- llvm :: LLVMBuildRetVoid ( builder) ;
756
+ builder. ret_void ( ) ;
776
757
}
777
758
778
759
None if rust_uses_outptr => {
779
760
// Rust uses an outpointer, but the foreign ABI does not. Load.
780
761
let llrust_outptr = return_alloca. unwrap ( ) ;
781
762
let llforeign_outptr_casted =
782
- llvm:: LLVMBuildBitCast ( builder,
783
- llrust_outptr,
784
- llforeign_ret_ty. ptr_to ( ) . to_ref ( ) ,
785
- noname ( ) ) ;
786
- let llforeign_retval =
787
- llvm:: LLVMBuildLoad ( builder, llforeign_outptr_casted, noname ( ) ) ;
788
- llvm:: LLVMBuildRet ( builder, llforeign_retval) ;
763
+ builder. bitcast ( llrust_outptr, llforeign_ret_ty. ptr_to ( ) ) ;
764
+ let llforeign_retval = builder. load ( llforeign_outptr_casted) ;
765
+ builder. ret ( llforeign_retval) ;
789
766
}
790
767
791
768
None if llforeign_ret_ty != llrust_ret_ty => {
@@ -795,43 +772,31 @@ pub fn trans_rust_fn_with_foreign_abi(ccx: &CrateContext,
795
772
// right now we just use a temp memory location and
796
773
// bitcast the pointer, which is the same thing the
797
774
// old wrappers used to do.
798
- let lltemp =
799
- llvm:: LLVMBuildAlloca (
800
- builder, llforeign_ret_ty. to_ref ( ) , noname ( ) ) ;
801
- let lltemp_casted =
802
- llvm:: LLVMBuildBitCast ( builder,
803
- lltemp,
804
- llrust_ret_ty. ptr_to ( ) . to_ref ( ) ,
805
- noname ( ) ) ;
806
- llvm:: LLVMBuildStore (
807
- builder, llrust_ret_val, lltemp_casted) ;
808
- let llforeign_retval =
809
- llvm:: LLVMBuildLoad ( builder, lltemp, noname ( ) ) ;
810
- llvm:: LLVMBuildRet ( builder, llforeign_retval) ;
775
+ let lltemp = builder. alloca ( llforeign_ret_ty, "" ) ;
776
+ let lltemp_casted = builder. bitcast ( lltemp, llrust_ret_ty. ptr_to ( ) ) ;
777
+ builder. store ( llrust_ret_val, lltemp_casted) ;
778
+ let llforeign_retval = builder. load ( lltemp) ;
779
+ builder. ret ( llforeign_retval) ;
811
780
}
812
781
813
782
None => {
814
783
// Neither ABI uses an outpointer, and the types
815
784
// match. Easy peasy.
816
- llvm :: LLVMBuildRet ( builder, llrust_ret_val) ;
785
+ builder. ret ( llrust_ret_val) ;
817
786
}
818
787
819
788
Some ( llforeign_outptr) if !rust_uses_outptr => {
820
789
// Foreign ABI requires an out pointer, but Rust doesn't.
821
790
// Store Rust return value.
822
791
let llforeign_outptr_casted =
823
- llvm:: LLVMBuildBitCast ( builder,
824
- llforeign_outptr,
825
- llrust_retptr_ty. to_ref ( ) ,
826
- noname ( ) ) ;
827
- llvm:: LLVMBuildStore (
828
- builder, llrust_ret_val, llforeign_outptr_casted) ;
829
- llvm:: LLVMBuildRetVoid ( builder) ;
792
+ builder. bitcast ( llforeign_outptr, llrust_retptr_ty) ;
793
+ builder. store ( llrust_ret_val, llforeign_outptr_casted) ;
794
+ builder. ret_void ( ) ;
830
795
}
831
796
832
797
Some ( _) => {
833
798
// Both ABIs use outpointers. Easy peasy.
834
- llvm :: LLVMBuildRetVoid ( builder) ;
799
+ builder. ret_void ( ) ;
835
800
}
836
801
}
837
802
}
0 commit comments