mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 23:04:33 +00:00
Replace hard-coded field indexes with lookup on aarch64 non-macos.
The indexes into the VaListImpl struct used on aarch64 ABI (not macos/ios) are hard-coded which is brittle so we replace them with the usual lookup. The varargs ffi is tested in ui/abi/variadic-ffi.rs on aarch64 Linux.
This commit is contained in:
parent
4a4e9e3cf8
commit
89a369ad2e
@ -98,7 +98,8 @@ fn emit_aapcs_va_arg(
|
||||
// Implementation of the AAPCS64 calling convention for va_args see
|
||||
// https://github.com/ARM-software/abi-aa/blob/master/aapcs64/aapcs64.rst
|
||||
let va_list_addr = list.immediate();
|
||||
let va_list_ty = list.deref(bx.cx).layout.llvm_type(bx);
|
||||
let va_list_layout = list.deref(bx.cx).layout;
|
||||
let va_list_ty = va_list_layout.llvm_type(bx);
|
||||
let layout = bx.cx.layout_of(target_ty);
|
||||
|
||||
let mut maybe_reg = bx.build_sibling_block("va_arg.maybe_reg");
|
||||
@ -110,13 +111,15 @@ fn emit_aapcs_va_arg(
|
||||
|
||||
let gr_type = target_ty.is_any_ptr() || target_ty.is_integral();
|
||||
let (reg_off, reg_top_index, slot_size) = if gr_type {
|
||||
let gr_offs = bx.struct_gep(va_list_ty, va_list_addr, 3);
|
||||
let gr_offs =
|
||||
bx.struct_gep(va_list_ty, va_list_addr, va_list_layout.llvm_field_index(bx.cx, 3));
|
||||
let nreg = (layout.size.bytes() + 7) / 8;
|
||||
(gr_offs, 1, nreg * 8)
|
||||
(gr_offs, va_list_layout.llvm_field_index(bx.cx, 1), nreg * 8)
|
||||
} else {
|
||||
let vr_off = bx.struct_gep(va_list_ty, va_list_addr, 4);
|
||||
let vr_off =
|
||||
bx.struct_gep(va_list_ty, va_list_addr, va_list_layout.llvm_field_index(bx.cx, 4));
|
||||
let nreg = (layout.size.bytes() + 15) / 16;
|
||||
(vr_off, 2, nreg * 16)
|
||||
(vr_off, va_list_layout.llvm_field_index(bx.cx, 2), nreg * 16)
|
||||
};
|
||||
|
||||
// if the offset >= 0 then the value will be on the stack
|
||||
|
Loading…
Reference in New Issue
Block a user