Float parameter passing in funcall on ppc-aix & ppc-lynx178.
authorJoel Brobecker <brobecker@gnat.com>
Mon, 13 May 2013 10:27:35 +0000 (10:27 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Mon, 13 May 2013 10:27:35 +0000 (10:27 +0000)
commit36d1c68c70a09d38d76faa82263d16269139033c
treec49ae87ce7a151cf9e1ffaa7e04fc94ce73995cb
parent8414efeff8a66b8471e7a372fafffb9624cb499f
Float parameter passing in funcall on ppc-aix & ppc-lynx178.

Given the following code:

    float global_float = 0.0;

    void
    set_float (float f)
    {
      global_float = f;
    }

GDB incorrectly calls set_float if the set_float function is marked
as prototyped:

    (gdb) call set_float (5.0)
    (gdb) print global_float
    $1 = 2048

What happens, when the function is marked as prototyped, is that
GDB finds that the argument is a float, casts the value given in
the expression to a float, and then gives that float to ppc-aix/
ppc-lynx178's push_dummy_call gdbarch routine. The latter then blindly
copies it as is in the first floating-point register, instead of
making sure that it has the proper format first.

gdb/ChangeLog:

        * rs6000-aix-tdep.c (rs6000_push_dummy_call): Convert
        floating point registers to register type before storing
        value.
        * rs6000-lynx178-tdep.c (rs6000_lynx178_push_dummy_call):
        Likewise.
gdb/ChangeLog
gdb/rs6000-aix-tdep.c
gdb/rs6000-lynx178-tdep.c