1 #ifndef __UTILS_MONO_COMPILER_H__
2 #define __UTILS_MONO_COMPILER_H__
5 * This file includes macros used in the runtime to encapsulate different
11 #if HAVE_TLS_MODEL_ATTR
13 #if defined(__PIC__) && !defined(PIC)
15 * Must be compiling -fPIE, for executables. Build PIC
16 * but with initial-exec.
17 * http://bugs.gentoo.org/show_bug.cgi?id=165547
20 #define PIC_INITIAL_EXEC
24 * Define this if you want a faster libmono, which cannot be loaded dynamically as a
27 //#define PIC_INITIAL_EXEC
29 #if defined (__powerpc__)
33 #ifdef PIC_INITIAL_EXEC
34 #define MONO_TLS_FAST __attribute__((tls_model("initial-exec")))
36 #define MONO_TLS_FAST __attribute__((tls_model("local-dynamic")))
41 #define MONO_TLS_FAST __attribute__((tls_model("local-exec")))
49 #if defined(__GNUC__) && defined(__i386__)
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)
53 #define MONO_THREAD_VAR_OFFSET(var,offset) __asm ("movl $" #var "@ntpoff, %0" : "=r" (offset))
55 #elif defined(__x86_64__)
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)
60 #define MONO_THREAD_VAR_OFFSET(var,offset) do { guint64 foo; __asm ("movq $" #var "@TPOFF, %0" : "=r" (foo)); offset = foo; } while (0)
62 #elif defined(__ia64__) && !defined(__INTEL_COMPILER)
64 #define MONO_THREAD_VAR_OFFSET(var,offset) __asm ("addl %0 = @ltoff(@tprel(" #var "#)), gp ;; ld8 %0 = [%0]\n" : "=r" (offset))
66 #define MONO_THREAD_VAR_OFFSET(var,offset) __asm ("addl %0 = @tprel(" #var "#), r0 ;;\n" : "=r" (offset))
69 #define MONO_THREAD_VAR_OFFSET(var,offset) (offset) = -1
72 #if defined(PIC) && !defined(PIC_INITIAL_EXEC)
74 * The above definitions do not seem to work if libmono is loaded dynamically as a module.
77 #undef MONO_THREAD_VAR_OFFSET
78 #define MONO_THREAD_VAR_OFFSET(var,offset) (offset) = -1
81 #else /* no HAVE_KW_THREAD */
83 #define MONO_THREAD_VAR_OFFSET(var,offset) (offset) = -1
87 /* Deal with Microsoft C compiler differences */
91 #define isnan(x) _isnan(x)
92 #define trunc(x) (((x) < 0) ? ceil((x)) : floor((x)))
93 #define isinf(x) (_isnan(x) ? 0 : (_fpclass(x) == _FPCLASS_NINF) ? -1 : (_fpclass(x) == _FPCLASS_PINF) ? 1 : 0)
94 #define isnormal(x) _finite(x)
97 #define pclose _pclose
100 #define mkdir(x) _mkdir(x)
102 /* GCC specific functions aren't available */
103 #define __builtin_return_address(x) NULL
105 #define __func__ __FUNCTION__
107 #endif /* _MSC_VER */
109 #if !defined(PLATFORM_WIN32) && HAVE_VISIBILITY_HIDDEN
110 #define MONO_INTERNAL __attribute__ ((visibility ("hidden")))
112 #define MONO_INTERNAL
115 #endif /* __UTILS_MONO_COMPILER_H__*/