This is the mail archive of the libc-ports@sources.redhat.com mailing list for the libc-ports 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]

[PATCH roland/arm-hwcap-vfp] don't use HWCAP_ARM_* in OS-independent code


AIUI there is nothing like HWCAP bits defined by the ARM hardware or
generic ABI specs.  So the set of HWCAP_ARM_* bits and their values is
purely a Linuxism.  Hence, it does not belong in any libc code outside
of sysdeps/.../linux/ directories.

This is the first step at abstracting out the Linux-specific HWCAP checks
used in sysdeps/arm/ code.  It makes the C code testing HWCAP_ARM_VFP
use a macro ARM_HAVE_VFP instead.  A Linux-specific header defines this
to the check used now, (GLRO (dl_hwcap) & HWCAP_ARM_VFP).

IMHO, the natural place for ARM_HAVE_VFP would be sysdep.h.  But since
the Linux definition needs GLRO, that would mean sysdep.h including
ldsodefs.h, and when I tried that I got into include order hell that
didn't seem worth fighting.  And it seemed utterly wrong for each file
using ARM_HAVE_VFP to include ldsodefs.h just because that macro's
linux/arm/sysdep.h definition happens to need it, when the including
file doesn't itself actually use any ldsodefs.h symbols.  So instead I
just put the macro in ldsodefs.h, odd a place as that is for something
called ARM_HAVE_VFP in the abstract.  The other obvious alternative is
just to create a new header dedicated to this sort of thing, e.g.
<arm-features.h>.  I'm glad to do that instead if you prefer.

This change is not quite just a a no-op abstraction of the existing
logic.  I also made the generic sysdeps/arm/ code define ARM_HAVE_VFP to
a constant when __VFP_FP__ is predefined.  My rationale is that if the
compiler building libc is allowed to generate VFP instructions, then
we're already implicitly presuming the hardware exists at runtime and so
we might as well skip the explicit runtime checks in libc too.

I did a basic compile test on arm-linux-gnueabi (cross).
I only used a compiler that does predefine __VFP_FP__, but
I did verify the build with the #if test of that diked out.

Ok?


Thanks,
Roland


ports/ChangeLog.arm
	* sysdeps/arm/ldsodefs.h [__VFP_FP__] (ARM_HAVE_VFP): New macro.
	* sysdeps/unix/sysv/linux/arm/ldsodefs.h
	[!__VFP_FP__ && !__ASSEMBLER__] (ARM_HAVE_VFP): New macro.
	* sysdeps/arm/fclrexcpt.c: Use ARM_HAVE_VFP instead of hwcap bits.
	* sysdeps/arm/fedisblxcpt.c: Likewise.
	* sysdeps/arm/feenablxcpt.c: Likewise.
	* sysdeps/arm/fegetenv.c: Likewise.
	* sysdeps/arm/fegetexcept.c: Likewise.
	* sysdeps/arm/fegetround.c: Likewise.
	* sysdeps/arm/feholdexcpt.c: Likewise.
	* sysdeps/arm/fesetenv.c: Likewise.
	* sysdeps/arm/fesetround.c: Likewise.
	* sysdeps/arm/feupdateenv.c: Likewise.
	* sysdeps/arm/fgetexcptflg.c: Likewise.
	* sysdeps/arm/fraiseexcpt.c: Likewise.
	* sysdeps/arm/fsetexcptflg.c: Likewise.
	* sysdeps/arm/ftestexcept.c: Likewise.
	* sysdeps/arm/setfpucw.c: Likewise.


