Bug 497723 - improve filter
[valgrind.git] / coregrind / m_debuginfo / priv_d3basics.h
blob34c98728711cae46fbe82737cd448fab11445425
2 /*--------------------------------------------------------------------*/
3 /*--- Basic definitions and helper functions for DWARF3. ---*/
4 /*--- priv_d3basics.h ---*/
5 /*--------------------------------------------------------------------*/
7 /*
8 This file is part of Valgrind, a dynamic binary instrumentation
9 framework.
11 Copyright (C) 2008-2017 OpenWorks LLP and others; see below
12 info@open-works.co.uk
14 This program is free software; you can redistribute it and/or
15 modify it under the terms of the GNU General Public License as
16 published by the Free Software Foundation; either version 2 of the
17 License, or (at your option) any later version.
19 This program is distributed in the hope that it will be useful, but
20 WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, see <http://www.gnu.org/licenses/>.
27 The GNU General Public License is contained in the file COPYING.
29 -------------
31 Some of this code (DWARF3 enumerations) is taken from FSF's
32 gdb-6.6/include/elf/dwarf2.h, which is Copyright (C) 1992 to 2006
33 Free Software Foundation, Inc and is also GPL-2-or-later.
36 #ifndef __PRIV_D3BASICS_H
37 #define __PRIV_D3BASICS_H
39 #include "pub_core_basics.h" // Addr
40 #include "pub_core_debuginfo.h" // DebugInfo
42 /* This stuff is taken from gdb-6.6/include/elf/dwarf2.h, which is
43 GPL2+.
45 /* Tag names and codes. */
46 typedef enum
48 DW_TAG_padding = 0x00,
49 DW_TAG_array_type = 0x01,
50 DW_TAG_class_type = 0x02,
51 DW_TAG_entry_point = 0x03,
52 DW_TAG_enumeration_type = 0x04,
53 DW_TAG_formal_parameter = 0x05,
54 DW_TAG_imported_declaration = 0x08,
55 DW_TAG_label = 0x0a,
56 DW_TAG_lexical_block = 0x0b,
57 DW_TAG_member = 0x0d,
58 DW_TAG_pointer_type = 0x0f,
59 DW_TAG_reference_type = 0x10,
60 DW_TAG_compile_unit = 0x11,
61 DW_TAG_string_type = 0x12,
62 DW_TAG_structure_type = 0x13,
63 DW_TAG_subroutine_type = 0x15,
64 DW_TAG_typedef = 0x16,
65 DW_TAG_union_type = 0x17,
66 DW_TAG_unspecified_parameters = 0x18,
67 DW_TAG_variant = 0x19,
68 DW_TAG_common_block = 0x1a,
69 DW_TAG_common_inclusion = 0x1b,
70 DW_TAG_inheritance = 0x1c,
71 DW_TAG_inlined_subroutine = 0x1d,
72 DW_TAG_module = 0x1e,
73 DW_TAG_ptr_to_member_type = 0x1f,
74 DW_TAG_set_type = 0x20,
75 DW_TAG_subrange_type = 0x21,
76 DW_TAG_with_stmt = 0x22,
77 DW_TAG_access_declaration = 0x23,
78 DW_TAG_base_type = 0x24,
79 DW_TAG_catch_block = 0x25,
80 DW_TAG_const_type = 0x26,
81 DW_TAG_constant = 0x27,
82 DW_TAG_enumerator = 0x28,
83 DW_TAG_file_type = 0x29,
84 DW_TAG_friend = 0x2a,
85 DW_TAG_namelist = 0x2b,
86 DW_TAG_namelist_item = 0x2c,
87 DW_TAG_packed_type = 0x2d,
88 DW_TAG_subprogram = 0x2e,
89 DW_TAG_template_type_param = 0x2f,
90 DW_TAG_template_value_param = 0x30,
91 DW_TAG_thrown_type = 0x31,
92 DW_TAG_try_block = 0x32,
93 DW_TAG_variant_part = 0x33,
94 DW_TAG_variable = 0x34,
95 DW_TAG_volatile_type = 0x35,
96 /* DWARF 3. */
97 DW_TAG_dwarf_procedure = 0x36,
98 DW_TAG_restrict_type = 0x37,
99 DW_TAG_interface_type = 0x38,
100 DW_TAG_namespace = 0x39,
101 DW_TAG_imported_module = 0x3a,
102 DW_TAG_unspecified_type = 0x3b,
103 DW_TAG_partial_unit = 0x3c,
104 DW_TAG_imported_unit = 0x3d,
105 DW_TAG_condition = 0x3f,
106 DW_TAG_shared_type = 0x40,
107 /* DWARF 4. */
108 DW_TAG_type_unit = 0x41,
109 DW_TAG_rvalue_reference_type = 0x42,
110 DW_TAG_template_alias = 0x43,
111 /* DWARF 5. */
112 DW_TAG_coarray_type = 0x44,
113 DW_TAG_generic_subrange = 0x45,
114 DW_TAG_dynamic_type = 0x46,
115 DW_TAG_atomic_type = 0x47,
116 DW_TAG_call_site = 0x48,
117 DW_TAG_call_site_parameter = 0x49,
118 DW_TAG_skeleton_unit = 0x4a,
119 DW_TAG_immutable_type = 0x4b,
120 /* SGI/MIPS Extensions. */
121 DW_TAG_MIPS_loop = 0x4081,
122 /* HP extensions. See: ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz . */
123 DW_TAG_HP_array_descriptor = 0x4090,
124 /* GNU extensions. */
125 DW_TAG_format_label = 0x4101, /* For FORTRAN 77 and Fortran 90. */
126 DW_TAG_function_template = 0x4102, /* For C++. */
127 DW_TAG_class_template = 0x4103, /* For C++. */
128 DW_TAG_GNU_BINCL = 0x4104,
129 DW_TAG_GNU_EINCL = 0x4105,
130 DW_TAG_GNU_template_template_param = 0x4106,
131 DW_TAG_GNU_template_parameter_pack = 0x4107,
132 DW_TAG_GNU_formal_parameter_pack = 0x4108,
133 DW_TAG_GNU_call_site = 0x4109,
134 DW_TAG_GNU_call_site_parameter = 0x410a,
135 /* Extensions for UPC. See: http://upc.gwu.edu/~upc. */
136 DW_TAG_upc_shared_type = 0x8765,
137 DW_TAG_upc_strict_type = 0x8766,
138 DW_TAG_upc_relaxed_type = 0x8767,
139 /* PGI (STMicroelectronics) extensions. No documentation available. */
140 DW_TAG_PGI_kanji_type = 0xA000,
141 DW_TAG_PGI_interface_block = 0xA020
143 DW_TAG;
145 #define DW_TAG_lo_user 0x4080
146 #define DW_TAG_hi_user 0xffff
148 /* Flag that tells whether entry has a child or not. */
149 typedef enum
151 DW_children_no = 0,
152 DW_children_yes = 1
154 DW_children;
156 /* Source language names and codes. */
157 typedef enum dwarf_source_language
159 DW_LANG_C89 = 0x0001,
160 DW_LANG_C = 0x0002,
161 DW_LANG_Ada83 = 0x0003,
162 DW_LANG_C_plus_plus = 0x0004,
163 DW_LANG_Cobol74 = 0x0005,
164 DW_LANG_Cobol85 = 0x0006,
165 DW_LANG_Fortran77 = 0x0007,
166 DW_LANG_Fortran90 = 0x0008,
167 DW_LANG_Pascal83 = 0x0009,
168 DW_LANG_Modula2 = 0x000a,
169 /* DWARF 3. */
170 DW_LANG_Java = 0x000b,
171 DW_LANG_C99 = 0x000c,
172 DW_LANG_Ada95 = 0x000d,
173 DW_LANG_Fortran95 = 0x000e,
174 DW_LANG_PLI = 0x000f,
175 DW_LANG_ObjC = 0x0010,
176 DW_LANG_ObjC_plus_plus = 0x0011,
177 DW_LANG_UPC = 0x0012,
178 DW_LANG_D = 0x0013,
179 /* DWARF 4. */
180 DW_LANG_Python = 0x0014,
181 /* DWARF 5. */
182 DW_LANG_OpenCL = 0x0015,
183 DW_LANG_Go = 0x0016,
184 DW_LANG_Modula3 = 0x0017,
185 DW_LANG_Haskell = 0x0018,
186 DW_LANG_C_plus_plus_03 = 0x0019,
187 DW_LANG_C_plus_plus_11 = 0x001a,
188 DW_LANG_OCaml = 0x001b,
189 DW_LANG_Rust = 0x001c,
190 DW_LANG_C11 = 0x001d,
191 DW_LANG_Swift = 0x001e,
192 DW_LANG_Julia = 0x001f,
193 DW_LANG_Dylan = 0x0020,
194 DW_LANG_C_plus_plus_14 = 0x0021,
195 DW_LANG_Fortran03 = 0x0022,
196 DW_LANG_Fortran08 = 0x0023,
197 DW_LANG_RenderScript = 0x0024,
198 DW_LANG_BLISS = 0x0025,
199 /* Language codes added since DWARF 5.
200 https://dwarfstd.org/languages.html */
201 DW_LANG_Kotlin = 0x0026,
202 DW_LANG_Zig = 0x0027,
203 DW_LANG_Crystal = 0x0028,
204 DW_LANG_C_plus_plus_17 = 0x002a,
205 DW_LANG_C_plus_plus_20 = 0x002b,
206 DW_LANG_C17 = 0x002c,
207 DW_LANG_Fortran18 = 0x002d,
208 DW_LANG_Ada2005 = 0x002e,
209 DW_LANG_Ada2012 = 0x002f,
210 DW_LANG_HIP = 0x0030,
211 DW_LANG_Assembly = 0x0031,
212 DW_LANG_C_sharp = 0x0032,
213 DW_LANG_Mojo = 0x0033,
214 DW_LANG_GLSL = 0x0034,
215 DW_LANG_GLSL_ES = 0x0035,
216 DW_LANG_HLSL = 0x0036,
217 DW_LANG_OpenCL_CPP = 0x0037,
218 DW_LANG_CPP_for_OpenCL = 0x0038,
219 DW_LANG_SYCL = 0x0039,
220 DW_LANG_C_plus_plus_23 = 0x003a,
221 DW_LANG_Odin = 0x003b,
222 DW_LANG_P4 = 0x003c,
223 DW_LANG_Metal = 0x003d,
224 DW_LANG_C23 = 0x003e,
225 DW_LANG_Fortran23 = 0x003f,
226 DW_LANG_Ruby = 0x0040,
227 DW_LANG_Move = 0x0041,
228 DW_LANG_Hylo = 0x0042,
229 /* MIPS. */
230 DW_LANG_Mips_Assembler = 0x8001,
231 /* UPC. */
232 DW_LANG_Upc = 0x8765
234 DW_LANG;
236 /* Form names and codes. */
237 typedef enum
239 DW_FORM_addr = 0x01,
240 DW_FORM_block2 = 0x03,
241 DW_FORM_block4 = 0x04,
242 DW_FORM_data2 = 0x05,
243 DW_FORM_data4 = 0x06,
244 DW_FORM_data8 = 0x07,
245 DW_FORM_string = 0x08,
246 DW_FORM_block = 0x09,
247 DW_FORM_block1 = 0x0a,
248 DW_FORM_data1 = 0x0b,
249 DW_FORM_flag = 0x0c,
250 DW_FORM_sdata = 0x0d,
251 DW_FORM_strp = 0x0e,
252 DW_FORM_udata = 0x0f,
253 DW_FORM_ref_addr = 0x10,
254 DW_FORM_ref1 = 0x11,
255 DW_FORM_ref2 = 0x12,
256 DW_FORM_ref4 = 0x13,
257 DW_FORM_ref8 = 0x14,
258 DW_FORM_ref_udata = 0x15,
259 DW_FORM_indirect = 0x16,
260 /* DWARF 4 values. */
261 DW_FORM_sec_offset = 0x17,
262 DW_FORM_exprloc = 0x18,
263 DW_FORM_flag_present = 0x19,
264 DW_FORM_ref_sig8 = 0x20,
265 /* DWARF 5 values. */
266 DW_FORM_strx = 0x1a,
267 DW_FORM_addrx = 0x1b,
268 DW_FORM_ref_sup4 = 0x1c,
269 DW_FORM_strp_sup = 0x1d,
270 DW_FORM_data16 = 0x1e,
271 DW_FORM_line_strp = 0x1f,
272 DW_FORM_implicit_const = 0x21,
273 DW_FORM_loclistx = 0x22,
274 DW_FORM_rnglistx = 0x23,
275 DW_FORM_ref_sup8 = 0x24,
276 DW_FORM_strx1 = 0x25,
277 DW_FORM_strx2 = 0x26,
278 DW_FORM_strx3 = 0x27,
279 DW_FORM_strx4 = 0x28,
280 DW_FORM_addrx1 = 0x29,
281 DW_FORM_addrx2 = 0x2a,
282 DW_FORM_addrx3 = 0x2b,
283 DW_FORM_addrx4 = 0x2c,
284 /* GNU Debug Fission extensions. */
285 DW_FORM_GNU_addr_index = 0x1f01,
286 DW_FORM_GNU_str_index = 0x1f02,
287 /* Extensions for DWZ multifile.
288 See http://www.dwarfstd.org/ShowIssue.php?issue=120604.1&type=open . */
289 DW_FORM_GNU_ref_alt = 0x1f20,
290 DW_FORM_GNU_strp_alt = 0x1f21
292 DW_FORM;
294 /* Attribute names and codes. */
295 typedef enum
297 DW_AT_sibling = 0x01,
298 DW_AT_location = 0x02,
299 DW_AT_name = 0x03,
300 DW_AT_ordering = 0x09,
301 DW_AT_subscr_data = 0x0a,
302 DW_AT_byte_size = 0x0b,
303 DW_AT_bit_offset = 0x0c,
304 DW_AT_bit_size = 0x0d,
305 DW_AT_element_list = 0x0f,
306 DW_AT_stmt_list = 0x10,
307 DW_AT_low_pc = 0x11,
308 DW_AT_high_pc = 0x12,
309 DW_AT_language = 0x13,
310 DW_AT_member = 0x14,
311 DW_AT_discr = 0x15,
312 DW_AT_discr_value = 0x16,
313 DW_AT_visibility = 0x17,
314 DW_AT_import = 0x18,
315 DW_AT_string_length = 0x19,
316 DW_AT_common_reference = 0x1a,
317 DW_AT_comp_dir = 0x1b,
318 DW_AT_const_value = 0x1c,
319 DW_AT_containing_type = 0x1d,
320 DW_AT_default_value = 0x1e,
321 DW_AT_inline = 0x20,
322 DW_AT_is_optional = 0x21,
323 DW_AT_lower_bound = 0x22,
324 DW_AT_producer = 0x25,
325 DW_AT_prototyped = 0x27,
326 DW_AT_return_addr = 0x2a,
327 DW_AT_start_scope = 0x2c,
328 DW_AT_stride_size = 0x2e,
329 DW_AT_upper_bound = 0x2f,
330 DW_AT_abstract_origin = 0x31,
331 DW_AT_accessibility = 0x32,
332 DW_AT_address_class = 0x33,
333 DW_AT_artificial = 0x34,
334 DW_AT_base_types = 0x35,
335 DW_AT_calling_convention = 0x36,
336 DW_AT_count = 0x37,
337 DW_AT_data_member_location = 0x38,
338 DW_AT_decl_column = 0x39,
339 DW_AT_decl_file = 0x3a,
340 DW_AT_decl_line = 0x3b,
341 DW_AT_declaration = 0x3c,
342 DW_AT_discr_list = 0x3d,
343 DW_AT_encoding = 0x3e,
344 DW_AT_external = 0x3f,
345 DW_AT_frame_base = 0x40,
346 DW_AT_friend = 0x41,
347 DW_AT_identifier_case = 0x42,
348 DW_AT_macro_info = 0x43,
349 DW_AT_namelist_items = 0x44,
350 DW_AT_priority = 0x45,
351 DW_AT_segment = 0x46,
352 DW_AT_specification = 0x47,
353 DW_AT_static_link = 0x48,
354 DW_AT_type = 0x49,
355 DW_AT_use_location = 0x4a,
356 DW_AT_variable_parameter = 0x4b,
357 DW_AT_virtuality = 0x4c,
358 DW_AT_vtable_elem_location = 0x4d,
359 /* DWARF 3 values. */
360 DW_AT_allocated = 0x4e,
361 DW_AT_associated = 0x4f,
362 DW_AT_data_location = 0x50,
363 DW_AT_stride = 0x51,
364 DW_AT_entry_pc = 0x52,
365 DW_AT_use_UTF8 = 0x53,
366 DW_AT_extension = 0x54,
367 DW_AT_ranges = 0x55,
368 DW_AT_trampoline = 0x56,
369 DW_AT_call_column = 0x57,
370 DW_AT_call_file = 0x58,
371 DW_AT_call_line = 0x59,
372 DW_AT_description = 0x5a,
373 DW_AT_binary_scale = 0x5b,
374 DW_AT_decimal_scale = 0x5c,
375 DW_AT_small = 0x5d,
376 DW_AT_decimal_sign = 0x5e,
377 DW_AT_digit_count = 0x5f,
378 DW_AT_picture_string = 0x60,
379 DW_AT_mutable = 0x61,
380 DW_AT_threads_scaled = 0x62,
381 DW_AT_explicit = 0x63,
382 DW_AT_object_pointer = 0x64,
383 DW_AT_endianity = 0x65,
384 DW_AT_elemental = 0x66,
385 DW_AT_pure = 0x67,
386 DW_AT_recursive = 0x68,
387 /* DWARF 4 values. */
388 DW_AT_signature = 0x69,
389 DW_AT_main_subprogram = 0x6a,
390 DW_AT_data_bit_offset = 0x6b,
391 DW_AT_const_expr = 0x6c,
392 DW_AT_enum_class = 0x6d,
393 DW_AT_linkage_name = 0x6e,
394 DW_AT_string_length_bit_size = 0x6f,
395 DW_AT_string_length_byte_size = 0x70,
396 DW_AT_rank = 0x71,
397 DW_AT_str_offsets_base = 0x72,
398 DW_AT_addr_base = 0x73,
399 DW_AT_rnglists_base = 0x74,
400 /* 0x75 reserved. */
401 DW_AT_dwo_name = 0x76,
402 DW_AT_reference = 0x77,
403 DW_AT_rvalue_reference = 0x78,
404 DW_AT_macros = 0x79,
405 DW_AT_call_all_calls = 0x7a,
406 DW_AT_call_all_source_calls = 0x7b,
407 DW_AT_call_all_tail_calls = 0x7c,
408 DW_AT_call_return_pc = 0x7d,
409 DW_AT_call_value = 0x7e,
410 DW_AT_call_origin = 0x7f,
411 DW_AT_call_parameter = 0x80,
412 DW_AT_call_pc = 0x81,
413 DW_AT_call_tail_call = 0x82,
414 DW_AT_call_target = 0x83,
415 DW_AT_call_target_clobbered = 0x84,
416 DW_AT_call_data_location = 0x85,
417 DW_AT_call_data_value = 0x86,
418 DW_AT_noreturn = 0x87,
419 DW_AT_alignment = 0x88,
420 DW_AT_export_symbols = 0x89,
421 DW_AT_deleted = 0x8a,
422 DW_AT_defaulted = 0x8b,
423 DW_AT_loclists_base = 0x8c,
424 /* SGI/MIPS extensions. */
425 DW_AT_MIPS_fde = 0x2001,
426 DW_AT_MIPS_loop_begin = 0x2002,
427 DW_AT_MIPS_tail_loop_begin = 0x2003,
428 DW_AT_MIPS_epilog_begin = 0x2004,
429 DW_AT_MIPS_loop_unroll_factor = 0x2005,
430 DW_AT_MIPS_software_pipeline_depth = 0x2006,
431 DW_AT_MIPS_linkage_name = 0x2007,
432 DW_AT_MIPS_stride = 0x2008,
433 DW_AT_MIPS_abstract_name = 0x2009,
434 DW_AT_MIPS_clone_origin = 0x200a,
435 DW_AT_MIPS_has_inlines = 0x200b,
436 /* HP extensions. */
437 DW_AT_HP_block_index = 0x2000,
438 DW_AT_HP_unmodifiable = 0x2001, /* Same as DW_AT_MIPS_fde. */
439 DW_AT_HP_actuals_stmt_list = 0x2010,
440 DW_AT_HP_proc_per_section = 0x2011,
441 DW_AT_HP_raw_data_ptr = 0x2012,
442 DW_AT_HP_pass_by_reference = 0x2013,
443 DW_AT_HP_opt_level = 0x2014,
444 DW_AT_HP_prof_version_id = 0x2015,
445 DW_AT_HP_opt_flags = 0x2016,
446 DW_AT_HP_cold_region_low_pc = 0x2017,
447 DW_AT_HP_cold_region_high_pc = 0x2018,
448 DW_AT_HP_all_variables_modifiable = 0x2019,
449 DW_AT_HP_linkage_name = 0x201a,
450 DW_AT_HP_prof_flags = 0x201b, /* In comp unit of procs_info for -g. */
451 /* GNU extensions. */
452 DW_AT_sf_names = 0x2101,
453 DW_AT_src_info = 0x2102,
454 DW_AT_mac_info = 0x2103,
455 DW_AT_src_coords = 0x2104,
456 DW_AT_body_begin = 0x2105,
457 DW_AT_body_end = 0x2106,
458 DW_AT_GNU_vector = 0x2107,
459 DW_AT_GNU_guarded_by = 0x2108,
460 DW_AT_GNU_pt_guarded_by = 0x2109,
461 DW_AT_GNU_guarded = 0x210a,
462 DW_AT_GNU_pt_guarded = 0x210b,
463 DW_AT_GNU_locks_excluded = 0x210c,
464 DW_AT_GNU_exclusive_locks_required = 0x210d,
465 DW_AT_GNU_shared_locks_required = 0x210e,
466 DW_AT_GNU_odr_signature = 0x210f,
467 DW_AT_GNU_template_name = 0x2110,
468 DW_AT_GNU_call_site_value = 0x2111,
469 DW_AT_GNU_call_site_data_value = 0x2112,
470 DW_AT_GNU_call_site_target = 0x2113,
471 DW_AT_GNU_call_site_target_clobbered = 0x2114,
472 DW_AT_GNU_tail_call = 0x2115,
473 DW_AT_GNU_all_tail_call_sites = 0x2116,
474 DW_AT_GNU_all_call_sites = 0x2117,
475 DW_AT_GNU_all_source_call_sites = 0x2118,
476 DW_AT_GNU_locviews = 0x2137,
477 DW_AT_GNU_entry_view = 0x2138,
478 DW_AT_GNU_macros = 0x2119,
479 DW_AT_GNU_deleted = 0x211a,
480 /* GNU Debug Fission extensions. */
481 DW_AT_GNU_dwo_name = 0x2130,
482 DW_AT_GNU_dwo_id = 0x2131,
483 DW_AT_GNU_ranges_base = 0x2132,
484 DW_AT_GNU_addr_base = 0x2133,
485 DW_AT_GNU_pubnames = 0x2134,
486 DW_AT_GNU_pubtypes = 0x2135,
487 /* https://gcc.gnu.org/wiki/DW_AT_GNU_numerator_denominator */
488 DW_AT_GNU_numerator = 0x2303,
489 DW_AT_GNU_denominator = 0x2304,
490 /* https://gcc.gnu.org/wiki/DW_AT_GNU_bias */
491 DW_AT_GNU_bias = 0x2305,
492 /* VMS extensions. */
493 DW_AT_VMS_rtnbeg_pd_address = 0x2201,
494 /* UPC extension. */
495 DW_AT_upc_threads_scaled = 0x3210,
496 /* PGI (STMicroelectronics) extensions. */
497 DW_AT_PGI_lbase = 0x3a00,
498 DW_AT_PGI_soffset = 0x3a01,
499 DW_AT_PGI_lstride = 0x3a02
501 DW_AT;
503 #define DW_AT_lo_user 0x2000 /* Implementation-defined range start. */
504 #define DW_AT_hi_user 0x3ff0 /* Implementation-defined range end. */
506 /* Type encodings. */
507 typedef enum
509 DW_ATE_void = 0x0,
510 DW_ATE_address = 0x1,
511 DW_ATE_boolean = 0x2,
512 DW_ATE_complex_float = 0x3,
513 DW_ATE_float = 0x4,
514 DW_ATE_signed = 0x5,
515 DW_ATE_signed_char = 0x6,
516 DW_ATE_unsigned = 0x7,
517 DW_ATE_unsigned_char = 0x8,
518 /* DWARF 3. */
519 DW_ATE_imaginary_float = 0x9,
520 DW_ATE_packed_decimal = 0xa,
521 DW_ATE_numeric_string = 0xb,
522 DW_ATE_edited = 0xc,
523 DW_ATE_signed_fixed = 0xd,
524 DW_ATE_unsigned_fixed = 0xe,
525 DW_ATE_decimal_float = 0xf,
526 /* DWARF 4. */
527 DW_ATE_UTF = 0x10,
528 /* DWARF 5. */
529 DW_ATE_UCS = 0x11,
530 DW_ATE_ASCII = 0x12,
531 /* HP extensions. */
532 DW_ATE_HP_float80 = 0x80, /* Floating-point (80 bit). */
533 DW_ATE_HP_complex_float80 = 0x81, /* Complex floating-point (80 bit). */
534 DW_ATE_HP_float128 = 0x82, /* Floating-point (128 bit). */
535 DW_ATE_HP_complex_float128 = 0x83, /* Complex floating-point (128 bit). */
536 DW_ATE_HP_floathpintel = 0x84, /* Floating-point (82 bit IA64). */
537 DW_ATE_HP_imaginary_float80 = 0x85,
538 DW_ATE_HP_imaginary_float128 = 0x86
540 DW_ATE;
543 /* Expression operations. */
544 typedef enum
546 DW_OP_addr = 0x03,
547 DW_OP_deref = 0x06,
548 DW_OP_const1u = 0x08,
549 DW_OP_const1s = 0x09,
550 DW_OP_const2u = 0x0a,
551 DW_OP_const2s = 0x0b,
552 DW_OP_const4u = 0x0c,
553 DW_OP_const4s = 0x0d,
554 DW_OP_const8u = 0x0e,
555 DW_OP_const8s = 0x0f,
556 DW_OP_constu = 0x10,
557 DW_OP_consts = 0x11,
558 DW_OP_dup = 0x12,
559 DW_OP_drop = 0x13,
560 DW_OP_over = 0x14,
561 DW_OP_pick = 0x15,
562 DW_OP_swap = 0x16,
563 DW_OP_rot = 0x17,
564 DW_OP_xderef = 0x18,
565 DW_OP_abs = 0x19,
566 DW_OP_and = 0x1a,
567 DW_OP_div = 0x1b,
568 DW_OP_minus = 0x1c,
569 DW_OP_mod = 0x1d,
570 DW_OP_mul = 0x1e,
571 DW_OP_neg = 0x1f,
572 DW_OP_not = 0x20,
573 DW_OP_or = 0x21,
574 DW_OP_plus = 0x22,
575 DW_OP_plus_uconst = 0x23,
576 DW_OP_shl = 0x24,
577 DW_OP_shr = 0x25,
578 DW_OP_shra = 0x26,
579 DW_OP_xor = 0x27,
580 DW_OP_bra = 0x28,
581 DW_OP_eq = 0x29,
582 DW_OP_ge = 0x2a,
583 DW_OP_gt = 0x2b,
584 DW_OP_le = 0x2c,
585 DW_OP_lt = 0x2d,
586 DW_OP_ne = 0x2e,
587 DW_OP_skip = 0x2f,
588 DW_OP_lit0 = 0x30,
589 DW_OP_lit1 = 0x31,
590 DW_OP_lit2 = 0x32,
591 DW_OP_lit3 = 0x33,
592 DW_OP_lit4 = 0x34,
593 DW_OP_lit5 = 0x35,
594 DW_OP_lit6 = 0x36,
595 DW_OP_lit7 = 0x37,
596 DW_OP_lit8 = 0x38,
597 DW_OP_lit9 = 0x39,
598 DW_OP_lit10 = 0x3a,
599 DW_OP_lit11 = 0x3b,
600 DW_OP_lit12 = 0x3c,
601 DW_OP_lit13 = 0x3d,
602 DW_OP_lit14 = 0x3e,
603 DW_OP_lit15 = 0x3f,
604 DW_OP_lit16 = 0x40,
605 DW_OP_lit17 = 0x41,
606 DW_OP_lit18 = 0x42,
607 DW_OP_lit19 = 0x43,
608 DW_OP_lit20 = 0x44,
609 DW_OP_lit21 = 0x45,
610 DW_OP_lit22 = 0x46,
611 DW_OP_lit23 = 0x47,
612 DW_OP_lit24 = 0x48,
613 DW_OP_lit25 = 0x49,
614 DW_OP_lit26 = 0x4a,
615 DW_OP_lit27 = 0x4b,
616 DW_OP_lit28 = 0x4c,
617 DW_OP_lit29 = 0x4d,
618 DW_OP_lit30 = 0x4e,
619 DW_OP_lit31 = 0x4f,
620 DW_OP_reg0 = 0x50,
621 DW_OP_reg1 = 0x51,
622 DW_OP_reg2 = 0x52,
623 DW_OP_reg3 = 0x53,
624 DW_OP_reg4 = 0x54,
625 DW_OP_reg5 = 0x55,
626 DW_OP_reg6 = 0x56,
627 DW_OP_reg7 = 0x57,
628 DW_OP_reg8 = 0x58,
629 DW_OP_reg9 = 0x59,
630 DW_OP_reg10 = 0x5a,
631 DW_OP_reg11 = 0x5b,
632 DW_OP_reg12 = 0x5c,
633 DW_OP_reg13 = 0x5d,
634 DW_OP_reg14 = 0x5e,
635 DW_OP_reg15 = 0x5f,
636 DW_OP_reg16 = 0x60,
637 DW_OP_reg17 = 0x61,
638 DW_OP_reg18 = 0x62,
639 DW_OP_reg19 = 0x63,
640 DW_OP_reg20 = 0x64,
641 DW_OP_reg21 = 0x65,
642 DW_OP_reg22 = 0x66,
643 DW_OP_reg23 = 0x67,
644 DW_OP_reg24 = 0x68,
645 DW_OP_reg25 = 0x69,
646 DW_OP_reg26 = 0x6a,
647 DW_OP_reg27 = 0x6b,
648 DW_OP_reg28 = 0x6c,
649 DW_OP_reg29 = 0x6d,
650 DW_OP_reg30 = 0x6e,
651 DW_OP_reg31 = 0x6f,
652 DW_OP_breg0 = 0x70,
653 DW_OP_breg1 = 0x71,
654 DW_OP_breg2 = 0x72,
655 DW_OP_breg3 = 0x73,
656 DW_OP_breg4 = 0x74,
657 DW_OP_breg5 = 0x75,
658 DW_OP_breg6 = 0x76,
659 DW_OP_breg7 = 0x77,
660 DW_OP_breg8 = 0x78,
661 DW_OP_breg9 = 0x79,
662 DW_OP_breg10 = 0x7a,
663 DW_OP_breg11 = 0x7b,
664 DW_OP_breg12 = 0x7c,
665 DW_OP_breg13 = 0x7d,
666 DW_OP_breg14 = 0x7e,
667 DW_OP_breg15 = 0x7f,
668 DW_OP_breg16 = 0x80,
669 DW_OP_breg17 = 0x81,
670 DW_OP_breg18 = 0x82,
671 DW_OP_breg19 = 0x83,
672 DW_OP_breg20 = 0x84,
673 DW_OP_breg21 = 0x85,
674 DW_OP_breg22 = 0x86,
675 DW_OP_breg23 = 0x87,
676 DW_OP_breg24 = 0x88,
677 DW_OP_breg25 = 0x89,
678 DW_OP_breg26 = 0x8a,
679 DW_OP_breg27 = 0x8b,
680 DW_OP_breg28 = 0x8c,
681 DW_OP_breg29 = 0x8d,
682 DW_OP_breg30 = 0x8e,
683 DW_OP_breg31 = 0x8f,
684 DW_OP_regx = 0x90,
685 DW_OP_fbreg = 0x91,
686 DW_OP_bregx = 0x92,
687 DW_OP_piece = 0x93,
688 DW_OP_deref_size = 0x94,
689 DW_OP_xderef_size = 0x95,
690 DW_OP_nop = 0x96,
691 /* DWARF 3 extensions. */
692 DW_OP_push_object_address = 0x97,
693 DW_OP_call2 = 0x98,
694 DW_OP_call4 = 0x99,
695 DW_OP_call_ref = 0x9a,
696 DW_OP_form_tls_address = 0x9b,
697 DW_OP_call_frame_cfa = 0x9c,
698 DW_OP_bit_piece = 0x9d,
699 /* DWARF 4 extensions. */
700 DW_OP_implicit_value = 0x9e,
701 DW_OP_stack_value = 0x9f,
702 /* DWARF 5 extensions. */
703 DW_OP_implicit_pointer = 0xa0,
704 DW_OP_addrx = 0xa1,
705 DW_OP_constx = 0xa2,
706 DW_OP_entry_value = 0xa3,
707 DW_OP_const_type = 0xa4,
708 DW_OP_regval_type = 0xa5,
709 DW_OP_deref_type = 0xa6,
710 DW_OP_xderef_type = 0xa7,
711 DW_OP_convert = 0xa8,
712 DW_OP_reinterpret = 0xa9,
713 /* GNU extensions. */
714 DW_OP_GNU_push_tls_address = 0xe0,
715 DW_OP_GNU_uninit = 0xf0,
716 DW_OP_GNU_encoded_addr = 0xf1,
717 DW_OP_GNU_implicit_pointer = 0xf2,
718 DW_OP_GNU_entry_value = 0xf3,
719 DW_OP_GNU_const_type = 0xf4,
720 DW_OP_GNU_regval_type = 0xf5,
721 DW_OP_GNU_deref_type = 0xf6,
722 DW_OP_GNU_convert = 0xf7,
723 DW_OP_GNU_reinterpret = 0xf9,
724 DW_OP_GNU_parameter_ref = 0xfa,
725 /* GNU Debug Fission extensions. */
726 DW_OP_GNU_addr_index = 0xfb,
727 DW_OP_GNU_const_index = 0xfc,
728 /* The GNU variable value extension.
729 See http://dwarfstd.org/ShowIssue.php?issue=161109.2 . */
730 DW_OP_GNU_variable_value = 0xfd,
731 /* HP extensions. */
732 DW_OP_HP_unknown = 0xe0, /* Ouch, the same as GNU_push_tls_address. */
733 DW_OP_HP_is_value = 0xe1,
734 DW_OP_HP_fltconst4 = 0xe2,
735 DW_OP_HP_fltconst8 = 0xe3,
736 DW_OP_HP_mod_range = 0xe4,
737 DW_OP_HP_unmod_range = 0xe5,
738 DW_OP_HP_tls = 0xe6
740 DW_OP;
742 typedef enum
744 DW_UT_compile = 0x01,
745 DW_UT_type = 0x02,
746 DW_UT_partial = 0x03,
747 DW_UT_skeleton = 0x04,
748 DW_UT_split_compile = 0x05,
749 DW_UT_split_type = 0x06,
751 DW_UT_lo_user = 0x80,
752 DW_UT_hi_user = 0xff
754 DW_UT;
756 typedef enum
758 DW_LNCT_path = 0x1,
759 DW_LNCT_directory_index = 0x2,
760 DW_LNCT_timestamp = 0x3,
761 DW_LNCT_size = 0x4,
762 DW_LNCT_MD5 = 0x5,
764 DW_LNCT_lo_user = 0x2000,
765 DW_LNCT_hi_user = 0x3fff
767 DW_LNCT;
769 typedef enum
771 DW_RLE_end_of_list = 0x00,
772 DW_RLE_base_addressx = 0x01,
773 DW_RLE_startx_endx = 0x02,
774 DW_RLE_startx_length = 0x03,
775 DW_RLE_offset_pair = 0x04,
776 DW_RLE_base_address = 0x05,
777 DW_RLE_start_end = 0x06,
778 DW_RLE_start_length = 0x07
780 DW_RLE;
782 typedef enum
784 DW_LLE_end_of_list = 0x00,
785 DW_LLE_base_addressx = 0x01,
786 DW_LLE_startx_endx = 0x02,
787 DW_LLE_startx_length = 0x03,
788 DW_LLE_offset_pair = 0x04,
789 DW_LLE_default_location = 0x05,
790 DW_LLE_base_address = 0x06,
791 DW_LLE_start_end = 0x07,
792 DW_LLE_start_length = 0x08,
794 DW_LLE_GNU_view_pair = 0x09
796 DW_LLE;
798 const HChar* ML_(pp_DW_children) ( DW_children hashch );
799 const HChar* ML_(pp_DW_TAG) ( DW_TAG tag );
800 const HChar* ML_(pp_DW_FORM) ( DW_FORM form );
801 const HChar* ML_(pp_DW_AT) ( DW_AT attr );
802 const HChar* ML_(pp_DW_LLE) ( DW_LLE entry );
803 const HChar* ML_(pp_DW_RLE) ( DW_RLE entry );
806 /* --- To do with evaluation of Dwarf expressions --- */
808 /* Guarded Dwarf3 expressions, which can be linked together to form a
809 list. The payload field contains a variable length array of bytes
810 which hold the guarded expressions. The length can be inferred by
811 inspecting the payload bytes and so does not need to be stored
812 explicitly.
814 Guarded-Expression format is similar but not identical to the
815 DWARF3 location-list format. The format of each returned block is:
817 UChar biasMe;
818 UChar isEnd;
819 followed by zero or more of
821 (Addr aMin; Addr aMax; UShort nbytes; ..bytes..; UChar isEnd)
823 '..bytes..' is an standard DWARF3 location expression which is
824 valid when aMin <= pc <= aMax (possibly after suitable biasing).
826 The number of bytes in '..bytes..' is nbytes.
828 The end of the sequence is marked by an isEnd == 1 value. All
829 previous isEnd values must be zero.
831 biasMe is 1 if the aMin/aMax fields need this DebugInfo's text_bias
832 added before use, and 0 if the GX is this is not necessary (is
833 ready to go).
835 Hence the block can be quickly parsed and is self-describing. Note
836 that aMax is 1 less than the corresponding value in a DWARF3
837 location list. Zero length ranges, with aMax == aMin-1, are not
838 allowed.
840 typedef
841 struct _GExpr {
842 UChar payload[0];
844 GExpr;
846 /* Show a so-called guarded expression */
847 void ML_(pp_GX) ( const GExpr* gx );
849 /* Evaluation of a DWARF3 expression (and hence of a GExpr) may
850 require knowing a suitably contextualising set of values for the
851 instruction, frame and stack pointers (and, in general, all
852 registers, though we punt on such generality here). Here's a
853 struct to carry the bare essentials. ip, fp and sp are expected to
854 be provided for all platforms. */
855 typedef
856 struct { Addr ip; Addr sp; Addr fp; }
857 RegSummary;
859 /* This describes the result of evaluating a DWARF3 expression.
860 GXR_Failure: failed; .word is an asciiz string summarising why
861 GXR_Addr: evaluated to an address of the object, in .word
862 GXR_Value: evaluated to a value, in .word
863 GXR_RegNo: evaluated to a DWARF3 register number, in .word
865 typedef
866 struct {
867 enum { GXR_Failure, GXR_Addr, GXR_Value, GXR_RegNo } kind;
868 UWord word;
870 GXResult;
872 void ML_(pp_GXResult) ( GXResult res );
874 /* Evaluate a guarded expression. If regs is NULL, then gx is assumed
875 (and checked) to contain just a single guarded expression, with a
876 guard which covers the entire address space and so always evaluates
877 to True (iow, gx is a single unconditional expression). If regs is
878 non-NULL then its .ip value is used to select which of the
879 embedded DWARF3 location expressions to use, and that is duly
880 evaluated.
882 If as part of the evaluation, a frame base value needs to be
883 computed, then fbGX can provide an expression for it. If fbGX is
884 NULL but the frame base is still needed, then evaluation of gx as a
885 whole will fail. */
886 GXResult ML_(evaluate_GX)( const GExpr* gx, const GExpr* fbGX,
887 const RegSummary* regs, const DebugInfo* di );
889 /* This is a subsidiary of ML_(evaluate_GX), which just evaluates a
890 single standard DWARF3 expression. Conventions w.r.t regs and fbGX
891 are as for ML_(evaluate_GX). If push_initial_zero is True, then an
892 initial zero word is pushed on the evaluation stack at the start.
893 This is needed for computing structure field offsets. Note that
894 ML_(evaluate_GX) and ML_(evaluate_Dwarf3_Expr) are mutually
895 recursive. */
896 GXResult ML_(evaluate_Dwarf3_Expr) ( const UChar* expr, UWord exprszB,
897 const GExpr* fbGX, const RegSummary* regs,
898 const DebugInfo* di,
899 Bool push_initial_zero );
901 /* Evaluate a very simple Guarded (DWARF3) expression. The expression
902 is expected to denote a constant, with no reference to any
903 registers nor to any frame base expression. GXR_Failure is
904 returned if there is more than one guard, or none, a register
905 location is denoted, a frame base expression is required, or the
906 expression is not manifestly a constant. The range of addresses
907 covered by the guard is also ignored. */
908 GXResult ML_(evaluate_trivial_GX)( const GExpr* gx, const DebugInfo* di );
910 /* Compute call frame address (CFA) for IP/SP/FP. */
911 Addr ML_(get_CFA) ( Addr ip, Addr sp, Addr fp,
912 Addr min_accessible, Addr max_accessible );
914 #endif /* ndef __PRIV_D3BASICS_H */
916 /*--------------------------------------------------------------------*/
917 /*--- end priv_d3basics.h ---*/
918 /*--------------------------------------------------------------------*/