1*820c1a8dSHiroo HAYASHI /* ATTRIBUTE_* macros for using attributes in GCC and similar compilers 2*820c1a8dSHiroo HAYASHI 3*820c1a8dSHiroo HAYASHI Copyright 2020-2021 Free Software Foundation, Inc. 4*820c1a8dSHiroo HAYASHI 5*820c1a8dSHiroo HAYASHI This file is free software: you can redistribute it and/or modify 6*820c1a8dSHiroo HAYASHI it under the terms of the GNU Lesser General Public License as 7*820c1a8dSHiroo HAYASHI published by the Free Software Foundation; either version 2.1 of the 8*820c1a8dSHiroo HAYASHI License, or (at your option) any later version. 9*820c1a8dSHiroo HAYASHI 10*820c1a8dSHiroo HAYASHI This file is distributed in the hope that it will be useful, 11*820c1a8dSHiroo HAYASHI but WITHOUT ANY WARRANTY; without even the implied warranty of 12*820c1a8dSHiroo HAYASHI MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*820c1a8dSHiroo HAYASHI GNU Lesser General Public License for more details. 14*820c1a8dSHiroo HAYASHI 15*820c1a8dSHiroo HAYASHI You should have received a copy of the GNU Lesser General Public License 16*820c1a8dSHiroo HAYASHI along with this program. If not, see <https://www.gnu.org/licenses/>. */ 17*820c1a8dSHiroo HAYASHI 18*820c1a8dSHiroo HAYASHI /* Written by Paul Eggert. */ 19*820c1a8dSHiroo HAYASHI 20*820c1a8dSHiroo HAYASHI /* Provide public ATTRIBUTE_* names for the private _GL_ATTRIBUTE_* 21*820c1a8dSHiroo HAYASHI macros used within Gnulib. */ 22*820c1a8dSHiroo HAYASHI 23*820c1a8dSHiroo HAYASHI /* These attributes can be placed in two ways: 24*820c1a8dSHiroo HAYASHI - At the start of a declaration (i.e. even before storage-class 25*820c1a8dSHiroo HAYASHI specifiers!); then they apply to all entities that are declared 26*820c1a8dSHiroo HAYASHI by the declaration. 27*820c1a8dSHiroo HAYASHI - Immediately after the name of an entity being declared by the 28*820c1a8dSHiroo HAYASHI declaration; then they apply to that entity only. */ 29*820c1a8dSHiroo HAYASHI 30*820c1a8dSHiroo HAYASHI #ifndef _GL_ATTRIBUTE_H 31*820c1a8dSHiroo HAYASHI #define _GL_ATTRIBUTE_H 32*820c1a8dSHiroo HAYASHI 33*820c1a8dSHiroo HAYASHI 34*820c1a8dSHiroo HAYASHI /* This file defines two types of attributes: 35*820c1a8dSHiroo HAYASHI * C2X standard attributes. These have macro names that do not begin with 36*820c1a8dSHiroo HAYASHI 'ATTRIBUTE_'. 37*820c1a8dSHiroo HAYASHI * Selected GCC attributes; see: 38*820c1a8dSHiroo HAYASHI https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html 39*820c1a8dSHiroo HAYASHI https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html 40*820c1a8dSHiroo HAYASHI https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html 41*820c1a8dSHiroo HAYASHI These names begin with 'ATTRIBUTE_' to avoid name clashes. */ 42*820c1a8dSHiroo HAYASHI 43*820c1a8dSHiroo HAYASHI 44*820c1a8dSHiroo HAYASHI /* =============== Attributes for specific kinds of functions =============== */ 45*820c1a8dSHiroo HAYASHI 46*820c1a8dSHiroo HAYASHI /* Attributes for functions that should not be used. */ 47*820c1a8dSHiroo HAYASHI 48*820c1a8dSHiroo HAYASHI /* Warn if the entity is used. */ 49*820c1a8dSHiroo HAYASHI /* Applies to: 50*820c1a8dSHiroo HAYASHI - function, variable, 51*820c1a8dSHiroo HAYASHI - struct, union, struct/union member, 52*820c1a8dSHiroo HAYASHI - enumeration, enumeration item, 53*820c1a8dSHiroo HAYASHI - typedef, 54*820c1a8dSHiroo HAYASHI in C++ also: namespace, class, template specialization. */ 55*820c1a8dSHiroo HAYASHI #define DEPRECATED _GL_ATTRIBUTE_DEPRECATED 56*820c1a8dSHiroo HAYASHI 57*820c1a8dSHiroo HAYASHI /* If a function call is not optimized way, warn with MSG. */ 58*820c1a8dSHiroo HAYASHI /* Applies to: functions. */ 59*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_WARNING(msg) _GL_ATTRIBUTE_WARNING (msg) 60*820c1a8dSHiroo HAYASHI 61*820c1a8dSHiroo HAYASHI /* If a function call is not optimized way, report an error with MSG. */ 62*820c1a8dSHiroo HAYASHI /* Applies to: functions. */ 63*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_ERROR(msg) _GL_ATTRIBUTE_ERROR (msg) 64*820c1a8dSHiroo HAYASHI 65*820c1a8dSHiroo HAYASHI 66*820c1a8dSHiroo HAYASHI /* Attributes for memory-allocating functions. */ 67*820c1a8dSHiroo HAYASHI 68*820c1a8dSHiroo HAYASHI /* The function returns a pointer to freshly allocated memory. */ 69*820c1a8dSHiroo HAYASHI /* Applies to: functions. */ 70*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_MALLOC _GL_ATTRIBUTE_MALLOC 71*820c1a8dSHiroo HAYASHI 72*820c1a8dSHiroo HAYASHI /* ATTRIBUTE_ALLOC_SIZE ((N)) - The Nth argument of the function 73*820c1a8dSHiroo HAYASHI is the size of the returned memory block. 74*820c1a8dSHiroo HAYASHI ATTRIBUTE_ALLOC_SIZE ((M, N)) - Multiply the Mth and Nth arguments 75*820c1a8dSHiroo HAYASHI to determine the size of the returned memory block. */ 76*820c1a8dSHiroo HAYASHI /* Applies to: function, pointer to function, function types. */ 77*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_ALLOC_SIZE(args) _GL_ATTRIBUTE_ALLOC_SIZE (args) 78*820c1a8dSHiroo HAYASHI 79*820c1a8dSHiroo HAYASHI 80*820c1a8dSHiroo HAYASHI /* Attributes for variadic functions. */ 81*820c1a8dSHiroo HAYASHI 82*820c1a8dSHiroo HAYASHI /* The variadic function expects a trailing NULL argument. 83*820c1a8dSHiroo HAYASHI ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99). 84*820c1a8dSHiroo HAYASHI ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL. */ 85*820c1a8dSHiroo HAYASHI /* Applies to: functions. */ 86*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_SENTINEL(pos) _GL_ATTRIBUTE_SENTINEL (pos) 87*820c1a8dSHiroo HAYASHI 88*820c1a8dSHiroo HAYASHI 89*820c1a8dSHiroo HAYASHI /* ================== Attributes for compiler diagnostics ================== */ 90*820c1a8dSHiroo HAYASHI 91*820c1a8dSHiroo HAYASHI /* Attributes that help the compiler diagnose programmer mistakes. 92*820c1a8dSHiroo HAYASHI Some of them may also help for some compiler optimizations. */ 93*820c1a8dSHiroo HAYASHI 94*820c1a8dSHiroo HAYASHI /* ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)) - 95*820c1a8dSHiroo HAYASHI The STRING-INDEXth function argument is a format string of style 96*820c1a8dSHiroo HAYASHI ARCHETYPE, which is one of: 97*820c1a8dSHiroo HAYASHI printf, gnu_printf 98*820c1a8dSHiroo HAYASHI scanf, gnu_scanf, 99*820c1a8dSHiroo HAYASHI strftime, gnu_strftime, 100*820c1a8dSHiroo HAYASHI strfmon, 101*820c1a8dSHiroo HAYASHI or the same thing prefixed and suffixed with '__'. 102*820c1a8dSHiroo HAYASHI If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK 103*820c1a8dSHiroo HAYASHI are suitable for the format string. */ 104*820c1a8dSHiroo HAYASHI /* Applies to: functions. */ 105*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_FORMAT(spec) _GL_ATTRIBUTE_FORMAT (spec) 106*820c1a8dSHiroo HAYASHI 107*820c1a8dSHiroo HAYASHI /* ATTRIBUTE_NONNULL ((N1, N2,...)) - Arguments N1, N2,... must not be NULL. 108*820c1a8dSHiroo HAYASHI ATTRIBUTE_NONNULL () - All pointer arguments must not be null. */ 109*820c1a8dSHiroo HAYASHI /* Applies to: functions. */ 110*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_NONNULL(args) _GL_ATTRIBUTE_NONNULL (args) 111*820c1a8dSHiroo HAYASHI 112*820c1a8dSHiroo HAYASHI /* The function's return value is a non-NULL pointer. */ 113*820c1a8dSHiroo HAYASHI /* Applies to: functions. */ 114*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_RETURNS_NONNULL _GL_ATTRIBUTE_RETURNS_NONNULL 115*820c1a8dSHiroo HAYASHI 116*820c1a8dSHiroo HAYASHI /* Warn if the caller does not use the return value, 117*820c1a8dSHiroo HAYASHI unless the caller uses something like ignore_value. */ 118*820c1a8dSHiroo HAYASHI /* Applies to: function, enumeration, class. */ 119*820c1a8dSHiroo HAYASHI #define NODISCARD _GL_ATTRIBUTE_NODISCARD 120*820c1a8dSHiroo HAYASHI 121*820c1a8dSHiroo HAYASHI 122*820c1a8dSHiroo HAYASHI /* Attributes that disable false alarms when the compiler diagnoses 123*820c1a8dSHiroo HAYASHI programmer "mistakes". */ 124*820c1a8dSHiroo HAYASHI 125*820c1a8dSHiroo HAYASHI /* Do not warn if the entity is not used. */ 126*820c1a8dSHiroo HAYASHI /* Applies to: 127*820c1a8dSHiroo HAYASHI - function, variable, 128*820c1a8dSHiroo HAYASHI - struct, union, struct/union member, 129*820c1a8dSHiroo HAYASHI - enumeration, enumeration item, 130*820c1a8dSHiroo HAYASHI - typedef, 131*820c1a8dSHiroo HAYASHI in C++ also: class. */ 132*820c1a8dSHiroo HAYASHI #define MAYBE_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED 133*820c1a8dSHiroo HAYASHI 134*820c1a8dSHiroo HAYASHI /* The contents of a character array is not meant to be NUL-terminated. */ 135*820c1a8dSHiroo HAYASHI /* Applies to: struct/union members and variables that are arrays of element 136*820c1a8dSHiroo HAYASHI type '[[un]signed] char'. */ 137*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_NONSTRING _GL_ATTRIBUTE_NONSTRING 138*820c1a8dSHiroo HAYASHI 139*820c1a8dSHiroo HAYASHI /* Do not warn if control flow falls through to the immediately 140*820c1a8dSHiroo HAYASHI following 'case' or 'default' label. */ 141*820c1a8dSHiroo HAYASHI /* Applies to: Empty statement (;), inside a 'switch' statement. */ 142*820c1a8dSHiroo HAYASHI #define FALLTHROUGH _GL_ATTRIBUTE_FALLTHROUGH 143*820c1a8dSHiroo HAYASHI 144*820c1a8dSHiroo HAYASHI 145*820c1a8dSHiroo HAYASHI /* ================== Attributes for debugging information ================== */ 146*820c1a8dSHiroo HAYASHI 147*820c1a8dSHiroo HAYASHI /* Attributes regarding debugging information emitted by the compiler. */ 148*820c1a8dSHiroo HAYASHI 149*820c1a8dSHiroo HAYASHI /* Omit the function from stack traces when debugging. */ 150*820c1a8dSHiroo HAYASHI /* Applies to: function. */ 151*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_ARTIFICIAL _GL_ATTRIBUTE_ARTIFICIAL 152*820c1a8dSHiroo HAYASHI 153*820c1a8dSHiroo HAYASHI /* Make the entity visible to debuggers etc., even with '-fwhole-program'. */ 154*820c1a8dSHiroo HAYASHI /* Applies to: functions, variables. */ 155*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_EXTERNALLY_VISIBLE _GL_ATTRIBUTE_EXTERNALLY_VISIBLE 156*820c1a8dSHiroo HAYASHI 157*820c1a8dSHiroo HAYASHI 158*820c1a8dSHiroo HAYASHI /* ========== Attributes that mainly direct compiler optimizations ========== */ 159*820c1a8dSHiroo HAYASHI 160*820c1a8dSHiroo HAYASHI /* The function does not throw exceptions. */ 161*820c1a8dSHiroo HAYASHI /* Applies to: functions. */ 162*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_NOTHROW _GL_ATTRIBUTE_NOTHROW 163*820c1a8dSHiroo HAYASHI 164*820c1a8dSHiroo HAYASHI /* Do not inline the function. */ 165*820c1a8dSHiroo HAYASHI /* Applies to: functions. */ 166*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_NOINLINE _GL_ATTRIBUTE_NOINLINE 167*820c1a8dSHiroo HAYASHI 168*820c1a8dSHiroo HAYASHI /* Always inline the function, and report an error if the compiler 169*820c1a8dSHiroo HAYASHI cannot inline. */ 170*820c1a8dSHiroo HAYASHI /* Applies to: function. */ 171*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_ALWAYS_INLINE _GL_ATTRIBUTE_ALWAYS_INLINE 172*820c1a8dSHiroo HAYASHI 173*820c1a8dSHiroo HAYASHI /* It is OK for a compiler to omit duplicate calls with the same arguments. 174*820c1a8dSHiroo HAYASHI This attribute is safe for a function that neither depends on 175*820c1a8dSHiroo HAYASHI nor affects observable state, and always returns exactly once - 176*820c1a8dSHiroo HAYASHI e.g., does not loop forever, and does not call longjmp. 177*820c1a8dSHiroo HAYASHI (This attribute is stricter than ATTRIBUTE_PURE.) */ 178*820c1a8dSHiroo HAYASHI /* Applies to: functions. */ 179*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_CONST _GL_ATTRIBUTE_CONST 180*820c1a8dSHiroo HAYASHI 181*820c1a8dSHiroo HAYASHI /* It is OK for a compiler to omit duplicate calls with the same 182*820c1a8dSHiroo HAYASHI arguments if observable state is not changed between calls. 183*820c1a8dSHiroo HAYASHI This attribute is safe for a function that does not affect 184*820c1a8dSHiroo HAYASHI observable state, and always returns exactly once. 185*820c1a8dSHiroo HAYASHI (This attribute is looser than ATTRIBUTE_CONST.) */ 186*820c1a8dSHiroo HAYASHI /* Applies to: functions. */ 187*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_PURE _GL_ATTRIBUTE_PURE 188*820c1a8dSHiroo HAYASHI 189*820c1a8dSHiroo HAYASHI /* The function is rarely executed. */ 190*820c1a8dSHiroo HAYASHI /* Applies to: functions. */ 191*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_COLD _GL_ATTRIBUTE_COLD 192*820c1a8dSHiroo HAYASHI 193*820c1a8dSHiroo HAYASHI /* If called from some other compilation unit, the function executes 194*820c1a8dSHiroo HAYASHI code from that unit only by return or by exception handling, 195*820c1a8dSHiroo HAYASHI letting the compiler optimize that unit more aggressively. */ 196*820c1a8dSHiroo HAYASHI /* Applies to: functions. */ 197*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_LEAF _GL_ATTRIBUTE_LEAF 198*820c1a8dSHiroo HAYASHI 199*820c1a8dSHiroo HAYASHI /* For struct members: The member has the smallest possible alignment. 200*820c1a8dSHiroo HAYASHI For struct, union, class: All members have the smallest possible alignment, 201*820c1a8dSHiroo HAYASHI minimizing the memory required. */ 202*820c1a8dSHiroo HAYASHI /* Applies to: struct members, struct, union, 203*820c1a8dSHiroo HAYASHI in C++ also: class. */ 204*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_PACKED _GL_ATTRIBUTE_PACKED 205*820c1a8dSHiroo HAYASHI 206*820c1a8dSHiroo HAYASHI 207*820c1a8dSHiroo HAYASHI /* ================ Attributes that make invalid code valid ================ */ 208*820c1a8dSHiroo HAYASHI 209*820c1a8dSHiroo HAYASHI /* Attributes that prevent fatal compiler optimizations for code that is not 210*820c1a8dSHiroo HAYASHI fully ISO C compliant. */ 211*820c1a8dSHiroo HAYASHI 212*820c1a8dSHiroo HAYASHI /* Pointers to the type may point to the same storage as pointers to 213*820c1a8dSHiroo HAYASHI other types, thus disabling strict aliasing optimization. */ 214*820c1a8dSHiroo HAYASHI /* Applies to: types. */ 215*820c1a8dSHiroo HAYASHI #define ATTRIBUTE_MAY_ALIAS _GL_ATTRIBUTE_MAY_ALIAS 216*820c1a8dSHiroo HAYASHI 217*820c1a8dSHiroo HAYASHI 218*820c1a8dSHiroo HAYASHI #endif /* _GL_ATTRIBUTE_H */ 219