Home | History | Annotate | Download | only in lib
      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 /* gettext helper macro.  */
     56 #define N_(Str) Str
     57 
     58 /* Compiler-specific definitions.  */
     59 #define strong_alias(name, aliasname) \
     60   extern __typeof (name) aliasname __attribute__ ((alias (#name)));
     61 
     62 #ifdef __i386__
     63 # define internal_function __attribute__ ((regparm (3), stdcall))
     64 #else
     65 # define internal_function /* nothing */
     66 #endif
     67 
     68 #define internal_strong_alias(name, aliasname) \
     69   extern __typeof (name) aliasname __attribute__ ((alias (#name))) internal_function;
     70 
     71 #ifdef HAVE_VISIBILITY
     72 #define attribute_hidden \
     73   __attribute__ ((visibility ("hidden")))
     74 #else
     75 #define attribute_hidden /* empty */
     76 #endif
     77 
     78 #ifdef HAVE_GCC_STRUCT
     79 #define attribute_packed \
     80   __attribute__ ((packed, gcc_struct))
     81 #else
     82 #define attribute_packed \
     83   __attribute__ ((packed))
     84 #endif
     85 
     86 /* Define ALLOW_UNALIGNED if the architecture allows operations on
     87    unaligned memory locations.  */
     88 #define SANITIZE_UNDEFINED 1
     89 #if (defined __i386__ || defined __x86_64__) && ! CHECK_UNDEFINED
     90 # define ALLOW_UNALIGNED	1
     91 #else
     92 # define ALLOW_UNALIGNED	0
     93 #endif
     94 
     95 #if DEBUGPRED
     96 # ifdef __x86_64__
     97 asm (".section predict_data, \"aw\"; .previous\n"
     98      ".section predict_line, \"a\"; .previous\n"
     99      ".section predict_file, \"a\"; .previous");
    100 #  ifndef PIC
    101 #   define debugpred__(e, E) \
    102   ({ long int _e = !!(e); \
    103      asm volatile (".pushsection predict_data; ..predictcnt%=: .quad 0; .quad 0\n" \
    104                    ".section predict_line; .quad %c1\n" \
    105                    ".section predict_file; .quad %c2; .popsection\n" \
    106                    "addq $1,..predictcnt%=(,%0,8)" \
    107                    : : "r" (_e == E), "i" (__LINE__), "i" (__FILE__)); \
    108     __builtin_expect (_e, E); \
    109   })
    110 #  endif
    111 # elif defined __i386__
    112 asm (".section predict_data, \"aw\"; .previous\n"
    113      ".section predict_line, \"a\"; .previous\n"
    114      ".section predict_file, \"a\"; .previous");
    115 #  ifndef PIC
    116 #   define debugpred__(e, E) \
    117   ({ long int _e = !!(e); \
    118      asm volatile (".pushsection predict_data; ..predictcnt%=: .long 0; .long 0\n" \
    119                    ".section predict_line; .long %c1\n" \
    120                    ".section predict_file; .long %c2; .popsection\n" \
    121                    "incl ..predictcnt%=(,%0,8)" \
    122                    : : "r" (_e == E), "i" (__LINE__), "i" (__FILE__)); \
    123     __builtin_expect (_e, E); \
    124   })
    125 #  endif
    126 # endif
    127 # ifdef debugpred__
    128 #  define unlikely(e) debugpred__ (e,0)
    129 #  define likely(e) debugpred__ (e,1)
    130 # endif
    131 #endif
    132 #ifndef likely
    133 # define unlikely(expr) __builtin_expect (!!(expr), 0)
    134 # define likely(expr) __builtin_expect (!!(expr), 1)
    135 #endif
    136 
    137 #define obstack_calloc(ob, size) \
    138   ({ size_t _s = (size); memset (obstack_alloc (ob, _s), '\0', _s); })
    139 #define obstack_strdup(ob, str) \
    140   ({ const char *_s = (str); obstack_copy0 (ob, _s, strlen (_s)); })
    141 #define obstack_strndup(ob, str, n) \
    142   ({ const char *_s = (str); obstack_copy0 (ob, _s, strnlen (_s, n)); })
    143 
    144 #if __STDC_VERSION__ >= 199901L
    145 # define flexarr_size /* empty */
    146 #else
    147 # define flexarr_size 0
    148 #endif
    149 
    150 /* Calling conventions.  */
    151 #ifdef __i386__
    152 # define CALLING_CONVENTION regparm (3), stdcall
    153 # define AND_CALLING_CONVENTION , regparm (3), stdcall
    154 #else
    155 # define CALLING_CONVENTION
    156 # define AND_CALLING_CONVENTION
    157 #endif
    158 
    159 /* Avoid PLT entries.  */
    160 #ifdef PIC
    161 # define INTUSE(name) _INTUSE(name)
    162 # define _INTUSE(name) __##name##_internal
    163 # define INTDEF(name) _INTDEF(name)
    164 # define _INTDEF(name) \
    165   extern __typeof__ (name) __##name##_internal __attribute__ ((alias (#name)));
    166 # define INTDECL(name) _INTDECL(name)
    167 # define _INTDECL(name) \
    168   extern __typeof__ (name) __##name##_internal attribute_hidden;
    169 #else
    170 # define INTUSE(name) name
    171 # define INTDEF(name) /* empty */
    172 # define INTDECL(name) /* empty */
    173 #endif
    174 
    175 /* This macro is used by the tests conditionalize for standalone building.  */
    176 #define ELFUTILS_HEADER(name) <lib##name.h>
    177 
    178 
    179 #ifdef SYMBOL_VERSIONING
    180 # define OLD_VERSION(name, version) \
    181   asm (".globl _compat." #version "." #name "\n" \
    182        "_compat." #version "." #name " = " #name "\n" \
    183        ".symver _compat." #version "." #name "," #name "@" #version);
    184 # define NEW_VERSION(name, version) \
    185   asm (".symver " #name "," #name "@@@" #version);
    186 # define COMPAT_VERSION_NEWPROTO(name, version, prefix) \
    187   asm (".symver _compat." #version "." #name "," #name "@" #version); \
    188   __typeof (_compat_##prefix##_##name) _compat_##prefix##_##name \
    189     asm ("_compat." #version "." #name);
    190 # define COMPAT_VERSION(name, version, prefix) \
    191   asm (".symver _compat." #version "." #name "," #name "@" #version); \
    192   __typeof (name) _compat_##prefix##_##name asm ("_compat." #version "." #name);
    193 #else
    194 # define OLD_VERSION(name, version) /* Nothing for static linking.  */
    195 # define NEW_VERSION(name, version) /* Nothing for static linking.  */
    196 # define COMPAT_VERSION_NEWPROTO(name, version, prefix) \
    197   error "should use #ifdef SYMBOL_VERSIONING"
    198 # define COMPAT_VERSION(name, version, prefix) error "should use #ifdef SYMBOL_VERSIONING"
    199 #endif
    200 
    201 #ifndef FALLTHROUGH
    202 # ifdef HAVE_FALLTHROUGH
    203 #  define FALLTHROUGH __attribute__ ((fallthrough))
    204 # else
    205 #  define FALLTHROUGH ((void) 0)
    206 # endif
    207 #endif
    208 
    209 #endif	/* eu-config.h */
    210