| /* PR middle-end/22127 */ |
| /* Testcase by <akr@m17n.org> */ |
| |
| /* { dg-do run { target *-*-solaris2.* } } */ |
| /* { dg-require-effective-target ilp32 } */ |
| /* { dg-options "-O" } */ |
| |
| typedef unsigned int size_t; |
| extern int printf(const char *, ...); |
| typedef unsigned char uint8_t; |
| typedef unsigned int uint32_t; |
| typedef unsigned int uint_t; |
| typedef char *caddr_t; |
| typedef int greg_t; |
| typedef greg_t gregset_t[19]; |
| struct rwindow { |
| greg_t rw_local[8]; |
| greg_t rw_in[8]; |
| }; |
| typedef struct gwindows { |
| int wbcnt; |
| greg_t *spbuf[31]; |
| struct rwindow wbuf[31]; |
| } gwindows_t; |
| struct fpu { |
| union { |
| uint32_t fpu_regs[32]; |
| double fpu_dregs[16]; |
| } fpu_fr; |
| struct fq *fpu_q; |
| uint32_t fpu_fsr; |
| uint8_t fpu_qcnt; |
| uint8_t fpu_q_entrysize; |
| uint8_t fpu_en; |
| }; |
| typedef struct fpu fpregset_t; |
| typedef struct { |
| unsigned int xrs_id; |
| caddr_t xrs_ptr; |
| } xrs_t; |
| typedef struct { |
| gregset_t gregs; |
| gwindows_t *gwins; |
| fpregset_t fpregs; |
| xrs_t xrs; |
| long filler[19]; |
| } mcontext_t; |
| typedef struct { |
| unsigned int __sigbits[4]; |
| } sigset_t; |
| typedef struct sigaltstack { |
| void *ss_sp; |
| size_t ss_size; |
| int ss_flags; |
| } stack_t; |
| typedef struct ucontext ucontext_t; |
| struct ucontext { |
| uint_t uc_flags; |
| ucontext_t *uc_link; |
| sigset_t uc_sigmask; |
| stack_t uc_stack; |
| mcontext_t uc_mcontext; |
| long uc_filler[23]; |
| }; |
| extern int getcontext(ucontext_t *); |
| extern int setcontext(const ucontext_t *); |
| |
| int flag; |
| ucontext_t cont; |
| int pad[100]; |
| typedef void (*fun_t)(int); |
| fun_t p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12; |
| |
| int global; |
| |
| extern void abort(void); |
| |
| void h1(int v) |
| { |
| global = v; |
| } |
| |
| void h2(int v) |
| { |
| if (v != 1) |
| abort(); |
| } |
| |
| void f(void) |
| { |
| flag = 1; |
| setcontext(&cont); |
| } |
| |
| int g(void) |
| { |
| int ret; |
| |
| flag = 0; |
| getcontext(&cont); |
| ret = flag; |
| if (ret == 0) { |
| h1 (flag); |
| p0 = p1 = p2 = p3 = p4 = p5 = p6 = p7 = p8 = h1; |
| f(); |
| p0(ret); p1(ret); p2(ret); p3(ret); p4(ret); p5(ret); p6(ret); p7(ret); p8(ret); |
| } |
| else { |
| h2 (flag); |
| } |
| return ret; |
| } |
| |
| int main(void) |
| { |
| g(); |
| return 0; |
| } |