Pass a location to #[track_caller] functions in codegen_call_terminator.
This commit is contained in:
parent
fa6bb39855
commit
207f520827
2 changed files with 29 additions and 4 deletions
|
|
@ -770,6 +770,18 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
&fn_abi.args[first_args.len()..])
|
||||
}
|
||||
|
||||
let needs_location =
|
||||
instance.map(|i| i.def.requires_caller_location(self.cx.tcx())).unwrap_or_default();
|
||||
if needs_location {
|
||||
assert_eq!(
|
||||
fn_abi.args.len(), args.len() + 1,
|
||||
"#[track_caller] fn's must have 1 more argument in their ABI than in their MIR",
|
||||
);
|
||||
let location = self.get_caller_location(&mut bx, span);
|
||||
let last_arg = &fn_abi.args.last().unwrap();
|
||||
self.codegen_argument(&mut bx, location, &mut llargs, last_arg);
|
||||
}
|
||||
|
||||
let fn_ptr = match (llfn, instance) {
|
||||
(Some(llfn), _) => llfn,
|
||||
(None, Some(instance)) => bx.get_fn_addr(instance),
|
||||
|
|
|
|||
|
|
@ -182,7 +182,7 @@ pub fn codegen_mir<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||
|
||||
// Allocate variable and temp allocas
|
||||
fx.locals = {
|
||||
let args = arg_local_refs(&mut bx, &fx, &memory_locals);
|
||||
let args = arg_local_refs(&mut bx, &mut fx, &memory_locals);
|
||||
|
||||
let mut allocate_local = |local| {
|
||||
let decl = &mir_body.local_decls[local];
|
||||
|
|
@ -324,14 +324,14 @@ fn create_funclets<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||
/// indirect.
|
||||
fn arg_local_refs<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
||||
bx: &mut Bx,
|
||||
fx: &FunctionCx<'a, 'tcx, Bx>,
|
||||
fx: &mut FunctionCx<'a, 'tcx, Bx>,
|
||||
memory_locals: &BitSet<mir::Local>,
|
||||
) -> Vec<LocalRef<'tcx, Bx::Value>> {
|
||||
let mir = fx.mir;
|
||||
let mut idx = 0;
|
||||
let mut llarg_idx = fx.fn_abi.ret.is_indirect() as usize;
|
||||
|
||||
mir.args_iter().enumerate().map(|(arg_index, local)| {
|
||||
let args = mir.args_iter().enumerate().map(|(arg_index, local)| {
|
||||
let arg_decl = &mir.local_decls[local];
|
||||
|
||||
if Some(local) == mir.spread_arg {
|
||||
|
|
@ -427,7 +427,20 @@ fn arg_local_refs<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||
bx.store_fn_arg(arg, &mut llarg_idx, tmp);
|
||||
LocalRef::Place(tmp)
|
||||
}
|
||||
}).collect()
|
||||
}).collect::<Vec<_>>();
|
||||
|
||||
if fx.instance.def.requires_caller_location(bx.tcx()) {
|
||||
assert_eq!(
|
||||
fx.fn_abi.args.len(), args.len() + 1,
|
||||
"#[track_caller] fn's must have 1 more argument in their ABI than in their MIR",
|
||||
);
|
||||
let arg = &fx.fn_abi.args.last().unwrap();
|
||||
let place = PlaceRef::alloca(bx, arg.layout);
|
||||
bx.store_fn_arg(arg, &mut llarg_idx, place);
|
||||
fx.caller_location = Some(place);
|
||||
}
|
||||
|
||||
args
|
||||
}
|
||||
|
||||
mod analyze;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue