diff options
| author | kadiwa <kalle.wachsmuth@gmail.com> | 2023-08-22 14:43:53 +0200 |
|---|---|---|
| committer | kadiwa <kalle.wachsmuth@gmail.com> | 2023-08-22 15:10:56 +0200 |
| commit | 265c1b5d5025a1cb3bdc26b99f35317079a55c36 (patch) | |
| tree | f3bdac82dd2d256c7d489f7d0dd82a184eaa2086 /tests/codegen/box-uninit-bytes.rs | |
| parent | 95305899b8493a65065ebdeae44e841d243621eb (diff) | |
| download | rust-265c1b5d5025a1cb3bdc26b99f35317079a55c36.tar.gz rust-265c1b5d5025a1cb3bdc26b99f35317079a55c36.zip | |
add regression test for not memcpying padding bytes
Diffstat (limited to 'tests/codegen/box-uninit-bytes.rs')
| -rw-r--r-- | tests/codegen/box-uninit-bytes.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/tests/codegen/box-uninit-bytes.rs b/tests/codegen/box-uninit-bytes.rs new file mode 100644 index 00000000000..732da0a1794 --- /dev/null +++ b/tests/codegen/box-uninit-bytes.rs @@ -0,0 +1,46 @@ +// compile-flags: -O +#![crate_type = "lib"] + +use std::mem::MaybeUninit; + +// Boxing a `MaybeUninit` value should not copy junk from the stack +#[no_mangle] +pub fn box_uninitialized() -> Box<MaybeUninit<usize>> { + // CHECK-LABEL: @box_uninitialized + // CHECK-NOT: store + // CHECK-NOT: alloca + // CHECK-NOT: memcpy + // CHECK-NOT: memset + Box::new(MaybeUninit::uninit()) +} + +// https://github.com/rust-lang/rust/issues/58201 +#[no_mangle] +pub fn box_uninitialized2() -> Box<MaybeUninit<[usize; 1024 * 1024]>> { + // CHECK-LABEL: @box_uninitialized2 + // CHECK-NOT: store + // CHECK-NOT: alloca + // CHECK-NOT: memcpy + // CHECK-NOT: memset + Box::new(MaybeUninit::uninit()) +} + +#[repr(align(1024))] +pub struct LotsaPadding(usize); + +// Boxing a value with padding should not copy junk from the stack +#[no_mangle] +pub fn box_lotsa_padding() -> Box<LotsaPadding> { + // CHECK-LABEL: @box_lotsa_padding + // CHECK-NOT: alloca + // CHECK-NOT: getelementptr + // CHECK-NOT: memcpy + // CHECK-NOT: memset + Box::new(LotsaPadding(42)) +} + +// Hide the `allocalign` attribute in the declaration of __rust_alloc +// from the CHECK-NOT above, and also verify the attributes got set reasonably. +// CHECK: declare {{(dso_local )?}}noalias noundef ptr @__rust_alloc(i{{[0-9]+}} noundef, i{{[0-9]+}} allocalign noundef) unnamed_addr [[RUST_ALLOC_ATTRS:#[0-9]+]] + +// CHECK-DAG: attributes [[RUST_ALLOC_ATTRS]] = { {{.*}} allockind("alloc,uninitialized,aligned") allocsize(0) {{(uwtable )?}}"alloc-family"="__rust_alloc" {{.*}} } |
