about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2022-03-18 03:01:46 +0000
committerbors <bors@rust-lang.org>2022-03-18 03:01:46 +0000
commitd6f3a4ecb48ead838638e902f2fa4e5f3059779b (patch)
treea0ced664fbcf095dac8d3b0a498b9ce8b335cb53 /src
parentcd119057160cedea245aa2679add56723f3dc784 (diff)
parent0254e318b820d79bb448d4d22d93e345e67b25eb (diff)
downloadrust-d6f3a4ecb48ead838638e902f2fa4e5f3059779b.tar.gz
rust-d6f3a4ecb48ead838638e902f2fa4e5f3059779b.zip
Auto merge of #88098 - Amanieu:oom_panic, r=nagisa
Implement -Z oom=panic

This PR removes the `#[rustc_allocator_nounwind]` attribute on `alloc_error_handler` which allows it to unwind with a panic instead of always aborting. This is then used to implement `-Z oom=panic` as per RFC 2116 (tracking issue #43596).

Perf and binary size tests show negligible impact.
Diffstat (limited to 'src')
-rw-r--r--src/test/ui/oom_unwind.rs23
-rw-r--r--src/tools/tidy/src/ui_tests.rs2
2 files changed, 24 insertions, 1 deletions
diff --git a/src/test/ui/oom_unwind.rs b/src/test/ui/oom_unwind.rs
new file mode 100644
index 00000000000..d036c817a0e
--- /dev/null
+++ b/src/test/ui/oom_unwind.rs
@@ -0,0 +1,23 @@
+// compile-flags: -Z oom=panic
+// run-pass
+// no-prefer-dynamic
+// needs-unwind
+// only-linux
+
+#![feature(bench_black_box)]
+
+use std::hint::black_box;
+use std::mem::forget;
+use std::panic::catch_unwind;
+
+fn main() {
+    let panic = catch_unwind(|| {
+        // This is guaranteed to exceed even the size of the address space
+        for _ in 0..16 {
+            // Truncates to a suitable value for both 32-bit and 64-bit targets.
+            let alloc_size = 0x1000_0000_1000_0000u64 as usize;
+            forget(black_box(vec![0u8; alloc_size]));
+        }
+    });
+    assert!(panic.is_err());
+}
diff --git a/src/tools/tidy/src/ui_tests.rs b/src/tools/tidy/src/ui_tests.rs
index 95847dcd46b..7b932b867f2 100644
--- a/src/tools/tidy/src/ui_tests.rs
+++ b/src/tools/tidy/src/ui_tests.rs
@@ -7,7 +7,7 @@ use std::path::Path;
 
 const ENTRY_LIMIT: usize = 1000;
 // FIXME: The following limits should be reduced eventually.
-const ROOT_ENTRY_LIMIT: usize = 983;
+const ROOT_ENTRY_LIMIT: usize = 984;
 const ISSUES_ENTRY_LIMIT: usize = 2310;
 
 fn check_entries(path: &Path, bad: &mut bool) {