Skip to content

Commit b56e421

Browse files
committed
Never inline C variadic functions
1 parent f5fca8b commit b56e421

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

compiler/rustc_mir/src/transform/inline.rs

+5
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,11 @@ impl Inliner<'tcx> {
206206
debug!("should_inline({:?})", callsite);
207207
let tcx = self.tcx;
208208

209+
if callsite.fn_sig.c_variadic() {
210+
debug!("callee is variadic - not inlining");
211+
return false;
212+
}
213+
209214
let codegen_fn_attrs = tcx.codegen_fn_attrs(callsite.callee.def_id());
210215

211216
let self_features = &self.codegen_fn_attrs.target_features;

src/test/mir-opt/inline/inline-compatibility.rs

+18
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#![crate_type = "lib"]
66
#![feature(no_sanitize)]
77
#![feature(target_feature_11)]
8+
#![feature(c_variadic)]
89

910
// EMIT_MIR inline_compatibility.inlined_target_feature.Inline.diff
1011
#[target_feature(enable = "sse2")]
@@ -35,3 +36,20 @@ pub unsafe fn target_feature() {}
3536
#[inline]
3637
#[no_sanitize(address)]
3738
pub unsafe fn no_sanitize() {}
39+
40+
// EMIT_MIR inline_compatibility.not_inlined_c_variadic.Inline.diff
41+
pub unsafe fn not_inlined_c_variadic() {
42+
let s = sum(4u32, 4u32, 30u32, 200u32, 1000u32);
43+
}
44+
45+
#[no_mangle]
46+
#[inline(always)]
47+
unsafe extern "C" fn sum(n: u32, mut vs: ...) -> u32 {
48+
let mut s = 0;
49+
let mut i = 0;
50+
while i != n {
51+
s += vs.arg::<u32>();
52+
i += 1;
53+
}
54+
s
55+
}

0 commit comments

Comments
 (0)