1169689Skan/* Copyright (C) 2001, 2002, 2004, 2005 Free Software Foundation, Inc. 290075Sobrien Contributed by Joseph Myers <jsm28@cam.ac.uk>. 390075Sobrien 490075SobrienThis file is part of GCC. 590075Sobrien 690075SobrienGCC is free software; you can redistribute it and/or modify it under 790075Sobrienthe terms of the GNU General Public License as published by the Free 890075SobrienSoftware Foundation; either version 2, or (at your option) any later 990075Sobrienversion. 1090075Sobrien 1190075SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY 1290075SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or 1390075SobrienFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1490075Sobrienfor more details. 1590075Sobrien 1690075SobrienYou should have received a copy of the GNU General Public License 1790075Sobrienalong with GCC; see the file COPYING. If not, write to the Free 18169689SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 19169689Skan02110-1301, USA. */ 2090075Sobrien 2190075Sobrien/* This header provides a declarative way of describing the attributes 2290075Sobrien that are applied to some functions by default. 2390075Sobrien 2490075Sobrien Before including this header, you must define the following macros. 2590075Sobrien In each case where there is an ENUM, it is an identifier used to 2690075Sobrien reference the tree in subsequent definitions. 2790075Sobrien 2890075Sobrien DEF_ATTR_NULL_TREE (ENUM) 2990075Sobrien 3090075Sobrien Constructs a NULL_TREE. 3190075Sobrien 3290075Sobrien DEF_ATTR_INT (ENUM, VALUE) 3390075Sobrien 3490075Sobrien Constructs an INTEGER_CST with value VALUE (an integer representable 3590075Sobrien in HOST_WIDE_INT). 3690075Sobrien 3790075Sobrien DEF_ATTR_IDENT (ENUM, STRING) 3890075Sobrien 3990075Sobrien Constructs an IDENTIFIER_NODE for STRING. 4090075Sobrien 4190075Sobrien DEF_ATTR_TREE_LIST (ENUM, PURPOSE, VALUE, CHAIN) 4290075Sobrien 4390075Sobrien Constructs a TREE_LIST with given PURPOSE, VALUE and CHAIN (given 44132718Skan as previous ENUM names). */ 4590075Sobrien 4690075SobrienDEF_ATTR_NULL_TREE (ATTR_NULL) 4790075Sobrien 4890075Sobrien/* Construct a tree for a given integer and a list containing it. */ 4990075Sobrien#define DEF_ATTR_FOR_INT(VALUE) \ 50132718Skan DEF_ATTR_INT (ATTR_##VALUE, VALUE) \ 51132718Skan DEF_ATTR_TREE_LIST (ATTR_LIST_##VALUE, ATTR_NULL, \ 52132718Skan ATTR_##VALUE, ATTR_NULL) 5390075SobrienDEF_ATTR_FOR_INT (0) 5490075SobrienDEF_ATTR_FOR_INT (1) 5590075SobrienDEF_ATTR_FOR_INT (2) 5690075SobrienDEF_ATTR_FOR_INT (3) 5790075SobrienDEF_ATTR_FOR_INT (4) 58169689SkanDEF_ATTR_FOR_INT (5) 59169689SkanDEF_ATTR_FOR_INT (6) 6090075Sobrien#undef DEF_ATTR_FOR_INT 6190075Sobrien 6290075Sobrien/* Construct a tree for a list of two integers. */ 6390075Sobrien#define DEF_LIST_INT_INT(VALUE1, VALUE2) \ 64132718Skan DEF_ATTR_TREE_LIST (ATTR_LIST_##VALUE1##_##VALUE2, ATTR_NULL, \ 65132718Skan ATTR_##VALUE1, ATTR_LIST_##VALUE2) 6690075SobrienDEF_LIST_INT_INT (1,0) 6790075SobrienDEF_LIST_INT_INT (1,2) 6890075SobrienDEF_LIST_INT_INT (2,0) 6990075SobrienDEF_LIST_INT_INT (2,3) 7090075SobrienDEF_LIST_INT_INT (3,0) 7190075SobrienDEF_LIST_INT_INT (3,4) 72169689SkanDEF_LIST_INT_INT (4,0) 73169689SkanDEF_LIST_INT_INT (4,5) 74169689SkanDEF_LIST_INT_INT (5,0) 75169689SkanDEF_LIST_INT_INT (5,6) 7690075Sobrien#undef DEF_LIST_INT_INT 7790075Sobrien 78169689Skan/* Construct trees for identifiers. */ 79117395SkanDEF_ATTR_IDENT (ATTR_CONST, "const") 80117395SkanDEF_ATTR_IDENT (ATTR_FORMAT, "format") 81117395SkanDEF_ATTR_IDENT (ATTR_FORMAT_ARG, "format_arg") 82117395SkanDEF_ATTR_IDENT (ATTR_MALLOC, "malloc") 83117395SkanDEF_ATTR_IDENT (ATTR_NONNULL, "nonnull") 84117395SkanDEF_ATTR_IDENT (ATTR_NORETURN, "noreturn") 85117395SkanDEF_ATTR_IDENT (ATTR_NOTHROW, "nothrow") 8690075SobrienDEF_ATTR_IDENT (ATTR_PRINTF, "printf") 87132718SkanDEF_ATTR_IDENT (ATTR_ASM_FPRINTF, "asm_fprintf") 88132718SkanDEF_ATTR_IDENT (ATTR_GCC_DIAG, "gcc_diag") 89132718SkanDEF_ATTR_IDENT (ATTR_GCC_CDIAG, "gcc_cdiag") 90132718SkanDEF_ATTR_IDENT (ATTR_GCC_CXXDIAG, "gcc_cxxdiag") 91117395SkanDEF_ATTR_IDENT (ATTR_PURE, "pure") 92169689SkanDEF_ATTR_IDENT (ATTR_NOVOPS, "no vops") 9390075SobrienDEF_ATTR_IDENT (ATTR_SCANF, "scanf") 94169689SkanDEF_ATTR_IDENT (ATTR_SENTINEL, "sentinel") 95117395SkanDEF_ATTR_IDENT (ATTR_STRFMON, "strfmon") 9690075SobrienDEF_ATTR_IDENT (ATTR_STRFTIME, "strftime") 9790075Sobrien 98169689SkanDEF_ATTR_TREE_LIST (ATTR_NOVOPS_LIST, ATTR_NOVOPS, ATTR_NULL, ATTR_NULL) 99169689Skan 100117395SkanDEF_ATTR_TREE_LIST (ATTR_NOTHROW_LIST, ATTR_NOTHROW, ATTR_NULL, ATTR_NULL) 10190075Sobrien 102117395SkanDEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_LIST, ATTR_CONST, \ 103117395Skan ATTR_NULL, ATTR_NOTHROW_LIST) 104117395SkanDEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_LIST, ATTR_PURE, \ 105117395Skan ATTR_NULL, ATTR_NOTHROW_LIST) 106169689SkanDEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NOVOPS_LIST, ATTR_NOVOPS, \ 107169689Skan ATTR_NULL, ATTR_PURE_NOTHROW_LIST) 108117395SkanDEF_ATTR_TREE_LIST (ATTR_NORETURN_NOTHROW_LIST, ATTR_NORETURN, \ 109117395Skan ATTR_NULL, ATTR_NOTHROW_LIST) 110117395SkanDEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_LIST, ATTR_MALLOC, \ 111117395Skan ATTR_NULL, ATTR_NOTHROW_LIST) 112169689SkanDEF_ATTR_TREE_LIST (ATTR_SENTINEL_NOTHROW_LIST, ATTR_SENTINEL, \ 113169689Skan ATTR_NULL, ATTR_NOTHROW_LIST) 114117395Skan 115169689Skan/* Functions whose pointer parameter(s) are all nonnull. */ 116169689SkanDEF_ATTR_TREE_LIST (ATTR_NONNULL_LIST, ATTR_NONNULL, ATTR_NULL, ATTR_NULL) 117169689Skan/* Functions whose first parameter is a nonnull pointer. */ 118169689SkanDEF_ATTR_TREE_LIST (ATTR_NONNULL_1, ATTR_NONNULL, ATTR_LIST_1, ATTR_NULL) 119169689Skan/* Functions whose second parameter is a nonnull pointer. */ 120169689SkanDEF_ATTR_TREE_LIST (ATTR_NONNULL_2, ATTR_NONNULL, ATTR_LIST_2, ATTR_NULL) 121169689Skan/* Nothrow functions with the sentinel(1) attribute. */ 122169689SkanDEF_ATTR_TREE_LIST (ATTR_NOTHROW_SENTINEL_1, ATTR_SENTINEL, ATTR_LIST_1, \ 123169689Skan ATTR_NOTHROW_LIST) 124169689Skan/* Nothrow functions whose pointer parameter(s) are all nonnull. */ 125169689SkanDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL, ATTR_NONNULL, ATTR_NULL, \ 126169689Skan ATTR_NOTHROW_LIST) 127169689Skan/* Nothrow functions whose first parameter is a nonnull pointer. */ 128132718SkanDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1, ATTR_NONNULL, ATTR_LIST_1, \ 129117395Skan ATTR_NOTHROW_LIST) 130169689Skan/* Nothrow functions whose second parameter is a nonnull pointer. */ 131132718SkanDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_2, ATTR_NONNULL, ATTR_LIST_2, \ 132117395Skan ATTR_NOTHROW_LIST) 133169689Skan/* Nothrow functions whose third parameter is a nonnull pointer. */ 134132718SkanDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_3, ATTR_NONNULL, ATTR_LIST_3, \ 135117395Skan ATTR_NOTHROW_LIST) 136169689Skan/* Nothrow functions whose fourth parameter is a nonnull pointer. */ 137169689SkanDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_4, ATTR_NONNULL, ATTR_LIST_4, \ 138169689Skan ATTR_NOTHROW_LIST) 139169689Skan/* Nothrow functions whose fifth parameter is a nonnull pointer. */ 140169689SkanDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_5, ATTR_NONNULL, ATTR_LIST_5, \ 141169689Skan ATTR_NOTHROW_LIST) 142169689Skan/* Nothrow const functions whose pointer parameter(s) are all nonnull. */ 143169689SkanDEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_NONNULL, ATTR_CONST, ATTR_NULL, \ 144169689Skan ATTR_NOTHROW_NONNULL) 145169689Skan/* Nothrow pure functions whose pointer parameter(s) are all nonnull. */ 146169689SkanDEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NONNULL, ATTR_PURE, ATTR_NULL, \ 147169689Skan ATTR_NOTHROW_NONNULL) 148169689Skan/* Nothrow malloc functions whose pointer parameter(s) are all nonnull. */ 149169689SkanDEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_NONNULL, ATTR_MALLOC, ATTR_NULL, \ 150169689Skan ATTR_NOTHROW_NONNULL) 151117395Skan 15290075Sobrien/* Construct a tree for a format attribute. */ 153117395Skan#define DEF_FORMAT_ATTRIBUTE(TYPE, FA, VALUES) \ 154132718Skan DEF_ATTR_TREE_LIST (ATTR_##TYPE##_##VALUES, ATTR_NULL, \ 155132718Skan ATTR_##TYPE, ATTR_LIST_##VALUES) \ 156132718Skan DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_##VALUES, ATTR_FORMAT, \ 157132718Skan ATTR_##TYPE##_##VALUES, ATTR_NOTHROW_NONNULL_##FA) 158117395SkanDEF_FORMAT_ATTRIBUTE(PRINTF,1,1_0) 159117395SkanDEF_FORMAT_ATTRIBUTE(PRINTF,1,1_2) 160117395SkanDEF_FORMAT_ATTRIBUTE(PRINTF,2,2_0) 161117395SkanDEF_FORMAT_ATTRIBUTE(PRINTF,2,2_3) 162117395SkanDEF_FORMAT_ATTRIBUTE(PRINTF,3,3_0) 163117395SkanDEF_FORMAT_ATTRIBUTE(PRINTF,3,3_4) 164169689SkanDEF_FORMAT_ATTRIBUTE(PRINTF,4,4_0) 165169689SkanDEF_FORMAT_ATTRIBUTE(PRINTF,4,4_5) 166169689SkanDEF_FORMAT_ATTRIBUTE(PRINTF,5,5_0) 167169689SkanDEF_FORMAT_ATTRIBUTE(PRINTF,5,5_6) 168117395SkanDEF_FORMAT_ATTRIBUTE(SCANF,1,1_0) 169117395SkanDEF_FORMAT_ATTRIBUTE(SCANF,1,1_2) 170117395SkanDEF_FORMAT_ATTRIBUTE(SCANF,2,2_0) 171117395SkanDEF_FORMAT_ATTRIBUTE(SCANF,2,2_3) 172117395SkanDEF_FORMAT_ATTRIBUTE(STRFTIME,3,3_0) 173117395SkanDEF_FORMAT_ATTRIBUTE(STRFMON,3,3_4) 17490075Sobrien#undef DEF_FORMAT_ATTRIBUTE 17590075Sobrien 176117395Skan/* Construct a tree for a format_arg attribute. */ 177117395Skan#define DEF_FORMAT_ARG_ATTRIBUTE(FA) \ 178132718Skan DEF_ATTR_TREE_LIST (ATTR_FORMAT_ARG_##FA, ATTR_FORMAT_ARG, \ 179132718Skan ATTR_LIST_##FA, ATTR_NOTHROW_NONNULL_##FA) 180117395SkanDEF_FORMAT_ARG_ATTRIBUTE(1) 181117395SkanDEF_FORMAT_ARG_ATTRIBUTE(2) 182117395Skan#undef DEF_FORMAT_ARG_ATTRIBUTE 18390075Sobrien 184