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