Rollup merge of #151469 - maurer:dead-on-return, r=nikic
llvm: Tolerate dead_on_return attribute changes The attribute now has a size parameter and sorts differently. Adjust tests to tolerate this. https://github.com/llvm/llvm-project/pull/171712 r? durin42 @rustbot label llvm-main
This commit is contained in:
commit
797601b84c
4 changed files with 11 additions and 5 deletions
|
|
@ -527,6 +527,12 @@ LLVMRustCreateAttrNoValue(LLVMContextRef C, LLVMRustAttributeKind RustAttr) {
|
|||
*unwrap(C), CaptureInfo(CaptureComponents::Address |
|
||||
CaptureComponents::ReadProvenance)));
|
||||
}
|
||||
#endif
|
||||
#if LLVM_VERSION_GE(23, 0)
|
||||
if (RustAttr == LLVMRustAttributeKind::DeadOnReturn) {
|
||||
return wrap(Attribute::getWithDeadOnReturnInfo(*unwrap(C),
|
||||
llvm::DeadOnReturnInfo()));
|
||||
}
|
||||
#endif
|
||||
return wrap(Attribute::get(*unwrap(C), fromRust(RustAttr)));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
// Test for the absence of `readonly` on the argument when it is mutated via `&raw const`.
|
||||
// See <https://github.com/rust-lang/rust/issues/111502>.
|
||||
|
||||
// CHECK: i8 @foo(ptr{{( dead_on_return)?}} noalias noundef align 1{{( captures\(address\))?}} dereferenceable(128) %x)
|
||||
// CHECK: i8 @foo(ptr{{( dead_on_return)?}} noalias noundef align 1{{( captures\(address\))?}}{{( dead_on_return)?}} dereferenceable(128) %x)
|
||||
#[no_mangle]
|
||||
pub fn foo(x: [u8; 128]) -> u8 {
|
||||
let ptr = core::ptr::addr_of!(x).cast_mut();
|
||||
|
|
@ -15,7 +15,7 @@ pub fn foo(x: [u8; 128]) -> u8 {
|
|||
x[0]
|
||||
}
|
||||
|
||||
// CHECK: i1 @second(ptr{{( dead_on_return)?}} noalias noundef align {{[0-9]+}}{{( captures\(address\))?}} dereferenceable({{[0-9]+}}) %a_ptr_and_b)
|
||||
// CHECK: i1 @second(ptr{{( dead_on_return)?}} noalias noundef align {{[0-9]+}}{{( captures\(address\))?}}{{( dead_on_return)?}} dereferenceable({{[0-9]+}}) %a_ptr_and_b)
|
||||
#[no_mangle]
|
||||
pub unsafe fn second(a_ptr_and_b: (*mut (i32, bool), (i64, bool))) -> bool {
|
||||
let b_bool_ptr = core::ptr::addr_of!(a_ptr_and_b.1.1).cast_mut();
|
||||
|
|
@ -24,7 +24,7 @@ pub unsafe fn second(a_ptr_and_b: (*mut (i32, bool), (i64, bool))) -> bool {
|
|||
}
|
||||
|
||||
// If going through a deref (and there are no other mutating accesses), then `readonly` is fine.
|
||||
// CHECK: i1 @third(ptr{{( dead_on_return)?}} noalias noundef readonly align {{[0-9]+}}{{( captures\(none\))?}} dereferenceable({{[0-9]+}}) %a_ptr_and_b)
|
||||
// CHECK: i1 @third(ptr{{( dead_on_return)?}} noalias noundef readonly align {{[0-9]+}}{{( captures\(none\))?}}{{( dead_on_return)?}} dereferenceable({{[0-9]+}}) %a_ptr_and_b)
|
||||
#[no_mangle]
|
||||
pub unsafe fn third(a_ptr_and_b: (*mut (i32, bool), (i64, bool))) -> bool {
|
||||
let b_bool_ptr = core::ptr::addr_of!((*a_ptr_and_b.0).1).cast_mut();
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ pub fn mutable_notunpin_borrow(_: &mut NotUnpin) {}
|
|||
#[no_mangle]
|
||||
pub fn notunpin_borrow(_: &NotUnpin) {}
|
||||
|
||||
// CHECK: @indirect_struct(ptr{{( dead_on_return)?}} noalias noundef readonly align 4{{( captures\(none\))?}} dereferenceable(32) %_1)
|
||||
// CHECK: @indirect_struct(ptr{{( dead_on_return)?}} noalias noundef readonly align 4{{( captures\(none\))?}}{{( dead_on_return)?}} dereferenceable(32) %_1)
|
||||
#[no_mangle]
|
||||
pub fn indirect_struct(_: S) {}
|
||||
|
||||
|
|
|
|||
|
|
@ -256,7 +256,7 @@ pub struct IntDoubleInt {
|
|||
c: i32,
|
||||
}
|
||||
|
||||
// CHECK: define void @f_int_double_int_s_arg(ptr{{( dead_on_return)?}} noalias noundef align 8{{( captures\(address\))?}} dereferenceable(24) %a)
|
||||
// CHECK: define void @f_int_double_int_s_arg(ptr{{( dead_on_return)?}} noalias noundef align 8{{( captures\(address\))?}}{{( dead_on_return)?}} dereferenceable(24) %a)
|
||||
#[no_mangle]
|
||||
pub extern "C" fn f_int_double_int_s_arg(a: IntDoubleInt) {}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue