Merge apply_attrs_callsite into call and invoke
Some codegen backends are not able to apply callsite attrs after the fact.
This commit is contained in:
parent
a3cc67c796
commit
62cf644c64
13 changed files with 98 additions and 52 deletions
|
@ -474,7 +474,7 @@ pub fn maybe_create_entry_wrapper<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||
(rust_main, start_ty, vec![arg_argc, arg_argv])
|
||||
};
|
||||
|
||||
let result = bx.call(start_ty, start_fn, &args, None);
|
||||
let result = bx.call(start_ty, None, start_fn, &args, None);
|
||||
let cast = bx.intcast(result, cx.type_int(), true);
|
||||
bx.ret(cast);
|
||||
|
||||
|
|
|
@ -162,9 +162,15 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
|
|||
} else {
|
||||
fx.unreachable_block()
|
||||
};
|
||||
let invokeret =
|
||||
bx.invoke(fn_ty, fn_ptr, &llargs, ret_llbb, unwind_block, self.funclet(fx));
|
||||
bx.apply_attrs_callsite(&fn_abi, invokeret);
|
||||
let invokeret = bx.invoke(
|
||||
fn_ty,
|
||||
Some(&fn_abi),
|
||||
fn_ptr,
|
||||
&llargs,
|
||||
ret_llbb,
|
||||
unwind_block,
|
||||
self.funclet(fx),
|
||||
);
|
||||
if fx.mir[self.bb].is_cleanup {
|
||||
bx.do_not_inline(invokeret);
|
||||
}
|
||||
|
@ -178,8 +184,7 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> {
|
|||
fx.store_return(bx, ret_dest, &fn_abi.ret, invokeret);
|
||||
}
|
||||
} else {
|
||||
let llret = bx.call(fn_ty, fn_ptr, &llargs, self.funclet(fx));
|
||||
bx.apply_attrs_callsite(&fn_abi, llret);
|
||||
let llret = bx.call(fn_ty, Some(&fn_abi), fn_ptr, &llargs, self.funclet(fx));
|
||||
if fx.mir[self.bb].is_cleanup {
|
||||
// Cleanup is always the cold path. Don't inline
|
||||
// drop glue. Also, when there is a deeply-nested
|
||||
|
@ -1533,8 +1538,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
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);
|
||||
bx.apply_attrs_callsite(&fn_abi, llret);
|
||||
let llret = bx.call(fn_ty, Some(&fn_abi), fn_ptr, &[], None);
|
||||
bx.do_not_inline(llret);
|
||||
|
||||
bx.unreachable();
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
use super::BackendTypes;
|
||||
use rustc_middle::ty::Ty;
|
||||
use rustc_target::abi::call::FnAbi;
|
||||
|
||||
pub trait AbiBuilderMethods<'tcx>: BackendTypes {
|
||||
fn apply_attrs_callsite(&mut self, fn_abi: &FnAbi<'tcx, Ty<'tcx>>, callsite: Self::Value);
|
||||
fn get_param(&mut self, index: usize) -> Self::Value;
|
||||
}
|
||||
|
|
|
@ -17,6 +17,7 @@ use crate::MemFlags;
|
|||
use rustc_middle::ty::layout::{HasParamEnv, TyAndLayout};
|
||||
use rustc_middle::ty::Ty;
|
||||
use rustc_span::Span;
|
||||
use rustc_target::abi::call::FnAbi;
|
||||
use rustc_target::abi::{Abi, Align, Scalar, Size, WrappingRange};
|
||||
use rustc_target::spec::HasTargetSpec;
|
||||
|
||||
|
@ -71,6 +72,7 @@ pub trait BuilderMethods<'a, 'tcx>:
|
|||
fn invoke(
|
||||
&mut self,
|
||||
llty: Self::Type,
|
||||
fn_abi: Option<&FnAbi<'tcx, Ty<'tcx>>>,
|
||||
llfn: Self::Value,
|
||||
args: &[Self::Value],
|
||||
then: Self::BasicBlock,
|
||||
|
@ -320,6 +322,7 @@ pub trait BuilderMethods<'a, 'tcx>:
|
|||
fn call(
|
||||
&mut self,
|
||||
llty: Self::Type,
|
||||
fn_abi: Option<&FnAbi<'tcx, Ty<'tcx>>>,
|
||||
llfn: Self::Value,
|
||||
args: &[Self::Value],
|
||||
funclet: Option<&Self::Funclet>,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue