1 
2 /* Reflects declarations from the Dwarf 3 spec, not the The D Language Foundation
3  * dwarf implementation
4  *
5  * Source: $(LINK2 https://github.com/dlang/dmd/blob/master/src/dmd/backend/dwarf2.d, backend/_dwarf2.d)
6  */
7 
8 module dmd.backend.dwarf2;
9 
10 // Online documentation: https://dlang.org/phobos/dmd_backend_dwarf2.html
11 
12 
13 enum
14 {
15         DW_TAG_array_type               = 0x01,
16         DW_TAG_class_type               = 0x02,
17         DW_TAG_entry_point              = 0x03,
18         DW_TAG_enumeration_type         = 0x04,
19         DW_TAG_formal_parameter         = 0x05,
20         DW_TAG_imported_declaration     = 0x08,
21         DW_TAG_label                    = 0x0A,
22         DW_TAG_lexical_block            = 0x0B,
23         DW_TAG_member                   = 0x0D,
24         DW_TAG_pointer_type             = 0x0F,
25         DW_TAG_reference_type           = 0x10,
26         DW_TAG_compile_unit             = 0x11,
27         DW_TAG_string_type              = 0x12,
28         DW_TAG_structure_type           = 0x13,
29         DW_TAG_subroutine_type          = 0x15,
30         DW_TAG_typedef                  = 0x16,
31         DW_TAG_union_type               = 0x17,
32         DW_TAG_unspecified_parameters   = 0x18,
33         DW_TAG_variant                  = 0x19,
34         DW_TAG_common_block             = 0x1A,
35         DW_TAG_common_inclusion         = 0x1B,
36         DW_TAG_inheritance              = 0x1C,
37         DW_TAG_inlined_subroutine       = 0x1D,
38         DW_TAG_module                   = 0x1E,
39         DW_TAG_ptr_to_member_type       = 0x1F,
40         DW_TAG_set_type                 = 0x20,
41         DW_TAG_subrange_type            = 0x21,
42         DW_TAG_with_stmt                = 0x22,
43         DW_TAG_access_declaration       = 0x23,
44         DW_TAG_base_type                = 0x24,
45         DW_TAG_catch_block              = 0x25,
46         DW_TAG_const_type               = 0x26,
47         DW_TAG_constant                 = 0x27,
48         DW_TAG_enumerator               = 0x28,
49         DW_TAG_file_type                = 0x29,
50         DW_TAG_friend                   = 0x2A,
51         DW_TAG_namelist                 = 0x2B,
52         DW_TAG_namelist_item            = 0x2C,
53         DW_TAG_packed_type              = 0x2D,
54         DW_TAG_subprogram               = 0x2E,
55         DW_TAG_template_type_param      = 0x2F,
56         DW_TAG_template_value_param     = 0x30,
57         DW_TAG_thrown_type              = 0x31,
58         DW_TAG_try_block                = 0x32,
59         DW_TAG_variant_part             = 0x33,
60         DW_TAG_variable                 = 0x34,
61         DW_TAG_volatile_type            = 0x35,
62 
63         /* DWARF v3 */
64         DW_TAG_dwarf_procedure          = 0x36,
65         DW_TAG_restrict_type            = 0x37,
66         DW_TAG_interface_type           = 0x38,
67         DW_TAG_namespace                = 0x39,
68         DW_TAG_imported_module          = 0x3A,
69         DW_TAG_unspecified_type         = 0x3B,
70         DW_TAG_partial_unit             = 0x3C,
71         DW_TAG_imported_unit            = 0x3D,
72         DW_TAG_condition                = 0x3F,
73         DW_TAG_shared_type              = 0x40,
74 
75         /* DWARF v4 */
76         DW_TAG_type_unit                = 0x41,
77         DW_TAG_rvalue_reference_type    = 0x42,
78         DW_TAG_template_alias           = 0x43,
79 
80         DW_TAG_lo_user                  = 0x4080,
81         DW_TAG_hi_user                  = 0xFFFF,
82 }
83 
84 enum
85 {
86         DW_CHILDREN_no                  = 0x00,
87         DW_CHILDREN_yes                 = 0x01,
88 }
89 
90 enum
91 {
92         DW_AT_sibling                   = 0x01,
93         DW_AT_location                  = 0x02,
94         DW_AT_name                      = 0x03,
95         DW_AT_ordering                  = 0x09,
96         DW_AT_byte_size                 = 0x0B,
97         DW_AT_bit_offset                = 0x0C,
98         DW_AT_bit_size                  = 0x0D,
99         DW_AT_stmt_list                 = 0x10,
100         DW_AT_low_pc                    = 0x11,
101         DW_AT_high_pc                   = 0x12,
102         DW_AT_language                  = 0x13,
103         DW_AT_discr                     = 0x15,
104         DW_AT_discr_value               = 0x16,
105         DW_AT_visibility                = 0x17,
106         DW_AT_import                    = 0x18,
107         DW_AT_string_length             = 0x19,
108         DW_AT_common_reference          = 0x1A,
109         DW_AT_comp_dir                  = 0x1B,
110         DW_AT_const_value               = 0x1C,
111         DW_AT_containing_type           = 0x1D,
112         DW_AT_default_value             = 0x1E,
113         DW_AT_inline                    = 0x20,
114         DW_AT_is_optional               = 0x21,
115         DW_AT_lower_bound               = 0x22,
116         DW_AT_producer                  = 0x25,
117         DW_AT_prototyped                = 0x27,
118         DW_AT_return_addr               = 0x2A,
119         DW_AT_start_scope               = 0x2C,
120         DW_AT_stride_size               = 0x2E,
121         DW_AT_upper_bound               = 0x2F,
122         DW_AT_abstract_origin           = 0x31,
123         DW_AT_accessibility             = 0x32,
124         DW_AT_address_class             = 0x33,
125         DW_AT_artificial                = 0x34,
126         DW_AT_base_types                = 0x35,
127         DW_AT_calling_convention        = 0x36,
128         DW_AT_count                     = 0x37,
129         DW_AT_data_member_location      = 0x38,
130         DW_AT_decl_column               = 0x39,
131         DW_AT_decl_file                 = 0x3A,
132         DW_AT_decl_line                 = 0x3B,
133         DW_AT_declaration               = 0x3C,
134         DW_AT_discr_list                = 0x3D,
135         DW_AT_encoding                  = 0x3E,
136         DW_AT_external                  = 0x3F,
137         DW_AT_frame_base                = 0x40,
138         DW_AT_friend                    = 0x41,
139         DW_AT_identifier_case           = 0x42,
140         DW_AT_macro_info                = 0x43,
141         DW_AT_namelist_item             = 0x44,
142         DW_AT_priority                  = 0x45,
143         DW_AT_segment                   = 0x46,
144         DW_AT_specification             = 0x47,
145         DW_AT_static_link               = 0x48,
146         DW_AT_type                      = 0x49,
147         DW_AT_use_location              = 0x4A,
148         DW_AT_variable_parameter        = 0x4B,
149         DW_AT_virtuality                = 0x4C,
150         DW_AT_vtable_elem_location      = 0x4D,
151 
152         /* DWARF v3 */
153         DW_AT_allocated                 = 0x4E,
154         DW_AT_associated                = 0x4F,
155         DW_AT_data_location             = 0x50,
156         DW_AT_byte_stride               = 0x51,
157         DW_AT_entry_pc                  = 0x52,
158         DW_AT_use_UTF8                  = 0x53,
159         DW_AT_extension                 = 0x54,
160         DW_AT_ranges                    = 0x55,
161         DW_AT_trampoline                = 0x56,
162         DW_AT_call_column               = 0x57,
163         DW_AT_call_file                 = 0x58,
164         DW_AT_call_line                 = 0x59,
165         DW_AT_description               = 0x5A,
166         DW_AT_binary_scale              = 0x5B,
167         DW_AT_decimal_scale             = 0x5C,
168         DW_AT_small                     = 0x5D,
169         DW_AT_decimal_sign              = 0x5E,
170         DW_AT_digit_count               = 0x5F,
171         DW_AT_picture_string            = 0x60,
172         DW_AT_mutable                   = 0x61,
173         DW_AT_threads_scaled            = 0x62,
174         DW_AT_explicit                  = 0x63,
175         DW_AT_object_pointer            = 0x64,
176         DW_AT_endianity                 = 0x65,
177         DW_AT_elemental                 = 0x66,
178         DW_AT_pure                      = 0x67,
179         DW_AT_recursive                 = 0x68,
180 
181         /* DWARF v4 */
182         DW_AT_signature                 = 0x69,
183         DW_AT_main_subprogram           = 0x6a,
184         DW_AT_data_bit_offset           = 0x6b,
185         DW_AT_const_expr                = 0x6c,
186         DW_AT_enum_class                = 0x6d,
187         DW_AT_linkage_name              = 0x6e,
188 
189         DW_AT_lo_user                   = 0x2000,
190         DW_AT_MIPS_linkage_name         = 0x2007,
191         DW_AT_GNU_vector                = 0x2107,
192         DW_AT_hi_user                   = 0x3FFF,
193 }
194 
195 enum
196 {
197         DW_FORM_addr         = 0x01,
198         DW_FORM_block2       = 0x03,
199         DW_FORM_block4       = 0x04,
200         DW_FORM_data2        = 0x05,
201         DW_FORM_data4        = 0x06,
202         DW_FORM_data8        = 0x07,
203         DW_FORM_string       = 0x08,
204         DW_FORM_block        = 0x09,
205         DW_FORM_block1       = 0x0A,
206         DW_FORM_data1        = 0x0B,
207         DW_FORM_flag         = 0x0C,
208         DW_FORM_sdata        = 0x0D,
209         DW_FORM_strp         = 0x0E,
210         DW_FORM_udata        = 0x0F,
211         DW_FORM_ref_addr     = 0x10,
212         DW_FORM_ref1         = 0x11,
213         DW_FORM_ref2         = 0x12,
214         DW_FORM_ref4         = 0x13,
215         DW_FORM_ref8         = 0x14,
216         DW_FORM_ref_udata    = 0x15,
217         DW_FORM_indirect     = 0x16,
218 
219         /* DWARF v4 */
220         DW_FORM_sec_offset   = 0x17,
221         DW_FORM_exprloc      = 0x18,
222         DW_FORM_flag_present = 0x19,
223         DW_FORM_ref_sig8     = 0x20,
224 }
225 
226 enum
227 {
228         DW_OP_addr      = 0x03,
229         DW_OP_deref     = 0x06,
230         DW_OP_const1u   = 0x08,
231         DW_OP_const1s   = 0x09,
232         DW_OP_const2u   = 0x0a,
233         DW_OP_const2s   = 0x0b,
234         DW_OP_const4u   = 0x0c,
235         DW_OP_const4s   = 0x0d,
236         DW_OP_const8u   = 0x0e,
237         DW_OP_const8s   = 0x0f,
238         DW_OP_constu    = 0x10,
239         DW_OP_consts    = 0x11,
240         DW_OP_dup       = 0x12,
241         DW_OP_drop      = 0x13,
242         DW_OP_over      = 0x14,
243         DW_OP_pick      = 0x15,
244         DW_OP_swap      = 0x16,
245         DW_OP_rot       = 0x17,
246         DW_OP_xderef    = 0x18,
247         DW_OP_abs       = 0x19,
248         DW_OP_and       = 0x1a,
249         DW_OP_div       = 0x1b,
250         DW_OP_minus     = 0x1c,
251         DW_OP_mod       = 0x1d,
252         DW_OP_mul       = 0x1e,
253         DW_OP_neg       = 0x1f,
254         DW_OP_not       = 0x20,
255         DW_OP_or        = 0x21,
256         DW_OP_plus      = 0x22,
257         DW_OP_plus_uconst = 0x23,
258         DW_OP_shl       = 0x24,
259         DW_OP_shr       = 0x25,
260         DW_OP_shra      = 0x26,
261         DW_OP_xor       = 0x27,
262         DW_OP_skip      = 0x2f,
263         DW_OP_bra       = 0x28,
264         DW_OP_eq        = 0x29,
265         DW_OP_ge        = 0x2a,
266 
267         DW_OP_gt        = 0x2b,
268         DW_OP_le        = 0x2c,
269         DW_OP_lt        = 0x2d,
270         DW_OP_ne        = 0x2e,
271         DW_OP_lit0      = 0x30,
272         DW_OP_lit1      = 0x31,
273         DW_OP_lit31     = 0x4f,
274         DW_OP_reg0      = 0x50,
275         DW_OP_reg1      = 0x51,
276         DW_OP_reg31     = 0x6f,
277         DW_OP_breg0     = 0x70,
278         DW_OP_breg1     = 0x71,
279         DW_OP_breg31    = 0x8f,
280         DW_OP_regx      = 0x90,
281         DW_OP_fbreg     = 0x91,
282         DW_OP_bregx     = 0x92,
283         DW_OP_piece     = 0x93,
284         DW_OP_deref_size        = 0x94,
285         DW_OP_xderef_size       = 0x95,
286         DW_OP_nop               = 0x96,
287 
288         /* DWARF v3 */
289         DW_OP_push_object_address = 0x97,
290         DW_OP_call2             = 0x98,
291         DW_OP_call4             = 0x99,
292         DW_OP_call_ref          = 0x9a,
293         DW_OP_form_tls_address  = 0x9b,
294         DW_OP_call_frame_cfa    = 0x9c,
295         DW_OP_bit_piece         = 0x9d,
296 
297         /* DWARF v4 */
298         DW_OP_implicit_value    = 0x9e,
299         DW_OP_stack_value       = 0x9f,
300 
301         DW_OP_lo_user   = 0xe0,
302         DW_OP_hi_user   = 0xff,
303 
304         /* GNU extensions. */
305         DW_OP_GNU_push_tls_address = 0xe0,
306 }
307 
308 enum
309 {
310         DW_ATE_address          = 0x01,
311         DW_ATE_boolean          = 0x02,
312         DW_ATE_complex_float    = 0x03,
313         DW_ATE_float            = 0x04,
314         DW_ATE_signed           = 0x05,
315         DW_ATE_signed_char      = 0x06,
316         DW_ATE_unsigned         = 0x07,
317         DW_ATE_unsigned_char    = 0x08,
318 
319         /* DWARF v3 */
320         DW_ATE_imaginary_float  = 0x09,
321         DW_ATE_packed_decimal   = 0x0a,
322         DW_ATE_numeric_string   = 0x0b,
323         DW_ATE_editted          = 0x0c,
324         DW_ATE_signed_fixed     = 0x0d,
325         DW_ATE_unsigned_fixed   = 0x0e,
326         DW_ATE_decimal_float    = 0x0f,
327 
328         /* DWARF v4 */
329         DW_ATE_UTF              = 0x10,
330 
331         DW_ATE_lo_user          = 0x80,
332         DW_ATE_hi_user          = 0xff,
333 }
334 
335 enum
336 {
337         DW_DS_unsigned                  = 0x01,
338         DW_DS_leading_overpunch         = 0x02,
339         DW_DS_trailing_overpunch        = 0x03,
340         DW_DS_leading_separate          = 0x04,
341         DW_DS_trailing_separate         = 0x05,
342 }
343 
344 enum
345 {
346         DW_END_default  = 0x00,
347         DW_END_big      = 0x01,
348         DW_END_little   = 0x02,
349         DW_END_lo_user  = 0x40,
350         DW_END_hi_user  = 0xff,
351 }
352 
353 enum
354 {
355         DW_ACCESS_public        = 0x01,
356         DW_ACCESS_protected     = 0x02,
357         DW_ACCESS_private       = 0x03,
358 }
359 
360 enum
361 {
362         DW_VIS_local            = 0x01,
363         DW_VIS_exported         = 0x02,
364         DW_VIS_qualified        = 0x03,
365 }
366 
367 enum
368 {
369         DW_VIRTUALITY_none              = 0x00,
370         DW_VIRTUALITY_virtual           = 0x01,
371         DW_VIRTUALITY_pure_virtual      = 0x02,
372 }
373 
374 enum
375 {
376         DW_LANG_C89             = 0x0001,
377         DW_LANG_C               = 0x0002,
378         DW_LANG_Ada83           = 0x0003,
379         DW_LANG_C_plus_plus     = 0x0004,
380         DW_LANG_Cobol74         = 0x0005,
381         DW_LANG_Cobol85         = 0x0006,
382         DW_LANG_Fortran77       = 0x0007,
383         DW_LANG_Fortran90       = 0x0008,
384         DW_LANG_Pascal83        = 0x0009,
385         DW_LANG_Modula2         = 0x000a,
386         DW_LANG_Java            = 0x000b,
387         DW_LANG_C99             = 0x000c,
388         DW_LANG_Ada95           = 0x000d,
389         DW_LANG_Fortran95       = 0x000e,
390         DW_LANG_PLI             = 0x000f,
391         DW_LANG_ObjC            = 0x0010,
392         DW_LANG_ObjC_plus_plus  = 0x0011,
393         DW_LANG_UPC             = 0x0012,
394         DW_LANG_D               = 0x0013,
395         DW_LANG_lo_user         = 0x8000,
396         DW_LANG_hi_user         = 0xffff,
397 }
398 
399 enum
400 {
401         DW_ID_case_sensitive    = 0x00,
402         DW_ID_up_case           = 0x01,
403         DW_ID_down_case         = 0x02,
404         DW_ID_case_insensitive  = 0x03,
405 }
406 
407 enum
408 {
409         DW_CC_normal    = 0x01,
410         DW_CC_program   = 0x02,
411         DW_CC_nocall    = 0x03,
412         DW_CC_lo_user   = 0x40,
413         DW_CC_hi_user   = 0xff,
414 }
415 
416 enum
417 {
418         DW_INL_not_inlined              = 0x00,
419         DW_INL_inlined                  = 0x01,
420         DW_INL_declared_not_inlined     = 0x02,
421         DW_INL_declared_inlined         = 0x03,
422 }
423 
424 enum
425 {
426         DW_ORD_row_major        = 0x00,
427         DW_ORD_col_major        = 0x01,
428 }
429 
430 enum
431 {
432         DW_DSC_label    = 0x00,
433         DW_DSC_range    = 0x01,
434 }
435 
436 enum
437 {
438         DW_LNS_copy             = 0x01,
439         DW_LNS_advance_pc       = 0x02,
440         DW_LNS_advance_line     = 0x03,
441         DW_LNS_set_file         = 0x04,
442         DW_LNS_set_column       = 0x05,
443         DW_LNS_negate_stmt      = 0x06,
444         DW_LNS_set_basic_block  = 0x07,
445         DW_LNS_const_add_pc     = 0x08,
446         DW_LNS_fixed_advance_pc = 0x09,
447         DW_LNS_set_prologue_end = 0x0a,
448         DW_LNS_set_epilogue_begin = 0x0b,
449         DW_LNS_set_isa          = 0x0c,
450 }
451 
452 enum
453 {
454         DW_LNE_end_sequence     = 0x01,
455         DW_LNE_set_address      = 0x02,
456         DW_LNE_define_file      = 0x03,
457         DW_LNE_lo_user          = 0x80,
458         DW_LNE_hi_user          = 0xff,
459 }
460 
461 enum
462 {
463         DW_MACINFO_define       = 0x01,
464         DW_MACINFO_undef        = 0x02,
465         DW_MACINFO_start_file   = 0x03,
466         DW_MACINFO_end_file     = 0x04,
467         DW_MACINFO_vendor_ext   = 0xff,
468 }
469 
470 enum
471 {
472         DW_CFA_advance_loc              = 0x40,
473         DW_CFA_offset                   = 0x80,
474         DW_CFA_restore                  = 0xc0,
475         DW_CFA_nop                      = 0x00,
476         DW_CFA_set_loc                  = 0x01,
477         DW_CFA_advance_loc1             = 0x02,
478         DW_CFA_advance_loc2             = 0x03,
479         DW_CFA_advance_loc4             = 0x04,
480         DW_CFA_offset_extended          = 0x05,
481         DW_CFA_restore_extended         = 0x06,
482         DW_CFA_undefined                = 0x07,
483         DW_CFA_same_value               = 0x08,
484         DW_CFA_register                 = 0x09,
485         DW_CFA_remember_state           = 0x0a,
486         DW_CFA_restore_state            = 0x0b,
487         DW_CFA_def_cfa                  = 0x0c,
488         DW_CFA_def_cfa_register         = 0x0d,
489         DW_CFA_def_cfa_offset           = 0x0e,
490 
491         /* DWARF v3 */
492         DW_CFA_def_cfa_expression       = 0x0f,
493         DW_CFA_expression               = 0x10,
494         DW_CFA_offset_extended_sf       = 0x11,
495         DW_CFA_def_cfa_sf               = 0x12,
496         DW_CFA_def_cfa_offset_sf        = 0x13,
497         DW_CFA_val_offset               = 0x14,
498         DW_CFA_val_offset_sf            = 0x15,
499         DW_CFA_val_expression           = 0x16,
500 
501         /* GNU extensions. */
502         DW_CFA_GNU_window_save          = 0x2d,
503         DW_CFA_GNU_args_size            = 0x2e,
504         DW_CFA_GNU_negative_offset_extended = 0x2f,
505 
506         DW_CFA_lo_user                  = 0x1c,
507         DW_CFA_hi_user                  = 0x3f,
508 }
509 
510 enum
511 {
512         DW_EH_PE_FORMAT_MASK    = 0x0F,
513         DW_EH_PE_APPL_MASK      = 0x70,
514         DW_EH_PE_indirect       = 0x80,
515 
516         DW_EH_PE_omit           = 0xFF,
517         DW_EH_PE_ptr            = 0x00,
518         DW_EH_PE_uleb128        = 0x01,
519         DW_EH_PE_udata2         = 0x02,
520         DW_EH_PE_udata4         = 0x03,
521         DW_EH_PE_udata8         = 0x04,
522         DW_EH_PE_sleb128        = 0x09,
523         DW_EH_PE_sdata2         = 0x0A,
524         DW_EH_PE_sdata4         = 0x0B,
525         DW_EH_PE_sdata8         = 0x0C,
526 
527         DW_EH_PE_absptr         = 0x00,
528         DW_EH_PE_pcrel          = 0x10,
529         DW_EH_PE_textrel        = 0x20,
530         DW_EH_PE_datarel        = 0x30,
531         DW_EH_PE_funcrel        = 0x40,
532         DW_EH_PE_aligned        = 0x50,
533 }
534