-
Notifications
You must be signed in to change notification settings - Fork 13.9k
Description
Summary
Implement VaList::arg in pure rust, similar to va_list-rs.
Details
We currently expose the va_arg intrinsic which should emit the correct LLVM for va_arg for the given architecture and OS. We currently use the LLVM va_arg instruction, but it doesn't emit the correct code for some common OSes and architectures causing us to implement the instruction manually (See [src/librustc_codegen_llvm/va_arg.rs] for details). Since we do not support calling VaList::arg on arbitrary types, we might be able to implement something similar to va_list-rs in pure rust for most architectures, falling back to the LLVM va_arg instruction only when a pure rust implementation does not exist.
Original issue
Note this issue has been changed following #56489 (comment). The original issue is as follows:
codegen: Move custom va_arg logic to librustc_codegen_ssa
The LLVM va_arg intrinsic is far from a complete implementation. As a result, we have started to manually implement va_arg (like clang does) with the Builder in src/librustc_codegen_llvm/va_arg.rs. This logic should be moved to librustc_codegen_ssa in BuilderMethods::va_arg.
BuilderMethods::va_arg needs to fall back to LLVM's va_arg intrinsic when there isn't an custom implementation available, so we'll need to add a new trait method backend_va_arg (please suggest a better name 😄) that exposes the backend specific implementation of va_arg.