return NULL;
}
+gint32
+_mono_debug_address_from_il_offset (MonoDebugMethodInfo *minfo, guint32 il_offset)
+{
+ int i;
+
+ if (!minfo->jit || !minfo->jit->line_numbers)
+ return -1;
+
+ for (i = minfo->jit->line_numbers->len - 1; i >= 0; i--) {
+ MonoDebugLineNumberEntry lne = g_array_index (
+ minfo->jit->line_numbers, MonoDebugLineNumberEntry, i);
+
+ if (lne.offset <= il_offset)
+ return lne.address;
+ }
+
+ return -1;
+}
+
void
mono_debug_symfile_add_method (MonoSymbolFile *symfile, MonoMethod *method)
{
MonoSymbolFileMethodEntryPriv *mep;
MonoSymbolFileMethodAddress *address;
+ MonoSymbolFileLexicalBlockEntry *block;
MonoDebugVarInfo *var_table;
MonoDebugRangeInfo *range;
MonoMethodHeader *header;
guint32 size, num_variables, variable_size, variable_offset;
- guint32 type_size, type_offset, *type_index_table;
- guint32 line_size, line_offset, has_this;
+ guint32 type_size, type_offset, *type_index_table, has_this;
+ guint32 line_size, line_offset, block_offset, block_size;
+ MonoDebugLexicalBlockEntry *block_table;
MonoDebugLineNumberEntry *line_table;
guint32 *type_table;
guint8 *ptr;
size += line_size;
}
+ block_size = mep->entry->num_lexical_blocks * sizeof (MonoSymbolFileLexicalBlockEntry);
+ block_offset = size;
+ size += block_size;
+
address = g_malloc0 (size);
ptr = (guint8 *) address;
+ block = (MonoSymbolFileLexicalBlockEntry *)
+ (symfile->_priv->raw_contents + mep->entry->lexical_block_table_offset);
+ block_table = (MonoDebugLexicalBlockEntry *) (ptr + block_offset);
+
+ for (i = 0; i < mep->entry->num_lexical_blocks; i++, block++) {
+ block_table [i].start_address = _mono_debug_address_from_il_offset (mep->minfo, block->start_offset);
+ block_table [i].end_address = _mono_debug_address_from_il_offset (mep->minfo, block->end_offset);
+ }
+
address->size = size;
address->has_this = has_this;
address->start_address = mep->minfo->jit->code_start;
address->wrapper_address = mep->minfo->jit->wrapper_addr;
address->variable_table_offset = variable_offset;
address->type_table_offset = type_offset;
+ address->lexical_block_table_offset = block_offset;
if (mep->minfo->jit->line_numbers) {
address->num_line_numbers = mep->minfo->jit->line_numbers->len;
}
if (mep->minfo->jit->num_locals < mep->entry->num_locals) {
-#if 1
g_warning (G_STRLOC ": Method %s.%s has %d locals, but symbol file claims it has %d.",
mep->method->klass->name, mep->method->name, mep->minfo->jit->num_locals,
mep->entry->num_locals);
-#endif
var_table += mep->entry->num_locals;
} else {
g_assert ((header != NULL) || (mep->entry->num_locals == 0));
typedef struct MonoSymbolFileDynamicTable MonoSymbolFileDynamicTable;
typedef struct MonoSymbolFileSourceEntry MonoSymbolFileSourceEntry;
typedef struct MonoSymbolFileMethodIndexEntry MonoSymbolFileMethodIndexEntry;
+typedef struct MonoSymbolFileLexicalBlockEntry MonoSymbolFileLexicalBlockEntry;
typedef struct MonoDebugMethodInfo MonoDebugMethodInfo;
typedef struct MonoDebugMethodJitInfo MonoDebugMethodJitInfo;
typedef struct MonoDebugVarInfo MonoDebugVarInfo;
+typedef struct MonoDebugLexicalBlockEntry MonoDebugLexicalBlockEntry;
typedef struct MonoDebugLineNumberEntry MonoDebugLineNumberEntry;
typedef struct MonoDebugRangeInfo MonoDebugRangeInfo;
typedef struct MonoDebugClassInfo MonoDebugClassInfo;
guint32 type_index_table_offset;
guint32 local_variable_table_offset;
guint32 line_number_table_offset;
+ guint32 num_lexical_blocks;
+ guint32 lexical_block_table_offset;
guint32 namespace_idx;
};
guint32 type_table_offset;
guint32 num_line_numbers;
guint32 line_number_offset;
+ guint32 lexical_block_table_offset;
guint8 data [MONO_ZERO_LEN_ARRAY];
};
+struct MonoSymbolFileLexicalBlockEntry {
+ guint32 start_offset;
+ guint32 end_offset;
+};
+
struct MonoSymbolFileLineNumberEntry {
guint32 row;
guint32 offset;
gpointer user_data;
};
+struct MonoDebugLexicalBlockEntry {
+ guint32 start_address;
+ guint32 end_address;
+};
+
struct MonoDebugLineNumberEntry {
guint32 line;
guint32 offset;
MonoSymbolFilePriv *_priv;
};
-#define MONO_SYMBOL_FILE_VERSION 33
+#define MONO_SYMBOL_FILE_VERSION 34
#define MONO_SYMBOL_FILE_MAGIC 0x45e82623fd7fa614
#define MONO_SYMBOL_FILE_DYNAMIC_VERSION 26
mono_debug_find_method (MonoSymbolFile *symfile,
MonoMethod *method);
+gint32
+_mono_debug_address_from_il_offset (MonoDebugMethodInfo *minfo,
+ guint32 il_offset);
+
MonoReflectionMethod *
ves_icall_MonoDebugger_GetMethod (MonoReflectionAssembly *assembly,
guint32 token);