diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ca4bcf89c6e4ffacac5b35eb2ebb6689f959aa7c..88e4cc887a0cd9e4740f994244e17cda1dcf171f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-05-08 Hans-Peter Nilsson <hp@axis.com> + + PR target/53272 + * gcc.dg/torture/pr53272-1.c, gcc.dg/torture/pr53272-2.c: New test. + 2012-05-08 Richard Guenther <rguenther@suse.de> * gcc.dg/fold-bitand-4.c: New testcase. diff --git a/gcc/testsuite/gcc.dg/torture/pr53272-1.c b/gcc/testsuite/gcc.dg/torture/pr53272-1.c new file mode 100644 index 0000000000000000000000000000000000000000..a8fc91cb5b3d7f7be00fcfd47d3c5e8cbe2580de --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr53272-1.c @@ -0,0 +1,39 @@ +/* { dg-do run } */ +/* { dg-additional-sources "pr53272-2.c" } */ +struct rtc_class_ops { + int (*f)(void *, unsigned int enabled); +}; + +struct rtc_device +{ + void *owner; + const struct rtc_class_ops *ops; + int ops_lock; +}; + +__attribute__ ((__noinline__, __noclone__)) +extern int foo(void *); +__attribute__ ((__noinline__, __noclone__)) +extern void foobar(void *); + +__attribute__ ((__noinline__, __noclone__)) +int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled) +{ + int err; + asm volatile (""); + + err = foo(&rtc->ops_lock); + + if (err) + return err; + + if (!rtc->ops) + err = -19; + else if (!rtc->ops->f) + err = -22; + else + err = rtc->ops->f(rtc->owner, enabled); + + foobar(&rtc->ops_lock); + return err; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr53272-2.c b/gcc/testsuite/gcc.dg/torture/pr53272-2.c new file mode 100644 index 0000000000000000000000000000000000000000..f5065a785b747daf0ce78f0a6a208f078b708e01 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr53272-2.c @@ -0,0 +1,39 @@ +__attribute__ ((__noinline__, __noclone__)) +int foo(void *x) +{ + asm (""); + return *(int *) x != 42; +} + +__attribute__ ((__noinline__, __noclone__)) +void foobar(void *x) +{ + asm (""); + if (foo(x)) + __builtin_abort(); +} + +struct rtc_class_ops { + int (*f)(void *, unsigned int enabled); +}; + +struct rtc_device +{ + void *owner; + struct rtc_class_ops *ops; + int ops_lock; +}; + +extern __attribute__ ((__noinline__, __noclone__)) +int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int); + +int main(void) +{ + struct rtc_class_ops ops = {(void *) 0}; + struct rtc_device dev1 = {0, &ops, 42}; + + if (rtc_update_irq_enable (&dev1, 1) != -22) + __builtin_abort (); + + __builtin_exit (0); +}