/* Copyright (C) 2001 Free Software Foundation, Inc.
   Contributed by Joseph Myers <jsm28@cam.ac.uk>.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING.  If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.  */

/* This header provides a declarative way of describing the attributes
   that are applied to some functions by default.

   Before including this header, you must define the following macros.
   In each case where there is an ENUM, it is an identifier used to
   reference the tree in subsequent definitions.

   DEF_ATTR_NULL_TREE (ENUM)

     Constructs a NULL_TREE.

   DEF_ATTR_INT (ENUM, VALUE)

     Constructs an INTEGER_CST with value VALUE (an integer representable
     in HOST_WIDE_INT).

   DEF_ATTR_IDENT (ENUM, STRING)

     Constructs an IDENTIFIER_NODE for STRING.

   DEF_ATTR_TREE_LIST (ENUM, PURPOSE, VALUE, CHAIN)

     Constructs a TREE_LIST with given PURPOSE, VALUE and CHAIN (given
     as previous ENUM names).

   DEF_FN_ATTR (NAME, ATTRS, PREDICATE)

     Specifies that the function with name NAME (a previous ENUM for an
     IDENTIFIER_NODE) has attributes ATTRS (a previous ENUM) if
     PREDICATE is true.  */

DEF_ATTR_NULL_TREE (ATTR_NULL)

/* Note that below we must avoid whitespace in arguments of CONCAT*.  */

/* Construct a tree for a given integer and a list containing it.  */
#define DEF_ATTR_FOR_INT(VALUE)					\
  DEF_ATTR_INT (CONCAT2 (ATTR_,VALUE), VALUE)			\
  DEF_ATTR_TREE_LIST (CONCAT2 (ATTR_LIST_,VALUE), ATTR_NULL,	\
		      CONCAT2 (ATTR_,VALUE), ATTR_NULL)
DEF_ATTR_FOR_INT (0)
DEF_ATTR_FOR_INT (1)
DEF_ATTR_FOR_INT (2)
DEF_ATTR_FOR_INT (3)
DEF_ATTR_FOR_INT (4)
#undef DEF_ATTR_FOR_INT

/* Construct a tree for a list of two integers.  */
#define DEF_LIST_INT_INT(VALUE1, VALUE2)				 \
  DEF_ATTR_TREE_LIST (CONCAT4 (ATTR_LIST_,VALUE1,_,VALUE2), ATTR_NULL,	 \
		    CONCAT2 (ATTR_,VALUE1), CONCAT2 (ATTR_LIST_,VALUE2))
DEF_LIST_INT_INT (1,0)
DEF_LIST_INT_INT (1,2)
DEF_LIST_INT_INT (2,0)
DEF_LIST_INT_INT (2,3)
DEF_LIST_INT_INT (3,0)
DEF_LIST_INT_INT (3,4)
#undef DEF_LIST_INT_INT

DEF_ATTR_IDENT (ATTR_PRINTF, "printf")
DEF_ATTR_IDENT (ATTR_SCANF, "scanf")
DEF_ATTR_IDENT (ATTR_STRFTIME, "strftime")
DEF_ATTR_IDENT (ATTR_STRFMON, "strfmon")

DEF_ATTR_IDENT (ATTR_FORMAT, "format")
DEF_ATTR_IDENT (ATTR_FORMAT_ARG, "format_arg")

/* Construct a tree for a format attribute.  */
#define DEF_FORMAT_ATTRIBUTE(TYPE, VALUES)				 \
  DEF_ATTR_TREE_LIST (CONCAT4 (ATTR_,TYPE,_,VALUES), ATTR_NULL,		 \
		      CONCAT2 (ATTR_,TYPE), CONCAT2 (ATTR_LIST_,VALUES)) \
  DEF_ATTR_TREE_LIST (CONCAT4 (ATTR_FORMAT_,TYPE,_,VALUES), ATTR_FORMAT, \
		      CONCAT4 (ATTR_,TYPE,_,VALUES), ATTR_NULL)
DEF_FORMAT_ATTRIBUTE(PRINTF,1_0)
DEF_FORMAT_ATTRIBUTE(PRINTF,1_2)
DEF_FORMAT_ATTRIBUTE(PRINTF,2_0)
DEF_FORMAT_ATTRIBUTE(PRINTF,2_3)
DEF_FORMAT_ATTRIBUTE(PRINTF,3_0)
DEF_FORMAT_ATTRIBUTE(PRINTF,3_4)
DEF_FORMAT_ATTRIBUTE(SCANF,1_0)
DEF_FORMAT_ATTRIBUTE(SCANF,1_2)
DEF_FORMAT_ATTRIBUTE(SCANF,2_0)
DEF_FORMAT_ATTRIBUTE(SCANF,2_3)
DEF_FORMAT_ATTRIBUTE(STRFTIME,3_0)
DEF_FORMAT_ATTRIBUTE(STRFMON,3_4)
#undef DEF_FORMAT_ATTRIBUTE

