Merge pull request #2803 from BrzVlad/feature-conc-pinned-scan
[mono.git] / mono / mini / mini-gc.c
index fddca9c6c346e7be93d95e0a204e6a679a28b2e7..f50d686347e2102ed79bba2a89bed8ec186244cf 100644 (file)
@@ -6,17 +6,40 @@
  *
  * Copyright 2009 Novell, Inc (http://www.novell.com)
  * Copyright 2011 Xamarin, Inc (http://www.xamarin.com)
+ * Licensed under the MIT license. See LICENSE file in the project root for full license information.
  */
 
 #include "config.h"
 #include "mini-gc.h"
-#include <mono/metadata/gc-internal.h>
+#include <mono/metadata/gc-internals.h>
+
+static gboolean
+get_provenance (StackFrameInfo *frame, MonoContext *ctx, gpointer data)
+{
+       MonoJitInfo *ji = frame->ji;
+       MonoMethod *method;
+       if (!ji)
+               return FALSE;
+       method = jinfo_get_method (ji);
+       if (method->wrapper_type != MONO_WRAPPER_NONE)
+               return FALSE;
+       *(gpointer *)data = method;
+       return TRUE;
+}
+
+static gpointer
+get_provenance_func (void)
+{
+       gpointer provenance = NULL;
+       mono_walk_stack (get_provenance, MONO_UNWIND_DEFAULT, (gpointer)&provenance);
+       return provenance;
+}
 
 #if 0
 //#if defined(MONO_ARCH_GC_MAPS_SUPPORTED)
 
 #include <mono/metadata/sgen-conf.h>
-#include <mono/metadata/gc-internal.h>
+#include <mono/metadata/gc-internals.h>
 #include <mono/utils/mono-counters.h>
 
 #define SIZEOF_SLOT ((int)sizeof (mgreg_t))
@@ -575,7 +598,7 @@ thread_attach_func (void)
        TlsData *tls;
 
        tls = g_new0 (TlsData, 1);
-       tls->tid = GetCurrentThreadId ();
+       tls->tid = mono_native_thread_id_get ();
        tls->info = mono_thread_info_current ();
        stats.tlsdata_size += sizeof (TlsData);
 
@@ -600,7 +623,7 @@ thread_suspend_func (gpointer user_data, void *sigctx, MonoContext *ctx)
                return;
        }
 
-       if (tls->tid != GetCurrentThreadId ()) {
+       if (tls->tid != mono_native_thread_id_get ()) {
                /* Happens on osx because threads are not suspended using signals */
 #ifndef TARGET_WIN32
                gboolean res;
@@ -799,6 +822,7 @@ conservative_pass (TlsData *tls, guint8 *stack_start, guint8 *stack_end)
                ji = frame.ji;
 
                // FIXME: For skipped frames, scan the param area of the parent frame conservatively ?
+               // FIXME: trampolines
 
                if (frame.type == FRAME_TYPE_MANAGED_TO_NATIVE) {
                        /*
@@ -1656,7 +1680,7 @@ process_variables (MonoCompile *cfg)
                        int hreg;
                        GCSlotType slot_type;
 
-                       t = mini_type_get_underlying_type (NULL, t);
+                       t = mini_get_underlying_type (t);
 
                        hreg = ins->dreg;
                        g_assert (hreg < MONO_MAX_IREGS);
@@ -1664,7 +1688,7 @@ process_variables (MonoCompile *cfg)
                        if (byref)
                                slot_type = SLOT_PIN;
                        else
-                               slot_type = mini_type_is_reference (cfg, t) ? SLOT_REF : SLOT_NOREF;
+                               slot_type = mini_type_is_reference (t) ? SLOT_REF : SLOT_NOREF;
 
                        if (slot_type == SLOT_PIN) {
                                /* These have no live interval, be conservative */
@@ -1811,9 +1835,9 @@ process_variables (MonoCompile *cfg)
                }
 #endif
 
-               t = mini_type_get_underlying_type (NULL, t);
+               t = mini_get_underlying_type (t);
 
-               if (!mini_type_is_reference (cfg, t)) {
+               if (!mini_type_is_reference (t)) {
                        set_slot_everywhere (gcfg, pos, SLOT_NOREF);
                        if (cfg->verbose_level > 1)
                                printf ("\tnoref%s at %s0x%x(fp) (R%d, slot = %d): %s\n", (is_arg ? " arg" : ""), ins->inst_offset < 0 ? "-" : "", (ins->inst_offset < 0) ? -(int)ins->inst_offset : (int)ins->inst_offset, vmv->vreg, pos, mono_type_full_name (ins->inst_vtype));
@@ -1917,7 +1941,7 @@ process_param_area_slots (MonoCompile *cfg)
                        guint32 size;
 
                        if (MONO_TYPE_ISSTRUCT (t)) {
-                               size = mini_type_stack_size_full (cfg->generic_sharing_context, t, &align, FALSE);
+                               size = mini_type_stack_size_full (t, &align, FALSE);
                        } else {
                                size = sizeof (mgreg_t);
                        }
@@ -2031,7 +2055,7 @@ compute_frame_size (MonoCompile *cfg)
 
                if (ins->opcode == OP_REGOFFSET) {
                        int size, size_in_slots;
-                       size = mini_type_stack_size_full (cfg->generic_sharing_context, ins->inst_vtype, NULL, ins->backend.is_pinvoke);
+                       size = mini_type_stack_size_full (ins->inst_vtype, NULL, ins->backend.is_pinvoke);
                        size_in_slots = ALIGN_TO (size, SIZEOF_SLOT) / SIZEOF_SLOT;
 
                        min_offset = MIN (min_offset, ins->inst_offset);
@@ -2492,6 +2516,7 @@ mini_gc_init (void)
        cb.thread_suspend_func = thread_suspend_func;
        /* Comment this out to disable precise stack marking */
        cb.thread_mark_func = thread_mark_func;
+       cb.get_provenance_func = get_provenance_func;
        mono_gc_set_gc_callbacks (&cb);
 
        logfile = mono_gc_get_logfile ();
@@ -2551,6 +2576,10 @@ mini_gc_enable_gc_maps_for_aot (void)
 void
 mini_gc_init (void)
 {
+       MonoGCCallbacks cb;
+       memset (&cb, 0, sizeof (cb));
+       cb.get_provenance_func = get_provenance_func;
+       mono_gc_set_gc_callbacks (&cb);
 }
 
 #ifndef DISABLE_JIT