60 lines
1.1 KiB
C
60 lines
1.1 KiB
C
/* { dg-do compile { target fpic } } */
|
|
/* { dg-options "-fPIC -g -O2 -w" } */
|
|
/* var-tracking failed to clobber the reg holding v at the asm insn,
|
|
so v ended up bound to an intermediate PIC expression. */
|
|
|
|
struct A { unsigned a1; char a2[15]; };
|
|
struct B { long b1; unsigned char b2; long b3; };
|
|
struct C { void *c1; unsigned c2; unsigned c3; };
|
|
|
|
static struct A v1;
|
|
struct A *const v2 = &v1;
|
|
|
|
static inline
|
|
int foo (void)
|
|
{
|
|
int *v;
|
|
__asm__ __volatile__ ("" : "=r" (v));
|
|
return v[1];
|
|
}
|
|
|
|
static void
|
|
bar (struct C *x)
|
|
{
|
|
if (x->c2 == x->c3 && x->c1)
|
|
f1 (foo (), x->c1, x->c3 * sizeof (x->c1[0]));
|
|
}
|
|
|
|
void
|
|
baz (struct B *y)
|
|
{
|
|
int i;
|
|
const char *j;
|
|
char *k;
|
|
char x[64];
|
|
for (i = 0; i < sizeof (struct B); i++, y)
|
|
{
|
|
switch (y->b2)
|
|
{
|
|
case 0x20:
|
|
if (__builtin_strchr (j, '='))
|
|
continue;
|
|
}
|
|
switch (y->b2)
|
|
{
|
|
case 0x80:
|
|
bar (&x);
|
|
f2 (y->b3);
|
|
case 0x2e:
|
|
case 0x4e:
|
|
break;
|
|
default:
|
|
if (v2->a1)
|
|
f2 (y->b2);
|
|
}
|
|
k[0] = '\0';
|
|
if (v2->a1)
|
|
f2 (y->b1);
|
|
}
|
|
}
|