Dedup some intrinsic handling code for caller_location
This commit is contained in:
parent
98e8601ac3
commit
e32eb4c9e9
1 changed files with 12 additions and 25 deletions
|
@ -902,31 +902,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
||||||
// The arguments we'll be passing. Plus one to account for outptr, if used.
|
// The arguments we'll be passing. Plus one to account for outptr, if used.
|
||||||
let arg_count = fn_abi.args.len() + fn_abi.ret.is_indirect() as usize;
|
let arg_count = fn_abi.args.len() + fn_abi.ret.is_indirect() as usize;
|
||||||
|
|
||||||
if matches!(intrinsic, Some(ty::IntrinsicDef { name: sym::caller_location, .. })) {
|
|
||||||
return if let Some(target) = target {
|
|
||||||
let location =
|
|
||||||
self.get_caller_location(bx, mir::SourceInfo { span: fn_span, ..source_info });
|
|
||||||
|
|
||||||
let mut llargs = Vec::with_capacity(arg_count);
|
|
||||||
let ret_dest = self.make_return_dest(
|
|
||||||
bx,
|
|
||||||
destination,
|
|
||||||
&fn_abi.ret,
|
|
||||||
&mut llargs,
|
|
||||||
intrinsic,
|
|
||||||
Some(target),
|
|
||||||
);
|
|
||||||
assert_eq!(llargs, []);
|
|
||||||
if let ReturnDest::IndirectOperand(tmp, _) = ret_dest {
|
|
||||||
location.val.store(bx, tmp);
|
|
||||||
}
|
|
||||||
self.store_return(bx, ret_dest, &fn_abi.ret, location.immediate());
|
|
||||||
helper.funclet_br(self, bx, target, mergeable_succ)
|
|
||||||
} else {
|
|
||||||
MergingSucc::False
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
let instance = match intrinsic {
|
let instance = match intrinsic {
|
||||||
None => instance,
|
None => instance,
|
||||||
Some(intrinsic) => {
|
Some(intrinsic) => {
|
||||||
|
@ -971,6 +946,18 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
if matches!(intrinsic, ty::IntrinsicDef { name: sym::caller_location, .. }) {
|
||||||
|
let location = self
|
||||||
|
.get_caller_location(bx, mir::SourceInfo { span: fn_span, ..source_info });
|
||||||
|
|
||||||
|
assert_eq!(llargs, []);
|
||||||
|
if let ReturnDest::IndirectOperand(tmp, _) = ret_dest {
|
||||||
|
location.val.store(bx, tmp);
|
||||||
|
}
|
||||||
|
self.store_return(bx, ret_dest, &fn_abi.ret, location.immediate());
|
||||||
|
return helper.funclet_br(self, bx, target.unwrap(), mergeable_succ);
|
||||||
|
}
|
||||||
|
|
||||||
let instance = *instance.as_ref().unwrap();
|
let instance = *instance.as_ref().unwrap();
|
||||||
match Self::codegen_intrinsic_call(bx, instance, fn_abi, &args, dest, span) {
|
match Self::codegen_intrinsic_call(bx, instance, fn_abi, &args, dest, span) {
|
||||||
Ok(()) => {
|
Ok(()) => {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue