struct jit_code_entry
{
- struct jit_code_entry *next_entry;
- struct jit_code_entry *prev_entry;
- const char *symfile_addr;
- guint64 symfile_size;
+ struct jit_code_entry *next_entry;
+ struct jit_code_entry *prev_entry;
+ const char *symfile_addr;
+ /*
+ * The gdb code in gdb/jit.c which reads this structure ignores alignment
+ * requirements, so use two 32 bit fields.
+ */
+ guint32 symfile_size1, symfile_size2;
};
struct jit_descriptor
/* GDB puts a breakpoint in this function. */
void MONO_NOINLINE __jit_debug_register_code(void);
-#if defined(ENABLE_LLVM) && ((LLVM_MAJOR_VERSION == 2 && LLVM_MINOR_VERSION >= 7) || LLVM_MAJOR_VERSION > 2)
+#if !defined(MONO_LLVM_LOADED) && defined(ENABLE_LLVM) && ((LLVM_MAJOR_VERSION == 2 && LLVM_MINOR_VERSION >= 7) || LLVM_MAJOR_VERSION > 2)
+
/* LLVM already defines these */
extern struct jit_descriptor __jit_debug_descriptor;
+
#else
/* Make sure to specify the version statically, because the
debugger may check the version before we can set it. */
struct jit_descriptor __jit_debug_descriptor = { 1, 0, 0, 0 };
-void MONO_NOINLINE __jit_debug_register_code(void) { };
+/* gcc seems to inline/eliminate calls to noinline functions, thus the asm () */
+void MONO_NOINLINE __jit_debug_register_code(void) {
+#if defined(__GNUC__)
+ asm ("");
+#endif
+}
+
#endif
static MonoImageWriter *xdebug_w;
/* This file will contain the IL code for methods which don't have debug info */
il_file = fopen ("xdb.il", "w");
+ if (il_file == NULL) {
+ use_gdb_interface = FALSE;
+ g_warning ("** Unable to create xdb.il. Managed symbol names won't be available.");
+ return;
+ }
if (use_gdb_interface)
return;
img_writer_emit_section_change (w, ".text", 0);
img_writer_emit_string (w, "");
- mono_dwarf_writer_emit_base_info (xdebug_writer, mono_arch_get_cie_program ());
+ mono_dwarf_writer_emit_base_info (xdebug_writer, mono_unwind_get_cie_program ());
}
static void
dw = mono_dwarf_writer_create (w, il_file, il_file_line_index, FALSE);
- mono_dwarf_writer_emit_base_info (dw, mono_arch_get_cie_program ());
+ mono_dwarf_writer_emit_base_info (dw, mono_unwind_get_cie_program ());
*out_w = w;
*out_dw = dw;
guint8 *img;
guint32 img_size;
struct jit_code_entry *entry;
+ guint64 *psize;
il_file_line_index = mono_dwarf_writer_get_il_file_line_index (dw);
mono_dwarf_writer_close (dw);
file_counter ++;
file_name = g_strdup_printf ("xdb-%d.o", file_counter);
- //printf ("%s -> %s\n", mono_method_full_name (method, TRUE), file_name);
+ printf ("%s %p %d\n", file_name, img, img_size);
fp = fopen (file_name, "w");
fwrite (img, img_size, 1, fp);
/* Register the image with GDB */
- entry = g_malloc (sizeof (struct jit_code_entry));
+ entry = g_malloc0 (sizeof (struct jit_code_entry));
entry->symfile_addr = (const char*)img;
- entry->symfile_size = img_size;
+ psize = (guint64*)&entry->symfile_size1;
+ *psize = img_size;
entry->next_entry = __jit_debug_descriptor.first_entry;
if (__jit_debug_descriptor.first_entry)
void
mono_save_xdebug_info (MonoCompile *cfg)
{
+ MonoDebugMethodJitInfo *dmji;
+
if (use_gdb_interface) {
mono_loader_lock ();
xdebug_method_count ++;
- mono_dwarf_writer_emit_method (xdebug_writer, cfg, cfg->jit_info->method, NULL, NULL, cfg->jit_info->code_start, cfg->jit_info->code_size, cfg->args, cfg->locals, cfg->unwind_ops, mono_debug_find_method (cfg->jit_info->method, mono_domain_get ()));
+ dmji = mono_debug_find_method (cfg->jit_info->method, mono_domain_get ());;
+ mono_dwarf_writer_emit_method (xdebug_writer, cfg, cfg->jit_info->method, NULL, NULL, cfg->jit_info->code_start, cfg->jit_info->code_size, cfg->args, cfg->locals, cfg->unwind_ops, dmji);
+ mono_debug_free_method_jit_info (dmji);
#if 0
/*
return;
mono_loader_lock ();
- mono_dwarf_writer_emit_method (xdebug_writer, cfg, cfg->jit_info->method, NULL, NULL, cfg->jit_info->code_start, cfg->jit_info->code_size, cfg->args, cfg->locals, cfg->unwind_ops, mono_debug_find_method (cfg->jit_info->method, mono_domain_get ()));
+ dmji = mono_debug_find_method (cfg->jit_info->method, mono_domain_get ());;
+ mono_dwarf_writer_emit_method (xdebug_writer, cfg, cfg->jit_info->method, NULL, NULL, cfg->jit_info->code_start, cfg->jit_info->code_size, cfg->args, cfg->locals, cfg->unwind_ops, dmji);
+ mono_debug_free_method_jit_info (dmji);
fflush (xdebug_fp);
mono_loader_unlock ();
}
+
}
/*
* LOCKING: Acquires the loader lock.
*/
void
-mono_save_trampoline_xdebug_info (const char *tramp_name, guint8 *code, guint32 code_size, GSList *unwind_info)
+mono_save_trampoline_xdebug_info (MonoTrampInfo *info)
{
if (use_gdb_interface) {
MonoImageWriter *w;
MonoDwarfWriter *dw;
- mono_loader_lock ();
+ /* This can be called before the loader lock is initialized */
+ mono_loader_lock_if_inited ();
xdebug_begin_emit (&w, &dw);
- mono_dwarf_writer_emit_trampoline (dw, tramp_name, NULL, NULL, code, code_size, unwind_info);
+ mono_dwarf_writer_emit_trampoline (dw, info->name, NULL, NULL, info->code, info->code_size, info->unwind_ops);
xdebug_end_emit (w, dw, NULL);
- mono_loader_unlock ();
+ mono_loader_unlock_if_inited ();
} else {
if (!xdebug_writer)
return;
- mono_loader_lock ();
- mono_dwarf_writer_emit_trampoline (xdebug_writer, tramp_name, NULL, NULL, code, code_size, unwind_info);
+ mono_loader_lock_if_inited ();
+ mono_dwarf_writer_emit_trampoline (xdebug_writer, info->name, NULL, NULL, info->code, info->code_size, info->unwind_ops);
fflush (xdebug_fp);
- mono_loader_unlock ();
+ mono_loader_unlock_if_inited ();
}
}
}
void
-mono_save_trampoline_xdebug_info (const char *tramp_name, guint8 *code, guint32 code_size, GSList *unwind_info)
+mono_save_trampoline_xdebug_info (MonoTrampInfo *info)
{
}