Home | History | Annotate | Download | only in m_debuginfo
      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 (at) 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     /* 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.  */
    211 typedef 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.  */
    360 typedef 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. */
    394 typedef 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 
    565 HChar* ML_(pp_DW_children) ( DW_children hashch );
    566 HChar* ML_(pp_DW_TAG)      ( DW_TAG tag );
    567 HChar* ML_(pp_DW_FORM)     ( DW_FORM form );
    568 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 */
    605 typedef
    606    struct _GExpr {
    607       UChar payload[0];
    608    }
    609    GExpr;
    610 
    611 /* Show a so-called guarded expression */
    612 void 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. */
    620 typedef
    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 */
    630 typedef
    631    struct {
    632       enum { GXR_Failure, GXR_Addr, GXR_Value, GXR_RegNo } kind;
    633       UWord word;
    634    }
    635    GXResult;
    636 
    637 void 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. */
    651 GXResult 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. */
    661 GXResult 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. */
    673 GXResult ML_(evaluate_trivial_GX)( GExpr* gx, const DebugInfo* di );
    674 
    675 /* Compute call frame address (CFA) for IP/SP/FP.  */
    676 Addr 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