about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-06-19 06:54:12 +0000
committerRoland McGrath <roland@gnu.org>1996-06-19 06:54:12 +0000
commita1470b6f839addde3f8ee2c29a237aca21e62565 (patch)
treee57a088836e66c6784c7e48cbe01d61621d37f34
parent6990326c21e6d767e3531a00782af1e091eab4fe (diff)
downloadglibc-a1470b6f839addde3f8ee2c29a237aca21e62565.tar.gz
glibc-a1470b6f839addde3f8ee2c29a237aca21e62565.tar.xz
glibc-a1470b6f839addde3f8ee2c29a237aca21e62565.zip
Thu Jun 13 17:25:11 1996 David Mosberger-Tang <davidm@azstarnet.com> cvs/libc-960619
	* sysdeps/generic/memcmp.c: Add prototype decls for internal fns.

	* locale/programs/locale.c: Include string.h.

	* sunrpc/xdr_stdio.c (xdrstdio_getlong), sunrpc/xdr_rec.c
 	(xdrrec_getlong), sunrpc/xdr_mem.c (xdrmem_getlong): Make sure
 	appropriate sign-extension is performed on machines with
 	sizeof(long) > 4.

	* sunrpc/xdr.c (xdr_int, xdr_u_int): If sizeof(long)==8 and
 	sizeof(int)<sizeof(long), we need to go through a temporary
 	variable.

	* locale/programs/ld-numeric.c: Include <alloca.h>

	* libio/stdio.h (__libc_fatal): Add prototype.

	* libio/cleanup.c: Use __P() to declare prototype when __STDC__ is
 	in efect.

	* libio/iopopen.c (read_or_write, parent_end, child_end): Declare
 	volatile to avoid "might get clobbered by longjmp" warning.

	* features.h (__KERNEL_STRICT_NAMES): Define __KERNEL_STRICT_NAMES
 	unless _LOOSE_KERNEL_NAMES is in effect (which, with high
 	probability is a sure loser).
	* sysdeps/unix/sysv/linux/gnu/types.h (__KERNEL_STRICT_NAMES): Remove.

	* sysdeps/unix/bsd/osf/alpha/start.S (errno): Removed.
	* sysdeps/unix/sysv/linux/alpha/start.S: Ditto.

	* misc/paths.h (_PATH_MAN): Change from /usr/share/man to /usr/man
	to be Linux FSSTND compliant.

Mon Jun 10 17:50:31 1996  David Mosberger-Tang  <davidm@azstarnet.com>

	* sysdeps/unix/sysv/linux/alpha/pipe.S: Use PSEUDO.

	* sysdeps/unix/sysv/linux/alpha/sysdep.S,
 	sysdeps/unix/sysv/linux/alpha/brk.S,
 	sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S,
 	sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S,
 	sysdeps/unix/sysv/linux/alpha/llseek.S,
 	sysdeps/unix/sysv/linux/alpha/sigsuspend.S,
 	sysdeps/unix/sysv/linux/alpha/syscall.S: Rename syscall_error to
 	__syscall_error to avoid intruding application name space.

	* sysdeps/unix/sysv/linux/alpha/sysdep.h: Rename __NR_get?id
	to SYS_get?id so that syscall stubs in sysdeps/unix define
	these syscalls in terms of getxpid/getxuid/getxgid.

	* sysdeps/unix/_exit.S, sysdeps/unix/getegid.S,
 	sysdeps/unix/geteuid.S, sysdeps/unix/getppid.S,
 	sysdeps/unix/execve.S, sysdeps/unix/fork.S,
 	sysdeps/unix/syscall.S: Terminate syscall with PSEUDO_END.

	* sysdeps/unix/make-syscalls.sh, sysdeps/unix/sysdep.h
 	(PSEUDO_END): Rename END() to PSEUDO_END().

	* sysdeps/unix/alpha/sysdep.h: Move error-handling code in PSEUDO
 	to PSEUDO_END to improve branch-prediction.  Include .frame
 	directive to make syscalls debugabble.
	(PSEUDO_END): New macro.

	* sysdeps/unix/alpha/sysdep.h, sysdeps/alpha/bb_init_func.S,
 	sysdeps/unix/sysv/linux/alpha/brk.S: Use ldiq instead of ldi since
 	latter is illegal under DEC Unix.

	* sysdeps/unix/alpha/sysdep.S: Renamed from
	sysdeps/unix/sysv/linux/alpha/sysdep.S.  This file works for OSF/1
 	as well.
	* sysdeps/unix/bsd/osf/alpha/sysdep.S: Remove (note that the
 	EWOULDBLOCK -> EAGAIN mapping was unnecessary since
 	EWOULDBLOCK==EAGAIN under DEC Unix and Linux/Alpha).

	* sysdeps/alpha/divrem.h: Use retaddr instead of ra as the return
 	address register in the .frame directive.

	* sysdeps/alpha/copysign.c: Remove.

	* sunrpc/rpc/types.h: Include <sys/param.h> and <netinet/in.h> to
 	avoid RPC definitions of INADDR_LOOPBACK and/or MAXHOSTNAMELEN.

	* errno.h: Move __END_DECLS to correct place to make file
 	compilable under c++.

	* dirent/dirent.h: Document _DIRENT_HAVE_D_OFF macro.  Define
	d_ino only if <direntry.h> hasn't defined d_fileno.

	* configure.in (HAVE_ASM_WEAKEXT_DIRECTIVE): Reverse order of
	arguments to weakext to make .weakext detection work on ECOFF systems.

	* FAQ: Add Linux/Alpha to list of supported platforms.  Mention
	that _validuser() has been replaced by __ivaliduser().

Thu Jun  6 21:39:38 1996  David Mosberger-Tang  <davidm@azstarnet.com>

	* sysdeps/unix/bsd/sun/sunos4/tcsetattr.c (tcsetattr): Declare cmd
 	as unsigned long, not as int (to avoid incorrect int->long
 	promotion).
