1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
# 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));',
'null_terminated_string_arg':
'int foo(const char * p) __attribute__((null_terminated_string_arg(1)));',
'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));',
'section': '''
#if defined(__APPLE__) && defined(__MACH__)
extern int foo __attribute__((section("__BAR,__bar")));
#else
extern int foo __attribute__((section(".bar")));
#endif''',
'sentinel':
'int foo(const char *bar, ...) __attribute__((sentinel));',
'unused':
'int foo(void) __attribute__((unused));',
'used':
'int foo(void) __attribute__((used));',
'vector_size':
'__attribute__((vector_size(32))); int foo(void) { return 0; }',
'visibility': '''
int foo_def(void) __attribute__((visibility("default"))); int foo_def(void) { return 0; }
int foo_hid(void) __attribute__((visibility("hidden"))); int foo_hid(void) { return 0; }
int foo_int(void) __attribute__((visibility("internal"))); int foo_int(void) { return 0; }''',
'visibility:default':
'int foo(void) __attribute__((visibility("default"))); int foo(void) { return 0; }',
'visibility:hidden':
'int foo(void) __attribute__((visibility("hidden"))); int foo(void) { return 0; }',
'visibility:internal':
'int foo(void) __attribute__((visibility("internal"))); int foo(void) { return 0; }',
'visibility:protected':
'int foo(void) __attribute__((visibility("protected"))); int foo(void) { return 0; }',
'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")));''',
'retain': '__attribute__((retain)) int x;',
}
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")));'),
}
|