[LLVMdev] Is va_arg correct on Mips backend?
Jonathan
gamma_chen at yahoo.com.tw
Tue Feb 19 17:06:29 PST 2013
I didn't have Mips board. I compile as the commands and check the asm output as below.
1. Question:
The distance of caller arg[4] and arg[5] is 4 bytes. But the the callee get every
arg[] by 8 bytes offset (arg_ptr1+8 or arg_ptr2+8). I assume the #BB#4 and #BB#5 are the arg_ptr which is the pointer to access the stack arguments.
2. Question:
Stack memory 28($sp) has no initial value. If this memory address is a relocation record which set value by linker/loader, then it maybe is correct.
clang -c ch8_3.cpp -emit-llvm -o ch8_3.bc
llc -march=mips -relocation-model=pic -filetype=asm ch8_3.bc -o ch8_3.mips.s
.section .mdebug.abi32
.previous
.file "ch8_3.bc"
.text
.globl _Z5sum_iiz
.align 2
.type _Z5sum_iiz, at function
.set nomips16 # @_Z5sum_iiz
.ent _Z5sum_iiz
_Z5sum_iiz:
.cfi_startproc
.frame $sp,64,$ra
.mask 0x80000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
.set noat
# BB#0:
lui $2, %hi(_gp_disp)
addiu $2, $2, %lo(_gp_disp)
addiu $sp, $sp, -64
$tmp2:
.cfi_def_cfa_offset 64
sw $ra, 60($sp) # 4-byte Folded Spill
$tmp3:
.cfi_offset 31, -4
addu $gp, $2, $25
sw $7, 76($sp)
sw $6, 72($sp)
sw $5, 68($sp)
lw $3, %got(__stack_chk_guard)($gp)
lw $1, 0($3)
sw $1, 56($sp)
sw $4, 52($sp)
sw $zero, 48($sp) // i
sw $zero, 44($sp) // val
sw $zero, 40($sp) // sum
addiu $1, $sp, 68
sw $1, 16($sp) // arg_ptr1
sw $zero, 48($sp)
b $BB0_2
addiu $2, $zero, 40
$BB0_1: # in Loop: Header=BB0_2 Depth=1
lw $1, 0($4) // $1 = *arg_ptr
sw $1, 44($sp) // val
lw $4, 40($sp) // sum
addu $1, $4, $1
sw $1, 40($sp) // sum += val
lw $1, 48($sp)
addiu $1, $1, 1
sw $1, 48($sp)
$BB0_2: # =>This Inner Loop Header: Depth=1
lw $1, 52($sp)
lw $4, 48($sp)
slt $1, $4, $1
beq $1, $zero, $BB0_6
nop
# BB#3: # in Loop: Header=BB0_2 Depth=1
lw $4, 16($sp) // arg_ptr1
sltu $1, $2, $4
bne $1, $zero, $BB0_5
nop
# BB#4: # in Loop: Header=BB0_2 Depth=1
addiu $1, $4, 8 // arg_ptr2 + 8
lw $5, 28($sp) // arg_ptr2_offset has no initial value
sw $1, 16($sp)
b $BB0_1
addu $4, $5, $4
$BB0_5: # in Loop: Header=BB0_2 Depth=1
lw $4, 24($sp) // arg_ptr2
addiu $1, $4, 8 // arg_ptr2 + 8
sw $1, 24($sp)
b $BB0_1
nop
$BB0_6:
lw $1, 0($3)
lw $3, 56($sp)
bne $1, $3, $BB0_8
lw $2, 40($sp)
# BB#7: # %SP_return
lw $ra, 60($sp) # 4-byte Folded Reload
jr $ra
addiu $sp, $sp, 64
$BB0_8: # %CallStackCheckFailBlk
lw $25, %call16(__stack_chk_fail)($gp)
jalr $25
nop
.set at
.set macro
.set reorder
.end _Z5sum_iiz
$tmp4:
.size _Z5sum_iiz, ($tmp4)-_Z5sum_iiz
.cfi_endproc
.globl main
.align 2
.type main, at function
.set nomips16 # @main
.ent main
main:
.cfi_startproc
.frame $sp,48,$ra
.mask 0x80000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
.set noat
# BB#0:
lui $2, %hi(_gp_disp)
addiu $2, $2, %lo(_gp_disp)
addiu $sp, $sp, -48
$tmp7:
.cfi_def_cfa_offset 48
sw $ra, 44($sp) # 4-byte Folded Spill
$tmp8:
.cfi_offset 31, -4
addu $gp, $2, $25
sw $zero, 40($sp)
addiu $1, $zero, 5
sw $1, 20($sp) // arg[5]
addiu $1, $zero, 4
sw $1, 16($sp) // arg[4]
addiu $1, $zero, 6
sw $1, 24($sp)
lw $25, %call16(_Z5sum_iiz)($gp)
addiu $4, $zero, 6
addiu $5, $zero, 1
addiu $6, $zero, 2
jalr $25
addiu $7, $zero, 3
sw $2, 36($sp)
lw $ra, 44($sp) # 4-byte Folded Reload
jr $ra
addiu $sp, $sp, 48
.set at
.set macro
.set reorder
.end main
$tmp9:
.size main, ($tmp9)-main
.cfi_endproc
On 2013/2/20, at 上午3:04, Akira Hatanaka <ahatanak at gmail.com> wrote:
> Which part of the generated code do you think is not correct? Could you be more specific?
>
> I compiled this program with clang and ran it on a mips board. It returns the expected result (21).
>
> On Tue, Feb 19, 2013 at 4:15 AM, Jonathan <gamma_chen at yahoo.com.tw> wrote:
> I check the Mips backend for the following C code fragment compile result. It seems not correct. Is it my misunderstand or it's a bug.
>
> //ch8_3.cpp
> #include <stdarg.h>
>
> int sum_i(int amount, ...)
> {
> int i = 0;
> int val = 0;
> int sum = 0;
>
> va_list vl;
> va_start(vl, amount);
> for (i = 0; i < amount; i++)
> {
> val = va_arg(vl, int);
> sum += val;
> }
> va_end(vl);
>
> return sum;
> }
>
> int main()
> {
> int a = sum_i(6, 1, 2, 3, 4, 5, 6);
>
> return a;
> }
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130220/8bd85193/attachment.html>
More information about the llvm-dev
mailing list