-rw-r--r--ChangeLog103
-rw-r--r--FAQ7
-rwxr-xr-xconfigure2
-rw-r--r--configure.in2
-rw-r--r--dirent/dirent.h10
-rw-r--r--errno.h7
-rw-r--r--features.h6
-rw-r--r--libio/cleanup.c4
-rw-r--r--libio/iopopen.c4
-rw-r--r--libio/stdio.h2
-rw-r--r--locale/programs/ld-numeric.c1
-rw-r--r--locale/programs/locale.c1
-rw-r--r--mach/Machrules2
-rw-r--r--misc/paths.h2
-rw-r--r--sunrpc/rpc/types.h3
-rw-r--r--sunrpc/xdr.c49
-rw-r--r--sunrpc/xdr_mem.c2
-rw-r--r--sunrpc/xdr_rec.c4
-rw-r--r--sunrpc/xdr_stdio.c2
-rw-r--r--sysdeps/alpha/bb_init_func.S4
-rw-r--r--sysdeps/alpha/copysign.c31
-rw-r--r--sysdeps/alpha/divrem.h2
-rw-r--r--sysdeps/generic/memcmp.c7
-rw-r--r--sysdeps/unix/_exit.S1
-rw-r--r--sysdeps/unix/alpha/sysdep.S (renamed from sysdeps/unix/sysv/linux/alpha/sysdep.S)9
-rw-r--r--sysdeps/unix/alpha/sysdep.h50
-rw-r--r--sysdeps/unix/bsd/osf/alpha/start.S2
-rw-r--r--sysdeps/unix/bsd/osf/alpha/sysdep.S40
-rw-r--r--sysdeps/unix/bsd/sun/sunos4/tcsetattr.c2
-rw-r--r--sysdeps/unix/execve.S1
-rw-r--r--sysdeps/unix/fork.S1
-rw-r--r--sysdeps/unix/getegid.S1
-rw-r--r--sysdeps/unix/geteuid.S1
-rw-r--r--sysdeps/unix/getppid.S1
-rw-r--r--sysdeps/unix/make-syscalls.sh2
-rw-r--r--sysdeps/unix/syscall.S1
-rw-r--r--sysdeps/unix/sysdep.h6
-rw-r--r--sysdeps/unix/sysv/linux/alpha/brk.S4
-rw-r--r--sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S4
-rw-r--r--sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S4
-rw-r--r--sysdeps/unix/sysv/linux/alpha/llseek.S10
-rw-r--r--sysdeps/unix/sysv/linux/alpha/pipe.S16
-rw-r--r--sysdeps/unix/sysv/linux/alpha/sigsuspend.S4
-rw-r--r--sysdeps/unix/sysv/linux/alpha/start.S95
-rw-r--r--sysdeps/unix/sysv/linux/alpha/syscall.S18
-rw-r--r--sysdeps/unix/sysv/linux/alpha/sysdep.h12
-rw-r--r--sysdeps/unix/sysv/linux/gnu/types.h7
47 files changed, 328 insertions, 221 deletions
diff --git a/ChangeLog b/ChangeLog
index 7686cd774e..e16a548046 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -19,6 +19,109 @@ Wed Jun 19 03:24:58 1996  Ulrich Drepper  <drepper@cygnus.com>
 	* locale/setlocale.c (setlocale): Initialize local variables to
 	prevent warnings.
 
+Thu Jun 13 17:25:11 1996  David Mosberger-Tang  <davidm@azstarnet.com>
+
+	* sysdeps/generic/memcmp.c: Add prototype decls for internal fns.
+
+	* locale/programs/locale.c: Include string.h.
+
+	* sunrpc/xdr_stdio.c (xdrstdio_getlong), sunrpc/xdr_rec.c
+ 	(xdrrec_getlong), sunrpc/xdr_mem.c (xdrmem_getlong): Make sure
+ 	appropriate sign-extension is performed on machines with
+ 	sizeof(long) > 4.
+
+	* sunrpc/xdr.c (xdr_int, xdr_u_int): If sizeof(long)==8 and
+ 	sizeof(int)<sizeof(long), we need to go through a temporary
+ 	variable.
+
+	* locale/programs/ld-numeric.c: Include <alloca.h>
+
+	* libio/stdio.h (__libc_fatal): Add prototype.
+
+	* libio/cleanup.c: Use __P() to declare prototype when __STDC__ is
+ 	in efect.
+
+	* libio/iopopen.c (read_or_write, parent_end, child_end): Declare
+ 	volatile to avoid "might get clobbered by longjmp" warning.
+
+	* features.h (__KERNEL_STRICT_NAMES): Define __KERNEL_STRICT_NAMES
+ 	unless _LOOSE_KERNEL_NAMES is in effect (which, with high
+ 	probability is a sure loser).
+	* sysdeps/unix/sysv/linux/gnu/types.h (__KERNEL_STRICT_NAMES): Remove.
+
+	* sysdeps/unix/bsd/osf/alpha/start.S (errno): Removed.
+	* sysdeps/unix/sysv/linux/alpha/start.S: Ditto.
+
+	* misc/paths.h (_PATH_MAN): Change from /usr/share/man to /usr/man
+	to be Linux FSSTND compliant.
+
+Mon Jun 10 17:50:31 1996  David Mosberger-Tang  <davidm@azstarnet.com>
+
+	* sysdeps/unix/sysv/linux/alpha/pipe.S: Use PSEUDO.
+
+	* sysdeps/unix/sysv/linux/alpha/sysdep.S,
+ 	sysdeps/unix/sysv/linux/alpha/brk.S,
+ 	sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S,
+ 	sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S,
+ 	sysdeps/unix/sysv/linux/alpha/llseek.S,
+ 	sysdeps/unix/sysv/linux/alpha/sigsuspend.S,
+ 	sysdeps/unix/sysv/linux/alpha/syscall.S: Rename syscall_error to
+ 	__syscall_error to avoid intruding application name space.
+
+	* sysdeps/unix/sysv/linux/alpha/sysdep.h: Rename __NR_get?id
+	to SYS_get?id so that syscall stubs in sysdeps/unix define
+	these syscalls in terms of getxpid/getxuid/getxgid.
+
+	* sysdeps/unix/_exit.S, sysdeps/unix/getegid.S,
+ 	sysdeps/unix/geteuid.S, sysdeps/unix/getppid.S,
+ 	sysdeps/unix/execve.S, sysdeps/unix/fork.S,
+ 	sysdeps/unix/syscall.S: Terminate syscall with PSEUDO_END.
+
+	* sysdeps/unix/make-syscalls.sh, sysdeps/unix/sysdep.h
+ 	(PSEUDO_END): Rename END() to PSEUDO_END().
+
+	* sysdeps/unix/alpha/sysdep.h: Move error-handling code in PSEUDO
+ 	to PSEUDO_END to improve branch-prediction.  Include .frame
+ 	directive to make syscalls debugabble.
+	(PSEUDO_END): New macro.
+
+	* sysdeps/unix/alpha/sysdep.h, sysdeps/alpha/bb_init_func.S,
+ 	sysdeps/unix/sysv/linux/alpha/brk.S: Use ldiq instead of ldi since
+ 	latter is illegal under DEC Unix.
+
+	* sysdeps/unix/alpha/sysdep.S: Renamed from
+	sysdeps/unix/sysv/linux/alpha/sysdep.S.  This file works for OSF/1
+ 	as well.
+	* sysdeps/unix/bsd/osf/alpha/sysdep.S: Remove (note that the
+ 	EWOULDBLOCK -> EAGAIN mapping was unnecessary since
+ 	EWOULDBLOCK==EAGAIN under DEC Unix and Linux/Alpha).
+
+	* sysdeps/alpha/divrem.h: Use retaddr instead of ra as the return
+ 	address register in the .frame directive.
+
+	* sysdeps/alpha/copysign.c: Remove.
+
+	* sunrpc/rpc/types.h: Include <sys/param.h> and <netinet/in.h> to
+ 	avoid RPC definitions of INADDR_LOOPBACK and/or MAXHOSTNAMELEN.
+
+	* errno.h: Move __END_DECLS to correct place to make file
+ 	compilable under c++.
+
+	* dirent/dirent.h: Document _DIRENT_HAVE_D_OFF macro.  Define
+	d_ino only if <direntry.h> hasn't defined d_fileno.
+
+	* configure.in (HAVE_ASM_WEAKEXT_DIRECTIVE): Reverse order of
+	arguments to weakext to make .weakext detection work on ECOFF systems.
+
+	* FAQ: Add Linux/Alpha to list of supported platforms.  Mention
+	that _validuser() has been replaced by __ivaliduser().
+
+Thu Jun  6 21:39:38 1996  David Mosberger-Tang  <davidm@azstarnet.com>
+
+	* sysdeps/unix/bsd/sun/sunos4/tcsetattr.c (tcsetattr): Declare cmd
+ 	as unsigned long, not as int (to avoid incorrect int->long
+ 	promotion).
+
 Tue Jun 18 17:56:44 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
 
 	* Version 1.91 test release.
