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