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]
Other format: [Raw text]

Re: [rfa] Fix ppc32 GNU/Linux (and AIX) struct convention


On Sep 13, 5:57pm, Andrew Cagney wrote:


	* ppc-linux-tdep.c (ppc_linux_init_abi): Set the 32 bit
	"use_struct_convention" to "rs6000_use_struct_convention".
	* ppc-tdep.h (rs6000_use_struct_convention): Declare.


No.  I would prefer that ppc-linux-tdep.c contain its own (suitably
named) "use_struct_convention" code even if it's identical to the code
needed by AIX.  That way we can tweak one without having to worry
about breaking the other.

Done. This is what I've checked in.


Andrew



	* rs6000-tdep.c (rs6000_use_struct_convention): New function.
	(rs6000_gdbarch_init): For AIX, set "use_struct_convention" to
	"rs6000_use_struct_convention".


Okay.


	* ppc-sysv-tdep.c (ppc_sysv_abi_broken_use_struct_convention):
	Delete function.
	* ppc-tdep.h (ppc_sysv_abi_broken_use_struct_convention): Delete.


Okay.

Kevin


2003-09-16  Andrew Cagney  <cagney@redhat.com>

	* ppc-linux-tdep.c (ppc_linux_init_abi): Set the 32 bit
	"use_struct_convention" to "ppc_linux_use_struct_convention".
	(ppc_linux_use_struct_convention): New function.
	* rs6000-tdep.c (rs6000_use_struct_convention): New function.
	(rs6000_gdbarch_init): For AIX, set "use_struct_convention" to
	"rs6000_use_struct_convention".
	* ppc-tdep.h (ppc_sysv_abi_broken_use_struct_convention): Delete
	declaration.
	* ppc-sysv-tdep.c (ppc_sysv_abi_broken_use_struct_convention):
	Delete function.

Index: ppc-linux-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/ppc-linux-tdep.c,v
retrieving revision 1.39
diff -u -r1.39 ppc-linux-tdep.c
--- ppc-linux-tdep.c	9 Sep 2003 03:14:02 -0000	1.39
+++ ppc-linux-tdep.c	16 Sep 2003 23:28:18 -0000
@@ -591,6 +591,20 @@
   return val;
 }
 
+/* For historic reasons, PPC 32 GNU/Linux follows PowerOpen rather
+   than the 32 bit SYSV R4 ABI structure return convention - all
+   structures, no matter their size, are put in memory.  Vectors,
+   which were added later, do get returned in a register though.  */
+
+static int     
+ppc_linux_use_struct_convention (int gcc_p, struct type *value_type)
+{  
+  if ((TYPE_LENGTH (value_type) == 16 || TYPE_LENGTH (value_type) == 8)
+      && TYPE_VECTOR (value_type))
+    return 0;                            
+  return 1;
+}
+
 /* Fetch (and possibly build) an appropriate link_map_offsets
    structure for GNU/Linux PPC targets using the struct offsets
    defined in link.h (but without actual reference to that file).
@@ -1017,15 +1031,17 @@
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
-  /* Until November 2001, gcc was not complying to the SYSV ABI for
-     returning structures less than or equal to 8 bytes in size. It was
-     returning everything in memory. When this was corrected, it wasn't
-     fixed for native platforms.  */
-  set_gdbarch_use_struct_convention (gdbarch,
-                                   ppc_sysv_abi_broken_use_struct_convention);
-
   if (tdep->wordsize == 4)
     {
+      /* Until November 2001, gcc did not comply with the 32 bit SysV
+	 R4 ABI requirement that structures less than or equal to 8
+	 bytes should be returned in registers.  Instead GCC was using
+	 the the AIX/PowerOpen ABI - everything returned in memory
+	 (well ignoring vectors that is).  When this was corrected, it
+	 wasn't fixed for GNU/Linux native platform.  Use the
+	 PowerOpen struct convention.  */
+      set_gdbarch_use_struct_convention (gdbarch, ppc_linux_use_struct_convention);
+
       /* Note: kevinb/2002-04-12: See note in rs6000_gdbarch_init regarding
 	 *_push_arguments().  The same remarks hold for the methods below.  */
       set_gdbarch_frameless_function_invocation (gdbarch,
Index: ppc-sysv-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/ppc-sysv-tdep.c,v
retrieving revision 1.10
diff -u -r1.10 ppc-sysv-tdep.c
--- ppc-sysv-tdep.c	12 Sep 2003 18:55:24 -0000	1.10
+++ ppc-sysv-tdep.c	16 Sep 2003 23:28:19 -0000
@@ -329,20 +329,6 @@
   return sp;
 }
 
-/* Until November 2001, gcc was not complying to the SYSV ABI for 
-   returning structures less than or equal to 8 bytes in size.  It was
-   returning everything in memory.  When this was corrected, it wasn't
-   fixed for native platforms.  */
-int     
-ppc_sysv_abi_broken_use_struct_convention (int gcc_p, struct type *value_type)
-{  
-  if ((TYPE_LENGTH (value_type) == 16 || TYPE_LENGTH (value_type) == 8)
-      && TYPE_VECTOR (value_type))
-    return 0;                            
-
-  return generic_use_struct_convention (gcc_p, value_type);
-}
-
 /* Structures 8 bytes or less long are returned in the r3 & r4
    registers, according to the SYSV ABI. */
 int
Index: rs6000-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/rs6000-tdep.c,v
retrieving revision 1.159
diff -u -r1.159 rs6000-tdep.c
--- rs6000-tdep.c	14 Sep 2003 22:35:33 -0000	1.159
+++ rs6000-tdep.c	16 Sep 2003 23:28:19 -0000
@@ -1372,6 +1372,18 @@
     }
 }
 
+/* PowerOpen always puts structures in memory.  Vectors, which were
+   added later, do get returned in a register though.  */
+
+static int     
+rs6000_use_struct_convention (int gcc_p, struct type *value_type)
+{  
+  if ((TYPE_LENGTH (value_type) == 16 || TYPE_LENGTH (value_type) == 8)
+      && TYPE_VECTOR (value_type))
+    return 0;                            
+  return 1;
+}
+
 static void
 rs6000_extract_return_value (struct type *valtype, char *regbuf, char *valbuf)
 {
@@ -2957,7 +2969,7 @@
     				       ppc_sysv_abi_use_struct_convention);
   else
     set_gdbarch_use_struct_convention (gdbarch,
-				       generic_use_struct_convention);
+				       rs6000_use_struct_convention);
 
   set_gdbarch_frameless_function_invocation (gdbarch,
                                          rs6000_frameless_function_invocation);

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