diff --git a/FAQ b/FAQ
index 87df40e61f..2714779ae8 100644
--- a/FAQ
+++ b/FAQ
@@ -50,6 +50,7 @@ in the future are:
 
 	*-*-gnu			GNU Hurd
 	i[3456]86-*-linux	Linux-2.0 on Intel
+	alpha-*-linux		Linux on Alpha
 
 Other Linux platforms are also on the way to be supported but I need
 some success reports first.
@@ -214,6 +215,12 @@ incompatibilities:
        init_module	init_module	<sys/module.h>
        syslog		ksyslog_ctl	<sys/klog.h>
 
+* lpd: Older versions of lpd depend on an routine called _validuser().
+  The library does not provide this function, but instead provides
+  __ivaliduser() which has a slightly different interfaces.  Simply
+  upgrading to a newer lpd should fix this problem (e.g., the BSD 4.4
+  lpd is known to be working).
+
 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
 
 
diff --git a/configure b/configure
index 76c58881c9..0b248a4726 100755
--- a/configure
+++ b/configure
@@ -1483,7 +1483,7 @@ else
 ${libc_cv_asm_global_directive} foo
 foo: .long 0
 .weakext foo
-.weakext bar, foo
+.weakext foo, bar
 EOF
   if ${CC-cc} $CFLAGS -c conftest.s 2>/dev/null; then
     libc_cv_asm_weakext_directive=yes
diff --git a/configure.in b/configure.in
index eceb4da989..e8e9121efd 100644
--- a/configure.in
+++ b/configure.in
@@ -455,7 +455,7 @@ cat > conftest.s <<EOF
 ${libc_cv_asm_global_directive} foo
 foo: .long 0
 .weakext foo
-.weakext bar, foo
+.weakext foo, bar
 EOF
   if ${CC-cc} $CFLAGS -c conftest.s 2>/dev/null; then
     libc_cv_asm_weakext_directive=yes
diff --git a/dirent/dirent.h b/dirent/dirent.h
index 19e663bef5..3b708ebc78 100644
--- a/dirent/dirent.h
+++ b/dirent/dirent.h
@@ -35,12 +35,16 @@ __BEGIN_DECLS
    member that gives the length of `d_name'.
 
    It defines the macro `_DIRENT_HAVE_D_RECLEN' iff there is a `d_reclen'
-   member that gives the size of the entire directory entry.  */
+   member that gives the size of the entire directory entry.
+
+   It defines the macro `_DIRENT_HAVE_D_OFF' iff there is a `d_off'
+   member that gives the file offset of the next directory entry.
+ */
 
 #include <direntry.h>
 
-#if defined(__USE_BSD) || defined(__USE_MISC)
-#define	d_ino		d_fileno /* Backward compatibility.  */
+#if (defined(__USE_BSD) || defined(__USE_MISC)) && !defined(d_fileno)
+#define	d_ino		d_fileno		 /* Backward compatibility.  */
 #endif
 
 /* These macros extract size information from a `struct dirent *'.
diff --git a/errno.h b/errno.h
index a9c9acdff2..029d43537f 100644
--- a/errno.h
+++ b/errno.h
@@ -60,10 +60,9 @@ typedef int error_t;
    invoked.  These variables are set up automatically at startup based on
    the value of ARGV[0] (this works only if you use GNU ld).  */
 extern char *program_invocation_name, *program_invocation_short_name;
-#endif	/* Use GNU.  */
-
-#endif	/* errno.h included */
+#endif /* __USE_GNU */
+#endif /* _ERRNO_H */
 
 __END_DECLS
 
-#endif /* errno.h */
+#endif /* errno.h	*/
diff --git a/features.h b/features.h
index 015e230cde..4aee806ba8 100644
--- a/features.h
+++ b/features.h
@@ -66,7 +66,13 @@ Cambridge, MA 02139, USA.  */
 #undef	__USE_GNU
 #undef	__USE_REENTRANT
 #undef	__FAVOR_BSD
+#undef	__KERNEL_STRICT_NAMES
 
+/* Suppress kernel-name space pollution unless user expressedly asks
+   for it: */
+#ifndef _LOOSE_KERNEL_NAMES
+# define __KERNEL_STRICT_NAMES
+#endif
 
 /* Always use ANSI things.  */
 #define	__USE_ANSI	1
diff --git a/libio/cleanup.c b/libio/cleanup.c
index 1f316ebb33..4a068083d0 100644
--- a/libio/cleanup.c
+++ b/libio/cleanup.c
@@ -14,7 +14,7 @@ DEFUN_VOID(_IO_register_cleanup)
   _IO_cleanup_registration_needed = 0;
 }
 
-void (*_IO_cleanup_registration_needed)() = _IO_register_cleanup;
+void (*_IO_cleanup_registration_needed) __P((void)) = _IO_register_cleanup;
 #else
-void (*_IO_cleanup_registration_needed)() = NULL;
+void (*_IO_cleanup_registration_needed) __P((void)) = NULL;
 #endif /* _G_HAVE_ATEXIT */