DEF_ATTR_TREE_LIST (ATTR_FORMAT_ARG_1, ATTR_FORMAT_ARG, ATTR_LIST_1, ATTR_NULL)
DEF_ATTR_TREE_LIST (ATTR_FORMAT_ARG_2, ATTR_FORMAT_ARG, ATTR_LIST_2, ATTR_NULL)

/* Define an attribute for a function, along with the IDENTIFIER_NODE.  */
#define DEF_FN_ATTR_IDENT(NAME, ATTRS, PREDICATE)	\
  DEF_ATTR_IDENT (CONCAT2(ATTR_,NAME), STRINGX(NAME))	\
  DEF_FN_ATTR (CONCAT2(ATTR_,NAME), ATTRS, PREDICATE)

/* The ISO C functions are always checked (whether <stdio.h> is
   included or not), since it is common to call printf without
   including <stdio.h>.  There shouldn't be a problem with this,
   since ISO C reserves these function names whether you include the
   header file or not.  In any case, the checking is harmless.  With
   -ffreestanding, these default attributes are disabled, and must be
   specified manually if desired.  */

/* __builtin functions should be checked unconditionally, even with
   -ffreestanding.  */
DEF_FN_ATTR_IDENT (__builtin_printf, ATTR_FORMAT_PRINTF_1_2, true)
DEF_FN_ATTR_IDENT (__builtin_fprintf, ATTR_FORMAT_PRINTF_2_3, true)

/* Functions from ISO/IEC 9899:1990.  */
#define DEF_C89_ATTR(NAME, ATTRS) DEF_FN_ATTR_IDENT (NAME, ATTRS, flag_hosted)
DEF_C89_ATTR (printf, ATTR_FORMAT_PRINTF_1_2)
DEF_C89_ATTR (fprintf, ATTR_FORMAT_PRINTF_2_3)
DEF_C89_ATTR (sprintf, ATTR_FORMAT_PRINTF_2_3)
DEF_C89_ATTR (scanf, ATTR_FORMAT_SCANF_1_2)
DEF_C89_ATTR (fscanf, ATTR_FORMAT_SCANF_2_3)
DEF_C89_ATTR (sscanf, ATTR_FORMAT_SCANF_2_3)
DEF_C89_ATTR (vprintf, ATTR_FORMAT_PRINTF_1_0)
DEF_C89_ATTR (vfprintf, ATTR_FORMAT_PRINTF_2_0)
DEF_C89_ATTR (vsprintf, ATTR_FORMAT_PRINTF_2_0)
DEF_C89_ATTR (strftime, ATTR_FORMAT_STRFTIME_3_0)
#undef DEF_C89_ATTR

/* ISO C99 adds the snprintf and vscanf family functions.  */
#define DEF_C99_ATTR(NAME, ATTRS)					    \
  DEF_FN_ATTR_IDENT (NAME, ATTRS,					    \
	       (flag_hosted						    \
		&& (flag_isoc99 || flag_noniso_default_format_attributes)))
DEF_C99_ATTR (snprintf, ATTR_FORMAT_PRINTF_3_4)
DEF_C99_ATTR (vsnprintf, ATTR_FORMAT_PRINTF_3_0)
DEF_C99_ATTR (vscanf, ATTR_FORMAT_SCANF_1_0)
DEF_C99_ATTR (vfscanf, ATTR_FORMAT_SCANF_2_0)
DEF_C99_ATTR (vsscanf, ATTR_FORMAT_SCANF_2_0)
#undef DEF_C99_ATTR

/* Functions not in any version of ISO C.  */
#define DEF_EXT_ATTR(NAME, ATTRS)					\
  DEF_FN_ATTR_IDENT (NAME, ATTRS,					\
	       flag_hosted && flag_noniso_default_format_attributes)
/* Uniforum/GNU gettext functions.  */
DEF_EXT_ATTR (gettext, ATTR_FORMAT_ARG_1)
DEF_EXT_ATTR (dgettext, ATTR_FORMAT_ARG_2)
DEF_EXT_ATTR (dcgettext, ATTR_FORMAT_ARG_2)
/* X/Open strfmon function.  */
DEF_EXT_ATTR (strfmon, ATTR_FORMAT_STRFMON_3_4)
#undef DEF_EXT_ATTR
#undef DEF_FN_ATTR_IDENT
