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