}
};
- // Obtain the panic entry point.
- let def_id = common::langcall(bx.tcx(), Some(span), "", lang_item);
- let instance = ty::Instance::mono(bx.tcx(), def_id);
- let fn_abi = bx.fn_abi_of_instance(instance, ty::List::empty());
- let llfn = bx.get_fn_addr(instance);
+ let (fn_abi, llfn) = common::build_langcall(&bx, Some(span), lang_item);
// Codegen the actual panic invoke/call.
helper.do_call(self, &mut bx, fn_abi, llfn, &args, None, cleanup);
self.set_debug_loc(&mut bx, terminator.source_info);
// Obtain the panic entry point.
- let def_id = common::langcall(bx.tcx(), Some(span), "", LangItem::PanicNoUnwind);
- let instance = ty::Instance::mono(bx.tcx(), def_id);
- let fn_abi = bx.fn_abi_of_instance(instance, ty::List::empty());
- let llfn = bx.get_fn_addr(instance);
+ let (fn_abi, llfn) = common::build_langcall(&bx, Some(span), LangItem::PanicNoUnwind);
// Codegen the actual panic invoke/call.
helper.do_call(self, &mut bx, fn_abi, llfn, &[], None, None);
let location = self.get_caller_location(bx, source_info).immediate();
// Obtain the panic entry point.
- // FIXME: dedup this with `codegen_assert_terminator` above.
- let def_id =
- common::langcall(bx.tcx(), Some(source_info.span), "", LangItem::Panic);
- let instance = ty::Instance::mono(bx.tcx(), def_id);
- let fn_abi = bx.fn_abi_of_instance(instance, ty::List::empty());
- let llfn = bx.get_fn_addr(instance);
+ let (fn_abi, llfn) =
+ common::build_langcall(bx, Some(source_info.span), LangItem::Panic);
// Codegen the actual panic invoke/call.
helper.do_call(
let llretty = self.landing_pad_type();
bx.cleanup_landing_pad(llretty, llpersonality);
- let def_id = common::langcall(bx.tcx(), None, "", LangItem::PanicNoUnwind);
- let instance = ty::Instance::mono(bx.tcx(), def_id);
- let fn_abi = bx.fn_abi_of_instance(instance, ty::List::empty());
- let fn_ptr = bx.get_fn_addr(instance);
+ let (fn_abi, fn_ptr) = common::build_langcall(&bx, None, LangItem::PanicNoUnwind);
let fn_ty = bx.fn_decl_backend_type(&fn_abi);
let llret = bx.call(fn_ty, fn_ptr, &[], None);
match (src.layout.abi, dst.layout.abi) {
(abi::Abi::Scalar(src_scalar), abi::Abi::Scalar(dst_scalar)) => {
// HACK(eddyb) LLVM doesn't like `bitcast`s between pointers and non-pointers.
- if (src_scalar.value == abi::Pointer) == (dst_scalar.value == abi::Pointer) {
+ if (src_scalar.primitive() == abi::Pointer)
+ == (dst_scalar.primitive() == abi::Pointer)
+ {
assert_eq!(src.layout.size, dst.layout.size);
// NOTE(eddyb) the `from_immediate` and `to_immediate_scalar`