Disable none-working stack overflow implementation on Windows x64 full AOT.
[mono.git] / mono / mini / lldb.c
index 83c447969e36eb169c8dd23ec2579765f5eebacf..3e44b35bf6e86e3c2c20e018fdf0bbba828361c4 100644 (file)
@@ -1,5 +1,6 @@
-/*
- * lldb.c: Mono support for LLDB.
+/**
+ * \file
+ * Mono support for LLDB.
  *
  * Author:
  *   Zoltan Varga (vargaz@gmail.com)
@@ -12,9 +13,8 @@
 #include "lldb.h"
 #include "seq-points.h"
 
-#include <mono/metadata/mono-debug.h>
-#include <mono/metadata/mono-debug-debugger.h>
-#include <mono/metadata/debug-mono-symfile.h>
+#include <mono/metadata/debug-internals.h>
+#include <mono/utils/mono-counters.h>
 
 #if !defined(DISABLE_JIT) && !defined(DISABLE_LLDB)
 
@@ -49,10 +49,15 @@ typedef struct
        guint32 version;
        /* Align */
        guint32 dummy;
-       /* Keep these as pointers so accessing them is atomic */
        DebugEntry *entry;
        /* List of all entries */
+       /* Keep this as a pointer so accessing it is atomic */
        DebugEntry *all_entries;
+       /* The current entry embedded here to reduce the amount of roundtrips */
+       guint32 type;
+       guint32 dummy2;
+       guint64 size;
+       guint64 addr;
 } JitDescriptor;
 
 /*
@@ -114,6 +119,8 @@ static GHashTable *codegen_regions;
 static DebugEntry *last_entry;
 static mono_mutex_t mutex;
 static GHashTable *dyn_codegen_regions;
+static gdouble register_time;
+static int num_entries;
 
 #define lldb_lock() mono_os_mutex_lock (&mutex)
 #define lldb_unlock() mono_os_mutex_unlock (&mutex)
@@ -291,7 +298,17 @@ add_entry (EntryType type, Buffer *buf)
        }
 
        __mono_jit_debug_descriptor.entry = entry;
+
+       __mono_jit_debug_descriptor.type = entry->type;
+       __mono_jit_debug_descriptor.size = entry->size;
+       __mono_jit_debug_descriptor.addr = entry->addr;
+       mono_memory_barrier ();
+
+       GTimer *timer = mono_time_track_start ();
        __mono_jit_debug_register_code ();
+       mono_time_track_end (&register_time, timer);
+       num_entries ++;
+       //printf ("%lf %d %d\n", register_time, num_entries, entry->type);
 
        lldb_unlock ();
 }
@@ -395,6 +412,8 @@ mono_lldb_init (const char *options)
 {
        enabled = TRUE;
        mono_os_mutex_init_recursive (&mutex);
+
+       mono_counters_register ("Time spent in LLDB", MONO_COUNTER_JIT | MONO_COUNTER_DOUBLE, &register_time);
 }
 
 typedef struct
@@ -536,6 +555,9 @@ mono_lldb_remove_method (MonoDomain *domain, MonoMethod *method, MonoJitDynamicM
        Buffer tmpbuf;
        Buffer *buf = &tmpbuf;
 
+       if (!enabled)
+               return;
+
        g_assert (method->dynamic);
 
        lldb_lock ();
@@ -573,7 +595,9 @@ mono_lldb_save_trampoline_info (MonoTrampInfo *info)
        mono_global_codeman_foreach (find_code_region, &udata);
        if (!udata.found)
                mono_domain_code_foreach (mono_get_root_domain (), find_code_region, &udata);
-       g_assert (udata.found);
+       if (!udata.found)
+               /* Can happen with AOT */
+               return;
 
        region_id = register_codegen_region (udata.region_start, udata.region_size, FALSE);
 
@@ -597,6 +621,13 @@ mono_lldb_save_trampoline_info (MonoTrampInfo *info)
 void
 mono_lldb_save_specific_trampoline_info (gpointer arg1, MonoTrampolineType tramp_type, MonoDomain *domain, gpointer code, guint32 code_len)
 {
+       /*
+        * Avoid emitting these for now,
+        * they slow down execution too much, and they are
+        * only needed during single stepping which doesn't
+        * work anyway.
+        */
+#if 0
        TrampolineEntry *entry;
        UserData udata;
        int region_id;
@@ -625,13 +656,14 @@ mono_lldb_save_specific_trampoline_info (gpointer arg1, MonoTrampolineType tramp
        entry->code = (gsize)code;
        entry->code_size = code_len;
 
-       GSList *unwind_ops = mono_arch_get_cie_program ();
+       GSList *unwind_ops = mono_unwind_get_cie_program ();
        emit_unwind_info (unwind_ops, buf);
 
        buffer_add_string (buf, "");
 
        add_entry (ENTRY_TRAMPOLINE, buf);
        buffer_free (buf);
+#endif
 }
 
 /*