diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 61a7b30c34a..4532bd52262 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-05-07 Joern Rennecke + + * config/epiphany/epiphany.c (epiphany_handle_interrupt_attribute): + Emit an error when the function has arguments. + 2014-05-07 Thomas Schwinge * cfgloop.h (unswitch_loops): Remove. diff --git a/gcc/config/epiphany/epiphany.c b/gcc/config/epiphany/epiphany.c index f3955b916e9..ebe6f05302d 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 ea89f061480..2925e328728 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-05-07 Joern Rennecke + + * gcc.target/epiphany/isr-arg.c: New file. + 2014-05-07 Evgeny Stupachenko 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 00000000000..5a8acc63518 --- /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; +} +