Tue Feb 28 13:58:50 CET 2006 Paolo Molaro <lupus@ximian.com>
[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 #if defined (__powerpc__)
13 #define MONO_TLS_FAST
14 #elif defined(PIC)
15 #define MONO_TLS_FAST __attribute__((tls_model("initial-exec")))
16 #else
17 #define MONO_TLS_FAST __attribute__((tls_model("local-exec")))
18 #endif
19
20 #else
21 #define MONO_TLS_FAST 
22 #endif
23
24 #if defined(__GNUC__) && defined(__i386__)
25 #if defined(PIC)
26 #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)
27 #else
28 #define MONO_THREAD_VAR_OFFSET(var,offset) __asm ("movl $" #var "@ntpoff, %0" : "=r" (offset))
29 #endif
30 #elif defined(__x86_64__)
31 #if defined(PIC)
32 #define MONO_THREAD_VAR_OFFSET(var,offset) do { guint64 foo;  __asm ("movq " #var "@GOTTPOFF(%%rip), %0" : "=r" (foo)); offset = foo; } while (0)
33 #else
34 #define MONO_THREAD_VAR_OFFSET(var,offset) do { guint64 foo;  __asm ("movq $" #var "@TPOFF, %0" : "=r" (foo)); offset = foo; } while (0)
35 #endif
36 #elif defined(__ia64__) && !defined(__INTEL_COMPILER)
37 #define MONO_THREAD_VAR_OFFSET(var,offset) __asm ("addl %0 = @tprel(" #var "#), r0 ;;\n" : "=r" (offset))
38 #else
39 #define MONO_THREAD_VAR_OFFSET(var,offset) (offset) = -1
40 #endif
41
42 #else /* no HAVE_KW_THREAD */
43
44 #define MONO_THREAD_VAR_OFFSET(var,offset) (offset) = -1
45
46 #endif
47
48 /* Deal with Microsoft C compiler differences */
49 #ifdef _MSC_VER
50
51 #include <float.h>
52 #define isnan(x)        _isnan(x)
53 #define trunc(x)        floor((x))
54 #define isinf(x)        (_isnan(x) ? 0 : (_fpclass(x) == _FPCLASS_NINF) ? -1 : (_fpclass(x) == _FPCLASS_PINF) ? 1 : 0)
55 #define isnormal(x)     _finite(x)
56
57 #define popen           _popen
58 #define pclose          _pclose
59
60 #include <direct.h>
61 #define mkdir(x)        _mkdir(x)
62
63 /* GCC specific functions aren't available */
64 #define __builtin_return_address(x)     NULL
65
66 #endif /* _MSC_VER */
67
68
69 #endif /* __UTILS_MONO_COMPILER_H__*/
70