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