Serious PPC stdarg problem with 2.95.2

Ralph Schmidt laire@basis.owl.de
Tue Feb 22 18:27:00 GMT 2000


I have a serious problems with the System V.4 stdargs support
since 2.95.2.
I use the ppc-amigaos 68k/ppc crosscompiler which may be the cause
of this but i somehow doubt that as the old 2.91.57 va_ppc.h
works for me with 2.95.2.
Please look at the documented asm below as it contains
several really bogus code parts. (Look for !!!!)

I`m really worried that nobody noticed that yet...

----------------------------------------------------------------------




;/*
ppc-amigaos-gcc -O2 -fomit-frame-pointer -v -mregnames -fverbose-asm -mstrict-align -S test10.s test10.c
ppc-amigaos-gas -otest10.o test10.s
ppc-amigaos-ld -r test10.o -o test10.elf
protect test10.elf +e
exit
;*/

#include <stdarg.h>

long	test(char	*FmtString,
...);
long	vtest(char	*FmtString,
va_list	args);

int	main(void)
{
test("0x%lx\n",
0xfedcba98);
return(0);
}

long	vtest(char	*FmtString,
va_list	args)
{
long	Value;
Value		=	va_arg(args,long);
return(Value);
}

long	test(char	*FmtString,
...)
{
va_list args;
long	Result;

va_start(args,FmtString);

Result	=	vtest(FmtString,
args);

va_end(args);
return(Result);
}


/**********************************************************************

.file	"test10.c"

# rs6000/powerpc options: -msdata=data -G 8
 # options passed:  -mregnames -mstrict-align -O2 -fomit-frame-pointer
 # -fverbose-asm
 # options enabled:  -fdefer-pop -fomit-frame-pointer -fcse-follow-jumps
 # -fcse-skip-blocks -fexpensive-optimizations -fthread-jumps
 # -fstrength-reduce -fpeephole -fforce-mem -ffunction-cse -finline
 # -fkeep-static-consts -fcaller-saves -fpcc-struct-return -fgcse
 # -frerun-cse-after-loop -frerun-loop-opt -fschedule-insns
 # -fschedule-insns2 -fsched-interblock -fsched-spec -fbranch-count-reg
 # -fsjlj-exceptions -fcommon -fverbose-asm -fgnu-linker -fregmove
 # -foptimize-register-move -fargument-alias -fident -mpowerpc
 # -mnew-mnemonics -mstrict-align -mregnames -mcall-sysv -msdata=data

gcc2_compiled.:
	.section	".rodata"
	.align 2
.LC0:
	.string	"0x%lx\n"
	.section	".text"
	.align 2
	.globl main
	.type	 main,@function
main:
	stwu %r1,-16(%r1)
	mflr %r0
	stw %r0,20(%r1)
	lis %r3,.LC0@ha
	lis %r4,0xfedc
	la %r3,.LC0@l(%r3)
	ori %r4,%r4,47768
	crxor 6,6,6
	bl test
	li %r3,0
	lwz %r0,20(%r1)
	mtlr %r0
	la %r1,16(%r1)
	blr
.Lfe1:
	.size	 main,.Lfe1-main
	.align 2
	.globl vtest
	.type	 vtest,@function
vtest:
	lbz %r10,0(%r4)				#r10=va_list.gpr
	cmplwi %cr0,%r10,7			#7(number of the max regsave index)
	bc 12,1,.L20				#branch if the stackargs aren`t in the regsave area
lhz %r0,6(%r4)				# !!!! va_list.???? My god..what`s this ?
	slwi %r0,%r0,16
	or %r9,%r9,%r0
	addi %r11,%r10,1
	slwi %r0,%r10,2
	add %r3,%r9,%r0
	stb %r11,0(%r4)
	b .L9
.L20:
	lhz %r0,2(%r4)
	lhz %r11,4(%r4)
	slwi %r0,%r0,16
	or %r3,%r11,%r0
	addi %r9,%r3,4
	srwi %r0,%r9,16
	sth %r9,4(%r4)
	sth %r0,2(%r4)
.L9:
	lwz %r3,0(%r3)
	blr
.Lfe2:
	.size	 vtest,.Lfe2-vtest
	.align 2
	.globl test
	.type	 test,@function
test:
	stwu %r1,-160(%r1)
	mflr %r0
	stw %r28,144(%r1)			#144=Save r28
	stw %r29,148(%r1)			#148=Save r29
	stw %r30,152(%r1)			#152=Save r30
	stw %r31,156(%r1)			#156=Save r31
	stw %r0,164(%r1)			#Save LR
	lis %r0,0x100				#0x0100 = gpr index = 1
	addi %r11,%r1,168
	addi %r29,%r1,8				#8(1) = &reg_save_area
	stw %r0,128(%r1)			#128(1) = va_list.gpr = 0x0100
	stw %r11,132(%r1)			#132(1) = va_list.overflow_arg_area = r11
	stw %r4,12(%r1)				#reg_save_area[1]=...arg1
	stw %r5,16(%r1)				#reg_save_area[2]=...arg2
	stw %r6,20(%r1)				#reg_save_area[3]=...arg3
	stw %r7,24(%r1)				#reg_save_area[4]=...arg4
	stw %r8,28(%r1)				#reg_save_area[5]=...arg5
	stw %r9,32(%r1)				#reg_save_area[6]=...arg6
	stw %r10,36(%r1)			#reg_save_area[7]=...arg7
	bc 4,6,.L24				#float ... args ?..no..skip
	stfd %f1,40(%r1)
	stfd %f2,48(%r1)
	stfd %f3,56(%r1)
	stfd %f4,64(%r1)
	stfd %f5,72(%r1)
	stfd %f6,80(%r1)
	stfd %f7,88(%r1)
	stfd %f8,96(%r1)
.L24:
	addi %r29,%r1,112			#create clone of the va_list
	mr %r28,%r3
	addi %r4,%r1,128
	li %r5,10				# !!!! This is wrong..sizeof(va_list) is 12(char+char+wordpad+long+long) because of 32bit alignment and not 10(char + char + long + long)
	crxor 6,6,6
	bl memcpy				#ugly
	mr %r3,%r28				#FmtString
	mr %r4,%r29				#&va_list clone
	bl vtest
	lwz %r0,164(%r1)
	mtlr %r0
	lwz %r28,144(%r1)
	lwz %r29,148(%r1)
	lwz %r30,152(%r1)
	lwz %r31,156(%r1)
	la %r1,160(%r1)
	blr
.Lfe3:
	.size	 test,.Lfe3-test
	.ident	"GCC: (GNU) 2.95.2 19991024 (release)"


**********************************************************************/


---
Ralph Schmidt,laire@popmail.owl.de(private),NextMail welcome 


More information about the Gcc-bugs mailing list