2 /*--------------------------------------------------------------------*/
3 /*--- Basic definitions and helper functions for DWARF3. ---*/
4 /*--- priv_d3basics.h ---*/
5 /*--------------------------------------------------------------------*/
8 This file is part of Valgrind, a dynamic binary instrumentation
11 Copyright (C) 2008-2017 OpenWorks LLP and others; see below
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.
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
45 /* Tag names and codes. */
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,
56 DW_TAG_lexical_block
= 0x0b,
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,
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,
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,
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,
108 DW_TAG_type_unit
= 0x41,
109 DW_TAG_rvalue_reference_type
= 0x42,
110 DW_TAG_template_alias
= 0x43,
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
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. */
156 /* Source language names and codes. */
157 typedef enum dwarf_source_language
159 DW_LANG_C89
= 0x0001,
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,
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,
180 DW_LANG_Python
= 0x0014,
182 DW_LANG_OpenCL
= 0x0015,
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,
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,
230 DW_LANG_Mips_Assembler
= 0x8001,
236 /* Form names and codes. */
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,
250 DW_FORM_sdata
= 0x0d,
252 DW_FORM_udata
= 0x0f,
253 DW_FORM_ref_addr
= 0x10,
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. */
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
294 /* Attribute names and codes. */
297 DW_AT_sibling
= 0x01,
298 DW_AT_location
= 0x02,
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,
308 DW_AT_high_pc
= 0x12,
309 DW_AT_language
= 0x13,
312 DW_AT_discr_value
= 0x16,
313 DW_AT_visibility
= 0x17,
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,
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,
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,
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,
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,
364 DW_AT_entry_pc
= 0x52,
365 DW_AT_use_UTF8
= 0x53,
366 DW_AT_extension
= 0x54,
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,
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,
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,
397 DW_AT_str_offsets_base
= 0x72,
398 DW_AT_addr_base
= 0x73,
399 DW_AT_rnglists_base
= 0x74,
401 DW_AT_dwo_name
= 0x76,
402 DW_AT_reference
= 0x77,
403 DW_AT_rvalue_reference
= 0x78,
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,
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,
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
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. */
510 DW_ATE_address
= 0x1,
511 DW_ATE_boolean
= 0x2,
512 DW_ATE_complex_float
= 0x3,
515 DW_ATE_signed_char
= 0x6,
516 DW_ATE_unsigned
= 0x7,
517 DW_ATE_unsigned_char
= 0x8,
519 DW_ATE_imaginary_float
= 0x9,
520 DW_ATE_packed_decimal
= 0xa,
521 DW_ATE_numeric_string
= 0xb,
523 DW_ATE_signed_fixed
= 0xd,
524 DW_ATE_unsigned_fixed
= 0xe,
525 DW_ATE_decimal_float
= 0xf,
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
543 /* Expression operations. */
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,
575 DW_OP_plus_uconst
= 0x23,
688 DW_OP_deref_size
= 0x94,
689 DW_OP_xderef_size
= 0x95,
691 /* DWARF 3 extensions. */
692 DW_OP_push_object_address
= 0x97,
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,
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,
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,
744 DW_UT_compile
= 0x01,
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,
759 DW_LNCT_directory_index
= 0x2,
760 DW_LNCT_timestamp
= 0x3,
764 DW_LNCT_lo_user
= 0x2000,
765 DW_LNCT_hi_user
= 0x3fff
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
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
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
814 Guarded-Expression format is similar but not identical to the
815 DWARF3 location-list format. The format of each returned block is:
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
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
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. */
856 struct { Addr ip
; Addr sp
; Addr fp
; }
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
867 enum { GXR_Failure
, GXR_Addr
, GXR_Value
, GXR_RegNo
} kind
;
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
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
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
896 GXResult
ML_(evaluate_Dwarf3_Expr
) ( const UChar
* expr
, UWord exprszB
,
897 const GExpr
* fbGX
, const RegSummary
* regs
,
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 /*--------------------------------------------------------------------*/