annotate gcc/testsuite/gcc.dg/cleanup-13.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* HP-UX libunwind.so doesn't provide _UA_END_OF_STACK */
kono
parents:
diff changeset
2 /* { dg-do run } */
kono
parents:
diff changeset
3 /* { dg-options "-fexceptions" } */
kono
parents:
diff changeset
4 /* { dg-skip-if "" { "ia64-*-hpux11.*" } } */
kono
parents:
diff changeset
5 /* { dg-skip-if "" { ! nonlocal_goto } } */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 111
diff changeset
6 /* { dg-require-effective-target exceptions } */
111
kono
parents:
diff changeset
7 /* Verify DW_OP_* handling in the unwinder. */
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 #include <unwind.h>
kono
parents:
diff changeset
10 #include <stdlib.h>
kono
parents:
diff changeset
11 #include <string.h>
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 /* #define OP_addr(x) 0x06, ... */
kono
parents:
diff changeset
14 #define OP_deref 0x06,
kono
parents:
diff changeset
15 #define SLEB128(x) (x)&0x7f /* Assume here the value is -0x40 ... 0x3f. */
kono
parents:
diff changeset
16 #define ULEB128(x) (x)&0x7f /* Assume here the value is 0 ... 0x7f. */
kono
parents:
diff changeset
17 #define VAL1(x) (x)&0xff
kono
parents:
diff changeset
18 #if defined (__BIG_ENDIAN__)
kono
parents:
diff changeset
19 #define VAL2(x) ((x)>>8)&0xff,(x)&0xff
kono
parents:
diff changeset
20 #define VAL4(x) ((x)>>24)&0xff,((x)>>16)&0xff,((x)>>8)&0xff,(x)&0xff
kono
parents:
diff changeset
21 #define VAL8(x) ((x)>>56)&0xff,((x)>>48)&0xff,((x)>>40)&0xff,((x)>>32)&0xff,((x)>>24)&0xff,((x)>>16)&0xff,((x)>>8)&0xff,(x)&0xff
kono
parents:
diff changeset
22 #elif defined(__LITTLE_ENDIAN__) || defined(__x86_64__) || defined(__i386__)
kono
parents:
diff changeset
23 #define VAL2(x) (x)&0xff,((x)>>8)&0xff
kono
parents:
diff changeset
24 #define VAL4(x) (x)&0xff,((x)>>8)&0xff,((x)>>16)&0xff,((x)>>24)&0xff
kono
parents:
diff changeset
25 #define VAL8(x) (x)&0xff,((x)>>8)&0xff,((x)>>16)&0xff,((x)>>24)&0xff,((x)>>32)&0xff,((x)>>40)&0xff,((x)>>48)&0xff,((x)>>56)&0xff
kono
parents:
diff changeset
26 #endif
kono
parents:
diff changeset
27 #define OP_const1u(x) 0x08,VAL1(x),
kono
parents:
diff changeset
28 #define OP_const1s(x) 0x09,VAL1(x),
kono
parents:
diff changeset
29 #define OP_const2u(x) 0x0a,VAL2(x),
kono
parents:
diff changeset
30 #define OP_const2s(x) 0x0b,VAL2(x),
kono
parents:
diff changeset
31 #define OP_const4u(x) 0x0c,VAL4(x),
kono
parents:
diff changeset
32 #define OP_const4s(x) 0x0d,VAL4(x),
kono
parents:
diff changeset
33 #define OP_const8u(x) 0x0e,VAL8(x),
kono
parents:
diff changeset
34 #define OP_const8s(x) 0x0f,VAL8(x),
kono
parents:
diff changeset
35 #define OP_constu(x) 0x10,ULEB128(x),
kono
parents:
diff changeset
36 #define OP_consts(x) 0x11,SLEB128(x),
kono
parents:
diff changeset
37 #define OP_dup 0x12,
kono
parents:
diff changeset
38 #define OP_drop 0x13,
kono
parents:
diff changeset
39 #define OP_over 0x14,
kono
parents:
diff changeset
40 #define OP_pick(x) 0x15,VAL1(x),
kono
parents:
diff changeset
41 #define OP_swap 0x16,
kono
parents:
diff changeset
42 #define OP_rot 0x17,
kono
parents:
diff changeset
43 #define OP_xderef 0x18,
kono
parents:
diff changeset
44 #define OP_abs 0x19,
kono
parents:
diff changeset
45 #define OP_and 0x1a,
kono
parents:
diff changeset
46 #define OP_div 0x1b,
kono
parents:
diff changeset
47 #define OP_minus 0x1c,
kono
parents:
diff changeset
48 #define OP_mod 0x1d,
kono
parents:
diff changeset
49 #define OP_mul 0x1e,
kono
parents:
diff changeset
50 #define OP_neg 0x1f,
kono
parents:
diff changeset
51 #define OP_not 0x20,
kono
parents:
diff changeset
52 #define OP_or 0x21,
kono
parents:
diff changeset
53 #define OP_plus 0x22,
kono
parents:
diff changeset
54 #define OP_plus_uconst(x) 0x23,ULEB128(x),
kono
parents:
diff changeset
55 #define OP_shl 0x24,
kono
parents:
diff changeset
56 #define OP_shr 0x25,
kono
parents:
diff changeset
57 #define OP_shra 0x26,
kono
parents:
diff changeset
58 #define OP_xor 0x27,
kono
parents:
diff changeset
59 #define OP_bra(x) 0x28,VAL2(x),
kono
parents:
diff changeset
60 #define OP_eq 0x29,
kono
parents:
diff changeset
61 #define OP_ge 0x2a,
kono
parents:
diff changeset
62 #define OP_gt 0x2b,
kono
parents:
diff changeset
63 #define OP_le 0x2c,
kono
parents:
diff changeset
64 #define OP_lt 0x2d,
kono
parents:
diff changeset
65 #define OP_ne 0x2e,
kono
parents:
diff changeset
66 #define OP_skip(x) 0x2f,VAL2(x),
kono
parents:
diff changeset
67 #define OP_lit0 0x30,
kono
parents:
diff changeset
68 #define OP_lit1 0x31,
kono
parents:
diff changeset
69 #define OP_lit2 0x32,
kono
parents:
diff changeset
70 #define OP_lit3 0x33,
kono
parents:
diff changeset
71 #define OP_lit4 0x34,
kono
parents:
diff changeset
72 #define OP_lit5 0x35,
kono
parents:
diff changeset
73 #define OP_lit6 0x36,
kono
parents:
diff changeset
74 #define OP_lit7 0x37,
kono
parents:
diff changeset
75 #define OP_lit8 0x38,
kono
parents:
diff changeset
76 #define OP_lit9 0x39,
kono
parents:
diff changeset
77 #define OP_lit10 0x3a,
kono
parents:
diff changeset
78 #define OP_lit11 0x3b,
kono
parents:
diff changeset
79 #define OP_lit12 0x3c,
kono
parents:
diff changeset
80 #define OP_lit13 0x3d,
kono
parents:
diff changeset
81 #define OP_lit14 0x3e,
kono
parents:
diff changeset
82 #define OP_lit15 0x3f,
kono
parents:
diff changeset
83 #define OP_lit16 0x40,
kono
parents:
diff changeset
84 #define OP_lit17 0x41,
kono
parents:
diff changeset
85 #define OP_lit18 0x42,
kono
parents:
diff changeset
86 #define OP_lit19 0x43,
kono
parents:
diff changeset
87 #define OP_lit20 0x44,
kono
parents:
diff changeset
88 #define OP_lit21 0x45,
kono
parents:
diff changeset
89 #define OP_lit22 0x46,
kono
parents:
diff changeset
90 #define OP_lit23 0x47,
kono
parents:
diff changeset
91 #define OP_lit24 0x48,
kono
parents:
diff changeset
92 #define OP_lit25 0x49,
kono
parents:
diff changeset
93 #define OP_lit26 0x4a,
kono
parents:
diff changeset
94 #define OP_lit27 0x4b,
kono
parents:
diff changeset
95 #define OP_lit28 0x4c,
kono
parents:
diff changeset
96 #define OP_lit29 0x4d,
kono
parents:
diff changeset
97 #define OP_lit30 0x4e,
kono
parents:
diff changeset
98 #define OP_lit31 0x4f,
kono
parents:
diff changeset
99 #define OP_reg0 0x50,
kono
parents:
diff changeset
100 #define OP_reg1 0x51,
kono
parents:
diff changeset
101 #define OP_reg2 0x52,
kono
parents:
diff changeset
102 #define OP_reg3 0x53,
kono
parents:
diff changeset
103 #define OP_reg4 0x54,
kono
parents:
diff changeset
104 #define OP_reg5 0x55,
kono
parents:
diff changeset
105 #define OP_reg6 0x56,
kono
parents:
diff changeset
106 #define OP_reg7 0x57,
kono
parents:
diff changeset
107 #define OP_reg8 0x58,
kono
parents:
diff changeset
108 #define OP_reg9 0x59,
kono
parents:
diff changeset
109 #define OP_reg10 0x5a,
kono
parents:
diff changeset
110 #define OP_reg11 0x5b,
kono
parents:
diff changeset
111 #define OP_reg12 0x5c,
kono
parents:
diff changeset
112 #define OP_reg13 0x5d,
kono
parents:
diff changeset
113 #define OP_reg14 0x5e,
kono
parents:
diff changeset
114 #define OP_reg15 0x5f,
kono
parents:
diff changeset
115 #define OP_reg16 0x60,
kono
parents:
diff changeset
116 #define OP_reg17 0x61,
kono
parents:
diff changeset
117 #define OP_reg18 0x62,
kono
parents:
diff changeset
118 #define OP_reg19 0x63,
kono
parents:
diff changeset
119 #define OP_reg20 0x64,
kono
parents:
diff changeset
120 #define OP_reg21 0x65,
kono
parents:
diff changeset
121 #define OP_reg22 0x66,
kono
parents:
diff changeset
122 #define OP_reg23 0x67,
kono
parents:
diff changeset
123 #define OP_reg24 0x68,
kono
parents:
diff changeset
124 #define OP_reg25 0x69,
kono
parents:
diff changeset
125 #define OP_reg26 0x6a,
kono
parents:
diff changeset
126 #define OP_reg27 0x6b,
kono
parents:
diff changeset
127 #define OP_reg28 0x6c,
kono
parents:
diff changeset
128 #define OP_reg29 0x6d,
kono
parents:
diff changeset
129 #define OP_reg30 0x6e,
kono
parents:
diff changeset
130 #define OP_reg31 0x6f,
kono
parents:
diff changeset
131 #define OP_breg0(x) 0x70,SLEB128(x),
kono
parents:
diff changeset
132 #define OP_breg1(x) 0x71,SLEB128(x),
kono
parents:
diff changeset
133 #define OP_breg2(x) 0x72,SLEB128(x),
kono
parents:
diff changeset
134 #define OP_breg3(x) 0x73,SLEB128(x),
kono
parents:
diff changeset
135 #define OP_breg4(x) 0x74,SLEB128(x),
kono
parents:
diff changeset
136 #define OP_breg5(x) 0x75,SLEB128(x),
kono
parents:
diff changeset
137 #define OP_breg6(x) 0x76,SLEB128(x),
kono
parents:
diff changeset
138 #define OP_breg7(x) 0x77,SLEB128(x),
kono
parents:
diff changeset
139 #define OP_breg8(x) 0x78,SLEB128(x),
kono
parents:
diff changeset
140 #define OP_breg9(x) 0x79,SLEB128(x),
kono
parents:
diff changeset
141 #define OP_breg10(x) 0x7a,SLEB128(x),
kono
parents:
diff changeset
142 #define OP_breg11(x) 0x7b,SLEB128(x),
kono
parents:
diff changeset
143 #define OP_breg12(x) 0x7c,SLEB128(x),
kono
parents:
diff changeset
144 #define OP_breg13(x) 0x7d,SLEB128(x),
kono
parents:
diff changeset
145 #define OP_breg14(x) 0x7e,SLEB128(x),
kono
parents:
diff changeset
146 #define OP_breg15(x) 0x7f,SLEB128(x),
kono
parents:
diff changeset
147 #define OP_breg16(x) 0x80,SLEB128(x),
kono
parents:
diff changeset
148 #define OP_breg17(x) 0x81,SLEB128(x),
kono
parents:
diff changeset
149 #define OP_breg18(x) 0x82,SLEB128(x),
kono
parents:
diff changeset
150 #define OP_breg19(x) 0x83,SLEB128(x),
kono
parents:
diff changeset
151 #define OP_breg20(x) 0x84,SLEB128(x),
kono
parents:
diff changeset
152 #define OP_breg21(x) 0x85,SLEB128(x),
kono
parents:
diff changeset
153 #define OP_breg22(x) 0x86,SLEB128(x),
kono
parents:
diff changeset
154 #define OP_breg23(x) 0x87,SLEB128(x),
kono
parents:
diff changeset
155 #define OP_breg24(x) 0x88,SLEB128(x),
kono
parents:
diff changeset
156 #define OP_breg25(x) 0x89,SLEB128(x),
kono
parents:
diff changeset
157 #define OP_breg26(x) 0x8a,SLEB128(x),
kono
parents:
diff changeset
158 #define OP_breg27(x) 0x8b,SLEB128(x),
kono
parents:
diff changeset
159 #define OP_breg28(x) 0x8c,SLEB128(x),
kono
parents:
diff changeset
160 #define OP_breg29(x) 0x8d,SLEB128(x),
kono
parents:
diff changeset
161 #define OP_breg30(x) 0x8e,SLEB128(x),
kono
parents:
diff changeset
162 #define OP_breg31(x) 0x8f,SLEB128(x),
kono
parents:
diff changeset
163 #define OP_regx(x) 0x90,SLEB128(x),
kono
parents:
diff changeset
164 #define OP_fbreg(x) 0x91,SLEB128(x),
kono
parents:
diff changeset
165 #define OP_bregx(x,y) 0x92,ULEB128(x),SLEB128(y),
kono
parents:
diff changeset
166 #define OP_piece(x) 0x93,ULEB128(x),
kono
parents:
diff changeset
167 #define OP_deref_size(x) 0x94,VAL1(x),
kono
parents:
diff changeset
168 #define OP_xderef_size(x) 0x95,VAL1(x),
kono
parents:
diff changeset
169 #define OP_nop 0x96,
kono
parents:
diff changeset
170 #define OP_nop_termination 0x96
kono
parents:
diff changeset
171 #define OP_push_object_address 0x97,
kono
parents:
diff changeset
172 #define OP_call2(x) 0x98,VAL2(x),
kono
parents:
diff changeset
173 #define OP_call4(x) 0x99,VAL4(x),
kono
parents:
diff changeset
174 /* #define OP_call_ref(x) 0x9a,... */
kono
parents:
diff changeset
175 #define OP_form_tls_address(x) 0x9b,
kono
parents:
diff changeset
176 #define OP_call_frame_cfa 0x9c,
kono
parents:
diff changeset
177 #define OP_bit_piece(x) 0x9d,ULEB128(x),
kono
parents:
diff changeset
178 /* #define OP_implicit_value(x...) 0x9e,... */
kono
parents:
diff changeset
179 #define OP_stack_value 0x9f,
kono
parents:
diff changeset
180 #define OP_GNU_push_tls_address 0xe0,
kono
parents:
diff changeset
181 /* #define OP_GNU_encoded_addr(x...) 0xf1, */
kono
parents:
diff changeset
182
kono
parents:
diff changeset
183 #define ASSERT_TOS_NON0 OP_bra(3) OP_skip(-3)
kono
parents:
diff changeset
184 #define ASSERT_TOS_0 OP_lit0 OP_eq ASSERT_TOS_NON0
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 /* Initially there is CFA value on the stack, we want to
kono
parents:
diff changeset
187 keep it there at the end. */
kono
parents:
diff changeset
188 #define CFI_PROGRAM \
kono
parents:
diff changeset
189 OP_lit0 OP_nop ASSERT_TOS_0 \
kono
parents:
diff changeset
190 OP_lit1 ASSERT_TOS_NON0 \
kono
parents:
diff changeset
191 OP_lit1 OP_const1u(1) OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
192 OP_lit16 OP_const2u(16) OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
193 OP_lit31 OP_const4u(31) OP_ne ASSERT_TOS_0 \
kono
parents:
diff changeset
194 OP_lit1 OP_neg OP_const1s(-1) OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
195 OP_lit16 OP_neg OP_const2s(-16) OP_ne ASSERT_TOS_0 \
kono
parents:
diff changeset
196 OP_lit31 OP_const4s(-31) OP_neg OP_ne ASSERT_TOS_0 \
kono
parents:
diff changeset
197 OP_lit7 OP_dup OP_plus_uconst(2) OP_lit9 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
198 OP_lit7 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
199 OP_lit20 OP_lit1 OP_drop OP_lit20 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
200 OP_lit17 OP_lit19 OP_over OP_lit17 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
201 OP_lit19 OP_eq ASSERT_TOS_NON0 OP_lit17 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
202 OP_lit1 OP_lit2 OP_lit3 OP_lit4 OP_pick(2) OP_lit2 OP_eq ASSERT_TOS_NON0\
kono
parents:
diff changeset
203 OP_lit4 OP_eq ASSERT_TOS_NON0 OP_lit3 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
204 OP_pick(0) OP_lit2 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
205 OP_lit2 OP_eq ASSERT_TOS_NON0 OP_lit1 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
206 OP_lit6 OP_lit12 OP_swap OP_lit6 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
207 OP_lit12 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
208 OP_lit7 OP_lit8 OP_lit9 OP_rot OP_lit8 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
209 OP_lit7 OP_eq ASSERT_TOS_NON0 OP_lit9 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
210 OP_lit7 OP_abs OP_lit7 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
211 OP_const1s(-123) OP_abs OP_const1u(123) OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
212 OP_lit3 OP_lit6 OP_and OP_lit2 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
213 OP_lit3 OP_lit6 OP_or OP_lit7 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
214 OP_lit17 OP_lit2 OP_minus OP_lit15 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
215 /* Divide is signed truncating toward zero. */ \
kono
parents:
diff changeset
216 OP_const1s(-6) OP_const1s(-2) OP_div OP_lit3 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
217 OP_const1s(-7) OP_const1s(3) OP_div OP_const1s(-2) \
kono
parents:
diff changeset
218 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
219 /* Modulo is unsigned. */ \
kono
parents:
diff changeset
220 OP_const1s(-6) OP_const1s(-4) OP_mod OP_const1s(-6) \
kono
parents:
diff changeset
221 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
222 OP_const1s(-6) OP_lit4 OP_mod OP_lit2 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
223 OP_lit6 OP_const1s(-4) OP_mod OP_lit6 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
224 /* Signed modulo can be implemented using "over over div mul minus". */\
kono
parents:
diff changeset
225 OP_const1s(-6) OP_const1s(-4) OP_over OP_over OP_div OP_mul OP_minus \
kono
parents:
diff changeset
226 OP_const1s(-2) OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
227 OP_const1s(-7) OP_lit3 OP_over OP_over OP_div OP_mul OP_minus \
kono
parents:
diff changeset
228 OP_const1s(-1) OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
229 OP_lit7 OP_const1s(-3) OP_over OP_over OP_div OP_mul OP_minus \
kono
parents:
diff changeset
230 OP_lit1 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
231 OP_lit16 OP_lit31 OP_plus_uconst(1) OP_mul OP_const2u(512) \
kono
parents:
diff changeset
232 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
233 OP_lit5 OP_not OP_lit31 OP_and OP_lit26 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
234 OP_lit12 OP_lit31 OP_plus OP_const1u(43) OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
235 OP_const1s(-6) OP_lit2 OP_plus OP_const1s(-4) OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
236 OP_const1s(-6) OP_plus_uconst(3) OP_const1s(-3) OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
237 OP_lit16 OP_lit4 OP_shl OP_const2u(256) OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
238 OP_lit16 OP_lit3 OP_shr OP_lit2 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
239 OP_const1s(-16) OP_lit3 OP_shra OP_const1s(-2) OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
240 OP_lit3 OP_lit6 OP_xor OP_lit5 OP_eq ASSERT_TOS_NON0 \
kono
parents:
diff changeset
241 OP_lit3 OP_lit6 OP_le ASSERT_TOS_NON0 \
kono
parents:
diff changeset
242 OP_lit3 OP_lit3 OP_le ASSERT_TOS_NON0 \
kono
parents:
diff changeset
243 OP_lit6 OP_lit3 OP_le ASSERT_TOS_0 \
kono
parents:
diff changeset
244 OP_lit3 OP_lit6 OP_lt ASSERT_TOS_NON0 \
kono
parents:
diff changeset
245 OP_lit3 OP_lit3 OP_lt ASSERT_TOS_0 \
kono
parents:
diff changeset
246 OP_lit6 OP_lit3 OP_lt ASSERT_TOS_0 \
kono
parents:
diff changeset
247 OP_lit3 OP_lit6 OP_ge ASSERT_TOS_0 \
kono
parents:
diff changeset
248 OP_lit3 OP_lit3 OP_ge ASSERT_TOS_NON0 \
kono
parents:
diff changeset
249 OP_lit6 OP_lit3 OP_ge ASSERT_TOS_NON0 \
kono
parents:
diff changeset
250 OP_lit3 OP_lit6 OP_gt ASSERT_TOS_0 \
kono
parents:
diff changeset
251 OP_lit3 OP_lit3 OP_gt ASSERT_TOS_0 \
kono
parents:
diff changeset
252 OP_lit6 OP_lit3 OP_gt ASSERT_TOS_NON0 \
kono
parents:
diff changeset
253 OP_const1s(-6) OP_lit1 OP_shr OP_lit0 OP_gt ASSERT_TOS_NON0 \
kono
parents:
diff changeset
254 OP_const1s(-6) OP_lit1 OP_shra OP_lit0 OP_lt ASSERT_TOS_NON0
kono
parents:
diff changeset
255
kono
parents:
diff changeset
256 #define CFI_ESCAPE_VAL_2(VALUES...) #VALUES
kono
parents:
diff changeset
257 #define CFI_ESCAPE_VAL_1(VALUES...) CFI_ESCAPE_VAL_2(VALUES)
kono
parents:
diff changeset
258 #define CFI_ESCAPE_VAL(VALUES...) CFI_ESCAPE_VAL_1(VALUES)
kono
parents:
diff changeset
259 #define CFI_ESCAPE do { } while (0)
kono
parents:
diff changeset
260 #define CFI_ARCH_PROGRAM OP_nop_termination
kono
parents:
diff changeset
261 #ifdef __GCC_HAVE_DWARF2_CFI_ASM
kono
parents:
diff changeset
262 #if defined (__x86_64__)
kono
parents:
diff changeset
263 #undef CFI_ESCAPE
kono
parents:
diff changeset
264 #undef CFI_ARCH_PROGRAM
kono
parents:
diff changeset
265 #define CFI_ARCH_PROGRAM CFI_PROGRAM OP_lit8 OP_minus OP_nop_termination
kono
parents:
diff changeset
266 unsigned char cfi_arch_program[] = { CFI_ARCH_PROGRAM };
kono
parents:
diff changeset
267 extern char verify_it[sizeof (cfi_arch_program) - 0x80 < 0x3f80 ? 1 : -1];
kono
parents:
diff changeset
268 /* DW_CFA_expression %rip, uleb128(l2-l1), l1: program DW_OP_lit8 DW_OP_minus DW_OP_nop l2: */
kono
parents:
diff changeset
269 #define CFI_ESCAPE \
kono
parents:
diff changeset
270 asm volatile (".cfi_escape 0x10, 0x10, (%P0&0x7f)+0x80, %P0>>7, " \
kono
parents:
diff changeset
271 CFI_ESCAPE_VAL (CFI_ARCH_PROGRAM) \
kono
parents:
diff changeset
272 : : "i" (sizeof (cfi_arch_program)))
kono
parents:
diff changeset
273 #elif defined (__i386__)
kono
parents:
diff changeset
274 #undef CFI_ESCAPE
kono
parents:
diff changeset
275 #undef CFI_ARCH_PROGRAM
kono
parents:
diff changeset
276 #define CFI_ARCH_PROGRAM CFI_PROGRAM OP_lit4 OP_minus OP_nop_termination
kono
parents:
diff changeset
277 unsigned char cfi_arch_program[] = { CFI_ARCH_PROGRAM };
kono
parents:
diff changeset
278 extern char verify_it[sizeof (cfi_arch_program) - 0x80 < 0x3f80 ? 1 : -1];
kono
parents:
diff changeset
279 /* DW_CFA_expression %eip, uleb128(l2-l1), l1: program DW_OP_lit4 DW_OP_minus DW_OP_nop l2: */
kono
parents:
diff changeset
280 #define CFI_ESCAPE \
kono
parents:
diff changeset
281 asm volatile (".cfi_escape 0x10, 8, (%P0&0x7f)+0x80, %P0>>7, " \
kono
parents:
diff changeset
282 CFI_ESCAPE_VAL (CFI_ARCH_PROGRAM) \
kono
parents:
diff changeset
283 : : "i" (sizeof (cfi_arch_program)))
kono
parents:
diff changeset
284 #endif
kono
parents:
diff changeset
285 #endif
kono
parents:
diff changeset
286 static _Unwind_Reason_Code
kono
parents:
diff changeset
287 force_unwind_stop (int version, _Unwind_Action actions,
kono
parents:
diff changeset
288 _Unwind_Exception_Class exc_class,
kono
parents:
diff changeset
289 struct _Unwind_Exception *exc_obj,
kono
parents:
diff changeset
290 struct _Unwind_Context *context,
kono
parents:
diff changeset
291 void *stop_parameter)
kono
parents:
diff changeset
292 {
kono
parents:
diff changeset
293 if (actions & _UA_END_OF_STACK)
kono
parents:
diff changeset
294 abort ();
kono
parents:
diff changeset
295 return _URC_NO_REASON;
kono
parents:
diff changeset
296 }
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 static void force_unwind ()
kono
parents:
diff changeset
299 {
kono
parents:
diff changeset
300 struct _Unwind_Exception *exc = malloc (sizeof (*exc));
kono
parents:
diff changeset
301 memset (&exc->exception_class, 0, sizeof (exc->exception_class));
kono
parents:
diff changeset
302 exc->exception_cleanup = 0;
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 #ifndef __USING_SJLJ_EXCEPTIONS__
kono
parents:
diff changeset
305 _Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
kono
parents:
diff changeset
306 #else
kono
parents:
diff changeset
307 _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
kono
parents:
diff changeset
308 #endif
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 abort ();
kono
parents:
diff changeset
311 }
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 static void handler (void *p __attribute__((unused)))
kono
parents:
diff changeset
314 {
kono
parents:
diff changeset
315 exit (0);
kono
parents:
diff changeset
316 }
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 __attribute__((noinline)) static void callme ()
kono
parents:
diff changeset
319 {
kono
parents:
diff changeset
320 CFI_ESCAPE;
kono
parents:
diff changeset
321 force_unwind ();
kono
parents:
diff changeset
322 }
kono
parents:
diff changeset
323
kono
parents:
diff changeset
324 __attribute__((noinline)) static void doit ()
kono
parents:
diff changeset
325 {
kono
parents:
diff changeset
326 char dummy __attribute__((cleanup (handler)));
kono
parents:
diff changeset
327 callme ();
kono
parents:
diff changeset
328 }
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 int main()
kono
parents:
diff changeset
331 {
kono
parents:
diff changeset
332 doit ();
kono
parents:
diff changeset
333 abort ();
kono
parents:
diff changeset
334 }