2007-07-24 Rodrigo Kumpera <rkumpera@novell.com>
[mono.git] / mono / utils / mono-compiler.h
index 0de9ab321000c72e90c8a92f409404e3dc3c3c60..e52e81d8e2c19e49aa523ad54e4865e7dab939d7 100644 (file)
@@ -9,12 +9,26 @@
 #ifdef HAVE_KW_THREAD
 #if HAVE_TLS_MODEL_ATTR
 
+/* 
+ * Define this if you want a faster libmono, which cannot be loaded dynamically as a 
+ * module.
+ */
+//#define PIC_INITIAL_EXEC
+
 #if defined (__powerpc__)
 #define MONO_TLS_FAST
 #elif defined(PIC)
+
+#ifdef PIC_INITIAL_EXEC
 #define MONO_TLS_FAST __attribute__((tls_model("initial-exec")))
 #else
+#define MONO_TLS_FAST __attribute__((tls_model("local-dynamic")))
+#endif
+
+#else
+
 #define MONO_TLS_FAST __attribute__((tls_model("local-exec")))
+
 #endif
 
 #else
@@ -29,6 +43,7 @@
 #endif
 #elif defined(__x86_64__)
 #if defined(PIC)
+// This only works if libmono is linked into the application
 #define MONO_THREAD_VAR_OFFSET(var,offset) do { guint64 foo;  __asm ("movq " #var "@GOTTPOFF(%%rip), %0" : "=r" (foo)); offset = foo; } while (0)
 #else
 #define MONO_THREAD_VAR_OFFSET(var,offset) do { guint64 foo;  __asm ("movq $" #var "@TPOFF, %0" : "=r" (foo)); offset = foo; } while (0)
 #define MONO_THREAD_VAR_OFFSET(var,offset) (offset) = -1
 #endif
 
+#if defined(PIC) && !defined(PIC_INITIAL_EXEC)
+/* 
+ * The above definitions do not seem to work if libmono is loaded dynamically as a module.
+ * See bug #78767.
+ */
+#undef MONO_THREAD_VAR_OFFSET
+#define MONO_THREAD_VAR_OFFSET(var,offset) (offset) = -1
+#endif
+
 #else /* no HAVE_KW_THREAD */
 
 #define MONO_THREAD_VAR_OFFSET(var,offset) (offset) = -1
@@ -67,7 +91,7 @@
 
 #endif /* _MSC_VER */
 
-#if HAVE_VISIBILITY_HIDDEN
+#if !defined(_MSC_VER) && HAVE_VISIBILITY_HIDDEN
 #define MONO_INTERNAL __attribute__ ((visibility ("hidden")))
 #else
 #define MONO_INTERNAL