priv_d3basics.h revision 3297124fa2116737066ac3cd709f18fdd5405163
1
2/*--------------------------------------------------------------------*/
3/*--- Basic definitions and helper functions for DWARF3.           ---*/
4/*---                                              priv_d3basics.h ---*/
5/*--------------------------------------------------------------------*/
6
7/*
8   This file is part of Valgrind, a dynamic binary instrumentation
9   framework.
10
11   Copyright (C) 2008-2013 OpenWorks LLP and others; see below
12      info@open-works.co.uk
13
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.
18
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.
23
24   You should have received a copy of the GNU General Public License
25   along with this program; if not, write to the Free Software
26   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
27   02111-1307, USA.
28
29   The GNU General Public License is contained in the file COPYING.
30
31   -------------
32
33   Some of this code (DWARF3 enumerations) is taken from FSF's
34   gdb-6.6/include/elf/dwarf2.h, which is Copyright (C) 1992 to 2006
35   Free Software Foundation, Inc and is also GPL-2-or-later.
36*/
37
38#ifndef __PRIV_D3BASICS_H
39#define __PRIV_D3BASICS_H
40
41#include "pub_core_basics.h"       // Addr
42#include "pub_core_debuginfo.h"    // DebugInfo
43
44/* This stuff is taken from gdb-6.6/include/elf/dwarf2.h, which is
45   GPL2+.
46*/
47/* Tag names and codes.  */
48typedef enum
49  {
50    DW_TAG_padding = 0x00,
51    DW_TAG_array_type = 0x01,
52    DW_TAG_class_type = 0x02,
53    DW_TAG_entry_point = 0x03,
54    DW_TAG_enumeration_type = 0x04,
55    DW_TAG_formal_parameter = 0x05,
56    DW_TAG_imported_declaration = 0x08,
57    DW_TAG_label = 0x0a,
58    DW_TAG_lexical_block = 0x0b,
59    DW_TAG_member = 0x0d,
60    DW_TAG_pointer_type = 0x0f,
61    DW_TAG_reference_type = 0x10,
62    DW_TAG_compile_unit = 0x11,
63    DW_TAG_string_type = 0x12,
64    DW_TAG_structure_type = 0x13,
65    DW_TAG_subroutine_type = 0x15,
66    DW_TAG_typedef = 0x16,
67    DW_TAG_union_type = 0x17,
68    DW_TAG_unspecified_parameters = 0x18,
69    DW_TAG_variant = 0x19,
70    DW_TAG_common_block = 0x1a,
71    DW_TAG_common_inclusion = 0x1b,
72    DW_TAG_inheritance = 0x1c,
73    DW_TAG_inlined_subroutine = 0x1d,
74    DW_TAG_module = 0x1e,
75    DW_TAG_ptr_to_member_type = 0x1f,
76    DW_TAG_set_type = 0x20,
77    DW_TAG_subrange_type = 0x21,
78    DW_TAG_with_stmt = 0x22,
79    DW_TAG_access_declaration = 0x23,
80    DW_TAG_base_type = 0x24,
81    DW_TAG_catch_block = 0x25,
82    DW_TAG_const_type = 0x26,
83    DW_TAG_constant = 0x27,
84    DW_TAG_enumerator = 0x28,
85    DW_TAG_file_type = 0x29,
86    DW_TAG_friend = 0x2a,
87    DW_TAG_namelist = 0x2b,
88    DW_TAG_namelist_item = 0x2c,
89    DW_TAG_packed_type = 0x2d,
90    DW_TAG_subprogram = 0x2e,
91    DW_TAG_template_type_param = 0x2f,
92    DW_TAG_template_value_param = 0x30,
93    DW_TAG_thrown_type = 0x31,
94    DW_TAG_try_block = 0x32,
95    DW_TAG_variant_part = 0x33,
96    DW_TAG_variable = 0x34,
97    DW_TAG_volatile_type = 0x35,
98    /* DWARF 3.  */
99    DW_TAG_dwarf_procedure = 0x36,
100    DW_TAG_restrict_type = 0x37,
101    DW_TAG_interface_type = 0x38,
102    DW_TAG_namespace = 0x39,
103    DW_TAG_imported_module = 0x3a,
104    DW_TAG_unspecified_type = 0x3b,
105    DW_TAG_partial_unit = 0x3c,
106    DW_TAG_imported_unit = 0x3d,
107    DW_TAG_condition = 0x3f,
108    DW_TAG_shared_type = 0x40,
109    /* DWARF 4.  */
110    DW_TAG_type_unit = 0x41,
111    DW_TAG_rvalue_reference_type = 0x42,
112    DW_TAG_template_alias = 0x43,
113    /* SGI/MIPS Extensions.  */
114    DW_TAG_MIPS_loop = 0x4081,
115    /* HP extensions.  See: ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz .  */
116    DW_TAG_HP_array_descriptor = 0x4090,
117    /* GNU extensions.  */
118    DW_TAG_format_label = 0x4101,	/* For FORTRAN 77 and Fortran 90.  */
119    DW_TAG_function_template = 0x4102,	/* For C++.  */
120    DW_TAG_class_template = 0x4103,	/* For C++.  */
121    DW_TAG_GNU_BINCL = 0x4104,
122    DW_TAG_GNU_EINCL = 0x4105,
123    /* Extensions for UPC.  See: http://upc.gwu.edu/~upc.  */
124    DW_TAG_upc_shared_type = 0x8765,
125    DW_TAG_upc_strict_type = 0x8766,
126    DW_TAG_upc_relaxed_type = 0x8767,
127    /* PGI (STMicroelectronics) extensions.  No documentation available.  */
128    DW_TAG_PGI_kanji_type      = 0xA000,
129    DW_TAG_PGI_interface_block = 0xA020
130  }
131  DW_TAG;
132
133#define DW_TAG_lo_user	0x4080
134#define DW_TAG_hi_user	0xffff
135
136/* Flag that tells whether entry has a child or not.  */
137typedef enum
138  {
139    DW_children_no = 0,
140    DW_children_yes = 1
141  }
142  DW_children;
143
144/* Source language names and codes.  */
145typedef enum dwarf_source_language
146  {
147    DW_LANG_C89 = 0x0001,
148    DW_LANG_C = 0x0002,
149    DW_LANG_Ada83 = 0x0003,
150    DW_LANG_C_plus_plus = 0x0004,
151    DW_LANG_Cobol74 = 0x0005,
152    DW_LANG_Cobol85 = 0x0006,
153    DW_LANG_Fortran77 = 0x0007,
154    DW_LANG_Fortran90 = 0x0008,
155    DW_LANG_Pascal83 = 0x0009,
156    DW_LANG_Modula2 = 0x000a,
157    /* DWARF 3.  */
158    DW_LANG_Java = 0x000b,
159    DW_LANG_C99 = 0x000c,
160    DW_LANG_Ada95 = 0x000d,
161    DW_LANG_Fortran95 = 0x000e,
162    DW_LANG_PLI = 0x000f,
163    DW_LANG_ObjC = 0x0010,
164    DW_LANG_ObjC_plus_plus = 0x0011,
165    DW_LANG_UPC = 0x0012,
166    DW_LANG_D = 0x0013,
167    /* DWARF 4.  */
168    DW_LANG_Python = 0x0014,
169    /* MIPS.  */
170    DW_LANG_Mips_Assembler = 0x8001,
171    /* UPC.  */
172    DW_LANG_Upc = 0x8765
173  }
174  DW_LANG;
175
176/* Form names and codes.  */
177typedef enum
178  {
179    DW_FORM_addr = 0x01,
180    DW_FORM_block2 = 0x03,
181    DW_FORM_block4 = 0x04,
182    DW_FORM_data2 = 0x05,
183    DW_FORM_data4 = 0x06,
184    DW_FORM_data8 = 0x07,
185    DW_FORM_string = 0x08,
186    DW_FORM_block = 0x09,
187    DW_FORM_block1 = 0x0a,
188    DW_FORM_data1 = 0x0b,
189    DW_FORM_flag = 0x0c,
190    DW_FORM_sdata = 0x0d,
191    DW_FORM_strp = 0x0e,
192    DW_FORM_udata = 0x0f,
193    DW_FORM_ref_addr = 0x10,
194    DW_FORM_ref1 = 0x11,
195    DW_FORM_ref2 = 0x12,
196    DW_FORM_ref4 = 0x13,
197    DW_FORM_ref8 = 0x14,
198    DW_FORM_ref_udata = 0x15,
199    DW_FORM_indirect = 0x16,
200    /* DWARF 4 values.  */
201    DW_FORM_sec_offset = 0x17,
202    DW_FORM_exprloc = 0x18,
203    DW_FORM_flag_present = 0x19,
204    DW_FORM_ref_sig8 = 0x20,
205    /* Extensions for DWZ multifile.
206       See http://www.dwarfstd.org/ShowIssue.php?issue=120604.1&type=open .  */
207    DW_FORM_GNU_ref_alt = 0x1f20,
208    DW_FORM_GNU_strp_alt = 0x1f21
209  }
210  DW_FORM;
211
212/* Attribute names and codes.  */
213typedef enum
214  {
215    DW_AT_sibling = 0x01,
216    DW_AT_location = 0x02,
217    DW_AT_name = 0x03,
218    DW_AT_ordering = 0x09,
219    DW_AT_subscr_data = 0x0a,
220    DW_AT_byte_size = 0x0b,
221    DW_AT_bit_offset = 0x0c,
222    DW_AT_bit_size = 0x0d,
223    DW_AT_element_list = 0x0f,
224    DW_AT_stmt_list = 0x10,
225    DW_AT_low_pc = 0x11,
226    DW_AT_high_pc = 0x12,
227    DW_AT_language = 0x13,
228    DW_AT_member = 0x14,
229    DW_AT_discr = 0x15,
230    DW_AT_discr_value = 0x16,
231    DW_AT_visibility = 0x17,
232    DW_AT_import = 0x18,
233    DW_AT_string_length = 0x19,
234    DW_AT_common_reference = 0x1a,
235    DW_AT_comp_dir = 0x1b,
236    DW_AT_const_value = 0x1c,
237    DW_AT_containing_type = 0x1d,
238    DW_AT_default_value = 0x1e,
239    DW_AT_inline = 0x20,
240    DW_AT_is_optional = 0x21,
241    DW_AT_lower_bound = 0x22,
242    DW_AT_producer = 0x25,
243    DW_AT_prototyped = 0x27,
244    DW_AT_return_addr = 0x2a,
245    DW_AT_start_scope = 0x2c,
246    DW_AT_stride_size = 0x2e,
247    DW_AT_upper_bound = 0x2f,
248    DW_AT_abstract_origin = 0x31,
249    DW_AT_accessibility = 0x32,
250    DW_AT_address_class = 0x33,
251    DW_AT_artificial = 0x34,
252    DW_AT_base_types = 0x35,
253    DW_AT_calling_convention = 0x36,
254    DW_AT_count = 0x37,
255    DW_AT_data_member_location = 0x38,
256    DW_AT_decl_column = 0x39,
257    DW_AT_decl_file = 0x3a,
258    DW_AT_decl_line = 0x3b,
259    DW_AT_declaration = 0x3c,
260    DW_AT_discr_list = 0x3d,
261    DW_AT_encoding = 0x3e,
262    DW_AT_external = 0x3f,
263    DW_AT_frame_base = 0x40,
264    DW_AT_friend = 0x41,
265    DW_AT_identifier_case = 0x42,
266    DW_AT_macro_info = 0x43,
267    DW_AT_namelist_items = 0x44,
268    DW_AT_priority = 0x45,
269    DW_AT_segment = 0x46,
270    DW_AT_specification = 0x47,
271    DW_AT_static_link = 0x48,
272    DW_AT_type = 0x49,
273    DW_AT_use_location = 0x4a,
274    DW_AT_variable_parameter = 0x4b,
275    DW_AT_virtuality = 0x4c,
276    DW_AT_vtable_elem_location = 0x4d,
277    /* DWARF 3 values.  */
278    DW_AT_allocated     = 0x4e,
279    DW_AT_associated    = 0x4f,
280    DW_AT_data_location = 0x50,
281    DW_AT_stride        = 0x51,
282    DW_AT_entry_pc      = 0x52,
283    DW_AT_use_UTF8      = 0x53,
284    DW_AT_extension     = 0x54,
285    DW_AT_ranges        = 0x55,
286    DW_AT_trampoline    = 0x56,
287    DW_AT_call_column   = 0x57,
288    DW_AT_call_file     = 0x58,
289    DW_AT_call_line     = 0x59,
290    DW_AT_description   = 0x5a,
291    DW_AT_binary_scale  = 0x5b,
292    DW_AT_decimal_scale = 0x5c,
293    DW_AT_small         = 0x5d,
294    DW_AT_decimal_sign  = 0x5e,
295    DW_AT_digit_count   = 0x5f,
296    DW_AT_picture_string = 0x60,
297    DW_AT_mutable       = 0x61,
298    DW_AT_threads_scaled = 0x62,
299    DW_AT_explicit      = 0x63,
300    DW_AT_object_pointer = 0x64,
301    DW_AT_endianity     = 0x65,
302    DW_AT_elemental     = 0x66,
303    DW_AT_pure          = 0x67,
304    DW_AT_recursive     = 0x68,
305    /* DWARF 4 values.  */
306    DW_AT_signature       = 0x69,
307    DW_AT_main_subprogram = 0x6a,
308    DW_AT_data_bit_offset = 0x6b,
309    DW_AT_const_expr      = 0x6c,
310    DW_AT_enum_class      = 0x6d,
311    DW_AT_linkage_name    = 0x6e,
312    /* SGI/MIPS extensions.  */
313    DW_AT_MIPS_fde = 0x2001,
314    DW_AT_MIPS_loop_begin = 0x2002,
315    DW_AT_MIPS_tail_loop_begin = 0x2003,
316    DW_AT_MIPS_epilog_begin = 0x2004,
317    DW_AT_MIPS_loop_unroll_factor = 0x2005,
318    DW_AT_MIPS_software_pipeline_depth = 0x2006,
319    DW_AT_MIPS_linkage_name = 0x2007,
320    DW_AT_MIPS_stride = 0x2008,
321    DW_AT_MIPS_abstract_name = 0x2009,
322    DW_AT_MIPS_clone_origin = 0x200a,
323    DW_AT_MIPS_has_inlines = 0x200b,
324    /* HP extensions.  */
325    DW_AT_HP_block_index         = 0x2000,
326    DW_AT_HP_unmodifiable        = 0x2001, /* Same as DW_AT_MIPS_fde.  */
327    DW_AT_HP_actuals_stmt_list   = 0x2010,
328    DW_AT_HP_proc_per_section    = 0x2011,
329    DW_AT_HP_raw_data_ptr        = 0x2012,
330    DW_AT_HP_pass_by_reference   = 0x2013,
331    DW_AT_HP_opt_level           = 0x2014,
332    DW_AT_HP_prof_version_id     = 0x2015,
333    DW_AT_HP_opt_flags           = 0x2016,
334    DW_AT_HP_cold_region_low_pc  = 0x2017,
335    DW_AT_HP_cold_region_high_pc = 0x2018,
336    DW_AT_HP_all_variables_modifiable = 0x2019,
337    DW_AT_HP_linkage_name        = 0x201a,
338    DW_AT_HP_prof_flags          = 0x201b,  /* In comp unit of procs_info for -g.  */
339    /* GNU extensions.  */
340    DW_AT_sf_names   = 0x2101,
341    DW_AT_src_info   = 0x2102,
342    DW_AT_mac_info   = 0x2103,
343    DW_AT_src_coords = 0x2104,
344    DW_AT_body_begin = 0x2105,
345    DW_AT_body_end   = 0x2106,
346    DW_AT_GNU_vector = 0x2107,
347    DW_AT_GNU_all_tail_call_sites = 0x2116,
348    DW_AT_GNU_all_call_sites = 0x2117,
349    /* VMS extensions.  */
350    DW_AT_VMS_rtnbeg_pd_address = 0x2201,
351    /* UPC extension.  */
352    DW_AT_upc_threads_scaled = 0x3210,
353    /* PGI (STMicroelectronics) extensions.  */
354    DW_AT_PGI_lbase    = 0x3a00,
355    DW_AT_PGI_soffset  = 0x3a01,
356    DW_AT_PGI_lstride  = 0x3a02
357  }
358  DW_AT;
359
360#define DW_AT_lo_user	0x2000	/* Implementation-defined range start.  */
361#define DW_AT_hi_user	0x3ff0	/* Implementation-defined range end.  */
362
363/* Type encodings.  */
364typedef enum
365  {
366    DW_ATE_void = 0x0,
367    DW_ATE_address = 0x1,
368    DW_ATE_boolean = 0x2,
369    DW_ATE_complex_float = 0x3,
370    DW_ATE_float = 0x4,
371    DW_ATE_signed = 0x5,
372    DW_ATE_signed_char = 0x6,
373    DW_ATE_unsigned = 0x7,
374    DW_ATE_unsigned_char = 0x8,
375    /* DWARF 3.  */
376    DW_ATE_imaginary_float = 0x9,
377    DW_ATE_packed_decimal = 0xa,
378    DW_ATE_numeric_string = 0xb,
379    DW_ATE_edited = 0xc,
380    DW_ATE_signed_fixed = 0xd,
381    DW_ATE_unsigned_fixed = 0xe,
382    DW_ATE_decimal_float = 0xf,
383    /* DWARF 4.  */
384    DW_ATE_UTF = 0x10,
385    /* HP extensions.  */
386    DW_ATE_HP_float80            = 0x80, /* Floating-point (80 bit).  */
387    DW_ATE_HP_complex_float80    = 0x81, /* Complex floating-point (80 bit).  */
388    DW_ATE_HP_float128           = 0x82, /* Floating-point (128 bit).  */
389    DW_ATE_HP_complex_float128   = 0x83, /* Complex floating-point (128 bit).  */
390    DW_ATE_HP_floathpintel       = 0x84, /* Floating-point (82 bit IA64).  */
391    DW_ATE_HP_imaginary_float80  = 0x85,
392    DW_ATE_HP_imaginary_float128 = 0x86
393  }
394  DW_ATE;
395
396
397/* Expression operations. */
398typedef enum
399  {
400    DW_OP_addr = 0x03,
401    DW_OP_deref = 0x06,
402    DW_OP_const1u = 0x08,
403    DW_OP_const1s = 0x09,
404    DW_OP_const2u = 0x0a,
405    DW_OP_const2s = 0x0b,
406    DW_OP_const4u = 0x0c,
407    DW_OP_const4s = 0x0d,
408    DW_OP_const8u = 0x0e,
409    DW_OP_const8s = 0x0f,
410    DW_OP_constu = 0x10,
411    DW_OP_consts = 0x11,
412    DW_OP_dup = 0x12,
413    DW_OP_drop = 0x13,
414    DW_OP_over = 0x14,
415    DW_OP_pick = 0x15,
416    DW_OP_swap = 0x16,
417    DW_OP_rot = 0x17,
418    DW_OP_xderef = 0x18,
419    DW_OP_abs = 0x19,
420    DW_OP_and = 0x1a,
421    DW_OP_div = 0x1b,
422    DW_OP_minus = 0x1c,
423    DW_OP_mod = 0x1d,
424    DW_OP_mul = 0x1e,
425    DW_OP_neg = 0x1f,
426    DW_OP_not = 0x20,
427    DW_OP_or = 0x21,
428    DW_OP_plus = 0x22,
429    DW_OP_plus_uconst = 0x23,
430    DW_OP_shl = 0x24,
431    DW_OP_shr = 0x25,
432    DW_OP_shra = 0x26,
433    DW_OP_xor = 0x27,
434    DW_OP_bra = 0x28,
435    DW_OP_eq = 0x29,
436    DW_OP_ge = 0x2a,
437    DW_OP_gt = 0x2b,
438    DW_OP_le = 0x2c,
439    DW_OP_lt = 0x2d,
440    DW_OP_ne = 0x2e,
441    DW_OP_skip = 0x2f,
442    DW_OP_lit0 = 0x30,
443    DW_OP_lit1 = 0x31,
444    DW_OP_lit2 = 0x32,
445    DW_OP_lit3 = 0x33,
446    DW_OP_lit4 = 0x34,
447    DW_OP_lit5 = 0x35,
448    DW_OP_lit6 = 0x36,
449    DW_OP_lit7 = 0x37,
450    DW_OP_lit8 = 0x38,
451    DW_OP_lit9 = 0x39,
452    DW_OP_lit10 = 0x3a,
453    DW_OP_lit11 = 0x3b,
454    DW_OP_lit12 = 0x3c,
455    DW_OP_lit13 = 0x3d,
456    DW_OP_lit14 = 0x3e,
457    DW_OP_lit15 = 0x3f,
458    DW_OP_lit16 = 0x40,
459    DW_OP_lit17 = 0x41,
460    DW_OP_lit18 = 0x42,
461    DW_OP_lit19 = 0x43,
462    DW_OP_lit20 = 0x44,
463    DW_OP_lit21 = 0x45,
464    DW_OP_lit22 = 0x46,
465    DW_OP_lit23 = 0x47,
466    DW_OP_lit24 = 0x48,
467    DW_OP_lit25 = 0x49,
468    DW_OP_lit26 = 0x4a,
469    DW_OP_lit27 = 0x4b,
470    DW_OP_lit28 = 0x4c,
471    DW_OP_lit29 = 0x4d,
472    DW_OP_lit30 = 0x4e,
473    DW_OP_lit31 = 0x4f,
474    DW_OP_reg0 = 0x50,
475    DW_OP_reg1 = 0x51,
476    DW_OP_reg2 = 0x52,
477    DW_OP_reg3 = 0x53,
478    DW_OP_reg4 = 0x54,
479    DW_OP_reg5 = 0x55,
480    DW_OP_reg6 = 0x56,
481    DW_OP_reg7 = 0x57,
482    DW_OP_reg8 = 0x58,
483    DW_OP_reg9 = 0x59,
484    DW_OP_reg10 = 0x5a,
485    DW_OP_reg11 = 0x5b,
486    DW_OP_reg12 = 0x5c,
487    DW_OP_reg13 = 0x5d,
488    DW_OP_reg14 = 0x5e,
489    DW_OP_reg15 = 0x5f,
490    DW_OP_reg16 = 0x60,
491    DW_OP_reg17 = 0x61,
492    DW_OP_reg18 = 0x62,
493    DW_OP_reg19 = 0x63,
494    DW_OP_reg20 = 0x64,
495    DW_OP_reg21 = 0x65,
496    DW_OP_reg22 = 0x66,
497    DW_OP_reg23 = 0x67,
498    DW_OP_reg24 = 0x68,
499    DW_OP_reg25 = 0x69,
500    DW_OP_reg26 = 0x6a,
501    DW_OP_reg27 = 0x6b,
502    DW_OP_reg28 = 0x6c,
503    DW_OP_reg29 = 0x6d,
504    DW_OP_reg30 = 0x6e,
505    DW_OP_reg31 = 0x6f,
506    DW_OP_breg0 = 0x70,
507    DW_OP_breg1 = 0x71,
508    DW_OP_breg2 = 0x72,
509    DW_OP_breg3 = 0x73,
510    DW_OP_breg4 = 0x74,
511    DW_OP_breg5 = 0x75,
512    DW_OP_breg6 = 0x76,
513    DW_OP_breg7 = 0x77,
514    DW_OP_breg8 = 0x78,
515    DW_OP_breg9 = 0x79,
516    DW_OP_breg10 = 0x7a,
517    DW_OP_breg11 = 0x7b,
518    DW_OP_breg12 = 0x7c,
519    DW_OP_breg13 = 0x7d,
520    DW_OP_breg14 = 0x7e,
521    DW_OP_breg15 = 0x7f,
522    DW_OP_breg16 = 0x80,
523    DW_OP_breg17 = 0x81,
524    DW_OP_breg18 = 0x82,
525    DW_OP_breg19 = 0x83,
526    DW_OP_breg20 = 0x84,
527    DW_OP_breg21 = 0x85,
528    DW_OP_breg22 = 0x86,
529    DW_OP_breg23 = 0x87,
530    DW_OP_breg24 = 0x88,
531    DW_OP_breg25 = 0x89,
532    DW_OP_breg26 = 0x8a,
533    DW_OP_breg27 = 0x8b,
534    DW_OP_breg28 = 0x8c,
535    DW_OP_breg29 = 0x8d,
536    DW_OP_breg30 = 0x8e,
537    DW_OP_breg31 = 0x8f,
538    DW_OP_regx = 0x90,
539    DW_OP_fbreg = 0x91,
540    DW_OP_bregx = 0x92,
541    DW_OP_piece = 0x93,
542    DW_OP_deref_size = 0x94,
543    DW_OP_xderef_size = 0x95,
544    DW_OP_nop = 0x96,
545    /* DWARF 3 extensions.  */
546    DW_OP_push_object_address = 0x97,
547    DW_OP_call2 = 0x98,
548    DW_OP_call4 = 0x99,
549    DW_OP_call_ref = 0x9a,
550    DW_OP_form_tls_address = 0x9b,
551    DW_OP_call_frame_cfa = 0x9c,
552    DW_OP_bit_piece = 0x9d,
553    /* DWARF 4 extensions.  */
554    DW_OP_implicit_value = 0x9e,
555    DW_OP_stack_value = 0x9f,
556    /* GNU extensions.  */
557    DW_OP_GNU_push_tls_address = 0xe0,
558    /* HP extensions.  */
559    DW_OP_HP_unknown     = 0xe0, /* Ouch, the same as GNU_push_tls_address.  */
560    DW_OP_HP_is_value    = 0xe1,
561    DW_OP_HP_fltconst4   = 0xe2,
562    DW_OP_HP_fltconst8   = 0xe3,
563    DW_OP_HP_mod_range   = 0xe4,
564    DW_OP_HP_unmod_range = 0xe5,
565    DW_OP_HP_tls         = 0xe6
566  }
567  DW_OP;
568
569const HChar* ML_(pp_DW_children) ( DW_children hashch );
570const HChar* ML_(pp_DW_TAG)      ( DW_TAG tag );
571const HChar* ML_(pp_DW_FORM)     ( DW_FORM form );
572const HChar* ML_(pp_DW_AT)       ( DW_AT attr );
573
574
575/* --- To do with evaluation of Dwarf expressions --- */
576
577/* Guarded Dwarf3 expressions, which can be linked together to form a
578   list.  The payload field contains a variable length array of bytes
579   which hold the guarded expressions.  The length can be inferred by
580   inspecting the payload bytes and so does not need to be stored
581   explicitly.
582
583   Guarded-Expression format is similar but not identical to the
584   DWARF3 location-list format.  The format of each returned block is:
585
586      UChar biasMe;
587      UChar isEnd;
588      followed by zero or more of
589
590      (Addr aMin;  Addr aMax;  UShort nbytes;  ..bytes..;  UChar isEnd)
591
592   '..bytes..' is an standard DWARF3 location expression which is
593   valid when aMin <= pc <= aMax (possibly after suitable biasing).
594
595   The number of bytes in '..bytes..' is nbytes.
596
597   The end of the sequence is marked by an isEnd == 1 value.  All
598   previous isEnd values must be zero.
599
600   biasMe is 1 if the aMin/aMax fields need this DebugInfo's text_bias
601   added before use, and 0 if the GX is this is not necessary (is
602   ready to go).
603
604   Hence the block can be quickly parsed and is self-describing.  Note
605   that aMax is 1 less than the corresponding value in a DWARF3
606   location list.  Zero length ranges, with aMax == aMin-1, are not
607   allowed.
608*/
609typedef
610   struct _GExpr {
611      UChar payload[0];
612   }
613   GExpr;
614
615/* Show a so-called guarded expression */
616void ML_(pp_GX) ( const GExpr* gx );
617
618/* Evaluation of a DWARF3 expression (and hence of a GExpr) may
619   require knowing a suitably contextualising set of values for the
620   instruction, frame and stack pointers (and, in general, all
621   registers, though we punt on such generality here).  Here's a
622   struct to carry the bare essentials.  ip, fp and sp are expected to
623   be provided for all platforms. */
624typedef
625   struct { Addr ip; Addr sp; Addr fp; }
626   RegSummary;
627
628/* This describes the result of evaluating a DWARF3 expression.
629   GXR_Failure: failed; .word is an asciiz string summarising why
630   GXR_Addr:    evaluated to an address of the object, in .word
631   GXR_Value:   evaluated to a value, in .word
632   GXR_RegNo:   evaluated to a DWARF3 register number, in .word
633*/
634typedef
635   struct {
636      enum { GXR_Failure, GXR_Addr, GXR_Value, GXR_RegNo } kind;
637      UWord word;
638   }
639   GXResult;
640
641void ML_(pp_GXResult) ( GXResult res );
642
643/* Evaluate a guarded expression.  If regs is NULL, then gx is assumed
644   (and checked) to contain just a single guarded expression, with a
645   guard which covers the entire address space and so always evaluates
646   to True (iow, gx is a single unconditional expression).  If regs is
647   non-NULL then its .ip value is used to select which of the
648   embedded DWARF3 location expressions to use, and that is duly
649   evaluated.
650
651   If as part of the evaluation, a frame base value needs to be
652   computed, then fbGX can provide an expression for it.  If fbGX is
653   NULL but the frame base is still needed, then evaluation of gx as a
654   whole will fail. */
655GXResult ML_(evaluate_GX)( const GExpr* gx, const GExpr* fbGX,
656                           const RegSummary* regs, const DebugInfo* di );
657
658/* This is a subsidiary of ML_(evaluate_GX), which just evaluates a
659   single standard DWARF3 expression.  Conventions w.r.t regs and fbGX
660   are as for ML_(evaluate_GX).  If push_initial_zero is True, then an
661   initial zero word is pushed on the evaluation stack at the start.
662   This is needed for computing structure field offsets.  Note that
663   ML_(evaluate_GX) and ML_(evaluate_Dwarf3_Expr) are mutually
664   recursive. */
665GXResult ML_(evaluate_Dwarf3_Expr) ( const UChar* expr, UWord exprszB,
666                                     const GExpr* fbGX, const RegSummary* regs,
667                                     const DebugInfo* di,
668                                     Bool push_initial_zero );
669
670/* Evaluate a very simple Guarded (DWARF3) expression.  The expression
671   is expected to denote a constant, with no reference to any
672   registers nor to any frame base expression.  GXR_Failure is
673   returned if there is more than one guard, or none, a register
674   location is denoted, a frame base expression is required, or the
675   expression is not manifestly a constant.  The range of addresses
676   covered by the guard is also ignored. */
677GXResult ML_(evaluate_trivial_GX)( const GExpr* gx, const DebugInfo* di );
678
679/* Compute call frame address (CFA) for IP/SP/FP.  */
680Addr ML_(get_CFA) ( Addr ip, Addr sp, Addr fp,
681                    Addr min_accessible, Addr max_accessible );
682
683#endif /* ndef __PRIV_D3BASICS_H */
684
685/*--------------------------------------------------------------------*/
686/*--- end                                          priv_d3basics.h ---*/
687/*--------------------------------------------------------------------*/
688