1/*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Copyright 2013, Rene Gollent, rene@gollent.com.
4 * Distributed under the terms of the MIT License.
5 */
6#ifndef DWARF_H
7#define DWARF_H
8
9// tag
10enum {
11	DW_TAG_array_type				= 0x01,
12	DW_TAG_class_type				= 0x02,
13	DW_TAG_entry_point				= 0x03,
14	DW_TAG_enumeration_type			= 0x04,
15	DW_TAG_formal_parameter			= 0x05,
16	DW_TAG_imported_declaration		= 0x08,
17	DW_TAG_label					= 0x0a,
18	DW_TAG_lexical_block			= 0x0b,
19	DW_TAG_member					= 0x0d,
20	DW_TAG_pointer_type				= 0x0f,
21	DW_TAG_reference_type			= 0x10,
22	DW_TAG_compile_unit				= 0x11,
23	DW_TAG_string_type				= 0x12,
24	DW_TAG_structure_type			= 0x13,
25	DW_TAG_subroutine_type			= 0x15,
26	DW_TAG_typedef					= 0x16,
27	DW_TAG_union_type				= 0x17,
28	DW_TAG_unspecified_parameters	= 0x18,
29	DW_TAG_variant					= 0x19,
30	DW_TAG_common_block				= 0x1a,
31	DW_TAG_common_inclusion			= 0x1b,
32	DW_TAG_inheritance				= 0x1c,
33	DW_TAG_inlined_subroutine		= 0x1d,
34	DW_TAG_module					= 0x1e,
35	DW_TAG_ptr_to_member_type		= 0x1f,
36	DW_TAG_set_type					= 0x20,
37	DW_TAG_subrange_type			= 0x21,
38	DW_TAG_with_stmt				= 0x22,
39	DW_TAG_access_declaration		= 0x23,
40	DW_TAG_base_type				= 0x24,
41	DW_TAG_catch_block				= 0x25,
42	DW_TAG_const_type				= 0x26,
43	DW_TAG_constant					= 0x27,
44	DW_TAG_enumerator				= 0x28,
45	DW_TAG_file_type				= 0x29,
46	DW_TAG_friend					= 0x2a,
47	DW_TAG_namelist					= 0x2b,
48	DW_TAG_namelist_item			= 0x2c,
49	DW_TAG_packed_type				= 0x2d,
50	DW_TAG_subprogram				= 0x2e,
51	DW_TAG_template_type_parameter	= 0x2f,
52	DW_TAG_template_value_parameter	= 0x30,
53	DW_TAG_thrown_type				= 0x31,
54	DW_TAG_try_block				= 0x32,
55	DW_TAG_variant_part				= 0x33,
56	DW_TAG_variable					= 0x34,
57	DW_TAG_volatile_type			= 0x35,
58	DW_TAG_dwarf_procedure			= 0x36,
59	DW_TAG_restrict_type			= 0x37,
60	DW_TAG_interface_type			= 0x38,
61	DW_TAG_namespace				= 0x39,
62	DW_TAG_imported_module			= 0x3a,
63	DW_TAG_unspecified_type			= 0x3b,
64	DW_TAG_partial_unit				= 0x3c,
65	DW_TAG_imported_unit			= 0x3d,
66	DW_TAG_condition				= 0x3f,
67	DW_TAG_shared_type				= 0x40,
68	DW_TAG_type_unit				= 0x41,
69	DW_TAG_rvalue_reference_type	= 0x42,
70	DW_TAG_template_alias			= 0x43,
71	DW_TAG_coarray_type				= 0x44,
72	DW_TAG_generic_subrange			= 0x45,
73	DW_TAG_dynamic_type				= 0x46,
74	DW_TAG_atomic_type				= 0x47,
75	DW_TAG_call_site				= 0x48,
76	DW_TAG_call_site_parameter		= 0x49,
77	DW_TAG_skeleton_unit			= 0x4a,
78	DW_TAG_immutable_type			= 0x4b,
79	DW_TAG_lo_user					= 0x4080,
80	DW_TAG_GNU_template_template_param
81									= 0x4106,
82	DW_TAG_GNU_template_parameter_pack
83									= 0x4107,
84	DW_TAG_GNU_formal_parameter_pack
85									= 0x4108,
86	DW_TAG_GNU_call_site			= 0x4109,
87	DW_TAG_GNU_call_site_parameter	= 0x410a,
88	DW_TAG_hi_user					= 0xffff
89};
90
91// has children flag value
92enum {
93	DW_CHILDREN_no	= 0x00,
94	DW_CHILDREN_yes	= 0x01
95};
96
97// attribute name
98enum {
99	DW_AT_sibling				= 0x01,		// reference
100	DW_AT_location				= 0x02,		// block, loclistptr
101	DW_AT_name					= 0x03,		// string
102	DW_AT_ordering				= 0x09,		// constant
103	DW_AT_byte_size				= 0x0b,		// block, constant, reference
104	DW_AT_bit_offset			= 0x0c,		// block, constant, reference
105	DW_AT_bit_size				= 0x0d,		// block, constant, reference
106	DW_AT_stmt_list				= 0x10,		// lineptr
107	DW_AT_low_pc				= 0x11,		// address
108	DW_AT_high_pc				= 0x12,		// address
109	DW_AT_language				= 0x13,		// constant
110	DW_AT_discr					= 0x15,		// reference
111	DW_AT_discr_value			= 0x16,		// constant
112	DW_AT_visibility			= 0x17,		// constant
113	DW_AT_import				= 0x18,		// reference
114	DW_AT_string_length			= 0x19,		// block, loclistptr
115	DW_AT_common_reference		= 0x1a,		// reference
116	DW_AT_comp_dir				= 0x1b,		// string
117	DW_AT_const_value			= 0x1c,		// block, constant, string
118	DW_AT_containing_type		= 0x1d,		// reference
119	DW_AT_default_value			= 0x1e,		// reference
120	DW_AT_inline				= 0x20,		// constant
121	DW_AT_is_optional			= 0x21,		// flag
122	DW_AT_lower_bound			= 0x22,		// block, constant, reference
123	DW_AT_producer				= 0x25,		// string
124	DW_AT_prototyped			= 0x27,		// flag
125	DW_AT_return_addr			= 0x2a,		// block, loclistptr
126	DW_AT_start_scope			= 0x2c,		// constant
127	DW_AT_bit_stride			= 0x2e,		// constant
128	DW_AT_upper_bound			= 0x2f,		// block, constant, reference
129	DW_AT_abstract_origin		= 0x31,		// reference
130	DW_AT_accessibility			= 0x32,		// constant
131	DW_AT_address_class			= 0x33,		// constant
132	DW_AT_artificial			= 0x34,		// flag
133	DW_AT_base_types			= 0x35,		// reference
134	DW_AT_calling_convention	= 0x36,		// constant
135	DW_AT_count					= 0x37,		// block, constant, reference
136	DW_AT_data_member_location	= 0x38,		// block, constant, loclistptr
137	DW_AT_decl_column			= 0x39,		// constant
138	DW_AT_decl_file				= 0x3a,		// constant
139	DW_AT_decl_line				= 0x3b,		// constant
140	DW_AT_declaration			= 0x3c,		// flag
141	DW_AT_discr_list			= 0x3d,		// block
142	DW_AT_encoding				= 0x3e,		// constant
143	DW_AT_external				= 0x3f,		// flag
144	DW_AT_frame_base			= 0x40,		// block, loclistptr
145	DW_AT_friend				= 0x41,		// reference
146	DW_AT_identifier_case		= 0x42,		// constant
147	DW_AT_macro_info			= 0x43,		// macptr
148	DW_AT_namelist_item			= 0x44,		// block
149	DW_AT_priority				= 0x45,		// reference
150	DW_AT_segment				= 0x46,		// block, loclistptr
151	DW_AT_specification			= 0x47,		// reference
152	DW_AT_static_link			= 0x48,		// block, loclistptr
153	DW_AT_type					= 0x49,		// reference
154	DW_AT_use_location			= 0x4a,		// block, loclistptr
155	DW_AT_variable_parameter	= 0x4b,		// flag
156	DW_AT_virtuality			= 0x4c,		// constant
157	DW_AT_vtable_elem_location	= 0x4d,		// block, loclistptr
158	DW_AT_allocated				= 0x4e,		// block, constant, reference
159	DW_AT_associated			= 0x4f,		// block, constant, reference
160	DW_AT_data_location			= 0x50,		// block
161	DW_AT_byte_stride			= 0x51,		// block, constant, reference
162	DW_AT_entry_pc				= 0x52,		// address
163	DW_AT_use_UTF8				= 0x53,		// flag
164	DW_AT_extension				= 0x54,		// reference
165	DW_AT_ranges				= 0x55,		// rangelistptr
166	DW_AT_trampoline			= 0x56,		// address, flag, reference, string
167	DW_AT_call_column			= 0x57,		// constant
168	DW_AT_call_file				= 0x58,		// constant
169	DW_AT_call_line				= 0x59,		// constant
170	DW_AT_description			= 0x5a,		// string
171	DW_AT_binary_scale			= 0x5b,		// constant
172	DW_AT_decimal_scale			= 0x5c,		// constant
173	DW_AT_small					= 0x5d,		// reference
174	DW_AT_decimal_sign			= 0x5e,		// constant
175	DW_AT_digit_count			= 0x5f,		// constant
176	DW_AT_picture_string		= 0x60,		// string
177	DW_AT_mutable				= 0x61,		// flag
178	DW_AT_threads_scaled		= 0x62,		// flag
179	DW_AT_explicit				= 0x63,		// flag
180	DW_AT_object_pointer		= 0x64,		// reference
181	DW_AT_endianity				= 0x65,		// constant
182	DW_AT_elemental				= 0x66,		// flag
183	DW_AT_pure					= 0x67,		// flag
184	DW_AT_recursive				= 0x68,		// flag
185	DW_AT_signature				= 0x69,		// reference
186	DW_AT_main_subprogram		= 0x6a,		// flag
187	DW_AT_data_bit_offset		= 0x6b,		// constant
188	DW_AT_const_expr			= 0x6c,		// flag
189	DW_AT_enum_class			= 0x6d,		// flag
190	DW_AT_linkage_name			= 0x6e,		// string
191	DW_AT_string_length_bit_size
192								= 0x6f,		// constant
193	DW_AT_string_length_byte_size
194								= 0x70,		// constant
195	DW_AT_rank					= 0x71,		// constant, exprloc
196	DW_AT_str_offsets_base		= 0x72,		// stroffsetsptr
197	DW_AT_addr_base				= 0x73,		// addrptr
198	DW_AT_rnglists_base			= 0x74,		// rnglistsptr
199	DW_AT_dwo_name				= 0x76,		// string
200	DW_AT_reference				= 0x77,		// flag
201	DW_AT_rvalue_reference		= 0x78,		// flag
202	DW_AT_macros				= 0x79,		// macptr
203	DW_AT_call_all_calls		= 0x7a,		// flag
204	DW_AT_call_all_source_calls	= 0x7b,		// flag
205	DW_AT_call_all_tail_calls	= 0x7c,		// flag
206	DW_AT_call_return_pc		= 0x7d,		// address
207	DW_AT_call_value			= 0x7e,		// exprloc
208	DW_AT_call_origin			= 0x7f,		// exprloc
209	DW_AT_call_parameter		= 0x80,		// reference
210	DW_AT_call_pc				= 0x81,		// address
211	DW_AT_call_tail_call		= 0x82,		// flag
212	DW_AT_call_target			= 0x83,		// exprloc
213	DW_AT_call_target_clobbered	= 0x84,		// exprloc
214	DW_AT_call_data_location	= 0x85,		// exprloc
215	DW_AT_call_data_value		= 0x86,		// exprloc
216	DW_AT_noreturn				= 0x87,		// flag
217	DW_AT_alignment				= 0x88,		// constant
218	DW_AT_export_symbols		= 0x89,		// flag
219	DW_AT_deleted				= 0x8a,		// flag
220	DW_AT_defaulted				= 0x8b,		// constant
221	DW_AT_loclists_base			= 0x8c,		// loclistsptr
222	DW_AT_lo_user				= 0x2000,
223	DW_AT_call_site_value		= 0x2111,	// exprloc
224	DW_AT_call_site_data_value
225								= 0x2112,	// exprloc
226	DW_AT_call_site_target
227								= 0x2113,	// exprloc
228	DW_AT_call_site_target_clobbered
229								= 0x2114,	// exprloc
230	DW_AT_tail_call				= 0x2115,	// flag
231	DW_AT_all_tail_call_sites
232								= 0x2116,	// flag
233	DW_AT_all_call_sites		= 0x2117,	// flag
234	DW_AT_all_source_call_sites
235								= 0x2118,	// flag
236	DW_AT_hi_user				= 0x3fff
237};
238
239// attribute form
240enum {
241	DW_FORM_addr		= 0x01,	// address
242	DW_FORM_block2		= 0x03,	// block
243	DW_FORM_block4		= 0x04,	// block
244	DW_FORM_data2		= 0x05,	// constant
245	DW_FORM_data4		= 0x06,	// constant, lineptr, loclistptr, macptr,
246								// rangelistptr
247	DW_FORM_data8		= 0x07,	// constant, lineptr, loclistptr, macptr,
248								// rangelistptr
249	DW_FORM_string		= 0x08,	// string
250	DW_FORM_block		= 0x09,	// block
251	DW_FORM_block1		= 0x0a,	// block
252	DW_FORM_data1		= 0x0b,	// constant
253	DW_FORM_flag		= 0x0c,	// flag
254	DW_FORM_sdata		= 0x0d,	// constant
255	DW_FORM_strp		= 0x0e,	// string
256	DW_FORM_udata		= 0x0f,	// constant
257	DW_FORM_ref_addr	= 0x10,	// reference
258	DW_FORM_ref1		= 0x11,	// reference
259	DW_FORM_ref2		= 0x12,	// reference
260	DW_FORM_ref4		= 0x13,	// reference
261	DW_FORM_ref8		= 0x14,	// reference
262	DW_FORM_ref_udata	= 0x15,	// reference
263	DW_FORM_indirect	= 0x16,	// form in .debug_info
264	DW_FORM_sec_offset	= 0x17, // lineptr, loclistptr, macptr, rangelistptr
265	DW_FORM_exprloc		= 0x18,	// dwarf expression
266	DW_FORM_flag_present
267						= 0x19,	// flag
268	DW_FORM_strx		= 0x1a, // string
269	DW_FORM_addrx		= 0x1b, // address
270	DW_FORM_ref_sup4	= 0x1c, // reference
271	DW_FORM_strp_sup	= 0x1d, // string
272	DW_FORM_data16		= 0x1e, // constant
273	DW_FORM_line_strp	= 0x1f, // string
274	DW_FORM_ref_sig8	= 0x20,	// reference
275	DW_FORM_implicit_const
276						= 0x21, // constant
277	DW_FORM_loclistx	= 0x22, // loclist
278	DW_FORM_rnglistx	= 0x23, // rnglist
279	DW_FORM_ref_sup8	= 0x24, // reference
280	DW_FORM_strx1		= 0x25, // string
281	DW_FORM_strx2		= 0x26, // string
282	DW_FORM_strx3		= 0x27, // string
283	DW_FORM_strx4		= 0x28, // string
284	DW_FORM_addrx1		= 0x29, // address
285	DW_FORM_addrx2		= 0x2a, // address
286	DW_FORM_addrx3		= 0x2b, // address
287	DW_FORM_addrx4		= 0x2c, // address
288
289};
290
291// expression operation
292enum {
293	DW_OP_addr					= 0x03,
294	DW_OP_deref					= 0x06,
295	DW_OP_const1u				= 0x08,
296	DW_OP_const1s				= 0x09,
297	DW_OP_const2u				= 0x0a,
298	DW_OP_const2s				= 0x0b,
299	DW_OP_const4u				= 0x0c,
300	DW_OP_const4s				= 0x0d,
301	DW_OP_const8u				= 0x0e,
302	DW_OP_const8s				= 0x0f,
303	DW_OP_constu				= 0x10,
304	DW_OP_consts				= 0x11,
305	DW_OP_dup					= 0x12,
306	DW_OP_drop					= 0x13,
307	DW_OP_over					= 0x14,
308	DW_OP_pick					= 0x15,
309	DW_OP_swap					= 0x16,
310	DW_OP_rot					= 0x17,
311	DW_OP_xderef				= 0x18,
312	DW_OP_abs					= 0x19,
313	DW_OP_and					= 0x1a,
314	DW_OP_div					= 0x1b,
315	DW_OP_minus					= 0x1c,
316	DW_OP_mod					= 0x1d,
317	DW_OP_mul					= 0x1e,
318	DW_OP_neg					= 0x1f,
319	DW_OP_not					= 0x20,
320	DW_OP_or					= 0x21,
321	DW_OP_plus					= 0x22,
322	DW_OP_plus_uconst			= 0x23,
323	DW_OP_shl					= 0x24,
324	DW_OP_shr					= 0x25,
325	DW_OP_shra					= 0x26,
326	DW_OP_xor					= 0x27,
327	DW_OP_skip					= 0x2f,
328	DW_OP_bra					= 0x28,
329	DW_OP_eq					= 0x29,
330	DW_OP_ge					= 0x2a,
331	DW_OP_gt					= 0x2b,
332	DW_OP_le					= 0x2c,
333	DW_OP_lt					= 0x2d,
334	DW_OP_ne					= 0x2e,
335	DW_OP_lit0					= 0x30,
336	DW_OP_lit1					= 0x31,
337	DW_OP_lit31					= 0x4f,
338	DW_OP_reg0					= 0x50,
339	DW_OP_reg1					= 0x51,
340	DW_OP_reg31					= 0x6f,
341	DW_OP_breg0					= 0x70,
342	DW_OP_breg1					= 0x71,
343	DW_OP_breg31				= 0x8f,
344	DW_OP_regx					= 0x90,
345	DW_OP_fbreg					= 0x91,
346	DW_OP_bregx					= 0x92,
347	DW_OP_piece					= 0x93,
348	DW_OP_deref_size			= 0x94,
349	DW_OP_xderef_size			= 0x95,
350	DW_OP_nop					= 0x96,
351	DW_OP_push_object_address	= 0x97,
352	DW_OP_call2					= 0x98,
353	DW_OP_call4					= 0x99,
354	DW_OP_call_ref				= 0x9a,
355	DW_OP_form_tls_address		= 0x9b,
356	DW_OP_call_frame_cfa		= 0x9c,
357	DW_OP_bit_piece				= 0x9d,
358	DW_OP_implicit_value		= 0x9e,
359	DW_OP_stack_value			= 0x9f,
360	DW_OP_implicit_pointer		= 0xa0,
361	DW_OP_addrx					= 0xa1,
362	DW_OP_constx				= 0xa2,
363	DW_OP_entry_value			= 0xa3,
364	DW_OP_const_type			= 0xa4,
365	DW_OP_regval_type			= 0xa5,
366	DW_OP_deref_type			= 0xa6,
367	DW_OP_xderef_type			= 0xa7,
368	DW_OP_convert				= 0xa8,
369	DW_OP_reinterpret			= 0xa9,
370	DW_OP_lo_user				= 0xe0,
371	DW_OP_hi_user				= 0xff
372};
373
374// base type
375enum {
376	DW_ATE_address			= 0x01,
377	DW_ATE_boolean			= 0x02,
378	DW_ATE_complex_float	= 0x03,
379	DW_ATE_float			= 0x04,
380	DW_ATE_signed			= 0x05,
381	DW_ATE_signed_char		= 0x06,
382	DW_ATE_unsigned			= 0x07,
383	DW_ATE_unsigned_char	= 0x08,
384	DW_ATE_imaginary_float	= 0x09,
385	DW_ATE_packed_decimal	= 0x0a,
386	DW_ATE_numeric_string	= 0x0b,
387	DW_ATE_edited			= 0x0c,
388	DW_ATE_signed_fixed		= 0x0d,
389	DW_ATE_unsigned_fixed	= 0x0e,
390	DW_ATE_decimal_float	= 0x0f,
391	DW_ATE_UTF				= 0x10,
392	DW_ATE_UCS				= 0x11,
393	DW_ATE_ASCII			= 0x12,
394	DW_ATE_lo_user			= 0x80,
395	DW_ATE_hi_user			= 0xff
396};
397
398// decimal sign
399enum {
400	DW_DS_unsigned				= 0x01,
401	DW_DS_leading_overpunch		= 0x02,
402	DW_DS_trailing_overpunch	= 0x03,
403	DW_DS_leading_separate		= 0x04,
404	DW_DS_trailing_separate		= 0x05
405};
406
407// endianess
408enum {
409	DW_END_default		= 0x00,
410	DW_END_big			= 0x01,
411	DW_END_little		= 0x02,
412	DW_END_lo_user		= 0x40,
413	DW_END_hi_user		= 0xff
414};
415
416// accessibility
417enum {
418	DW_ACCESS_public	= 0x01,
419	DW_ACCESS_protected	= 0x02,
420	DW_ACCESS_private	= 0x03
421};
422
423// visibility
424enum {
425	DW_VIS_local		= 0x01,
426	DW_VIS_exported		= 0x02,
427	DW_VIS_qualified	= 0x03
428};
429
430// virtuality
431enum {
432	DW_VIRTUALITY_none			= 0x00,
433	DW_VIRTUALITY_virtual		= 0x01,
434	DW_VIRTUALITY_pure_virtual	= 0x02
435};
436
437// source language
438enum {
439	DW_LANG_C89				= 0x0001,
440	DW_LANG_C				= 0x0002,
441	DW_LANG_Ada83			= 0x0003,
442	DW_LANG_C_plus_plus		= 0x0004,
443	DW_LANG_Cobol74			= 0x0005,
444	DW_LANG_Cobol85			= 0x0006,
445	DW_LANG_Fortran77		= 0x0007,
446	DW_LANG_Fortran90		= 0x0008,
447	DW_LANG_Pascal83		= 0x0009,
448	DW_LANG_Modula2			= 0x000a,
449	DW_LANG_Java			= 0x000b,
450	DW_LANG_C99				= 0x000c,
451	DW_LANG_Ada95			= 0x000d,
452	DW_LANG_Fortran95		= 0x000e,
453	DW_LANG_PLI				= 0x000f,
454	DW_LANG_ObjC			= 0x0010,
455	DW_LANG_ObjC_plus_plus	= 0x0011,
456	DW_LANG_UPC				= 0x0012,
457	DW_LANG_D				= 0x0013,
458	DW_LANG_Python			= 0x0014,
459	DW_LANG_OpenCL			= 0x0015,
460	DW_LANG_Go				= 0x0016,
461	DW_LANG_Modula3			= 0x0017,
462	DW_LANG_Haskell			= 0x0018,
463	DW_LANG_C_plus_plus_03	= 0x0019,
464	DW_LANG_C_plus_plus_11	= 0x001a,
465	DW_LANG_OCaml			= 0x001b,
466	DW_LANG_Rust			= 0x001c,
467	DW_LANG_C11				= 0x001d,
468	DW_LANG_Swift			= 0x001e,
469	DW_LANG_Julia			= 0x001f,
470	DW_LANG_Dylan			= 0x0020,
471	DW_LANG_C_plus_plus_14	= 0x0021,
472	DW_LANG_Fortran03		= 0x0022,
473	DW_LANG_Fortran08		= 0x0023,
474	DW_LANG_RenderScript	= 0x0024,
475	DW_LANG_BLISS			= 0x0025,
476	DW_LANG_lo_user			= 0x8000,
477	DW_LANG_hi_user			= 0xffff
478};
479
480// identifier case
481enum {
482	DW_ID_case_sensitive	= 0x00,
483	DW_ID_up_case			= 0x01,
484	DW_ID_down_case			= 0x02,
485	DW_ID_case_insensitive	= 0x03
486};
487
488// calling convention
489enum {
490	DW_CC_normal			= 0x01,
491	DW_CC_program			= 0x02,
492	DW_CC_nocall			= 0x03,
493	DW_CC_pass_by_reference	= 0x04,
494	DW_CC_pass_by_value		= 0x05,
495	DW_CC_lo_user			= 0x40,
496	DW_CC_hi_user			= 0xff
497};
498
499// inlining
500enum {
501	DW_INL_not_inlined			= 0x00,
502	DW_INL_inlined				= 0x01,
503	DW_INL_declared_not_inlined	= 0x02,
504	DW_INL_declared_inlined		= 0x03
505};
506
507// array ordering
508enum {
509	DW_ORD_row_major			= 0x00,
510	DW_ORD_col_major			= 0x01
511};
512
513// discriminant descriptor
514enum {
515	DW_DSC_label			= 0x00,
516	DW_DSC_range			= 0x01
517};
518
519// line number standard opcode
520enum {
521	DW_LNS_copy					= 0x01,
522	DW_LNS_advance_pc			= 0x02,
523	DW_LNS_advance_line			= 0x03,
524	DW_LNS_set_file				= 0x04,
525	DW_LNS_set_column			= 0x05,
526	DW_LNS_negate_stmt			= 0x06,
527	DW_LNS_set_basic_block		= 0x07,
528	DW_LNS_const_add_pc			= 0x08,
529	DW_LNS_fixed_advance_pc		= 0x09,
530	DW_LNS_set_prologue_end		= 0x0a,
531	DW_LNS_set_epilogue_begin	= 0x0b,
532	DW_LNS_set_isa				= 0x0c
533};
534
535// line number extended opcode
536enum {
537	DW_LNE_end_sequence			= 0x01,
538	DW_LNE_set_address			= 0x02,
539	DW_LNE_define_file			= 0x03,
540	DW_LNE_set_discriminator 	= 0x04,
541	DW_LNE_lo_user				= 0x80,
542	DW_LNE_hi_user				= 0xff
543};
544
545// line number header entry format
546enum {
547	DW_LNCT_path				= 0x0001,
548	DW_LNCT_directory_index		= 0x0002,
549	DW_LNCT_timestamp			= 0x0003,
550	DW_LNCT_size				= 0x0004,
551	DW_LNCT_MD5					= 0x0005,
552	DW_LNCT_lo_user				= 0x2000,
553	DW_LNCT_hi_user				= 0x3fff
554};
555
556// macro information type
557enum {
558	DW_MACINFO_define		= 0x01,
559	DW_MACINFO_undef		= 0x02,
560	DW_MACINFO_start_file	= 0x03,
561	DW_MACINFO_end_file		= 0x04,
562	DW_MACINFO_vendor_ext	= 0xff
563};
564
565// call frame instruction (high 2 bits for the first 3 items, low 6 bits for
566// the remaining ones)
567enum {
568	DW_CFA_advance_loc			= 0x1,	// high 2 bits
569	DW_CFA_offset				= 0x2,	// high 2 bits
570	DW_CFA_restore				= 0x3,	// high 2 bits
571	DW_CFA_nop					= 0,	// whole byte
572	DW_CFA_set_loc				= 0x01,
573	DW_CFA_advance_loc1			= 0x02,
574	DW_CFA_advance_loc2			= 0x03,
575	DW_CFA_advance_loc4			= 0x04,
576	DW_CFA_offset_extended		= 0x05,
577	DW_CFA_restore_extended		= 0x06,
578	DW_CFA_undefined			= 0x07,
579	DW_CFA_same_value			= 0x08,
580	DW_CFA_register				= 0x09,
581	DW_CFA_remember_state		= 0x0a,
582	DW_CFA_restore_state		= 0x0b,
583	DW_CFA_def_cfa				= 0x0c,
584	DW_CFA_def_cfa_register		= 0x0d,
585	DW_CFA_def_cfa_offset		= 0x0e,
586	DW_CFA_def_cfa_expression	= 0x0f,
587	DW_CFA_expression			= 0x10,
588	DW_CFA_offset_extended_sf	= 0x11,
589	DW_CFA_def_cfa_sf			= 0x12,
590	DW_CFA_def_cfa_offset_sf	= 0x13,
591	DW_CFA_val_offset			= 0x14,
592	DW_CFA_val_offset_sf		= 0x15,
593	DW_CFA_val_expression		= 0x16,
594	DW_CFA_lo_user				= 0x1c,
595	DW_CFA_hi_user				= 0x3f,
596
597	// extensions
598    DW_CFA_MIPS_advance_loc8	= 0x1d,
599    DW_CFA_GNU_window_save		= 0x2d,
600    DW_CFA_GNU_args_size		= 0x2e,
601    DW_CFA_GNU_negative_offset_extended	= 0x2f
602};
603
604// unit type
605enum {
606	DW_UT_compile				= 0x01,
607	DW_UT_type					= 0x02,
608	DW_UT_partial				= 0x03,
609	DW_UT_skeleton				= 0x04,
610	DW_UT_split_compile			= 0x05,
611	DW_UT_split_type			= 0x06,
612	DW_UT_lo_user				= 0x80,
613	DW_UT_hi_user				= 0xff
614};
615
616
617enum dwarf_reference_type {
618	dwarf_reference_type_local = 0,
619	dwarf_reference_type_global,
620	dwarf_reference_type_signature
621};
622
623
624#endif	// DWARF_H
625