root/lib/attribute.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


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

/* [<][>][^][v][top][bottom][index][help] */