diff --git a/libio/iopopen.c b/libio/iopopen.c
index b9ee737502..5b9bd4844d 100644
--- a/libio/iopopen.c
+++ b/libio/iopopen.c
@@ -84,9 +84,9 @@ DEFUN(_IO_proc_open, (fp, command, mode),
       _IO_FILE* fp AND const char *command AND const char *mode)
 {
 #if _IO_HAVE_SYS_WAIT
-  int read_or_write;
+  volatile int read_or_write;
+  volatile int parent_end, child_end;
   int pipe_fds[2];
-  int parent_end, child_end;
   _IO_pid_t child_pid;
   if (_IO_file_is_open(fp))
     return NULL;
diff --git a/libio/stdio.h b/libio/stdio.h
index 022d210999..048a11d60c 100644
--- a/libio/stdio.h
+++ b/libio/stdio.h
@@ -145,6 +145,8 @@ extern int ungetc __P ((int c, FILE* fp));
 extern int vfprintf __P ((FILE *fp, char __const *fmt0, _G_va_list));
 extern int vprintf __P ((char __const *fmt, _G_va_list));
 extern int vsprintf __P ((char* string, __const char* format, _G_va_list));
+extern void __libc_fatal __P ((__const char *__message))
+     __attribute__ ((__noreturn__));
 
 #ifndef __STRICT_ANSI__
 extern int dprintf __P ((int, __const char *, ...));
diff --git a/locale/programs/ld-numeric.c b/locale/programs/ld-numeric.c
index dcee7bdb4e..dd5ced7206 100644
--- a/locale/programs/ld-numeric.c
+++ b/locale/programs/ld-numeric.c
@@ -21,6 +21,7 @@ Boston, MA 02111-1307, USA.  */
 # include <config.h>
 #endif
 
+#include <alloca.h>
 #include <langinfo.h>
 #include <string.h>
 
diff --git a/locale/programs/locale.c b/locale/programs/locale.c
index 41c7b1d46e..ef5d9ae825 100644
--- a/locale/programs/locale.c
+++ b/locale/programs/locale.c
@@ -30,6 +30,7 @@ Cambridge, MA 02139, USA.  */
 #include <stdlib.h>
 #include <unistd.h>
 #include <errno.h>
+#include <string.h>
 
 #include "localeinfo.h"
 
diff --git a/mach/Machrules b/mach/Machrules
index 0015e303e1..4bde0fe8b4 100644
--- a/mach/Machrules
+++ b/mach/Machrules
@@ -140,7 +140,7 @@ $(objpfx)%_server.c $(objpfx)%_server.h:
 	$(include-%.defs) | \
 	$(MIG) - /dev/null -prefix _S_ \
 	       $(MIGFLAGS) $(server-MIGFLAGS) $(MIGFLAGS-$*) \
-	       $< -user /dev/null -header /dev/null \
+	       -user /dev/null -header /dev/null \
 	       -server $(@:.h=.c) -sheader $(@:.c=.h)
 
 # To get header files that declare both the straight and __ functions,
diff --git a/misc/paths.h b/misc/paths.h
index 5f7a6b4cd5..00a546feb6 100644
--- a/misc/paths.h
+++ b/misc/paths.h
@@ -50,7 +50,7 @@
 #define	_PATH_DRUM	"/dev/drum"
 #define	_PATH_KMEM	"/dev/kmem"
 #define	_PATH_MAILDIR	"/var/mail"
-#define	_PATH_MAN	"/usr/share/man"
+#define	_PATH_MAN	"/usr/man"
 #define	_PATH_MEM	"/dev/mem"
 #define	_PATH_NOLOGIN	"/etc/nologin"
 #define	_PATH_SENDMAIL	"/usr/sbin/sendmail"
diff --git a/sunrpc/rpc/types.h b/sunrpc/rpc/types.h
index 1f620eff8f..032543f448 100644
--- a/sunrpc/rpc/types.h
+++ b/sunrpc/rpc/types.h
@@ -52,6 +52,9 @@ extern char *malloc();
 #include <sys/types.h>
 #endif
 #include <sys/time.h>
+#include <sys/param.h>
+
+#include <netinet/in.h>
 
 #ifndef INADDR_LOOPBACK
 #define       INADDR_LOOPBACK         (u_long)0x7F000001
diff --git a/sunrpc/xdr.c b/sunrpc/xdr.c
index a79db85b86..fccc2a5fe5 100644
--- a/sunrpc/xdr.c
+++ b/sunrpc/xdr.c
@@ -99,10 +99,30 @@ xdr_int(xdrs, ip)
 	(void) (xdr_short(xdrs, (short *)ip));
 	return (xdr_long(xdrs, (long *)ip));
 #else
-	if (sizeof (int) == 4) {
+	if (sizeof (int) < sizeof (long)) {
+		long l;
+
+		switch (xdrs->x_op) {
+		      case XDR_ENCODE:
+			l = (long) *ip;
+			return XDR_PUTLONG(xdrs, &l);
+
+		      case XDR_DECODE:
+			if (!XDR_GETLONG(xdrs, &l)) {
+				return FALSE;
+			}
+			*ip = (int) l;
+			return TRUE;
+		}
+	} else if (sizeof (int) == sizeof (long)) {
 		return (xdr_long(xdrs, (long *)ip));
-	} else {
+	} else if (sizeof (int) == sizeof (short)) {
 		return (xdr_short(xdrs, (short *)ip));
+	} else {
+		/* force unresolved reference (link-time error): */
+		extern unexpected_sizes_in_xdr_int ();
+
+		unexpected_sizes_in_xdr_int();
 	}
 #endif
 }
@@ -115,15 +135,34 @@ xdr_u_int(xdrs, up)
 	XDR *xdrs;
 	u_int *up;
 {
-
 #ifdef lint
 	(void) (xdr_short(xdrs, (short *)up));
 	return (xdr_u_long(xdrs, (u_long *)up));
 #else
-	if (sizeof (u_int) == 4) {
+	if (sizeof (u_int) < sizeof (u_long)) {
+		u_long l;
+
+		switch (xdrs->x_op) {
+		      case XDR_ENCODE:
+			l = (u_long) *up;
+			return XDR_PUTLONG(xdrs, &l);
+
+		      case XDR_DECODE:
+			if (!XDR_GETLONG(xdrs, &l)) {
+				return FALSE;
+			}
+			*up = (u_int) l;
+			return TRUE;
+		}
+	} else if (sizeof (u_int) == sizeof (u_long)) {
 		return (xdr_u_long(xdrs, (u_long *)up));
-	} else {
+	} else if (sizeof (u_int) == sizeof (u_short)) {
 		return (xdr_short(xdrs, (short *)up));
+	} else {
+		/* force unresolved reference (link-time error): */
+		extern unexpected_sizes_in_xdr_u_int ();
+
+		unexpected_sizes_in_xdr_u_int();
 	}
 #endif
 }
diff --git a/sunrpc/xdr_mem.c b/sunrpc/xdr_mem.c
index fb15f113ce..ac7c9541d0 100644
--- a/sunrpc/xdr_mem.c
+++ b/sunrpc/xdr_mem.c
@@ -99,7 +99,7 @@ xdrmem_getlong(xdrs, lp)
 
 	if ((xdrs->x_handy -= 4) < 0)
 		return (FALSE);
-	*lp = (long)ntohl((u_long)(*((int32_t *)(xdrs->x_private))));
+	*lp = (int32_t) ntohl((*((int32_t *)(xdrs->x_private))));
 	xdrs->x_private += 4;
 	return (TRUE);
 }
diff --git a/sunrpc/xdr_rec.c b/sunrpc/xdr_rec.c
index 45435951d0..974e8295dd 100644
--- a/sunrpc/xdr_rec.c
+++ b/sunrpc/xdr_rec.c
@@ -201,14 +201,14 @@ xdrrec_getlong(xdrs, lp)
 	if (rstrm->fbtbc >= BYTES_PER_XDR_UNIT &&
 	    rstrm->in_boundry - (char *) buflp >= BYTES_PER_XDR_UNIT)
 	{
-		*lp = ntohl(*buflp);
+		*lp = (int32_t) ntohl(*buflp);
 		rstrm->fbtbc -= BYTES_PER_XDR_UNIT;
 		rstrm->in_finger += BYTES_PER_XDR_UNIT;
 	} else {
 		if (! xdrrec_getbytes(xdrs, (caddr_t) &mylong,
 				      BYTES_PER_XDR_UNIT))
 			return FALSE;
-		*lp = ntohl(mylong);
+		*lp = (int32_t) ntohl(mylong);
 	}
 	return TRUE;
 }
