Auto merge of #37153 - michaelwoerister:spread-arg-debuginfo, r=eddyb
debuginfo: Handle spread_arg case in MIR-trans in a more stable way. Use `VariableAccess::DirectVariable` instead of `VariableAccess::IndirectVariable` in order not to make LLVM's SROA angry. This is a step towards fixing #36774 and #35547. At least, I can build Cargo with optimizations + debuginfo again. r? @eddyb
This commit is contained in:
commit
da7f8c540b
@ -371,7 +371,6 @@ fn arg_local_refs<'bcx, 'tcx>(bcx: &BlockAndBuilder<'bcx, 'tcx>,
|
||||
_ => bug!("spread argument isn't a tuple?!")
|
||||
};
|
||||
|
||||
let lltuplety = type_of::type_of(bcx.ccx(), arg_ty);
|
||||
let lltemp = bcx.with_block(|bcx| {
|
||||
base::alloc_ty(bcx, arg_ty, &format!("arg{}", arg_index))
|
||||
});
|
||||
@ -391,27 +390,20 @@ fn arg_local_refs<'bcx, 'tcx>(bcx: &BlockAndBuilder<'bcx, 'tcx>,
|
||||
} else {
|
||||
arg.store_fn_arg(bcx, &mut llarg_idx, dst);
|
||||
}
|
||||
|
||||
bcx.with_block(|bcx| arg_scope.map(|scope| {
|
||||
let byte_offset_of_var_in_tuple =
|
||||
machine::llelement_offset(bcx.ccx(), lltuplety, i);
|
||||
|
||||
let ops = unsafe {
|
||||
[llvm::LLVMRustDIBuilderCreateOpDeref(),
|
||||
llvm::LLVMRustDIBuilderCreateOpPlus(),
|
||||
byte_offset_of_var_in_tuple as i64]
|
||||
};
|
||||
|
||||
let variable_access = VariableAccess::IndirectVariable {
|
||||
alloca: lltemp,
|
||||
address_operations: &ops
|
||||
};
|
||||
declare_local(bcx, keywords::Invalid.name(),
|
||||
tupled_arg_ty, scope, variable_access,
|
||||
VariableKind::ArgumentVariable(arg_index + i + 1),
|
||||
bcx.fcx().span.unwrap_or(DUMMY_SP));
|
||||
}));
|
||||
}
|
||||
|
||||
// Now that we have one alloca that contains the aggregate value,
|
||||
// we can create one debuginfo entry for the argument.
|
||||
bcx.with_block(|bcx| arg_scope.map(|scope| {
|
||||
let variable_access = VariableAccess::DirectVariable {
|
||||
alloca: lltemp
|
||||
};
|
||||
declare_local(bcx, arg_decl.name.unwrap_or(keywords::Invalid.name()),
|
||||
arg_ty, scope, variable_access,
|
||||
VariableKind::ArgumentVariable(arg_index + 1),
|
||||
bcx.fcx().span.unwrap_or(DUMMY_SP));
|
||||
}));
|
||||
|
||||
return LocalRef::Lvalue(LvalueRef::new_sized(lltemp, LvalueTy::from_ty(arg_ty)));
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user