Never inline C variadic functions
This commit is contained in:
@@ -206,6 +206,11 @@ impl Inliner<'tcx> {
|
|||||||
debug!("should_inline({:?})", callsite);
|
debug!("should_inline({:?})", callsite);
|
||||||
let tcx = self.tcx;
|
let tcx = self.tcx;
|
||||||
|
|
||||||
|
if callsite.fn_sig.c_variadic() {
|
||||||
|
debug!("callee is variadic - not inlining");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
let codegen_fn_attrs = tcx.codegen_fn_attrs(callsite.callee.def_id());
|
let codegen_fn_attrs = tcx.codegen_fn_attrs(callsite.callee.def_id());
|
||||||
|
|
||||||
let self_features = &self.codegen_fn_attrs.target_features;
|
let self_features = &self.codegen_fn_attrs.target_features;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
#![feature(no_sanitize)]
|
#![feature(no_sanitize)]
|
||||||
#![feature(target_feature_11)]
|
#![feature(target_feature_11)]
|
||||||
|
#![feature(c_variadic)]
|
||||||
|
|
||||||
// EMIT_MIR inline_compatibility.inlined_target_feature.Inline.diff
|
// EMIT_MIR inline_compatibility.inlined_target_feature.Inline.diff
|
||||||
#[target_feature(enable = "sse2")]
|
#[target_feature(enable = "sse2")]
|
||||||
@@ -35,3 +36,20 @@ pub unsafe fn target_feature() {}
|
|||||||
#[inline]
|
#[inline]
|
||||||
#[no_sanitize(address)]
|
#[no_sanitize(address)]
|
||||||
pub unsafe fn no_sanitize() {}
|
pub unsafe fn no_sanitize() {}
|
||||||
|
|
||||||
|
// EMIT_MIR inline_compatibility.not_inlined_c_variadic.Inline.diff
|
||||||
|
pub unsafe fn not_inlined_c_variadic() {
|
||||||
|
let s = sum(4u32, 4u32, 30u32, 200u32, 1000u32);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
#[inline(always)]
|
||||||
|
unsafe extern "C" fn sum(n: u32, mut vs: ...) -> u32 {
|
||||||
|
let mut s = 0;
|
||||||
|
let mut i = 0;
|
||||||
|
while i != n {
|
||||||
|
s += vs.arg::<u32>();
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
s
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user