diff --git a/src/librustc_codegen_llvm/callee.rs b/src/librustc_codegen_llvm/callee.rs index 972cccd5d68e0..82d85b6ead485 100644 --- a/src/librustc_codegen_llvm/callee.rs +++ b/src/librustc_codegen_llvm/callee.rs @@ -91,7 +91,7 @@ pub fn get_fn( llfn } } else { - let llfn = declare::declare_fn(cx, &sym, fn_ty); + let llfn = declare::declare_fn(cx, &sym, fn_ty, instance.is_vtable_shim()); assert_eq!(common::val_ty(llfn), llptrty); debug!("get_fn: not casting pointer!"); diff --git a/src/librustc_codegen_llvm/context.rs b/src/librustc_codegen_llvm/context.rs index 826df82193a31..8087f130afaa0 100644 --- a/src/librustc_codegen_llvm/context.rs +++ b/src/librustc_codegen_llvm/context.rs @@ -412,7 +412,7 @@ impl<'b, 'tcx> CodegenCx<'b, 'tcx> { Abi::C ))); - let llfn = declare::declare_fn(self, "rust_eh_unwind_resume", ty); + let llfn = declare::declare_fn(self, "rust_eh_unwind_resume", ty, false); attributes::unwind(llfn, true); attributes::apply_target_cpu_attr(self, llfn); unwresume.set(Some(llfn)); diff --git a/src/librustc_codegen_llvm/declare.rs b/src/librustc_codegen_llvm/declare.rs index 26969e24f0883..0d01e9ef7ddab 100644 --- a/src/librustc_codegen_llvm/declare.rs +++ b/src/librustc_codegen_llvm/declare.rs @@ -130,9 +130,11 @@ pub fn declare_fn( cx: &CodegenCx<'ll, 'tcx>, name: &str, fn_type: Ty<'tcx>, + is_vtable_shim: bool, ) -> &'ll Value { - debug!("declare_rust_fn(name={:?}, fn_type={:?})", name, fn_type); - let sig = common::ty_fn_sig(cx, fn_type); + debug!("declare_rust_fn(name={:?}, fn_type={:?}, is_vtable_shim={:?})", + name, fn_type, is_vtable_shim); + let sig = common::ty_fn_sig_vtable(cx, fn_type, is_vtable_shim); let sig = cx.tcx.normalize_erasing_late_bound_regions(ty::ParamEnv::reveal_all(), &sig); debug!("declare_rust_fn (after region erasure) sig={:?}", sig); @@ -189,7 +191,7 @@ pub fn define_fn( if get_defined_value(cx, name).is_some() { cx.sess().fatal(&format!("symbol `{}` already defined", name)) } else { - declare_fn(cx, name, fn_type) + declare_fn(cx, name, fn_type, false) } } diff --git a/src/librustc_codegen_llvm/mono_item.rs b/src/librustc_codegen_llvm/mono_item.rs index dab9b147cc070..aab8613b75619 100644 --- a/src/librustc_codegen_llvm/mono_item.rs +++ b/src/librustc_codegen_llvm/mono_item.rs @@ -155,7 +155,7 @@ fn predefine_fn<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, let mono_ty = instance.ty(cx.tcx); let attrs = cx.tcx.codegen_fn_attrs(instance.def_id()); - let lldecl = declare::declare_fn(cx, symbol_name, mono_ty); + let lldecl = declare::declare_fn(cx, symbol_name, mono_ty, instance.is_vtable_shim()); unsafe { llvm::LLVMRustSetLinkage(lldecl, base::linkage_to_llvm(linkage)) }; base::set_link_section(lldecl, &attrs); if linkage == Linkage::LinkOnceODR ||