diff options
| author | Jorge Aparicio <jorge@japaric.io> | 2018-08-23 16:39:03 +0200 |
|---|---|---|
| committer | Jorge Aparicio <jorge@japaric.io> | 2018-09-22 21:01:21 +0200 |
| commit | bc5b567a324b9fdab314458f501818269560bd77 (patch) | |
| tree | d606129223dad7697b490f20cab2514312cb17bd | |
| parent | 33c10eae904a69422b47501444fc319185cc5158 (diff) | |
| download | rust-bc5b567a324b9fdab314458f501818269560bd77.tar.gz rust-bc5b567a324b9fdab314458f501818269560bd77.zip | |
move our check to reuse a previous computation
| -rw-r--r-- | src/librustc_codegen_llvm/mir/block.rs | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/src/librustc_codegen_llvm/mir/block.rs b/src/librustc_codegen_llvm/mir/block.rs index b3ca78d59de..709fceb4925 100644 --- a/src/librustc_codegen_llvm/mir/block.rs +++ b/src/librustc_codegen_llvm/mir/block.rs @@ -463,8 +463,28 @@ impl FunctionCx<'a, 'll, 'tcx> { return; } + let extra_args = &args[sig.inputs().len()..]; + let extra_args = extra_args.iter().map(|op_arg| { + let op_ty = op_arg.ty(self.mir, bx.tcx()); + self.monomorphize(&op_ty) + }).collect::<Vec<_>>(); + + let fn_ty = match def { + Some(ty::InstanceDef::Virtual(..)) => { + FnType::new_vtable(bx.cx, sig, &extra_args) + } + Some(ty::InstanceDef::DropGlue(_, None)) => { + // empty drop glue - a nop. + let &(_, target) = destination.as_ref().unwrap(); + funclet_br(self, bx, target); + return; + } + _ => FnType::new(bx.cx, sig, &extra_args) + }; + + // emit a panic instead of instantiating an uninhabited type if (intrinsic == Some("init") || intrinsic == Some("uninit")) && - bx.cx.layout_of(sig.output()).abi.is_uninhabited() + fn_ty.ret.layout.abi.is_uninhabited() { let loc = bx.sess().source_map().lookup_char_pos(span.lo()); let filename = Symbol::intern(&loc.file.name.to_string()).as_str(); @@ -510,25 +530,6 @@ impl FunctionCx<'a, 'll, 'tcx> { return; } - let extra_args = &args[sig.inputs().len()..]; - let extra_args = extra_args.iter().map(|op_arg| { - let op_ty = op_arg.ty(self.mir, bx.tcx()); - self.monomorphize(&op_ty) - }).collect::<Vec<_>>(); - - let fn_ty = match def { - Some(ty::InstanceDef::Virtual(..)) => { - FnType::new_vtable(bx.cx, sig, &extra_args) - } - Some(ty::InstanceDef::DropGlue(_, None)) => { - // empty drop glue - a nop. - let &(_, target) = destination.as_ref().unwrap(); - funclet_br(self, bx, target); - return; - } - _ => FnType::new(bx.cx, sig, &extra_args) - }; - // The arguments we'll be passing. Plus one to account for outptr, if used. let arg_count = fn_ty.args.len() + fn_ty.ret.is_indirect() as usize; let mut llargs = Vec::with_capacity(arg_count); |
