190075Sobrien/* Functions dealing with attribute handling, used by most front ends.
290075Sobrien   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
3169689Skan   2002, 2003, 2004, 2005 Free Software Foundation, Inc.
490075Sobrien
590075SobrienThis file is part of GCC.
690075Sobrien
790075SobrienGCC is free software; you can redistribute it and/or modify it under
890075Sobrienthe terms of the GNU General Public License as published by the Free
990075SobrienSoftware Foundation; either version 2, or (at your option) any later
1090075Sobrienversion.
1190075Sobrien
1290075SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY
1390075SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or
1490075SobrienFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1590075Sobrienfor more details.
1690075Sobrien
1790075SobrienYou should have received a copy of the GNU General Public License
1890075Sobrienalong with GCC; see the file COPYING.  If not, write to the Free
19169689SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20169689Skan02110-1301, USA.  */
2190075Sobrien
2290075Sobrien#include "config.h"
2390075Sobrien#include "system.h"
24132718Skan#include "coretypes.h"
25132718Skan#include "tm.h"
2690075Sobrien#include "tree.h"
2790075Sobrien#include "flags.h"
2890075Sobrien#include "toplev.h"
2990075Sobrien#include "output.h"
3090075Sobrien#include "rtl.h"
3190075Sobrien#include "ggc.h"
3290075Sobrien#include "tm_p.h"
3390075Sobrien#include "cpplib.h"
3490075Sobrien#include "target.h"
35117395Skan#include "langhooks.h"
3690075Sobrien
37132718Skanstatic void init_attributes (void);
3890075Sobrien
39117395Skan/* Table of the tables of attributes (common, language, format, machine)
4090075Sobrien   searched.  */
4190075Sobrienstatic const struct attribute_spec *attribute_tables[4];
4290075Sobrien
4390075Sobrienstatic bool attributes_initialized = false;
4490075Sobrien
4590075Sobrien/* Default empty table of attributes.  */
4690075Sobrienstatic const struct attribute_spec empty_attribute_table[] =
4790075Sobrien{
4890075Sobrien  { NULL, 0, 0, false, false, false, NULL }
4990075Sobrien};
5090075Sobrien
5190075Sobrien/* Initialize attribute tables, and make some sanity checks
5290075Sobrien   if --enable-checking.  */
5390075Sobrien
5490075Sobrienstatic void
55132718Skaninit_attributes (void)
5690075Sobrien{
57117395Skan  size_t i;
5890075Sobrien
59117395Skan  attribute_tables[0] = lang_hooks.common_attribute_table;
60117395Skan  attribute_tables[1] = lang_hooks.attribute_table;
61117395Skan  attribute_tables[2] = lang_hooks.format_attribute_table;
6290075Sobrien  attribute_tables[3] = targetm.attribute_table;
6390075Sobrien
64117395Skan  /* Translate NULL pointers to pointers to the empty table.  */
65117395Skan  for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
66117395Skan    if (attribute_tables[i] == NULL)
67117395Skan      attribute_tables[i] = empty_attribute_table;
68117395Skan
6990075Sobrien#ifdef ENABLE_CHECKING
7090075Sobrien  /* Make some sanity checks on the attribute tables.  */
71117395Skan  for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
7290075Sobrien    {
7390075Sobrien      int j;
7490075Sobrien
7590075Sobrien      for (j = 0; attribute_tables[i][j].name != NULL; j++)
7690075Sobrien	{
7790075Sobrien	  /* The name must not begin and end with __.  */
7890075Sobrien	  const char *name = attribute_tables[i][j].name;
7990075Sobrien	  int len = strlen (name);
80169689Skan
81169689Skan	  gcc_assert (!(name[0] == '_' && name[1] == '_'
82169689Skan			&& name[len - 1] == '_' && name[len - 2] == '_'));
83169689Skan
8490075Sobrien	  /* The minimum and maximum lengths must be consistent.  */
85169689Skan	  gcc_assert (attribute_tables[i][j].min_length >= 0);
86169689Skan
87169689Skan	  gcc_assert (attribute_tables[i][j].max_length == -1
88169689Skan		      || (attribute_tables[i][j].max_length
89169689Skan			  >= attribute_tables[i][j].min_length));
90169689Skan
9190075Sobrien	  /* An attribute cannot require both a DECL and a TYPE.  */
92169689Skan	  gcc_assert (!attribute_tables[i][j].decl_required
93169689Skan		      || !attribute_tables[i][j].type_required);
94169689Skan
9590075Sobrien	  /* If an attribute requires a function type, in particular
9690075Sobrien	     it requires a type.  */
97169689Skan	  gcc_assert (!attribute_tables[i][j].function_type_required
98169689Skan		      || attribute_tables[i][j].type_required);
9990075Sobrien	}
10090075Sobrien    }
10190075Sobrien
10290075Sobrien  /* Check that each name occurs just once in each table.  */
103117395Skan  for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
10490075Sobrien    {
10590075Sobrien      int j, k;
10690075Sobrien      for (j = 0; attribute_tables[i][j].name != NULL; j++)
10790075Sobrien	for (k = j + 1; attribute_tables[i][k].name != NULL; k++)
108169689Skan	  gcc_assert (strcmp (attribute_tables[i][j].name,
109169689Skan			      attribute_tables[i][k].name));
11090075Sobrien    }
11190075Sobrien  /* Check that no name occurs in more than one table.  */
112117395Skan  for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
11390075Sobrien    {
114117395Skan      size_t j, k, l;
11590075Sobrien
116117395Skan      for (j = i + 1; j < ARRAY_SIZE (attribute_tables); j++)
11790075Sobrien	for (k = 0; attribute_tables[i][k].name != NULL; k++)
11890075Sobrien	  for (l = 0; attribute_tables[j][l].name != NULL; l++)
119169689Skan	    gcc_assert (strcmp (attribute_tables[i][k].name,
120169689Skan				attribute_tables[j][l].name));
12190075Sobrien    }
12290075Sobrien#endif
12390075Sobrien
12490075Sobrien  attributes_initialized = true;
12590075Sobrien}
12690075Sobrien
12790075Sobrien/* Process the attributes listed in ATTRIBUTES and install them in *NODE,
12890075Sobrien   which is either a DECL (including a TYPE_DECL) or a TYPE.  If a DECL,
12990075Sobrien   it should be modified in place; if a TYPE, a copy should be created
13090075Sobrien   unless ATTR_FLAG_TYPE_IN_PLACE is set in FLAGS.  FLAGS gives further
13190075Sobrien   information, in the form of a bitwise OR of flags in enum attribute_flags
13290075Sobrien   from tree.h.  Depending on these flags, some attributes may be
13390075Sobrien   returned to be applied at a later stage (for example, to apply
134132718Skan   a decl attribute to the declaration rather than to its type).  */
13590075Sobrien
13690075Sobrientree
137132718Skandecl_attributes (tree *node, tree attributes, int flags)
13890075Sobrien{
13990075Sobrien  tree a;
14090075Sobrien  tree returned_attrs = NULL_TREE;
14190075Sobrien
14290075Sobrien  if (!attributes_initialized)
14390075Sobrien    init_attributes ();
14490075Sobrien
145169689Skan  targetm.insert_attributes (*node, &attributes);
14690075Sobrien
14790075Sobrien  for (a = attributes; a; a = TREE_CHAIN (a))
14890075Sobrien    {
14990075Sobrien      tree name = TREE_PURPOSE (a);
15090075Sobrien      tree args = TREE_VALUE (a);
15190075Sobrien      tree *anode = node;
15290075Sobrien      const struct attribute_spec *spec = NULL;
15390075Sobrien      bool no_add_attrs = 0;
154132718Skan      tree fn_ptr_tmp = NULL_TREE;
155117395Skan      size_t i;
15690075Sobrien
157117395Skan      for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
15890075Sobrien	{
15990075Sobrien	  int j;
16090075Sobrien
16190075Sobrien	  for (j = 0; attribute_tables[i][j].name != NULL; j++)
16290075Sobrien	    {
16390075Sobrien	      if (is_attribute_p (attribute_tables[i][j].name, name))
16490075Sobrien		{
16590075Sobrien		  spec = &attribute_tables[i][j];
16690075Sobrien		  break;
16790075Sobrien		}
16890075Sobrien	    }
16990075Sobrien	  if (spec != NULL)
17090075Sobrien	    break;
17190075Sobrien	}
17290075Sobrien
17390075Sobrien      if (spec == NULL)
17490075Sobrien	{
175169689Skan	  warning (OPT_Wattributes, "%qs attribute directive ignored",
17690075Sobrien		   IDENTIFIER_POINTER (name));
17790075Sobrien	  continue;
17890075Sobrien	}
17990075Sobrien      else if (list_length (args) < spec->min_length
18090075Sobrien	       || (spec->max_length >= 0
18190075Sobrien		   && list_length (args) > spec->max_length))
18290075Sobrien	{
183169689Skan	  error ("wrong number of arguments specified for %qs attribute",
18490075Sobrien		 IDENTIFIER_POINTER (name));
18590075Sobrien	  continue;
18690075Sobrien	}
18790075Sobrien
18890075Sobrien      if (spec->decl_required && !DECL_P (*anode))
18990075Sobrien	{
19090075Sobrien	  if (flags & ((int) ATTR_FLAG_DECL_NEXT
19190075Sobrien		       | (int) ATTR_FLAG_FUNCTION_NEXT
19290075Sobrien		       | (int) ATTR_FLAG_ARRAY_NEXT))
19390075Sobrien	    {
19490075Sobrien	      /* Pass on this attribute to be tried again.  */
19590075Sobrien	      returned_attrs = tree_cons (name, args, returned_attrs);
19690075Sobrien	      continue;
19790075Sobrien	    }
19890075Sobrien	  else
19990075Sobrien	    {
200169689Skan	      warning (OPT_Wattributes, "%qs attribute does not apply to types",
20190075Sobrien		       IDENTIFIER_POINTER (name));
20290075Sobrien	      continue;
20390075Sobrien	    }
20490075Sobrien	}
20590075Sobrien
20690075Sobrien      /* If we require a type, but were passed a decl, set up to make a
20790075Sobrien	 new type and update the one in the decl.  ATTR_FLAG_TYPE_IN_PLACE
20890075Sobrien	 would have applied if we'd been passed a type, but we cannot modify
20990075Sobrien	 the decl's type in place here.  */
21090075Sobrien      if (spec->type_required && DECL_P (*anode))
21190075Sobrien	{
21290075Sobrien	  anode = &TREE_TYPE (*anode);
21390075Sobrien	  flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
21490075Sobrien	}
21590075Sobrien
21690075Sobrien      if (spec->function_type_required && TREE_CODE (*anode) != FUNCTION_TYPE
21790075Sobrien	  && TREE_CODE (*anode) != METHOD_TYPE)
21890075Sobrien	{
21990075Sobrien	  if (TREE_CODE (*anode) == POINTER_TYPE
22090075Sobrien	      && (TREE_CODE (TREE_TYPE (*anode)) == FUNCTION_TYPE
22190075Sobrien		  || TREE_CODE (TREE_TYPE (*anode)) == METHOD_TYPE))
22290075Sobrien	    {
223132718Skan	      /* OK, this is a bit convoluted.  We can't just make a copy
224132718Skan		 of the pointer type and modify its TREE_TYPE, because if
225132718Skan		 we change the attributes of the target type the pointer
226132718Skan		 type needs to have a different TYPE_MAIN_VARIANT.  So we
227132718Skan		 pull out the target type now, frob it as appropriate, and
228132718Skan		 rebuild the pointer type later.
229132718Skan
230169689Skan		 This would all be simpler if attributes were part of the
231169689Skan		 declarator, grumble grumble.  */
232132718Skan	      fn_ptr_tmp = TREE_TYPE (*anode);
233132718Skan	      anode = &fn_ptr_tmp;
234132718Skan	      flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
23590075Sobrien	    }
23690075Sobrien	  else if (flags & (int) ATTR_FLAG_FUNCTION_NEXT)
23790075Sobrien	    {
23890075Sobrien	      /* Pass on this attribute to be tried again.  */
23990075Sobrien	      returned_attrs = tree_cons (name, args, returned_attrs);
24090075Sobrien	      continue;
24190075Sobrien	    }
24290075Sobrien
24390075Sobrien	  if (TREE_CODE (*anode) != FUNCTION_TYPE
24490075Sobrien	      && TREE_CODE (*anode) != METHOD_TYPE)
24590075Sobrien	    {
246169689Skan	      warning (OPT_Wattributes,
247169689Skan		       "%qs attribute only applies to function types",
24890075Sobrien		       IDENTIFIER_POINTER (name));
24990075Sobrien	      continue;
25090075Sobrien	    }
25190075Sobrien	}
25290075Sobrien
253169689Skan      if (TYPE_P (*anode)
254169689Skan	  && (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
255169689Skan	  && TYPE_SIZE (*anode) != NULL_TREE)
256169689Skan	{
257169689Skan	  warning (OPT_Wattributes, "type attributes ignored after type is already defined");
258169689Skan	  continue;
259169689Skan	}
260169689Skan
26190075Sobrien      if (spec->handler != NULL)
26290075Sobrien	returned_attrs = chainon ((*spec->handler) (anode, name, args,
26390075Sobrien						    flags, &no_add_attrs),
26490075Sobrien				  returned_attrs);
26590075Sobrien
26690075Sobrien      /* Layout the decl in case anything changed.  */
26790075Sobrien      if (spec->type_required && DECL_P (*node)
26896263Sobrien	  && (TREE_CODE (*node) == VAR_DECL
26996263Sobrien	      || TREE_CODE (*node) == PARM_DECL
27096263Sobrien	      || TREE_CODE (*node) == RESULT_DECL))
271169689Skan	relayout_decl (*node);
27290075Sobrien
27390075Sobrien      if (!no_add_attrs)
27490075Sobrien	{
27590075Sobrien	  tree old_attrs;
27690075Sobrien	  tree a;
27790075Sobrien
27890075Sobrien	  if (DECL_P (*anode))
27990075Sobrien	    old_attrs = DECL_ATTRIBUTES (*anode);
28090075Sobrien	  else
28190075Sobrien	    old_attrs = TYPE_ATTRIBUTES (*anode);
28290075Sobrien
28390075Sobrien	  for (a = lookup_attribute (spec->name, old_attrs);
28490075Sobrien	       a != NULL_TREE;
28590075Sobrien	       a = lookup_attribute (spec->name, TREE_CHAIN (a)))
28690075Sobrien	    {
28790075Sobrien	      if (simple_cst_equal (TREE_VALUE (a), args) == 1)
28890075Sobrien		break;
28990075Sobrien	    }
29090075Sobrien
29190075Sobrien	  if (a == NULL_TREE)
29290075Sobrien	    {
29390075Sobrien	      /* This attribute isn't already in the list.  */
29490075Sobrien	      if (DECL_P (*anode))
29590075Sobrien		DECL_ATTRIBUTES (*anode) = tree_cons (name, args, old_attrs);
29690075Sobrien	      else if (flags & (int) ATTR_FLAG_TYPE_IN_PLACE)
297169689Skan		{
298169689Skan		  TYPE_ATTRIBUTES (*anode) = tree_cons (name, args, old_attrs);
299169689Skan		  /* If this is the main variant, also push the attributes
300169689Skan		     out to the other variants.  */
301169689Skan		  if (*anode == TYPE_MAIN_VARIANT (*anode))
302169689Skan		    {
303169689Skan		      tree variant;
304169689Skan		      for (variant = *anode; variant;
305169689Skan			   variant = TYPE_NEXT_VARIANT (variant))
306169689Skan			{
307169689Skan			  if (TYPE_ATTRIBUTES (variant) == old_attrs)
308169689Skan			    TYPE_ATTRIBUTES (variant)
309169689Skan			      = TYPE_ATTRIBUTES (*anode);
310169689Skan			  else if (!lookup_attribute
311169689Skan				   (spec->name, TYPE_ATTRIBUTES (variant)))
312169689Skan			    TYPE_ATTRIBUTES (variant) = tree_cons
313169689Skan			      (name, args, TYPE_ATTRIBUTES (variant));
314169689Skan			}
315169689Skan		    }
316169689Skan		}
31790075Sobrien	      else
31890075Sobrien		*anode = build_type_attribute_variant (*anode,
31990075Sobrien						       tree_cons (name, args,
32090075Sobrien								  old_attrs));
32190075Sobrien	    }
32290075Sobrien	}
323132718Skan
324132718Skan      if (fn_ptr_tmp)
325132718Skan	{
326132718Skan	  /* Rebuild the function pointer type and put it in the
327132718Skan	     appropriate place.  */
328132718Skan	  fn_ptr_tmp = build_pointer_type (fn_ptr_tmp);
329132718Skan	  if (DECL_P (*node))
330132718Skan	    TREE_TYPE (*node) = fn_ptr_tmp;
331132718Skan	  else
33290075Sobrien	    {
333169689Skan	      gcc_assert (TREE_CODE (*node) == POINTER_TYPE);
334169689Skan	      *node = fn_ptr_tmp;
33590075Sobrien	    }
33690075Sobrien	}
33790075Sobrien    }
33890075Sobrien
339169689Skan  return returned_attrs;
34090075Sobrien}
341