This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch, master, updated. glibc-2.16-ports-merge-158-g2aa5b9c
- From: roland at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 9 Aug 2012 23:47:57 -0000
- Subject: GNU C Library master sources branch, master, updated. glibc-2.16-ports-merge-158-g2aa5b9c
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, master has been updated
via 2aa5b9c146ae9a3efabd430b12cddb635bc29164 (commit)
from 7f540252876b853889c9482c9086ac1c55fe6e3c (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=2aa5b9c146ae9a3efabd430b12cddb635bc29164
commit 2aa5b9c146ae9a3efabd430b12cddb635bc29164
Author: Roland McGrath <roland@hack.frob.com>
Date: Thu Aug 9 16:17:14 2012 -0700
Make ARM setjmp/longjmp respect ARM_ASSUME_NO_IWMMXT macro.
diff --git a/ports/ChangeLog.arm b/ports/ChangeLog.arm
index 1375922..34d606d 100644
--- a/ports/ChangeLog.arm
+++ b/ports/ChangeLog.arm
@@ -1,5 +1,12 @@
2012-08-09 Roland McGrath <roland@hack.frob.com>
+ * sysdeps/arm/arm-features.h: Document ARM_ASSUME_NO_IWMMXT.
+ * sysdeps/arm/setjmp.S: Include <arm-features.h>.
+ [!ARM_ASSUME_NO_IWMMXT || __SOFTFP__]: Conditionalize hwcap
+ fetching bits on this.
+ [!ARM_ASSUME_NO_IWMMXT]: Conditionalize iWMMXt register use on this.
+ * sysdeps/arm/__longjmp.S: Likewise.
+
* sysdeps/arm/__longjmp.S: Use .Lxxx rather than Lxxx for local labels.
[__SOFTFP__]: Conditionalize HWCAP_ARM_VFP check on this.
* sysdeps/arm/setjmp.S: Likewise.
diff --git a/ports/sysdeps/arm/__longjmp.S b/ports/sysdeps/arm/__longjmp.S
index aa5cf74..b3c2860 100644
--- a/ports/sysdeps/arm/__longjmp.S
+++ b/ports/sysdeps/arm/__longjmp.S
@@ -21,6 +21,7 @@
#define _ASM
#include <bits/setjmp.h>
#include <rtld-global-offsets.h>
+#include <arm-features.h>
/* __longjmp(jmpbuf, val) */
@@ -46,23 +47,29 @@ ENTRY (__longjmp)
cfi_restore (sp)
cfi_restore (lr)
-#ifdef IS_IN_rtld
+#if !defined ARM_ASSUME_NO_IWMMXT || defined __SOFTFP__
+# define NEED_HWCAP 1
+#endif
+
+#ifdef NEED_HWCAP
+# ifdef IS_IN_rtld
ldr a2, 1f
ldr a3, .Lrtld_local_ro
0: add a2, pc, a2
add a2, a2, a3
ldr a2, [a2, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET]
-#else
-#ifdef PIC
+# else
+# ifdef PIC
ldr a2, 1f
ldr a3, .Lrtld_global_ro
0: add a2, pc, a2
ldr a2, [a2, a3]
ldr a2, [a2, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET]
-#else
+# else
ldr a2, .Lhwcap
ldr a2, [a2, #0]
-#endif
+# endif
+# endif
#endif
#ifdef __SOFTFP__
@@ -79,6 +86,7 @@ ENTRY (__longjmp)
mcr p10, 7, a3, cr1, cr0, 0
.Lno_vfp:
+#ifndef ARM_ASSUME_NO_IWMMXT
tst a2, #HWCAP_ARM_IWMMXT
beq .Lno_iwmmxt
@@ -91,22 +99,25 @@ ENTRY (__longjmp)
ldcl p1, cr14, [r12], #8
ldcl p1, cr15, [r12], #8
.Lno_iwmmxt:
+#endif
DO_RET(lr)
-#ifdef IS_IN_rtld
+#ifdef NEED_HWCAP
+# ifdef IS_IN_rtld
1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8
.Lrtld_local_ro:
.long C_SYMBOL_NAME(_rtld_local_ro)(GOTOFF)
-#else
-#ifdef PIC
+# else
+# ifdef PIC
1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8
.Lrtld_global_ro:
.long C_SYMBOL_NAME(_rtld_global_ro)(GOT)
-#else
+# else
.Lhwcap:
.long C_SYMBOL_NAME(_dl_hwcap)
-#endif
+# endif
+# endif
#endif
END (__longjmp)
diff --git a/ports/sysdeps/arm/arm-features.h b/ports/sysdeps/arm/arm-features.h
index 0f99b3a..41befb5 100644
--- a/ports/sysdeps/arm/arm-features.h
+++ b/ports/sysdeps/arm/arm-features.h
@@ -31,4 +31,9 @@
# define ARM_HAVE_VFP 1
#endif
+/* An OS-specific arm-features.h file may define ARM_ASSUME_NO_IWMMXT
+ to indicate at compile time that iWMMXt hardware is never present
+ at runtime (or that we never care about its state) and so need not
+ be checked for. */
+
#endif /* arm-features.h */
diff --git a/ports/sysdeps/arm/setjmp.S b/ports/sysdeps/arm/setjmp.S
index 9bfacc1..dbd59dd 100644
--- a/ports/sysdeps/arm/setjmp.S
+++ b/ports/sysdeps/arm/setjmp.S
@@ -21,6 +21,7 @@
#define _ASM
#include <bits/setjmp.h>
#include <rtld-global-offsets.h>
+#include <arm-features.h>
ENTRY (__sigsetjmp)
mov ip, r0
@@ -28,24 +29,30 @@ ENTRY (__sigsetjmp)
/* Save registers */
stmia ip!, {v1-v6, sl, fp, sp, lr}
+#if !defined ARM_ASSUME_NO_IWMMXT || defined __SOFTFP__
+# define NEED_HWCAP 1
+#endif
+
+#ifdef NEED_HWCAP
/* Check if we have a VFP unit. */
-#ifdef IS_IN_rtld
+# ifdef IS_IN_rtld
ldr a3, 1f
ldr a4, .Lrtld_local_ro
0: add a3, pc, a3
add a3, a3, a4
ldr a3, [a3, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET]
-#else
-#ifdef PIC
+# else
+# ifdef PIC
ldr a3, 1f
ldr a4, .Lrtld_global_ro
0: add a3, pc, a3
ldr a3, [a3, a4]
ldr a3, [a3, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET]
-#else
+# else
ldr a3, .Lhwcap
ldr a3, [a3, #0]
-#endif
+# endif
+# endif
#endif
#ifdef __SOFTFP__
@@ -64,6 +71,7 @@ ENTRY (__sigsetjmp)
str a4, [ip], #4
.Lno_vfp:
+#ifndef ARM_ASSUME_NO_IWMMXT
tst a3, #HWCAP_ARM_IWMMXT
beq .Lno_iwmmxt
@@ -76,23 +84,26 @@ ENTRY (__sigsetjmp)
stcl p1, cr14, [r12], #8
stcl p1, cr15, [r12], #8
.Lno_iwmmxt:
+#endif
/* Make a tail call to __sigjmp_save; it takes the same args. */
B PLTJMP(C_SYMBOL_NAME(__sigjmp_save))
-#ifdef IS_IN_rtld
+#ifdef NEED_HWCAP
+# ifdef IS_IN_rtld
1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8
.Lrtld_local_ro:
.long C_SYMBOL_NAME(_rtld_local_ro)(GOTOFF)
-#else
-#ifdef PIC
+# else
+# ifdef PIC
1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8
.Lrtld_global_ro:
.long C_SYMBOL_NAME(_rtld_global_ro)(GOT)
-#else
+# else
.Lhwcap:
.long C_SYMBOL_NAME(_dl_hwcap)
-#endif
+# endif
+# endif
#endif
END (__sigsetjmp)
-----------------------------------------------------------------------
Summary of changes:
ports/ChangeLog.arm | 7 +++++++
ports/sysdeps/arm/__longjmp.S | 31 +++++++++++++++++++++----------
ports/sysdeps/arm/arm-features.h | 5 +++++
ports/sysdeps/arm/setjmp.S | 31 +++++++++++++++++++++----------
4 files changed, 54 insertions(+), 20 deletions(-)
hooks/post-receive
--
GNU C Library master sources