return llfn;
}
- let ty = tcx.mk_fn_ptr(ty::Binder::bind(tcx.mk_fn_sig(
+ let sig = ty::Binder::bind(tcx.mk_fn_sig(
iter::once(tcx.mk_mut_ptr(tcx.types.u8)),
tcx.types.never,
false,
hir::Unsafety::Unsafe,
Abi::C
- )));
+ ));
- let llfn = declare::declare_fn(self, "rust_eh_unwind_resume", ty, false);
+ let llfn = declare::declare_fn(self, "rust_eh_unwind_resume", sig);
attributes::unwind(llfn, true);
attributes::apply_target_cpu_attr(self, llfn);
unwresume.set(Some(llfn));
use llvm;
use llvm::AttributePlace::Function;
-use rustc::ty::{self, Ty};
+use rustc::ty::{self, PolyFnSig};
use rustc::ty::layout::LayoutOf;
use rustc::session::config::Sanitizer;
use rustc_data_structures::small_c_str::SmallCStr;
use abi::{Abi, FnType, FnTypeExt};
use attributes;
use context::CodegenCx;
-use common;
use type_::Type;
use value::Value;
pub fn declare_fn(
cx: &CodegenCx<'ll, 'tcx>,
name: &str,
- fn_type: Ty<'tcx>,
- is_vtable_shim: bool,
+ sig: PolyFnSig<'tcx>,
) -> &'ll Value {
- 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);
+ debug!("declare_rust_fn(name={:?}, sig={:?})", name, sig);
let sig = cx.tcx.normalize_erasing_late_bound_regions(ty::ParamEnv::reveal_all(), &sig);
debug!("declare_rust_fn (after region erasure) sig={:?}", sig);
pub fn define_fn(
cx: &CodegenCx<'ll, 'tcx>,
name: &str,
- fn_type: Ty<'tcx>,
+ fn_sig: PolyFnSig<'tcx>,
) -> &'ll Value {
if get_defined_value(cx, name).is_some() {
cx.sess().fatal(&format!("symbol `{}` already defined", name))
} else {
- declare_fn(cx, name, fn_type, false)
+ declare_fn(cx, name, fn_sig)
}
}
pub fn define_internal_fn(
cx: &CodegenCx<'ll, 'tcx>,
name: &str,
- fn_type: Ty<'tcx>,
+ fn_sig: PolyFnSig<'tcx>,
) -> &'ll Value {
- let llfn = define_fn(cx, name, fn_type);
+ let llfn = define_fn(cx, name, fn_sig);
unsafe { llvm::LLVMRustSetLinkage(llfn, llvm::Linkage::InternalLinkage) };
llfn
}
output: Ty<'tcx>,
codegen: &mut dyn FnMut(Builder<'_, 'll, 'tcx>),
) -> &'ll Value {
- let rust_fn_ty = cx.tcx.mk_fn_ptr(ty::Binder::bind(cx.tcx.mk_fn_sig(
+ let rust_fn_sig = ty::Binder::bind(cx.tcx.mk_fn_sig(
inputs.into_iter(),
output,
false,
hir::Unsafety::Unsafe,
Abi::Rust
- )));
- let llfn = declare::define_internal_fn(cx, name, rust_fn_ty);
+ ));
+ let llfn = declare::define_internal_fn(cx, name, rust_fn_sig);
attributes::from_fn_attrs(cx, llfn, None);
let bx = Builder::new_block(cx, llfn, "entry-block");
codegen(bx);
use asm;
use attributes;
use base;
+use common;
use consts;
use context::CodegenCx;
use declare;
!instance.substs.has_param_types());
let mono_ty = instance.ty(cx.tcx);
+ let mono_sig = common::ty_fn_sig_vtable(cx, mono_ty, instance.is_vtable_shim());
let attrs = cx.tcx.codegen_fn_attrs(instance.def_id());
- let lldecl = declare::declare_fn(cx, symbol_name, mono_ty, instance.is_vtable_shim());
+ let lldecl = declare::declare_fn(cx, symbol_name, mono_sig);
unsafe { llvm::LLVMRustSetLinkage(lldecl, base::linkage_to_llvm(linkage)) };
base::set_link_section(lldecl, &attrs);
if linkage == Linkage::LinkOnceODR ||