2007-10-19 Marek Habersack <mhabersack@novell.com>
[mono.git] / mono / utils / mono-compiler.h
1 #ifndef __UTILS_MONO_COMPILER_H__
2 #define __UTILS_MONO_COMPILER_H__
3
4 /*
5  * This file includes macros used in the runtime to encapsulate different
6  * compiler behaviours.
7  */
8 #include <config.h>
9
10 #ifdef HAVE_KW_THREAD
11 #if HAVE_TLS_MODEL_ATTR
12
13 #if defined(__PIC__) && !defined(PIC)
14 /*
15  * Must be compiling -fPIE, for executables.  Build PIC
16  * but with initial-exec.
17  * http://bugs.gentoo.org/show_bug.cgi?id=165547
18  */
19 #define PIC
20 #define PIC_INITIAL_EXEC
21 #endif
22
23 /* 
24  * Define this if you want a faster libmono, which cannot be loaded dynamically as a 
25  * module.
26  */
27 //#define PIC_INITIAL_EXEC
28
29 #if defined (__powerpc__)
30 #define MONO_TLS_FAST
31 #elif defined(PIC)
32
33 #ifdef PIC_INITIAL_EXEC
34 #define MONO_TLS_FAST __attribute__((tls_model("initial-exec")))
35 #else
36 #define MONO_TLS_FAST __attribute__((tls_model("local-dynamic")))
37 #endif
38
39 #else
40
41 #define MONO_TLS_FAST __attribute__((tls_model("local-exec")))
42
43 #endif
44
45 #else
46 #define MONO_TLS_FAST 
47 #endif
48
49 #if defined(__GNUC__) && defined(__i386__)
50 #if defined(PIC)
51 #define MONO_THREAD_VAR_OFFSET(var,offset) do { int tmp; __asm ("call 1f; 1: popl %0; addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %0; movl " #var "@gotntpoff(%0), %1" : "=r" (tmp), "=r" (offset)); } while (0)
52 #else
53 #define MONO_THREAD_VAR_OFFSET(var,offset) __asm ("movl $" #var "@ntpoff, %0" : "=r" (offset))
54 #endif
55 #elif defined(__x86_64__)
56 #if defined(PIC)
57 // This only works if libmono is linked into the application
58 #define MONO_THREAD_VAR_OFFSET(var,offset) do { guint64 foo;  __asm ("movq " #var "@GOTTPOFF(%%rip), %0" : "=r" (foo)); offset = foo; } while (0)
59 #else
60 #define MONO_THREAD_VAR_OFFSET(var,offset) do { guint64 foo;  __asm ("movq $" #var "@TPOFF, %0" : "=r" (foo)); offset = foo; } while (0)
61 #endif
62 #elif defined(__ia64__) && !defined(__INTEL_COMPILER)
63 #define MONO_THREAD_VAR_OFFSET(var,offset) __asm ("addl %0 = @tprel(" #var "#), r0 ;;\n" : "=r" (offset))
64 #else
65 #define MONO_THREAD_VAR_OFFSET(var,offset) (offset) = -1
66 #endif
67
68 #if defined(PIC) && !defined(PIC_INITIAL_EXEC)
69 /* 
70  * The above definitions do not seem to work if libmono is loaded dynamically as a module.
71  * See bug #78767.
72  */
73 #undef MONO_THREAD_VAR_OFFSET
74 #define MONO_THREAD_VAR_OFFSET(var,offset) (offset) = -1
75 #endif
76
77 #else /* no HAVE_KW_THREAD */
78
79 #define MONO_THREAD_VAR_OFFSET(var,offset) (offset) = -1
80
81 #endif
82
83 /* Deal with Microsoft C compiler differences */
84 #ifdef _MSC_VER
85
86 #include <float.h>
87 #define isnan(x)        _isnan(x)
88 #define trunc(x)        (((x) < 0) ? ceil((x)) : floor((x)))
89 #define isinf(x)        (_isnan(x) ? 0 : (_fpclass(x) == _FPCLASS_NINF) ? -1 : (_fpclass(x) == _FPCLASS_PINF) ? 1 : 0)
90 #define isnormal(x)     _finite(x)
91
92 #define popen           _popen
93 #define pclose          _pclose
94
95 #include <direct.h>
96 #define mkdir(x)        _mkdir(x)
97
98 /* GCC specific functions aren't available */
99 #define __builtin_return_address(x)     NULL
100
101 #define __func__ __FUNCTION__
102
103 #endif /* _MSC_VER */
104
105 #if !defined(PLATFORM_WIN32) && HAVE_VISIBILITY_HIDDEN
106 #define MONO_INTERNAL __attribute__ ((visibility ("hidden")))
107 #else
108 #define MONO_INTERNAL 
109 #endif
110
111 #endif /* __UTILS_MONO_COMPILER_H__*/
112