summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2003-06-06 05:54:15 +0000
committerRichard Henderson <rth@redhat.com>2003-06-06 05:54:15 +0000
commitf212e8dcf8f5a94b91b2ca36a5f0e6823bd745d4 (patch)
tree0756684b318b1dfd5771911a049f8965f11ae6c2
parenta56e4568df19f99dc93f8c0f09e851e5b61f2d55 (diff)
* 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/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.
-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)