[LLVMdev] Is va_arg correct on Mips backend?

Jonathan gamma_chen at yahoo.com.tw
Tue Feb 19 21:43:31 PST 2013


After try with this command, it work now in iMac too. thank your kind help.

clang -target `llvm-config --host-target` -c ch8_3.cpp -emit-llvm -o ch8_3.bc

Jonathan

On 2013/2/20, at 上午10:09, Akira Hatanaka <ahatanak at gmail.com> wrote:

> 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/20130220/01ae7c02/attachment.html>


More information about the llvm-dev mailing list