diff --git a/sunrpc/xdr_stdio.c b/sunrpc/xdr_stdio.c
index da4877a9e8..5f016993e7 100644
--- a/sunrpc/xdr_stdio.c
+++ b/sunrpc/xdr_stdio.c
@@ -108,7 +108,7 @@ xdrstdio_getlong(xdrs, lp)
 
 	if (fread((caddr_t)&mycopy, 4, 1, (FILE *)xdrs->x_private) != 1)
 		return (FALSE);
-	*(int32_t*)lp = ntohl(mycopy);
+	*lp = (int32_t) ntohl(mycopy);
 	return (TRUE);
 }
 
diff --git a/sysdeps/alpha/bb_init_func.S b/sysdeps/alpha/bb_init_func.S
index dfa8c1d07b..49be0b2bfe 100644
--- a/sysdeps/alpha/bb_init_func.S
+++ b/sysdeps/alpha/bb_init_func.S
@@ -53,11 +53,11 @@ init:
 	br	pv, 1f
 1:	ldgp	gp, 0(pv)
 
-	lda	t1, __bb_head
+	ldiq	t1, __bb_head
 	lda	t3, _gmonparam
 	ldq	t2, 0(t1)
 	ldl	t3, 0(t3)		/* t3 = _gmonparam.state */
-	ldi	t0, 1
+	lda	t0, 1
 	stq	t0, ZERO_WORD(a0)	/* blocks->zero_word = 1 */
 	stq	t2, NEXT(a0)		/* blocks->next = __bb_head */
 	stq	a0, 0(t1)
diff --git a/sysdeps/alpha/copysign.c b/sysdeps/alpha/copysign.c
deleted file mode 100644
index 69544b01fb..0000000000
--- a/sysdeps/alpha/copysign.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Copyright (C) 1992, 1993, 1995 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
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
-
-#define __NO_MATH_INLINES
-
-#include <math.h>
-
-/* Return X with its sign changed to Y's.  */
-__inline double
-__copysign (double __x, double __y)
-{
-  __asm ("cpys %1, %2, %0" : "=f" (__x) : "f" (__y), "f" (__x));
-  return __x;
-}
-
-weak_alias (__copysign, copysign)
diff --git a/sysdeps/alpha/divrem.h b/sysdeps/alpha/divrem.h
index f296179e99..2951335c49 100644
--- a/sysdeps/alpha/divrem.h
+++ b/sysdeps/alpha/divrem.h
@@ -125,7 +125,7 @@ FUNC_NAME:
 	ldq	gp, 0x10(sp)
 	lda	sp, 0x18(sp)
 #endif
-	.frame	sp, FRAME_SIZE, ra, 0
+	.frame	sp, FRAME_SIZE, retaddr, 0
 	lda	sp,-FRAME_SIZE(sp)
 	.prologue 1
 	stq	arg1,0x00(sp)
diff --git a/sysdeps/generic/memcmp.c b/sysdeps/generic/memcmp.c
index 8f5eca0b6b..d9f93bab61 100644
--- a/sysdeps/generic/memcmp.c
+++ b/sysdeps/generic/memcmp.c
@@ -84,6 +84,9 @@ typedef unsigned char byte;
 /* memcmp_bytes -- Compare A and B bytewise in the byte order of the machine.
    A and B are known to be different.
    This is needed only on little-endian machines.  */
+
+static int memcmp_bytes __P((op_t, op_t));
+
 #ifdef  __GNUC__
 __inline
 #endif
@@ -107,6 +110,8 @@ memcmp_bytes (a, b)
 }
 #endif
 
+static int memcmp_common_alignment __P((long, long, size_t));
+
 /* memcmp_common_alignment -- Compare blocks at SRCP1 and SRCP2 with LEN `op_t'
    objects (not LEN bytes!).  Both SRCP1 and SRCP2 should be aligned for
    memory operations on `op_t's.  */
@@ -194,6 +199,8 @@ memcmp_common_alignment (srcp1, srcp2, len)
   return 0;
 }
 
+static int memcmp_not_common_alignment __P((long, long, size_t));
+
 /* memcmp_not_common_alignment -- Compare blocks at SRCP1 and SRCP2 with LEN
    `op_t' objects (not LEN bytes!).  SRCP2 should be aligned for memory
    operations on `op_t', but SRCP1 *should be unaligned*.  */
diff --git a/sysdeps/unix/_exit.S b/sysdeps/unix/_exit.S
index a171689473..50eb687d68 100644
--- a/sysdeps/unix/_exit.S
+++ b/sysdeps/unix/_exit.S
@@ -20,3 +20,4 @@ Cambridge, MA 02139, USA.  */
 
 PSEUDO (_exit, exit, 1)
 	/* Shouldn't get here.  */
+PSEUDO_END(_exit)
diff --git a/sysdeps/unix/sysv/linux/alpha/sysdep.S b/sysdeps/unix/alpha/sysdep.S
index 84582f404e..3e7666ff61 100644
--- a/sysdeps/unix/sysv/linux/alpha/sysdep.S
+++ b/sysdeps/unix/alpha/sysdep.S
@@ -20,7 +20,12 @@ Cambridge, MA 02139, USA.  */
 #define _ERRNO_H
 #include <errnos.h>
 
-LEAF(syscall_error, 0)
+       .comm errno, 4
+#ifdef __ELF__
+       .type errno, @object
+#endif
+
+LEAF(__syscall_error, 0)
 	.prologue 1
 
 	/* Store return value in errno... */
@@ -31,4 +36,4 @@ LEAF(syscall_error, 0)
 	ldi	v0, -1
 	ret
 
-	.end syscall_error
+	END(__syscall_error)
diff --git a/sysdeps/unix/alpha/sysdep.h b/sysdeps/unix/alpha/sysdep.h
index 6fed4a6adf..4b3f9aa5d8 100644
--- a/sysdeps/unix/alpha/sysdep.h
+++ b/sysdeps/unix/alpha/sysdep.h
@@ -58,25 +58,27 @@ Cambridge, MA 02139, USA.  */
   .frame sp, 0, ra
 #endif
 
-/* Note that while it's better structurally, going back to set errno
-   can make things confusing if you're debugging---it looks like it's jumping
-   backwards into the previous fn.  */
+/* Mark the end of function SYM.  */
+#undef END
+#define END(sym)	.end sym
+
+/* Note that PSEUDO/PSEUDO_END use label number 1996---do not use a
+   label of that number between those two macros!  */
+ 
 #ifdef __STDC__
 #define PSEUDO(name, syscall_name, args)	\
     .globl name;				\
     .align 3;					\
     .ent name,0;				\
 						\
-1:  br		gp, 2f;				\
-2:  ldgp	gp, 0(gp);			\
-    jmp		zero, syscall_error;		\
-						\
 name##:						\
-    ldi		v0, SYS_ify(syscall_name);	\
+    .frame sp, 0, ra				\
+    .prologue 1; /* yes, we do use gp */	\
+    ldiq	v0, SYS_ify(syscall_name);	\
     .set noat;					\
     call_pal	PAL_callsys;			\
     .set at;					\
-    bne		a3, 1b;				\
+    bne		a3, 1996f;			\
 3:
 #else
 #define PSEUDO(name, syscall_name, args)	\
@@ -84,21 +86,35 @@ name##:						\
     .align 3;					\
     .ent name,0;				\
 						\
