1 /* PR middle-end/32758 */
2 /* HP-UX libunwind.so doesn't provide _UA_END_OF_STACK */
3 /* { dg-do run } */
4 /* { dg-options "-O2 -fexceptions" } */
5 /* { dg-skip-if "" { "ia64-*-hpux11.*" } } */
6 /* { dg-skip-if "" { ! nonlocal_goto } } */
7 /* { dg-require-effective-target exceptions } */
8 /* Verify unwind info in presence of alloca.  */
9 
10 #include <unwind.h>
11 #include <stdlib.h>
12 #include <string.h>
13 
14 static _Unwind_Reason_Code
force_unwind_stop(int version,_Unwind_Action actions,_Unwind_Exception_Class exc_class,struct _Unwind_Exception * exc_obj,struct _Unwind_Context * context,void * stop_parameter)15 force_unwind_stop (int version, _Unwind_Action actions,
16 		   _Unwind_Exception_Class exc_class,
17 		   struct _Unwind_Exception *exc_obj,
18 		   struct _Unwind_Context *context,
19 		   void *stop_parameter)
20 {
21   if (actions & _UA_END_OF_STACK)
22     abort ();
23   return _URC_NO_REASON;
24 }
25 
force_unwind(void)26 static void force_unwind (void)
27 {
28   struct _Unwind_Exception *exc = malloc (sizeof (*exc));
29   memset (&exc->exception_class, 0, sizeof (exc->exception_class));
30   exc->exception_cleanup = 0;
31 
32 #ifndef __USING_SJLJ_EXCEPTIONS__
33   _Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
34 #else
35   _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
36 #endif
37 
38   abort ();
39 }
40 
41 __attribute__((noinline))
foo(void * x)42 void foo (void *x __attribute__((unused)))
43 {
44   force_unwind ();
45 }
46 
47 __attribute__((noinline))
bar(unsigned int x)48 int bar (unsigned int x)
49 {
50   void *y = __builtin_alloca (x);
51   foo (y);
52   return 1;
53 }
54 
handler(void * p)55 static void handler (void *p __attribute__((unused)))
56 {
57   exit (0);
58 }
59 
60 __attribute__((noinline))
doit()61 static void doit ()
62 {
63   char dummy __attribute__((cleanup (handler)));
64   bar (1024);
65 }
66 
main()67 int main ()
68 {
69   doit ();
70   abort ();
71 }
72