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