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.
This commit is contained in:
Ulrich Drepper 2004-01-08 18:23:53 +00:00
parent f39eef7b5d
commit 249a3d0c4f
5 changed files with 109 additions and 2 deletions

View File

@ -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> 2004-01-05 Jakub Jelinek <jakub@redhat.com>
* posix/regcomp.c (regcomp): Fix comment typo. * posix/regcomp.c (regcomp): Fix comment typo.

View File

@ -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> 2003-12-11 Ulrich Weigand <uweigand@de.ibm.com>
* sysdeps/alpha/tls.h (DB_THREAD_SELF): Pass bit size of thread * sysdeps/alpha/tls.h (DB_THREAD_SELF): Pass bit size of thread

View File

@ -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. # This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or # 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-clock1 tst-clock2 \
tst-context1 \ tst-context1 \
tst-sched1 \ tst-sched1 \
tst-backtrace1 \
tst-oddstacklimit tst-oddstacklimit
# This sets the stack resource limit to 1023kb, which is not a multiple # This sets the stack resource limit to 1023kb, which is not a multiple

86
nptl/tst-backtrace1.c Normal file
View File

@ -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"

View File

@ -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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or 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 %r9, %r8
movq 8(%rsp), %r10 movq 8(%rsp), %r10
movq $SYS_ify(clone),%rax movq $SYS_ify(clone),%rax
/* End FDE now, because in the child the unwind info will be
wrong. */
cfi_endproc;
syscall syscall
testq %rax,%rax testq %rax,%rax
@ -82,6 +86,10 @@ L(pseudo_end):
ret ret
thread_start: 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. */ /* Set up arguments for the function call. */
popq %rax /* Function to call. */ popq %rax /* Function to call. */
popq %rdi /* Argument. */ popq %rdi /* Argument. */
@ -90,6 +98,7 @@ thread_start:
movq %rax, %rdi movq %rax, %rdi
call HIDDEN_JUMPTARGET (_exit) call HIDDEN_JUMPTARGET (_exit)
cfi_startproc;
PSEUDO_END (BP_SYM (__clone)) PSEUDO_END (BP_SYM (__clone))
weak_alias (BP_SYM (__clone), BP_SYM (clone)) weak_alias (BP_SYM (__clone), BP_SYM (clone))