/* PR middle-end/22127 */ /* Testcase by */ /* { 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; }