Skip to content

Commit a00be50

Browse files
committed
Emit intrinsic lazily
1 parent 8801d89 commit a00be50

File tree

4 files changed

+189
-176
lines changed

4 files changed

+189
-176
lines changed

src/librustc/middle/trans/base.rs

+2-164
Original file line numberDiff line numberDiff line change
@@ -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-
22082046
pub fn crate_ctxt_to_encode_parms<'r>(cx: &'r CrateContext, ie: encoder::EncodeInlinedItem<'r>)
22092047
-> encoder::EncodeParams<'r> {
22102048

0 commit comments

Comments
 (0)