OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [gcc.dg/] [cleanup-9.c] - Blame information for rev 689

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 689 jeremybenn
/* { dg-do run { target hppa*-*-hpux* *-*-linux* powerpc*-*-darwin* *-*-darwin[912]* } } */
2
/* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */
3
/* Verify that cleanups work with exception handling through realtime
4
   signal frames.  */
5
 
6
#include <unwind.h>
7
#include <stdlib.h>
8
#include <signal.h>
9
#include <string.h>
10
 
11
static _Unwind_Reason_Code
12
force_unwind_stop (int version, _Unwind_Action actions,
13
                   _Unwind_Exception_Class exc_class,
14
                   struct _Unwind_Exception *exc_obj,
15
                   struct _Unwind_Context *context,
16
                   void *stop_parameter)
17
{
18
  if (actions & _UA_END_OF_STACK)
19
    abort ();
20
  return _URC_NO_REASON;
21
}
22
 
23
static void force_unwind ()
24
{
25
  struct _Unwind_Exception *exc = malloc (sizeof (*exc));
26
  memset (&exc->exception_class, 0, sizeof (exc->exception_class));
27
  exc->exception_cleanup = 0;
28
 
29
#ifndef __USING_SJLJ_EXCEPTIONS__
30
  _Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
31
#else
32
  _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
33
#endif
34
 
35
  abort ();
36
}
37
 
38
int count;
39
char *null;
40
 
41
static void counter (void *p __attribute__((unused)))
42
{
43
  ++count;
44
}
45
 
46
static void handler (void *p __attribute__((unused)))
47
{
48
  if (count != 2)
49
    abort ();
50
  exit (0);
51
}
52
 
53
static int __attribute__((noinline)) fn5 ()
54
{
55
  char dummy __attribute__((cleanup (counter)));
56
  force_unwind ();
57
  return 0;
58
}
59
 
60
static void fn4 (int sig, siginfo_t *info, void *ctx)
61
{
62
  char dummy __attribute__((cleanup (counter)));
63
  fn5 ();
64
  null = NULL;
65
}
66
 
67
static void fn3 ()
68
{
69
  abort ();
70
}
71
 
72
static int __attribute__((noinline)) fn2 ()
73
{
74
  *null = 0;
75
  fn3 ();
76
  return 0;
77
}
78
 
79
static int __attribute__((noinline)) fn1 ()
80
{
81
  struct sigaction s;
82
  sigemptyset (&s.sa_mask);
83
  s.sa_sigaction = fn4;
84
  s.sa_flags = SA_RESETHAND | SA_SIGINFO;
85
  sigaction (SIGSEGV, &s, NULL);
86
  sigaction (SIGBUS, &s, NULL);
87
  fn2 ();
88
  return 0;
89
}
90
 
91
static int __attribute__((noinline)) fn0 ()
92
{
93
  char dummy __attribute__((cleanup (handler)));
94
  fn1 ();
95
  null = 0;
96
  return 0;
97
}
98
 
99
int main()
100
{
101
  fn0 ();
102
  abort ();
103
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.