xref: /relibc/openlibm/src/cdefs-compat.h (revision 72bfab46a0c76a5a9168a66213976bd6dcc28ee5)
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