| /* PR 64878 */ |
| /* { dg-options "-O2" } */ |
| /* { dg-do run } */ |
| |
| struct A { int a1; }; |
| struct B { char *b1; int b2; int b3; }; |
| struct C { char *c1; int c2; struct B *c3; }; |
| extern struct A *f1 (char *s); |
| static struct A *f2 (struct C *x); |
| __attribute__ ((noinline, noclone)) int f3 (struct A *x, struct A *z) { asm volatile ("" : : "g" (x), "g" (z) : "memory"); return 0; } |
| __attribute__ ((noinline, noclone)) void f4 (struct A *x, char *y, struct A *z) { asm volatile ("" : : "g" (x), "g" (z), "g" (y) : "memory"); } |
| __attribute__ ((noinline, noclone)) struct B *f5 (void) { static char b[32]; static struct B f3 = { b, 0, 32 }; return &f3; } |
| __attribute__ ((noinline, noclone)) int f6 (struct B *p, char *w, int z) { asm volatile ("" : : "g" (p), "g" (w), "g" (z) : "memory"); return 0; } |
| __attribute__ ((noinline, noclone)) void f7 (struct B *p) { asm volatile ("" : : "g" (p) : "memory"); } |
| __attribute__ ((noinline, noclone)) void f8 (struct B *p) { asm volatile ("" : : "g" (p) : "memory"); } |
| __attribute__ ((noinline, noclone)) void f9 (struct A *x) { asm volatile ("" : : "g" (x) : "memory"); } |
| __attribute__ ((noinline, noclone)) struct A *f10 (void) { static struct A j; asm volatile ("" : : : "memory"); return &j; } |
| __attribute__ ((noinline, noclone)) struct A *f11 (void) { static struct A j; asm volatile ("" : : : "memory"); return &j; } |
| __attribute__ ((noinline, noclone)) struct A *f12 (int b) { static struct A j; asm volatile ("" : : "g" (b) : "memory"); return &j; } |
| __attribute__ ((noinline, noclone)) struct A *f13 (int i) { static struct A j; asm volatile ("" : : "g" (i) : "memory"); return &j; } |
| __attribute__ ((noinline, noclone)) struct A *f14 (double d) { static struct A j; asm volatile ("" : : "g" (&d) : "memory"); return &j; } |
| __attribute__ ((noinline, noclone)) struct A *f15 (char *s) { static struct A j; asm volatile ("" : : "g" (s) : "memory"); return &j; } |
| char *t = "0123456789abcdef"; |
| char *u = "0123456789.+-e"; |
| |
| __attribute__ ((noinline, noclone)) struct A * |
| f1 (char *s) |
| { |
| struct C f; |
| struct A *o; |
| f.c1 = s; |
| f.c2 = 0; |
| f.c3 = f5 (); |
| o = f2 (&f); |
| f8 (f.c3); |
| return o; |
| } |
| |
| static struct A * |
| f2 (struct C *x) |
| { |
| int a, b, e = 0; |
| struct A *f = 0, *o; |
| char *g = 0; |
| char h = '\0'; |
| int i = 0, j = 0; |
| a = 0; |
| b = 1; |
| char c; |
| do |
| { |
| c = x->c1[x->c2]; |
| switch (a) |
| { |
| case 0: |
| if (c == ' ') |
| x->c2++; |
| else if (c == '/') |
| { |
| a = 4; |
| j = x->c2++; |
| } |
| else |
| a = b; |
| break; |
| case 1: |
| switch (c) |
| { |
| case '{': |
| a = 0; |
| b = 15; |
| f = f10 (); |
| x->c2++; |
| break; |
| case '[': |
| a = 0; |
| b = 13; |
| f = f11 (); |
| x->c2++; |
| break; |
| case 'N': |
| case 'n': |
| a = 3; |
| j = x->c2++; |
| break; |
| case '"': |
| case '\'': |
| h = c; |
| f7 (x->c3); |
| a = 8; |
| j = ++x->c2; |
| break; |
| case 'T': |
| case 't': |
| case 'F': |
| case 'f': |
| a = 11; |
| j = x->c2++; |
| break; |
| case '0' ... '9': |
| case '-': |
| i = 0; |
| a = 12; |
| j = x->c2++; |
| break; |
| default: |
| e = 1; |
| goto out; |
| } |
| break; |
| case 2: |
| goto out; |
| case 3: |
| if (__builtin_strncmp ("null", x->c1 + j, x->c2 - j)) |
| { |
| e = 2; |
| goto out; |
| } |
| if (x->c2 - j == 4) |
| { |
| f = 0; |
| b = 2; |
| a = 0; |
| } |
| else |
| x->c2++; |
| break; |
| case 4: |
| if (c == '*') |
| a = 5; |
| else if (c == '/') |
| a = 6; |
| else |
| { |
| e = 8; |
| goto out; |
| } |
| x->c2++; |
| break; |
| case 5: |
| if (c == '*') |
| a = 7; |
| x->c2++; |
| break; |
| case 6: |
| if (c == '\n') |
| a = 0; |
| x->c2++; |
| break; |
| case 7: |
| if (c == '/') |
| a = 0; |
| else |
| a = 5; |
| x->c2++; |
| break; |
| case 8: |
| if (c == h) |
| { |
| f6 (x->c3, x->c1 + j, x->c2 - j); |
| f = f15 (x->c3->b1); |
| b = 2; |
| a = 0; |
| } |
| else if (c == '\\') |
| { |
| b = 8; |
| a = 9; |
| } |
| x->c2++; |
| break; |
| case 9: |
| switch (c) |
| { |
| case '"': |
| case '\\': |
| f6 (x->c3, x->c1 + j, x->c2 - j - 1); |
| j = x->c2++; |
| a = b; |
| break; |
| case 'b': |
| case 'n': |
| case 'r': |
| case 't': |
| f6 (x->c3, x->c1 + j, x->c2 - j - 1); |
| if (c == 'b') |
| f6 (x->c3, "\b", 1); |
| else if (c == 'n') |
| f6 (x->c3, "\n", 1); |
| else if (c == 'r') |
| f6 (x->c3, "\r", 1); |
| else if (c == 't') |
| f6 (x->c3, "\t", 1); |
| j = ++x->c2; |
| a = b; |
| break; |
| case 'u': |
| f6 (x->c3, x->c1 + j, x->c2 - j - 1); |
| j = ++x->c2; |
| a = 10; |
| break; |
| default: |
| e = 7; |
| goto out; |
| } |
| break; |
| case 10: |
| if (__builtin_strchr (t, c)) |
| { |
| x->c2++; |
| if (x->c2 - j == 4) |
| { |
| unsigned char w[3]; |
| unsigned int s = |
| (((x->c1[j] <= '9') ? x->c1[j] - '0' : (x->c1[j] & 7) + 9) << 12) |
| + (((x->c1[j + 1] <= '9') ? x->c1[j + 1] - '0' : (x->c1[j + 1] & 7) + 9) << 8) |
| + (((x->c1[j + 2] <= '9') ? x->c1[j + 2] - '0' : (x->c1[j + 2] & 7) + 9) << 4) |
| + ((x->c1[j + 3] <= '9') ? x->c1[j + 3] - '0' : (x->c1[j + 3] & 7) + 9); |
| if (s < 0x80) |
| { |
| w[0] = s; |
| f6 (x->c3, (char *) w, 1); |
| } |
| else if (s < 0x800) |
| { |
| w[0] = 0xc0 | (s >> 6); |
| w[1] = 0x80 | (s & 0x3f); |
| f6 (x->c3, (char *) w, 2); |
| } |
| else |
| { |
| w[0] = 0x0 | (s >> 12); |
| w[1] = 0x80 | ((s >> 6) & 0x3f); |
| w[2] = 0x80 | (s & 0x3f); |
| f6 (x->c3, (char *) w, 3); |
| } |
| j = x->c2; |
| a = b; |
| } |
| } |
| else |
| { |
| e = 7; |
| goto out; |
| } |
| break; |
| case 11: |
| if (__builtin_strncmp ("true", x->c1 + j, x->c2 - j) == 0) |
| { |
| if (x->c2 - j == 4) |
| { |
| f = f12 (1); |
| b = 2; |
| a = 0; |
| } |
| else |
| x->c2++; |
| } |
| else if (__builtin_strncmp ("false", x->c1 + j, x->c2 - j) == 0) |
| { |
| if (x->c2 - j == 5) |
| { |
| f = f12 (0); |
| b = 2; |
| a = 0; |
| } |
| else |
| x->c2++; |
| } |
| else |
| { |
| e = 3; |
| goto out; |
| } |
| break; |
| case 12: |
| if (!c || !__builtin_strchr (u, c)) |
| { |
| if (!i) |
| f = f13 (0); |
| else |
| f = f14 (0.0); |
| b = 2; |
| a = 0; |
| } |
| else |
| { |
| if (c == '.' || c == 'e') |
| i = 1; |
| x->c2++; |
| } |
| break; |
| case 13: |
| if (c == ']') |
| { |
| x->c2++; |
| b = 2; |
| a = 0; |
| } |
| else |
| { |
| o = f2 (x); |
| #if __SIZEOF_POINTER__ == __SIZEOF_LONG__ && !__MSP430X_LARGE__ |
| if (((unsigned long) o > (unsigned long) -4000L)) |
| #else |
| if (((__UINTPTR_TYPE__) o > (__UINTPTR_TYPE__) -4000UL)) |
| #endif |
| { |
| e = 5; |
| goto out; |
| } |
| f3 (f, o); |
| b = 14; |
| a = 0; |
| } |
| break; |
| case 14: |
| if (c == ']') |
| { |
| x->c2++; |
| b = 2; |
| a = 0; |
| } |
| else if (c == ',') |
| { |
| x->c2++; |
| b = 13; |
| a = 0; |
| } |
| else |
| { |
| f9 (f); |
| e = 5; |
| goto out; |
| } |
| break; |
| case 15: |
| a = 16; |
| j = x->c2; |
| break; |
| case 16: |
| if (c == '}') |
| { |
| x->c2++; |
| b = 2; |
| a = 0; |
| } |
| else if (c == '"' || c == '\'') |
| { |
| h = c; |
| f7 (x->c3); |
| a = 17; |
| j = ++x->c2; |
| } |
| else |
| { |
| e = 6; |
| goto out; |
| } |
| break; |
| case 17: |
| if (c == h) |
| { |
| f6 (x->c3, x->c1 + j, x->c2 - j); |
| g = __builtin_strdup (x->c3->b1); |
| b = 18; |
| a = 0; |
| } |
| else if (c == '\\') |
| { |
| b = 17; |
| a = 9; |
| } |
| x->c2++; |
| break; |
| case 18: |
| if (c == ':') |
| { |
| x->c2++; |
| b = 19; |
| a = 0; |
| } |
| else |
| { |
| e = -6; |
| goto out; |
| } |
| break; |
| case 19: |
| o = f2 (x); |
| #if __SIZEOF_POINTER__ == __SIZEOF_LONG__ && !__MSP430X_LARGE__ |
| if (((unsigned long) o > (unsigned long) -4000L)) |
| #else |
| if (((__UINTPTR_TYPE__) o > (__UINTPTR_TYPE__) -4000UL)) |
| #endif |
| { |
| e = 6; |
| goto out; |
| } |
| f4 (f, g, o); |
| __builtin_free (g); |
| g = 0; |
| b = 20; |
| a = 0; |
| break; |
| case 20: |
| if (c == '}') |
| { |
| x->c2++; |
| b = 2; |
| a = 0; |
| } |
| else if (c == ',') |
| { |
| x->c2++; |
| b = 15; |
| a = 0; |
| } |
| else |
| { |
| e = 6; |
| goto out; |
| } |
| break; |
| } |
| } |
| while (c); |
| if (a != 2 && b != 2) |
| e = 9; |
| out: |
| __builtin_free (g); |
| if (e == 0) |
| return f; |
| f9 (f); |
| return 0; |
| } |
| |
| int |
| main () |
| { |
| asm volatile ("" : : : "memory"); |
| struct A *r = f1 ("{ \"id\": null, \"blahah\": \"foobarbazbar\", \"barbar\": { \"barbarbarba\":" |
| "\"abcdefgh\", \"ijklmnopqr\": \"stuvwxyzabcdefghijklmnopqrstuv\", \"xyzxyz\":" |
| " [ \"1\" ] } }"); |
| if (!r) |
| __builtin_abort (); |
| return 0; |
| } |