Move dummy_use to a header and give it a sucky MSVC implementation.
authorRodrigo Kumpera <kumpera@gmail.com>
Fri, 27 Jan 2012 21:10:16 +0000 (19:10 -0200)
committerRodrigo Kumpera <kumpera@gmail.com>
Fri, 27 Jan 2012 21:10:16 +0000 (19:10 -0200)
mono/metadata/sgen-cardtable.c
mono/metadata/sgen-gc.c
mono/metadata/sgen-gc.h

index 940d578ed7eb84dd134da9393420c719f419519e..af04d1584d1f666f28813d5233fdb2495941da22 100644 (file)
@@ -79,21 +79,13 @@ cards_in_range (mword address, mword size)
        return (end >> CARD_BITS) - (address >> CARD_BITS) + 1;
 }
 
-/*
- * This causes the compile to extend the liveness of 'v' till the call to dummy_use
- */
-static void
-dummy_use (gpointer v) {
-       __asm__ volatile ("" : "=r"(v) : "r"(v));
-}
-
 void
 mono_sgen_card_table_wbarrier_set_field (MonoObject *obj, gpointer field_ptr, MonoObject* value)
 {
        *(void**)field_ptr = value;
        if (mono_sgen_ptr_in_nursery (value))
                sgen_card_table_mark_address ((mword)field_ptr);
-       dummy_use (value);
+       mono_sgen_dummy_use (value);
 }
 
 void
@@ -102,7 +94,7 @@ mono_sgen_card_table_wbarrier_set_arrayref (MonoArray *arr, gpointer slot_ptr, M
        *(void**)slot_ptr = value;
        if (mono_sgen_ptr_in_nursery (value))
                sgen_card_table_mark_address ((mword)slot_ptr);
-       dummy_use (value);      
+       mono_sgen_dummy_use (value);    
 }
 
 void
@@ -122,7 +114,7 @@ mono_sgen_card_table_wbarrier_arrayref_copy (gpointer dest_ptr, gpointer src_ptr
                        *dest = value;
                        if (mono_sgen_ptr_in_nursery (value))
                                sgen_card_table_mark_address ((mword)dest);
-                       dummy_use (value);
+                       mono_sgen_dummy_use (value);
                }
        } else {
                gpointer *end = dest + count;
@@ -131,7 +123,7 @@ mono_sgen_card_table_wbarrier_arrayref_copy (gpointer dest_ptr, gpointer src_ptr
                        *dest = value;
                        if (mono_sgen_ptr_in_nursery (value))
                                sgen_card_table_mark_address ((mword)dest);
-                       dummy_use (value);
+                       mono_sgen_dummy_use (value);
                }
        }       
 }
index 450fdedf5cce8a06bcd16993b99b55534143551b..5263430902792f40de95cc9a71c6127fd3871a35 100644 (file)
@@ -4770,14 +4770,6 @@ mono_gc_pthread_exit (void *retval)
  * ######################################################################
  */
 
-/*
- * This causes the compile to extend the liveness of 'v' till the call to dummy_use
- */
-static void
-dummy_use (gpointer v) {
-       __asm__ volatile ("" : "=r"(v) : "r"(v));
-}
-
 
 RememberedSet*
 mono_sgen_alloc_remset (int size, gpointer id, gboolean global)
@@ -4950,7 +4942,7 @@ mono_gc_wbarrier_generic_store (gpointer ptr, MonoObject* value)
        *(void**)ptr = value;
        if (ptr_in_nursery (value))
                mono_gc_wbarrier_generic_nostore (ptr);
-       dummy_use (value);
+       mono_sgen_dummy_use (value);
 }
 
 void mono_gc_wbarrier_value_copy_bitmap (gpointer _dest, gpointer _src, int size, unsigned bitmap)
index 133ed9e9f3e6f1b3f93f3af23b3846bd39301db5..031be51e2c28227dd5b7b779ce363652a2623a78 100644 (file)
@@ -826,6 +826,26 @@ gboolean mono_sgen_is_managed_allocator (MonoMethod *method);
 void mono_sgen_check_consistency (void);
 void mono_sgen_check_major_refs (void);
 
+
+/* Write barrier support */
+
+/*
+ * This causes the compile to extend the liveness of 'v' till the call to dummy_use
+ */
+static inline void
+mono_sgen_dummy_use (gpointer v) {
+#if defined(__GNUC__)
+       __asm__ volatile ("" : "=r"(v) : "r"(v));
+#elif defined(_MSC_VER)
+       __asm {
+               mov eax, v;
+               and eax, eax;
+       };
+#else
+#error "Implement mono_sgen_dummy_use for your compiler"
+#endif
+}
+
 #endif /* HAVE_SGEN_GC */
 
 #endif /* __MONO_SGENGC_H__ */