analyzer: fix ICE on certain longjmp calls [PR109094]
[platform/upstream/gcc.git] / gcc / testsuite / gcc.dg / analyzer / setjmp-pr109094.c
1 /* Reduced from an ICE seen in qemu's target/i386/tcg/translate.c  */
2
3 typedef long int __jmp_buf[8];
4 struct __jmp_buf_tag {
5   __jmp_buf __jmpbuf;
6 };
7 typedef struct __jmp_buf_tag sigjmp_buf[1];
8
9 extern int __sigsetjmp(sigjmp_buf env, int savesigs);
10 extern void siglongjmp(sigjmp_buf env, int val);
11
12 typedef struct DisasContextBase {
13   int num_insns;
14 } DisasContextBase;
15
16 typedef struct DisasContext {
17   DisasContextBase base;
18   sigjmp_buf jmpbuf;
19 } DisasContext;
20
21 extern int translator_ldub(DisasContextBase *base, int);
22
23 int advance_pc(DisasContext *s, int num_bytes) {
24   if (s->base.num_insns > 1) {
25     siglongjmp(s->jmpbuf, 2);
26   }
27   return 0;
28 }
29
30 static inline int x86_ldub_code(DisasContext *s) {
31   return translator_ldub(&s->base, advance_pc(s, 1));
32 }
33
34 static void disas_insn(DisasContext *s) {
35   int b;
36   __sigsetjmp(s->jmpbuf, 0);
37   b = x86_ldub_code(s);
38 }