diff options
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 51572ca515..0000000000 --- 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 790e7566d4..6ee53c57b0 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 0000000000..7d71fbd9a8 --- /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) |