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_ATTR_NULL_TREE (ATTR_NULL
)
48 /* Construct a tree for a given integer and a list containing it.
*/
49 #define
DEF_ATTR_FOR_INT(VALUE
) \
50 DEF_ATTR_INT (ATTR_##VALUE
, VALUE
) \
51 DEF_ATTR_TREE_LIST (ATTR_LIST_##VALUE
, ATTR_NULL
, \
52 ATTR_##VALUE
, ATTR_NULL
)
58 #undef DEF_ATTR_FOR_INT
60 /* Construct a tree for a list of two integers.
*/
61 #define
DEF_LIST_INT_INT(VALUE1
, VALUE2
) \
62 DEF_ATTR_TREE_LIST (ATTR_LIST_##VALUE1##_##VALUE2
, ATTR_NULL
, \
63 ATTR_##VALUE1
, ATTR_LIST_##VALUE2
)
64 DEF_LIST_INT_INT (1,0)
65 DEF_LIST_INT_INT (1,2)
66 DEF_LIST_INT_INT (2,0)
67 DEF_LIST_INT_INT (2,3)
68 DEF_LIST_INT_INT (3,0)
69 DEF_LIST_INT_INT (3,4)
70 #undef DEF_LIST_INT_INT
72 /* Construct trees for identifiers.
*/
73 DEF_ATTR_IDENT (ATTR_CONST
, "const")
74 DEF_ATTR_IDENT (ATTR_FORMAT
, "format")
75 DEF_ATTR_IDENT (ATTR_FORMAT_ARG
, "format_arg")
76 DEF_ATTR_IDENT (ATTR_MALLOC
, "malloc")
77 DEF_ATTR_IDENT (ATTR_NONNULL
, "nonnull")
78 DEF_ATTR_IDENT (ATTR_NORETURN
, "noreturn")
79 DEF_ATTR_IDENT (ATTR_NOTHROW
, "nothrow")
80 DEF_ATTR_IDENT (ATTR_PRINTF
, "printf")
81 DEF_ATTR_IDENT (ATTR_ASM_FPRINTF
, "asm_fprintf")
82 DEF_ATTR_IDENT (ATTR_GCC_DIAG
, "gcc_diag")
83 DEF_ATTR_IDENT (ATTR_GCC_CDIAG
, "gcc_cdiag")
84 DEF_ATTR_IDENT (ATTR_GCC_CXXDIAG
, "gcc_cxxdiag")
85 DEF_ATTR_IDENT (ATTR_PURE
, "pure")
86 DEF_ATTR_IDENT (ATTR_SCANF
, "scanf")
87 DEF_ATTR_IDENT (ATTR_STRFMON
, "strfmon")
88 DEF_ATTR_IDENT (ATTR_STRFTIME
, "strftime")
90 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_LIST
, ATTR_NOTHROW
, ATTR_NULL
, ATTR_NULL
)
92 DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_LIST
, ATTR_CONST
, \
93 ATTR_NULL
, ATTR_NOTHROW_LIST
)
94 DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_LIST
, ATTR_PURE
, \
95 ATTR_NULL
, ATTR_NOTHROW_LIST
)
96 DEF_ATTR_TREE_LIST (ATTR_NORETURN_NOTHROW_LIST
, ATTR_NORETURN
, \
97 ATTR_NULL
, ATTR_NOTHROW_LIST
)
98 DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_LIST
, ATTR_MALLOC
, \
99 ATTR_NULL
, ATTR_NOTHROW_LIST
)
101 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1
, ATTR_NONNULL
, ATTR_LIST_1
, \
103 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_2
, ATTR_NONNULL
, ATTR_LIST_2
, \
105 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_3
, ATTR_NONNULL
, ATTR_LIST_3
, \
107 /* Nothrow functions whose first and second parameters are nonnull pointers.
*/
108 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1_2
, ATTR_NONNULL
, ATTR_LIST_2
, \
109 ATTR_NOTHROW_NONNULL_1
)
110 /* Nothrow functions whose first and fourth parameters are nonnull pointers.
*/
111 DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1_4
, ATTR_NONNULL
, ATTR_LIST_4
, \
112 ATTR_NOTHROW_NONNULL_1
)
113 /* Nothrow const functions whose first parameter is a nonnull pointer.
*/
114 DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_NONNULL_1
, ATTR_CONST
, ATTR_NULL
, \
115 ATTR_NOTHROW_NONNULL_1
)
116 /* Nothrow pure functions whose first parameter is a nonnull pointer.
*/
117 DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NONNULL_1
, ATTR_PURE
, ATTR_NULL
, \
118 ATTR_NOTHROW_NONNULL_1
)
119 /* Nothrow pure functions whose first and second parameters are nonnull pointers.
*/
120 DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NONNULL_1_2
, ATTR_PURE
, ATTR_NULL
, \
121 ATTR_NOTHROW_NONNULL_1_2
)
122 /* Nothrow malloc functions whose first parameter is a nonnull pointer.
*/
123 DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_NONNULL_1
, ATTR_MALLOC
, ATTR_NULL
, \
124 ATTR_NOTHROW_NONNULL_1
)
126 /* Construct a tree for a format attribute.
*/
127 #define
DEF_FORMAT_ATTRIBUTE(TYPE, FA
, VALUES
) \
128 DEF_ATTR_TREE_LIST (ATTR_##
TYPE##_##VALUES
, ATTR_NULL
, \
129 ATTR_##
TYPE, ATTR_LIST_##VALUES
) \
130 DEF_ATTR_TREE_LIST (ATTR_FORMAT_##
TYPE##_##VALUES
, ATTR_FORMAT
, \
131 ATTR_##
TYPE##_##VALUES
, ATTR_NOTHROW_NONNULL_##FA
)
132 DEF_FORMAT_ATTRIBUTE(PRINTF
,1,1_0
)
133 DEF_FORMAT_ATTRIBUTE(PRINTF
,1,1_2
)
134 DEF_FORMAT_ATTRIBUTE(PRINTF
,2,2_0
)
135 DEF_FORMAT_ATTRIBUTE(PRINTF
,2,2_3
)
136 DEF_FORMAT_ATTRIBUTE(PRINTF
,3,3_0
)
137 DEF_FORMAT_ATTRIBUTE(PRINTF
,3,3_4
)
138 DEF_FORMAT_ATTRIBUTE(SCANF
,1,1_0
)
139 DEF_FORMAT_ATTRIBUTE(SCANF
,1,1_2
)
140 DEF_FORMAT_ATTRIBUTE(SCANF
,2,2_0
)
141 DEF_FORMAT_ATTRIBUTE(SCANF
,2,2_3
)
142 DEF_FORMAT_ATTRIBUTE(STRFTIME
,3,3_0
)
143 DEF_FORMAT_ATTRIBUTE(STRFMON
,3,3_4
)
144 #undef DEF_FORMAT_ATTRIBUTE
146 /* Construct a tree for a format_arg attribute.
*/
147 #define
DEF_FORMAT_ARG_ATTRIBUTE(FA
) \
148 DEF_ATTR_TREE_LIST (ATTR_FORMAT_ARG_##FA
, ATTR_FORMAT_ARG
, \
149 ATTR_LIST_##FA
, ATTR_NOTHROW_NONNULL_##FA
)
150 DEF_FORMAT_ARG_ATTRIBUTE(1)
151 DEF_FORMAT_ARG_ATTRIBUTE(2)
152 #undef DEF_FORMAT_ARG_ATTRIBUTE