From: Anatoly Sokolov Date: Sat, 7 Jul 2007 19:39:36 +0000 (+0400) Subject: re PR target/31331 ([avr] ICE on function attribute syntax for main()) X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=19eec6da1d2e03742592eacb9af46b8d26246794;p=thirdparty%2Fgcc.git re PR target/31331 ([avr] ICE on function attribute syntax for main()) PR target/31331 * config/avr/avr.c (avr_naked_function_p): Handle receiving a type rather than a decl. (avr_attribute_table): Make "naked" attribute apply to function types rather than to decls. (avr_handle_fntype_attribute): New function. From-SVN: r126447 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4475753bb8d2..bbdac56ab70a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2007-07-07 Anatoly Sokolov + + PR target/31331 + * config/avr/avr.c (avr_naked_function_p): Handle receiving a type + rather than a decl. + (avr_attribute_table): Make "naked" attribute apply to function types + rather than to decls. + (avr_handle_fntype_attribute): New function. + 2007-07-07 Uros Bizjak PR target/32660 diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c index 054831b14617..6833f3558c08 100644 --- a/gcc/config/avr/avr.c +++ b/gcc/config/avr/avr.c @@ -62,6 +62,7 @@ static RTX_CODE compare_condition (rtx insn); static int compare_sign_p (rtx insn); static tree avr_handle_progmem_attribute (tree *, tree, tree, int, bool *); static tree avr_handle_fndecl_attribute (tree *, tree, tree, int, bool *); +static tree avr_handle_fntype_attribute (tree *, tree, tree, int, bool *); const struct attribute_spec avr_attribute_table[]; static bool avr_assemble_integer (rtx, unsigned int, int); static void avr_file_start (void); @@ -361,7 +362,7 @@ avr_naked_function_p (tree func) gcc_assert (TREE_CODE (func) == FUNCTION_DECL); - a = lookup_attribute ("naked", DECL_ATTRIBUTES (func)); + a = lookup_attribute ("naked", TYPE_ATTRIBUTES (TREE_TYPE (func))); return a != NULL_TREE; } @@ -4617,7 +4618,7 @@ const struct attribute_spec avr_attribute_table[] = { "progmem", 0, 0, false, false, false, avr_handle_progmem_attribute }, { "signal", 0, 0, true, false, false, avr_handle_fndecl_attribute }, { "interrupt", 0, 0, true, false, false, avr_handle_fndecl_attribute }, - { "naked", 0, 0, true, false, false, avr_handle_fndecl_attribute }, + { "naked", 0, 0, false, true, true, avr_handle_fntype_attribute }, { NULL, 0, 0, false, false, false, NULL } }; @@ -4709,6 +4710,22 @@ avr_handle_fndecl_attribute (tree *node, tree name, return NULL_TREE; } +static tree +avr_handle_fntype_attribute (tree *node, tree name, + tree args ATTRIBUTE_UNUSED, + int flags ATTRIBUTE_UNUSED, + bool *no_add_attrs) +{ + if (TREE_CODE (*node) != FUNCTION_TYPE) + { + warning (OPT_Wattributes, "%qs attribute only applies to functions", + IDENTIFIER_POINTER (name)); + *no_add_attrs = true; + } + + return NULL_TREE; +} + /* Look for attribute `progmem' in DECL if found return 1, otherwise 0. */