diff --git a/ports/sysdeps/arm/fclrexcpt.c b/ports/sysdeps/arm/fclrexcpt.c
index ddedc35..c9914d6 100644
--- a/ports/sysdeps/arm/fclrexcpt.c
+++ b/ports/sysdeps/arm/fclrexcpt.c
@@ -1,5 +1,5 @@
 /* Clear given exceptions in current floating-point environment.
-   Copyright (C) 1997,98,99,2000,01,05,11 Free Software Foundation, Inc.
+   Copyright (C) 1997-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -19,15 +19,12 @@
 #include <fenv.h>
 #include <fpu_control.h>
 
-#include <unistd.h>
 #include <ldsodefs.h>
-#include <dl-procinfo.h>
-#include <sysdep.h>
 
 int
 __feclearexcept (int excepts)
 {
-  if (GLRO (dl_hwcap) & HWCAP_ARM_VFP)
+  if (ARM_HAVE_VFP)
     {
       unsigned long int temp;
 
diff --git a/ports/sysdeps/arm/fedisblxcpt.c b/ports/sysdeps/arm/fedisblxcpt.c
index c9c62a4..ef6edc7 100644
--- a/ports/sysdeps/arm/fedisblxcpt.c
+++ b/ports/sysdeps/arm/fedisblxcpt.c
@@ -1,5 +1,5 @@
 /* Disable floating-point exceptions.
-   Copyright (C) 2001, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2001-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Philip Blundell <philb@gnu.org>, 2001.
 
@@ -20,15 +20,12 @@
 #include <fenv.h>
 #include <fpu_control.h>
 
-#include <unistd.h>
 #include <ldsodefs.h>
-#include <dl-procinfo.h>
-#include <sysdep.h>
 
 int
 fedisableexcept (int excepts)
 {
-  if (GLRO (dl_hwcap) & HWCAP_ARM_VFP)
+  if (ARM_HAVE_VFP)
     {
       unsigned long int new_exc, old_exc;
 
diff --git a/ports/sysdeps/arm/feenablxcpt.c b/ports/sysdeps/arm/feenablxcpt.c
index 3b2b934..6e9a952 100644
--- a/ports/sysdeps/arm/feenablxcpt.c
+++ b/ports/sysdeps/arm/feenablxcpt.c
@@ -1,5 +1,5 @@
 /* Enable floating-point exceptions.
-   Copyright (C) 2001, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2001-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Philip Blundell <philb@gnu.org>, 2001.
 
@@ -20,15 +20,12 @@
 #include <fenv.h>
 #include <fpu_control.h>
 
-#include <unistd.h>
-#include <ldsodefs.h>
-#include <dl-procinfo.h>
 #include <sysdep.h>
 
 int
 feenableexcept (int excepts)
 {
-  if (GLRO (dl_hwcap) & HWCAP_ARM_VFP)
+  if (ARM_HAVE_VFP)
     {
       unsigned long int new_exc, old_exc;
 
diff --git a/ports/sysdeps/arm/fegetenv.c b/ports/sysdeps/arm/fegetenv.c
index c638635..45613ed 100644
--- a/ports/sysdeps/arm/fegetenv.c
+++ b/ports/sysdeps/arm/fegetenv.c
@@ -1,5 +1,5 @@
 /* Store current floating-point environment.
-   Copyright (C) 1997,98,99,2000,01,05,10 Free Software Foundation, Inc.
+   Copyright (C) 1997-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -19,15 +19,12 @@
 #include <fenv.h>
 #include <fpu_control.h>
 
-#include <unistd.h>
 #include <ldsodefs.h>
-#include <dl-procinfo.h>
-#include <sysdep.h>
 
 int
 __fegetenv (fenv_t *envp)
 {
-  if (GLRO (dl_hwcap) & HWCAP_ARM_VFP)
+  if (ARM_HAVE_VFP)
     {
       unsigned long int temp;
       _FPU_GETCW (temp);
diff --git a/ports/sysdeps/arm/fegetexcept.c b/ports/sysdeps/arm/fegetexcept.c
index 929d6c5..9c4c221 100644
--- a/ports/sysdeps/arm/fegetexcept.c
+++ b/ports/sysdeps/arm/fegetexcept.c
@@ -1,5 +1,5 @@
 /* Get floating-point exceptions.
-   Copyright (C) 2001, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2001-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Philip Blundell <philb@gnu.org>, 2001
 
@@ -20,15 +20,12 @@
 #include <fenv.h>
 #include <fpu_control.h>
 
-#include <unistd.h>
 #include <ldsodefs.h>
-#include <dl-procinfo.h>
-#include <sysdep.h>
 
 int
 fegetexcept (void)
 {
-  if (GLRO (dl_hwcap) & HWCAP_ARM_VFP)
+  if (ARM_HAVE_VFP)
     {
       unsigned long temp;
 
diff --git a/ports/sysdeps/arm/fegetround.c b/ports/sysdeps/arm/fegetround.c
index df10497..4a7a476 100644
--- a/ports/sysdeps/arm/fegetround.c
+++ b/ports/sysdeps/arm/fegetround.c
@@ -1,5 +1,5 @@
 /* Return current rounding direction.
-   Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2004-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -19,15 +19,12 @@
 #include <fenv.h>
 #include <fpu_control.h>
 
-#include <unistd.h>
 #include <ldsodefs.h>
-#include <dl-procinfo.h>
-#include <sysdep.h>
 
 int
 fegetround (void)
 {
-  if (GLRO (dl_hwcap) & HWCAP_ARM_VFP)
+  if (ARM_HAVE_VFP)
     {
       unsigned int temp;
 
diff --git a/ports/sysdeps/arm/feholdexcpt.c b/ports/sysdeps/arm/feholdexcpt.c
index 4aed48b..74602a8 100644
--- a/ports/sysdeps/arm/feholdexcpt.c
+++ b/ports/sysdeps/arm/feholdexcpt.c
@@ -1,5 +1,5 @@
 /* Store current floating-point environment and clear exceptions.
-   Copyright (C) 1997, 1998, 1999, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1997-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -19,15 +19,12 @@
 #include <fenv.h>
 #include <fpu_control.h>
 
-#include <unistd.h>
 #include <ldsodefs.h>
-#include <dl-procinfo.h>
-#include <sysdep.h>
 
 int
 feholdexcept (fenv_t *envp)
 {
-  if (GLRO (dl_hwcap) & HWCAP_ARM_VFP)
+  if (ARM_HAVE_VFP)
     {
       unsigned long int temp;
 
diff --git a/ports/sysdeps/arm/fesetenv.c b/ports/sysdeps/arm/fesetenv.c
index 6137032..474a9b4 100644
--- a/ports/sysdeps/arm/fesetenv.c
+++ b/ports/sysdeps/arm/fesetenv.c
@@ -1,5 +1,5 @@
 /* Install given floating-point environment.
-   Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2004-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -19,15 +19,12 @@
 #include <fenv.h>
 #include <fpu_control.h>
 
-#include <unistd.h>
 #include <ldsodefs.h>
-#include <dl-procinfo.h>
-#include <sysdep.h>
 
 int
 __fesetenv (const fenv_t *envp)
 {
-  if (GLRO (dl_hwcap) & HWCAP_ARM_VFP)
+  if (ARM_HAVE_VFP)
     {
       unsigned int temp;
 
diff --git a/ports/sysdeps/arm/fesetround.c b/ports/sysdeps/arm/fesetround.c
index 997bd98..99034aa 100644
--- a/ports/sysdeps/arm/fesetround.c
+++ b/ports/sysdeps/arm/fesetround.c
@@ -1,5 +1,5 @@
 /* Set current rounding direction.
-   Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2004-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -19,15 +19,12 @@
 #include <fenv.h>
 #include <fpu_control.h>
 
-#include <unistd.h>
 #include <ldsodefs.h>
-#include <dl-procinfo.h>
-#include <sysdep.h>
 
 int
 fesetround (int round)
 {
-  if (GLRO (dl_hwcap) & HWCAP_ARM_VFP)
+  if (ARM_HAVE_VFP)
     {
       fpu_control_t temp;
 
diff --git a/ports/sysdeps/arm/feupdateenv.c b/ports/sysdeps/arm/feupdateenv.c
index 98f2654..3b7a239 100644
--- a/ports/sysdeps/arm/feupdateenv.c
+++ b/ports/sysdeps/arm/feupdateenv.c
@@ -1,5 +1,5 @@
 /* Install given floating-point environment and raise exceptions.
-   Copyright (C) 1997, 1999, 2000, 2008, 2010 Free Software Foundation, Inc.
+   Copyright (C) 1997-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
 
@@ -20,15 +20,12 @@
 #include <fenv.h>
 #include <fpu_control.h>
 
-#include <unistd.h>
 #include <ldsodefs.h>
-#include <dl-procinfo.h>
-#include <sysdep.h>
 
 int
 __feupdateenv (const fenv_t *envp)
 {
-  if (GLRO (dl_hwcap) & HWCAP_ARM_VFP)
+  if (ARM_HAVE_VFP)
     {
       unsigned int temp;
 
diff --git a/ports/sysdeps/arm/fgetexcptflg.c b/ports/sysdeps/arm/fgetexcptflg.c
index 41661a2..4e1b74e 100644
--- a/ports/sysdeps/arm/fgetexcptflg.c
+++ b/ports/sysdeps/arm/fgetexcptflg.c
@@ -1,5 +1,5 @@
 /* Store current representation for exceptions.
-   Copyright (C) 1997, 1999, 2000, 2008 Free Software Foundation, Inc.
+   Copyright (C) 1997-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
 
@@ -20,15 +20,12 @@
 #include <fenv.h>
 #include <fpu_control.h>
 
-#include <unistd.h>
-#include <ldsodefs.h>
-#include <dl-procinfo.h>
 #include <sysdep.h>
 
 int
 __fegetexceptflag (fexcept_t *flagp, int excepts)
 {
-  if (GLRO (dl_hwcap) & HWCAP_ARM_VFP)
+  if (ARM_HAVE_VFP)
     {
       unsigned long temp;
 
diff --git a/ports/sysdeps/arm/fraiseexcpt.c b/ports/sysdeps/arm/fraiseexcpt.c
index 0a43688..6e56343 100644
--- a/ports/sysdeps/arm/fraiseexcpt.c
+++ b/ports/sysdeps/arm/fraiseexcpt.c
@@ -1,5 +1,5 @@
 /* Raise given exceptions.
-   Copyright (C) 2004, 2005, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2004-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -20,15 +20,12 @@
 #include <fenv.h>
 #include <float.h>
 
-#include <unistd.h>
 #include <ldsodefs.h>
-#include <dl-procinfo.h>
-#include <sysdep.h>
 
 int
 feraiseexcept (int excepts)
 {
-  if (GLRO (dl_hwcap) & HWCAP_ARM_VFP)
+  if (ARM_HAVE_VFP)
     {
       int fpscr;
       const float fp_zero = 0.0, fp_one = 1.0, fp_max = FLT_MAX,
diff --git a/ports/sysdeps/arm/fsetexcptflg.c b/ports/sysdeps/arm/fsetexcptflg.c
index bee51a9..690724a 100644
--- a/ports/sysdeps/arm/fsetexcptflg.c
+++ b/ports/sysdeps/arm/fsetexcptflg.c
@@ -1,5 +1,5 @@
 /* Set floating-point environment exception handling.
-   Copyright (C) 1997,98,99,2000,01,05,08,11 Free Software Foundation, Inc.
+   Copyright (C) 1997-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -20,15 +20,12 @@
 #include <math.h>
 #include <fpu_control.h>
 
-#include <unistd.h>
 #include <ldsodefs.h>
-#include <dl-procinfo.h>
-#include <sysdep.h>
 
 int
 __fesetexceptflag (const fexcept_t *flagp, int excepts)
 {
-  if (GLRO (dl_hwcap) & HWCAP_ARM_VFP)
+  if (ARM_HAVE_VFP)
     {
       fexcept_t temp;
 
diff --git a/ports/sysdeps/arm/ftestexcept.c b/ports/sysdeps/arm/ftestexcept.c
index 06817d2..1219ec2 100644
--- a/ports/sysdeps/arm/ftestexcept.c
+++ b/ports/sysdeps/arm/ftestexcept.c
@@ -1,5 +1,5 @@
 /* Test exception in current environment.
-   Copyright (C) 1997, 1998, 2005, 2010 Free Software Foundation, Inc.
+   Copyright (C) 1997-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -19,15 +19,12 @@
 #include <fenv.h>
 #include <fpu_control.h>
 
-#include <unistd.h>
 #include <ldsodefs.h>
-#include <dl-procinfo.h>
-#include <sysdep.h>
 
 int
 fetestexcept (int excepts)
 {
-  if (GLRO (dl_hwcap) & HWCAP_ARM_VFP)
+  if (ARM_HAVE_VFP)
     {
       fexcept_t temp;
 
diff --git a/ports/sysdeps/arm/ldsodefs.h b/ports/sysdeps/arm/ldsodefs.h
index 73375b6..199a2e3 100644
--- a/ports/sysdeps/arm/ldsodefs.h
+++ b/ports/sysdeps/arm/ldsodefs.h
@@ -35,6 +35,23 @@ struct La_arm_retval;
 				   uintptr_t *, const struct La_arm_regs *,  \
 				   struct La_arm_retval *, const char *)
 
+/* This makes more sense in sysdep.h, but since OS-specific definitions
+   will want to use GLRO (dl_hwcap), using this macro will necessitate an
+   #include <ldsodefs.h> and include order makes doing that inside sysdep.h
+   infeasible.  So instead we require users of this macro to do an
+   #include <ldsodefs.h> just to facilitate such OS-specific definitions.
+
+   If we don't define it here, an OS-specific ldsodefs.h file should define
+   ARM_HAVE_VFP to an appropriate expression for testing at runtime whether
+   the VFP hardware is present.  */
+
+#ifdef __VFP_FP__
+/* The compiler is generating VFP instructions, so we're already
+   assuming the hardware exists.  */
+# undef ARM_HAVE_VFP
+# define ARM_HAVE_VFP	1
+#endif
+
 #include_next <ldsodefs.h>
 
 #endif
