OSDN Git Service

PR target/31331
authoraesok <aesok@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 4 Jul 2007 21:10:28 +0000 (21:10 +0000)
committeraesok <aesok@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 4 Jul 2007 21:10:28 +0000 (21:10 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@126337 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/avr/avr.c

index 55a0a5a..60fb88f 100644 (file)
@@ -1,3 +1,12 @@
+2007-07-04 Anatoly Sokolov <aesok@post.ru>
+
+       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-04  Joseph Myers  <joseph@codesourcery.com>
 
        * target-def.h (TARGET_INITIALIZER): Remove trailing whitespace
index d9dec88..86c834b 100644 (file)
@@ -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);
@@ -400,7 +401,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;
 }
 
@@ -4585,7 +4586,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 }
 };
 
@@ -4677,6 +4678,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.  */