1*38fd1498Szrj/* Copyright (C) 2001-2018 Free Software Foundation, Inc. 2*38fd1498Szrj Contributed by Joseph Myers <jsm28@cam.ac.uk>. 3*38fd1498Szrj 4*38fd1498SzrjThis file is part of GCC. 5*38fd1498Szrj 6*38fd1498SzrjGCC is free software; you can redistribute it and/or modify it under 7*38fd1498Szrjthe terms of the GNU General Public License as published by the Free 8*38fd1498SzrjSoftware Foundation; either version 3, or (at your option) any later 9*38fd1498Szrjversion. 10*38fd1498Szrj 11*38fd1498SzrjGCC is distributed in the hope that it will be useful, but WITHOUT ANY 12*38fd1498SzrjWARRANTY; without even the implied warranty of MERCHANTABILITY or 13*38fd1498SzrjFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14*38fd1498Szrjfor more details. 15*38fd1498Szrj 16*38fd1498SzrjYou should have received a copy of the GNU General Public License 17*38fd1498Szrjalong with GCC; see the file COPYING3. If not see 18*38fd1498Szrj<http://www.gnu.org/licenses/>. */ 19*38fd1498Szrj 20*38fd1498Szrj/* This header provides a declarative way of describing the attributes 21*38fd1498Szrj that are applied to some built-in functions by default. Attributes 22*38fd1498Szrj that are meant to be used by user-defined functions but aren't used 23*38fd1498Szrj by any built-ins, or attributes that apply to types or variables 24*38fd1498Szrj but not to functions need not and should not be defined here. 25*38fd1498Szrj 26*38fd1498Szrj Before including this header, you must define the following macros. 27*38fd1498Szrj In each case where there is an ENUM, it is an identifier used to 28*38fd1498Szrj reference the tree in subsequent definitions. 29*38fd1498Szrj 30*38fd1498Szrj DEF_ATTR_NULL_TREE (ENUM) 31*38fd1498Szrj 32*38fd1498Szrj Constructs a NULL_TREE. 33*38fd1498Szrj 34*38fd1498Szrj DEF_ATTR_INT (ENUM, VALUE) 35*38fd1498Szrj 36*38fd1498Szrj Constructs an INTEGER_CST with value VALUE (an integer representable 37*38fd1498Szrj in HOST_WIDE_INT). 38*38fd1498Szrj 39*38fd1498Szrj DEF_ATTR_IDENT (ENUM, STRING) 40*38fd1498Szrj 41*38fd1498Szrj Constructs an IDENTIFIER_NODE for STRING. 42*38fd1498Szrj 43*38fd1498Szrj DEF_ATTR_TREE_LIST (ENUM, PURPOSE, VALUE, CHAIN) 44*38fd1498Szrj 45*38fd1498Szrj Constructs a TREE_LIST with given PURPOSE, VALUE and CHAIN (given 46*38fd1498Szrj as previous ENUM names). */ 47*38fd1498Szrj 48*38fd1498SzrjDEF_ATTR_NULL_TREE (ATTR_NULL) 49*38fd1498Szrj 50*38fd1498Szrj/* Construct a tree for a given integer and a list containing it. */ 51*38fd1498Szrj#define DEF_ATTR_FOR_INT(VALUE) \ 52*38fd1498Szrj DEF_ATTR_INT (ATTR_##VALUE, VALUE) \ 53*38fd1498Szrj DEF_ATTR_TREE_LIST (ATTR_LIST_##VALUE, ATTR_NULL, \ 54*38fd1498Szrj ATTR_##VALUE, ATTR_NULL) 55*38fd1498SzrjDEF_ATTR_FOR_INT (0) 56*38fd1498SzrjDEF_ATTR_FOR_INT (1) 57*38fd1498SzrjDEF_ATTR_FOR_INT (2) 58*38fd1498SzrjDEF_ATTR_FOR_INT (3) 59*38fd1498SzrjDEF_ATTR_FOR_INT (4) 60*38fd1498SzrjDEF_ATTR_FOR_INT (5) 61*38fd1498SzrjDEF_ATTR_FOR_INT (6) 62*38fd1498Szrj#undef DEF_ATTR_FOR_INT 63*38fd1498Szrj 64*38fd1498Szrj/* Construct a tree for a given string and a list containing it. */ 65*38fd1498Szrj#define DEF_ATTR_FOR_STRING(ENUM, VALUE) \ 66*38fd1498Szrj DEF_ATTR_STRING (ATTR_##ENUM, VALUE) \ 67*38fd1498Szrj DEF_ATTR_TREE_LIST (ATTR_LIST_##ENUM, ATTR_NULL, \ 68*38fd1498Szrj ATTR_##ENUM, ATTR_NULL) 69*38fd1498SzrjDEF_ATTR_FOR_STRING (STR1, "1") 70*38fd1498Szrj#undef DEF_ATTR_FOR_STRING 71*38fd1498Szrj 72*38fd1498Szrj/* Construct a tree for a list of two integers. */ 73*38fd1498Szrj#define DEF_LIST_INT_INT(VALUE1, VALUE2) \ 74*38fd1498Szrj DEF_ATTR_TREE_LIST (ATTR_LIST_##VALUE1##_##VALUE2, ATTR_NULL, \ 75*38fd1498Szrj ATTR_##VALUE1, ATTR_LIST_##VALUE2) 76*38fd1498SzrjDEF_LIST_INT_INT (1,0) 77*38fd1498SzrjDEF_LIST_INT_INT (1,2) 78*38fd1498SzrjDEF_LIST_INT_INT (1,3) 79*38fd1498SzrjDEF_LIST_INT_INT (1,4) 80*38fd1498SzrjDEF_LIST_INT_INT (1,5) 81*38fd1498SzrjDEF_LIST_INT_INT (2,0) 82*38fd1498SzrjDEF_LIST_INT_INT (2,3) 83*38fd1498SzrjDEF_LIST_INT_INT (3,0) 84*38fd1498SzrjDEF_LIST_INT_INT (3,4) 85*38fd1498SzrjDEF_LIST_INT_INT (4,0) 86*38fd1498SzrjDEF_LIST_INT_INT (4,5) 87*38fd1498SzrjDEF_LIST_INT_INT (5,0) 88*38fd1498SzrjDEF_LIST_INT_INT (5,6) 89*38fd1498Szrj#undef DEF_LIST_INT_INT 90*38fd1498Szrj 91*38fd1498Szrj/* Construct trees for identifiers used in built-in function attributes. 92*38fd1498Szrj The construction contributes to startup costs so only attributes that 93*38fd1498Szrj are used to define built-ins should be defined here. */ 94*38fd1498SzrjDEF_ATTR_IDENT (ATTR_ALLOC_SIZE, "alloc_size") 95*38fd1498SzrjDEF_ATTR_IDENT (ATTR_COLD, "cold") 96*38fd1498SzrjDEF_ATTR_IDENT (ATTR_CONST, "const") 97*38fd1498SzrjDEF_ATTR_IDENT (ATTR_FORMAT, "format") 98*38fd1498SzrjDEF_ATTR_IDENT (ATTR_FORMAT_ARG, "format_arg") 99*38fd1498SzrjDEF_ATTR_IDENT (ATTR_MALLOC, "malloc") 100*38fd1498SzrjDEF_ATTR_IDENT (ATTR_NONNULL, "nonnull") 101*38fd1498SzrjDEF_ATTR_IDENT (ATTR_NORETURN, "noreturn") 102*38fd1498SzrjDEF_ATTR_IDENT (ATTR_NOTHROW, "nothrow") 103*38fd1498SzrjDEF_ATTR_IDENT (ATTR_LEAF, "leaf") 104*38fd1498SzrjDEF_ATTR_IDENT (ATTR_FNSPEC, "fn spec") 105*38fd1498SzrjDEF_ATTR_IDENT (ATTR_PRINTF, "printf") 106*38fd1498SzrjDEF_ATTR_IDENT (ATTR_ASM_FPRINTF, "asm_fprintf") 107*38fd1498SzrjDEF_ATTR_IDENT (ATTR_GCC_DIAG, "gcc_diag") 108*38fd1498SzrjDEF_ATTR_IDENT (ATTR_GCC_CDIAG, "gcc_cdiag") 109*38fd1498SzrjDEF_ATTR_IDENT (ATTR_GCC_CXXDIAG, "gcc_cxxdiag") 110*38fd1498SzrjDEF_ATTR_IDENT (ATTR_PURE, "pure") 111*38fd1498SzrjDEF_ATTR_IDENT (ATTR_NOVOPS, "no vops") 112*38fd1498SzrjDEF_ATTR_IDENT (ATTR_SCANF, "scanf") 113*38fd1498SzrjDEF_ATTR_IDENT (ATTR_SENTINEL, "sentinel") 114*38fd1498SzrjDEF_ATTR_IDENT (ATTR_STRFMON, "strfmon") 115*38fd1498SzrjDEF_ATTR_IDENT (ATTR_STRFTIME, "strftime") 116*38fd1498SzrjDEF_ATTR_IDENT (ATTR_TYPEGENERIC, "type generic") 117*38fd1498SzrjDEF_ATTR_IDENT (ATTR_TM_REGPARM, "*tm regparm") 118*38fd1498SzrjDEF_ATTR_IDENT (ATTR_TM_TMPURE, "transaction_pure") 119*38fd1498SzrjDEF_ATTR_IDENT (ATTR_RETURNS_TWICE, "returns_twice") 120*38fd1498SzrjDEF_ATTR_IDENT (ATTR_RETURNS_NONNULL, "returns_nonnull") 121*38fd1498Szrj 122*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOVOPS_LIST, ATTR_NOVOPS, ATTR_NULL, ATTR_NULL) 123*38fd1498Szrj 124*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOVOPS_LEAF_LIST, ATTR_LEAF, ATTR_NULL, ATTR_NOVOPS_LIST) 125*38fd1498Szrj 126*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_LEAF_LIST, ATTR_LEAF, ATTR_NULL, ATTR_NULL) 127*38fd1498Szrj 128*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_LIST, ATTR_NOTHROW, ATTR_NULL, ATTR_NULL) 129*38fd1498Szrj 130*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_LEAF_LIST, ATTR_LEAF, ATTR_NULL, ATTR_NOTHROW_LIST) 131*38fd1498Szrj 132*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_LIST, ATTR_CONST, \ 133*38fd1498Szrj ATTR_NULL, ATTR_NOTHROW_LIST) 134*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_LEAF_LIST, ATTR_CONST, \ 135*38fd1498Szrj ATTR_NULL, ATTR_NOTHROW_LEAF_LIST) 136*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_LIST, ATTR_PURE, \ 137*38fd1498Szrj ATTR_NULL, ATTR_NOTHROW_LIST) 138*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_LEAF_LIST, ATTR_PURE, \ 139*38fd1498Szrj ATTR_NULL, ATTR_NOTHROW_LEAF_LIST) 140*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NORETURN_NOTHROW_LIST, ATTR_NORETURN, \ 141*38fd1498Szrj ATTR_NULL, ATTR_NOTHROW_LIST) 142*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NORETURN_NOTHROW_LEAF_LIST, ATTR_NORETURN,\ 143*38fd1498Szrj ATTR_NULL, ATTR_NOTHROW_LEAF_LIST) 144*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NORETURN_NOTHROW_LEAF_COLD_LIST, ATTR_COLD,\ 145*38fd1498Szrj ATTR_NULL, ATTR_NORETURN_NOTHROW_LEAF_LIST) 146*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_RT_NOTHROW_LEAF_LIST, ATTR_RETURNS_TWICE,\ 147*38fd1498Szrj ATTR_NULL, ATTR_NOTHROW_LEAF_LIST) 148*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_COLD_NOTHROW_LEAF_LIST, ATTR_COLD,\ 149*38fd1498Szrj ATTR_NULL, ATTR_NOTHROW_LEAF_LIST) 150*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST, ATTR_COLD,\ 151*38fd1498Szrj ATTR_NULL, ATTR_NORETURN_NOTHROW_LEAF_LIST) 152*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST, ATTR_CONST,\ 153*38fd1498Szrj ATTR_NULL, ATTR_NORETURN_NOTHROW_LEAF_LIST) 154*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_CONST_NORETURN_NOTHROW_LEAF_COLD_LIST, ATTR_COLD,\ 155*38fd1498Szrj ATTR_NULL, ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST) 156*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_LIST, ATTR_MALLOC, \ 157*38fd1498Szrj ATTR_NULL, ATTR_NOTHROW_LIST) 158*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_LEAF_LIST, ATTR_MALLOC, \ 159*38fd1498Szrj ATTR_NULL, ATTR_NOTHROW_LEAF_LIST) 160*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_SENTINEL_NOTHROW_LIST, ATTR_SENTINEL, \ 161*38fd1498Szrj ATTR_NULL, ATTR_NOTHROW_LIST) 162*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_SENTINEL_NOTHROW_LEAF_LIST, ATTR_SENTINEL, \ 163*38fd1498Szrj ATTR_NULL, ATTR_NOTHROW_LEAF_LIST) 164*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_COLD_CONST_NORETURN_NOTHROW_LEAF_LIST, ATTR_CONST,\ 165*38fd1498Szrj ATTR_NULL, ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST) 166*38fd1498Szrj 167*38fd1498Szrj/* Allocation functions like malloc and realloc whose first argument 168*38fd1498Szrj with _SIZE_1, or second argument with _SIZE_2, specifies the size 169*38fd1498Szrj of the allocated object. */ 170*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_MALLOC_SIZE_1_NOTHROW_LIST, ATTR_ALLOC_SIZE, \ 171*38fd1498Szrj ATTR_LIST_1, ATTR_MALLOC_NOTHROW_LIST) 172*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_ALLOC_SIZE_2_NOTHROW_LIST, ATTR_ALLOC_SIZE, \ 173*38fd1498Szrj ATTR_LIST_2, ATTR_MALLOC_NOTHROW_LIST) 174*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_MALLOC_SIZE_1_NOTHROW_LEAF_LIST, ATTR_ALLOC_SIZE, \ 175*38fd1498Szrj ATTR_LIST_1, ATTR_MALLOC_NOTHROW_LEAF_LIST) 176*38fd1498Szrj/* Alloca is just like malloc except that it never returns null. */ 177*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_ALLOCA_SIZE_1_NOTHROW_LEAF_LIST, ATTR_RETURNS_NONNULL, 178*38fd1498Szrj ATTR_NULL, ATTR_MALLOC_SIZE_1_NOTHROW_LEAF_LIST) 179*38fd1498Szrj 180*38fd1498Szrj/* Allocation functions like calloc the product of whose first two arguments 181*38fd1498Szrj specifies the size of the allocated object. */ 182*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_MALLOC_SIZE_1_2_NOTHROW_LEAF_LIST, ATTR_ALLOC_SIZE, \ 183*38fd1498Szrj ATTR_LIST_1_2, ATTR_MALLOC_NOTHROW_LEAF_LIST) 184*38fd1498Szrj 185*38fd1498Szrj/* Allocation functions like realloc whose second argument specifies 186*38fd1498Szrj the size of the allocated object. */ 187*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_ALLOC_SIZE_2_NOTHROW_LEAF_LIST, ATTR_ALLOC_SIZE, \ 188*38fd1498Szrj ATTR_LIST_2, ATTR_NOTHROW_LEAF_LIST) 189*38fd1498Szrj 190*38fd1498Szrj/* Functions whose pointer parameter(s) are all nonnull. */ 191*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NONNULL_LIST, ATTR_NONNULL, ATTR_NULL, ATTR_NULL) 192*38fd1498Szrj/* Functions whose first parameter is a nonnull pointer. */ 193*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NONNULL_1, ATTR_NONNULL, ATTR_LIST_1, ATTR_NULL) 194*38fd1498Szrj/* Functions whose second parameter is a nonnull pointer. */ 195*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NONNULL_2, ATTR_NONNULL, ATTR_LIST_2, ATTR_NULL) 196*38fd1498Szrj/* Functions whose third parameter is a nonnull pointer. */ 197*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NONNULL_3, ATTR_NONNULL, ATTR_LIST_3, ATTR_NULL) 198*38fd1498Szrj/* Nothrow functions with the sentinel(1) attribute. */ 199*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_SENTINEL_1, ATTR_SENTINEL, ATTR_LIST_1, \ 200*38fd1498Szrj ATTR_NOTHROW_LIST) 201*38fd1498Szrj/* Nothrow functions whose pointer parameter(s) are all nonnull. */ 202*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL, ATTR_NONNULL, ATTR_NULL, \ 203*38fd1498Szrj ATTR_NOTHROW_LIST) 204*38fd1498Szrj/* Nothrow leaf functions whose pointer parameter(s) are all nonnull. */ 205*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_LEAF, ATTR_NONNULL, ATTR_NULL, \ 206*38fd1498Szrj ATTR_NOTHROW_LEAF_LIST) 207*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_LEAF_LIST, ATTR_LEAF, ATTR_NULL, ATTR_NOTHROW_NONNULL_LEAF) 208*38fd1498Szrj/* Nothrow functions whose first parameter is a nonnull pointer. */ 209*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1, ATTR_NONNULL, ATTR_LIST_1, \ 210*38fd1498Szrj ATTR_NOTHROW_LIST) 211*38fd1498Szrj/* Nothrow functions whose second parameter is a nonnull pointer. */ 212*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_2, ATTR_NONNULL, ATTR_LIST_2, \ 213*38fd1498Szrj ATTR_NOTHROW_LIST) 214*38fd1498Szrj/* Nothrow functions whose third parameter is a nonnull pointer. */ 215*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_3, ATTR_NONNULL, ATTR_LIST_3, \ 216*38fd1498Szrj ATTR_NOTHROW_LIST) 217*38fd1498Szrj/* Nothrow functions whose fourth parameter is a nonnull pointer. */ 218*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_4, ATTR_NONNULL, ATTR_LIST_4, \ 219*38fd1498Szrj ATTR_NOTHROW_LIST) 220*38fd1498Szrj/* Nothrow functions whose fifth parameter is a nonnull pointer. */ 221*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_5, ATTR_NONNULL, ATTR_LIST_5, \ 222*38fd1498Szrj ATTR_NOTHROW_LIST) 223*38fd1498Szrj 224*38fd1498Szrj/* Same as ATTR_NONNULL_1. */ 225*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NONNULL_1_1, ATTR_NONNULL, ATTR_LIST_1, ATTR_NULL) 226*38fd1498Szrj/* Functions like {v,}fprintf whose first and second parameters are 227*38fd1498Szrj nonnull pointers. As cancellation points the functions are not 228*38fd1498Szrj nothrow. */ 229*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NONNULL_1_2, ATTR_NONNULL, ATTR_LIST_1_2, ATTR_NULL) 230*38fd1498Szrj/* The following don't have {v,}fprintf forms. They exist only to 231*38fd1498Szrj make it possible to declare {v,}{f,s}printf attributes using 232*38fd1498Szrj the same macro. */ 233*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NONNULL_1_3, ATTR_NONNULL, ATTR_LIST_1_3, ATTR_NULL) 234*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NONNULL_1_4, ATTR_NONNULL, ATTR_LIST_1_4, ATTR_NULL) 235*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NONNULL_1_5, ATTR_NONNULL, ATTR_LIST_1_5, ATTR_NULL) 236*38fd1498Szrj 237*38fd1498Szrj/* Same as ATTR_NOTHROW_NONNULL_1. */ 238*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1_1, ATTR_NONNULL, ATTR_LIST_1, 239*38fd1498Szrj ATTR_NOTHROW_LIST) 240*38fd1498Szrj/* Nothrow functions like {v,}sprintf whose first and second parameters 241*38fd1498Szrj are nonnull pointers. */ 242*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1_2, ATTR_NONNULL, ATTR_LIST_1_2, \ 243*38fd1498Szrj ATTR_NOTHROW_LIST) 244*38fd1498Szrj/* Nothrow functions like {v,}snprintf whose first and third parameters 245*38fd1498Szrj are nonnull pointers. */ 246*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1_3, ATTR_NONNULL, ATTR_LIST_1_3, \ 247*38fd1498Szrj ATTR_NOTHROW_LIST) 248*38fd1498Szrj/* Nothrow functions like {v,}sprintf_chk whose first and fourth parameters 249*38fd1498Szrj are nonnull pointers. */ 250*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1_4, ATTR_NONNULL, ATTR_LIST_1_4, \ 251*38fd1498Szrj ATTR_NOTHROW_LIST) 252*38fd1498Szrj/* Nothrow functions like {v,}snprintf_chk whose first and fifth parameters 253*38fd1498Szrj are nonnull pointers. */ 254*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1_5, ATTR_NONNULL, ATTR_LIST_1_5, \ 255*38fd1498Szrj ATTR_NOTHROW_LIST) 256*38fd1498Szrj 257*38fd1498Szrj/* Nothrow leaf functions which are type-generic. */ 258*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_TYPEGENERIC_LEAF, ATTR_TYPEGENERIC, ATTR_NULL, \ 259*38fd1498Szrj ATTR_NOTHROW_LEAF_LIST) 260*38fd1498Szrj/* Nothrow nonnull leaf functions that are type-generic. */ 261*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_TYPEGENERIC_LEAF, 262*38fd1498Szrj ATTR_TYPEGENERIC, ATTR_NULL, 263*38fd1498Szrj ATTR_NOTHROW_NONNULL_LEAF) 264*38fd1498Szrj/* Nothrow const functions whose pointer parameter(s) are all nonnull. */ 265*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_NONNULL, ATTR_CONST, ATTR_NULL, \ 266*38fd1498Szrj ATTR_NOTHROW_NONNULL) 267*38fd1498Szrj/* Nothrow leaf functions whose pointer parameter(s) are all nonnull, 268*38fd1498Szrj and which return their first argument. */ 269*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_RET1_NOTHROW_NONNULL_LEAF, ATTR_FNSPEC, ATTR_LIST_STR1, \ 270*38fd1498Szrj ATTR_NOTHROW_NONNULL_LEAF) 271*38fd1498Szrj/* Nothrow leaf functions whose pointer parameter(s) are all nonnull, 272*38fd1498Szrj and return value is also nonnull. */ 273*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_RETNONNULL_NOTHROW_LEAF, ATTR_RETURNS_NONNULL, ATTR_NULL, \ 274*38fd1498Szrj ATTR_NOTHROW_NONNULL_LEAF) 275*38fd1498Szrj/* Nothrow const leaf functions whose pointer parameter(s) are all nonnull. */ 276*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_NONNULL_LEAF, ATTR_CONST, ATTR_NULL, \ 277*38fd1498Szrj ATTR_NOTHROW_NONNULL_LEAF) 278*38fd1498Szrj/* Nothrow const functions which are type-generic. */ 279*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_TYPEGENERIC, ATTR_TYPEGENERIC, ATTR_NULL, \ 280*38fd1498Szrj ATTR_CONST_NOTHROW_LIST) 281*38fd1498Szrj/* Nothrow const leaf functions which are type-generic. */ 282*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_TYPEGENERIC_LEAF, ATTR_TYPEGENERIC, ATTR_NULL, \ 283*38fd1498Szrj ATTR_CONST_NOTHROW_LEAF_LIST) 284*38fd1498Szrj/* Nothrow pure functions whose pointer parameter(s) are all nonnull. */ 285*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NONNULL, ATTR_PURE, ATTR_NULL, \ 286*38fd1498Szrj ATTR_NOTHROW_NONNULL) 287*38fd1498Szrj/* Nothrow pure leaf functions whose pointer parameter(s) are all nonnull. */ 288*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_NONNULL_LEAF, ATTR_PURE, ATTR_NULL, \ 289*38fd1498Szrj ATTR_NOTHROW_NONNULL_LEAF) 290*38fd1498Szrj/* Nothrow malloc functions whose pointer parameter(s) are all nonnull. */ 291*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_NONNULL, ATTR_MALLOC, ATTR_NULL, \ 292*38fd1498Szrj ATTR_NOTHROW_NONNULL) 293*38fd1498Szrj/* Nothrow malloc leaf functions whose pointer parameter(s) are all nonnull. */ 294*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_NONNULL_LEAF, ATTR_MALLOC, ATTR_NULL, \ 295*38fd1498Szrj ATTR_NOTHROW_NONNULL_LEAF) 296*38fd1498Szrj 297*38fd1498Szrj/* Construct a tree for the format attribute (and implicitly nonnull). */ 298*38fd1498Szrj#define DEF_FORMAT_ATTRIBUTE(TYPE, FA, VALUES) \ 299*38fd1498Szrj DEF_ATTR_TREE_LIST (ATTR_##TYPE##_##VALUES, ATTR_NULL, \ 300*38fd1498Szrj ATTR_##TYPE, ATTR_LIST_##VALUES) \ 301*38fd1498Szrj DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_##VALUES, ATTR_FORMAT, \ 302*38fd1498Szrj ATTR_##TYPE##_##VALUES, ATTR_NONNULL_##FA) 303*38fd1498Szrj 304*38fd1498Szrj/* Construct a tree for the format and nothrow attributes (format 305*38fd1498Szrj implies nonnull). */ 306*38fd1498Szrj#define DEF_FORMAT_ATTRIBUTE_NOTHROW(TYPE, FA, VALUES) \ 307*38fd1498Szrj DEF_ATTR_TREE_LIST (ATTR_##TYPE##_##VALUES, ATTR_NULL, \ 308*38fd1498Szrj ATTR_##TYPE, ATTR_LIST_##VALUES) \ 309*38fd1498Szrj DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_NOTHROW_##VALUES, ATTR_FORMAT,\ 310*38fd1498Szrj ATTR_##TYPE##_##VALUES, ATTR_NOTHROW_NONNULL_##FA) 311*38fd1498Szrj 312*38fd1498Szrj/* Construct one tree for the format attribute and another for the format 313*38fd1498Szrj and nothrow attributes (in both cases format implies nonnull). */ 314*38fd1498Szrj#define DEF_FORMAT_ATTRIBUTE_BOTH(TYPE, FA, VALUES) \ 315*38fd1498Szrj DEF_ATTR_TREE_LIST (ATTR_##TYPE##_##VALUES, ATTR_NULL, \ 316*38fd1498Szrj ATTR_##TYPE, ATTR_LIST_##VALUES) \ 317*38fd1498Szrj DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_##VALUES, ATTR_FORMAT, \ 318*38fd1498Szrj ATTR_##TYPE##_##VALUES, ATTR_NONNULL_##FA) \ 319*38fd1498Szrj DEF_ATTR_TREE_LIST (ATTR_FORMAT_##TYPE##_NOTHROW_##VALUES, ATTR_FORMAT,\ 320*38fd1498Szrj ATTR_##TYPE##_##VALUES, ATTR_NOTHROW_NONNULL_##FA) 321*38fd1498Szrj 322*38fd1498Szrj/* Construct a pair of trees for the nonnull attribute for the first 323*38fd1498Szrj argument, plus format printf attribute (format implies nonnull): 324*38fd1498Szrj the first ordinary and the second nothrow. */ 325*38fd1498Szrj#define DEF_FORMAT_ATTRIBUTE_NONNULL(TYPE, FA, VALUES) \ 326*38fd1498Szrj DEF_ATTR_TREE_LIST (ATTR_NONNULL_1_FORMAT_##TYPE##_##VALUES, \ 327*38fd1498Szrj ATTR_FORMAT, ATTR_##TYPE##_##VALUES, \ 328*38fd1498Szrj ATTR_NONNULL_1_##FA) \ 329*38fd1498Szrj DEF_ATTR_TREE_LIST (ATTR_NOTHROW_NONNULL_1_FORMAT_##TYPE##_##VALUES, \ 330*38fd1498Szrj ATTR_FORMAT, ATTR_##TYPE##_##VALUES, \ 331*38fd1498Szrj ATTR_NOTHROW_NONNULL_1_##FA) 332*38fd1498Szrj 333*38fd1498SzrjDEF_FORMAT_ATTRIBUTE(PRINTF,1,1_0) 334*38fd1498SzrjDEF_FORMAT_ATTRIBUTE(PRINTF,1,1_2) 335*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_BOTH(PRINTF,2,2_0) 336*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_BOTH(PRINTF,2,2_3) 337*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_BOTH(PRINTF,3,3_0) 338*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_BOTH(PRINTF,3,3_4) 339*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF,4,4_0) 340*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF,4,4_5) 341*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF,5,5_0) 342*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NOTHROW(PRINTF,5,5_6) 343*38fd1498Szrj 344*38fd1498Szrj/* Attributes for fprintf(f, f, va). */ 345*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NONNULL(PRINTF,1,1_2) 346*38fd1498Szrj/* Attributes for v{f,s}printf(d, f, va). vsprintf is nothrow, vfprintf 347*38fd1498Szrj is not. */ 348*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NONNULL(PRINTF,2,2_0) 349*38fd1498Szrj/* Attributes for {f,s}printf(d, f, ...). sprintf is nothrow, fprintf 350*38fd1498Szrj is not. */ 351*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NONNULL(PRINTF,2,2_3) 352*38fd1498Szrj/* Attributes for vprintf_chk. */ 353*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NONNULL(PRINTF,3,3_0) 354*38fd1498Szrj/* Attributes for printf_chk. */ 355*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NONNULL(PRINTF,3,3_4) 356*38fd1498Szrj/* Attributes for v{f,s}printf_chk(d, t, bos, f, va). vsprintf_chk is 357*38fd1498Szrj nothrow, vfprintf_chk is not. */ 358*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NONNULL(PRINTF,4,4_0) 359*38fd1498Szrj/* Attributes for {f,s}printf_chk(d, t, bos, f, ...). sprintf_chk is 360*38fd1498Szrj nothrow, fprintf_chk is not. */ 361*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NONNULL(PRINTF,4,4_5) 362*38fd1498Szrj 363*38fd1498SzrjDEF_FORMAT_ATTRIBUTE(SCANF,1,1_0) 364*38fd1498SzrjDEF_FORMAT_ATTRIBUTE(SCANF,1,1_2) 365*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_BOTH(SCANF,2,2_0) 366*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_BOTH(SCANF,2,2_3) 367*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NOTHROW(STRFTIME,3,3_0) 368*38fd1498SzrjDEF_FORMAT_ATTRIBUTE_NOTHROW(STRFMON,3,3_4) 369*38fd1498Szrj#undef DEF_FORMAT_ATTRIBUTE 370*38fd1498Szrj#undef DEF_FORMAT_ATTRIBUTE_NOTHROW 371*38fd1498Szrj#undef DEF_FORMAT_ATTRIBUTE_BOTH 372*38fd1498Szrj 373*38fd1498Szrj/* Transactional memory variants of the above. */ 374*38fd1498Szrj 375*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TM_NOTHROW_LIST, 376*38fd1498Szrj ATTR_TM_REGPARM, ATTR_NULL, ATTR_NOTHROW_LIST) 377*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TM_TMPURE_NOTHROW_LIST, 378*38fd1498Szrj ATTR_TM_TMPURE, ATTR_NULL, ATTR_TM_NOTHROW_LIST) 379*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TM_PURE_TMPURE_NOTHROW_LIST, 380*38fd1498Szrj ATTR_PURE, ATTR_NULL, ATTR_TM_TMPURE_NOTHROW_LIST) 381*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TM_NORETURN_NOTHROW_LIST, 382*38fd1498Szrj ATTR_TM_REGPARM, ATTR_NULL, ATTR_NORETURN_NOTHROW_LIST) 383*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TM_CONST_NOTHROW_LIST, 384*38fd1498Szrj ATTR_TM_REGPARM, ATTR_NULL, ATTR_CONST_NOTHROW_LIST) 385*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TM_NOTHROW_RT_LIST, 386*38fd1498Szrj ATTR_RETURNS_TWICE, ATTR_NULL, ATTR_TM_NOTHROW_LIST) 387*38fd1498Szrj 388*38fd1498Szrj/* Same attributes used for BUILT_IN_MALLOC except with TM_PURE thrown in. */ 389*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TMPURE_MALLOC_NOTHROW_LIST, 390*38fd1498Szrj ATTR_TM_TMPURE, ATTR_NULL, ATTR_MALLOC_NOTHROW_LIST) 391*38fd1498Szrj/* Same attributes used for BUILT_IN_FREE except with TM_PURE thrown in. */ 392*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TMPURE_NOTHROW_LIST, 393*38fd1498Szrj ATTR_TM_TMPURE, ATTR_NULL, ATTR_NOTHROW_LIST) 394*38fd1498Szrj 395*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TMPURE_NOTHROW_LEAF_LIST, 396*38fd1498Szrj ATTR_TM_TMPURE, ATTR_NULL, ATTR_NOTHROW_LEAF_LIST) 397*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST, 398*38fd1498Szrj ATTR_TM_TMPURE, ATTR_NULL, ATTR_NORETURN_NOTHROW_LEAF_LIST) 399*38fd1498SzrjDEF_ATTR_TREE_LIST (ATTR_TMPURE_NORETURN_NOTHROW_LEAF_COLD_LIST, 400*38fd1498Szrj ATTR_COLD, ATTR_NULL, 401*38fd1498Szrj ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST) 402*38fd1498Szrj 403*38fd1498Szrj/* Construct a tree for a format_arg attribute. */ 404*38fd1498Szrj#define DEF_FORMAT_ARG_ATTRIBUTE(FA) \ 405*38fd1498Szrj DEF_ATTR_TREE_LIST (ATTR_FORMAT_ARG_##FA, ATTR_FORMAT_ARG, \ 406*38fd1498Szrj ATTR_LIST_##FA, ATTR_NOTHROW_NONNULL_##FA) 407*38fd1498SzrjDEF_FORMAT_ARG_ATTRIBUTE(1) 408*38fd1498SzrjDEF_FORMAT_ARG_ATTRIBUTE(2) 409*38fd1498Szrj#undef DEF_FORMAT_ARG_ATTRIBUTE 410*38fd1498Szrj 411