[LLVMdev] Is va_arg correct on Mips backend?

Akira Hatanaka ahatanak at gmail.com
Tue Feb 19 18:09:07 PST 2013


Does it make a difference if you give the "-target" option to clang?

$ clang -target mips-linux-gnu ch8_3.cpp  -o ch8_3.bc -emit-llvm -c

The .s file generated this way looks quite different from the one in your
email.

On Tue, Feb 19, 2013 at 5:06 PM, Jonathan <gamma_chen at yahoo.com.tw> wrote:

> 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/20130219/f173b76b/attachment.html>


More information about the llvm-dev mailing list