1# =========================================================================== 2# http://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html 3# =========================================================================== 4# 5# SYNOPSIS 6# 7# AX_GCC_FUNC_ATTRIBUTE(ATTRIBUTE) 8# 9# DESCRIPTION 10# 11# This macro checks if the compiler supports one of GCC's function 12# attributes; many other compilers also provide function attributes with 13# the same syntax. Compiler warnings are used to detect supported 14# attributes as unsupported ones are ignored by default so quieting 15# warnings when using this macro will yield false positives. 16# 17# The ATTRIBUTE parameter holds the name of the attribute to be checked. 18# 19# If ATTRIBUTE is supported define HAVE_FUNC_ATTRIBUTE_<ATTRIBUTE>. 20# 21# The macro caches its result in the ax_cv_have_func_attribute_<attribute> 22# variable. 23# 24# The macro currently supports the following function attributes: 25# 26# alias 27# aligned 28# alloc_size 29# always_inline 30# artificial 31# cold 32# const 33# constructor 34# constructor_priority for constructor attribute with priority 35# deprecated 36# destructor 37# dllexport 38# dllimport 39# error 40# externally_visible 41# flatten 42# format 43# format_arg 44# gnu_inline 45# hot 46# ifunc 47# leaf 48# malloc 49# noclone 50# noinline 51# nonnull 52# noreturn 53# nothrow 54# optimize 55# pure 56# unused 57# used 58# visibility 59# warning 60# warn_unused_result 61# weak 62# weakref 63# 64# Unsuppored function attributes will be tested with a prototype returning 65# an int and not accepting any arguments and the result of the check might 66# be wrong or meaningless so use with care. 67# 68# LICENSE 69# 70# Copyright (c) 2013 Gabriele Svelto <[email protected]> 71# 72# Copying and distribution of this file, with or without modification, are 73# permitted in any medium without royalty provided the copyright notice 74# and this notice are preserved. This file is offered as-is, without any 75# warranty. 76 77#serial 4 78 79AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ 80 AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1]) 81 82 AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [ 83 AC_LINK_IFELSE([AC_LANG_PROGRAM([ 84 m4_case([$1], 85 [alias], [ 86 int foo( void ) { return 0; } 87 int bar( void ) __attribute__(($1("foo"))); 88 ], 89 [aligned], [ 90 int foo( void ) __attribute__(($1(32))); 91 ], 92 [alloc_size], [ 93 void *foo(int a) __attribute__(($1(1))); 94 ], 95 [always_inline], [ 96 inline __attribute__(($1)) int foo( void ) { return 0; } 97 ], 98 [artificial], [ 99 inline __attribute__(($1)) int foo( void ) { return 0; } 100 ], 101 [cold], [ 102 int foo( void ) __attribute__(($1)); 103 ], 104 [const], [ 105 int foo( void ) __attribute__(($1)); 106 ], 107 [constructor_priority], [ 108 int foo( void ) __attribute__((__constructor__(65535/2))); 109 ], 110 [constructor], [ 111 int foo( void ) __attribute__(($1)); 112 ], 113 [deprecated], [ 114 int foo( void ) __attribute__(($1(""))); 115 ], 116 [destructor], [ 117 int foo( void ) __attribute__(($1)); 118 ], 119 [dllexport], [ 120 __attribute__(($1)) int foo( void ) { return 0; } 121 ], 122 [dllimport], [ 123 int foo( void ) __attribute__(($1)); 124 ], 125 [error], [ 126 int foo( void ) __attribute__(($1(""))); 127 ], 128 [externally_visible], [ 129 int foo( void ) __attribute__(($1)); 130 ], 131 [flatten], [ 132 int foo( void ) __attribute__(($1)); 133 ], 134 [format], [ 135 int foo(const char *p, ...) __attribute__(($1(printf, 1, 2))); 136 ], 137 [format_arg], [ 138 char *foo(const char *p) __attribute__(($1(1))); 139 ], 140 [gnu_inline], [ 141 inline __attribute__(($1)) int foo( void ) { return 0; } 142 ], 143 [hot], [ 144 int foo( void ) __attribute__(($1)); 145 ], 146 [ifunc], [ 147 int my_foo( void ) { return 0; } 148 static int (*resolve_foo(void))(void) { return my_foo; } 149 int foo( void ) __attribute__(($1("resolve_foo"))); 150 ], 151 [leaf], [ 152 __attribute__(($1)) int foo( void ) { return 0; } 153 ], 154 [malloc], [ 155 void *foo( void ) __attribute__(($1)); 156 ], 157 [noclone], [ 158 int foo( void ) __attribute__(($1)); 159 ], 160 [noinline], [ 161 __attribute__(($1)) int foo( void ) { return 0; } 162 ], 163 [nonnull], [ 164 int foo(char *p) __attribute__(($1(1))); 165 ], 166 [noreturn], [ 167 void foo( void ) __attribute__(($1)); 168 ], 169 [nothrow], [ 170 int foo( void ) __attribute__(($1)); 171 ], 172 [optimize], [ 173 __attribute__(($1(3))) int foo( void ) { return 0; } 174 ], 175 [pure], [ 176 int foo( void ) __attribute__(($1)); 177 ], 178 [returns_nonnull], [ 179 void *foo( void ) __attribute__(($1)); 180 ], 181 [unused], [ 182 int foo( void ) __attribute__(($1)); 183 ], 184 [used], [ 185 int foo( void ) __attribute__(($1)); 186 ], 187 [visibility], [ 188 int foo_def( void ) __attribute__(($1("default"))); 189 int foo_hid( void ) __attribute__(($1("hidden"))); 190 int foo_int( void ) __attribute__(($1("internal"))); 191 int foo_pro( void ) __attribute__(($1("protected"))); 192 ], 193 [warning], [ 194 int foo( void ) __attribute__(($1(""))); 195 ], 196 [warn_unused_result], [ 197 int foo( void ) __attribute__(($1)); 198 ], 199 [weak], [ 200 int foo( void ) __attribute__(($1)); 201 ], 202 [weakref], [ 203 static int foo( void ) { return 0; } 204 static int bar( void ) __attribute__(($1("foo"))); 205 ], 206 [ 207 m4_warn([syntax], [Unsupported attribute $1, the test may fail]) 208 int foo( void ) __attribute__(($1)); 209 ] 210 )], []) 211 ], 212 dnl GCC doesn't exit with an error if an unknown attribute is 213 dnl provided but only outputs a warning, so accept the attribute 214 dnl only if no warning were issued. 215 [AS_IF([test -s conftest.err], 216 [AS_VAR_SET([ac_var], [no])], 217 [AS_VAR_SET([ac_var], [yes])])], 218 [AS_VAR_SET([ac_var], [no])]) 219 ]) 220 221 AS_IF([test yes = AS_VAR_GET([ac_var])], 222 [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1, 223 [Define to 1 if the system has the `$1' function attribute])], []) 224 225 AS_VAR_POPDEF([ac_var]) 226]) 227