Auto merge of #100999 - nnethercote:shrink-FnAbi, r=bjorn3
Shrink `FnAbi` Because they can take up a lot of memory in debug and release builds. r? `@bjorn3`
This commit is contained in:
commit
332cc8fb75
35 changed files with 165 additions and 181 deletions
|
@ -21,7 +21,7 @@ use rustc_middle::ty::{self, Instance, Ty, TypeVisitable};
|
|||
use rustc_span::source_map::Span;
|
||||
use rustc_span::{sym, Symbol};
|
||||
use rustc_symbol_mangling::typeid::typeid_for_fnabi;
|
||||
use rustc_target::abi::call::{ArgAbi, FnAbi, PassMode};
|
||||
use rustc_target::abi::call::{ArgAbi, FnAbi, PassMode, Reg};
|
||||
use rustc_target::abi::{self, HasDataLayout, WrappingRange};
|
||||
use rustc_target::spec::abi::Abi;
|
||||
|
||||
|
@ -324,7 +324,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
bx.unreachable();
|
||||
return;
|
||||
}
|
||||
let llval = match self.fn_abi.ret.mode {
|
||||
let llval = match &self.fn_abi.ret.mode {
|
||||
PassMode::Ignore | PassMode::Indirect { .. } => {
|
||||
bx.ret_void();
|
||||
return;
|
||||
|
@ -339,7 +339,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
}
|
||||
}
|
||||
|
||||
PassMode::Cast(cast_ty) => {
|
||||
PassMode::Cast(cast_ty, _) => {
|
||||
let op = match self.locals[mir::RETURN_PLACE] {
|
||||
LocalRef::Operand(Some(op)) => op,
|
||||
LocalRef::Operand(None) => bug!("use of return before def"),
|
||||
|
@ -360,7 +360,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
llval
|
||||
}
|
||||
};
|
||||
let ty = bx.cast_backend_type(&cast_ty);
|
||||
let ty = bx.cast_backend_type(cast_ty);
|
||||
let addr = bx.pointercast(llslot, bx.type_ptr_to(ty));
|
||||
bx.load(ty, addr, self.fn_abi.ret.layout.align.abi)
|
||||
}
|
||||
|
@ -1158,39 +1158,35 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
llargs: &mut Vec<Bx::Value>,
|
||||
arg: &ArgAbi<'tcx, Ty<'tcx>>,
|
||||
) {
|
||||
// Fill padding with undef value, where applicable.
|
||||
if let Some(ty) = arg.pad {
|
||||
llargs.push(bx.const_undef(bx.reg_backend_type(&ty)))
|
||||
}
|
||||
|
||||
if arg.is_ignore() {
|
||||
return;
|
||||
}
|
||||
|
||||
if let PassMode::Pair(..) = arg.mode {
|
||||
match op.val {
|
||||
match arg.mode {
|
||||
PassMode::Ignore => return,
|
||||
PassMode::Cast(_, true) => {
|
||||
// Fill padding with undef value, where applicable.
|
||||
llargs.push(bx.const_undef(bx.reg_backend_type(&Reg::i32())));
|
||||
}
|
||||
PassMode::Pair(..) => match op.val {
|
||||
Pair(a, b) => {
|
||||
llargs.push(a);
|
||||
llargs.push(b);
|
||||
return;
|
||||
}
|
||||
_ => bug!("codegen_argument: {:?} invalid for pair argument", op),
|
||||
}
|
||||
} else if arg.is_unsized_indirect() {
|
||||
match op.val {
|
||||
},
|
||||
PassMode::Indirect { attrs: _, extra_attrs: Some(_), on_stack: _ } => match op.val {
|
||||
Ref(a, Some(b), _) => {
|
||||
llargs.push(a);
|
||||
llargs.push(b);
|
||||
return;
|
||||
}
|
||||
_ => bug!("codegen_argument: {:?} invalid for unsized indirect argument", op),
|
||||
}
|
||||
},
|
||||
_ => {}
|
||||
}
|
||||
|
||||
// Force by-ref if we have to load through a cast pointer.
|
||||
let (mut llval, align, by_ref) = match op.val {
|
||||
Immediate(_) | Pair(..) => match arg.mode {
|
||||
PassMode::Indirect { .. } | PassMode::Cast(_) => {
|
||||
PassMode::Indirect { .. } | PassMode::Cast(..) => {
|
||||
let scratch = PlaceRef::alloca(bx, arg.layout);
|
||||
op.val.store(bx, scratch);
|
||||
(scratch.llval, scratch.align, true)
|
||||
|
@ -1222,8 +1218,8 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
|
||||
if by_ref && !arg.is_indirect() {
|
||||
// Have to load the argument, maybe while casting it.
|
||||
if let PassMode::Cast(ty) = arg.mode {
|
||||
let llty = bx.cast_backend_type(&ty);
|
||||
if let PassMode::Cast(ty, _) = &arg.mode {
|
||||
let llty = bx.cast_backend_type(ty);
|
||||
let addr = bx.pointercast(llval, bx.type_ptr_to(llty));
|
||||
llval = bx.load(llty, addr, align.min(arg.layout.align.abi));
|
||||
} else {
|
||||
|
@ -1622,7 +1618,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
}
|
||||
DirectOperand(index) => {
|
||||
// If there is a cast, we have to store and reload.
|
||||
let op = if let PassMode::Cast(_) = ret_abi.mode {
|
||||
let op = if let PassMode::Cast(..) = ret_abi.mode {
|
||||
let tmp = PlaceRef::alloca(bx, ret_abi.layout);
|
||||
tmp.storage_live(bx);
|
||||
bx.store_arg(&ret_abi, llval, tmp);
|
||||
|
|
|
@ -597,8 +597,8 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
};
|
||||
|
||||
if !fn_abi.ret.is_ignore() {
|
||||
if let PassMode::Cast(ty) = fn_abi.ret.mode {
|
||||
let ptr_llty = bx.type_ptr_to(bx.cast_backend_type(&ty));
|
||||
if let PassMode::Cast(ty, _) = &fn_abi.ret.mode {
|
||||
let ptr_llty = bx.type_ptr_to(bx.cast_backend_type(ty));
|
||||
let ptr = bx.pointercast(result.llval, ptr_llty);
|
||||
bx.store(llval, ptr, result.align);
|
||||
} else {
|
||||
|
|
|
@ -283,7 +283,7 @@ fn arg_local_refs<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||
for i in 0..tupled_arg_tys.len() {
|
||||
let arg = &fx.fn_abi.args[idx];
|
||||
idx += 1;
|
||||
if arg.pad.is_some() {
|
||||
if let PassMode::Cast(_, true) = arg.mode {
|
||||
llarg_idx += 1;
|
||||
}
|
||||
let pr_field = place.project_field(bx, i);
|
||||
|
@ -309,7 +309,7 @@ fn arg_local_refs<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||
|
||||
let arg = &fx.fn_abi.args[idx];
|
||||
idx += 1;
|
||||
if arg.pad.is_some() {
|
||||
if let PassMode::Cast(_, true) = arg.mode {
|
||||
llarg_idx += 1;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue