diff options
author | Ulrich Drepper <drepper@redhat.com> | 1998-08-15 02:40:04 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1998-08-15 02:40:04 +0000 |
commit | 409dfcea953837975cd8cb52e16197c85803930a (patch) | |
tree | 0c226d217afcbd63579d59a3cd2389fcc1a3f2aa /sysdeps | |
parent | 9d141cae00c957096045d08fe504b4a2be66ab75 (diff) | |
download | glibc-409dfcea953837975cd8cb52e16197c85803930a.zip glibc-409dfcea953837975cd8cb52e16197c85803930a.tar.gz glibc-409dfcea953837975cd8cb52e16197c85803930a.tar.bz2 |
Update.
1998-08-14 10:08 Ulrich Drepper <drepper@cygnus.com>
* manual/texinfo.tex: Update.
1998-08-07 Geoff Keating <geoffk@ozemail.com.au>
* sysdeps/powerpc/backtrace.c: New file.
1998-08-14 Philip Blundell <pb@nexus.co.uk>
* sysdeps/arm/fpu/setjmp.S: Correct value of R0 before calling
sigjmp_save.
* sysdeps/arm/elf/setjmp.S: Obsolete, deleted.
1998-08-11 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* Makefile (install-symbolic-link): Fix spelling.
1998-08-11 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* elf/elf.h (SHT_HIOS): Fix value.
1998-08-10 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* posix/regex.c (WIDE_CHAR_SUPPORT): Don't generate defined as
part of the expansion, this is undefined by the standard.
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/arm/elf/setjmp.S | 76 | ||||
-rw-r--r-- | sysdeps/arm/fpu/setjmp.S | 3 | ||||
-rw-r--r-- | sysdeps/powerpc/backtrace.c | 63 |
3 files changed, 66 insertions, 76 deletions
diff --git a/sysdeps/arm/elf/setjmp.S b/sysdeps/arm/elf/setjmp.S deleted file mode 100644 index 51572ca..0000000 --- a/sysdeps/arm/elf/setjmp.S +++ /dev/null @@ -1,76 +0,0 @@ -/* setjmp for arm, ELF version. - Copyright (C) 1995, 1996, 1997, 1998 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., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include <sysdep.h> -#define _ASM -#define _SETJMP_H -#include <bits/setjmp.h> - - /* We include the BSD entry points here as well but we make - them weak. */ -ENTRY (setjmp) - .weak C_SYMBOL_NAME (setjmp) - @ call comes here with - @ lr = return pc - @ r0 = &jump_buf - - @ add a second argument into the fray - mov r1, #1 - @ call the common code - b __sigsetjmp(PLT) -END (setjmp) - - /* Binary compatibility entry point. */ -ENTRY (_setjmp) - .weak C_SYMBOL_NAME (_setjmp) -ENTRY (__setjmp) - @ call comes here with - @ lr = return pc - @ r0 = &jump_buf - - @ add a second argument into the fray - mov r1, #1 - @ fall through to the common code.... - -ENTRY (__sigsetjmp) - @ save the registers into the jmp_buf.... - stmia r0, {r1-r6, sl, fp, sp, lr} - - /* Make a tail call to __sigjmp_save; it takes the same args. */ -#ifdef PIC - /* We cannot use the PLT, because it requires that sl==r10 be set, but - we can't save and restore our caller's value. Instead, we do an - indirect jump through the GOT, using for the temporary register - ip, which is call-clobbered. */ - ldr ip, 1f - add ip, ip, pc -2: @ get the address of __sigjmp_save - ldr r1, 3f - ldr ip, [ip, r1] - @ restore r1 - ldr r1, [r0] - @ jump to *__sigjmp_save - mov pc, ip -1: .word _GLOBAL_OFFSET_TABLE_ - 2b - 4 -3: .word __sigjmp_save(GOT) - -#else - b __sigjmp_save -#endif -END (__sigsetjmp) diff --git a/sysdeps/arm/fpu/setjmp.S b/sysdeps/arm/fpu/setjmp.S index 790e756..6ee53c5 100644 --- a/sysdeps/arm/fpu/setjmp.S +++ b/sysdeps/arm/fpu/setjmp.S @@ -30,6 +30,9 @@ ENTRY (__sigsetjmp) sfmea f4, 4, [r0]! stmia r0, {v1-v6, sl, fp, sp, lr} + /* Restore pointer to jmp_buf */ + sub r0, r0, #48 + /* Make a tail call to __sigjmp_save; it takes the same args. */ B PLTJMP(C_SYMBOL_NAME(__sigjmp_save)) END (__setjmp) diff --git a/sysdeps/powerpc/backtrace.c b/sysdeps/powerpc/backtrace.c new file mode 100644 index 0000000..7d71fbd --- /dev/null +++ b/sysdeps/powerpc/backtrace.c @@ -0,0 +1,63 @@ +/* Return backtrace of current program state. + Copyright (C) 1998 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., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <execinfo.h> + +/* This is the stack layout we see with every stack frame. + Note that every routine is required by the ABI to lay out the stack + like this. + + +----------------+ +-----------------+ + %r1 -> | %r1 last frame--------> | %r1 last frame--->... --> NULL + | | | | + | (unused) | | return address | + +----------------+ +-----------------+ +*/ +struct layout +{ + struct layout *next; + void *return_address; +}; + +int +__backtrace (void **array, int size) +{ + struct layout *current; + int count; + + /* Force gcc to spill LR. */ + asm volatile ("" : "=l"(current)); + + /* Get the address on top-of-stack. */ + asm volatile ("lwz %0,0(1)" : "=r"(current)); + + for ( count = 0; + current != NULL && count < size; + current = current->next, count++) + array[count] = current->return_address; + + /* It's possible the second-last stack frame can't return + (that is, it's __libc_start_main), in which case + the CRT startup code will have set its LR to 'NULL'. */ + if (count > 0 && array[count-1] == NULL) + count--; + + return count; +} +weak_alias (__backtrace, backtrace) |