-1:  br		gp, 2f;				\
-2:  ldgp	gp, 0(gp);			\
-    jmp		zero, syscall_error;		\
-						\
 name/**/:					\
-    ldi		v0, SYS_ify(syscall_name);	\
+    .frame sp, 0, ra				\
+    .prologue 1; /* yes, we do use gp */	\
+    ldiq	v0, SYS_ify(syscall_name);	\
     .set noat;					\
     call_pal	PAL_callsys;			\
     .set at;					\
-    bne		a3, 1b;				\
+    bne		a3, 1996f;			\
 3:
 #endif
 
-#undef END
-#define END(sym)	.end sym
+#undef PSEUDO_END
+
+#ifdef PIC
+/* When building a shared library, we can use a branch since the text
+   section of the library is much smaller than 4MB.  If we ever break
+   this assumption, the linker will tell us.  */
+# define PSEUDO_END(sym)			\
+1996:						\
+    br		zero, __syscall_error;		\
+    END(sym)
+#else
+# define PSEUDO_END(sym)			\
+1996:						\
+    br		gp, 2f;				\
+2:  ldgp	gp, 0(gp);			\
+    jmp		zero, __syscall_error;		\
+    END(sym)
+#endif
 
 #define r0	v0
 #define r1	a4
diff --git a/sysdeps/unix/bsd/osf/alpha/start.S b/sysdeps/unix/bsd/osf/alpha/start.S
index f3995a2fd6..d5ff14055b 100644
--- a/sysdeps/unix/bsd/osf/alpha/start.S
+++ b/sysdeps/unix/bsd/osf/alpha/start.S
@@ -18,8 +18,6 @@ Cambridge, MA 02139, USA.  */
 
 #include <sysdep.h>
 
-.comm errno,		4
-
 #if 0
 .sdata
 .globl STARTFRM
