diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | nptl/ChangeLog | 5 | ||||
-rw-r--r-- | nptl/Makefile | 3 | ||||
-rw-r--r-- | nptl/tst-backtrace1.c | 86 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/x86_64/clone.S | 11 |
5 files changed, 109 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog index 07a016eefb..f8c56339df 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2004-01-08 Jakub Jelinek <jakub@redhat.com> + + * sysdeps/unix/sysv/linux/x86_64/clone.S (__clone): Add cfi_endproc + right before syscall and cfi_startproc before PSEUDO_END. + Clear %rbp in thread_start. + 2004-01-05 Jakub Jelinek <jakub@redhat.com> * posix/regcomp.c (regcomp): Fix comment typo. diff --git a/nptl/ChangeLog b/nptl/ChangeLog index f77a2a1c5e..ef0dffc2e6 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,8 @@ +2004-01-08 Jakub Jelinek <jakub@redhat.com> + + * Makefile (tests): Add tst-backtrace1. + * tst-backtrace1.c: New test. + 2003-12-11 Ulrich Weigand <uweigand@de.ibm.com> * sysdeps/alpha/tls.h (DB_THREAD_SELF): Pass bit size of thread diff --git a/nptl/Makefile b/nptl/Makefile index 08ed1487a5..c67bfe4ef6 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 2002, 2003 Free Software Foundation, Inc. +# Copyright (C) 2002, 2003, 2004 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 @@ -235,6 +235,7 @@ tests = tst-attr1 tst-attr2 tst-attr3 \ tst-clock1 tst-clock2 \ tst-context1 \ tst-sched1 \ + tst-backtrace1 \ tst-oddstacklimit # This sets the stack resource limit to 1023kb, which is not a multiple diff --git a/nptl/tst-backtrace1.c b/nptl/tst-backtrace1.c new file mode 100644 index 0000000000..903c493743 --- /dev/null +++ b/nptl/tst-backtrace1.c @@ -0,0 +1,86 @@ +/* Copyright (C) 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <execinfo.h> +#include <pthread.h> +#include <stdio.h> + +#define BT_SIZE 64 +void *bt_array[BT_SIZE]; +int bt_cnt; + +int +do_bt (void) +{ + bt_cnt = backtrace (bt_array, BT_SIZE); + return 56; +} + +int +call_do_bt (void) +{ + return do_bt () + 1; +} + +void * +tf (void *arg) +{ + if (call_do_bt () != 57) + return (void *) 1L; + return NULL; +} + +int +do_test (void) +{ + pthread_t th; + if (pthread_create (&th, NULL, tf, NULL)) + { + puts ("create failed"); + return 1; + } + + void *res; + if (pthread_join (th, &res)) + { + puts ("join failed"); + return 1; + } + + if (res != NULL) + { + puts ("thread failed"); + return 1; + } + + char **text = backtrace_symbols (bt_array, bt_cnt); + if (text == NULL) + { + puts ("backtrace_symbols failed"); + return 1; + } + + for (int i = 0; i < bt_cnt; ++i) + puts (text[i]); + + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/sysdeps/unix/sysv/linux/x86_64/clone.S b/sysdeps/unix/sysv/linux/x86_64/clone.S index c8d7becc75..d182fe2f9e 100644 --- a/sysdeps/unix/sysv/linux/x86_64/clone.S +++ b/sysdeps/unix/sysv/linux/x86_64/clone.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2002, 2003, 2004 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 @@ -72,6 +72,10 @@ ENTRY (BP_SYM (__clone)) movq %r9, %r8 movq 8(%rsp), %r10 movq $SYS_ify(clone),%rax + + /* End FDE now, because in the child the unwind info will be + wrong. */ + cfi_endproc; syscall testq %rax,%rax @@ -82,6 +86,10 @@ L(pseudo_end): ret thread_start: + /* Clear the frame pointer. The ABI suggests this be done, to mark + the outermost frame obviously. */ + xorq %rbp, %rbp + /* Set up arguments for the function call. */ popq %rax /* Function to call. */ popq %rdi /* Argument. */ @@ -90,6 +98,7 @@ thread_start: movq %rax, %rdi call HIDDEN_JUMPTARGET (_exit) + cfi_startproc; PSEUDO_END (BP_SYM (__clone)) weak_alias (BP_SYM (__clone), BP_SYM (clone)) |