aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/alpha
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/alpha')
-rw-r--r--sysdeps/unix/alpha/sysdep.S42
1 files changed, 36 insertions, 6 deletions
diff --git a/sysdeps/unix/alpha/sysdep.S b/sysdeps/unix/alpha/sysdep.S
index c31508b..ce848f4 100644
--- a/sysdeps/unix/alpha/sysdep.S
+++ b/sysdeps/unix/alpha/sysdep.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1996, 1998, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1996, 1998, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Brendan Kehoe (brendan@zen.org).
@@ -35,9 +35,26 @@
have we loaded PV with our address. Do both. */
# define LOADGP br pv, 1f; 1: ldgp gp, 0(pv)
# define PROLOGUE .prologue 0
+# define EPILOGUE
#else
-# define LOADGP ldgp gp, 0(pv)
+ /* When building the static library, we tail call here from
+ elsewhere, which might use a different GP. The entertaining
+ part is that we have to return with the GP of our caller
+ in place, so that linker relaxation works properly. */
+ /* ??? This is so ugly. Consider always putting the errno
+ setting code with the syscall in the static case. */
+# define GPSAVEREG t10
+# define LOADGP ldah t11, 0(pv) !gpdisp!1; \
+ br 1f; \
+ .subsection 2; \
+ 1: mov gp, GPSAVEREG; \
+ lda gp, 0(t11) !gpdisp!1; \
+ br 2f; \
+ .previous; \
+ mov gp, GPSAVEREG; \
+ 2:
# define PROLOGUE .prologue 1
+# define EPILOGUE mov GPSAVEREG, gp
#endif
.align 4
@@ -61,16 +78,20 @@ __syscall_error:
addq v0, t1, v0
stl t0, 0(v0)
lda v0, -1
+ EPILOGUE
ret
#elif defined(_LIBC_REENTRANT)
LOADGP
- lda sp, -16(sp)
- .frame sp, 16, ra, 0
+ lda sp, -32(sp)
+ .frame sp, 32, ra, 0
stq ra, 0(sp)
stq v0, 8(sp)
- .mask 0x4000001, -16
+#ifdef GPSAVEREG
+ stq GPSAVEREG, 16(sp)
+#endif
+ .mask 0x4000001, -32
PROLOGUE
/* Find our per-thread errno address */
@@ -78,6 +99,9 @@ __syscall_error:
bsr ra, __errno_location !samegp
#else
jsr ra, __errno_location
+#ifndef GPSAVEREG
+ ldgp gp, 0(ra)
+#endif
#endif
/* Store the error value. */
@@ -87,8 +111,12 @@ __syscall_error:
/* And kick back a -1. */
ldi v0, -1
+#ifdef GPSAVEREG
+ ldq GPSAVEREG, 16(sp)
+#endif
ldq ra, 0(sp)
- lda sp, 16(sp)
+ lda sp, 32(sp)
+ EPILOGUE
ret
#else
@@ -97,8 +125,10 @@ __syscall_error:
PROLOGUE
stl v0, errno
lda v0, -1
+ EPILOGUE
ret
#endif
+ .subsection 3
.end __syscall_error