• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Configuration definitions.
2    Copyright (C) 2008, 2009 Red Hat, Inc.
3    This file is part of elfutils.
4 
5    This file is free software; you can redistribute it and/or modify
6    it under the terms of either
7 
8      * the GNU Lesser General Public License as published by the Free
9        Software Foundation; either version 3 of the License, or (at
10        your option) any later version
11 
12    or
13 
14      * the GNU General Public License as published by the Free
15        Software Foundation; either version 2 of the License, or (at
16        your option) any later version
17 
18    or both in parallel, as here.
19 
20    elfutils is distributed in the hope that it will be useful, but
21    WITHOUT ANY WARRANTY; without even the implied warranty of
22    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23    General Public License for more details.
24 
25    You should have received copies of the GNU General Public License and
26    the GNU Lesser General Public License along with this program.  If
27    not, see <http://www.gnu.org/licenses/>.  */
28 
29 #ifndef EU_CONFIG_H
30 #define EU_CONFIG_H	1
31 
32 #ifdef USE_LOCKS
33 # include <pthread.h>
34 # include <assert.h>
35 # define rwlock_define(class,name)	class pthread_rwlock_t name
36 # define RWLOCK_CALL(call)		\
37   ({ int _err = pthread_rwlock_ ## call; assert_perror (_err); })
38 # define rwlock_init(lock)		RWLOCK_CALL (init (&lock, NULL))
39 # define rwlock_fini(lock)		RWLOCK_CALL (destroy (&lock))
40 # define rwlock_rdlock(lock)		RWLOCK_CALL (rdlock (&lock))
41 # define rwlock_wrlock(lock)		RWLOCK_CALL (wrlock (&lock))
42 # define rwlock_unlock(lock)		RWLOCK_CALL (unlock (&lock))
43 #else
44 /* Eventually we will allow multi-threaded applications to use the
45    libraries.  Therefore we will add the necessary locking although
46    the macros used expand to nothing for now.  */
47 # define rwlock_define(class,name) class int name
48 # define rwlock_init(lock) ((void) (lock))
49 # define rwlock_fini(lock) ((void) (lock))
50 # define rwlock_rdlock(lock) ((void) (lock))
51 # define rwlock_wrlock(lock) ((void) (lock))
52 # define rwlock_unlock(lock) ((void) (lock))
53 #endif	/* USE_LOCKS */
54 
55 #include <libintl.h>
56 /* gettext helper macros.  */
57 #define N_(Str) Str
58 #define _(Str) dgettext ("elfutils", Str)
59 
60 /* Compiler-specific definitions.  */
61 #define strong_alias(name, aliasname) \
62   extern __typeof (name) aliasname __attribute__ ((alias (#name)));
63 
64 #ifdef __i386__
65 # define internal_function __attribute__ ((regparm (3), stdcall))
66 #else
67 # define internal_function /* nothing */
68 #endif
69 
70 #define internal_strong_alias(name, aliasname) \
71   extern __typeof (name) aliasname __attribute__ ((alias (#name))) internal_function;
72 
73 #ifdef HAVE_VISIBILITY
74 #define attribute_hidden \
75   __attribute__ ((visibility ("hidden")))
76 #else
77 #define attribute_hidden /* empty */
78 #endif
79 
80 #ifdef HAVE_GCC_STRUCT
81 #define attribute_packed \
82   __attribute__ ((packed, gcc_struct))
83 #else
84 #define attribute_packed \
85   __attribute__ ((packed))
86 #endif
87 
88 /* Define ALLOW_UNALIGNED if the architecture allows operations on
89    unaligned memory locations.  */
90 #define SANITIZE_UNDEFINED 1
91 #if (defined __i386__ || defined __x86_64__) && ! CHECK_UNDEFINED
92 # define ALLOW_UNALIGNED	1
93 #else
94 # define ALLOW_UNALIGNED	0
95 #endif
96 
97 #if DEBUGPRED
98 # ifdef __x86_64__
99 asm (".section predict_data, \"aw\"; .previous\n"
100      ".section predict_line, \"a\"; .previous\n"
101      ".section predict_file, \"a\"; .previous");
102 #  ifndef PIC
103 #   define debugpred__(e, E) \
104   ({ long int _e = !!(e); \
105      asm volatile (".pushsection predict_data; ..predictcnt%=: .quad 0; .quad 0\n" \
106                    ".section predict_line; .quad %c1\n" \
107                    ".section predict_file; .quad %c2; .popsection\n" \
108                    "addq $1,..predictcnt%=(,%0,8)" \
109                    : : "r" (_e == E), "i" (__LINE__), "i" (__FILE__)); \
110     __builtin_expect (_e, E); \
111   })
112 #  endif
113 # elif defined __i386__
114 asm (".section predict_data, \"aw\"; .previous\n"
115      ".section predict_line, \"a\"; .previous\n"
116      ".section predict_file, \"a\"; .previous");
117 #  ifndef PIC
118 #   define debugpred__(e, E) \
119   ({ long int _e = !!(e); \
120      asm volatile (".pushsection predict_data; ..predictcnt%=: .long 0; .long 0\n" \
121                    ".section predict_line; .long %c1\n" \
122                    ".section predict_file; .long %c2; .popsection\n" \
123                    "incl ..predictcnt%=(,%0,8)" \
124                    : : "r" (_e == E), "i" (__LINE__), "i" (__FILE__)); \
125     __builtin_expect (_e, E); \
126   })
127 #  endif
128 # endif
129 # ifdef debugpred__
130 #  define unlikely(e) debugpred__ (e,0)
131 #  define likely(e) debugpred__ (e,1)
132 # endif
133 #endif
134 #ifndef likely
135 # define unlikely(expr) __builtin_expect (!!(expr), 0)
136 # define likely(expr) __builtin_expect (!!(expr), 1)
137 #endif
138 
139 #define obstack_calloc(ob, size) \
140   ({ size_t _s = (size); memset (obstack_alloc (ob, _s), '\0', _s); })
141 #define obstack_strdup(ob, str) \
142   ({ const char *_s = (str); obstack_copy0 (ob, _s, strlen (_s)); })
143 #define obstack_strndup(ob, str, n) \
144   ({ const char *_s = (str); obstack_copy0 (ob, _s, strnlen (_s, n)); })
145 
146 #if __STDC_VERSION__ >= 199901L
147 # define flexarr_size /* empty */
148 #else
149 # define flexarr_size 0
150 #endif
151 
152 /* Calling conventions.  */
153 #ifdef __i386__
154 # define CALLING_CONVENTION regparm (3), stdcall
155 # define AND_CALLING_CONVENTION , regparm (3), stdcall
156 #else
157 # define CALLING_CONVENTION
158 # define AND_CALLING_CONVENTION
159 #endif
160 
161 /* Avoid PLT entries.  */
162 #ifdef PIC
163 # define INTUSE(name) _INTUSE(name)
164 # define _INTUSE(name) __##name##_internal
165 # define INTDEF(name) _INTDEF(name)
166 # define _INTDEF(name) \
167   extern __typeof__ (name) __##name##_internal __attribute__ ((alias (#name)));
168 # define INTDECL(name) _INTDECL(name)
169 # define _INTDECL(name) \
170   extern __typeof__ (name) __##name##_internal attribute_hidden;
171 #else
172 # define INTUSE(name) name
173 # define INTDEF(name) /* empty */
174 # define INTDECL(name) /* empty */
175 #endif
176 
177 /* This macro is used by the tests conditionalize for standalone building.  */
178 #define ELFUTILS_HEADER(name) <lib##name.h>
179 
180 /* Don't reorder with global asm blocks or optimize away. (Doesn't reliably
181    keep it in the same LTO partition, though; -flto-partition=none may be
182    still needed for some gcc versions < 10.) */
183 #ifdef __has_attribute
184 # if __has_attribute(no_reorder)
185 #  define used_in_asm __attribute__ ((externally_visible, no_reorder))
186 # endif
187 #endif
188 #ifndef used_in_asm
189 # define used_in_asm /* empty */
190 #endif
191 
192 #ifdef SYMBOL_VERSIONING
193 # define NEW_INTDEF(name) __typeof (name) INTUSE(name) \
194   __attribute__ ((alias ("_new." #name))) attribute_hidden;
195 # ifdef __has_attribute
196 #  if __has_attribute(symver)
197 #   define NEW_VERSION(name, version) \
198   __typeof (name) name __asm__ ("_new." #name) \
199     __attribute__ ((symver (#name "@@" #version)));
200 #   define OLD_VERSION(name, version) _OLD_VERSION1(name, __COUNTER__, version)
201 #   define _OLD_VERSION1(name, num, version) _OLD_VERSION2(name, num, version)
202 #   define _OLD_VERSION2(name, num, version) \
203   __typeof (name) _compat_old##num##_##name \
204     __asm__ ("_compat." #version "." #name) \
205     __attribute__ ((alias ("_new." #name), symver (#name "@" #version)));
206 #   define COMPAT_VERSION_NEWPROTO(name, version, prefix) \
207   __typeof (_compat_##prefix##_##name) _compat_##prefix##_##name \
208     __asm__ ("_compat." #version "." #name) \
209     __attribute__ ((symver (#name "@" #version)));
210 #   define COMPAT_VERSION(name, version, prefix) \
211   asm (".symver _compat." #version "." #name "," #name "@" #version); \
212   __typeof (name) _compat_##prefix##_##name \
213     __asm__ ("_compat." #version "." #name) \
214     __attribute__ ((symver (#name "@" #version)));
215 #  endif
216 # endif
217 # ifndef NEW_VERSION
218 #  define OLD_VERSION(name, version) \
219   asm (".globl _compat." #version "." #name "\n\t" \
220        "_compat." #version "." #name " = _new." #name "\n\t" \
221        ".symver _compat." #version "." #name "," #name "@" #version);
222 #  define NEW_VERSION(name, version) \
223   __typeof (name) name __asm__ ("_new." #name) used_in_asm; \
224   asm (".symver _new." #name ", " #name "@@" #version);
225 #  define COMPAT_VERSION_NEWPROTO(name, version, prefix) \
226   __typeof (_compat_##prefix##_##name) _compat_##prefix##_##name \
227     __asm__ ("_compat." #version "." #name) used_in_asm; \
228   asm (".symver _compat." #version "." #name ", " #name "@" #version);
229 #  define COMPAT_VERSION(name, version, prefix) \
230   __typeof (name) _compat_##prefix##_##name \
231     __asm__ ("_compat." #version "." #name) used_in_asm; \
232   asm (".symver _compat." #version "." #name ", " #name "@" #version);
233 # endif
234 #else
235 # define NEW_INTDEF(name) INTDEF(name)
236 # define OLD_VERSION(name, version) /* Nothing for static linking.  */
237 # define NEW_VERSION(name, version) /* Nothing for static linking.  */
238 # define COMPAT_VERSION_NEWPROTO(name, version, prefix) \
239   error "should use #ifdef SYMBOL_VERSIONING"
240 # define COMPAT_VERSION(name, version, prefix) \
241   error "should use #ifdef SYMBOL_VERSIONING"
242 #endif
243 
244 #ifndef FALLTHROUGH
245 # ifdef HAVE_FALLTHROUGH
246 #  define FALLTHROUGH __attribute__ ((fallthrough))
247 # else
248 #  define FALLTHROUGH ((void) 0)
249 # endif
250 #endif
251 
252 #endif	/* eu-config.h */
253