diff --git a/ports/sysdeps/arm/setfpucw.c b/ports/sysdeps/arm/setfpucw.c
index d0cea32..5933afe 100644
--- a/ports/sysdeps/arm/setfpucw.c
+++ b/ports/sysdeps/arm/setfpucw.c
@@ -1,5 +1,5 @@
 /* Set the FPU control word.
-   Copyright (C) 1996, 1997, 1999, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1996-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -19,15 +19,12 @@
 #include <math.h>
 #include <fpu_control.h>
 
-#include <unistd.h>
 #include <ldsodefs.h>
-#include <dl-procinfo.h>
-#include <sysdep.h>
 
 void
 __setfpucw (fpu_control_t set)
 {
-  if (GLRO (dl_hwcap) & HWCAP_ARM_VFP)
+  if (ARM_HAVE_VFP)
     {
       fpu_control_t cw;
 
diff --git a/ports/sysdeps/unix/sysv/linux/arm/ldsodefs.h b/ports/sysdeps/unix/sysv/linux/arm/ldsodefs.h
index 8980bb1..fc4e955 100644
--- a/ports/sysdeps/unix/sysv/linux/arm/ldsodefs.h
+++ b/ports/sysdeps/unix/sysv/linux/arm/ldsodefs.h
@@ -58,4 +58,12 @@
     [EI_OSABI] = EXTRA_OSABI				\
   }
 
+/* This might make more sense in sysdep.h, but since it uses GLRO
+   it necessitates an #include <ldsodefs.h> and include order makes
+   doing that inside sysdep.h infeasible.  */
+#ifndef __VFP_FP__
+# undef ARM_HAVE_VFP
+# define ARM_HAVE_VFP	(GLRO (dl_hwcap) & HWCAP_ARM_VFP)
+#endif
+
 #endif


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