Skip to content

Commit 508c0ab

Browse files
committed
va_arg: use emit_ptr_va_arg for mips
1 parent 51cf09f commit 508c0ab

2 files changed

Lines changed: 28 additions & 16 deletions

File tree

compiler/rustc_codegen_llvm/src/va_arg.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,14 +1169,26 @@ pub(super) fn emit_va_arg<'ll, 'tcx>(
11691169
AllowHigherAlign::Yes,
11701170
ForceRightAdjust::No,
11711171
),
1172+
Arch::Mips | Arch::Mips32r6 | Arch::Mips64 | Arch::Mips64r6 => emit_ptr_va_arg(
1173+
bx,
1174+
addr,
1175+
target_ty,
1176+
PassMode::Direct,
1177+
match &target.llvm_abiname {
1178+
LlvmAbi::N32 | LlvmAbi::N64 => SlotSize::Bytes8,
1179+
LlvmAbi::O32 => SlotSize::Bytes4,
1180+
other => bug!("unexpected LLVM ABI {other}"),
1181+
},
1182+
AllowHigherAlign::Yes,
1183+
match bx.tcx().sess.target.endian {
1184+
Endian::Big => ForceRightAdjust::Yes,
1185+
Endian::Little => ForceRightAdjust::No,
1186+
},
1187+
),
11721188

11731189
Arch::Bpf => bug!("bpf does not support c-variadic functions"),
11741190
Arch::SpirV => bug!("spirv does not support c-variadic functions"),
11751191

1176-
Arch::Mips | Arch::Mips32r6 | Arch::Mips64 | Arch::Mips64r6 => {
1177-
// FIXME: port MipsTargetLowering::lowerVAARG.
1178-
bx.va_arg(addr.immediate(), bx.cx.layout_of(target_ty).llvm_type(bx.cx))
1179-
}
11801192
Arch::Sparc | Arch::Avr | Arch::M68k | Arch::Msp430 => {
11811193
// Clang uses the LLVM implementation for these architectures.
11821194
bx.va_arg(addr.immediate(), bx.cx.layout_of(target_ty).llvm_type(bx.cx))

tests/assembly-llvm/c-variadic-mips.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
//
44
//@ revisions: mips mips64 mips64el
55
//@ [mips] compile-flags: -Copt-level=3 --target mips-unknown-linux-gnu
6+
//@ [mips] needs-llvm-components: mips
67
//@ [mips64] compile-flags: -Copt-level=3 --target mipsisa64r6-unknown-linux-gnuabi64
8+
//@ [mips64] needs-llvm-components: mips
79
//@ [mips64el] compile-flags: -Copt-level=3 --target mips64el-unknown-linux-gnuabi64
8-
//@ needs-llvm-components: mips
10+
//@ [mips64el] needs-llvm-components: mips
911
#![feature(c_variadic, no_core, lang_items, intrinsics, rustc_attrs, asm_experimental_arch)]
1012
#![no_core]
1113
#![crate_type = "lib"]
@@ -88,9 +90,9 @@ unsafe extern "C" fn read_i32(ap: &mut VaList<'_>) -> i32 {
8890
// mips64el: ld $1, 0($4)
8991
// mips64el-NEXT: daddiu $2, $1, 8
9092
// mips64el-NEXT: sd $2, 0($4)
91-
// mips64el-NEXT: lw $1, 0($1)
93+
// mips64el-NEXT: lw $2, 0($1)
9294
// mips64el-NEXT: jr $ra
93-
// mips64el-NEXT: sll $2, $1, 0
95+
// mips64el-NEXT: nop
9496
va_arg(ap)
9597
}
9698

@@ -99,17 +101,15 @@ unsafe extern "C" fn read_i64(ap: &mut VaList<'_>) -> i64 {
99101
// CHECK-LABEL: read_i64
100102
//
101103
// mips: lw $1, 0($4)
102-
// mips-NEXT: addiu $2, $zero, 4
103-
// mips-NEXT: addiu $1, $1, 7
104-
// mips-NEXT: move $3, $1
105-
// mips-NEXT: ins $3, $2, 0, 3
106104
// mips-NEXT: addiu $2, $zero, -8
105+
// mips-NEXT: addiu $1, $1, 7
106+
// mips-NEXT: and $2, $1, $2
107+
// mips-NEXT: addiu $3, $2, 8
107108
// mips-NEXT: sw $3, 0($4)
108-
// mips-NEXT: and $1, $1, $2
109-
// mips-NEXT: lw $2, 0($1)
110-
// mips-NEXT: addiu $1, $3, 4
111-
// mips-NEXT: sw $1, 0($4)
112-
// mips-NEXT: lw $3, 0($3)
109+
// mips-NEXT: addiu $3, $zero, 4
110+
// mips-NEXT: lw $2, 0($2)
111+
// mips-NEXT: ins $1, $3, 0, 3
112+
// mips-NEXT: lw $3, 0($1)
113113
// mips-NEXT: jr $ra
114114
// mips-NEXT: nop
115115
//

0 commit comments

Comments
 (0)