gccrs: Generate backend drop flags for conditional moves
gccrs backend now generates flags to manage runtime drops for conditional moves.
gccrs introduces runtime ‘Drop flags’ for conditional drops in the backend. These flags, managed by the compiler context, track initialization and are cleared after a move. The backend uses BIR analysis to identify locals needing drop flags and moves that clear them, ensuring correct cleanup execution before function exit or scope end. This improves the robustness of drop management for complex control flow.
In Details
The gccrs backend now utilizes a 'drop flag' mechanism for conditional drops, integrating with the BIR analysis. The Context now tracks drop flags for locals, which are set upon initialization, cleared after a move, and checked before a conditional drop is executed. This allows the compiler to correctly manage resources that need to be dropped, especially in scenarios involving conditional execution paths and moves. The DropAnalysis provides the necessary information to the backend for this mechanism.
- Drop flags
- A mechanism used by gccrs to track whether a variable needs to be dropped (its destructor called) at runtime. This is particularly important for conditional drops and moves, ensuring that destructors are called exactly once for resources.
- Conditional Drop
- A drop operation that is only executed if a certain condition is met, typically based on whether a value has been moved or initialized.
- BIR
- Backend Intermediate Representation. A lower-level intermediate representation used by gccrs after the initial HIR, closer to machine code, for backend-specific analysis and transformations.
- HIR
- High-level Intermediate Representation. A representation of the code that is closer to the source language than machine code, used by the Rust compiler (and gccrs) for analysis and transformations before generating lower-level code.
- Drop
- In Rust, the process of deallocating memory and releasing resources associated with a value when it goes out of scope or is no longer needed. This is handled by the
Droptrait.