This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[PATCH] sh-elf: returning values from functions




I just committed the following patch.

[see http://sources.redhat.com/ml/gdb-patches/2000-12/msg00226.html ]

This fixes the finish.exp failures for sh-elf (variants 1,2,3,3e,dsp,4
in LE and BE cases)

Elena

2001-02-05  Elena Zannoni  <ezannoni@kwikemart.cygnus.com>

        * sh-tdep.c: Update copyright.
        (sh_extract_return_value): Rewrite.
        (sh3e_sh4_extract_return_value): New function.
        (sh_gdbarch_init): Initialize gdbarch_extract_return_value to new
        version of the function for sh3e and sh4 CPUs.

Index: sh-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/sh-tdep.c,v
retrieving revision 1.28
diff -c -u -p -r1.28 sh-tdep.c
--- sh-tdep.c	2001/01/02 23:51:35	1.28
+++ sh-tdep.c	2001/02/06 01:47:48
@@ -1,6 +1,6 @@
 /* Target-dependent code for Hitachi Super-H, for GDB.
-   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 2000 Free Software
-   Foundation, Inc.
+   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -59,6 +59,7 @@ static gdbarch_saved_pc_after_call_ftype
 
 /* Function call related functions. */
 static gdbarch_extract_return_value_ftype sh_extract_return_value;
+static gdbarch_extract_return_value_ftype sh3e_sh4_extract_return_value;
 static gdbarch_extract_struct_value_address_ftype sh_extract_struct_value_address;
 static gdbarch_use_struct_convention_ftype sh_use_struct_convention;
 static gdbarch_store_struct_return_ftype sh_store_struct_return;
@@ -1042,15 +1043,74 @@ static void
 sh_extract_return_value (struct type *type, char *regbuf, char *valbuf)
 {
   int len = TYPE_LENGTH (type);
-
+  int return_register = R0_REGNUM;
+  int offset;
+  
   if (len <= 4)
-    memcpy (valbuf, ((char *) regbuf) + 4 - len, len);
+    {
+      if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+	offset = REGISTER_BYTE (return_register) + 4 - len;
+      else
+	offset = REGISTER_BYTE (return_register);
+      memcpy (valbuf, regbuf + offset, len);
+    }
   else if (len <= 8)
-    memcpy (valbuf, ((char *) regbuf) + 8 - len, len);
+    {
+      if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+	offset = REGISTER_BYTE (return_register) + 8 - len;
+      else
+	offset = REGISTER_BYTE (return_register);
+      memcpy (valbuf, regbuf + offset, len);
+    }
   else
     error ("bad size for return value");
 }
 
+static void
+sh3e_sh4_extract_return_value (struct type *type, char *regbuf, char *valbuf)
+{
+  int return_register;
+  int offset;
+  int len = TYPE_LENGTH (type);
+
+  if (TYPE_CODE (type) == TYPE_CODE_FLT)
+    return_register = FP0_REGNUM;
+  else
+    return_register = R0_REGNUM;
+  
+  if (len == 8 && TYPE_CODE (type) == TYPE_CODE_FLT)
+    {
+      DOUBLEST val;
+      if (TARGET_BYTE_ORDER == LITTLE_ENDIAN)
+	floatformat_to_doublest (&floatformat_ieee_double_littlebyte_bigword,
+				 (char *) regbuf + REGISTER_BYTE (return_register),
+				 &val);
+      else
+	floatformat_to_doublest (&floatformat_ieee_double_big,
+				 (char *) regbuf + REGISTER_BYTE (return_register),
+				 &val);
+      store_floating (valbuf, len, val);
+    }
+  else if (len <= 4)
+    {
+      if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+	offset = REGISTER_BYTE (return_register) + 4 - len;
+      else
+	offset = REGISTER_BYTE (return_register);
+      memcpy (valbuf, regbuf + offset, len);
+    }
+  else if (len <= 8)
+    {
+      if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+	offset = REGISTER_BYTE (return_register) + 8 - len;
+      else
+	offset = REGISTER_BYTE (return_register);
+      memcpy (valbuf, regbuf + offset, len);
+    }
+  else
+    error ("bad size for return value");
+}
+
 /* Write into appropriate registers a function return value
    of type TYPE, given in virtual format.
    If the architecture is sh4 or sh3e, store a function's return value
@@ -1917,6 +1977,7 @@ sh_gdbarch_init (struct gdbarch_info inf
   set_gdbarch_store_pseudo_register (gdbarch, sh_store_pseudo_register);
   set_gdbarch_do_registers_info (gdbarch, sh_do_registers_info);
   set_gdbarch_breakpoint_from_pc (gdbarch, sh_breakpoint_from_pc);
+  set_gdbarch_extract_return_value (gdbarch, sh_extract_return_value);
   print_sh_insn = gdb_print_insn_sh;
 
   switch (info.bfd_arch_info->mach)
@@ -1982,6 +2043,7 @@ sh_gdbarch_init (struct gdbarch_info inf
       sh_show_regs = sh3e_show_regs;
       sh_store_return_value = sh3e_sh4_store_return_value;
       sh_register_virtual_type = sh_sh3e_register_virtual_type;
+      set_gdbarch_extract_return_value (gdbarch, sh3e_sh4_extract_return_value);
       set_gdbarch_frame_init_saved_regs (gdbarch, sh_fp_frame_init_saved_regs);
       set_gdbarch_register_raw_size (gdbarch, sh_default_register_raw_size);
       set_gdbarch_register_virtual_size (gdbarch, sh_default_register_raw_size);
@@ -2024,6 +2086,7 @@ sh_gdbarch_init (struct gdbarch_info inf
       sh_show_regs = sh4_show_regs;
       sh_store_return_value = sh3e_sh4_store_return_value;
       sh_register_virtual_type = sh_sh4_register_virtual_type;
+      set_gdbarch_extract_return_value (gdbarch, sh3e_sh4_extract_return_value);
       set_gdbarch_frame_init_saved_regs (gdbarch, sh_fp_frame_init_saved_regs);
       set_gdbarch_fp0_regnum (gdbarch, 25);
       set_gdbarch_register_raw_size (gdbarch, sh_sh4_register_raw_size);
@@ -2092,7 +2155,6 @@ sh_gdbarch_init (struct gdbarch_info inf
   set_gdbarch_coerce_float_to_double (gdbarch, 
 				      sh_coerce_float_to_double);
 
-  set_gdbarch_extract_return_value (gdbarch, sh_extract_return_value);
   set_gdbarch_push_arguments (gdbarch, sh_push_arguments);
   set_gdbarch_push_dummy_frame (gdbarch, generic_push_dummy_frame);
   set_gdbarch_push_return_address (gdbarch, sh_push_return_address);

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]