mirror of https://github.com/nirenjan/libx52.git
				
				
				
			
		
			
				
	
	
		
			243 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			243 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
# ===========================================================================
 | 
						|
#  https://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html
 | 
						|
# ===========================================================================
 | 
						|
#
 | 
						|
# SYNOPSIS
 | 
						|
#
 | 
						|
#   AX_GCC_FUNC_ATTRIBUTE(ATTRIBUTE)
 | 
						|
#
 | 
						|
# DESCRIPTION
 | 
						|
#
 | 
						|
#   This macro checks if the compiler supports one of GCC's function
 | 
						|
#   attributes; many other compilers also provide function attributes with
 | 
						|
#   the same syntax. Compiler warnings are used to detect supported
 | 
						|
#   attributes as unsupported ones are ignored by default so quieting
 | 
						|
#   warnings when using this macro will yield false positives.
 | 
						|
#
 | 
						|
#   The ATTRIBUTE parameter holds the name of the attribute to be checked.
 | 
						|
#
 | 
						|
#   If ATTRIBUTE is supported define HAVE_FUNC_ATTRIBUTE_<ATTRIBUTE>.
 | 
						|
#
 | 
						|
#   The macro caches its result in the ax_cv_have_func_attribute_<attribute>
 | 
						|
#   variable.
 | 
						|
#
 | 
						|
#   The macro currently supports the following function attributes:
 | 
						|
#
 | 
						|
#    alias
 | 
						|
#    aligned
 | 
						|
#    alloc_size
 | 
						|
#    always_inline
 | 
						|
#    artificial
 | 
						|
#    cold
 | 
						|
#    const
 | 
						|
#    constructor
 | 
						|
#    constructor_priority for constructor attribute with priority
 | 
						|
#    deprecated
 | 
						|
#    destructor
 | 
						|
#    dllexport
 | 
						|
#    dllimport
 | 
						|
#    error
 | 
						|
#    externally_visible
 | 
						|
#    fallthrough
 | 
						|
#    flatten
 | 
						|
#    format
 | 
						|
#    format_arg
 | 
						|
#    gnu_format
 | 
						|
#    gnu_inline
 | 
						|
#    hot
 | 
						|
#    ifunc
 | 
						|
#    leaf
 | 
						|
#    malloc
 | 
						|
#    noclone
 | 
						|
#    noinline
 | 
						|
#    nonnull
 | 
						|
#    noreturn
 | 
						|
#    nothrow
 | 
						|
#    optimize
 | 
						|
#    pure
 | 
						|
#    sentinel
 | 
						|
#    sentinel_position
 | 
						|
#    unused
 | 
						|
#    used
 | 
						|
#    visibility
 | 
						|
#    warning
 | 
						|
#    warn_unused_result
 | 
						|
#    weak
 | 
						|
#    weakref
 | 
						|
#
 | 
						|
#   Unsupported function attributes will be tested with a prototype
 | 
						|
#   returning an int and not accepting any arguments and the result of the
 | 
						|
#   check might be wrong or meaningless so use with care.
 | 
						|
#
 | 
						|
# LICENSE
 | 
						|
#
 | 
						|
#   Copyright (c) 2013 Gabriele Svelto <gabriele.svelto@gmail.com>
 | 
						|
#
 | 
						|
#   Copying and distribution of this file, with or without modification, are
 | 
						|
#   permitted in any medium without royalty provided the copyright notice
 | 
						|
#   and this notice are preserved.  This file is offered as-is, without any
 | 
						|
#   warranty.
 | 
						|
 | 
						|
#serial 13
 | 
						|
 | 
						|
AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [
 | 
						|
    AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1])
 | 
						|
 | 
						|
    AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [
 | 
						|
        AC_LINK_IFELSE([AC_LANG_PROGRAM([
 | 
						|
            m4_case([$1],
 | 
						|
                [alias], [
 | 
						|
                    int foo( void ) { return 0; }
 | 
						|
                    int bar( void ) __attribute__(($1("foo")));
 | 
						|
                ],
 | 
						|
                [aligned], [
 | 
						|
                    int foo( void ) __attribute__(($1(32)));
 | 
						|
                ],
 | 
						|
                [alloc_size], [
 | 
						|
                    void *foo(int a) __attribute__(($1(1)));
 | 
						|
                ],
 | 
						|
                [always_inline], [
 | 
						|
                    inline __attribute__(($1)) int foo( void ) { return 0; }
 | 
						|
                ],
 | 
						|
                [artificial], [
 | 
						|
                    inline __attribute__(($1)) int foo( void ) { return 0; }
 | 
						|
                ],
 | 
						|
                [cold], [
 | 
						|
                    int foo( void ) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [const], [
 | 
						|
                    int foo( void ) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [constructor_priority], [
 | 
						|
                    int foo( void ) __attribute__((__constructor__(65535/2)));
 | 
						|
                ],
 | 
						|
                [constructor], [
 | 
						|
                    int foo( void ) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [deprecated], [
 | 
						|
                    int foo( void ) __attribute__(($1("")));
 | 
						|
                ],
 | 
						|
                [destructor], [
 | 
						|
                    int foo( void ) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [dllexport], [
 | 
						|
                    __attribute__(($1)) int foo( void ) { return 0; }
 | 
						|
                ],
 | 
						|
                [dllimport], [
 | 
						|
                    int foo( void ) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [error], [
 | 
						|
                    int foo( void ) __attribute__(($1("")));
 | 
						|
                ],
 | 
						|
                [externally_visible], [
 | 
						|
                    int foo( void ) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [fallthrough], [
 | 
						|
                    void foo( int x ) {switch (x) { case 1: __attribute__(($1)); case 2: break ; }};
 | 
						|
                ],
 | 
						|
                [flatten], [
 | 
						|
                    int foo( void ) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [format], [
 | 
						|
                    int foo(const char *p, ...) __attribute__(($1(printf, 1, 2)));
 | 
						|
                ],
 | 
						|
                [gnu_format], [
 | 
						|
                    int foo(const char *p, ...) __attribute__((format(gnu_printf, 1, 2)));
 | 
						|
                ],
 | 
						|
                [format_arg], [
 | 
						|
                    char *foo(const char *p) __attribute__(($1(1)));
 | 
						|
                ],
 | 
						|
                [gnu_inline], [
 | 
						|
                    inline __attribute__(($1)) int foo( void ) { return 0; }
 | 
						|
                ],
 | 
						|
                [hot], [
 | 
						|
                    int foo( void ) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [ifunc], [
 | 
						|
                    int my_foo( void ) { return 0; }
 | 
						|
                    static int (*resolve_foo(void))(void) { return my_foo; }
 | 
						|
                    int foo( void ) __attribute__(($1("resolve_foo")));
 | 
						|
                ],
 | 
						|
                [leaf], [
 | 
						|
                    __attribute__(($1)) int foo( void ) { return 0; }
 | 
						|
                ],
 | 
						|
                [malloc], [
 | 
						|
                    void *foo( void ) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [noclone], [
 | 
						|
                    int foo( void ) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [noinline], [
 | 
						|
                    __attribute__(($1)) int foo( void ) { return 0; }
 | 
						|
                ],
 | 
						|
                [nonnull], [
 | 
						|
                    int foo(char *p) __attribute__(($1(1)));
 | 
						|
                ],
 | 
						|
                [noreturn], [
 | 
						|
                    void foo( void ) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [nothrow], [
 | 
						|
                    int foo( void ) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [optimize], [
 | 
						|
                    __attribute__(($1(3))) int foo( void ) { return 0; }
 | 
						|
                ],
 | 
						|
                [pure], [
 | 
						|
                    int foo( void ) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [sentinel], [
 | 
						|
                    int foo(void *p, ...) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [sentinel_position], [
 | 
						|
                    int foo(void *p, ...) __attribute__(($1(1)));
 | 
						|
                ],
 | 
						|
                [returns_nonnull], [
 | 
						|
                    void *foo( void ) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [unused], [
 | 
						|
                    int foo( void ) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [used], [
 | 
						|
                    int foo( void ) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [visibility], [
 | 
						|
                    int foo_def( void ) __attribute__(($1("default")));
 | 
						|
                    int foo_hid( void ) __attribute__(($1("hidden")));
 | 
						|
                    int foo_int( void ) __attribute__(($1("internal")));
 | 
						|
                    int foo_pro( void ) __attribute__(($1("protected")));
 | 
						|
                ],
 | 
						|
                [warning], [
 | 
						|
                    int foo( void ) __attribute__(($1("")));
 | 
						|
                ],
 | 
						|
                [warn_unused_result], [
 | 
						|
                    int foo( void ) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [weak], [
 | 
						|
                    int foo( void ) __attribute__(($1));
 | 
						|
                ],
 | 
						|
                [weakref], [
 | 
						|
                    static int foo( void ) { return 0; }
 | 
						|
                    static int bar( void ) __attribute__(($1("foo")));
 | 
						|
                ],
 | 
						|
                [
 | 
						|
                 m4_warn([syntax], [Unsupported attribute $1, the test may fail])
 | 
						|
                 int foo( void ) __attribute__(($1));
 | 
						|
                ]
 | 
						|
            )], [])
 | 
						|
            ],
 | 
						|
            dnl GCC doesn't exit with an error if an unknown attribute is
 | 
						|
            dnl provided but only outputs a warning, so accept the attribute
 | 
						|
            dnl only if no warning were issued.
 | 
						|
            [AS_IF([grep -- -Wattributes conftest.err],
 | 
						|
                [AS_VAR_SET([ac_var], [no])],
 | 
						|
                [AS_VAR_SET([ac_var], [yes])])],
 | 
						|
            [AS_VAR_SET([ac_var], [no])])
 | 
						|
    ])
 | 
						|
 | 
						|
    AS_IF([test yes = AS_VAR_GET([ac_var])],
 | 
						|
        [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1,
 | 
						|
            [Define to 1 if the system has the `$1' function attribute])], [])
 | 
						|
 | 
						|
    AS_VAR_POPDEF([ac_var])
 | 
						|
])
 |