1 #ifndef _CDEFS_COMPAT_H_ 2 #define _CDEFS_COMPAT_H_ 3 4 #if !defined(__BEGIN_DECLS) 5 #if defined(__cplusplus) 6 #define __BEGIN_DECLS extern "C" { 7 #define __END_DECLS } 8 #else 9 #define __BEGIN_DECLS 10 #define __END_DECLS 11 #endif 12 #endif /* !defined(__BEGIN_DECLS) */ 13 14 #ifdef __GNUC__ 15 #ifndef __strong_reference 16 #ifdef __APPLE__ 17 #define __strong_reference(sym,aliassym) __weak_reference(sym,aliassym) 18 #else 19 #define __strong_reference(sym,aliassym) \ 20 OLM_DLLEXPORT extern __typeof (sym) aliassym __attribute__ ((__alias__ (#sym))); 21 #endif /* __APPLE__ */ 22 #endif /* __strong_reference */ 23 24 #ifndef __weak_reference 25 #ifdef __ELF__ 26 #ifdef __STDC__ 27 #define __weak_reference(sym,alias) \ 28 __asm__(".weak " #alias); \ 29 __asm__(".equ " #alias ", " #sym) 30 #ifndef __warn_references 31 #define __warn_references(sym,msg) \ 32 __asm__(".section .gnu.warning." #sym); \ 33 __asm__(".asciz \"" msg "\""); \ 34 __asm__(".previous") 35 #endif /* __warn_references */ 36 #else 37 #define __weak_reference(sym,alias) \ 38 __asm__(".weak alias"); \ 39 __asm__(".equ alias, sym") 40 #ifndef __warn_references 41 #define __warn_references(sym,msg) \ 42 __asm__(".section .gnu.warning.sym"); \ 43 __asm__(".asciz \"msg\""); \ 44 __asm__(".previous") 45 #endif /* __warn_references */ 46 #endif /* __STDC__ */ 47 #elif defined(__clang__) /* CLANG */ 48 #ifdef __STDC__ 49 #define __weak_reference(sym,alias) \ 50 __asm__(".weak_reference " #alias); \ 51 __asm__(".set " #alias ", " #sym) 52 #else 53 #define __weak_reference(sym,alias) \ 54 __asm__(".weak_reference alias");\ 55 __asm__(".set alias, sym") 56 #endif 57 #else /* !__ELF__ */ 58 #ifdef __STDC__ 59 #define __weak_reference(sym,alias) \ 60 __asm__(".stabs \"_" #alias "\",11,0,0,0"); \ 61 __asm__(".stabs \"_" #sym "\",1,0,0,0") 62 #ifndef __warn_references 63 #define __warn_references(sym,msg) \ 64 __asm__(".stabs \"" msg "\",30,0,0,0"); \ 65 __asm__(".stabs \"_" #sym "\",1,0,0,0") 66 #endif /* __warn_references */ 67 #else 68 #define __weak_reference(sym,alias) \ 69 __asm__(".stabs \"_/**/alias\",11,0,0,0"); \ 70 __asm__(".stabs \"_/**/sym\",1,0,0,0") 71 #ifndef __warn_references 72 #define __warn_references(sym,msg) \ 73 __asm__(".stabs msg,30,0,0,0"); \ 74 __asm__(".stabs \"_/**/sym\",1,0,0,0") 75 #endif /* __warn_references */ 76 #endif /* __STDC__ */ 77 #endif /* __ELF__ */ 78 #endif /* __weak_reference */ 79 #endif /* __GNUC__ */ 80 81 82 #endif /* _CDEFS_COMPAT_H_ */ 83