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