From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9530 invoked by alias); 8 Feb 2002 15:50:21 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 9386 invoked from network); 8 Feb 2002 15:50:15 -0000 Received: from unknown (HELO cygnus.com) (205.180.230.5) by sources.redhat.com with SMTP; 8 Feb 2002 15:50:15 -0000 Received: from cygbert.vinschen.de (cse.cygnus.com [205.180.230.236]) by runyon.cygnus.com (8.8.7-cygnus/8.8.7) with ESMTP id HAA07792 for ; Fri, 8 Feb 2002 07:50:08 -0800 (PST) Received: (from corinna@localhost) by cygbert.vinschen.de (8.11.6/8.9.3/Linux sendmail 8.9.3) id g18Fnuj16493 for gdb-patches@sources.redhat.com; Fri, 8 Feb 2002 16:49:56 +0100 Date: Fri, 08 Feb 2002 07:50:00 -0000 From: Corinna Vinschen To: gdb-patches Subject: [RFA]: ARM: Fix parameter handling of FP types in arm_push_arguments() Message-ID: <20020208164956.R14241@cygbert.vinschen.de> Reply-To: gdb-patches Mail-Followup-To: gdb-patches Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.22.1i X-SW-Source: 2002-02/txt/msg00228.txt.bz2 Hi, while running the testsuite on ARM, I found that the handling of type `float' as argument type in the function arm_push_arguments() is pretty buggy. For some reason the size of float arguments was always given as sizeof(float) even when K&R style functions are called which expect the float arguments with sizeof(double). Up to this point one would expect that calling K&R functions with float arguments is broken. As a matter of fact, arm_push_arguments() coerced float args always to double types so that K&R functions were happy while calling ANSI style functions getting float args were broken. The below fix is doing two things now. - It adds the macro COERCE_FLOAT_TO_DOUBLE() to config/arm/tm-arm.h, calling standard_coerce_float_to_double(). This results in floats being coerced to double already *before* arm_push_arguments() is called. - It eliminates the now useless (and wrong) special float handling from arm_push_arguments(). Corinna 2002-02-08 Corinna Vinschen * arm-tdep.c (arm_push_arguments): Eliminate special float type handling. * config/arm/tm-arm.h (COERCE_FLOAT_TO_DOUBLE): Define to call standard_coerce_float_to_double(). Index: arm-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/arm-tdep.c,v retrieving revision 1.36 diff -u -p -r1.36 arm-tdep.c --- arm-tdep.c 2002/02/06 15:21:16 1.36 +++ arm-tdep.c 2002/02/08 15:32:18 @@ -1440,12 +1440,7 @@ arm_push_arguments (int nargs, struct va arg_type = check_typedef (VALUE_TYPE (args[argnum])); len = TYPE_LENGTH (arg_type); - /* ANSI C code passes float arguments as integers, K&R code - passes float arguments as doubles. Correct for this here. */ - if (TYPE_CODE_FLT == TYPE_CODE (arg_type) && REGISTER_SIZE == len) - nstack_size += FP_REGISTER_VIRTUAL_SIZE; - else - nstack_size += len; + nstack_size += len; } /* Allocate room on the stack, and initialize our stack frame @@ -1482,21 +1477,6 @@ arm_push_arguments (int nargs, struct va typecode = TYPE_CODE (arg_type); val = (char *) VALUE_CONTENTS (args[argnum]); - /* ANSI C code passes float arguments as integers, K&R code - passes float arguments as doubles. The .stabs record for - for ANSI prototype floating point arguments records the - type as FP_INTEGER, while a K&R style (no prototype) - .stabs records the type as FP_FLOAT. In this latter case - the compiler converts the float arguments to double before - calling the function. */ - if (TYPE_CODE_FLT == typecode && REGISTER_SIZE == len) - { - DOUBLEST dblval; - dblval = extract_floating (val, len); - len = TARGET_DOUBLE_BIT / TARGET_CHAR_BIT; - val = alloca (len); - store_floating (val, len, dblval); - } #if 1 /* I don't know why this code was disable. The only logical use for a function pointer is to call that function, so setting Index: config/arm/tm-arm.h =================================================================== RCS file: /cvs/src/src/gdb/config/arm/tm-arm.h,v retrieving revision 1.23 diff -u -p -r1.23 tm-arm.h --- tm-arm.h 2002/02/06 15:21:17 1.23 +++ tm-arm.h 2002/02/08 15:32:20 @@ -430,4 +430,6 @@ extern int arm_pc_is_thumb (bfd_vma mema a Thumb function. */ extern int arm_pc_is_thumb_dummy (bfd_vma memaddr); +#define COERCE_FLOAT_TO_DOUBLE(formal, actual) (standard_coerce_float_to_double (formal, actual)) + #endif /* TM_ARM_H */ -- Corinna Vinschen Cygwin Developer Red Hat, Inc. mailto:vinschen@redhat.com