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