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) = ®_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