X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Flldb.c;h=3e44b35bf6e86e3c2c20e018fdf0bbba828361c4;hb=012f8610237dfe44034c9d8daea0b90fac75ca9f;hp=c6cfa5454f3d65c08e96718a4e8409c7c45c4938;hpb=bc2340ff3c81fb7f9fabdf5c43142eda685c9198;p=mono.git diff --git a/mono/mini/lldb.c b/mono/mini/lldb.c index c6cfa5454f3..3e44b35bf6e 100644 --- a/mono/mini/lldb.c +++ b/mono/mini/lldb.c @@ -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 -#include -#include +#include +#include #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 (®ister_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, ®ister_time); } typedef struct @@ -576,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); @@ -600,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; @@ -635,6 +663,7 @@ mono_lldb_save_specific_trampoline_info (gpointer arg1, MonoTrampolineType tramp add_entry (ENTRY_TRAMPOLINE, buf); buffer_free (buf); +#endif } /*