2004-06-02 Martin Baulig <martin@ximian.com>
[mono.git] / mono / metadata / mono-debug.h
1 #ifndef __MONO_DEBUG_H__
2 #define __MONO_DEBUG_H__
3
4 #include <glib.h>
5 #include <mono/metadata/image.h>
6 #include <mono/metadata/appdomain.h>
7
8 typedef struct _MonoSymbolFile                  MonoSymbolFile;
9 typedef struct _MonoSymbolFilePriv              MonoSymbolFilePriv;
10
11 typedef struct _MonoDebugHandle                 MonoDebugHandle;
12 typedef struct _MonoDebugHandlePriv             MonoDebugHandlePriv;
13 typedef struct _MonoDebugDomainData             MonoDebugDomainData;
14 typedef struct _MonoDebugDomainDataPriv         MonoDebugDomainDataPriv;
15
16 typedef struct _MonoDebugVarInfo                MonoDebugVarInfo;
17 typedef struct _MonoDebugMethodJitInfo          MonoDebugMethodJitInfo;
18
19 typedef enum {
20         MONO_DEBUG_FORMAT_NONE,
21         MONO_DEBUG_FORMAT_MONO,
22         MONO_DEBUG_FORMAT_DEBUGGER
23 } MonoDebugFormat;
24
25 struct _MonoDebugHandle {
26         const char *image_file;
27         MonoImage *image;
28         MonoSymbolFile *symfile;
29         MonoDebugHandlePriv *_priv;
30 };
31
32 struct _MonoDebugMethodJitInfo {
33         const guint8 *code_start;
34         guint32 code_size;
35         guint32 prologue_end;
36         guint32 epilogue_begin;
37         const guint8 *wrapper_addr;
38         // Array of MonoDebugLineNumberEntry
39         GArray *line_numbers;
40         guint32 num_params;
41         MonoDebugVarInfo *this_var;
42         MonoDebugVarInfo *params;
43         guint32 num_locals;
44         MonoDebugVarInfo *locals;
45 };
46
47 struct _MonoDebugDomainData {
48         guint32 domain_id;
49         MonoDebugMethodJitInfo **jit;
50         MonoDebugDomainDataPriv *_priv;
51 };
52
53 /*
54  * These bits of the MonoDebugLocalInfo's "index" field are flags specifying
55  * where the variable is actually stored.
56  *
57  * See relocate_variable() in debug-symfile.c for more info.
58  */
59 #define MONO_DEBUG_VAR_ADDRESS_MODE_FLAGS               0xf0000000
60
61 /* The variable is in register "index". */
62 #define MONO_DEBUG_VAR_ADDRESS_MODE_REGISTER            0
63
64 /* The variable is at offset "offset" from register "index". */
65 #define MONO_DEBUG_VAR_ADDRESS_MODE_REGOFFSET           0x10000000
66
67 /* The variable is in the two registers "offset" and "index". */
68 #define MONO_DEBUG_VAR_ADDRESS_MODE_TWO_REGISTERS       0x20000000
69
70 struct _MonoDebugVarInfo {
71         guint32 index;
72         guint32 offset;
73         guint32 size;
74         guint32 begin_scope;
75         guint32 end_scope;
76 };
77
78 #define MONO_DEBUGGER_VERSION                           41
79 #define MONO_DEBUGGER_MAGIC                             0x7aff65af4253d427ULL
80
81 extern MonoDebugFormat mono_debug_format;
82 extern GHashTable *mono_debug_handles;
83
84 void mono_debug_init (MonoDomain *domain, MonoDebugFormat format);
85 void mono_debug_init_2 (MonoAssembly *assembly);
86 void mono_debug_cleanup (void);
87 MonoDebugDomainData *mono_debug_get_domain_data (MonoDebugHandle *handle, MonoDomain *domain);
88 void mono_debug_add_wrapper (MonoMethod *method, MonoMethod *wrapper_method, MonoDomain *domain);
89 void mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit, MonoDomain *domain);
90 gchar *mono_debug_source_location_from_address (MonoMethod *method, guint32 address,
91                                                 guint32 *line_number, MonoDomain *domain);
92 gchar *mono_debug_source_location_from_il_offset (MonoMethod *method, guint32 offset,
93                                                   guint32 *line_number);
94 gint32 mono_debug_il_offset_from_address (MonoMethod *method, gint32 address, MonoDomain *domain);
95 gint32 mono_debug_address_from_il_offset (MonoMethod *method, gint32 il_offset, MonoDomain *domain);
96
97 #endif /* __MONO_DEBUG_H__ */