4 #include <mono/metadata/class.h>
5 #include <mono/metadata/tabledefs.h>
6 #include <mono/metadata/tokentype.h>
7 #include <mono/jit/codegen.h>
8 #include <mono/jit/debug.h>
10 #include "debug-private.h"
12 #define ABBREV_COMPILE_UNIT 1
13 #define ABBREV_SUBPROGRAM 2
14 #define ABBREV_SUBPROGRAM_RETVAL 3
15 #define ABBREV_BASE_TYPE 4
16 #define ABBREV_FORMAL_PARAMETER 5
17 #define ABBREV_PARAMETER 6
18 #define ABBREV_LOCAL_VARIABLE 7
19 #define ABBREV_STRUCT_TYPE 8
20 #define ABBREV_STRUCT_MEMBER 9
21 #define ABBREV_STRUCT_ACCESS 10
22 #define ABBREV_ENUM_TYPE 11
23 #define ABBREV_ENUM_VALUE 12
24 #define ABBREV_ENUM_VALUE_UNSIGNED 13
25 #define ABBREV_ENUM_VALUE_SIGNED 14
26 #define ABBREV_CLASS_TYPE 15
27 #define ABBREV_CLASS_INHERITANCE 16
28 #define ABBREV_POINTER_TYPE 17
29 #define ABBREV_CLASS_METHOD 18
30 #define ABBREV_CLASS_METHOD_RETVAL 19
31 #define ABBREV_ARTIFICIAL_PARAMETER 20
32 #define ABBREV_SIMPLE_ARRAY 21
33 #define ABBREV_ARRAY 22
34 #define ABBREV_SUBRANGE 23
36 // The following constants are defined in the DWARF 2 specification
37 #define DW_TAG_array_type 0x01
38 #define DW_TAG_class_type 0x02
39 #define DW_TAG_enumeration_type 0x04
40 #define DW_TAG_formal_parameter 0x05
41 #define DW_TAG_member 0x0d
42 #define DW_TAG_pointer_type 0x0f
43 #define DW_TAG_compile_unit 0x11
44 #define DW_TAG_structure_type 0x13
45 #define DW_TAG_inheritance 0x1c
46 #define DW_TAG_subrange_type 0x21
47 #define DW_TAG_access_declaration 0x23
48 #define DW_TAG_base_type 0x24
49 #define DW_TAG_enumerator 0x28
50 #define DW_TAG_subprogram 0x2e
51 #define DW_TAG_variable 0x34
53 #define DW_CHILDREN_no 0
54 #define DW_CHILDREN_yes 1
56 #define DW_AT_location 0x02
57 #define DW_AT_name 0x03
58 #define DW_AT_byte_size 0x0b
59 #define DW_AT_stmt_list 0x10
60 #define DW_AT_low_pc 0x11
61 #define DW_AT_high_pc 0x12
62 #define DW_AT_language 0x13
63 #define DW_AT_const_value 0x1c
64 #define DW_AT_lower_bound 0x22
65 #define DW_AT_producer 0x25
66 #define DW_AT_start_scope 0x2c
67 #define DW_AT_upper_bound 0x2f
68 #define DW_AT_accessibility 0x32
69 #define DW_AT_artificial 0x34
70 #define DW_AT_calling_convention 0x36
71 #define DW_AT_count 0x37
72 #define DW_AT_data_member_location 0x38
73 #define DW_AT_encoding 0x3e
74 #define DW_AT_external 0x3f
75 #define DW_AT_type 0x49
76 #define DW_AT_virtuality 0x4c
77 #define DW_AT_vtable_elem_location 0x4d
79 /* Martin Baulig's extensions. */
80 #define DW_AT_end_scope 0x2121
82 #define DW_FORM_addr 0x01
83 #define DW_FORM_block4 0x04
84 #define DW_FORM_data2 0x05
85 #define DW_FORM_data4 0x06
86 #define DW_FORM_data8 0x07
87 #define DW_FORM_string 0x08
88 #define DW_FORM_data1 0x0b
89 #define DW_FORM_flag 0x0c
90 #define DW_FORM_sdata 0x0d
91 #define DW_FORM_udata 0x0f
92 #define DW_FORM_ref4 0x13
94 #define DW_ATE_void 0x00
95 #define DW_ATE_address 0x01
96 #define DW_ATE_boolean 0x02
97 #define DW_ATE_complex_float 0x03
98 #define DW_ATE_float 0x04
99 #define DW_ATE_signed 0x05
100 #define DW_ATE_signed_char 0x06
101 #define DW_ATE_unsigned 0x07
102 #define DW_ATE_unsigned_char 0x08
104 #define DW_OP_const1u 0x08
105 #define DW_OP_const1s 0x09
106 #define DW_OP_constu 0x10
107 #define DW_OP_consts 0x11
108 #define DW_OP_plus 0x22
109 #define DW_OP_reg0 0x50
110 #define DW_OP_breg0 0x70
111 #define DW_OP_fbreg 0x91
112 #define DW_OP_piece 0x93
114 #define DW_CC_normal 1
115 #define DW_CC_program 2
116 #define DW_CC_nocall 3
118 #define DW_ACCESS_public 1
119 #define DW_ACCESS_protected 2
120 #define DW_ACCESS_private 3
122 #define DW_VIRTUALITY_none 0
123 #define DW_VIRTUALITY_virtual 1
124 #define DW_VIRTUALITY_pure_virtual 2
126 #define DW_LANG_C_plus_plus 0x04
127 #define DW_LANG_Java 0x0b
128 // This is NOT in the standard, we're using Java for the moment. */
129 #define DW_LANG_C_sharp DW_LANG_C_plus_plus
131 #define DW_LNS_extended_op 0
132 #define DW_LNS_copy 1
133 #define DW_LNS_advance_pc 2
134 #define DW_LNS_advance_line 3
135 #define DW_LNS_set_file 4
136 #define DW_LNS_set_column 5
137 #define DW_LNS_negate_stmt 6
138 #define DW_LNS_set_basic_block 7
139 #define DW_LNS_const_add_pc 8
140 #define DW_LNS_fixed_advance_pc 9
142 #define DW_LNE_end_sequence 1
143 #define DW_LNE_set_address 2
144 #define DW_LNE_define_file 3
147 static const int line_base = 1, line_range = 8, opcode_base = 10;
148 static const int standard_opcode_sizes [10] = {
149 0, 0, 1, 1, 1, 1, 0, 0, 0, 0
153 dwarf2_write_byte (FILE *f, int byte)
155 fprintf (f, "\t.byte %d\n", byte);
159 dwarf2_write_2byte (FILE *f, int word)
161 fprintf (f, "\t.word %d\n", word);
165 dwarf2_write_pair (FILE *f, int a, int b)
167 fprintf (f, "\t.uleb128 %d, %d\n", a, b);
171 dwarf2_write_long (FILE *f, unsigned long value)
173 fprintf (f, "\t.long %lu\n", value);
177 dwarf2_write_address (FILE *f, const void *address)
179 fprintf (f, "\t.long 0x%lx\n", (long) address);
183 dwarf2_write_string (FILE *f, const char *string)
185 fprintf (f, "\t.string \"%s\"\n", string);
189 dwarf2_write_sleb128 (FILE *f, long value)
191 fprintf (f, "\t.sleb128 %ld\n", value);
195 dwarf2_write_uleb128 (FILE *f, unsigned long value)
197 fprintf (f, "\t.uleb128 %lu\n", value);
201 dwarf2_write_section_start (FILE *f, const char *section)
203 fprintf (f, "\t.section .%s\n", section);
207 dwarf2_write_label (FILE *f, const char *label)
209 fprintf (f, ".L_%s:\n", label);
213 dwarf2_write_section_size (FILE *f, const char *start_label, const char *end_label)
215 fprintf (f, "\t.long .L_%s - .L_%s\n", end_label, start_label);
219 dwarf2_write_ref4 (FILE *f, const char *target_label)
221 fprintf (f, "\t.long .L_%s\n", target_label);
225 dwarf2_write_type_ref (FILE *f, unsigned long type_index)
227 fprintf (f, "\t.long .L_TYPE_%lu - .L_debug_info_b\n", type_index);
231 dwarf2_write_type_ptr_ref (FILE *f, unsigned long idx)
233 fprintf (f, "\t.long .L_TYPE_PTR_%lu - .L_debug_info_b\n", idx);
237 dwarf2_write_relative_ref (FILE *f, const gchar *name, unsigned long idx)
239 fprintf (f, "\t.long .L_%s_%lu - .L_debug_info_b\n", name, idx);
243 dwarf2_write_dw_lns_copy (FILE *f)
245 dwarf2_write_byte (f, DW_LNS_copy);
249 dwarf2_write_dw_lns_advance_pc (FILE *f, unsigned value)
251 dwarf2_write_byte (f, DW_LNS_advance_pc);
252 dwarf2_write_uleb128 (f, value);
256 dwarf2_write_dw_lns_advance_line (FILE *f, int value)
258 dwarf2_write_byte (f, DW_LNS_advance_line);
259 dwarf2_write_sleb128 (f, value);
263 dwarf2_write_dw_lns_set_file (FILE *f, unsigned value)
265 dwarf2_write_byte (f, DW_LNS_set_file);
266 dwarf2_write_uleb128 (f, value + 1);
270 dwarf2_write_dw_lns_negate_stmt (FILE *f)
272 dwarf2_write_byte (f, DW_LNS_negate_stmt);
275 #if 0 /* never used */
277 dwarf2_write_dw_lns_set_basic_block (FILE *f)
279 dwarf2_write_byte (f, DW_LNS_set_basic_block);
284 dwarf2_write_dw_lne_end_sequence (FILE *f)
286 dwarf2_write_byte (f, 0);
287 dwarf2_write_byte (f, 1);
288 dwarf2_write_byte (f, DW_LNE_end_sequence);
292 dwarf2_write_dw_lne_set_address (FILE *f, const void *address)
294 dwarf2_write_byte (f, 0);
295 dwarf2_write_byte (f, sizeof (address) + 1);
296 dwarf2_write_byte (f, DW_LNE_set_address);
297 dwarf2_write_address (f, address);
301 dwarf2_write_base_type (MonoDebugHandle *debug, int idx,
302 int type, int size, const gchar *name)
304 char buffer [BUFSIZ];
306 sprintf (buffer, "TYPE_%d", idx);
307 dwarf2_write_label (debug->f, buffer);
309 dwarf2_write_byte (debug->f, ABBREV_BASE_TYPE);
310 dwarf2_write_string (debug->f, name);
311 dwarf2_write_byte (debug->f, type);
312 dwarf2_write_byte (debug->f, size);
316 dwarf2_write_enum_value (MonoDebugHandle *debug, MonoClass *klass, int idx)
319 guint32 field_index = idx + klass->field.first;
322 crow = mono_metadata_get_constant_index (klass->image, MONO_TOKEN_FIELD_DEF | (field_index + 1));
324 dwarf2_write_byte (debug->f, ABBREV_ENUM_VALUE);
325 dwarf2_write_string (debug->f, klass->fields [idx].name);
326 dwarf2_write_long (debug->f, 0);
330 crow = mono_metadata_decode_row_col (&klass->image->tables [MONO_TABLE_CONSTANT], crow-1,
331 MONO_CONSTANT_VALUE);
333 ptr = 1 + mono_metadata_blob_heap (klass->image, crow);
335 switch (klass->enum_basetype->type) {
336 case MONO_TYPE_BOOLEAN:
338 dwarf2_write_byte (debug->f, ABBREV_ENUM_VALUE_UNSIGNED);
339 dwarf2_write_string (debug->f, klass->fields [idx].name);
340 dwarf2_write_uleb128 (debug->f, *(guint8 *) ptr);
343 dwarf2_write_byte (debug->f, ABBREV_ENUM_VALUE_SIGNED);
344 dwarf2_write_string (debug->f, klass->fields [idx].name);
345 dwarf2_write_sleb128 (debug->f, *(gint8 *) ptr);
349 dwarf2_write_byte (debug->f, ABBREV_ENUM_VALUE_UNSIGNED);
350 dwarf2_write_string (debug->f, klass->fields [idx].name);
351 dwarf2_write_uleb128 (debug->f, *(guint16 *) ptr);
354 dwarf2_write_byte (debug->f, ABBREV_ENUM_VALUE_SIGNED);
355 dwarf2_write_string (debug->f, klass->fields [idx].name);
356 dwarf2_write_sleb128 (debug->f, *(gint16 *) ptr);
359 dwarf2_write_byte (debug->f, ABBREV_ENUM_VALUE_UNSIGNED);
360 dwarf2_write_string (debug->f, klass->fields [idx].name);
361 dwarf2_write_uleb128 (debug->f, *(guint32 *) ptr);
364 dwarf2_write_byte (debug->f, ABBREV_ENUM_VALUE_SIGNED);
365 dwarf2_write_string (debug->f, klass->fields [idx].name);
366 dwarf2_write_sleb128 (debug->f, *(gint32 *) ptr);
369 dwarf2_write_byte (debug->f, ABBREV_ENUM_VALUE_UNSIGNED);
370 dwarf2_write_string (debug->f, klass->fields [idx].name);
371 dwarf2_write_uleb128 (debug->f, *(guint64 *) ptr);
374 dwarf2_write_byte (debug->f, ABBREV_ENUM_VALUE_SIGNED);
375 dwarf2_write_string (debug->f, klass->fields [idx].name);
376 dwarf2_write_sleb128 (debug->f, *(gint64 *) ptr);
379 g_assert_not_reached ();
384 dwarf2_write_enum_type (MonoDebugHandle *debug, MonoClass *klass)
388 // DW_TAG_enumeration_type
389 dwarf2_write_byte (debug->f, ABBREV_ENUM_TYPE);
390 dwarf2_write_string (debug->f, klass->name);
391 dwarf2_write_long (debug->f, klass->instance_size - sizeof (MonoObject));
393 for (i = 0; i < klass->field.count; i++) {
394 if (klass->fields [i].type->attrs & FIELD_ATTRIBUTE_LITERAL)
395 dwarf2_write_enum_value (debug, klass, i);
398 dwarf2_write_byte (debug->f, 0);
399 // DW_TAG_enumeration_type ends here
403 dwarf2_write_class_field (MonoDebugHandle *debug, MonoClass *klass, int idx,
404 int type_index, int start_offset)
406 MonoClass *subclass = mono_class_from_mono_type (klass->fields [idx].type);
407 char start [BUFSIZ], end [BUFSIZ];
408 static long label_index = 0;
410 // Don't include any static fields, they aren't supported yet.
411 // If a struct contains a static field which has the same type as
412 // the struct itself, we'd get a recursion loop there.
413 if (klass->fields [idx].type->attrs & FIELD_ATTRIBUTE_STATIC)
416 sprintf (start, "DSF1_%ld", ++label_index);
417 sprintf (end, "DSF2_%ld", label_index);
420 dwarf2_write_byte (debug->f, ABBREV_STRUCT_MEMBER);
421 dwarf2_write_string (debug->f, klass->fields [idx].name);
422 if (!subclass->valuetype)
423 dwarf2_write_type_ptr_ref (debug->f, type_index);
425 dwarf2_write_type_ref (debug->f, type_index);
427 if (klass->fields [idx].type->attrs & FIELD_ATTRIBUTE_PRIVATE)
428 dwarf2_write_byte (debug->f, DW_ACCESS_private);
429 else if (klass->fields [idx].type->attrs & FIELD_ATTRIBUTE_FAMILY)
430 dwarf2_write_byte (debug->f, DW_ACCESS_protected);
432 dwarf2_write_byte (debug->f, DW_ACCESS_public);
434 dwarf2_write_section_size (debug->f, start, end);
435 dwarf2_write_label (debug->f, start);
436 dwarf2_write_byte (debug->f, DW_OP_constu);
437 dwarf2_write_uleb128 (debug->f, klass->fields [idx].offset - start_offset);
438 dwarf2_write_label (debug->f, end);
440 dwarf2_write_long (debug->f, subclass->instance_size);
444 dwarf2_write_class_method (MonoDebugHandle *debug, MonoClass *klass, MonoMethod *method)
446 MonoType *ret_type = NULL;
450 if (method->signature->ret->type != MONO_TYPE_VOID)
451 ret_type = method->signature->ret;
455 dwarf2_write_byte (debug->f, ABBREV_CLASS_METHOD_RETVAL);
457 dwarf2_write_byte (debug->f, ABBREV_CLASS_METHOD);
458 dwarf2_write_string (debug->f, method->name);
460 if (method->flags & METHOD_ATTRIBUTE_PUBLIC)
461 dwarf2_write_byte (debug->f, DW_ACCESS_public);
462 else if (method->flags & METHOD_ATTRIBUTE_PRIVATE)
463 dwarf2_write_byte (debug->f, DW_ACCESS_private);
465 dwarf2_write_byte (debug->f, DW_ACCESS_protected);
467 if (method->flags & METHOD_ATTRIBUTE_VIRTUAL)
468 dwarf2_write_byte (debug->f, DW_VIRTUALITY_pure_virtual);
470 dwarf2_write_byte (debug->f, DW_VIRTUALITY_none);
472 dwarf2_write_byte (debug->f, DW_CC_nocall);
475 MonoClass *k = mono_class_from_mono_type (ret_type);
476 int type_index = mono_debug_get_type (debug, k);
477 dwarf2_write_type_ref (debug->f, type_index);
480 if (method->signature->hasthis) {
481 int type_index = mono_debug_get_type (debug, klass);
483 dwarf2_write_byte (debug->f, ABBREV_ARTIFICIAL_PARAMETER);
484 dwarf2_write_string (debug->f, "this");
485 dwarf2_write_type_ptr_ref (debug->f, type_index);
486 dwarf2_write_byte (debug->f, 1);
489 names = g_new (char *, method->signature->param_count);
490 mono_method_get_param_names (method, (const char **) names);
492 for (i = 0; i < method->signature->param_count; i++) {
493 MonoType *subtype = method->signature->params [i];
494 MonoClass *subklass = mono_class_from_mono_type (subtype);
495 int type_index = mono_debug_get_type (debug, subklass);
497 // DW_TAG_formal_parameter
498 dwarf2_write_byte (debug->f, ABBREV_FORMAL_PARAMETER);
499 dwarf2_write_string (debug->f, names [i]);
500 if (subklass->valuetype)
501 dwarf2_write_type_ref (debug->f, type_index);
503 dwarf2_write_type_ptr_ref (debug->f, type_index);
508 dwarf2_write_byte (debug->f, 0);
509 // DW_TAG_subprogram ends here
513 dwarf2_write_struct_type (MonoDebugHandle *debug, MonoClass *klass)
518 idxs = g_new0 (guint32, klass->field.last - klass->field.first + 1);
519 for (i = 0; i < klass->field.count; i++) {
520 MonoClass *subclass = mono_class_from_mono_type (klass->fields [i].type);
521 idxs [i] = mono_debug_get_type (debug, subclass);
524 // DW_TAG_structure_type
525 dwarf2_write_byte (debug->f, ABBREV_STRUCT_TYPE);
526 dwarf2_write_string (debug->f, klass->name);
527 dwarf2_write_long (debug->f, klass->instance_size - sizeof (MonoObject));
529 for (i = 0; i < klass->field.count; i++)
530 dwarf2_write_class_field (debug, klass, i, idxs [i], sizeof (MonoObject));
532 dwarf2_write_byte (debug->f, 0);
533 // DW_TAG_structure_type ends here
539 dwarf2_write_class_type (MonoDebugHandle *debug, MonoClass *klass)
544 idxs = g_new0 (guint32, klass->field.last - klass->field.first + 1);
545 for (i = 0; i < klass->field.count; i++) {
546 MonoClass *subclass = mono_class_from_mono_type (klass->fields [i].type);
547 idxs [i] = mono_debug_get_type (debug, subclass);
550 // DW_TAG_structure_type
551 dwarf2_write_byte (debug->f, ABBREV_CLASS_TYPE);
552 dwarf2_write_string (debug->f, klass->name);
553 dwarf2_write_long (debug->f, klass->instance_size);
554 if (klass->flags & TYPE_ATTRIBUTE_PUBLIC)
555 dwarf2_write_byte (debug->f, DW_ACCESS_public);
557 dwarf2_write_byte (debug->f, DW_ACCESS_private);
559 if (klass->parent && klass->parent->byval_arg.type == MONO_TYPE_CLASS) {
560 guint32 parent_index = mono_debug_get_type (debug, klass->parent);
562 // DW_TAG_inheritance
563 dwarf2_write_byte (debug->f, ABBREV_CLASS_INHERITANCE);
564 dwarf2_write_type_ref (debug->f, parent_index);
565 if (klass->parent->flags & TYPE_ATTRIBUTE_PUBLIC)
566 dwarf2_write_byte (debug->f, DW_ACCESS_public);
568 dwarf2_write_byte (debug->f, DW_ACCESS_private);
571 for (i = 0; i < klass->field.count; i++)
572 dwarf2_write_class_field (debug, klass, i, idxs [i], 0);
574 for (i = 0; i < klass->method.count; i++) {
575 if (!strcmp (klass->methods [i]->name, ".ctor"))
578 dwarf2_write_class_method (debug, klass, klass->methods [i]);
581 dwarf2_write_byte (debug->f, 0);
582 // DW_TAG_class_type ends here
588 dwarf2_write_array (MonoDebugHandle *debug, const gchar *name, MonoClass *element_class,
591 unsigned long uint32_index = mono_debug_get_type (debug, mono_defaults.uint32_class);
592 char buffer [BUFSIZ];
595 dwarf2_write_byte (debug->f, ABBREV_STRUCT_TYPE);
596 dwarf2_write_string (debug->f, name);
597 dwarf2_write_long (debug->f, sizeof (MonoArray));
599 // DW_TAG_structure_type
600 dwarf2_write_byte (debug->f, ABBREV_STRUCT_MEMBER);
601 dwarf2_write_string (debug->f, "max_length");
602 dwarf2_write_type_ref (debug->f, uint32_index);
603 dwarf2_write_byte (debug->f, DW_ACCESS_public);
604 dwarf2_write_long (debug->f, 2);
605 dwarf2_write_byte (debug->f, DW_OP_const1u);
606 dwarf2_write_byte (debug->f, (guchar *) &array.max_length - (guchar *) &array);
607 dwarf2_write_long (debug->f, 4);
609 dwarf2_write_byte (debug->f, ABBREV_STRUCT_MEMBER);
610 dwarf2_write_string (debug->f, "bounds");
611 dwarf2_write_relative_ref (debug->f, "ARRAY_BOUNDS_PTR", idx);
612 dwarf2_write_byte (debug->f, DW_ACCESS_public);
613 dwarf2_write_long (debug->f, 2);
614 dwarf2_write_byte (debug->f, DW_OP_const1u);
615 dwarf2_write_byte (debug->f, (guchar *) &array.bounds - (guchar *) &array);
616 dwarf2_write_long (debug->f, 4);
618 dwarf2_write_byte (debug->f, ABBREV_STRUCT_MEMBER);
619 dwarf2_write_string (debug->f, "vector");
620 dwarf2_write_relative_ref (debug->f, "ARRAY_PTR", idx);
621 dwarf2_write_byte (debug->f, DW_ACCESS_public);
622 dwarf2_write_long (debug->f, 2);
623 dwarf2_write_byte (debug->f, DW_OP_const1u);
624 dwarf2_write_byte (debug->f, (guchar *) &array.vector - (guchar *) &array);
625 dwarf2_write_long (debug->f, 4);
627 dwarf2_write_byte (debug->f, 0);
628 // DW_TAG_structure_type ends here
630 sprintf (buffer, "ARRAY_BOUNDS_PTR_%u", idx);
631 dwarf2_write_label (debug->f, buffer);
633 // DW_TAG_pointer_type
634 dwarf2_write_byte (debug->f, ABBREV_POINTER_TYPE);
635 dwarf2_write_relative_ref (debug->f, "ARRAY_BOUNDS", idx);
637 sprintf (buffer, "ARRAY_BOUNDS_%u", idx);
638 dwarf2_write_label (debug->f, buffer);
641 dwarf2_write_byte (debug->f, ABBREV_ARRAY);
642 dwarf2_write_string (debug->f, name);
643 dwarf2_write_type_ref (debug->f, uint32_index);
644 dwarf2_write_long (debug->f, rank * 2);
646 // DW_TAG_subrange_type
647 dwarf2_write_byte (debug->f, ABBREV_SUBRANGE);
648 dwarf2_write_long (debug->f, 0);
649 dwarf2_write_long (debug->f, rank-1);
650 dwarf2_write_long (debug->f, rank);
652 // DW_TAG_subrange_type
653 dwarf2_write_byte (debug->f, ABBREV_SUBRANGE);
654 dwarf2_write_long (debug->f, 0);
655 dwarf2_write_long (debug->f, 1);
656 dwarf2_write_long (debug->f, 2);
658 dwarf2_write_byte (debug->f, 0);
659 // DW_TAG_array_type ends here
661 sprintf (buffer, "ARRAY_PTR_%u", idx);
662 dwarf2_write_label (debug->f, buffer);
665 dwarf2_write_byte (debug->f, ABBREV_SIMPLE_ARRAY);
666 dwarf2_write_string (debug->f, name);
667 if (element_class->valuetype)
668 dwarf2_write_type_ref (debug->f, mono_debug_get_type (debug, element_class));
670 dwarf2_write_type_ptr_ref (debug->f, mono_debug_get_type (debug, element_class));
674 dwarf2_write_array_type (MonoDebugHandle *debug, MonoClass *klass, int idx)
676 char buffer [BUFSIZ], *name;
680 for (i = 0; i < klass->rank; i++)
681 strcat (buffer, "[]");
683 name = g_strdup_printf ("%s%s", klass->element_class->name, buffer);
685 dwarf2_write_array (debug, name, klass->element_class, klass->rank, idx);
691 dwarf2_write_string_type (MonoDebugHandle *debug, MonoClass *klass, int idx)
693 unsigned long uint32_index = mono_debug_get_type (debug, mono_defaults.uint32_class);
694 char buffer [BUFSIZ];
697 // DW_TAG_structure_type
698 dwarf2_write_byte (debug->f, ABBREV_STRUCT_TYPE);
699 dwarf2_write_string (debug->f, klass->name);
700 dwarf2_write_long (debug->f, sizeof (MonoString));
702 dwarf2_write_byte (debug->f, ABBREV_STRUCT_MEMBER);
703 dwarf2_write_string (debug->f, "length");
704 dwarf2_write_type_ref (debug->f, uint32_index);
705 dwarf2_write_byte (debug->f, DW_ACCESS_public);
706 dwarf2_write_long (debug->f, 2);
707 dwarf2_write_byte (debug->f, DW_OP_const1u);
708 dwarf2_write_byte (debug->f, (guchar *) &string.length - (guchar *) &string);
709 dwarf2_write_long (debug->f, 4);
711 dwarf2_write_byte (debug->f, ABBREV_STRUCT_MEMBER);
712 dwarf2_write_string (debug->f, "chars");
713 dwarf2_write_relative_ref (debug->f, "CHARS", idx);
714 dwarf2_write_byte (debug->f, DW_ACCESS_public);
715 dwarf2_write_long (debug->f, 2);
716 dwarf2_write_byte (debug->f, DW_OP_const1u);
717 dwarf2_write_byte (debug->f, (guchar *) &string.chars - (guchar *) &string);
718 dwarf2_write_long (debug->f, 4);
720 dwarf2_write_byte (debug->f, 0);
721 // DW_TAG_structure_type ends here
723 sprintf (buffer, "CHARS_%u", idx);
724 dwarf2_write_label (debug->f, buffer);
726 dwarf2_write_byte (debug->f, ABBREV_SIMPLE_ARRAY);
727 dwarf2_write_string (debug->f, "Char[]");
728 dwarf2_write_type_ref (debug->f, mono_debug_get_type (debug, mono_defaults.char_class));
732 dwarf2_write_class (MonoDebugHandle *debug, MonoClass *klass, int idx)
734 char buffer [BUFSIZ];
737 if (!strncmp (klass->name, "My", 2)) {
738 g_message (G_STRLOC ": %s - %s - %x", klass->name_space, klass->name, klass->flags);
743 if (!klass->valuetype) {
744 sprintf (buffer, "TYPE_PTR_%u", idx);
745 dwarf2_write_label (debug->f, buffer);
747 // DW_TAG_pointer_type
748 dwarf2_write_byte (debug->f, ABBREV_POINTER_TYPE);
749 dwarf2_write_type_ref (debug->f, idx);
752 sprintf (buffer, "TYPE_%u", idx);
753 dwarf2_write_label (debug->f, buffer);
755 if (klass->enumtype) {
756 dwarf2_write_enum_type (debug, klass);
760 switch (klass->byval_arg.type) {
761 case MONO_TYPE_VALUETYPE:
762 dwarf2_write_struct_type (debug, klass);
764 case MONO_TYPE_CLASS:
765 dwarf2_write_class_type (debug, klass);
767 case MONO_TYPE_SZARRAY:
768 case MONO_TYPE_ARRAY:
769 dwarf2_write_array_type (debug, klass, idx);
771 case MONO_TYPE_STRING:
772 dwarf2_write_string_type (debug, klass, idx);
776 g_message (G_STRLOC ": %s.%s - 0x%x - 0x%x", klass->name_space, klass->name,
777 klass->byval_arg.type, klass->flags);
781 dwarf2_write_byte (debug->f, ABBREV_BASE_TYPE);
782 dwarf2_write_string (debug->f, klass->name);
783 dwarf2_write_byte (debug->f, DW_ATE_address);
784 dwarf2_write_byte (debug->f, 0);
790 dwarf2_write_variable_location (MonoDebugHandle *debug, MonoDebugVarInfo *var)
792 switch (var->index & MONO_DEBUG_VAR_ADDRESS_MODE_FLAGS) {
793 case MONO_DEBUG_VAR_ADDRESS_MODE_STACK:
795 * Variable is on the stack.
797 * If `index' is zero, use the normal frame register. Otherwise, bits
798 * 0..4 of `index' contain the frame register.
803 /* Use the normal frame register (%ebp on the i386). */
804 dwarf2_write_byte (debug->f, DW_OP_fbreg);
806 /* Use a custom frame register. */
807 dwarf2_write_byte (debug->f, DW_OP_breg0 + (var->index & 0x001f));
808 dwarf2_write_sleb128 (debug->f, var->offset);
811 case MONO_DEBUG_VAR_ADDRESS_MODE_REGISTER:
813 * Variable is in the register whose number is contained in bits 0..4
817 dwarf2_write_byte (debug->f, DW_OP_reg0 + (var->index & 0x001f));
819 dwarf2_write_byte (debug->f, DW_OP_consts);
820 dwarf2_write_sleb128 (debug->f, var->offset);
821 dwarf2_write_byte (debug->f, DW_OP_plus);
825 case MONO_DEBUG_VAR_ADDRESS_MODE_TWO_REGISTERS:
827 * Variable is in two registers whose numbers are in bits 0..4 and 5..9 of
830 dwarf2_write_byte (debug->f, DW_OP_reg0 + (var->index & 0x001f));
831 dwarf2_write_byte (debug->f, DW_OP_piece);
832 dwarf2_write_byte (debug->f, sizeof (int));
834 dwarf2_write_byte (debug->f, DW_OP_reg0 + ((var->index & 0x1f0) >> 5));
835 dwarf2_write_byte (debug->f, DW_OP_piece);
836 dwarf2_write_byte (debug->f, sizeof (int));
841 g_assert_not_reached ();
846 dwarf2_write_parameter (MonoDebugHandle *debug, MonoDebugMethodInfo *minfo, const gchar *name,
847 MonoDebugVarInfo *var, MonoClass *klass)
849 static long label_index = 0;
850 int type_index = mono_debug_get_type (debug, klass);
851 char start [BUFSIZ], end [BUFSIZ];
853 sprintf (start, "DT1_%ld", ++label_index);
854 sprintf (end, "DT2_%ld", label_index);
856 // DW_TAG_format_parameter
857 dwarf2_write_byte (debug->f, ABBREV_PARAMETER);
858 dwarf2_write_string (debug->f, name);
859 if (klass->valuetype)
860 dwarf2_write_type_ref (debug->f, type_index);
862 dwarf2_write_type_ptr_ref (debug->f, type_index);
863 dwarf2_write_section_size (debug->f, start, end);
864 dwarf2_write_label (debug->f, start);
865 dwarf2_write_variable_location (debug, var);
866 dwarf2_write_label (debug->f, end);
867 dwarf2_write_long (debug->f, minfo->jit->prologue_end);
871 dwarf2_write_variable (MonoDebugHandle *debug, MonoDebugMethodInfo *minfo, const gchar *name,
872 MonoDebugVarInfo *var, MonoClass *klass)
874 static long label_index = 0;
875 int type_index = mono_debug_get_type (debug, klass);
876 char start [BUFSIZ], end [BUFSIZ];
878 sprintf (start, "DT3_%ld", ++label_index);
879 sprintf (end, "DT4_%ld", label_index);
881 // DW_TAG_formal_parameter
882 dwarf2_write_byte (debug->f, ABBREV_LOCAL_VARIABLE);
883 dwarf2_write_string (debug->f, name);
884 if (klass->valuetype)
885 dwarf2_write_type_ref (debug->f, type_index);
887 dwarf2_write_type_ptr_ref (debug->f, type_index);
888 dwarf2_write_section_size (debug->f, start, end);
889 dwarf2_write_label (debug->f, start);
890 dwarf2_write_variable_location (debug, var);
891 dwarf2_write_label (debug->f, end);
892 dwarf2_write_address (debug->f, minfo->jit->code_start + var->begin_scope);
893 dwarf2_write_address (debug->f, minfo->jit->code_start + var->end_scope);
897 write_method_lines_dwarf2 (MonoDebugHandle *debug, MonoDebugMethodInfo *minfo)
900 gconstpointer st_address = 0;
901 DebugMethodInfo *priv = minfo->user_data;
904 if (!minfo->jit || !minfo->jit->line_numbers)
907 // Start of statement program
908 dwarf2_write_dw_lns_set_file (debug->f, priv->source_file);
909 dwarf2_write_dw_lns_advance_line (debug->f, priv->start_line - 1);
910 dwarf2_write_dw_lne_set_address (debug->f, minfo->jit->code_start);
911 dwarf2_write_dw_lns_negate_stmt (debug->f);
912 dwarf2_write_dw_lns_copy (debug->f);
914 st_line = priv->start_line;
917 for (i = 1; i < minfo->jit->line_numbers->len; i++) {
918 MonoDebugLineNumberEntry lne = g_array_index (
919 minfo->jit->line_numbers, MonoDebugLineNumberEntry, i);
920 gint32 line_inc, addr_inc, opcode;
921 int used_standard_opcode = 0;
923 line_inc = lne.line - st_line;
924 addr_inc = (char *)lne.address - (char *)st_address;
927 dwarf2_write_dw_lne_set_address (debug->f, lne.address + minfo->jit->code_start);
928 used_standard_opcode = 1;
929 } else if (addr_inc && !line_inc) {
930 dwarf2_write_dw_lns_advance_pc (debug->f, addr_inc);
931 used_standard_opcode = 1;
934 if ((line_inc < 0) || (line_inc >= line_range)) {
935 dwarf2_write_dw_lns_advance_pc (debug->f, addr_inc);
936 dwarf2_write_dw_lns_advance_line (debug->f, line_inc);
937 used_standard_opcode = 1;
938 } else if (line_inc > 0) {
939 opcode = (line_inc - 1) + (line_range * addr_inc) + opcode_base;
940 g_assert (opcode >= 0);
943 dwarf2_write_dw_lns_advance_pc (debug->f, addr_inc);
944 dwarf2_write_dw_lns_advance_line (debug->f, line_inc);
945 used_standard_opcode = 1;
947 dwarf2_write_byte (debug->f, opcode);
950 if (used_standard_opcode)
951 dwarf2_write_dw_lns_copy (debug->f);
954 st_address = (char *)st_address + addr_inc;
957 dwarf2_write_dw_lne_set_address (debug->f,
958 (char *)minfo->jit->code_start +
959 minfo->jit->epilogue_begin);
960 dwarf2_write_dw_lns_advance_line (debug->f, priv->last_line - st_line);
961 dwarf2_write_dw_lns_copy (debug->f);
963 dwarf2_write_dw_lns_copy (debug->f);
964 dwarf2_write_dw_lne_end_sequence (debug->f);
968 write_method_lines_func (gpointer key, gpointer value, gpointer user_data)
970 write_method_lines_dwarf2 (user_data, value);
974 write_method_lines_func_1 (gpointer key, gpointer value, gpointer user_data)
976 AssemblyDebugInfo *info = (AssemblyDebugInfo *) value;
978 g_hash_table_foreach (info->methods, write_method_lines_func, user_data);
982 write_line_numbers (MonoDebugHandle *debug)
984 /* State machine registers. */
987 // Line number information.
988 dwarf2_write_section_start (debug->f, "debug_line");
989 dwarf2_write_label (debug->f, "debug_line_b");
990 dwarf2_write_section_size (debug->f, "DL1", "debug_line_e");
991 dwarf2_write_label (debug->f, "DL1");
992 dwarf2_write_2byte (debug->f, 2);
993 dwarf2_write_section_size (debug->f, "DL2", "DL3");
994 dwarf2_write_label (debug->f, "DL2");
995 // minimum instruction length
996 dwarf2_write_byte (debug->f, 1);
997 // default is statement
998 dwarf2_write_byte (debug->f, 1);
1000 dwarf2_write_byte (debug->f, line_base);
1002 dwarf2_write_byte (debug->f, line_range);
1004 dwarf2_write_byte (debug->f, opcode_base);
1005 // standard opcode sizes
1006 for (i = 1; i < opcode_base; i++)
1007 dwarf2_write_byte (debug->f, standard_opcode_sizes [i]);
1008 // include directories
1009 dwarf2_write_byte (debug->f, 0);
1011 for (i = 0; i < debug->source_files->len; i++) {
1012 gchar *source_file = g_ptr_array_index (debug->source_files, i);
1013 dwarf2_write_string (debug->f, source_file);
1014 dwarf2_write_uleb128 (debug->f, 0);
1015 dwarf2_write_uleb128 (debug->f, 0);
1016 dwarf2_write_uleb128 (debug->f, 0);
1019 dwarf2_write_byte (debug->f, 0);
1020 dwarf2_write_label (debug->f, "DL3");
1022 g_hash_table_foreach (debug->images, write_method_lines_func_1, debug);
1024 dwarf2_write_label (debug->f, "debug_line_e");
1028 write_class_dwarf2 (MonoDebugHandle *debug, MonoClass *klass, guint idx)
1030 switch (klass->byval_arg.type) {
1031 case MONO_TYPE_VOID:
1032 dwarf2_write_base_type (debug, idx, DW_ATE_unsigned, 0, "Void");
1034 case MONO_TYPE_BOOLEAN:
1035 dwarf2_write_base_type (debug, idx, DW_ATE_boolean, 1, "Boolean");
1037 case MONO_TYPE_CHAR:
1038 dwarf2_write_base_type (debug, idx, DW_ATE_unsigned_char, 2, "Char");
1041 dwarf2_write_base_type (debug, idx, DW_ATE_signed, 1, "SByte");
1044 dwarf2_write_base_type (debug, idx, DW_ATE_unsigned, 1, "Byte");
1047 dwarf2_write_base_type (debug, idx, DW_ATE_signed, 2, "Int16");
1050 dwarf2_write_base_type (debug, idx, DW_ATE_unsigned, 2, "UInt16");
1053 dwarf2_write_base_type (debug, idx, DW_ATE_signed, 4, "Int32");
1056 dwarf2_write_base_type (debug, idx, DW_ATE_unsigned, 4, "UInt32");
1059 dwarf2_write_base_type (debug, idx, DW_ATE_signed, 8, "Int64");
1062 dwarf2_write_base_type (debug, idx, DW_ATE_unsigned, 8, "UInt64");
1065 dwarf2_write_base_type (debug, idx, DW_ATE_float, 4, "Float");
1068 dwarf2_write_base_type (debug, idx, DW_ATE_float, 8, "Double");
1071 dwarf2_write_class (debug, klass, idx);
1077 write_class (gpointer key, gpointer value, gpointer user_data)
1079 write_class_dwarf2 (user_data, key, GPOINTER_TO_INT (value));
1083 write_method_dwarf2 (MonoDebugHandle *debug, MonoDebugMethodInfo *minfo)
1085 int is_external = 0, i;
1086 MonoType *ret_type = NULL;
1087 DebugMethodInfo *priv = minfo->user_data;
1093 if (minfo->method->signature->ret->type != MONO_TYPE_VOID)
1094 ret_type = minfo->method->signature->ret;
1096 // DW_TAG_subprogram
1098 dwarf2_write_byte (debug->f, ABBREV_SUBPROGRAM_RETVAL);
1100 dwarf2_write_byte (debug->f, ABBREV_SUBPROGRAM);
1101 dwarf2_write_string (debug->f, priv->name);
1102 dwarf2_write_byte (debug->f, is_external);
1103 dwarf2_write_address (debug->f, minfo->jit->code_start);
1104 dwarf2_write_address (debug->f, (char *)minfo->jit->code_start + minfo->jit->code_size);
1105 dwarf2_write_byte (debug->f, DW_CC_nocall);
1107 MonoClass *klass = mono_class_from_mono_type (ret_type);
1108 int type_index = mono_debug_get_type (debug, klass);
1109 dwarf2_write_type_ref (debug->f, type_index);
1112 if (minfo->method->signature->hasthis)
1113 dwarf2_write_parameter (debug, minfo, "this", minfo->jit->this_var,
1114 minfo->method->klass);
1116 names = g_new (char *, minfo->method->signature->param_count);
1117 mono_method_get_param_names (minfo->method, (const char **) names);
1119 for (i = 0; i < minfo->jit->num_params; i++) {
1120 MonoType *type = minfo->method->signature->params [i];
1121 MonoClass *klass = mono_class_from_mono_type (type);
1123 dwarf2_write_parameter (debug, minfo, names [i], &minfo->jit->params [i], klass);
1128 for (i = 0; i < minfo->jit->num_locals; i++) {
1129 MonoMethodHeader *header = ((MonoMethodNormal*) minfo->method)->header;
1130 MonoClass *klass = mono_class_from_mono_type (header->locals [i]);
1133 sprintf (name, "V_%d", i);
1134 dwarf2_write_variable (debug, minfo, name, &minfo->jit->locals [i], klass);
1137 dwarf2_write_byte (debug->f, 0);
1138 // DW_TAG_subprogram ends here
1142 write_method_func (gpointer key, gpointer value, gpointer user_data)
1144 write_method_dwarf2 (user_data, value);
1148 write_method_func_1 (gpointer key, gpointer value, gpointer user_data)
1150 AssemblyDebugInfo *info = (AssemblyDebugInfo *) value;
1152 g_hash_table_foreach (info->methods, write_method_func, user_data);
1156 mono_debug_write_dwarf2 (MonoDebugHandle *debug)
1158 if (!(debug->f = fopen (debug->filename, "w"))) {
1159 g_warning ("Can't create dwarf file `%s': %s", debug->filename, g_strerror (errno));
1163 // Produce assembler code which is free of comments and extra whitespaces.
1164 fprintf (debug->f, "#NOAPP\n");
1166 // DWARF 2 Abbreviation table.
1167 dwarf2_write_section_start (debug->f, "debug_abbrev");
1168 dwarf2_write_label (debug->f, "debug_abbrev");
1170 dwarf2_write_byte (debug->f, ABBREV_COMPILE_UNIT);
1171 dwarf2_write_byte (debug->f, DW_TAG_compile_unit);
1172 dwarf2_write_byte (debug->f, DW_CHILDREN_yes);
1173 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1174 dwarf2_write_pair (debug->f, DW_AT_language, DW_FORM_data2);
1175 dwarf2_write_pair (debug->f, DW_AT_producer, DW_FORM_string);
1176 dwarf2_write_pair (debug->f, DW_AT_stmt_list, DW_FORM_ref4);
1177 dwarf2_write_pair (debug->f, 0, 0);
1179 dwarf2_write_byte (debug->f, ABBREV_SUBPROGRAM);
1180 dwarf2_write_byte (debug->f, DW_TAG_subprogram);
1181 dwarf2_write_byte (debug->f, DW_CHILDREN_yes);
1182 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1183 dwarf2_write_pair (debug->f, DW_AT_external, DW_FORM_flag);
1184 dwarf2_write_pair (debug->f, DW_AT_low_pc, DW_FORM_addr);
1185 dwarf2_write_pair (debug->f, DW_AT_high_pc, DW_FORM_addr);
1186 dwarf2_write_pair (debug->f, DW_AT_calling_convention, DW_FORM_data1);
1187 dwarf2_write_pair (debug->f, 0, 0);
1189 dwarf2_write_byte (debug->f, ABBREV_SUBPROGRAM_RETVAL);
1190 dwarf2_write_byte (debug->f, DW_TAG_subprogram);
1191 dwarf2_write_byte (debug->f, DW_CHILDREN_yes);
1192 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1193 dwarf2_write_pair (debug->f, DW_AT_external, DW_FORM_flag);
1194 dwarf2_write_pair (debug->f, DW_AT_low_pc, DW_FORM_addr);
1195 dwarf2_write_pair (debug->f, DW_AT_high_pc, DW_FORM_addr);
1196 dwarf2_write_pair (debug->f, DW_AT_calling_convention, DW_FORM_data1);
1197 dwarf2_write_pair (debug->f, DW_AT_type, DW_FORM_ref4);
1198 dwarf2_write_pair (debug->f, 0, 0);
1200 dwarf2_write_byte (debug->f, ABBREV_BASE_TYPE);
1201 dwarf2_write_byte (debug->f, DW_TAG_base_type);
1202 dwarf2_write_byte (debug->f, DW_CHILDREN_no);
1203 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1204 dwarf2_write_pair (debug->f, DW_AT_encoding, DW_FORM_data1);
1205 dwarf2_write_pair (debug->f, DW_AT_byte_size, DW_FORM_data1);
1206 dwarf2_write_pair (debug->f, 0, 0);
1208 dwarf2_write_byte (debug->f, ABBREV_FORMAL_PARAMETER);
1209 dwarf2_write_byte (debug->f, DW_TAG_formal_parameter);
1210 dwarf2_write_byte (debug->f, DW_CHILDREN_no);
1211 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1212 dwarf2_write_pair (debug->f, DW_AT_type, DW_FORM_ref4);
1213 dwarf2_write_pair (debug->f, 0, 0);
1215 dwarf2_write_byte (debug->f, ABBREV_ARTIFICIAL_PARAMETER);
1216 dwarf2_write_byte (debug->f, DW_TAG_formal_parameter);
1217 dwarf2_write_byte (debug->f, DW_CHILDREN_no);
1218 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1219 dwarf2_write_pair (debug->f, DW_AT_type, DW_FORM_ref4);
1220 dwarf2_write_pair (debug->f, DW_AT_artificial, DW_FORM_data1);
1221 dwarf2_write_pair (debug->f, 0, 0);
1223 dwarf2_write_byte (debug->f, ABBREV_PARAMETER);
1224 dwarf2_write_byte (debug->f, DW_TAG_formal_parameter);
1225 dwarf2_write_byte (debug->f, DW_CHILDREN_no);
1226 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1227 dwarf2_write_pair (debug->f, DW_AT_type, DW_FORM_ref4);
1228 dwarf2_write_pair (debug->f, DW_AT_location, DW_FORM_block4);
1229 dwarf2_write_pair (debug->f, DW_AT_start_scope, DW_FORM_data4);
1230 dwarf2_write_pair (debug->f, 0, 0);
1232 dwarf2_write_byte (debug->f, ABBREV_LOCAL_VARIABLE);
1233 dwarf2_write_byte (debug->f, DW_TAG_variable);
1234 dwarf2_write_byte (debug->f, DW_CHILDREN_no);
1235 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1236 dwarf2_write_pair (debug->f, DW_AT_type, DW_FORM_ref4);
1237 dwarf2_write_pair (debug->f, DW_AT_location, DW_FORM_block4);
1238 dwarf2_write_pair (debug->f, DW_AT_start_scope, DW_FORM_addr);
1239 dwarf2_write_pair (debug->f, DW_AT_end_scope, DW_FORM_addr);
1240 dwarf2_write_pair (debug->f, 0, 0);
1242 dwarf2_write_byte (debug->f, ABBREV_STRUCT_TYPE);
1243 dwarf2_write_byte (debug->f, DW_TAG_structure_type);
1244 dwarf2_write_byte (debug->f, DW_CHILDREN_yes);
1245 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1246 dwarf2_write_pair (debug->f, DW_AT_byte_size, DW_FORM_data4);
1247 dwarf2_write_pair (debug->f, 0, 0);
1249 dwarf2_write_byte (debug->f, ABBREV_STRUCT_MEMBER);
1250 dwarf2_write_byte (debug->f, DW_TAG_member);
1251 dwarf2_write_byte (debug->f, DW_CHILDREN_no);
1252 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1253 dwarf2_write_pair (debug->f, DW_AT_type, DW_FORM_ref4);
1254 dwarf2_write_pair (debug->f, DW_AT_accessibility, DW_FORM_data1);
1255 dwarf2_write_pair (debug->f, DW_AT_data_member_location, DW_FORM_block4);
1256 dwarf2_write_pair (debug->f, DW_AT_byte_size, DW_FORM_data4);
1257 dwarf2_write_pair (debug->f, 0, 0);
1259 dwarf2_write_byte (debug->f, ABBREV_STRUCT_ACCESS);
1260 dwarf2_write_byte (debug->f, DW_TAG_access_declaration);
1261 dwarf2_write_byte (debug->f, DW_CHILDREN_no);
1262 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1263 dwarf2_write_pair (debug->f, DW_AT_accessibility, DW_FORM_data1);
1264 dwarf2_write_pair (debug->f, 0, 0);
1266 dwarf2_write_byte (debug->f, ABBREV_ENUM_TYPE);
1267 dwarf2_write_byte (debug->f, DW_TAG_enumeration_type);
1268 dwarf2_write_byte (debug->f, DW_CHILDREN_yes);
1269 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1270 dwarf2_write_pair (debug->f, DW_AT_byte_size, DW_FORM_data4);
1271 dwarf2_write_pair (debug->f, 0, 0);
1273 dwarf2_write_byte (debug->f, ABBREV_ENUM_VALUE);
1274 dwarf2_write_byte (debug->f, DW_TAG_enumerator);
1275 dwarf2_write_byte (debug->f, DW_CHILDREN_no);
1276 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1277 dwarf2_write_pair (debug->f, DW_AT_const_value, DW_FORM_data4);
1278 dwarf2_write_pair (debug->f, 0, 0);
1280 dwarf2_write_byte (debug->f, ABBREV_ENUM_VALUE_UNSIGNED);
1281 dwarf2_write_byte (debug->f, DW_TAG_enumerator);
1282 dwarf2_write_byte (debug->f, DW_CHILDREN_no);
1283 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1284 dwarf2_write_pair (debug->f, DW_AT_const_value, DW_FORM_udata);
1285 dwarf2_write_pair (debug->f, 0, 0);
1287 dwarf2_write_byte (debug->f, ABBREV_ENUM_VALUE_SIGNED);
1288 dwarf2_write_byte (debug->f, DW_TAG_enumerator);
1289 dwarf2_write_byte (debug->f, DW_CHILDREN_no);
1290 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1291 dwarf2_write_pair (debug->f, DW_AT_const_value, DW_FORM_sdata);
1292 dwarf2_write_pair (debug->f, 0, 0);
1294 dwarf2_write_byte (debug->f, ABBREV_CLASS_TYPE);
1295 dwarf2_write_byte (debug->f, DW_TAG_class_type);
1296 dwarf2_write_byte (debug->f, DW_CHILDREN_yes);
1297 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1298 dwarf2_write_pair (debug->f, DW_AT_byte_size, DW_FORM_data4);
1299 dwarf2_write_pair (debug->f, DW_AT_accessibility, DW_FORM_data1);
1300 dwarf2_write_pair (debug->f, 0, 0);
1302 dwarf2_write_byte (debug->f, ABBREV_CLASS_INHERITANCE);
1303 dwarf2_write_byte (debug->f, DW_TAG_inheritance);
1304 dwarf2_write_byte (debug->f, DW_CHILDREN_no);
1305 dwarf2_write_pair (debug->f, DW_AT_type, DW_FORM_ref4);
1306 dwarf2_write_pair (debug->f, DW_AT_accessibility, DW_FORM_data1);
1307 dwarf2_write_pair (debug->f, 0, 0);
1309 dwarf2_write_byte (debug->f, ABBREV_POINTER_TYPE);
1310 dwarf2_write_byte (debug->f, DW_TAG_pointer_type);
1311 dwarf2_write_byte (debug->f, DW_CHILDREN_no);
1312 dwarf2_write_pair (debug->f, DW_AT_type, DW_FORM_ref4);
1313 dwarf2_write_pair (debug->f, 0, 0);
1315 dwarf2_write_byte (debug->f, ABBREV_CLASS_METHOD);
1316 dwarf2_write_byte (debug->f, DW_TAG_subprogram);
1317 dwarf2_write_byte (debug->f, DW_CHILDREN_yes);
1318 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1319 dwarf2_write_pair (debug->f, DW_AT_accessibility, DW_FORM_data1);
1320 dwarf2_write_pair (debug->f, DW_AT_virtuality, DW_FORM_data1);
1321 dwarf2_write_pair (debug->f, DW_AT_calling_convention, DW_FORM_data1);
1322 dwarf2_write_pair (debug->f, 0, 0);
1324 dwarf2_write_byte (debug->f, ABBREV_CLASS_METHOD_RETVAL);
1325 dwarf2_write_byte (debug->f, DW_TAG_subprogram);
1326 dwarf2_write_byte (debug->f, DW_CHILDREN_yes);
1327 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1328 dwarf2_write_pair (debug->f, DW_AT_accessibility, DW_FORM_data1);
1329 dwarf2_write_pair (debug->f, DW_AT_virtuality, DW_FORM_data1);
1330 dwarf2_write_pair (debug->f, DW_AT_calling_convention, DW_FORM_data1);
1331 dwarf2_write_pair (debug->f, DW_AT_type, DW_FORM_ref4);
1332 dwarf2_write_pair (debug->f, 0, 0);
1334 dwarf2_write_byte (debug->f, ABBREV_SIMPLE_ARRAY);
1335 dwarf2_write_byte (debug->f, DW_TAG_array_type);
1336 dwarf2_write_byte (debug->f, DW_CHILDREN_no);
1337 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1338 dwarf2_write_pair (debug->f, DW_AT_type, DW_FORM_ref4);
1339 dwarf2_write_pair (debug->f, 0, 0);
1341 dwarf2_write_byte (debug->f, ABBREV_ARRAY);
1342 dwarf2_write_byte (debug->f, DW_TAG_array_type);
1343 dwarf2_write_byte (debug->f, DW_CHILDREN_yes);
1344 dwarf2_write_pair (debug->f, DW_AT_name, DW_FORM_string);
1345 dwarf2_write_pair (debug->f, DW_AT_type, DW_FORM_ref4);
1346 dwarf2_write_pair (debug->f, DW_AT_byte_size, DW_FORM_data4);
1347 dwarf2_write_pair (debug->f, 0, 0);
1349 dwarf2_write_byte (debug->f, ABBREV_SUBRANGE);
1350 dwarf2_write_byte (debug->f, DW_TAG_subrange_type);
1351 dwarf2_write_byte (debug->f, DW_CHILDREN_no);
1352 dwarf2_write_pair (debug->f, DW_AT_lower_bound, DW_FORM_data4);
1353 dwarf2_write_pair (debug->f, DW_AT_upper_bound, DW_FORM_data4);
1354 dwarf2_write_pair (debug->f, DW_AT_count, DW_FORM_data4);
1355 dwarf2_write_pair (debug->f, 0, 0);
1357 dwarf2_write_label (debug->f, "debug_abbrev_e");
1360 write_line_numbers (debug);
1362 // Compile unit header
1363 dwarf2_write_section_start (debug->f, "debug_info");
1364 dwarf2_write_label (debug->f, "debug_info_b");
1365 dwarf2_write_section_size (debug->f, "DI1", "debug_info_e");
1366 dwarf2_write_label (debug->f, "DI1");
1367 dwarf2_write_2byte (debug->f, 2);
1368 dwarf2_write_ref4 (debug->f, "debug_abbrev_b");
1369 dwarf2_write_byte (debug->f, sizeof (gpointer));
1371 // DW_TAG_compile_unit
1372 dwarf2_write_byte (debug->f, ABBREV_COMPILE_UNIT);
1373 dwarf2_write_string (debug->f, debug->name);
1374 dwarf2_write_2byte (debug->f, DW_LANG_C_sharp);
1375 dwarf2_write_string (debug->f, debug->producer_name);
1376 dwarf2_write_ref4 (debug->f, "debug_lines_b");
1379 g_hash_table_foreach (debug->images, write_method_func_1, debug);
1382 g_hash_table_foreach (debug->type_hash, write_class, debug);
1384 dwarf2_write_byte (debug->f, 0);
1385 // DW_TAG_compile_unit ends here
1387 dwarf2_write_label (debug->f, "debug_info_e");
1392 if (!(debug->flags & MONO_DEBUG_FLAGS_DONT_ASSEMBLE)) {
1395 /* yes, it's completely unsafe */
1396 buf = g_strdup_printf ("as %s -o %s", debug->filename, debug->objfile);