@@ -977,7 +977,7 @@ pub fn call_memcpy(cx: &Block, dst: ValueRef, src: ValueRef, n_bytes: ValueRef,
977977 X86 | Arm | Mips => "llvm.memcpy.p0i8.p0i8.i32" ,
978978 X86_64 => "llvm.memcpy.p0i8.p0i8.i64"
979979 } ;
980- let memcpy = ccx. intrinsics . get_copy ( & key) ;
980+ let memcpy = ccx. get_intrinsic ( & key) ;
981981 let src_ptr = PointerCast ( cx, src, Type :: i8p ( ccx) ) ;
982982 let dst_ptr = PointerCast ( cx, dst, Type :: i8p ( ccx) ) ;
983983 let size = IntCast ( cx, n_bytes, ccx. int_type ) ;
@@ -1022,7 +1022,7 @@ fn memzero(b: &Builder, llptr: ValueRef, ty: Type) {
10221022 X86_64 => "llvm.memset.p0i8.i64"
10231023 } ;
10241024
1025- let llintrinsicfn = ccx. intrinsics . get_copy ( & intrinsic_key) ;
1025+ let llintrinsicfn = ccx. get_intrinsic ( & intrinsic_key) ;
10261026 let llptr = b. pointercast ( llptr, Type :: i8 ( ccx) . ptr_to ( ) ) ;
10271027 let llzeroval = C_u8 ( ccx, 0 ) ;
10281028 let size = machine:: llsize_of ( ccx, ty) ;
@@ -2043,168 +2043,6 @@ pub fn p2i(ccx: &CrateContext, v: ValueRef) -> ValueRef {
20432043 }
20442044}
20452045
2046-
2047- pub fn declare_intrinsics( ccx: & mut CrateContext ) {
2048- macro_rules! ifn (
2049- ( $name: expr fn ( ) -> $ret: expr) => ( {
2050- let name = $name;
2051- // HACK(eddyb) dummy output type, shouln't affect anything.
2052- let f = decl_cdecl_fn( ccx. llmod, name, Type :: func( [ ] , & $ret) , ty:: mk_nil( ) ) ;
2053- ccx. intrinsics. insert( name, f) ;
2054- } ) ;
2055- ( $name: expr fn ( $( $arg: expr) , * ) -> $ret: expr) => ( {
2056- let name = $name;
2057- // HACK(eddyb) dummy output type, shouln't affect anything.
2058- let f = decl_cdecl_fn( ccx. llmod, name,
2059- Type :: func( [ $( $arg) , * ] , & $ret) , ty:: mk_nil( ) ) ;
2060- ccx. intrinsics. insert( name, f) ;
2061- } )
2062- )
2063- macro_rules! mk_struct (
2064- ( $( $field_ty: expr) , * ) => ( Type :: struct_( ccx, [ $( $field_ty) , * ] , false ) )
2065- )
2066-
2067- let i8p = Type :: i8p( ccx) ;
2068- let void = Type :: void( ccx) ;
2069- let i1 = Type :: i1( ccx) ;
2070- let t_i8 = Type :: i8 ( ccx) ;
2071- let t_i16 = Type :: i16 ( ccx) ;
2072- let t_i32 = Type :: i32 ( ccx) ;
2073- let t_i64 = Type :: i64 ( ccx) ;
2074- let t_f32 = Type :: f32 ( ccx) ;
2075- let t_f64 = Type :: f64 ( ccx) ;
2076-
2077- ifn!( "llvm.memcpy.p0i8.p0i8.i32" fn ( i8p, i8p, t_i32, t_i32, i1) -> void) ;
2078- ifn!( "llvm.memcpy.p0i8.p0i8.i64" fn ( i8p, i8p, t_i64, t_i32, i1) -> void) ;
2079- ifn!( "llvm.memmove.p0i8.p0i8.i32" fn ( i8p, i8p, t_i32, t_i32, i1) -> void) ;
2080- ifn!( "llvm.memmove.p0i8.p0i8.i64" fn ( i8p, i8p, t_i64, t_i32, i1) -> void) ;
2081- ifn!( "llvm.memset.p0i8.i32" fn ( i8p, t_i8, t_i32, t_i32, i1) -> void) ;
2082- ifn!( "llvm.memset.p0i8.i64" fn ( i8p, t_i8, t_i64, t_i32, i1) -> void) ;
2083-
2084- ifn!( "llvm.trap" fn ( ) -> void) ;
2085- ifn!( "llvm.debugtrap" fn ( ) -> void) ;
2086- ifn!( "llvm.frameaddress" fn ( t_i32) -> i8p) ;
2087-
2088- ifn!( "llvm.powi.f32" fn ( t_f32, t_i32) -> t_f32) ;
2089- ifn!( "llvm.powi.f64" fn ( t_f64, t_i32) -> t_f64) ;
2090- ifn!( "llvm.pow.f32" fn ( t_f32, t_f32) -> t_f32) ;
2091- ifn!( "llvm.pow.f64" fn ( t_f64, t_f64) -> t_f64) ;
2092-
2093- ifn!( "llvm.sqrt.f32" fn ( t_f32) -> t_f32) ;
2094- ifn!( "llvm.sqrt.f64" fn ( t_f64) -> t_f64) ;
2095- ifn!( "llvm.sin.f32" fn ( t_f32) -> t_f32) ;
2096- ifn!( "llvm.sin.f64" fn ( t_f64) -> t_f64) ;
2097- ifn!( "llvm.cos.f32" fn ( t_f32) -> t_f32) ;
2098- ifn!( "llvm.cos.f64" fn ( t_f64) -> t_f64) ;
2099- ifn!( "llvm.exp.f32" fn ( t_f32) -> t_f32) ;
2100- ifn!( "llvm.exp.f64" fn ( t_f64) -> t_f64) ;
2101- ifn!( "llvm.exp2.f32" fn ( t_f32) -> t_f32) ;
2102- ifn!( "llvm.exp2.f64" fn ( t_f64) -> t_f64) ;
2103- ifn!( "llvm.log.f32" fn ( t_f32) -> t_f32) ;
2104- ifn!( "llvm.log.f64" fn ( t_f64) -> t_f64) ;
2105- ifn!( "llvm.log10.f32" fn ( t_f32) -> t_f32) ;
2106- ifn!( "llvm.log10.f64" fn ( t_f64) -> t_f64) ;
2107- ifn!( "llvm.log2.f32" fn ( t_f32) -> t_f32) ;
2108- ifn!( "llvm.log2.f64" fn ( t_f64) -> t_f64) ;
2109-
2110- ifn!( "llvm.fma.f32" fn ( t_f32, t_f32, t_f32) -> t_f32) ;
2111- ifn!( "llvm.fma.f64" fn ( t_f64, t_f64, t_f64) -> t_f64) ;
2112-
2113- ifn!( "llvm.fabs.f32" fn ( t_f32) -> t_f32) ;
2114- ifn!( "llvm.fabs.f64" fn ( t_f64) -> t_f64) ;
2115-
2116- ifn!( "llvm.floor.f32" fn ( t_f32) -> t_f32) ;
2117- ifn!( "llvm.floor.f64" fn ( t_f64) -> t_f64) ;
2118- ifn!( "llvm.ceil.f32" fn ( t_f32) -> t_f32) ;
2119- ifn!( "llvm.ceil.f64" fn ( t_f64) -> t_f64) ;
2120- ifn!( "llvm.trunc.f32" fn ( t_f32) -> t_f32) ;
2121- ifn!( "llvm.trunc.f64" fn ( t_f64) -> t_f64) ;
2122-
2123- ifn!( "llvm.rint.f32" fn ( t_f32) -> t_f32) ;
2124- ifn!( "llvm.rint.f64" fn ( t_f64) -> t_f64) ;
2125- ifn!( "llvm.nearbyint.f32" fn ( t_f32) -> t_f32) ;
2126- ifn!( "llvm.nearbyint.f64" fn ( t_f64) -> t_f64) ;
2127-
2128- ifn!( "llvm.ctpop.i8" fn ( t_i8) -> t_i8) ;
2129- ifn!( "llvm.ctpop.i16" fn ( t_i16) -> t_i16) ;
2130- ifn!( "llvm.ctpop.i32" fn ( t_i32) -> t_i32) ;
2131- ifn!( "llvm.ctpop.i64" fn ( t_i64) -> t_i64) ;
2132-
2133- ifn!( "llvm.ctlz.i8" fn ( t_i8 , i1) -> t_i8) ;
2134- ifn!( "llvm.ctlz.i16" fn ( t_i16, i1) -> t_i16) ;
2135- ifn!( "llvm.ctlz.i32" fn ( t_i32, i1) -> t_i32) ;
2136- ifn!( "llvm.ctlz.i64" fn ( t_i64, i1) -> t_i64) ;
2137-
2138- ifn!( "llvm.cttz.i8" fn ( t_i8 , i1) -> t_i8) ;
2139- ifn!( "llvm.cttz.i16" fn ( t_i16, i1) -> t_i16) ;
2140- ifn!( "llvm.cttz.i32" fn ( t_i32, i1) -> t_i32) ;
2141- ifn!( "llvm.cttz.i64" fn ( t_i64, i1) -> t_i64) ;
2142-
2143- ifn!( "llvm.bswap.i16" fn ( t_i16) -> t_i16) ;
2144- ifn!( "llvm.bswap.i32" fn ( t_i32) -> t_i32) ;
2145- ifn!( "llvm.bswap.i64" fn ( t_i64) -> t_i64) ;
2146-
2147- ifn!( "llvm.sadd.with.overflow.i8" fn ( t_i8, t_i8) -> mk_struct!{ t_i8, i1} ) ;
2148- ifn!( "llvm.sadd.with.overflow.i16" fn ( t_i16, t_i16) -> mk_struct!{ t_i16, i1} ) ;
2149- ifn!( "llvm.sadd.with.overflow.i32" fn ( t_i32, t_i32) -> mk_struct!{ t_i32, i1} ) ;
2150- ifn!( "llvm.sadd.with.overflow.i64" fn ( t_i64, t_i64) -> mk_struct!{ t_i64, i1} ) ;
2151-
2152- ifn!( "llvm.uadd.with.overflow.i8" fn ( t_i8, t_i8) -> mk_struct!{ t_i8, i1} ) ;
2153- ifn!( "llvm.uadd.with.overflow.i16" fn ( t_i16, t_i16) -> mk_struct!{ t_i16, i1} ) ;
2154- ifn!( "llvm.uadd.with.overflow.i32" fn ( t_i32, t_i32) -> mk_struct!{ t_i32, i1} ) ;
2155- ifn!( "llvm.uadd.with.overflow.i64" fn ( t_i64, t_i64) -> mk_struct!{ t_i64, i1} ) ;
2156-
2157- ifn!( "llvm.ssub.with.overflow.i8" fn ( t_i8, t_i8) -> mk_struct!{ t_i8, i1} ) ;
2158- ifn!( "llvm.ssub.with.overflow.i16" fn ( t_i16, t_i16) -> mk_struct!{ t_i16, i1} ) ;
2159- ifn!( "llvm.ssub.with.overflow.i32" fn ( t_i32, t_i32) -> mk_struct!{ t_i32, i1} ) ;
2160- ifn!( "llvm.ssub.with.overflow.i64" fn ( t_i64, t_i64) -> mk_struct!{ t_i64, i1} ) ;
2161-
2162- ifn!( "llvm.usub.with.overflow.i8" fn ( t_i8, t_i8) -> mk_struct!{ t_i8, i1} ) ;
2163- ifn!( "llvm.usub.with.overflow.i16" fn ( t_i16, t_i16) -> mk_struct!{ t_i16, i1} ) ;
2164- ifn!( "llvm.usub.with.overflow.i32" fn ( t_i32, t_i32) -> mk_struct!{ t_i32, i1} ) ;
2165- ifn!( "llvm.usub.with.overflow.i64" fn ( t_i64, t_i64) -> mk_struct!{ t_i64, i1} ) ;
2166-
2167- ifn!( "llvm.smul.with.overflow.i8" fn ( t_i8, t_i8) -> mk_struct!{ t_i8, i1} ) ;
2168- ifn!( "llvm.smul.with.overflow.i16" fn ( t_i16, t_i16) -> mk_struct!{ t_i16, i1} ) ;
2169- ifn!( "llvm.smul.with.overflow.i32" fn ( t_i32, t_i32) -> mk_struct!{ t_i32, i1} ) ;
2170- ifn!( "llvm.smul.with.overflow.i64" fn ( t_i64, t_i64) -> mk_struct!{ t_i64, i1} ) ;
2171-
2172- ifn!( "llvm.umul.with.overflow.i8" fn ( t_i8, t_i8) -> mk_struct!{ t_i8, i1} ) ;
2173- ifn!( "llvm.umul.with.overflow.i16" fn ( t_i16, t_i16) -> mk_struct!{ t_i16, i1} ) ;
2174- ifn!( "llvm.umul.with.overflow.i32" fn ( t_i32, t_i32) -> mk_struct!{ t_i32, i1} ) ;
2175- ifn!( "llvm.umul.with.overflow.i64" fn ( t_i64, t_i64) -> mk_struct!{ t_i64, i1} ) ;
2176-
2177- ifn!( "llvm.expect.i1" fn ( i1, i1) -> i1) ;
2178-
2179- // Some intrinsics were introduced in later versions of LLVM, but they have
2180- // fallbacks in libc or libm and such. Currently, all of these intrinsics
2181- // were introduced in LLVM 3.4, so we case on that.
2182- macro_rules! compatible_ifn (
2183- ( $name: expr, $cname: ident ( $( $arg: expr) , * ) -> $ret: expr) => ( {
2184- let name = $name;
2185- if unsafe { llvm:: LLVMVersionMinor ( ) >= 4 } {
2186- ifn!( name fn ( $( $arg) , * ) -> $ret) ;
2187- } else {
2188- let f = decl_cdecl_fn( ccx. llmod, stringify!( $cname) ,
2189- Type :: func( [ $( $arg) , * ] , & $ret) ,
2190- ty:: mk_nil( ) ) ;
2191- ccx. intrinsics. insert( name, f) ;
2192- }
2193- } )
2194- )
2195-
2196- compatible_ifn!( "llvm.copysign.f32" , copysignf( t_f32, t_f32) -> t_f32) ;
2197- compatible_ifn!( "llvm.copysign.f64" , copysign( t_f64, t_f64) -> t_f64) ;
2198- compatible_ifn!( "llvm.round.f32" , roundf( t_f32) -> t_f32) ;
2199- compatible_ifn!( "llvm.round.f64" , round( t_f64) -> t_f64) ;
2200-
2201-
2202- if ccx. sess( ) . opts. debuginfo != NoDebugInfo {
2203- ifn!( "llvm.dbg.declare" fn ( Type :: metadata( ccx) , Type :: metadata( ccx) ) -> void) ;
2204- ifn!( "llvm.dbg.value" fn ( Type :: metadata( ccx) , t_i64, Type :: metadata( ccx) ) -> void) ;
2205- }
2206- }
2207-
22082046pub fn crate_ctxt_to_encode_parms<' r>( cx: & ' r CrateContext , ie: encoder:: EncodeInlinedItem <' r>)
22092047 -> encoder:: EncodeParams <' r> {
22102048
0 commit comments