blob: cd468c56288baa44a5170aeb29551995b14e209c [file] [log] [blame]
/* 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;
}