diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/epiphany/epiphany.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/epiphany/isr-arg.c | 9 |
4 files changed, 34 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 61a7b30..4532bd5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-05-07 Joern Rennecke <joern.rennecke@embecosm.com> + + * config/epiphany/epiphany.c (epiphany_handle_interrupt_attribute): + Emit an error when the function has arguments. + 2014-05-07 Thomas Schwinge <thomas@codesourcery.com> * cfgloop.h (unswitch_loops): Remove. diff --git a/gcc/config/epiphany/epiphany.c b/gcc/config/epiphany/epiphany.c index f3955b9..ebe6f05 100644 --- a/gcc/config/epiphany/epiphany.c +++ b/gcc/config/epiphany/epiphany.c @@ -450,15 +450,28 @@ static const struct attribute_spec epiphany_attribute_table[] = /* Handle an "interrupt" attribute; arguments as in struct attribute_spec.handler. */ static tree -epiphany_handle_interrupt_attribute (tree *node ATTRIBUTE_UNUSED, - tree name, tree args, +epiphany_handle_interrupt_attribute (tree *node, tree name, tree args, int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) { tree value; if (!args) - return NULL_TREE; + { + gcc_assert (DECL_P (*node)); + tree t = TREE_TYPE (*node); + if (TREE_CODE (t) != FUNCTION_TYPE) + warning (OPT_Wattributes, "%qE attribute only applies to functions", + name); + /* Argument handling and the stack layout for interrupt handlers + don't mix. It makes no sense in the first place, so emit an + error for this. */ + else if (TYPE_ARG_TYPES (t) + && TREE_VALUE (TYPE_ARG_TYPES (t)) != void_type_node) + error_at (DECL_SOURCE_LOCATION (*node), + "interrupt handlers cannot have arguments"); + return NULL_TREE; + } value = TREE_VALUE (args); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ea89f06..2925e32 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-05-07 Joern Rennecke <joern.rennecke@embecosm.com> + + * gcc.target/epiphany/isr-arg.c: New file. + 2014-05-07 Evgeny Stupachenko <evstupac@gmail.com> PR tree-optimization/52252 diff --git a/gcc/testsuite/gcc.target/epiphany/isr-arg.c b/gcc/testsuite/gcc.target/epiphany/isr-arg.c new file mode 100644 index 0000000..5a8acc6 --- /dev/null +++ b/gcc/testsuite/gcc.target/epiphany/isr-arg.c @@ -0,0 +1,9 @@ +int *p; + +void __attribute__((interrupt)) +isr (int signum) /* { dg-error "interrupt handlers cannot have arguments" } */ +{ + *p = 1; + return; +} + |