1 /* Copyright (C
) 2001, 2002 Free Software Foundation
, Inc.
2 Contributed by Joseph Myers
<jsm28@cam.ac.uk
>.
4 This file is part of GCC.
6 GCC is free software
; you can redistribute it and
/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation
; either version
2, or (at your option
) any later
11 GCC is distributed in the hope that it will be useful
, but WITHOUT ANY
12 WARRANTY
; without even the implied warranty of MERCHANTABILITY or
13 FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC
; see the file COPYING. If not
, write to the Free
18 Software Foundation
, 59 Temple Place
- Suite
330, Boston
, MA
21 /* This header provides a declarative way of describing the attributes
22 that are applied to some functions by default.
24 Before including this header
, you must define the following macros.
25 In each case where there is an ENUM
, it is an identifier used to
26 reference the tree in subsequent definitions.
28 DEF_ATTR_NULL_TREE (ENUM
)
30 Constructs a NULL_TREE.
32 DEF_ATTR_INT (ENUM
, VALUE
)
34 Constructs an INTEGER_CST with value
VALUE (an integer representable
37 DEF_ATTR_IDENT (ENUM
, STRING
)
39 Constructs an IDENTIFIER_NODE for STRING.
41 DEF_ATTR_TREE_LIST (ENUM
, PURPOSE
, VALUE
, CHAIN
)
43 Constructs a TREE_LIST with given PURPOSE
, VALUE and
CHAIN (given
44 as previous ENUM names
).
46 DEF_FN_ATTR (NAME
, ATTRS
, PREDICATE
)
48 Specifies that the function with name
NAME (a previous ENUM for an
49 IDENTIFIER_NODE
) has attributes
ATTRS (a previous ENUM
) if
52 DEF_ATTR_NULL_TREE (ATTR_NULL
)
54 /* Note that below we must avoid whitespace in arguments of CONCAT
*.
*/
56 /* Construct a tree for a given integer and a list containing it.
*/
57 #define
DEF_ATTR_FOR_INT(VALUE
) \
58 DEF_ATTR_INT (CONCAT2 (ATTR_
,VALUE
), VALUE
) \
59 DEF_ATTR_TREE_LIST (CONCAT2 (ATTR_LIST_
,VALUE
), ATTR_NULL
, \
60 CONCAT2 (ATTR_
,VALUE
), ATTR_NULL
)
66 #undef DEF_ATTR_FOR_INT
68 /* Construct a tree for a list of two integers.
*/
69 #define
DEF_LIST_INT_INT(VALUE1
, VALUE2
) \
70 DEF_ATTR_TREE_LIST (CONCAT4 (ATTR_LIST_
,VALUE1
,_
,VALUE2
), ATTR_NULL
, \
71 CONCAT2 (ATTR_
,VALUE1
), CONCAT2 (ATTR_LIST_
,VALUE2
))
72 DEF_LIST_INT_INT (1,0)
73 DEF_LIST_INT_INT (1,2)
74 DEF_LIST_INT_INT (2,0)
75 DEF_LIST_INT_INT (2,3)
76 DEF_LIST_INT_INT (3,0)
77 DEF_LIST_INT_INT (3,4)
78 #undef DEF_LIST_INT_INT
80 /* Construct tress for identifiers.
*/
81 DEF_ATTR_IDENT (ATTR_CONST
, "const")
82 DEF_ATTR_IDENT (ATTR_FORMAT
, "format")
83 DEF_ATTR_IDENT (ATTR_FORMAT_ARG
, "format_arg")
84 DEF_ATTR_IDENT (ATTR_MALLOC
, "malloc")
85 DEF_ATTR_IDENT (ATTR_NONNULL
, "nonnull")
86 DEF_ATTR_IDENT (ATTR_NORETURN
, "noreturn")
87 DEF_ATTR_IDENT (ATTR_NOTHROW
, "nothrow")
88 DEF_ATTR_IDENT (ATTR_PRINTF
, "printf")
89 DEF_ATTR_IDENT (ATTR_ASM_FPRINTF
, "asm_fprintf")
90 DEF_ATTR_IDENT (ATTR_PURE
, "pure")
91 DEF_ATTR_IDENT (ATTR_SCANF
, "scanf")
92 DEF_ATTR_IDENT (ATTR_STRFMON
, "strfmon")
93 DEF_ATTR_IDENT (ATTR_STRFTIME
, "strftime")
95 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_LIST
, ATTR_NOTHROW
, ATTR_NULL
, ATTR_NULL
)
97 DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_LIST
, ATTR_CONST
, \
98 ATTR_NULL
, ATTR_NOTHROW_LIST
)
99 DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_LIST
, ATTR_PURE
, \
100 ATTR_NULL
, ATTR_NOTHROW_LIST
)
101 DEF_ATTR_TREE_LIST (ATTR_NORETURN_NOTHROW_LIST
, ATTR_NORETURN
, \
102 ATTR_NULL
, ATTR_NOTHROW_LIST
)
103 DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_LIST
, ATTR_MALLOC
, \
104 ATTR_NULL
, ATTR_NOTHROW_LIST
)
106 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1
, ATTR_NONNULL
, ATTR_LIST_1
, \
108 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_2
, ATTR_NONNULL
, ATTR_LIST_2
, \
110 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_3
, ATTR_NONNULL
, ATTR_LIST_3
, \
112 /* Nothrow functions whose first and second parameters are nonnull pointers.
*/
113 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1_2
, ATTR_NONNULL
, ATTR_LIST_2
, \
114 ATTR_NOTHROW_NONNULL_1
)
115 /* Nothrow functions whose first and fourth parameters are nonnull pointers.
*/
116 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1_4
, ATTR_NONNULL
, ATTR_LIST_4
, \
117 ATTR_NOTHROW_NONNULL_1
)
118 /* Nothrow const functions whose first parameter is a nonnull pointer.
*/
119 DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_NONNULL_1
, ATTR_CONST
, ATTR_NULL
, \
120 ATTR_NOTHROW_NONNULL_1
)
121 /* Nothrow pure functions whose first parameter is a nonnull pointer.
*/
122 DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NONNULL_1
, ATTR_PURE
, ATTR_NULL
, \
123 ATTR_NOTHROW_NONNULL_1
)
124 /* Nothrow pure functions whose first and second parameters are nonnull pointers.
*/
125 DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NONNULL_1_2
, ATTR_PURE
, ATTR_NULL
, \
126 ATTR_NOTHROW_NONNULL_1_2
)
127 /* Nothrow malloc functions whose first parameter is a nonnull pointer.
*/
128 DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_NONNULL_1
, ATTR_MALLOC
, ATTR_NULL
, \
129 ATTR_NOTHROW_NONNULL_1
)
131 /* Construct a tree for a format attribute.
*/
132 #define
DEF_FORMAT_ATTRIBUTE(TYPE, FA
, VALUES
) \
133 DEF_ATTR_TREE_LIST (CONCAT4 (ATTR_
,TYPE,_
,VALUES
), ATTR_NULL
, \
134 CONCAT2 (ATTR_
,TYPE), CONCAT2 (ATTR_LIST_
,VALUES
)) \
135 DEF_ATTR_TREE_LIST (CONCAT4 (ATTR_FORMAT_
,TYPE,_
,VALUES
), ATTR_FORMAT
, \
136 CONCAT4 (ATTR_
,TYPE,_
,VALUES
), CONCAT2 (ATTR_NOTHROW_NONNULL_
,FA
))
137 DEF_FORMAT_ATTRIBUTE(PRINTF
,1,1_0
)
138 DEF_FORMAT_ATTRIBUTE(PRINTF
,1,1_2
)
139 DEF_FORMAT_ATTRIBUTE(PRINTF
,2,2_0
)
140 DEF_FORMAT_ATTRIBUTE(PRINTF
,2,2_3
)
141 DEF_FORMAT_ATTRIBUTE(PRINTF
,3,3_0
)
142 DEF_FORMAT_ATTRIBUTE(PRINTF
,3,3_4
)
143 DEF_FORMAT_ATTRIBUTE(SCANF
,1,1_0
)
144 DEF_FORMAT_ATTRIBUTE(SCANF
,1,1_2
)
145 DEF_FORMAT_ATTRIBUTE(SCANF
,2,2_0
)
146 DEF_FORMAT_ATTRIBUTE(SCANF
,2,2_3
)
147 DEF_FORMAT_ATTRIBUTE(STRFTIME
,3,3_0
)
148 DEF_FORMAT_ATTRIBUTE(STRFMON
,3,3_4
)
149 #undef DEF_FORMAT_ATTRIBUTE
151 /* Construct a tree for a format_arg attribute.
*/
152 #define
DEF_FORMAT_ARG_ATTRIBUTE(FA
) \
153 DEF_ATTR_TREE_LIST (CONCAT2 (ATTR_FORMAT_ARG_
,FA
), ATTR_FORMAT_ARG
, \
154 CONCAT2 (ATTR_LIST_
,FA
), CONCAT2 (ATTR_NOTHROW_NONNULL_
,FA
))
155 DEF_FORMAT_ARG_ATTRIBUTE(1)
156 DEF_FORMAT_ARG_ATTRIBUTE(2)
157 #undef DEF_FORMAT_ARG_ATTRIBUTE
159 /* Define an attribute for a function
, along with the IDENTIFIER_NODE.
*/
160 #define
DEF_FN_ATTR_IDENT(NAME
, ATTRS
, PREDICATE
) \
161 DEF_ATTR_IDENT (CONCAT2(ATTR_
,NAME
), STRINGX(NAME
)) \
162 DEF_FN_ATTR (CONCAT2(ATTR_
,NAME
), ATTRS
, PREDICATE
)
164 /* The ISO C functions are always
checked (whether
<stdio.h
> is
165 included or not
), since it is common to call printf without
166 including
<stdio.h
>. There shouldn
't be a problem with this,
167 since ISO C reserves these function names whether you include the
168 header file or not. In any case, the checking is harmless. With
169 -ffreestanding, these default attributes are disabled, and must be
170 specified manually if desired. */
172 /* Functions from ISO/IEC 9899:1990. */
173 #define DEF_C89_ATTR(NAME, ATTRS) DEF_FN_ATTR_IDENT (NAME, ATTRS, flag_hosted)
174 DEF_C89_ATTR (fscanf, ATTR_FORMAT_SCANF_2_3)
175 DEF_C89_ATTR (vfprintf, ATTR_FORMAT_PRINTF_2_0)
176 DEF_C89_ATTR (strftime, ATTR_FORMAT_STRFTIME_3_0)
179 /* ISO C99 adds the snprintf and vscanf family functions. */
180 #define DEF_C99_ATTR(NAME, ATTRS) \
181 DEF_FN_ATTR_IDENT (NAME, ATTRS, \
183 && (flag_isoc99 || flag_noniso_default_format_attributes)))
184 DEF_C99_ATTR (vfscanf, ATTR_FORMAT_SCANF_2_0)
187 /* Functions not in any version of ISO C. */
188 #define DEF_EXT_ATTR(NAME, ATTRS) \
189 DEF_FN_ATTR_IDENT (NAME, ATTRS, \
190 flag_hosted && flag_noniso_default_format_attributes)
191 /* Uniforum/GNU gettext functions. */
192 DEF_EXT_ATTR (gettext, ATTR_FORMAT_ARG_1)
193 DEF_EXT_ATTR (dgettext, ATTR_FORMAT_ARG_2)
194 DEF_EXT_ATTR (dcgettext, ATTR_FORMAT_ARG_2)
195 /* X/Open strfmon function. */
196 DEF_EXT_ATTR (strfmon, ATTR_FORMAT_STRFMON_3_4)
198 #undef DEF_FN_ATTR_IDENT