# 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 # # 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")));'), }