| # These functions are based on the following code: | |
| # https://git.savannah.gnu.org/gitweb/?p=autoconf-archive.git;a=blob_plain;f=m4/ax_gcc_func_attribute.m4, | |
| # which is licensed under the following terms: | |
| # | |
| # 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. | |
| # | |
| C_FUNC_ATTRIBUTES = { | |
| 'alias': ''' | |
| int foo(void) { return 0; } | |
| int bar(void) __attribute__((alias("foo")));''', | |
| 'aligned': | |
| 'int foo(void) __attribute__((aligned(32)));', | |
| 'alloc_size': | |
| 'void *foo(int a) __attribute__((alloc_size(1)));', | |
| 'always_inline': | |
| 'inline __attribute__((always_inline)) int foo(void) { return 0; }', | |
| 'artificial': | |
| 'inline __attribute__((artificial)) int foo(void) { return 0; }', | |
| 'cold': | |
| 'int foo(void) __attribute__((cold));', | |
| 'const': | |
| 'int foo(void) __attribute__((const));', | |
| 'constructor': | |
| 'int foo(void) __attribute__((constructor));', | |
| 'constructor_priority': | |
| 'int foo( void ) __attribute__((__constructor__(65535/2)));', | |
| 'deprecated': | |
| 'int foo(void) __attribute__((deprecated("")));', | |
| 'destructor': | |
| 'int foo(void) __attribute__((destructor));', | |
| 'dllexport': | |
| '__declspec(dllexport) int foo(void) { return 0; }', | |
| 'dllimport': | |
| '__declspec(dllimport) int foo(void);', | |
| 'error': | |
| 'int foo(void) __attribute__((error("")));', | |
| 'externally_visible': | |
| 'int foo(void) __attribute__((externally_visible));', | |
| 'fallthrough': ''' | |
| int foo( void ) { | |
| switch (0) { | |
| case 1: __attribute__((fallthrough)); | |
| case 2: break; | |
| } | |
| return 0; | |
| };''', | |
| 'flatten': | |
| 'int foo(void) __attribute__((flatten));', | |
| 'format': | |
| 'int foo(const char * p, ...) __attribute__((format(printf, 1, 2)));', | |
| 'format_arg': | |
| 'char * foo(const char * p) __attribute__((format_arg(1)));', | |
| 'force_align_arg_pointer': | |
| '__attribute__((force_align_arg_pointer)) int foo(void) { return 0; }', | |
| 'gnu_inline': | |
| 'inline __attribute__((gnu_inline)) int foo(void) { return 0; }', | |
| 'hot': | |
| 'int foo(void) __attribute__((hot));', | |
| 'ifunc': | |
| ('int my_foo(void) { return 0; }' | |
| 'static int (*resolve_foo(void))(void) { return my_foo; }' | |
| 'int foo(void) __attribute__((ifunc("resolve_foo")));'), | |
| 'leaf': | |
| '__attribute__((leaf)) int foo(void) { return 0; }', | |
| 'malloc': | |
| 'int *foo(void) __attribute__((malloc));', | |
| 'noclone': | |
| 'int foo(void) __attribute__((noclone));', | |
| 'noinline': | |
| '__attribute__((noinline)) int foo(void) { return 0; }', | |
| 'nonnull': | |
| 'int foo(char * p) __attribute__((nonnull(1)));', | |
| 'noreturn': | |
| 'int foo(void) __attribute__((noreturn));', | |
| 'nothrow': | |
| 'int foo(void) __attribute__((nothrow));', | |
| 'optimize': | |
| '__attribute__((optimize(3))) int foo(void) { return 0; }', | |
| 'packed': | |
| 'struct __attribute__((packed)) foo { int bar; };', | |
| 'pure': | |
| 'int foo(void) __attribute__((pure));', | |
| 'returns_nonnull': | |
| 'int *foo(void) __attribute__((returns_nonnull));', | |
| 'unused': | |
| 'int foo(void) __attribute__((unused));', | |
| 'used': | |
| 'int foo(void) __attribute__((used));', | |
| 'visibility': ''' | |
| int foo_def(void) __attribute__((visibility("default"))); | |
| int foo_hid(void) __attribute__((visibility("hidden"))); | |
| int foo_int(void) __attribute__((visibility("internal")));''', | |
| 'visibility:default': | |
| 'int foo(void) __attribute__((visibility("default")));', | |
| 'visibility:hidden': | |
| 'int foo(void) __attribute__((visibility("hidden")));', | |
| 'visibility:internal': | |
| 'int foo(void) __attribute__((visibility("internal")));', | |
| 'visibility:protected': | |
| 'int foo(void) __attribute__((visibility("protected")));', | |
| 'warning': | |
| 'int foo(void) __attribute__((warning("")));', | |
| 'warn_unused_result': | |
| 'int foo(void) __attribute__((warn_unused_result));', | |
| 'weak': | |
| 'int foo(void) __attribute__((weak));', | |
| 'weakref': ''' | |
| static int foo(void) { return 0; } | |
| static int var(void) __attribute__((weakref("foo")));''', | |
| } | |
| CXX_FUNC_ATTRIBUTES = { | |
| # Alias must be applied to the mangled name in C++ | |
| 'alias': | |
| ('extern "C" {' | |
| 'int foo(void) { return 0; }' | |
| '}' | |
| 'int bar(void) __attribute__((alias("foo")));' | |
| ), | |
| 'ifunc': | |
| ('extern "C" {' | |
| 'int my_foo(void) { return 0; }' | |
| 'static int (*resolve_foo(void))(void) { return my_foo; }' | |
| '}' | |
| 'int foo(void) __attribute__((ifunc("resolve_foo")));'), | |
| } |