[sgen] `GCObject*` instead of `char*` where appropriate.
[mono.git] / mono / sgen / sgen-debug.c
index 6011bcc35a7c154f8d5afc1814a9f2ad31a515a7..07d423012f2b0aecf3db1ad8d2913fe6922edbef 100644 (file)
@@ -43,7 +43,7 @@
 #define safe_object_get_size   sgen_safe_object_get_size
 
 void describe_ptr (char *ptr);
-void check_object (char *start);
+void check_object (GCObject *obj);
 
 /*
  * ######################################################################
@@ -80,7 +80,7 @@ describe_pointer (char *ptr, gboolean need_setup)
                if (!start)
                        return;
                ptr = start;
-               vtable = (GCVTable)LOAD_VTABLE (ptr);
+               vtable = LOAD_VTABLE ((GCObject*)ptr);
        } else {
                if (sgen_ptr_is_in_los (ptr, &start)) {
                        if (ptr == start)
@@ -89,7 +89,7 @@ describe_pointer (char *ptr, gboolean need_setup)
                                printf ("Pointer is at offset 0x%x of object %p in LOS space.\n", (int)(ptr - start), start);
                        ptr = start;
                        mono_sgen_los_describe_pointer (ptr);
-                       vtable = (GCVTable)LOAD_VTABLE (ptr);
+                       vtable = LOAD_VTABLE ((GCObject*)ptr);
                } else if (major_collector.ptr_is_in_non_pinned_space (ptr, &start)) {
                        if (ptr == start)
                                printf ("Pointer is the start of object %p in oldspace.\n", start);
@@ -100,10 +100,10 @@ describe_pointer (char *ptr, gboolean need_setup)
                        if (start)
                                ptr = start;
                        vtable = (GCVTable)major_collector.describe_pointer (ptr);
-               } else if (major_collector.obj_is_from_pinned_alloc (ptr)) {
+               } else if (major_collector.ptr_is_from_pinned_alloc (ptr)) {
                        // FIXME: Handle pointers to the inside of objects
                        printf ("Pointer is inside a pinned chunk.\n");
-                       vtable = (GCVTable)LOAD_VTABLE (ptr);
+                       vtable = LOAD_VTABLE ((GCObject*)ptr);
                } else {
                        printf ("Pointer unknown.\n");
                        return;
@@ -162,7 +162,7 @@ static gboolean missing_remsets;
 #define HANDLE_PTR(ptr,obj)    do {    \
        if (*(ptr) && sgen_ptr_in_nursery ((char*)*(ptr))) { \
                if (!sgen_get_remset ()->find_address ((char*)(ptr)) && !sgen_cement_lookup (*(ptr))) { \
-                       GCVTable __vt = SGEN_LOAD_VTABLE ((obj));       \
+                       GCVTable __vt = SGEN_LOAD_VTABLE (obj); \
                        SGEN_LOG (0, "Oldspace->newspace reference %p at offset %zd in object %p (%s.%s) not found in remsets.", *(ptr), (char*)(ptr) - (char*)(obj), (obj), sgen_client_vtable_get_namespace (__vt), sgen_client_vtable_get_name (__vt)); \
                        binary_protocol_missing_remset ((obj), __vt, (int) ((char*)(ptr) - (char*)(obj)), *(ptr), (gpointer)LOAD_VTABLE(*(ptr)), object_is_pinned (*(ptr))); \
                        if (!object_is_pinned (*(ptr)))                                                         \
@@ -176,9 +176,10 @@ static gboolean missing_remsets;
  * be found in the remembered sets.
  */
 static void
-check_consistency_callback (char *start, size_t size, void *dummy)
+check_consistency_callback (GCObject *obj, size_t size, void *dummy)
 {
-       GCVTable vt = (GCVTable)LOAD_VTABLE (start);
+       char *start = (char*)obj;
+       GCVTable vt = LOAD_VTABLE (obj);
        mword desc = sgen_vtable_get_descriptor (vt);
        SGEN_LOG (8, "Scanning object %p, vtable: %p (%s)", start, vt, sgen_client_vtable_get_name (vt));
 
@@ -211,7 +212,7 @@ sgen_check_consistency (void)
 }
 
 static gboolean
