diff options
| author | bors <bors@rust-lang.org> | 2024-07-08 04:35:04 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-07-08 04:35:04 +0000 |
| commit | 776ab988c1a1015ce1c6e840ea83b989940635fd (patch) | |
| tree | f7aba998d9f92a671bc09abb4dd1ba75e232916a /tests/codegen/patchable-function-entry | |
| parent | 8620e85a1ce15e213b30db3f130f7360f4c7396d (diff) | |
| parent | 9978261a6e38ca3583cdf3eb2956cb4d14cd5a6f (diff) | |
| download | rust-776ab988c1a1015ce1c6e840ea83b989940635fd.tar.gz rust-776ab988c1a1015ce1c6e840ea83b989940635fd.zip | |
Auto merge of #113128 - WaffleLapkin:become_trully_unuwuable, r=oli-obk,RalfJung
Support tail calls in mir via `TerminatorKind::TailCall`
This is one of the interesting bits in tail call implementation — MIR support.
This adds a new `TerminatorKind` which represents a tail call:
```rust
TailCall {
func: Operand<'tcx>,
args: Vec<Operand<'tcx>>,
fn_span: Span,
},
```
*Structurally* this is very similar to a normal `Call` but is missing a few fields:
- `destination` — tail calls don't write to destination, instead they pass caller's destination to the callee (such that eventual `return` will write to the caller of the function that used tail call)
- `target` — similarly to `destination` tail calls pass the caller's return address to the callee, so there is nothing to do
- `unwind` — I _think_ this is applicable too, although it's a bit confusing
- `call_source` — `become` forbids operators and is not created as a lowering of something else; tail calls always come from HIR (at least for now)
It might be helpful to read the interpreter implementation to understand what `TailCall` means exactly, although I've tried documenting it too.
-----
There are a few `FIXME`-questions still left, ideally we'd be able to answer them during review ':)
-----
r? `@oli-obk`
cc `@scottmcm` `@DrMeepster` `@JakobDegen`
Diffstat (limited to 'tests/codegen/patchable-function-entry')
0 files changed, 0 insertions, 0 deletions
