Merge pull request #1081 from rneatherway/bug17537
[mono.git] / mono / metadata / mono-debug.h
1 /*
2  * This header is only installed for use by the debugger:
3  * the structures and the API declared here are not supported.
4  */
5
6 #ifndef __MONO_DEBUG_H__
7 #define __MONO_DEBUG_H__
8
9 #include <mono/utils/mono-publib.h>
10 #include <mono/metadata/image.h>
11 #include <mono/metadata/appdomain.h>
12
13 MONO_BEGIN_DECLS
14
15 typedef struct _MonoSymbolTable                 MonoSymbolTable;
16 typedef struct _MonoDebugDataTable              MonoDebugDataTable;
17
18 typedef struct _MonoSymbolFile                  MonoSymbolFile;
19
20 typedef struct _MonoDebugHandle                 MonoDebugHandle;
21
22 typedef struct _MonoDebugLineNumberEntry        MonoDebugLineNumberEntry;
23
24 typedef struct _MonoDebugVarInfo                MonoDebugVarInfo;
25 typedef struct _MonoDebugMethodJitInfo          MonoDebugMethodJitInfo;
26 typedef struct _MonoDebugMethodAddress          MonoDebugMethodAddress;
27 typedef struct _MonoDebugMethodAddressList      MonoDebugMethodAddressList;
28 typedef struct _MonoDebugClassEntry             MonoDebugClassEntry;
29
30 typedef struct _MonoDebugMethodInfo             MonoDebugMethodInfo;
31 typedef struct _MonoDebugLocalsInfo             MonoDebugLocalsInfo;
32 typedef struct _MonoDebugSourceLocation         MonoDebugSourceLocation;
33
34 typedef struct _MonoDebugList                   MonoDebugList;
35
36 typedef enum {
37         MONO_DEBUG_FORMAT_NONE,
38         MONO_DEBUG_FORMAT_MONO,
39         /* Deprecated, the mdb debugger is not longer supported. */
40         MONO_DEBUG_FORMAT_DEBUGGER
41 } MonoDebugFormat;
42
43 /*
44  * NOTE:
45  * We intentionally do not use GList here since the debugger needs to know about
46  * the layout of the fields.
47 */
48 struct _MonoDebugList {
49         MonoDebugList *next;
50         const void* data;
51 };
52
53 struct _MonoSymbolTable {
54         uint64_t magic;
55         uint32_t version;
56         uint32_t total_size;
57
58         /*
59          * Corlib and metadata info.
60          */
61         MonoDebugHandle *corlib;
62         MonoDebugDataTable *global_data_table;
63         MonoDebugList *data_tables;
64
65         /*
66          * The symbol files.
67          */
68         MonoDebugList *symbol_files;
69 };
70
71 struct _MonoDebugHandle {
72         uint32_t index;
73         char *image_file;
74         MonoImage *image;
75         MonoDebugDataTable *type_table;
76         MonoSymbolFile *symfile;
77 };
78
79 struct _MonoDebugMethodJitInfo {
80         const mono_byte *code_start;
81         uint32_t code_size;
82         uint32_t prologue_end;
83         uint32_t epilogue_begin;
84         const mono_byte *wrapper_addr;
85         uint32_t num_line_numbers;
86         MonoDebugLineNumberEntry *line_numbers;
87         uint32_t num_params;
88         MonoDebugVarInfo *this_var;
89         MonoDebugVarInfo *params;
90         uint32_t num_locals;
91         MonoDebugVarInfo *locals;
92         MonoDebugVarInfo *gsharedvt_info_var;
93         MonoDebugVarInfo *gsharedvt_locals_var;
94 };
95
96 struct _MonoDebugMethodAddressList {
97         uint32_t size;
98         uint32_t count;
99         mono_byte data [MONO_ZERO_LEN_ARRAY];
100 };
101
102 struct _MonoDebugSourceLocation {
103         char *source_file;
104         uint32_t row, column;
105         uint32_t il_offset;
106 };
107
108 MONO_API mono_bool mono_debug_enabled (void);
109
110 /*
111  * These bits of the MonoDebugLocalInfo's "index" field are flags specifying
112  * where the variable is actually stored.
113  *
114  * See relocate_variable() in debug-symfile.c for more info.
115  */
116 #define MONO_DEBUG_VAR_ADDRESS_MODE_FLAGS               0xf0000000
117
118 /* The variable is in register "index". */
119 #define MONO_DEBUG_VAR_ADDRESS_MODE_REGISTER            0
120
121 /* The variable is at offset "offset" from register "index". */
122 #define MONO_DEBUG_VAR_ADDRESS_MODE_REGOFFSET           0x10000000
123
124 /* The variable is in the two registers "offset" and "index". */
125 #define MONO_DEBUG_VAR_ADDRESS_MODE_TWO_REGISTERS       0x20000000
126
127 /* The variable is dead. */
128 #define MONO_DEBUG_VAR_ADDRESS_MODE_DEAD                0x30000000
129
130 /* Same as REGOFFSET, but do an indirection */
131 #define MONO_DEBUG_VAR_ADDRESS_MODE_REGOFFSET_INDIR             0x40000000
132
133 /* gsharedvt local */
134 #define MONO_DEBUG_VAR_ADDRESS_MODE_GSHAREDVT_LOCAL             0x50000000
135
136 /* variable is a vt address */
137 #define MONO_DEBUG_VAR_ADDRESS_MODE_VTADDR              0x60000000
138
139 struct _MonoDebugVarInfo {
140         uint32_t index;
141         uint32_t offset;
142         uint32_t size;
143         uint32_t begin_scope;
144         uint32_t end_scope;
145         MonoType *type;
146 };
147
148 #define MONO_DEBUGGER_MAJOR_VERSION                     81
149 #define MONO_DEBUGGER_MINOR_VERSION                     6
150 #define MONO_DEBUGGER_MAGIC                             0x7aff65af4253d427ULL
151
152 MONO_API void mono_debug_init (MonoDebugFormat format);
153 MONO_API void mono_debug_open_image_from_memory (MonoImage *image, const mono_byte *raw_contents, int size);
154 MONO_API void mono_debug_cleanup (void);
155
156 MONO_API void mono_debug_close_image (MonoImage *image);
157
158 MONO_API void mono_debug_domain_unload (MonoDomain *domain);
159 MONO_API void mono_debug_domain_create (MonoDomain *domain);
160
161 MONO_API MonoDebugMethodAddress *
162 mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit, MonoDomain *domain);
163
164 MONO_API void
165 mono_debug_remove_method (MonoMethod *method, MonoDomain *domain);
166
167 MONO_API MonoDebugMethodInfo *
168 mono_debug_lookup_method (MonoMethod *method);
169
170 MONO_API MonoDebugMethodAddressList *
171 mono_debug_lookup_method_addresses (MonoMethod *method);
172
173 MONO_API MonoDebugMethodJitInfo*
174 mono_debug_find_method (MonoMethod *method, MonoDomain *domain);
175
176 MONO_API void
177 mono_debug_free_method_jit_info (MonoDebugMethodJitInfo *jit);
178
179
180 MONO_API void
181 mono_debug_add_delegate_trampoline (void* code, int size);
182
183 MONO_API MonoDebugLocalsInfo*
184 mono_debug_lookup_locals (MonoMethod *method);
185
186 /*
187  * Line number support.
188  */
189
190 MONO_API MonoDebugSourceLocation *
191 mono_debug_lookup_source_location (MonoMethod *method, uint32_t address, MonoDomain *domain);
192
193 MONO_API int32_t
194 mono_debug_il_offset_from_address (MonoMethod *method, MonoDomain *domain, uint32_t native_offset);
195
196 MONO_API void
197 mono_debug_free_source_location (MonoDebugSourceLocation *location);
198
199 MONO_API char *
200 mono_debug_print_stack_frame (MonoMethod *method, uint32_t native_offset, MonoDomain *domain);
201
202 /*
203  * Mono Debugger support functions
204  *
205  * These methods are used by the JIT while running inside the Mono Debugger.
206  */
207
208 MONO_API int             mono_debugger_method_has_breakpoint       (MonoMethod *method);
209 MONO_API int             mono_debugger_insert_breakpoint           (const char *method_name, mono_bool include_namespace);
210
211 MONO_API void mono_set_is_debugger_attached (mono_bool attached);
212 MONO_API mono_bool mono_is_debugger_attached (void);
213
214 MONO_END_DECLS
215
216 #endif /* __MONO_DEBUG_H__ */