From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8104 invoked by alias); 15 Jun 2004 14:05:36 -0000 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org Received: (qmail 8096 invoked by uid 48); 15 Jun 2004 14:05:34 -0000 Date: Tue, 15 Jun 2004 14:05:00 -0000 From: "manishas at kpitcummins dot com" To: gcc-bugs@gcc.gnu.org Message-ID: <20040615140513.16000.manishas@kpitcummins.com> Reply-To: gcc-bugzilla@gcc.gnu.org Subject: [Bug c/16000] New: for h8 targets variadic functions are not working properly X-Bugzilla-Reason: CC X-SW-Source: 2004-06/txt/msg01843.txt.bz2 List-Id: Consider the attached test case for H8 target in which variadic function is declared to take variable number of arguments but in the definition fixed number of arguments are used. This is allowed in gcc as per document in http://www.gnu.org/software/libc/manual/html_node/Why-Variadic.html#Why% 20Variadic Following code does not pass arguments properly to the function. The variadic function gives wrong results because parameters are passed on stack and the function is expects parameters in registers. Which can be observed from the following assembly code mov.w #3,r2 mov.l er2, @-er7 // push arg3 on stack sub.l er2,er2 add.b #2,r2l mov.l er2, @-er7 // push arg2 on stack mov.w #1,r0 // move arg1 in er0 jsr @_variadic_test// call variadic_test function. The register er7 is the stack pointer. So the arguments 2 and 3 are pushed onto stack and argument1 is in register r0.And this is the assembler code in the function variadic_test immediately after the jsr instruction above is executed: mov.l er6, @-er7 // save frame pointer mov.l er7,er6 . . mov.w r0,@(-2,er6) // get arg 1 from r0 mov.l er1,@(-8,er6) // get arg 2 from er1 mov.l er2,@(-12,er6) // get arg 3 from er2 The function sets up the stack and then copies the function arguments from the registers r0, er1 and er2 onto the stack. But because of the different function declaration the registers r0, er1 and er2 do not contain the expected values. command line for assembly code: h8300-elf-gcc -S -ms variadic.c main.c command line for output file: h8300-elf-gcc -o main.out variadic.c main.c ------------variadic.c------------------------------------ int variadic_test(int arg1, unsigned long arg2, unsigned long arg3) { int ret; ret = arg1 + arg2 + arg3; return ret; } ---------------------------------------------------------------- ------------------ main.c ---------------------------------------------- int variadic_test (int, unsigned long, ...); int main (void) { int result_varfunc; int result_local; result_local = 1 + 2 + 3; result_varfunc = variadic_test(1, 2, 3); if (result_local != result_varfunc) { //printf("error"); return 0; } else { return 1; } } -- Summary: for h8 targets variadic functions are not working properly Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P2 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: manishas at kpitcummins dot com CC: gcc-bugs at gcc dot gnu dot org GCC host triplet: windows 2000 GCC target triplet: h8 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16000