about summary refs log tree commit diff
path: root/src/test/codegen
diff options
context:
space:
mode:
authorErik Desjardins <erikdesjardins@users.noreply.github.com>2021-12-29 15:28:31 -0500
committerErik Desjardins <erikdesjardins@users.noreply.github.com>2021-12-29 15:47:49 -0500
commit2b662217e745d88d93dcc6f5f5169bf7a0d9720e (patch)
tree0e471ecb5e4a57ae2f5f3aa70fdfe5895cf99e91 /src/test/codegen
parent7ae550842635dce84811198446fe87e830de500b (diff)
Mark drop calls in landing pads cold instead of noinline
Now that deferred inlining has been disabled in LLVM,
this shouldn't cause catastrophic size blowup.
Diffstat (limited to 'src/test/codegen')
-rw-r--r--src/test/codegen/unwind-landingpad-cold.rs14
-rw-r--r--src/test/codegen/unwind-landingpad-inline.rs22
2 files changed, 36 insertions, 0 deletions
diff --git a/src/test/codegen/unwind-landingpad-cold.rs b/src/test/codegen/unwind-landingpad-cold.rs
new file mode 100644
index 00000000000..0bf2941374a
--- /dev/null
+++ b/src/test/codegen/unwind-landingpad-cold.rs
@@ -0,0 +1,14 @@
+// compile-flags: -Cno-prepopulate-passes
+#![crate_type = "lib"]
+
+// This test checks that drop calls in unwind landing pads
+// get the `cold` attribute.
+
+// CHECK-LABEL: @check_cold
+// CHECK: call void {{.+}}drop_in_place{{.+}} [[ATTRIBUTES:#[0-9]+]]
+// CHECK: attributes [[ATTRIBUTES]] = { cold }
+#[no_mangle]
+pub fn check_cold(f: fn(), x: Box<u32>) {
+    // this may unwind
+    f();
+}
diff --git a/src/test/codegen/unwind-landingpad-inline.rs b/src/test/codegen/unwind-landingpad-inline.rs
new file mode 100644
index 00000000000..d641c908ea9
--- /dev/null
+++ b/src/test/codegen/unwind-landingpad-inline.rs
@@ -0,0 +1,22 @@
+// no-system-llvm: needs patch for Rust alloc/dealloc functions
+// compile-flags: -Copt-level=3
+#![crate_type = "lib"]
+
+// This test checks that we can inline drop_in_place in
+// unwind landing pads. Without this, the box pointers escape,
+// and LLVM will not optimize out the pointer comparison.
+// See https://github.com/rust-lang/rust/issues/46515
+
+// Everything should be optimized out.
+// CHECK-LABEL: @check_no_escape_in_landingpad
+// CHECK: start:
+// CHECK-NEXT: ret void
+#[no_mangle]
+pub fn check_no_escape_in_landingpad(f: fn()) {
+    let x = &*Box::new(0);
+    let y = &*Box::new(0);
+
+    if x as *const _ == y as *const _ {
+        f();
+    }
+}