This is the mail archive of the crossgcc@sources.redhat.com mailing list for the crossgcc project.

See the CrossGCC FAQ for lots more information.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

v850-elf-gcc, va_list



Hello everybody!

I suppose my first post was catched by the spam checking,
so I am trying another time.

I am doing some tests with the GNU C cross compiler,
configured for the v850-elf target. The compiler
is run on a PC and the operating system is
Red Hat Linux 7.1.

I have such a problem with the variable argument lists
that the first optional argument is not expanded by
va_arg() at all, but is skipped. In the example
below the out() function is called four times,
but the parameter gets bad values: 2, 3, 4 and a random
number instead of 1, 2, 3 and 4.

The C code, compiling command I have used and the
assembly output produced (with my comments added)
can be seen below.

Any ideas are welcomed.

Regards,
Markku

----------------------------------------------------
#include <stdarg.h>

extern int out ( int );

void test( int parc, ... )
{
    va_list list;

    va_start( list, parc );

    while( parc )
    {
        int i;

        i = va_arg( list, int );

        out( i );

        parc --;
    }

    va_end( list );
}


int main( void )
{
    test( 4, 1, 2, 3, 4 );

    return 0;
}
----------------------------------------------------
[markku@linux1 va_list]$ v850-elf-gcc -S -v test.c
Reading specs from /usr/local/lib/gcc-lib/v850-elf/2.96-xscale-
010827/specs
gcc version 2.96-xscale-010827
 /usr/local/lib/gcc-lib/v850-elf/2.96-xscale-010827/cpp -lang-c -v -
D__GNUC__=2
-D__GNUC_MINOR__=96 -D__v851__ -D__v850 -D__v851__ -D__v850 -
D__v850__ test.c /t
mp/cc5YEVvf.i
GNU CPP version 2.96-xscale-010827 (cpplib)
 (NEC V850)
ignoring nonexistent directory `/usr/local/v850-elf/sys-include'
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/lib/gcc-lib/v850-elf/2.96-xscale-010827/include
 /usr/local/v850-elf/include
End of search list.
 /usr/local/lib/gcc-lib/v850-elf/2.96-xscale-
010827/cc1 /tmp/cc5YEVvf.i -quiet -
dumpbase test.c -version -o test.s
GNU C version 2.96-xscale-010827 (v850-elf) compiled by GNU C version
2.96 20000
731 (Red Hat Linux 7.1 2.96-81).
[markku@linux1 va_list]$ cat test.s
        .file   "test.c"
gcc2_compiled.:
        .section .text
        .align 1
        .global _test
        .type    _test,@function
_test:
        st.w r6,0[sp]
        st.w r7,4[sp]
        st.w r8,8[sp]
        st.w r9,12[sp]
----------------------------------------------------
The copies of the arguments are in the top of
stack at this point:
1st 0[sp]
2nd 4[sp]
3rd 8[sp]
4th 12[sp]
5th 16[sp] (pushed by the caller)
----------------------------------------------------
        addi -36,sp,sp
        st.w r31,32[sp]
        st.w r28,28[sp]
        st.w r29,24[sp]
        mov sp,r29
----------------------------------------------------
r29 is used as a frame pointer
----------------------------------------------------
        st.w r6,36[r29]
----------------------------------------------------
loop counter initialisation, actually done at _test:
----------------------------------------------------
        addi 40,r29,r10
        st.w r10,20[r29]
----------------------------------------------------
20[r29] points to the next argument, initially 40[r29]
or the copy of the 2nd argument
----------------------------------------------------
.L3:
        ld.w 36[r29],r10
        cmp r0,r10
        bne .L5
        br .L4
.L5:
        ld.w 20[r29],r10
        addi 4,r10,r11
        st.w r11,20[r29]
----------------------------------------------------
the address of the next argument value has been read,
incremented and written back
----------------------------------------------------
        ld.w 20[r29],r28
----------------------------------------------------
the address that has already been incremented
is read again; this way  the first optional argument
is ignored
----------------------------------------------------
        ld.w 0[r28],r10
        st.w r10,16[r29]
        ld.w 16[r29],r6
        jarl _out,r31
        ld.w 36[r29],r10
        addi -1,r10,r11
        st.w r11,36[r29]
        br .L3
.L4:
.L2:
        mov r29,sp
        ld.w 32[sp],r31
        ld.w 28[sp],r28
        ld.w 24[sp],r29
        addi 36,sp,sp
        jmp [r31]
.Lfe1:
        .size    _test,.Lfe1-_test
        .align 1
        .global _main
        .type    _main,@function
_main:
        addi -28,sp,sp
        st.w r31,24[sp]
        st.w r29,20[sp]
        mov sp,r29
        mov 4,r10
        st.w r10,16[sp]
        mov 4,r6
        mov 1,r7
        mov 2,r8
        mov 3,r9
        jarl _test,r31
        mov 0,r10
        br .L6
.L6:
        mov r29,sp
        ld.w 24[sp],r31
        ld.w 20[sp],r29
        addi 28,sp,sp
        jmp [r31]
.Lfe2:
        .size    _main,.Lfe2-_main
        .ident  "GCC: (GNU) 2.96-xscale-010827"
----------------------------------------------------


...............................................
Oma sähköposti aina käytössä! http://luukku.com



------
Want more information?  See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sources.redhat.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]