diff options
| author | bors <bors@rust-lang.org> | 2024-03-29 00:24:01 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-03-29 00:24:01 +0000 |
| commit | db2f9759f43167755d4eebb0a1358df9766a505e (patch) | |
| tree | ea68aa6bcc2c8bfd7d8615bfabbafa9492410ebd /src | |
| parent | d74804636fa57e80d1e213fa9d2d65b27216b515 (diff) | |
| parent | 00f4daa27673a07bf9ad20f4707d97bc1079450f (diff) | |
| download | rust-db2f9759f43167755d4eebb0a1358df9766a505e.tar.gz rust-db2f9759f43167755d4eebb0a1358df9766a505e.zip | |
Auto merge of #122671 - Mark-Simulacrum:const-panic-msg, r=Nilstrieb
Codegen const panic messages as function calls
This skips emitting extra arguments at every callsite (of which there
can be many). For a librustc_driver build with overflow checks enabled,
this cuts 0.7MB from the resulting shared library (see [perf]).
A sample improvement from nightly:
```
leaq str.0(%rip), %rdi
leaq .Lalloc_d6aeb8e2aa19de39a7f0e861c998af13(%rip), %rdx
movl $25, %esi
callq *_ZN4core9panicking5panic17h17cabb89c5bcc999E@GOTPCREL(%rip)
```
to this PR:
```
leaq .Lalloc_d6aeb8e2aa19de39a7f0e861c998af13(%rip), %rdi
callq *_RNvNtNtCsduqIKoij8JB_4core9panicking11panic_const23panic_const_div_by_zero@GOTPCREL(%rip)
```
[perf]: https://perf.rust-lang.org/compare.html?start=a7e4de13c1785819f4d61da41f6704ed69d5f203&end=64fbb4f0b2d621ff46d559d1e9f5ad89a8d7789b&stat=instructions:u
Diffstat (limited to 'src')
| -rw-r--r-- | src/tools/miri/src/shims/panic.rs | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/tools/miri/src/shims/panic.rs b/src/tools/miri/src/shims/panic.rs index 34b6481dd38..bb31ef733cf 100644 --- a/src/tools/miri/src/shims/panic.rs +++ b/src/tools/miri/src/shims/panic.rs @@ -256,8 +256,16 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { } _ => { - // Forward everything else to `panic` lang item. - this.start_panic(msg.description(), unwind)?; + // Call the lang item associated with this message. + let fn_item = this.tcx.require_lang_item(msg.panic_function(), None); + let instance = ty::Instance::mono(this.tcx.tcx, fn_item); + this.call_function( + instance, + Abi::Rust, + &[], + None, + StackPopCleanup::Goto { ret: None, unwind }, + )?; } } Ok(()) |
