mirror of https://gitee.com/Nocallback/glibc.git
Browse Source
Update. 2004-07-16 Steven Munroe <sjmunroe@us.ibm.com> [BZ #269] * setjmp/Makefile (tests): Add bug269-setjmp. * setjmp/bug269-setjmp.c: New file. * sysdeps/powerpc/powerpc64/__longjmp-common.S [SHARED && !IS_IN_rtld]: Store R2 from jmpbuf in callers TOC save area. * sysdeps/powerpc/powerpc64/bsd-_setjmp.S [SHARED && !IS_IN_rtld]: Store R2 in TOC save area. * sysdeps/powerpc/powerpc64/setjmp-common.S [SHARED && !IS_IN_rtld]: Copy TOC save area from previous frame as R2 (TOC) in jmpbuf.cvs/fedora-2_3-branch
6 changed files with 132 additions and 1 deletions
@ -0,0 +1,107 @@ |
|||
/* Copyright (C) 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 |
|||
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. */ ; |
|||
|
|||
/* Test case for Bugzilla # 269 */ |
|||
|
|||
#include <stdio.h> |
|||
#include <setjmp.h> |
|||
#include <stdlib.h> |
|||
|
|||
jmp_buf buf1; |
|||
jmp_buf buf2; |
|||
int *p; |
|||
int n_x = 6; |
|||
|
|||
static int g_counter = 0; |
|||
|
|||
int |
|||
f (void) |
|||
{ |
|||
static int counter = 0; |
|||
static int way_point1 = 3; |
|||
static int way_point2 = 2; |
|||
int lose = 0; |
|||
|
|||
if (setjmp (buf1) != 101) |
|||
{ |
|||
int a[n_x]; /* reallocate stack space */ |
|||
g_counter++; |
|||
p = &a[0]; |
|||
if (g_counter < 5) |
|||
longjmp (buf1, 2); |
|||
else if (g_counter == 5) |
|||
longjmp (buf1, 101); |
|||
else |
|||
{ |
|||
_setjmp (buf2); |
|||
_longjmp (buf1, 101); |
|||
} |
|||
} |
|||
|
|||
way_point1--; |
|||
|
|||
if (counter == 0) |
|||
{ |
|||
counter++; |
|||
{ |
|||
int a[n_x]; /* reallocate stack space */ |
|||
g_counter++; |
|||
p = &a[0]; |
|||
if (g_counter < 5) |
|||
longjmp (buf1, 2); |
|||
else if (g_counter == 5) |
|||
longjmp (buf1, 101); |
|||
else |
|||
{ |
|||
_setjmp (buf2); |
|||
_longjmp (buf1, 101); |
|||
} |
|||
} |
|||
} |
|||
|
|||
way_point2--; |
|||
|
|||
if (counter == 1) |
|||
{ |
|||
counter++; |
|||
longjmp (buf2, 2); |
|||
} |
|||
|
|||
lose = !(way_point1 == 0 && way_point2 == 0 |
|||
&& g_counter == 6 && counter == 2); |
|||
|
|||
return lose; |
|||
} |
|||
|
|||
static int |
|||
do_test (void) |
|||
{ |
|||
int lose; |
|||
|
|||
lose = f (); |
|||
|
|||
if (lose) |
|||
puts ("Test FAILED!"); |
|||
else |
|||
puts ("Test succeeded!"); |
|||
|
|||
return lose ? EXIT_FAILURE : EXIT_SUCCESS; |
|||
} |
|||
|
|||
#define TEST_FUNCTION do_test () |
|||
#include "../test-skeleton.c" |
|||
Loading…
Reference in new issue