]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit - gdb/testsuite/gdb.ada/float_param/pck.ads
[dwarf] Mark all functions as prototyped except C functions.
authorJoel Brobecker <brobecker@gnat.com>
Mon, 20 May 2013 09:45:13 +0000 (09:45 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Mon, 20 May 2013 09:45:13 +0000 (09:45 +0000)
commit4d804846dbf19c3d878776f78415b5b8812a939d
treeeffddaaaf23dc9933c8c72f257cad9f8c016d2c9
parent1c432e72b06be62d56e6e70f8aeebadfa55ed0f8
[dwarf] Mark all functions as prototyped except C functions.

This makes sure that the types of the arguments are taken into account
when performing an inferior function call to a non-C (or C-like)
function.  In particular, this makes sure that the arguments are
appropriatly converted to the correct type.

For instance, on x86_64-linux, with the following Ada code:

   procedure Set_Float (F : Float) is
   begin
      Global_Float := F;
   end Set_Float;

The following sequence shows that Float arguments are incorrectly
passed (Ada's Float type is the equivalent of type "float" in C):

    (gdb) call set_float (2.0)
    (gdb) print global_float
    $1 = 0.0

Putting a breakpoint inside set_float to inspect the value of
register xmm0 gives the first hint of the problem:

    (gdb) p $xmm0
    $2 = (v4_float => (0 => 0.0, 2.0, 0.0, 0.0),
          v2_double => (0 => 2.0, 0.0),
    [...]

It shows that the argument was passed as a double.

The code responsible for doing appropriate type conversions
for the arguments (value_arg_coerce) found that our function
was not prototyped, and thus could not use typing information
for the arguments. Instead, it defaulted to the value of "set
coerce-float-to-double", which by default is true, to determine
the argument type.

This patch fixes the problem by setting the PROTOTYPE flag
for all functions of any language except C and Objective C.

gdb/ChangeLog:

        * dwarf2read.c (prototyped_function_p): New function.
        (read_subroutine_type): Use it.

gdb/testsuite/ChangeLog:

        * gdb.ada/float_param: New testcase.
gdb/ChangeLog
gdb/dwarf2read.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/float_param.exp [new file with mode: 0644]
gdb/testsuite/gdb.ada/float_param/foo.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/float_param/pck.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/float_param/pck.ads [new file with mode: 0644]