Skip to content

Support cleanup during unwinding #1677

Closed
@bjorn3

Description

@bjorn3

Feature

Currently the generated unwinding information only restores registers. This issue proposes to make it possible to also run cleanup actions like running destructors during unwinding.

Benefit

This is necessary to support unwinding after a panic in rustc_codegen_cranelift.

Implementation

Add a new invoke terminator that is similar to the call instruction, but has an additional cleanup edge. This cleanup edge will be ignored when emitting actual machine instructions, but it will take part in the regalloc. Next add a way to mark a block as "landing pad". Only "landing pad" blocks can be used as cleanup edge of an invoke terminator. At the start of a "cleanup" block all values are stored either on stack or in any of the registers restored by the system unwinder. The "landing pad" block can also take several arguments. Those will be the values stored in the registers that are allowed for arguments to the landing pad received from the personality function. After codegen the location of every "landing pad" block will be stored in a variable. This will allow the embedder to generate the appropriate LSDA (language specific data area) to reference from the unwinding table.

Alternatives

It is basically impossible to implement cleanup during unwinding without Cranelift support.

References

The "Transferring Control to a Landing Pad" section of https://software.intel.com/sites/default/files/article/402129/mpx-linux64-abi.pdf

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions