Rollup merge of #130466 - davidtwco:aarch64-transparent-test, r=jieyouxu
tests: add repr/transparent test for aarch64 Fixes #74396. Moves `transparent-struct-ptr.rs` to `transparent-byval-struct-ptr.rs` and then adds a new `transparent-opaque-ptr.rs` for aarch64.
This commit is contained in:
commit
b21581d1cb
@ -14,8 +14,9 @@
|
||||
|
||||
// See ./transparent.rs
|
||||
// Some platforms pass large aggregates using immediate arrays in LLVMIR
|
||||
// Other platforms pass large aggregates using struct pointer in LLVMIR
|
||||
// This covers the "struct pointer" case.
|
||||
// Other platforms pass large aggregates using by-value struct pointer in LLVMIR
|
||||
// Yet more platforms pass large aggregates using opaque pointer in LLVMIR
|
||||
// This covers the "by-value struct pointer" case.
|
||||
|
||||
#![feature(no_core, lang_items, transparent_unions)]
|
||||
#![crate_type = "lib"]
|
@ -18,7 +18,8 @@
|
||||
|
||||
// See ./transparent.rs
|
||||
// Some platforms pass large aggregates using immediate arrays in LLVMIR
|
||||
// Other platforms pass large aggregates using struct pointer in LLVMIR
|
||||
// Other platforms pass large aggregates using by-value struct pointer in LLVMIR
|
||||
// Yet more platforms pass large aggregates using opaque pointer in LLVMIR
|
||||
// This covers the "immediate array" case.
|
||||
|
||||
#![feature(no_core, lang_items, transparent_unions)]
|
||||
|
111
tests/codegen/repr/transparent-opaque-ptr.rs
Normal file
111
tests/codegen/repr/transparent-opaque-ptr.rs
Normal file
@ -0,0 +1,111 @@
|
||||
//@ revisions: aarch64-linux aarch64-darwin
|
||||
//@ compile-flags: -O -C no-prepopulate-passes
|
||||
|
||||
//@[aarch64-linux] compile-flags: --target aarch64-unknown-linux-gnu
|
||||
//@[aarch64-linux] needs-llvm-components: aarch64
|
||||
//@[aarch64-darwin] compile-flags: --target aarch64-apple-darwin
|
||||
//@[aarch64-darwin] needs-llvm-components: aarch64
|
||||
|
||||
// See ./transparent.rs
|
||||
// Some platforms pass large aggregates using immediate arrays in LLVMIR
|
||||
// Other platforms pass large aggregates using by-value struct pointer in LLVMIR
|
||||
// Yet more platforms pass large aggregates using opaque pointer in LLVMIR
|
||||
// This covers the "opaque pointer" case.
|
||||
|
||||
#![feature(no_core, lang_items, transparent_unions)]
|
||||
#![crate_type = "lib"]
|
||||
#![no_std]
|
||||
#![no_core]
|
||||
|
||||
#[lang = "sized"]
|
||||
trait Sized {}
|
||||
#[lang = "freeze"]
|
||||
trait Freeze {}
|
||||
#[lang = "copy"]
|
||||
trait Copy {}
|
||||
|
||||
impl Copy for [u32; 16] {}
|
||||
impl Copy for BigS {}
|
||||
impl Copy for BigU {}
|
||||
|
||||
#[repr(C)]
|
||||
pub struct BigS([u32; 16]);
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct TsBigS(BigS);
|
||||
|
||||
#[repr(transparent)]
|
||||
pub union TuBigS {
|
||||
field: BigS,
|
||||
}
|
||||
|
||||
#[repr(transparent)]
|
||||
pub enum TeBigS {
|
||||
Variant(BigS),
|
||||
}
|
||||
|
||||
// CHECK: define{{.*}}void @test_BigS(ptr [[BIGS_RET_ATTRS1:.*]] sret([64 x i8]) [[BIGS_RET_ATTRS2:.*]], ptr [[BIGS_ARG_ATTRS1:.*]])
|
||||
#[no_mangle]
|
||||
pub extern "C" fn test_BigS(_: BigS) -> BigS {
|
||||
loop {}
|
||||
}
|
||||
|
||||
// CHECK: define{{.*}}void @test_TsBigS(ptr [[BIGS_RET_ATTRS1]] sret([64 x i8]) [[BIGS_RET_ATTRS2]], ptr [[BIGS_ARG_ATTRS1]])
|
||||
#[no_mangle]
|
||||
pub extern "C" fn test_TsBigS(_: TsBigS) -> TsBigS {
|
||||
loop {}
|
||||
}
|
||||
|
||||
// CHECK: define{{.*}}void @test_TuBigS(ptr [[BIGS_RET_ATTRS1]] sret([64 x i8]) [[BIGS_RET_ATTRS2]], ptr [[BIGS_ARG_ATTRS1]])
|
||||
#[no_mangle]
|
||||
pub extern "C" fn test_TuBigS(_: TuBigS) -> TuBigS {
|
||||
loop {}
|
||||
}
|
||||
|
||||
// CHECK: define{{.*}}void @test_TeBigS(ptr [[BIGS_RET_ATTRS1]] sret([64 x i8]) [[BIGS_RET_ATTRS2]], ptr [[BIGS_ARG_ATTRS1]])
|
||||
#[no_mangle]
|
||||
pub extern "C" fn test_TeBigS(_: TeBigS) -> TeBigS {
|
||||
loop {}
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub union BigU {
|
||||
foo: [u32; 16],
|
||||
}
|
||||
|
||||
#[repr(transparent)]
|
||||
pub struct TsBigU(BigU);
|
||||
|
||||
#[repr(transparent)]
|
||||
pub union TuBigU {
|
||||
field: BigU,
|
||||
}
|
||||
|
||||
#[repr(transparent)]
|
||||
pub enum TeBigU {
|
||||
Variant(BigU),
|
||||
}
|
||||
|
||||
// CHECK: define{{.*}}void @test_BigU(ptr [[BIGU_RET_ATTRS1:.*]] sret([64 x i8]) [[BIGU_RET_ATTRS2:.*]], ptr [[BIGU_ARG_ATTRS1:.*]])
|
||||
#[no_mangle]
|
||||
pub extern "C" fn test_BigU(_: BigU) -> BigU {
|
||||
loop {}
|
||||
}
|
||||
|
||||
// CHECK: define{{.*}}void @test_TsBigU(ptr [[BIGU_RET_ATTRS1:.*]] sret([64 x i8]) [[BIGU_RET_ATTRS2:.*]], ptr [[BIGU_ARG_ATTRS1]])
|
||||
#[no_mangle]
|
||||
pub extern "C" fn test_TsBigU(_: TsBigU) -> TsBigU {
|
||||
loop {}
|
||||
}
|
||||
|
||||
// CHECK: define{{.*}}void @test_TuBigU(ptr [[BIGU_RET_ATTRS1]] sret([64 x i8]) [[BIGU_RET_ATTRS2:.*]], ptr [[BIGU_ARG_ATTRS1]])
|
||||
#[no_mangle]
|
||||
pub extern "C" fn test_TuBigU(_: TuBigU) -> TuBigU {
|
||||
loop {}
|
||||
}
|
||||
|
||||
// CHECK: define{{.*}}void @test_TeBigU(ptr [[BIGU_RET_ATTRS1]] sret([64 x i8]) [[BIGU_RET_ATTRS2:.*]], ptr [[BIGU_ARG_ATTRS1]])
|
||||
#[no_mangle]
|
||||
pub extern "C" fn test_TeBigU(_: TeBigU) -> TeBigU {
|
||||
loop {}
|
||||
}
|
Loading…
Reference in New Issue
Block a user