Hi, I have wrote a testcase that reproduces argument overwriting bug during arm code generation.
I wrote this testcase with the help of Mikael Pettersson. If some format is not proper to run in gcc testsuite framework, please correct me. Please refer to the following bugzilla link for details: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65358 Honggyu --- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.target/arm/pr65358.c | 34 ++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 gcc/testsuite/gcc.target/arm/pr65358.c diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5302dbd..9acd12a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-03-13 Honggyu Kim <hong.gyu....@lge.com> + + PR target/65235 + * gcc.target/arm/pr65358.c: New test for sibcall argument passing bug. + 2015-03-12 Kyrylo Tkachov <kyrylo.tkac...@arm.com> PR rtl-optimization/65235 diff --git a/gcc/testsuite/gcc.target/arm/pr65358.c b/gcc/testsuite/gcc.target/arm/pr65358.c new file mode 100644 index 0000000..d663dcf --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr65358.c @@ -0,0 +1,34 @@ +/* PR target/65358 */ +/* { dg-do compile { target arm*-*-* } } */ +/* { dg-options "-O2" } */ + +struct pack +{ + int fine; + int victim; + int killer; +}; + +int __attribute__ ((__noinline__, __noclone__)) +bar (int a, int b, struct pack p) +{ + if (a != 20 || b != 30) + __builtin_abort (); + if (p.fine != 40 || p.victim != 50 || p.killer != 60) + __builtin_abort (); + return 0; +} + +int __attribute__ ((__noinline__, __noclone__)) +foo (int arg1, int arg2, int arg3, struct pack p) +{ + return bar (arg2, arg3, p); +} + +int main (void) +{ + struct pack p = { 40, 50, 60 }; + + (void) foo (10, 20, 30, p); + return 0; +} -- 1.7.9.5