Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / sgen / sgen-descriptor.h
index 1a9d8cc37fe08dab75b868e63d67dd6e19c68486..2c7f19b18c46a4d1029174e5bb509f1916af57b0 100644 (file)
@@ -1,31 +1,20 @@
-/*
- * sgen-descriptor.h: GC descriptors describe object layout.
-
+/**
+ * \file
+ * GC descriptors describe object layout.
+ *
  * Copyright 2001-2003 Ximian, Inc
  * Copyright 2003-2010 Novell, Inc.
  * Copyright 2011 Xamarin Inc (http://www.xamarin.com)
  *
  * Copyright (C) 2012 Xamarin Inc
  *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License 2.0 as published by the Free Software Foundation;
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License 2.0 along with this library; if not, write to the Free
- * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Licensed under the MIT license. See LICENSE file in the project root for full license information.
  */
 #ifndef __MONO_SGEN_DESCRIPTOR_H__
 #define __MONO_SGEN_DESCRIPTOR_H__
 
 #include <mono/sgen/sgen-conf.h>
 
-
 /*
  * ######################################################################
  * ########  GC descriptors
@@ -126,29 +115,30 @@ enum {
        ROOT_DESC_BITMAP,
        ROOT_DESC_RUN_LEN, 
        ROOT_DESC_COMPLEX,
+       ROOT_DESC_VECTOR,
        ROOT_DESC_USER,
        ROOT_DESC_TYPE_MASK = 0x7,
        ROOT_DESC_TYPE_SHIFT = 3,
 };
 
-typedef void (*SgenUserMarkFunc)     (void **addr, void *gc_data);
+typedef void (*SgenUserMarkFunc)     (GCObject **addr, void *gc_data);
 typedef void (*SgenUserRootMarkFunc) (void *addr, SgenUserMarkFunc mark_func, void *gc_data);
 
-void* sgen_make_user_root_descriptor (SgenUserRootMarkFunc marker);
+SgenDescriptor sgen_make_user_root_descriptor (SgenUserRootMarkFunc marker);
 
-gsize* sgen_get_complex_descriptor (mword desc);
-void* sgen_get_complex_descriptor_bitmap (mword desc);
-SgenUserRootMarkFunc sgen_get_user_descriptor_func (mword desc);
+gsize* sgen_get_complex_descriptor (SgenDescriptor desc);
+void* sgen_get_complex_descriptor_bitmap (SgenDescriptor desc);
+SgenUserRootMarkFunc sgen_get_user_descriptor_func (SgenDescriptor desc);
 
 void sgen_init_descriptors (void);
 
 #ifdef HEAVY_STATISTICS
-void sgen_descriptor_count_scanned_object (mword desc);
-void sgen_descriptor_count_copied_object (mword desc);
+void sgen_descriptor_count_scanned_object (SgenDescriptor desc);
+void sgen_descriptor_count_copied_object (SgenDescriptor desc);
 #endif
 
 static inline gboolean
-sgen_gc_descr_has_references (mword desc)
+sgen_gc_descr_has_references (SgenDescriptor desc)
 {
        /* This covers SMALL_PTRFREE and COMPLEX_PTRFREE */
        if ((desc & DESC_TYPE_PTRFREE_MASK) == DESC_TYPE_PTRFREE_BITS)
@@ -188,7 +178,7 @@ sgen_gc_descr_has_references (mword desc)
                        _objptr += ((desc) >> 16) & 0xff;       \
                        _objptr_end = _objptr + (((desc) >> 24) & 0xff);        \
                        while (_objptr < _objptr_end) { \
-                               HANDLE_PTR (_objptr, (obj));    \
+                               HANDLE_PTR ((GCObject**)_objptr, (obj)); \
                                _objptr++;      \
                        };      \
                }       \
@@ -207,7 +197,7 @@ sgen_gc_descr_has_references (mword desc)
                        int _index = GNUC_BUILTIN_CTZ (_bmap);  \
                        _objptr += _index;                      \
                        _bmap >>= (_index + 1);                 \