diff --git a/sysdeps/unix/bsd/osf/alpha/sysdep.S b/sysdeps/unix/bsd/osf/alpha/sysdep.S
deleted file mode 100644
index bc4865cef2..0000000000
--- a/sysdeps/unix/bsd/osf/alpha/sysdep.S
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Copyright (C) 1993 Free Software Foundation, Inc.
-   Contributed by Brendan Kehoe (brendan@zen.org).
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
-
-#include <sysdep.h>
-#define _ERRNO_H
-#include <errnos.h>
-
-ENTRY(syscall_error)
-#ifdef EWOULDBLOCK_sys
-	/* We translate the system's EWOULDBLOCK error into EAGAIN.
-	   The GNU C library always defines EWOULDBLOCK==EAGAIN.
-	   EWOULDBLOCK_sys is the original number.  */
-	subq v0, EWOULDBLOCK_sys, t0
-	cmoveq t0, EAGAIN, v0
-#endif
-
-	/* Store it in errno... */
-!	ldgp gp, 0(t12)
-	stl v0, errno
-
-	/* And just kick back a -1.  */
-	ldil v0, -1
-	ret
-
-	.end syscall_error
diff --git a/sysdeps/unix/bsd/sun/sunos4/tcsetattr.c b/sysdeps/unix/bsd/sun/sunos4/tcsetattr.c
index 4ae139a1f8..f88951ff9d 100644
--- a/sysdeps/unix/bsd/sun/sunos4/tcsetattr.c
+++ b/sysdeps/unix/bsd/sun/sunos4/tcsetattr.c
@@ -27,7 +27,7 @@ int
 DEFUN(tcsetattr, (fd, optional_actions, termios_p),
       int fd AND int optional_actions AND CONST struct termios *termios_p)
 {
-  int cmd;
+  unsigned long cmd;
 
   switch (optional_actions)
     {
diff --git a/sysdeps/unix/execve.S b/sysdeps/unix/execve.S
index 7a4fc139ec..5d48bc63d8 100644
--- a/sysdeps/unix/execve.S
+++ b/sysdeps/unix/execve.S
@@ -28,5 +28,6 @@ Cambridge, MA 02139, USA.  */
 
 SYSCALL__ (execve, 3)
 	ret
+PSEUDO_END(execve)
 
 weak_alias (__execve, execve)
diff --git a/sysdeps/unix/fork.S b/sysdeps/unix/fork.S
index 1c360c6ed2..b8b99720b1 100644
--- a/sysdeps/unix/fork.S
+++ b/sysdeps/unix/fork.S
@@ -28,5 +28,6 @@ SYSCALL__ (fork, 0)
 	subl #1, r1
 	andl r1, r0
 	ret
+PSEUDO_END(fork)
 
 weak_alias (__fork, fork)
diff --git a/sysdeps/unix/getegid.S b/sysdeps/unix/getegid.S
index 1bd447b623..aff66bb555 100644
--- a/sysdeps/unix/getegid.S
+++ b/sysdeps/unix/getegid.S
@@ -25,5 +25,6 @@ PSEUDO (__getegid, getgid, 0)
 	MOVE(r1, r0)
 #endif
 	ret
+PSEUDO_END(__getegid)
 
 weak_alias (__getegid, getegid)
diff --git a/sysdeps/unix/geteuid.S b/sysdeps/unix/geteuid.S
index 339eb536f5..db4087f831 100644
--- a/sysdeps/unix/geteuid.S
+++ b/sysdeps/unix/geteuid.S
@@ -25,5 +25,6 @@ PSEUDO (__geteuid, getuid, 0)
 	MOVE(r1, r0)
 #endif
 	ret
+PSEUDO_END(__geteuid)
 
 weak_alias (__geteuid, geteuid)
diff --git a/sysdeps/unix/getppid.S b/sysdeps/unix/getppid.S
index 132c3740a0..3f0c7456b5 100644
--- a/sysdeps/unix/getppid.S
+++ b/sysdeps/unix/getppid.S
@@ -25,5 +25,6 @@ PSEUDO (__getppid, getpid, 0)
 	MOVE(r1, r0)
 #endif
 	ret
+PSEUDO_END(__getppid)
 
 weak_alias (__getppid, getppid)
diff --git a/sysdeps/unix/make-syscalls.sh b/sysdeps/unix/make-syscalls.sh
index 5251e84cb9..260769ed7b 100644
--- a/sysdeps/unix/make-syscalls.sh
+++ b/sysdeps/unix/make-syscalls.sh
@@ -62,7 +62,7 @@ EOF
 	(echo '#include <sysdep.h>'; \\
 	 echo 'PSEUDO ($strong, $syscall, $nargs)'; \\
 	 echo '	ret'; \\
-	 echo 'END($strong)'; \\"
+	 echo 'PSEUDO_END($strong)'; \\"
 
   # Append any weak aliases defined for this syscall function.
   for name in $weak; do
diff --git a/sysdeps/unix/syscall.S b/sysdeps/unix/syscall.S
index e3ef1775dc..d3f13dcc4f 100644
--- a/sysdeps/unix/syscall.S
+++ b/sysdeps/unix/syscall.S
@@ -27,3 +27,4 @@ Cambridge, MA 02139, USA.  */
 
 SYSCALL (syscall, 1)
 	ret
+PSEUDO_END(syscall)
diff --git a/sysdeps/unix/sysdep.h b/sysdeps/unix/sysdep.h
index 0dde0b04a6..24be0063e0 100644
--- a/sysdeps/unix/sysdep.h
+++ b/sysdeps/unix/sysdep.h
@@ -55,6 +55,6 @@ Cambridge, MA 02139, USA.  */
 #define SYS_ify(syscall_name) SYS_/**/syscall_name
 #endif
 
-/* Terminate a function named SYM.  This is used on some platforms to
-   generate correct debugging information.  */
-#define END(sym)
+/* Terminate a system call named SYM.  This is used on some platforms
+   to generate correct debugging information.  */
+#define PSEUDO_END(sym)
diff --git a/sysdeps/unix/sysv/linux/alpha/brk.S b/sysdeps/unix/sysv/linux/alpha/brk.S
index 1c4a4f9217..26bf97f2bd 100644
--- a/sysdeps/unix/sysv/linux/alpha/brk.S
+++ b/sysdeps/unix/sysv/linux/alpha/brk.S
@@ -30,7 +30,7 @@ LEAF(__brk, 0)
 	ldgp	gp, 0(t12)
 	.prologue 1
 
-	ldi	v0, __NR_brk
+	ldiq	v0, __NR_brk
 	call_pal PAL_callsys
 
 	/* Correctly handle the brk(0) query case.  */
@@ -46,7 +46,7 @@ LEAF(__brk, 0)
 
 	/* What a horrible way to die.  */
 error:	ldi	v0, ENOMEM
-	jmp	zero, syscall_error
+	jmp	zero, __syscall_error
 
 	END(__brk)
 
diff --git a/sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S b/sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S
index 52c945aec2..e09fa738e2 100644
--- a/sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S
+++ b/sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S
@@ -24,7 +24,7 @@ Cambridge, MA 02139, USA.  */
 
 LEAF(__ieee_get_fp_control, 8)
 	lda	sp, -8(sp)
-	.prologue 0
+	.prologue 1
 
 	mov	sp, a1
 	ldi	a0, GSI_IEEE_FP_CONTROL
@@ -39,7 +39,7 @@ LEAF(__ieee_get_fp_control, 8)
 error:	lda	sp, 8(sp)
 	br	gp, 1f
 1:	ldgp	gp, 0(gp)
-	jmp	zero, syscall_error
+	jmp	zero, __syscall_error
 
 	END(__ieee_get_fp_control)
 
diff --git a/sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S b/sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S
index d72585daf1..d748c81142 100644
--- a/sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S
+++ b/sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S
@@ -22,7 +22,7 @@ Cambridge, MA 02139, USA.  */
 
 LEAF(__ieee_set_fp_control, 8)
 	lda	sp, -8(sp)
-	.prologue 0
+	.prologue 1
 
 	stq	a0, 0(sp)
 	mov	sp, a1
@@ -37,7 +37,7 @@ LEAF(__ieee_set_fp_control, 8)
 
 error:	br	gp, 1f
 1:	ldgp	gp, 0(gp)
-	jmp	zero, syscall_error
+	jmp	zero, __syscall_error
 
 	END(__ieee_set_fp_control)
 
diff --git a/sysdeps/unix/sysv/linux/alpha/llseek.S b/sysdeps/unix/sysv/linux/alpha/llseek.S
index bd8c6595c9..6020f263cd 100644
--- a/sysdeps/unix/sysv/linux/alpha/llseek.S
+++ b/sysdeps/unix/sysv/linux/alpha/llseek.S
@@ -18,19 +18,17 @@ Cambridge, MA 02139, USA.  */
 
 /* For compatibility only: a "long" is 64 bits on the Alpha, so
    llseek() isn't really needed.  But there are some programs out
-   there who may depend on it being around. 
-*/
+   there who may depend on it being around.  */
 
 #include <sysdep.h>
 
 	.text
 ENTRY(llseek)
-	.prologue 0
-
-	mov	a3, t0		/* save result address */
+	.prologue 1
 
 	sll	a1, 32, a1	/* build a 64 bit ofs out of 32 bit operands */
 	zap	a2, 0xf0, a2
+	mov	a3, t0		/* save result address */
 	bis	a2, a1, a1
 
 	mov	a4, a2		/* shift down whence */
@@ -44,6 +42,6 @@ ENTRY(llseek)
 
 error:	br	gp, 1f
 1:	ldgp	gp, 0(gp)
-	jmp	zero, syscall_error
+	jmp	zero, __syscall_error
 
 	END(llseek)
diff --git a/sysdeps/unix/sysv/linux/alpha/pipe.S b/sysdeps/unix/sysv/linux/alpha/pipe.S
index b23803cecd..60334adb45 100644
--- a/sysdeps/unix/sysv/linux/alpha/pipe.S
+++ b/sysdeps/unix/sysv/linux/alpha/pipe.S
@@ -20,23 +20,11 @@ Cambridge, MA 02139, USA.  */
 
 #include <sysdep.h>
 
-	.text
-LEAF(__pipe, 0)
-	.prologue 0
-
-	ldi	v0, __NR_pipe
-	call_pal PAL_callsys
-	bne	a3, error
-
+PSEUDO (__pipe, pipe, 0)
 	stl	r0, 0(a0)
 	stl	r1, 4(a0)
 	mov	zero, v0
 	ret
-
-error:	br	gp, 1f
-1:	ldgp	gp, 0(gp)
-	jmp	zero, syscall_error
-
-	END(__pipe)
+PSEUDO_END(__pipe)
 
 weak_alias (__pipe, pipe)
diff --git a/sysdeps/unix/sysv/linux/alpha/sigsuspend.S b/sysdeps/unix/sysv/linux/alpha/sigsuspend.S
index 26a1869783..aaae9a308a 100644
--- a/sysdeps/unix/sysv/linux/alpha/sigsuspend.S
+++ b/sysdeps/unix/sysv/linux/alpha/sigsuspend.S
@@ -24,7 +24,7 @@ Cambridge, MA 02139, USA.  */
 	.text
 
 LEAF(sigsuspend, 0)
-	.prologue 0
+	.prologue 1
 
 	ldq	a0, 0(a0)
 	ldi	v0, __NR_sigsuspend
@@ -34,6 +34,6 @@ LEAF(sigsuspend, 0)
 
 error:	br	gp, 1f
 1:	ldgp	gp, 0(gp)
-	jmp	zero, syscall_error
+	jmp	zero, __syscall_error
 
 	END(sigsuspend)
diff --git a/sysdeps/unix/sysv/linux/alpha/start.S b/sysdeps/unix/sysv/linux/alpha/start.S
index a7099f6840..bffa913538 100644
--- a/sysdeps/unix/sysv/linux/alpha/start.S
+++ b/sysdeps/unix/sysv/linux/alpha/start.S
@@ -1,5 +1,5 @@
 /* Copyright (C) 1993, 1995, 1996 Free Software Foundation, Inc.
-   Contributed by Brendan Kehoe (brendan@zen.org).
+   Contributed by Richard Henderson <rth@tamu.edu>
 
 The GNU C Library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Library General Public License as
@@ -18,81 +18,76 @@ Cambridge, MA 02139, USA.  */
 
 #include <sysdep.h>
 
-	.comm errno, 4
-#ifdef __ELF__
-	.type errno, @object
-#endif
-
 	.text
-LEAF(__start, 16)
-	lda	sp, -16(sp)
-	.prologue 0
-
-	stq	zero, 8(sp)		/* terminate frame chain */
-
-	br	t0, 1f
-1:	ldgp	gp, 0(t0)
-
-	mov	zero, a0		/* establish __fpu_control w/kernel */
-	jsr	ra, __setfpucw
+	.globl __start
+	.align 3
+	.ent __start, 0
+__start:
+	.frame fp, 0, zero
+	mov	zero, fp
+	br	gp, 1f
+1:	ldgp	gp, 0(gp)
+	.prologue 1
+
+  /* Save v0.  When starting a binary via the dynamic linker, s0
+     contains the address of the shared library termination function,
+     which we will register below with atexit() to be called by exit().
+     If we are statically linked, this will be NULL.  */
+	mov	v0, s0
+
+  /* Do essential libc initialization (sp points to argc, argv, and envp)  */
+	jsr	ra, __libc_init_first
 	ldgp	gp, 0(ra)
 
-	/* clear out errno. */
-	stl	zero, (errno)
+  /* Now that we have the proper stack frame, register library termination
+     function, if there is any:  */
 
-	ldl	a0, 16(sp)	/* get argc */
-	lda	a1, 24(sp)	/* get argv */
+	beq	s0, 1f
+	mov	s0, a0
+	jsr	ra, atexit
+	ldgp	gp, 0(ra)
+1:
 
-	/* initialize environ: */
-	lda	t0, environ
-	s8addq	a0, a1, a2
-	addq	a2, 0x8, a2
-	stq	a2, 0(t0)
+  /* Extract the arguments and environment as encoded on the stack.  */
+	ldl	a0, 0(sp)	/* get argc */
+	lda	a1, 8(sp)	/* get argv */
+	s8addq	a0, a1, a2	/* get envp */
+	addq	a2, 8, a2
+	stq	a2, _environ
 
-	mov	a0, s0
+	mov	a0, s0		/* tuck them away */
 	mov	a1, s1
 	mov	a2, s2
 
 #ifdef HAVE_INITFINI
-	/* register the _fini sections to ensure destructors get run: */
-	lda	a0, _fini
-	jsr	ra, atexit
-	ldgp	gp, 0(ra)
-
-	/* Now run the _init section of the program itself.  The _init
-	   sections of shared libraries will be run by the dynamic linker.  */
+  /* Call _init, the entry point to our own .init section.  */
 	jsr	ra, _init
 	ldgp	gp, 0(ra)
 
-	/* initialize constructors: */
-	jsr	ra, __main
+  /* Register our .fini section with atexit.  */
+	lda	a0, _fini
+	jsr	ra, atexit
 	ldgp	gp, 0(ra)
 #else
-	jsr	ra, __libc_init
+  /* initialize constructors: */
+	jsr	ra, __main
 	ldgp	gp, 0(ra)
 #endif
-
 	mov	s0, a0
 	mov	s1, a1
 	mov	s2, a2
 
+  /* Call the user's main and exit with its return value.  */
 	jsr	ra, main
 	ldgp	gp, 0(ra)
 
 	mov	v0, a0
+	jsr	ra, exit
 
-	lda	pv, exit
-	jsr	ra, (pv), 1
-	ldgp	gp, 0(ra)
-
-	/* in case exit returns: */
-
-1:	ldi	v0, __NR_exit
-	call_pal PAL_callsys
-	br	1b
-
-	.end __start
-
+  /* Die very horribly if exit returns.  Call_pal hlt is callable from
+     kernel mode only; this will result in an illegal instruction trap.  */
+	call_pal 0
+END(__start)
 
 /* Define a symbol for the first piece of initialized data.  */
 	.data
diff --git a/sysdeps/unix/sysv/linux/alpha/syscall.S b/sysdeps/unix/sysv/linux/alpha/syscall.S
index c80a523239..f1b36e9312 100644
--- a/sysdeps/unix/sysv/linux/alpha/syscall.S
+++ b/sysdeps/unix/sysv/linux/alpha/syscall.S
@@ -42,19 +42,19 @@ Cambridge, MA 02139, USA.  */
 
 
 LEAF(__syscall, 0)
-	bis	a0, a0, v0	# Syscall number -> v0
-	bis	a1, a1, a0	# arg1-arg5 -> a0-a4
-	bis	a2, a2, a1
-	bis	a3, a3, a2
-	bis	a4, a4, a3
-	bis	a5, a5, a4
-
-	call_pal PAL_callsys	# Invoke system call
+	mov	a0, v0		/* Syscall number -> v0 */
+	mov	a1, a0		/* arg1-arg5 -> a0-a4 */
+	mov	a2, a1
+	mov	a3, a2
+	mov	a4, a3
+	mov	a5, a4
+
+	call_pal PAL_callsys	/* Invoke system call */
 	bne	a3, error
 	ret
 
 error:	br	gp, 2f
 2:	ldgp	gp, 0(gp)
-	jmp	zero, syscall_error
+	jmp	zero, __syscall_error
 
 weak_alias(__syscall, syscall)
diff --git a/sysdeps/unix/sysv/linux/alpha/sysdep.h b/sysdeps/unix/sysv/linux/alpha/sysdep.h
index 627b37e4fb..8f5f5dde61 100644
--- a/sysdeps/unix/sysv/linux/alpha/sysdep.h
+++ b/sysdeps/unix/sysv/linux/alpha/sysdep.h
@@ -38,15 +38,15 @@ Cambridge, MA 02139, USA.  */
 # define SYS_ify(syscall_name)	__NR_/**/syscall_name
 #endif
 
-/*
- * Define some aliases for syscalls that return two values (in r0 and r1):
- */
+/* Define some aliases to make automatic syscall generation work
+   properly.  The SYS_* variants are for the benefit of the files in
+   sysdeps/unix.  */
 #define __NR_getpid	__NR_getxpid
-#define __NR_getppid	__NR_getxpid
 #define __NR_getuid	__NR_getxuid
-#define __NR_geteuid	__NR_getxuid
 #define __NR_getgid	__NR_getxgid
-#define __NR_getegid	__NR_getxgid
+#define SYS_getpid	__NR_getxpid
+#define SYS_getuid	__NR_getxuid
+#define SYS_getgid	__NR_getxgid
 
 /*
  * Some syscalls no Linux program should know about:
diff --git a/sysdeps/unix/sysv/linux/gnu/types.h b/sysdeps/unix/sysv/linux/gnu/types.h
index 402df2aa4c..0bc072b092 100644
--- a/sysdeps/unix/sysv/linux/gnu/types.h
+++ b/sysdeps/unix/sysv/linux/gnu/types.h
@@ -19,10 +19,9 @@ Cambridge, MA 02139, USA.  */
 #ifndef	_GNU_TYPES_H
 #define	_GNU_TYPES_H	1
 
-/* Get actual type definitions for architecture from kernel headers.
-   This #define tells <linux/types.h> not to define `dev_t' et al itself.  */
-#define __KERNEL_STRICT_NAMES
-#define _LINUX_TYPES_DONT_EXPORT
+#include <features.h>
+
+/* Get actual type definitions for architecture from kernel headers.  */
 #include <linux/types.h>
 
 /* Convenience types.  */