This is the mail archive of the gdb-patches@sourceware.org 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]

Initialize default floating-point model on ARM for GNU binaries


Hi Richard,

Here's a patch to select the default floating-point model based on
flags set in the ELF header of binaries produced by the GNU toolchain.
It carefully avoids doing this for binaries conforming to the (new)
official EABI.  I removed the setting of the ABI for unrecognized EABI
versions.  These will default to ARM_ABI_ACPS anyway, later on.

With this patch, GDB correctly recognizes that OpenBSD/arm binaries
use the "sofvfp" floating-point model, which reduces the number of
testsuite failures considerably.

ok?

Mark

P.S. It seems the code to detect the correct floating-point model is
somewhat busted; arm-linux-tdep.c, armnbsd-tdep.c and now
armobsd-tdep.c contain code to set tdep->fp_model if it is still set
to ARM_FLOAT_AUTO, but that never seems to happen.


Index: ChangeLog
from  Mark Kettenis  <kettenis@gnu.org>

	* arm-tdep.c (arm_gdbarch_init): Get default floating-point model
	from ELF flags for binaries produced by the GNU toolchain.

Index: arm-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/arm-tdep.c,v
retrieving revision 1.211
diff -u -p -r1.211 arm-tdep.c
--- arm-tdep.c 16 Jul 2006 10:33:25 -0000 1.211
+++ arm-tdep.c 17 Jul 2006 22:38:29 -0000
@@ -2594,7 +2594,7 @@ arm_gdbarch_init (struct gdbarch_info in
 
   if (arm_abi == ARM_ABI_AUTO && info.abfd != NULL)
     {
-      int ei_osabi;
+      int ei_osabi, e_flags;
 
       switch (bfd_get_flavour (info.abfd))
 	{
@@ -2611,19 +2611,18 @@ arm_gdbarch_init (struct gdbarch_info in
 
 	case bfd_target_elf_flavour:
 	  ei_osabi = elf_elfheader (info.abfd)->e_ident[EI_OSABI];
+	  e_flags = elf_elfheader (info.abfd)->e_flags;
+
 	  if (ei_osabi == ELFOSABI_ARM)
 	    {
 	      /* GNU tools used to use this value, but do not for EABI
-		 objects.  There's nowhere to tag an EABI version anyway,
-		 so assume APCS.  */
+		 objects.  There's nowhere to tag an EABI version
+		 anyway, so assume APCS.  */
 	      arm_abi = ARM_ABI_APCS;
 	    }
 	  else if (ei_osabi == ELFOSABI_NONE)
 	    {
-	      int e_flags, eabi_ver;
-
-	      e_flags = elf_elfheader (info.abfd)->e_flags;
-	      eabi_ver = EF_ARM_EABI_VERSION (e_flags);
+	      int eabi_ver = EF_ARM_EABI_VERSION (e_flags);
 
 	      switch (eabi_ver)
 		{
@@ -2640,8 +2639,29 @@ arm_gdbarch_init (struct gdbarch_info in
 		  break;
 
 		default:
+		  /* Leave it as "auto".  */
 		  warning (_("unknown ARM EABI version 0x%x"), eabi_ver);
-		  arm_abi = ARM_ABI_APCS;
+		  break;
+		}
+	    }
+
+	  if (fp_model == ARM_FLOAT_AUTO)
+	    {
+	      int e_flags = elf_elfheader (info.abfd)->e_flags;
+
+	      switch (e_flags & (EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT))
+		{
+		case 0:
+		  fp_model = ARM_FLOAT_FPA;
+		  break;
+		case EF_ARM_SOFT_FLOAT:
+		  fp_model = ARM_FLOAT_SOFT_FPA;
+		  break;
+		case EF_ARM_VFP_FLOAT:
+		  fp_model = ARM_FLOAT_VFP;
+		  break;
+		case EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT:
+		  fp_model = ARM_FLOAT_SOFT_VFP;
 		  break;
 		}
 	    }


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