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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [g++.dg/] [ext/] [cleanup-8.C] - Blame information for rev 801

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 693 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 signal
4
   frames.  */
5
 
6
#include 
7
#include 
8
#include 
9
#include 
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
26
    = (struct _Unwind_Exception *) malloc (sizeof (*exc));
27
  memset (&exc->exception_class, 0, sizeof (exc->exception_class));
28
  exc->exception_cleanup = 0;
29
 
30
#ifndef __USING_SJLJ_EXCEPTIONS__
31
  _Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
32
#else
33
  _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
34
#endif
35
 
36
  abort ();
37
}
38
 
39
int count;
40
char *null;
41
 
42
static void counter (void *p __attribute__((unused)))
43
{
44
  ++count;
45
}
46
 
47
static void handler (void *p __attribute__((unused)))
48
{
49
  if (count != 2)
50
    abort ();
51
  exit (0);
52
}
53
 
54
static int __attribute__((noinline)) fn5 ()
55
{
56
  char dummy __attribute__((cleanup (counter)));
57
  force_unwind ();
58
  return 0;
59
}
60
 
61
static void fn4 (int sig)
62
{
63
  char dummy __attribute__((cleanup (counter)));
64
  fn5 ();
65
  null = NULL;
66
}
67
 
68
static void fn3 ()
69
{
70
  abort ();
71
}
72
 
73
static int __attribute__((noinline)) fn2 ()
74
{
75
  *null = 0;
76
  fn3 ();
77
  return 0;
78
}
79
 
80
static int __attribute__((noinline)) fn1 ()
81
{
82
  signal (SIGSEGV, fn4);
83
  signal (SIGBUS, fn4);
84
  fn2 ();
85
  return 0;
86
}
87
 
88
static int __attribute__((noinline)) fn0 ()
89
{
90
  char dummy __attribute__((cleanup (handler)));
91
  fn1 ();
92
  null = 0;
93
  return 0;
94
}
95
 
96
int main()
97
{
98
  fn0 ();
99
  abort ();
100
}

powered by: WebSVN 2.1.0

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