aboutsummaryrefslogtreecommitdiff
path: root/gdb/mips-tdep.c
diff options
context:
space:
mode:
authorJim Blandy <jimb@codesourcery.com>2000-02-22 19:18:53 +0000
committerJim Blandy <jimb@codesourcery.com>2000-02-22 19:18:53 +0000
commitb9a8e3bfd40ae4b14d2ff3a6d7f8704f5782eba8 (patch)
tree1ba9faebd0ce345f35eba3024e8e794a99f757ba /gdb/mips-tdep.c
parent87f398dd6a71a1d10f378be4ad51da680034260f (diff)
downloadgdb-b9a8e3bfd40ae4b14d2ff3a6d7f8704f5782eba8.zip
gdb-b9a8e3bfd40ae4b14d2ff3a6d7f8704f5782eba8.tar.gz
gdb-b9a8e3bfd40ae4b14d2ff3a6d7f8704f5782eba8.tar.bz2
Bring COERCE_FLOAT_TO_DOUBLE under gdbarch's control.
* valops.c (COERCE_FLOAT_TO_DOUBLE): Rework definition to be more function-like. (default_coerce_float_to_double, standard_coerce_float_to_double): New functions. (value_arg_coerce): Adjust for new definition. * value.h (default_coerce_float_to_double, standard_coerce_float_to_double): New declarations for the above. * gdbarch.sh (coerce_float_to_double): New entry, replacing macro. * gdbarch.c, gdbarch.h: Regenerated. * tm-alpha.h, tm-fr30.h, tm-m32r.h, tm-mips.h, tm-hppa.h, tm-rs6000.h, tm-sh.h, tm-sparc.h (COERCE_FLOAT_TO_DOUBLE): Change definitions. * mips-tdep.c (mips_coerce_float_to_double): Supply our own custom function here. (mips_gdbarch_init): Install that as our coerce_float_to_double function.
Diffstat (limited to 'gdb/mips-tdep.c')
-rw-r--r--gdb/mips-tdep.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index 5940f84..092ae34 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -3639,6 +3639,24 @@ mips_call_dummy_address ()
}
+/* If the current gcc for for this target does not produce correct debugging
+ information for float parameters, both prototyped and unprototyped, then
+ define this macro. This forces gdb to always assume that floats are
+ passed as doubles and then converted in the callee.
+
+ For the mips chip, it appears that the debug info marks the parameters as
+ floats regardless of whether the function is prototyped, but the actual
+ values are passed as doubles for the non-prototyped case and floats for
+ the prototyped case. Thus we choose to make the non-prototyped case work
+ for C and break the prototyped case, since the non-prototyped case is
+ probably much more common. (FIXME). */
+
+static int
+mips_coerce_float_to_double (struct type *formal, struct type *actual)
+{
+ return current_language->la_language == language_c;
+}
+
static gdbarch_init_ftype mips_gdbarch_init;
static struct gdbarch *
@@ -3835,6 +3853,7 @@ mips_gdbarch_init (info, arches)
set_gdbarch_push_return_address (gdbarch, mips_push_return_address);
set_gdbarch_push_arguments (gdbarch, mips_push_arguments);
set_gdbarch_register_convertible (gdbarch, generic_register_convertible_not);
+ set_gdbarch_coerce_float_to_double (gdbarch, mips_coerce_float_to_double);
set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid);
set_gdbarch_get_saved_register (gdbarch, default_get_saved_register);