-                       HANDLE_PTR (_objptr, (obj));            \
+                       HANDLE_PTR ((GCObject**)_objptr, (obj));        \
                        ++_objptr;                              \
                } while (_bmap);                                \
        } while (0)
@@ -219,7 +209,7 @@ sgen_gc_descr_has_references (mword desc)
                _objptr += OBJECT_HEADER_WORDS; \
                do {    \
                        if ((_bmap & 1)) {      \
-                               HANDLE_PTR (_objptr, (obj));    \
+                               HANDLE_PTR ((GCObject**)_objptr, (obj));        \
                        }       \
                        _bmap >>= 1;    \
                        ++_objptr;      \
@@ -227,7 +217,7 @@ sgen_gc_descr_has_references (mword desc)
        } while (0)
 #endif
 
-#define OBJ_COMPLEX_FOREACH_PTR(vt,obj)        do {    \
+#define OBJ_COMPLEX_FOREACH_PTR(desc,obj)      do {    \
                /* there are pointers */        \
                void **_objptr = (void**)(obj); \
                gsize *bitmap_data = sgen_get_complex_descriptor ((desc)); \
@@ -240,7 +230,7 @@ sgen_gc_descr_has_references (mword desc)
                        /*g_print ("bitmap: 0x%x/%d at %p\n", _bmap, bwords, _objptr);*/        \
                        while (_bmap) { \
                                if ((_bmap & 1)) {      \
-                                       HANDLE_PTR (_objptr, (obj));    \
+                                       HANDLE_PTR ((GCObject**)_objptr, (obj));        \
                                }       \
                                _bmap >>= 1;    \
                                ++_objptr;      \
@@ -252,7 +242,7 @@ sgen_gc_descr_has_references (mword desc)
 /* this one is untested */
 #define OBJ_COMPLEX_ARR_FOREACH_PTR(desc,obj)  do {    \
                /* there are pointers */        \
-               GCVTable *vt = (GCVTable*)SGEN_LOAD_VTABLE (obj); \
+               GCVTable vt = SGEN_LOAD_VTABLE (obj); \
                gsize *mbitmap_data = sgen_get_complex_descriptor ((desc)); \
                gsize mbwords = (*mbitmap_data++) - 1;  \
                gsize el_size = sgen_client_array_element_size (vt);    \
@@ -268,7 +258,7 @@ sgen_gc_descr_has_references (mword desc)
                                /*g_print ("bitmap: 0x%x\n", _bmap);*/  \
                                while (_bmap) { \
                                        if ((_bmap & 1)) {      \
-                                               HANDLE_PTR (_objptr, (obj));    \
+                                               HANDLE_PTR ((GCObject**)_objptr, (obj));        \
                                        }       \
                                        _bmap >>= 1;    \
                                        ++_objptr;      \
@@ -290,7 +280,7 @@ sgen_gc_descr_has_references (mword desc)
                                void **end_refs = (void**)((char*)p + el_size * sgen_client_array_length ((GCObject*)(obj)));   \
                                /* Note: this code can handle also arrays of struct with only references in them */     \
                                while (p < end_refs) {  \
-                                       HANDLE_PTR (p, (obj));  \
+                                       HANDLE_PTR ((GCObject**)p, (obj));      \
                                        ++p;    \
                                }       \
                        } else if (etype == DESC_TYPE_V_RUN_LEN << 14) {        \
@@ -303,7 +293,7 @@ sgen_gc_descr_has_references (mword desc)
                                        int i;  \
                                        p += offset;    \
                                        for (i = 0; i < num_refs; ++i) {        \
-                                               HANDLE_PTR (p + i, (obj));      \
+                                               HANDLE_PTR ((GCObject**)p + i, (obj));  \
                                        }       \
                                        e_start += el_size;     \
                                }       \
@@ -316,7 +306,7 @@ sgen_gc_descr_has_references (mword desc)
                                        /* Note: there is no object header here to skip */      \
                                        while (_bmap) { \
                                                if ((_bmap & 1)) {      \
-                                                       HANDLE_PTR (p, (obj));  \
+                                                       HANDLE_PTR ((GCObject**)p, (obj));      \
                                                }       \
                                                _bmap >>= 1;    \
                                                ++p;    \