[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