Auto merge of #146059 - folkertdev:va-end-lifetime, r=saethlin

explicitly end the lifetime of `va_list`

tracking issue: https://github.com/rust-lang/rust/issues/44930
split out from: https://github.com/rust-lang/rust/pull/144549

The `va_list` is created in the compiler itself when the variable argument list `...` is desugared, and hence the lifetime end is not inserted automatically. The value can't outlive the function in which it was created, so it is correct to end the lifetime here. Ending the lifetime explicitly also appears to give slightly better codegen in https://github.com/rust-lang/rust/pull/144549.

I also included a little drive-by improvement to not cast pointers to integers and back again.

r? codegen
This commit is contained in:
bors
2025-09-02 01:12:13 +00:00
2 changed files with 9 additions and 3 deletions

View File

@@ -28,9 +28,12 @@ fn round_pointer_up_to_alignment<'ll>(
align: Align,
ptr_ty: &'ll Type,
) -> &'ll Value {
let mut ptr_as_int = bx.ptrtoint(addr, bx.cx().type_isize());
ptr_as_int = round_up_to_alignment(bx, ptr_as_int, align);
bx.inttoptr(ptr_as_int, ptr_ty)
let ptr = bx.inbounds_ptradd(addr, bx.const_i32(align.bytes() as i32 - 1));
bx.call_intrinsic(
"llvm.ptrmask",
&[ptr_ty, bx.type_i32()],
&[ptr, bx.const_int(bx.isize_ty, -(align.bytes() as isize) as i64)],
)
}
fn emit_direct_ptr_va_arg<'ll, 'tcx>(