diff options
| author | Josh Stone <jistone@redhat.com> | 2021-08-03 15:09:57 -0700 |
|---|---|---|
| committer | Josh Stone <jistone@redhat.com> | 2021-08-05 10:58:55 -0700 |
| commit | 183d79cc09ad81bc2dc7b47cb8880046201e52a2 (patch) | |
| tree | 589011598c1d626b6d6f59b9cb32580cfbfd7a1b /compiler/rustc_codegen_ssa/src/mir | |
| parent | 61a941b8badbce727085c505068d72fa3e737f5b (diff) | |
| download | rust-183d79cc09ad81bc2dc7b47cb8880046201e52a2.tar.gz rust-183d79cc09ad81bc2dc7b47cb8880046201e52a2.zip | |
Prepare call/invoke for opaque pointers
Rather than relying on `getPointerElementType()` from LLVM function pointers, we now pass the function type explicitly when building `call` or `invoke` instructions.
Diffstat (limited to 'compiler/rustc_codegen_ssa/src/mir')
| -rw-r--r-- | compiler/rustc_codegen_ssa/src/mir/block.rs | 13 | ||||
| -rw-r--r-- | compiler/rustc_codegen_ssa/src/mir/rvalue.rs | 3 |
2 files changed, 12 insertions, 4 deletions
diff --git a/compiler/rustc_codegen_ssa/src/mir/block.rs b/compiler/rustc_codegen_ssa/src/mir/block.rs index b584801a62d..58ce31e0c4c 100644 --- a/compiler/rustc_codegen_ssa/src/mir/block.rs +++ b/compiler/rustc_codegen_ssa/src/mir/block.rs @@ -132,14 +132,21 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> { ) { // If there is a cleanup block and the function we're calling can unwind, then // do an invoke, otherwise do a call. + let fn_ty = bx.fn_decl_backend_type(&fn_abi); if let Some(cleanup) = cleanup.filter(|_| fn_abi.can_unwind) { let ret_llbb = if let Some((_, target)) = destination { fx.llbb(target) } else { fx.unreachable_block() }; - let invokeret = - bx.invoke(fn_ptr, &llargs, ret_llbb, self.llblock(fx, cleanup), self.funclet(fx)); + let invokeret = bx.invoke( + fn_ty, + fn_ptr, + &llargs, + ret_llbb, + self.llblock(fx, cleanup), + self.funclet(fx), + ); bx.apply_attrs_callsite(&fn_abi, invokeret); if let Some((ret_dest, target)) = destination { @@ -148,7 +155,7 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> { fx.store_return(&mut ret_bx, ret_dest, &fn_abi.ret, invokeret); } } else { - let llret = bx.call(fn_ptr, &llargs, self.funclet(fx)); + let llret = bx.call(fn_ty, fn_ptr, &llargs, self.funclet(fx)); bx.apply_attrs_callsite(&fn_abi, llret); if fx.mir[self.bb].is_cleanup { // Cleanup is always the cold path. Don't inline diff --git a/compiler/rustc_codegen_ssa/src/mir/rvalue.rs b/compiler/rustc_codegen_ssa/src/mir/rvalue.rs index cbb401c63d1..7e432d27402 100644 --- a/compiler/rustc_codegen_ssa/src/mir/rvalue.rs +++ b/compiler/rustc_codegen_ssa/src/mir/rvalue.rs @@ -518,7 +518,8 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { }; let instance = ty::Instance::mono(bx.tcx(), def_id); let r = bx.cx().get_fn_addr(instance); - let call = bx.call(r, &[llsize, llalign], None); + let ty = bx.type_func(&[bx.type_isize(), bx.type_isize()], bx.type_i8p()); + let call = bx.call(ty, r, &[llsize, llalign], None); let val = bx.pointercast(call, llty_ptr); let operand = OperandRef { val: OperandValue::Immediate(val), layout: box_layout }; |
