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