1 #ifndef __UTILS_MONO_COMPILER_H__
2 #define __UTILS_MONO_COMPILER_H__
4 * This file includes macros used in the runtime to encapsulate different
10 #if HAVE_TLS_MODEL_ATTR
12 #if defined (__powerpc__)
15 #define MONO_TLS_FAST __attribute__((tls_model("initial-exec")))
17 #define MONO_TLS_FAST __attribute__((tls_model("local-exec")))
24 #if defined(__GNUC__) && defined(__i386__)
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)
28 #define MONO_THREAD_VAR_OFFSET(var,offset) __asm ("movl $" #var "@ntpoff, %0" : "=r" (offset))
30 #elif defined(__x86_64__)
32 #define MONO_THREAD_VAR_OFFSET(var,offset) do { guint64 foo; __asm ("movq " #var "@GOTTPOFF(%%rip), %0" : "=r" (foo)); offset = foo; } while (0)
34 #define MONO_THREAD_VAR_OFFSET(var,offset) do { guint64 foo; __asm ("movq $" #var "@TPOFF, %0" : "=r" (foo)); offset = foo; } while (0)
36 #elif defined(__ia64__) && !defined(__INTEL_COMPILER)
37 #define MONO_THREAD_VAR_OFFSET(var,offset) __asm ("addl %0 = @tprel(" #var "#), r0 ;;\n" : "=r" (offset))
39 #define MONO_THREAD_VAR_OFFSET(var,offset) (offset) = -1
42 #else /* no HAVE_KW_THREAD */
44 #define MONO_THREAD_VAR_OFFSET(var,offset) (offset) = -1
48 /* Deal with Microsoft C compiler differences */
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)
58 #define pclose _pclose
61 #define mkdir(x) _mkdir(x)
63 /* GCC specific functions aren't available */
64 #define __builtin_return_address(x) NULL
69 #endif /* __UTILS_MONO_COMPILER_H__*/