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