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    /* VMS extensions.  */
348    DW_AT_VMS_rtnbeg_pd_address = 0x2201,
349    /* UPC extension.  */
350    DW_AT_upc_threads_scaled = 0x3210,
351    /* PGI (STMicroelectronics) extensions.  */
352    DW_AT_PGI_lbase    = 0x3a00,
353    DW_AT_PGI_soffset  = 0x3a01,
354    DW_AT_PGI_lstride  = 0x3a02
355  }
356  DW_AT;
357
358#define DW_AT_lo_user	0x2000	/* Implementation-defined range start.  */
359#define DW_AT_hi_user	0x3ff0	/* Implementation-defined range end.  */
360
361/* Type encodings.  */
362typedef enum
363  {
364    DW_ATE_void = 0x0,
365    DW_ATE_address = 0x1,
366    DW_ATE_boolean = 0x2,
367    DW_ATE_complex_float = 0x3,
368    DW_ATE_float = 0x4,
369    DW_ATE_signed = 0x5,
370    DW_ATE_signed_char = 0x6,
371    DW_ATE_unsigned = 0x7,
372    DW_ATE_unsigned_char = 0x8,
373    /* DWARF 3.  */
374    DW_ATE_imaginary_float = 0x9,
375    DW_ATE_packed_decimal = 0xa,
376    DW_ATE_numeric_string = 0xb,
377    DW_ATE_edited = 0xc,
378    DW_ATE_signed_fixed = 0xd,
379    DW_ATE_unsigned_fixed = 0xe,
380    DW_ATE_decimal_float = 0xf,
381    /* DWARF 4.  */
382    DW_ATE_UTF = 0x10,
383    /* HP extensions.  */
384    DW_ATE_HP_float80            = 0x80, /* Floating-point (80 bit).  */
385    DW_ATE_HP_complex_float80    = 0x81, /* Complex floating-point (80 bit).  */
386    DW_ATE_HP_float128           = 0x82, /* Floating-point (128 bit).  */
387    DW_ATE_HP_complex_float128   = 0x83, /* Complex floating-point (128 bit).  */
388    DW_ATE_HP_floathpintel       = 0x84, /* Floating-point (82 bit IA64).  */
389    DW_ATE_HP_imaginary_float80  = 0x85,
390    DW_ATE_HP_imaginary_float128 = 0x86
391  }
392  DW_ATE;
393
394
395/* Expression operations. */
396typedef enum
397  {
398    DW_OP_addr = 0x03,
399    DW_OP_deref = 0x06,
400    DW_OP_const1u = 0x08,
401    DW_OP_const1s = 0x09,
402    DW_OP_const2u = 0x0a,
403    DW_OP_const2s = 0x0b,
404    DW_OP_const4u = 0x0c,
405    DW_OP_const4s = 0x0d,
406    DW_OP_const8u = 0x0e,
407    DW_OP_const8s = 0x0f,
408    DW_OP_constu = 0x10,
409    DW_OP_consts = 0x11,
410    DW_OP_dup = 0x12,
411    DW_OP_drop = 0x13,
412    DW_OP_over = 0x14,
413    DW_OP_pick = 0x15,
414    DW_OP_swap = 0x16,
415    DW_OP_rot = 0x17,
416    DW_OP_xderef = 0x18,
417    DW_OP_abs = 0x19,
418    DW_OP_and = 0x1a,
419    DW_OP_div = 0x1b,
420    DW_OP_minus = 0x1c,
421    DW_OP_mod = 0x1d,
422    DW_OP_mul = 0x1e,
423    DW_OP_neg = 0x1f,
424    DW_OP_not = 0x20,
425    DW_OP_or = 0x21,
426    DW_OP_plus = 0x22,
427    DW_OP_plus_uconst = 0x23,
428    DW_OP_shl = 0x24,
429    DW_OP_shr = 0x25,
430    DW_OP_shra = 0x26,
431    DW_OP_xor = 0x27,
432    DW_OP_bra = 0x28,
433    DW_OP_eq = 0x29,
434    DW_OP_ge = 0x2a,
435    DW_OP_gt = 0x2b,
436    DW_OP_le = 0x2c,
437    DW_OP_lt = 0x2d,
438    DW_OP_ne = 0x2e,
439    DW_OP_skip = 0x2f,
440    DW_OP_lit0 = 0x30,
441    DW_OP_lit1 = 0x31,
442    DW_OP_lit2 = 0x32,
443    DW_OP_lit3 = 0x33,
444    DW_OP_lit4 = 0x34,
445    DW_OP_lit5 = 0x35,
446    DW_OP_lit6 = 0x36,
447    DW_OP_lit7 = 0x37,
448    DW_OP_lit8 = 0x38,
449    DW_OP_lit9 = 0x39,
450    DW_OP_lit10 = 0x3a,
451    DW_OP_lit11 = 0x3b,
452    DW_OP_lit12 = 0x3c,
453    DW_OP_lit13 = 0x3d,
454    DW_OP_lit14 = 0x3e,
455    DW_OP_lit15 = 0x3f,
456    DW_OP_lit16 = 0x40,
457    DW_OP_lit17 = 0x41,
458    DW_OP_lit18 = 0x42,
459    DW_OP_lit19 = 0x43,
460    DW_OP_lit20 = 0x44,
461    DW_OP_lit21 = 0x45,
462    DW_OP_lit22 = 0x46,
463    DW_OP_lit23 = 0x47,
464    DW_OP_lit24 = 0x48,
465    DW_OP_lit25 = 0x49,
466    DW_OP_lit26 = 0x4a,
467    DW_OP_lit27 = 0x4b,
468    DW_OP_lit28 = 0x4c,
469    DW_OP_lit29 = 0x4d,
470    DW_OP_lit30 = 0x4e,
471    DW_OP_lit31 = 0x4f,
472    DW_OP_reg0 = 0x50,
473    DW_OP_reg1 = 0x51,
474    DW_OP_reg2 = 0x52,
475    DW_OP_reg3 = 0x53,
476    DW_OP_reg4 = 0x54,
477    DW_OP_reg5 = 0x55,
478    DW_OP_reg6 = 0x56,
479    DW_OP_reg7 = 0x57,
480    DW_OP_reg8 = 0x58,
481    DW_OP_reg9 = 0x59,
482    DW_OP_reg10 = 0x5a,
483    DW_OP_reg11 = 0x5b,
484    DW_OP_reg12 = 0x5c,
485    DW_OP_reg13 = 0x5d,
486    DW_OP_reg14 = 0x5e,
487    DW_OP_reg15 = 0x5f,
488    DW_OP_reg16 = 0x60,
489    DW_OP_reg17 = 0x61,
490    DW_OP_reg18 = 0x62,
491    DW_OP_reg19 = 0x63,
492    DW_OP_reg20 = 0x64,
493    DW_OP_reg21 = 0x65,
494    DW_OP_reg22 = 0x66,
495    DW_OP_reg23 = 0x67,
496    DW_OP_reg24 = 0x68,
497    DW_OP_reg25 = 0x69,
498    DW_OP_reg26 = 0x6a,
499    DW_OP_reg27 = 0x6b,
500    DW_OP_reg28 = 0x6c,
501    DW_OP_reg29 = 0x6d,
502    DW_OP_reg30 = 0x6e,
503    DW_OP_reg31 = 0x6f,
504    DW_OP_breg0 = 0x70,
505    DW_OP_breg1 = 0x71,
506    DW_OP_breg2 = 0x72,
507    DW_OP_breg3 = 0x73,
508    DW_OP_breg4 = 0x74,
509    DW_OP_breg5 = 0x75,
510    DW_OP_breg6 = 0x76,
511    DW_OP_breg7 = 0x77,
512    DW_OP_breg8 = 0x78,
513    DW_OP_breg9 = 0x79,
514    DW_OP_breg10 = 0x7a,
515    DW_OP_breg11 = 0x7b,
516    DW_OP_breg12 = 0x7c,
517    DW_OP_breg13 = 0x7d,
518    DW_OP_breg14 = 0x7e,
519    DW_OP_breg15 = 0x7f,
520    DW_OP_breg16 = 0x80,
521    DW_OP_breg17 = 0x81,
522    DW_OP_breg18 = 0x82,
523    DW_OP_breg19 = 0x83,
524    DW_OP_breg20 = 0x84,
525    DW_OP_breg21 = 0x85,
526    DW_OP_breg22 = 0x86,
527    DW_OP_breg23 = 0x87,
528    DW_OP_breg24 = 0x88,
529    DW_OP_breg25 = 0x89,
530    DW_OP_breg26 = 0x8a,
531    DW_OP_breg27 = 0x8b,
532    DW_OP_breg28 = 0x8c,
533    DW_OP_breg29 = 0x8d,
534    DW_OP_breg30 = 0x8e,
535    DW_OP_breg31 = 0x8f,
536    DW_OP_regx = 0x90,
537    DW_OP_fbreg = 0x91,
538    DW_OP_bregx = 0x92,
539    DW_OP_piece = 0x93,
540    DW_OP_deref_size = 0x94,
541    DW_OP_xderef_size = 0x95,
542    DW_OP_nop = 0x96,
543    /* DWARF 3 extensions.  */
544    DW_OP_push_object_address = 0x97,
545    DW_OP_call2 = 0x98,
546    DW_OP_call4 = 0x99,
547    DW_OP_call_ref = 0x9a,
548    DW_OP_form_tls_address = 0x9b,
549    DW_OP_call_frame_cfa = 0x9c,
550    DW_OP_bit_piece = 0x9d,
551    /* DWARF 4 extensions.  */
552    DW_OP_implicit_value = 0x9e,
553    DW_OP_stack_value = 0x9f,
554    /* GNU extensions.  */
555    DW_OP_GNU_push_tls_address = 0xe0,
556    /* HP extensions.  */
557    DW_OP_HP_unknown     = 0xe0, /* Ouch, the same as GNU_push_tls_address.  */
558    DW_OP_HP_is_value    = 0xe1,
559    DW_OP_HP_fltconst4   = 0xe2,
560    DW_OP_HP_fltconst8   = 0xe3,
561    DW_OP_HP_mod_range   = 0xe4,
562    DW_OP_HP_unmod_range = 0xe5,
563    DW_OP_HP_tls         = 0xe6
564  }
565  DW_OP;
566
567const HChar* ML_(pp_DW_children) ( DW_children hashch );
568const HChar* ML_(pp_DW_TAG)      ( DW_TAG tag );
569const HChar* ML_(pp_DW_FORM)     ( DW_FORM form );
570const HChar* ML_(pp_DW_AT)       ( DW_AT attr );
571
572
573/* --- To do with evaluation of Dwarf expressions --- */
574
575/* Guarded Dwarf3 expressions, which can be linked together to form a
576   list.  The payload field contains a variable length array of bytes
577   which hold the guarded expressions.  The length can be inferred by
578   inspecting the payload bytes and so does not need to be stored
579   explicitly.
580
581   Guarded-Expression format is similar but not identical to the
582   DWARF3 location-list format.  The format of each returned block is:
583
584      UChar biasMe;
585      UChar isEnd;
586      followed by zero or more of
587
588      (Addr aMin;  Addr aMax;  UShort nbytes;  ..bytes..;  UChar isEnd)
589
590   '..bytes..' is an standard DWARF3 location expression which is
591   valid when aMin <= pc <= aMax (possibly after suitable biasing).
592
593   The number of bytes in '..bytes..' is nbytes.
594
595   The end of the sequence is marked by an isEnd == 1 value.  All
596   previous isEnd values must be zero.
597
598   biasMe is 1 if the aMin/aMax fields need this DebugInfo's text_bias
599   added before use, and 0 if the GX is this is not necessary (is
600   ready to go).
601
602   Hence the block can be quickly parsed and is self-describing.  Note
603   that aMax is 1 less than the corresponding value in a DWARF3
604   location list.  Zero length ranges, with aMax == aMin-1, are not
605   allowed.
606*/
607typedef
608   struct _GExpr {
609      UChar payload[0];
610   }
611   GExpr;
612
613/* Show a so-called guarded expression */
614void ML_(pp_GX) ( GExpr* gx );
615
616/* Evaluation of a DWARF3 expression (and hence of a GExpr) may
617   require knowing a suitably contextualising set of values for the
618   instruction, frame and stack pointers (and, in general, all
619   registers, though we punt on such generality here).  Here's a
620   struct to carry the bare essentials.  ip, fp and sp are expected to
621   be provided for all platforms. */
622typedef
623   struct { Addr ip; Addr sp; Addr fp; }
624   RegSummary;
625
626/* This describes the result of evaluating a DWARF3 expression.
627   GXR_Failure: failed; .word is an asciiz string summarising why
628   GXR_Addr:    evaluated to an address of the object, in .word
629   GXR_Value:   evaluated to a value, in .word
630   GXR_RegNo:   evaluated to a DWARF3 register number, in .word
631*/
632typedef
633   struct {
634      enum { GXR_Failure, GXR_Addr, GXR_Value, GXR_RegNo } kind;
635      UWord word;
636   }
637   GXResult;
638
639void ML_(pp_GXResult) ( GXResult res );
640
641/* Evaluate a guarded expression.  If regs is NULL, then gx is assumed
642   (and checked) to contain just a single guarded expression, with a
643   guard which covers the entire address space and so always evaluates
644   to True (iow, gx is a single unconditional expression).  If regs is
645   non-NULL then its .ip value is used to select which of the
646   embedded DWARF3 location expressions to use, and that is duly
647   evaluated.
648
649   If as part of the evaluation, a frame base value needs to be
650   computed, then fbGX can provide an expression for it.  If fbGX is
651   NULL but the frame base is still needed, then evaluation of gx as a
652   whole will fail. */
653GXResult ML_(evaluate_GX)( GExpr* gx, GExpr* fbGX,
654                           RegSummary* regs, const DebugInfo* di );
655
656/* This is a subsidiary of ML_(evaluate_GX), which just evaluates a
657   single standard DWARF3 expression.  Conventions w.r.t regs and fbGX
658   are as for ML_(evaluate_GX).  If push_initial_zero is True, then an
659   initial zero word is pushed on the evaluation stack at the start.
660   This is needed for computing structure field offsets.  Note that
661   ML_(evaluate_GX) and ML_(evaluate_Dwarf3_Expr) are mutually
662   recursive. */
663GXResult ML_(evaluate_Dwarf3_Expr) ( UChar* expr, UWord exprszB,
664                                     GExpr* fbGX, RegSummary* regs,
665                                     const DebugInfo* di,
666                                     Bool push_initial_zero );
667
668/* Evaluate a very simple Guarded (DWARF3) expression.  The expression
669   is expected to denote a constant, with no reference to any
670   registers nor to any frame base expression.  GXR_Failure is
671   returned if there is more than one guard, or none, a register
672   location is denoted, a frame base expression is required, or the
673   expression is not manifestly a constant.  The range of addresses
674   covered by the guard is also ignored. */
675GXResult ML_(evaluate_trivial_GX)( GExpr* gx, const DebugInfo* di );
676
677/* Compute call frame address (CFA) for IP/SP/FP.  */
678Addr ML_(get_CFA) ( Addr ip, Addr sp, Addr fp,
679                    Addr min_accessible, Addr max_accessible );
680
681#endif /* ndef __PRIV_D3BASICS_H */
682
683/*--------------------------------------------------------------------*/
684/*--- end                                          priv_d3basics.h ---*/
685/*--------------------------------------------------------------------*/
686