about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rwxr-xr-xconfigure1
-rw-r--r--configure.in1
-rw-r--r--sysdeps/alpha/dl-machine.h3
-rw-r--r--sysdeps/alpha/elf/start.S7
-rw-r--r--sysdeps/generic/sysdep.h38
-rw-r--r--sysdeps/unix/sysv/linux/alpha/clone.S3
-rw-r--r--sysdeps/unix/sysv/linux/alpha/rt_sigaction.S91
8 files changed, 115 insertions, 38 deletions
diff --git a/ChangeLog b/ChangeLog
index 6896c24d8e..4cc5d6f0fb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2003-06-04  Richard Henderson  <rth@redhat.com>
 
+        * sysdeps/alpha/dl-machine.h (RTLD_START): Fix top-of-stack backtrace.
+        * sysdeps/unix/sysv/linux/alpha/clone.S: Likewise.
+        * sysdeps/alpha/elf/start.S: Likewise.  Remove pointless allocation.
+        * sysdeps/unix/sysv/linux/alpha/rt_sigaction.S: Use standard ldgp
+        entry sequence and explicit relocs.  Add unwind info for sigreturn
+        and rt_sigreturn.
+        * configure.in (libc_cv_asm_cfi_directives): Test .cfi_remember_state.
+        * configure: Regenerate.
+
         * sysdeps/unix/sysv/linux/alpha/syscalls.list (semtimedop): New.
         Annotate some parameters.
         * sysdeps/unix/sysv/linux/alpha/sysdep.h (__NR_semtimedop): New.
diff --git a/configure b/configure
index 3c95ce6254..f9036d668c 100755
--- a/configure
+++ b/configure
@@ -5736,6 +5736,7 @@ else
         .type   func,@function
 func:
         .cfi_startproc
+	.cfi_remember_state
         .cfi_endproc
 EOF
 if { ac_try='${CC-cc} $ASFLAGS -c conftest.s 1>&5'
diff --git a/configure.in b/configure.in
index d241dada60..8ad2dd84e1 100644
--- a/configure.in
+++ b/configure.in
@@ -1529,6 +1529,7 @@ cat > conftest.s <<EOF
         .type   func,@function
 func:
         .cfi_startproc
+	.cfi_remember_state
         .cfi_endproc
 EOF
 if AC_TRY_COMMAND(${CC-cc} $ASFLAGS -c conftest.s 1>&AS_MESSAGE_LOG_FD); then
diff --git a/sysdeps/alpha/dl-machine.h b/sysdeps/alpha/dl-machine.h
index 4704428d93..0101ba43d5 100644
--- a/sysdeps/alpha/dl-machine.h
+++ b/sysdeps/alpha/dl-machine.h
@@ -303,6 +303,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
 	.globl _start						\n\
 	.ent _start						\n\
 _start:								\n\
+	.frame $31,0,$31,0					\n\
 	br	$gp, 0f						\n\
 0:	ldgp	$gp, 0($gp)					\n\
 	.prologue 0						\n\
@@ -314,7 +315,7 @@ _start:								\n\
 	.globl _dl_start_user					\n\
 	.ent _dl_start_user					\n\
 _dl_start_user:							\n\
-	.frame $30,0,$31,0					\n\
+	.frame $31,0,$31,0					\n\
 	.prologue 0						\n\
 	/* Save the user entry point address in s0.  */		\n\
 	mov	$0, $9						\n\
diff --git a/sysdeps/alpha/elf/start.S b/sysdeps/alpha/elf/start.S
index 3f98111fd9..dbe4223fea 100644
--- a/sysdeps/alpha/elf/start.S
+++ b/sysdeps/alpha/elf/start.S
@@ -1,5 +1,6 @@
 /* Startup code for Alpha/ELF.
-   Copyright (C) 1993,1995,1996,1997,1998,2000,2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1993, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson <rth@tamu.edu>
 
@@ -26,8 +27,7 @@
 	.ent _start, 0
 	.type _start,@function
 _start:
-	.frame fp, 0, zero
-	mov	zero, fp
+	.frame	$31, 0, $31
 	br	gp, 1f
 1:	ldgp	gp, 0(gp)
 	subq	sp, 16, sp
@@ -65,6 +65,5 @@ weak_alias(_start, __start)
 	.data
 	.globl __data_start
 __data_start:
-	.long 0
 	.weak data_start
 	data_start = __data_start
diff --git a/sysdeps/generic/sysdep.h b/sysdeps/generic/sysdep.h
index 0feed3c4a8..687f5f46cd 100644
--- a/sysdeps/generic/sysdep.h
+++ b/sysdeps/generic/sysdep.h
@@ -49,13 +49,19 @@
 
 /* Makros to generate eh_frame unwind information.  */
 # ifdef HAVE_ASM_CFI_DIRECTIVES
-#  define cfi_startproc	.cfi_startproc
-#  define cfi_endproc	.cfi_endproc
-#  define cfi_def_cfa(reg, off)	.cfi_def_cfa reg, off
+#  define cfi_startproc			.cfi_startproc
+#  define cfi_endproc			.cfi_endproc
+#  define cfi_def_cfa(reg, off)		.cfi_def_cfa reg, off
 #  define cfi_def_cfa_register(reg)	.cfi_def_cfa_register reg
 #  define cfi_def_cfa_offset(off)	.cfi_def_cfa_offset off
 #  define cfi_adjust_cfa_offset(off)	.cfi_adjust_cfa_offset off
-#  define cfi_offset(reg, off)	.cfi_offset reg, off
+#  define cfi_offset(reg, off)		.cfi_offset reg, off
+#  define cfi_register(r1, r2)		.cfi_register r1, r2
+#  define cfi_return_column(reg)	.cfi_return_column reg
+#  define cfi_restore(reg)		.cfi_restore reg
+#  define cfi_undefined(reg)		.cfi_undefined reg
+#  define cfi_remember_state		.cfi_remember_state
+#  define cfi_restore_state		.cfi_restore_state
 # else
 #  define cfi_startproc
 #  define cfi_endproc
@@ -64,6 +70,12 @@
 #  define cfi_def_cfa_offset(off)
 #  define cfi_adjust_cfa_offset(off)
 #  define cfi_offset(reg, off)
+#  define cfi_register(r1, r2)
+#  define cfi_return_column(reg)
+#  define cfi_restore(reg)
+#  define cfi_undefined(reg)
+#  define cfi_remember_state
+#  define cfi_restore_state
 # endif
 
 #else /* ! ASSEMBLER */
@@ -82,6 +94,18 @@
    ".cfi_adjust_cfa_offset " CFI_STRINGIFY(off)
 #  define CFI_OFFSET(reg, off) \
    ".cfi_offset " CFI_STRINGIFY(reg) "," CFI_STRINGIFY(off)
+#  define CFI_REGISTER(r1, r2) \
+   ".cfi_register " CFI_STRINGIFY(r1) "," CFI_STRINGIFY(r2)
+#  define CFI_RETURN_COLUMN(reg) \
+   ".cfi_return_column " CFI_STRINGIFY(reg)
+#  define CFI_RESTORE(reg) \
+   ".cfi_restore " CFI_STRINGIFY(reg)
+#  define CFI_UNDEFINED(reg) \
+   ".cfi_undefined " CFI_STRINGIFY(reg)
+#  define CFI_REMEMBER_STATE \
+   ".cfi_remember_state"
+#  define CFI_RESTORE_STATE \
+   ".cfi_restore_state"
 # else
 #  define CFI_STARTPROC
 #  define CFI_ENDPROC
@@ -90,6 +114,12 @@
 #  define CFI_DEF_CFA_OFFSET(off)
 #  define CFI_ADJUST_CFA_OFFSET(off)
 #  define CFI_OFFSET(reg, off)
+#  define CFI_REGISTER(r1, r2)
+#  define CFI_RETURN_COLUMN(reg)
+#  define CFI_RESTORE(reg)
+#  define CFI_UNDEFINED(reg)
+#  define CFI_REMEMBER_STATE
+#  define CFI_RESTORE_STATE
 # endif
 
 #endif /* __ASSEMBLER__ */
diff --git a/sysdeps/unix/sysv/linux/alpha/clone.S b/sysdeps/unix/sysv/linux/alpha/clone.S
index 42df98a9b4..2aa9bb7f38 100644
--- a/sysdeps/unix/sysv/linux/alpha/clone.S
+++ b/sysdeps/unix/sysv/linux/alpha/clone.S
@@ -83,8 +83,7 @@ $error:
 
 	.ent thread_start
 thread_start:
-	.frame fp,0,zero,0
-	mov	zero,fp
+	.frame	zero,0,zero,0
 	.prologue 0
 
 	/* Load up the arguments.  */
diff --git a/sysdeps/unix/sysv/linux/alpha/rt_sigaction.S b/sysdeps/unix/sysv/linux/alpha/rt_sigaction.S
index 5f166a7094..3e02a661e7 100644
--- a/sysdeps/unix/sysv/linux/alpha/rt_sigaction.S
+++ b/sysdeps/unix/sysv/linux/alpha/rt_sigaction.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson <rth@cygnus.com>, 1998
 
@@ -28,55 +28,92 @@
 
 #ifdef __NR_rt_sigaction
 	.text
+
 ENTRY(__syscall_rt_sigaction)
 	.frame	sp,0,ra,0
-#ifdef PROF
 	ldgp	gp,0(pv)
+#ifdef PROF
 	.set noat
 	lda	AT, _mcount
 	jsr	AT, (AT), _mcount
 	.set at
 #endif
-	/* Indicate non-standard use of our PV.  */
-	.prologue 2
+	.prologue 1
 
 	beq	a1, 0f
-	ldl	t0, 8(a1)				# sa_flags
-	lda	a4, sigreturn-__syscall_rt_sigaction(pv)
-	lda	t1, rt_sigreturn-__syscall_rt_sigaction(pv)
-	and	t0, 0x00000040, t0			# SA_SIGINFO
+	ldl	t0, 8(a1)			# sa_flags
+	ldah	a4, sigreturn(gp)		!gprelhigh
+	ldah	t1, rt_sigreturn(gp)		!gprelhigh
+	lda	a4, sigreturn(a4)		!gprellow
+	lda	t1, rt_sigreturn(a4)		!gprellow
+	and	t0, 0x00000040, t0		# SA_SIGINFO
 	cmovne	t0, t1, a4
-0:	ldi	v0,__NR_rt_sigaction
+0:	ldi	v0, __NR_rt_sigaction
 	callsys
-	bne	a3,1f
+	bne	a3, SYSCALL_ERROR_LABEL
 	ret
 
-1:
-#ifndef PROF
-	br	gp,2f
-2:	ldgp	gp,0(gp)
-#endif
-	SYSCALL_ERROR_HANDLER
+PSEUDO_END(__syscall_rt_sigaction)
 
-END(__syscall_rt_sigaction)
+/* To enable unwinding through the signal frame without special hackery
+   elsewhere, describe the entire struct sigcontext with unwind info.
+   Note that we begin the unwind info one instruction before the start
+   of the function; the unwinder will subtract one from the return address
+   attempting to find the call instruction that led us here, since we
+   didn't get here via a normal call.  */
+
+	.macro SIGCONTEXT_REGS_I base, from=0
+	cfi_offset (\from, \base + (4 + \from) * 8)
+	.if	30-\from
+	SIGCONTEXT_REGS_I \base, "(\from+1)"
+	.endif
+	.endm
 
-	.align	5
-	.ent	sigreturn
+	.macro SIGCONTEXT_REGS_F base, from=32
+	cfi_offset (\from, \base + (4 + 1 + \from) * 8)
+	.if	62-\from
+	SIGCONTEXT_REGS_F \base, "(\from+1)"
+	.endif
+	.endm
+
+	.macro SIGCONTEXT_REGS base
+	SIGCONTEXT_REGS_I \base
+	SIGCONTEXT_REGS_F \base
+	cfi_offset (63, \base + (4 + 32 + 1 + 32) * 8)
+	cfi_offset (64, \base + 2 * 8)
+	.endm
+
+	.align	4
+	nop
+	nop
+	nop
+
+	cfi_startproc
+	cfi_return_column (64)
+	SIGCONTEXT_REGS -648
+	cfi_def_cfa_offset (648)
+	nop
 sigreturn:
-	.prologue 0
-	mov	sp,a0
-	ldi	v0,__NR_sigreturn
+	mov	sp, a0
+	ldi	v0, __NR_sigreturn
 	callsys
-	.end	sigreturn
+	cfi_endproc
+	.size	sigreturn, .-sigreturn
+	.type	sigreturn, @function
 
-	.align	4
-	.ent	rt_sigreturn
+	cfi_startproc
+	cfi_return_column (64)
+	SIGCONTEXT_REGS -648
+	cfi_def_cfa_offset (176 + 648)
+	nop
 rt_sigreturn:
-	.prologue 0
 	mov	sp,a0
 	ldi	v0,__NR_rt_sigreturn
 	callsys
-	.end	rt_sigreturn
+	cfi_endproc
+	.size	rt_sigreturn, .-rt_sigreturn
+	.type	rt_sigreturn, @function
+
 #else
 ENTRY(__syscall_rt_sigaction)
 	ldgp $29,0($27)