-is_major_or_los_object_marked (char *obj)
+is_major_or_los_object_marked (GCObject *obj)
 {
        if (sgen_safe_object_get_size ((GCObject*)obj) > SGEN_MAX_SMALL_OBJ_SIZE) {
                return sgen_los_object_is_pinned (obj);
@@ -222,9 +223,9 @@ is_major_or_los_object_marked (char *obj)
 
 #undef HANDLE_PTR
 #define HANDLE_PTR(ptr,obj)    do {    \
-       if (*(ptr) && !sgen_ptr_in_nursery ((char*)*(ptr)) && !is_major_or_los_object_marked ((char*)*(ptr))) { \
+       if (*(ptr) && !sgen_ptr_in_nursery ((char*)*(ptr)) && !is_major_or_los_object_marked ((GCObject*)*(ptr))) { \
                if (!sgen_get_remset ()->find_address_with_cards (start, cards, (char*)(ptr))) { \
-                       GCVTable __vt = SGEN_LOAD_VTABLE ((obj));       \
+                       GCVTable __vt = SGEN_LOAD_VTABLE (obj); \
                        SGEN_LOG (0, "major->major reference %p at offset %zd in object %p (%s.%s) not found in remsets.", *(ptr), (char*)(ptr) - (char*)(obj), (obj), sgen_client_vtable_get_namespace (__vt), sgen_client_vtable_get_name (__vt)); \
                        binary_protocol_missing_remset ((obj), __vt, (int) ((char*)(ptr) - (char*)(obj)), *(ptr), (gpointer)LOAD_VTABLE(*(ptr)), object_is_pinned (*(ptr))); \
                        missing_remsets = TRUE;                         \
@@ -233,21 +234,22 @@ is_major_or_los_object_marked (char *obj)
        } while (0)
 
 static void
-check_mod_union_callback (char *start, size_t size, void *dummy)
+check_mod_union_callback (GCObject *obj, size_t size, void *dummy)
 {
+       char *start = (char*)obj;
        gboolean in_los = (gboolean) (size_t) dummy;
-       GCVTable vt = (GCVTable)LOAD_VTABLE (start);
+       GCVTable vt = LOAD_VTABLE (obj);
        mword desc = sgen_vtable_get_descriptor (vt);
        guint8 *cards;
-       SGEN_LOG (8, "Scanning object %p, vtable: %p (%s)", start, vt, sgen_client_vtable_get_name (vt));
+       SGEN_LOG (8, "Scanning object %p, vtable: %p (%s)", obj, vt, sgen_client_vtable_get_name (vt));
 
-       if (!is_major_or_los_object_marked (start))
+       if (!is_major_or_los_object_marked (obj))
                return;
 
        if (in_los)
-               cards = sgen_los_header_for_object (start)->cardtable_mod_union;
+               cards = sgen_los_header_for_object (obj)->cardtable_mod_union;
        else
-               cards = sgen_get_major_collector ()->get_cardtable_mod_union_for_object (start);
+               cards = sgen_get_major_collector ()->get_cardtable_mod_union_for_reference (start);
 
        SGEN_ASSERT (0, cards, "we must have mod union for marked major objects");
 
@@ -274,9 +276,10 @@ sgen_check_mod_union_consistency (void)
        } while (0)
 
 static void
-check_major_refs_callback (char *start, size_t size, void *dummy)
+check_major_refs_callback (GCObject *obj, size_t size, void *dummy)
 {
-       mword desc = sgen_obj_get_descriptor (start);
+       char *start = (char*)obj;
+       mword desc = sgen_obj_get_descriptor (obj);
 
 #include "sgen-scan-object.h"
 }
@@ -303,25 +306,26 @@ sgen_check_major_refs (void)
  * reference fields are valid.
  */
 void
-check_object (char *start)
+check_object (GCObject *obj)
 {
+       char *start = (char*)obj;
        mword desc;
 
        if (!start)
                return;
 
-       desc = sgen_obj_get_descriptor (start);
+       desc = sgen_obj_get_descriptor (obj);
 
 #include "sgen-scan-object.h"
 }
 
 
-static char **valid_nursery_objects;
+static GCObject **valid_nursery_objects;
 static int valid_nursery_object_count;
 static gboolean broken_heap;
 
 static void 
-setup_mono_sgen_scan_area_with_callback (char *object, size_t size, void *data)
+setup_mono_sgen_scan_area_with_callback (GCObject *object, size_t size, void *data)
 {
        valid_nursery_objects [valid_nursery_object_count++] = object;
 }
@@ -341,10 +345,10 @@ find_object_in_nursery_dump (char *object)
        int first = 0, last = valid_nursery_object_count;
        while (first < last) {
                int middle = first + ((last - first) >> 1);
-               if (object == valid_nursery_objects [middle])
+               if (object == (char*)valid_nursery_objects [middle])
                        return TRUE;
 
-               if (object < valid_nursery_objects [middle])
+               if (object < (char*)valid_nursery_objects [middle])
                        last = middle;
                else
                        first = middle + 1;
@@ -358,8 +362,8 @@ iterate_valid_nursery_objects (IterateObjectCallbackFunc callback, void *data)
 {
        int i;
        for (i = 0; i < valid_nursery_object_count; ++i) {
-               char *obj = valid_nursery_objects [i];
-               callback (obj, safe_object_get_size ((GCObject*)obj), data);
+               GCObject *obj = valid_nursery_objects [i];
+               callback (obj, safe_object_get_size (obj), data);
        }
 }
 
@@ -372,20 +376,20 @@ describe_nursery_ptr (char *ptr, gboolean need_setup)
                setup_valid_nursery_objects ();
 
        for (i = 0; i < valid_nursery_object_count - 1; ++i) {
-               if (valid_nursery_objects [i + 1] > ptr)
+               if ((char*)valid_nursery_objects [i + 1] > ptr)
                        break;
        }
 
-       if (i >= valid_nursery_object_count || valid_nursery_objects [i] + safe_object_get_size ((GCObject *)valid_nursery_objects [i]) < ptr) {
+       if (i >= valid_nursery_object_count || (char*)valid_nursery_objects [i] + safe_object_get_size (valid_nursery_objects [i]) < ptr) {
                SGEN_LOG (0, "nursery-ptr (unalloc'd-memory)");
                return NULL;
        } else {
-               char *obj = valid_nursery_objects [i];
-               if (obj == ptr)
+               GCObject *obj = valid_nursery_objects [i];
+               if ((char*)obj == ptr)
                        SGEN_LOG (0, "nursery-ptr %p", obj);
                else
-                       SGEN_LOG (0, "nursery-ptr %p (interior-ptr offset %zd)", obj, ptr - obj);
-               return obj;
+                       SGEN_LOG (0, "nursery-ptr %p (interior-ptr offset %zd)", obj, ptr - (char*)obj);
+               return (char*)obj;
        }
 }
 
@@ -407,7 +411,7 @@ static void
 bad_pointer_spew (char *obj, char **slot)
 {
        char *ptr = *slot;
-       GCVTable vtable = (GCVTable)LOAD_VTABLE (obj);
+       GCVTable vtable = LOAD_VTABLE ((GCObject*)obj);
 
        SGEN_LOG (0, "Invalid object pointer %p at offset %zd in object %p (%s.%s):", ptr,
                        (char*)slot - obj,
@@ -420,7 +424,7 @@ static void
 missing_remset_spew (char *obj, char **slot)
 {
        char *ptr = *slot;
-       GCVTable vtable = (GCVTable)LOAD_VTABLE (obj);
+       GCVTable vtable = LOAD_VTABLE ((GCObject*)obj);
 
        SGEN_LOG (0, "Oldspace->newspace reference %p at offset %zd in object %p (%s.%s) not found in remsets.",
                        ptr, (char*)slot - obj, obj, 
@@ -438,17 +442,18 @@ FIXME Flag missing remsets due to pinning as non fatal
                        if (!is_valid_object_pointer (*(char**)ptr)) {  \
                                bad_pointer_spew ((char*)obj, (char**)ptr);     \
                        } else if (!sgen_ptr_in_nursery (obj) && sgen_ptr_in_nursery ((char*)*ptr)) {   \
-                               if (!sgen_get_remset ()->find_address ((char*)(ptr)) && !sgen_cement_lookup ((char*)*(ptr)) && (!allow_missing_pinned || !SGEN_OBJECT_IS_PINNED ((char*)*(ptr)))) \
+                               if (!sgen_get_remset ()->find_address ((char*)(ptr)) && !sgen_cement_lookup (*(ptr)) && (!allow_missing_pinned || !SGEN_OBJECT_IS_PINNED (*(ptr)))) \
                                missing_remset_spew ((char*)obj, (char**)ptr);  \
                        }       \
         } \
        } while (0)
 
 static void
-verify_object_pointers_callback (char *start, size_t size, void *data)
+verify_object_pointers_callback (GCObject *obj, size_t size, void *data)
 {
+       char *start = (char*)obj;
        gboolean allow_missing_pinned = (gboolean) (size_t) data;
-       mword desc = sgen_obj_get_descriptor (start);
+       mword desc = sgen_obj_get_descriptor (obj);
 
 #include "sgen-scan-object.h"
 }
@@ -561,31 +566,32 @@ find_pinning_reference (char *obj, size_t size)
                        } else {                                        \
                                mword __size = sgen_safe_object_get_size ((GCObject*)__target); \
                                if (__size <= SGEN_MAX_SMALL_OBJ_SIZE)  \
-                                       g_assert (major_collector.is_object_live (__target)); \
+                                       g_assert (major_collector.is_object_live ((GCObject*)__target)); \
                                else                                    \
-                                       g_assert (sgen_los_object_is_pinned (__target)); \
+                                       g_assert (sgen_los_object_is_pinned ((GCObject*)__target)); \
                        }                                               \
                }                                                       \
        } while (0)
 
 static void
-check_marked_callback (char *start, size_t size, void *dummy)
+check_marked_callback (GCObject *obj, size_t size, void *dummy)
 {
+       char *start = (char*)obj;
        gboolean flag = (gboolean) (size_t) dummy;
        mword desc;
 
        if (sgen_ptr_in_nursery (start)) {
                if (flag)
-                       SGEN_ASSERT (0, SGEN_OBJECT_IS_PINNED (start), "All objects remaining in the nursery must be pinned");
+                       SGEN_ASSERT (0, SGEN_OBJECT_IS_PINNED (obj), "All objects remaining in the nursery must be pinned");
        } else if (flag) {
-               if (!sgen_los_object_is_pinned (start))
+               if (!sgen_los_object_is_pinned (obj))
                        return;
        } else {
-               if (!major_collector.is_object_live (start))
+               if (!major_collector.is_object_live (obj))
                        return;
        }
 
-       desc = sgen_obj_get_descriptor_safe (start);
+       desc = sgen_obj_get_descriptor_safe (obj);
 
 #include "sgen-scan-object.h"
 }
@@ -665,7 +671,7 @@ sgen_debug_verify_nursery (gboolean do_dump_nursery_content)
                verify_scan_starts (cur, cur + size);
                is_array_fill = sgen_client_object_is_array_fill ((GCObject*)cur);
                if (do_dump_nursery_content) {
-                       GCVTable vtable = SGEN_LOAD_VTABLE (cur);
+                       GCVTable vtable = SGEN_LOAD_VTABLE ((GCObject*)cur);
                        if (cur > hole_start)
                                SGEN_LOG (0, "HOLE [%p %p %d]", hole_start, cur, (int)(cur - hole_start));
                        SGEN_LOG (0, "OBJ  [%p %p %d %d %s.%s %d]", cur, cur + size, (int)size, (int)ss,
@@ -673,7 +679,7 @@ sgen_debug_verify_nursery (gboolean do_dump_nursery_content)
                                        is_array_fill);
                }
                if (nursery_canaries_enabled () && !is_array_fill) {
-                       CHECK_CANARY_FOR_OBJECT (cur);
+                       CHECK_CANARY_FOR_OBJECT ((GCObject*)cur);
                        CANARIFY_SIZE (size);
                }
                cur += size;
@@ -725,32 +731,33 @@ static gboolean scan_object_for_specific_ref_precise = TRUE;
        } while (0)
 
 static void
-scan_object_for_specific_ref (char *start, GCObject *key)
+scan_object_for_specific_ref (GCObject *obj, GCObject *key)
 {
-       char *forwarded;
+       GCObject *forwarded;
 
-       if ((forwarded = SGEN_OBJECT_IS_FORWARDED (start)))
-               start = forwarded;
+       if ((forwarded = SGEN_OBJECT_IS_FORWARDED (obj)))
+               obj = forwarded;
 
        if (scan_object_for_specific_ref_precise) {
-               mword desc = sgen_obj_get_descriptor_safe (start);
+               char *start = (char*)obj;
+               mword desc = sgen_obj_get_descriptor_safe (obj);
                #include "sgen-scan-object.h"
        } else {
-               mword *words = (mword*)start;
-               size_t size = safe_object_get_size ((GCObject*)start);
+               mword *words = (mword*)obj;
+               size_t size = safe_object_get_size (obj);
                int i;
                for (i = 0; i < size / sizeof (mword); ++i) {
                        if (words [i] == (mword)key) {
-                               GCVTable vtable = SGEN_LOAD_VTABLE (start);
+                               GCVTable vtable = SGEN_LOAD_VTABLE (obj);
                                g_print ("found possible ref to %p in object %p (%s.%s) at offset %zd\n",
-                                               key, start, sgen_client_vtable_get_namespace (vtable), sgen_client_vtable_get_name (vtable), i * sizeof (mword));
+                                               key, obj, sgen_client_vtable_get_namespace (vtable), sgen_client_vtable_get_name (vtable), i * sizeof (mword));
                        }
                }
        }
 }
 
 static void
-scan_object_for_specific_ref_callback (char *obj, size_t size, GCObject *key)
+scan_object_for_specific_ref_callback (GCObject *obj, size_t size, GCObject *key)
 {
        scan_object_for_specific_ref (obj, key);
 }
@@ -767,7 +774,7 @@ static GCObject *check_key = NULL;
 static RootRecord *check_root = NULL;
 
 static void
-check_root_obj_specific_ref_from_marker (void **obj, void *gc_data)
+check_root_obj_specific_ref_from_marker (GCObject **obj, void *gc_data)
 {
        check_root_obj_specific_ref (check_root, check_key, *obj);
 }
@@ -869,9 +876,9 @@ check_obj_not_in_domain (MonoObject **o)
 
 
 static void
-check_obj_not_in_domain_callback (void **o, void *gc_data)
+check_obj_not_in_domain_callback (GCObject **o, void *gc_data)
 {
-       g_assert (((MonoObject*)(*o))->vtable->domain != check_domain);
+       g_assert ((*o)->vtable->domain != check_domain);
 }
 
 void
@@ -932,10 +939,10 @@ sgen_scan_for_registered_roots_in_domain (MonoDomain *domain, int root_type)
 }
 
 static gboolean
-is_xdomain_ref_allowed (gpointer *ptr, char *obj, MonoDomain *domain)
+is_xdomain_ref_allowed (GCObject **ptr, GCObject *obj, MonoDomain *domain)
 {
        MonoObject *o = (MonoObject*)(obj);
-       MonoObject *ref = (MonoObject*)*(ptr);
+       MonoObject *ref = *ptr;
        size_t offset = (char*)(ptr) - (char*)o;
 
        if (o->vtable->klass == mono_defaults.thread_class && offset == G_STRUCT_OFFSET (MonoThread, internal_thread))
@@ -974,11 +981,10 @@ is_xdomain_ref_allowed (gpointer *ptr, char *obj, MonoDomain *domain)
 }
 
 static void
-check_reference_for_xdomain (gpointer *ptr, char *obj, MonoDomain *domain)
+check_reference_for_xdomain (GCObject **ptr, GCObject *obj, MonoDomain *domain)
 {
-       MonoObject *o = (MonoObject*)(obj);
-       MonoObject *ref = (MonoObject*)*(ptr);
-       size_t offset = (char*)(ptr) - (char*)o;
+       MonoObject *ref = *ptr;
+       size_t offset = (char*)(ptr) - (char*)obj;
        MonoClass *class;
        MonoClassField *field;
        char *str;
@@ -989,7 +995,7 @@ check_reference_for_xdomain (gpointer *ptr, char *obj, MonoDomain *domain)
                return;
 
        field = NULL;
-       for (class = o->vtable->klass; class; class = class->parent) {
+       for (class = obj->vtable->klass; class; class = class->parent) {
                int i;
 
                for (i = 0; i < class->field.count; ++i) {
@@ -1007,10 +1013,10 @@ check_reference_for_xdomain (gpointer *ptr, char *obj, MonoDomain *domain)
        else
                str = NULL;
        g_print ("xdomain reference in %p (%s.%s) at offset %d (%s) to %p (%s.%s) (%s)  -  pointed to by:\n",
-                       o, o->vtable->klass->name_space, o->vtable->klass->name,
+                       obj, obj->vtable->klass->name_space, obj->vtable->klass->name,
                        offset, field ? field->name : "",
                        ref, ref->vtable->klass->name_space, ref->vtable->klass->name, str ? str : "");
-       mono_gc_scan_for_specific_ref (o, TRUE);
+       mono_gc_scan_for_specific_ref (obj, TRUE);
        if (str)
                g_free (str);
 }
@@ -1019,9 +1025,10 @@ check_reference_for_xdomain (gpointer *ptr, char *obj, MonoDomain *domain)
 #define HANDLE_PTR(ptr,obj)    check_reference_for_xdomain ((ptr), (obj), domain)
 
 static void
-scan_object_for_xdomain_refs (char *start, mword size, void *data)
+scan_object_for_xdomain_refs (GCObject *obj, mword size, void *data)
 {
-       MonoVTable *vt = (MonoVTable*)SGEN_LOAD_VTABLE (start);
+       char *start = (char*)obj;
+       MonoVTable *vt = SGEN_LOAD_VTABLE (obj);
        MonoDomain *domain = vt->domain;
        mword desc = sgen_vtable_get_descriptor (vt);
 
@@ -1039,7 +1046,7 @@ sgen_check_for_xdomain_refs (void)
        major_collector.iterate_objects (ITERATE_OBJECTS_SWEEP_ALL, (IterateObjectCallbackFunc)scan_object_for_xdomain_refs, NULL);
 
        for (bigobj = los_object_list; bigobj; bigobj = bigobj->next)
-               scan_object_for_xdomain_refs (bigobj->data, sgen_los_object_size (bigobj), NULL);
+               scan_object_for_xdomain_refs ((GCObject*)bigobj->data, sgen_los_object_size (bigobj), NULL);
 }
 
 #endif
@@ -1080,7 +1087,7 @@ sgen_dump_section (GCMemSection *section, const char *type)
                if (!occ_start)
                        occ_start = start;
 
-               //vt = (GCVTable)SGEN_LOAD_VTABLE (start);
+               //vt = SGEN_LOAD_VTABLE (start);
                //class = vt->klass;
 
                size = SGEN_ALIGN_UP (safe_object_get_size ((GCObject*) start));
@@ -1189,21 +1196,21 @@ sgen_debug_dump_heap (const char *type, int num, const char *reason)
        fprintf (heap_dump_file, "</collection>\n");
 }
 
-static char *found_obj;
+static GCObject *found_obj;
 
 static void
-find_object_for_ptr_callback (char *obj, size_t size, void *user_data)
+find_object_for_ptr_callback (GCObject *obj, size_t size, void *user_data)
 {
        char *ptr = user_data;
 
-       if (ptr >= obj && ptr < obj + size) {
+       if (ptr >= (char*)obj && ptr < (char*)obj + size) {
                g_assert (!found_obj);
                found_obj = obj;
        }
 }
 
 /* for use in the debugger */
-char*
+GCObject*
 sgen_find_object_for_ptr (char *ptr)
 {
        if (ptr >= nursery_section->data && ptr < nursery_section->end_data) {