[Bug target/34281] New: [arm] varargs broken with 64bit parameters.

daney at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Thu Nov 29 01:56:00 GMT 2007


With gcc version 4.3.0 20071024 (experimental) [trunk revision 129615]

configured:

../trunk/configure --enable-languages=c,c++,java --disable-static
--enable-__cxa_atexit --prefix=/home/daney/mvl_ti/gcj --with-gmp=/home/daney/mp
--with-mpfr=/home/daney/mp
--with-sysroot=/home/daney/mvl_ti/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le/target
--with-float=soft --disable-java-awt --without-x --disable-jvmpi
--disable-sjlj-exceptions --target=armv5tl-montavista-linuxeabi

If the last fixed argument in a va_arg function is 64 bits bad things happen.

Here is the test program:

--------8<---------
#include <stdio.h>
#include <stdarg.h>
#include <stdint.h>

class A
{
private:
    int foo;
public:
    A(int a) 
    {
        foo = a;
    }

    void f(int64_t j,...);
    void f2(int64_t j, int l,...);
    void f1(int64_t j);
    void g(int j,...);
    void h(int j, va_list ap);
};

void
A::f(int64_t j,...)
{
    va_list ap;
    va_start(ap, j);

    int k = va_arg(ap, int);


    h(5, ap);

    va_end(ap);

    printf("A::f %d %lld, sizeof(j) = %d\n", k, j, sizeof(j));
}

void
A::f2(int64_t j, int l, ...)
{
    va_list ap;
    va_start(ap, l);

    int k = va_arg(ap, int);


    h(5, ap);

    va_end(ap);

    printf("A::f2 %d %lld, sizeof(j) = %d\n", k, j, sizeof(j));
}

void
A::f1(int64_t j)
{
    printf("A::f1 %lld, sizeof(j) = %d\n", j, sizeof(j));
}

void
A::g(int j,...)
{
    va_list ap;
    va_start(ap, j);

    int k = va_arg(ap, int);


    h(7, ap);

    va_end(ap);

    printf("A::f %d %d\n", k, j);
}

void
A::h(int j, va_list ap)
{
    int k;

    do {
        k = va_arg(ap, int);
        printf("   A::h %d - %d\n", j, k);

    }
    while (k >= 0);
}

int
main(int argc, char *argv[])
{
    A *a = new A(9);

    a->f(300, 4,6,8,10,-1);
    a->f2(300, 99, 4,6,8,10,-1);
    a->g(400, 3,5,7,9,11,13,-1);
    a->f1(500);

}
-------8<----------

Expected output:
$ ./vargs 
   A::h 5 - 6
   A::h 5 - 8
   A::h 5 - 10
   A::h 5 - -1
A::f 4 300, sizeof(j) = 8
   A::h 5 - 6
   A::h 5 - 8
   A::h 5 - 10
   A::h 5 - -1
A::f2 4 300, sizeof(j) = 8
   A::h 7 - 5
   A::h 7 - 7
   A::h 7 - 9
   A::h 7 - 11
   A::h 7 - 13
   A::h 7 - -1
A::f 3 400
A::f1 500, sizeof(j) = 8

Output on armv5tl-none-linuxeabi:

# ./vargs 
   A::h 5 - 4
   A::h 5 - 6
   A::h 5 - 8
   A::h 5 - 10
   A::h 5 - -1
A::f 0 1288490188809, sizeof(j) = 8
   A::h 5 - 6
   A::h 5 - 8
   A::h 5 - 10
   A::h 5 - -1
A::f2 4 300, sizeof(j) = 8
   A::h 7 - 5
   A::h 7 - 7
   A::h 7 - 9
   A::h 7 - 11
   A::h 7 - 13
   A::h 7 - -1
A::f 3 400
A::f1 500, sizeof(j) = 8

Note that output 'A::f 0 1288490188809,...' is incorrect.


-- 
           Summary: [arm] varargs broken with 64bit parameters.
           Product: gcc
           Version: 4.3.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: daney at gcc dot gnu dot org
GCC target triplet: armv5tl-none-linuxeabi


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34281



More information about the Gcc-bugs mailing list