Home | History | Annotate | Download | only in elf
      1 /* Declarations and definitions of codes relating to the DWARF symbolic
      2    debugging information format.
      3 
      4    Written by Ron Guilmette (rfg (at) netcom.com)
      5 
      6    Copyright (C) 1992-2016 Free Software Foundation, Inc.
      7 
      8    This file is part of both GCC and the BFD library.
      9 
     10    This program is free software; you can redistribute it and/or modify
     11    it under the terms of the GNU General Public License as published by
     12    the Free Software Foundation; either version 3 of the License, or
     13    (at your option) any later version.
     14 
     15    This program is distributed in the hope that it will be useful,
     16    but WITHOUT ANY WARRANTY; without even the implied warranty of
     17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18    GNU General Public License for more details.
     19 
     20    You should have received a copy of the GNU General Public License
     21    along with GCC; see the file COPYING3.  If not, write to the Free
     22    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
     23    02110-1301, USA.  */
     24 
     25 /* This file is derived from the DWARF specification (a public document)
     26    Revision 1.0.1 (April 8, 1992) developed by the UNIX International
     27    Programming Languages Special Interest Group (UI/PLSIG) and distributed
     28    by UNIX International.  Copies of this specification are available from
     29    UNIX International, 20 Waterview Boulevard, Parsippany, NJ, 07054.  */
     30 
     31 #ifndef _ELF_DWARF_H
     32 #define _ELF_DWARF_H
     33 
     34 /* Tag names and codes.  */
     35 
     36 enum dwarf_tag {
     37     TAG_padding			= 0x0000,
     38     TAG_array_type		= 0x0001,
     39     TAG_class_type		= 0x0002,
     40     TAG_entry_point		= 0x0003,
     41     TAG_enumeration_type	= 0x0004,
     42     TAG_formal_parameter	= 0x0005,
     43     TAG_global_subroutine	= 0x0006,
     44     TAG_global_variable		= 0x0007,
     45     				/* 0x0008 -- reserved */
     46 				/* 0x0009 -- reserved */
     47     TAG_label			= 0x000a,
     48     TAG_lexical_block		= 0x000b,
     49     TAG_local_variable		= 0x000c,
     50     TAG_member			= 0x000d,
     51 				/* 0x000e -- reserved */
     52     TAG_pointer_type		= 0x000f,
     53     TAG_reference_type		= 0x0010,
     54     TAG_compile_unit		= 0x0011,
     55     TAG_string_type		= 0x0012,
     56     TAG_structure_type		= 0x0013,
     57     TAG_subroutine		= 0x0014,
     58     TAG_subroutine_type		= 0x0015,
     59     TAG_typedef			= 0x0016,
     60     TAG_union_type		= 0x0017,
     61     TAG_unspecified_parameters	= 0x0018,
     62     TAG_variant			= 0x0019,
     63     TAG_common_block		= 0x001a,
     64     TAG_common_inclusion	= 0x001b,
     65     TAG_inheritance		= 0x001c,
     66     TAG_inlined_subroutine	= 0x001d,
     67     TAG_module			= 0x001e,
     68     TAG_ptr_to_member_type	= 0x001f,
     69     TAG_set_type		= 0x0020,
     70     TAG_subrange_type		= 0x0021,
     71     TAG_with_stmt		= 0x0022,
     72 
     73     /* GNU extensions */
     74 
     75     TAG_format_label		= 0x8000,  /* for FORTRAN 77 and Fortran 90 */
     76     TAG_namelist		= 0x8001,  /* For Fortran 90 */
     77     TAG_function_template	= 0x8002,  /* for C++ */
     78     TAG_class_template		= 0x8003   /* for C++ */
     79 };
     80 
     81 #define TAG_lo_user	0x8000  /* implementation-defined range start */
     82 #define TAG_hi_user	0xffff  /* implementation-defined range end */
     83 #define TAG_source_file TAG_compile_unit  /* for backward compatibility */
     84 
     85 /* Form names and codes.  */
     86 
     87 enum dwarf_form {
     88     FORM_ADDR	= 0x1,
     89     FORM_REF	= 0x2,
     90     FORM_BLOCK2	= 0x3,
     91     FORM_BLOCK4	= 0x4,
     92     FORM_DATA2	= 0x5,
     93     FORM_DATA4	= 0x6,
     94     FORM_DATA8	= 0x7,
     95     FORM_STRING	= 0x8
     96 };
     97 
     98 /* Attribute names and codes.  */
     99 
    100 enum dwarf_attribute {
    101     AT_sibling			= (0x0010|FORM_REF),
    102     AT_location			= (0x0020|FORM_BLOCK2),
    103     AT_name			= (0x0030|FORM_STRING),
    104     AT_fund_type		= (0x0050|FORM_DATA2),
    105     AT_mod_fund_type		= (0x0060|FORM_BLOCK2),
    106     AT_user_def_type		= (0x0070|FORM_REF),
    107     AT_mod_u_d_type		= (0x0080|FORM_BLOCK2),
    108     AT_ordering			= (0x0090|FORM_DATA2),
    109     AT_subscr_data		= (0x00a0|FORM_BLOCK2),
    110     AT_byte_size		= (0x00b0|FORM_DATA4),
    111     AT_bit_offset		= (0x00c0|FORM_DATA2),
    112     AT_bit_size			= (0x00d0|FORM_DATA4),
    113 				/* (0x00e0|FORM_xxxx) -- reserved */
    114     AT_element_list		= (0x00f0|FORM_BLOCK4),
    115     AT_stmt_list		= (0x0100|FORM_DATA4),
    116     AT_low_pc			= (0x0110|FORM_ADDR),
    117     AT_high_pc			= (0x0120|FORM_ADDR),
    118     AT_language			= (0x0130|FORM_DATA4),
    119     AT_member			= (0x0140|FORM_REF),
    120     AT_discr			= (0x0150|FORM_REF),
    121     AT_discr_value		= (0x0160|FORM_BLOCK2),
    122 				/* (0x0170|FORM_xxxx) -- reserved */
    123 				/* (0x0180|FORM_xxxx) -- reserved */
    124     AT_string_length		= (0x0190|FORM_BLOCK2),
    125     AT_common_reference		= (0x01a0|FORM_REF),
    126     AT_comp_dir			= (0x01b0|FORM_STRING),
    127         AT_const_value_string	= (0x01c0|FORM_STRING),
    128         AT_const_value_data2	= (0x01c0|FORM_DATA2),
    129         AT_const_value_data4	= (0x01c0|FORM_DATA4),
    130         AT_const_value_data8	= (0x01c0|FORM_DATA8),
    131         AT_const_value_block2	= (0x01c0|FORM_BLOCK2),
    132         AT_const_value_block4	= (0x01c0|FORM_BLOCK4),
    133     AT_containing_type		= (0x01d0|FORM_REF),
    134         AT_default_value_addr	= (0x01e0|FORM_ADDR),
    135         AT_default_value_data2	= (0x01e0|FORM_DATA2),
    136         AT_default_value_data4	= (0x01e0|FORM_DATA4),
    137         AT_default_value_data8	= (0x01e0|FORM_DATA8),
    138         AT_default_value_string	= (0x01e0|FORM_STRING),
    139     AT_friends			= (0x01f0|FORM_BLOCK2),
    140     AT_inline			= (0x0200|FORM_STRING),
    141     AT_is_optional		= (0x0210|FORM_STRING),
    142         AT_lower_bound_ref	= (0x0220|FORM_REF),
    143         AT_lower_bound_data2	= (0x0220|FORM_DATA2),
    144         AT_lower_bound_data4	= (0x0220|FORM_DATA4),
    145         AT_lower_bound_data8	= (0x0220|FORM_DATA8),
    146     AT_private			= (0x0240|FORM_STRING),
    147     AT_producer			= (0x0250|FORM_STRING),
    148     AT_program			= (0x0230|FORM_STRING),
    149     AT_protected		= (0x0260|FORM_STRING),
    150     AT_prototyped		= (0x0270|FORM_STRING),
    151     AT_public			= (0x0280|FORM_STRING),
    152     AT_pure_virtual		= (0x0290|FORM_STRING),
    153     AT_return_addr		= (0x02a0|FORM_BLOCK2),
    154     AT_abstract_origin		= (0x02b0|FORM_REF),
    155     AT_start_scope		= (0x02c0|FORM_DATA4),
    156     AT_stride_size		= (0x02e0|FORM_DATA4),
    157         AT_upper_bound_ref	= (0x02f0|FORM_REF),
    158         AT_upper_bound_data2	= (0x02f0|FORM_DATA2),
    159         AT_upper_bound_data4	= (0x02f0|FORM_DATA4),
    160         AT_upper_bound_data8	= (0x02f0|FORM_DATA8),
    161     AT_virtual			= (0x0300|FORM_STRING),
    162 
    163     /* GNU extensions.  */
    164 
    165     AT_sf_names			= (0x8000|FORM_DATA4),
    166     AT_src_info			= (0x8010|FORM_DATA4),
    167     AT_mac_info			= (0x8020|FORM_DATA4),
    168     AT_src_coords		= (0x8030|FORM_DATA4),
    169     AT_body_begin		= (0x8040|FORM_ADDR),
    170     AT_body_end			= (0x8050|FORM_ADDR)
    171 };
    172 
    173 #define AT_lo_user	0x2000	/* implementation-defined range start */
    174 #define AT_hi_user	0x3ff0	/* implementation-defined range end */
    175 
    176 /* Location atom names and codes.  */
    177 
    178 enum dwarf_location_atom {
    179     OP_REG	= 0x01,
    180     OP_BASEREG	= 0x02,
    181     OP_ADDR	= 0x03,
    182     OP_CONST	= 0x04,
    183     OP_DEREF2	= 0x05,
    184     OP_DEREF4	= 0x06,
    185     OP_ADD	= 0x07,
    186 
    187     /* GNU extensions.  */
    188 
    189     OP_MULT	= 0x80
    190 };
    191 
    192 #define OP_LO_USER	0x80  /* implementation-defined range start */
    193 #define OP_HI_USER	0xff  /* implementation-defined range end */
    194 
    195 /* Fundamental type names and codes.  */
    196 
    197 enum dwarf_fundamental_type {
    198     FT_char		= 0x0001,
    199     FT_signed_char	= 0x0002,
    200     FT_unsigned_char	= 0x0003,
    201     FT_short		= 0x0004,
    202     FT_signed_short	= 0x0005,
    203     FT_unsigned_short	= 0x0006,
    204     FT_integer		= 0x0007,
    205     FT_signed_integer	= 0x0008,
    206     FT_unsigned_integer	= 0x0009,
    207     FT_long		= 0x000a,
    208     FT_signed_long	= 0x000b,
    209     FT_unsigned_long	= 0x000c,
    210     FT_pointer		= 0x000d,  /* an alias for (void *) */
    211     FT_float		= 0x000e,
    212     FT_dbl_prec_float	= 0x000f,
    213     FT_ext_prec_float	= 0x0010,  /* breaks "classic" svr4 SDB */
    214     FT_complex		= 0x0011,  /* breaks "classic" svr4 SDB */
    215     FT_dbl_prec_complex	= 0x0012,  /* breaks "classic" svr4 SDB */
    216 			/* 0x0013 -- reserved */
    217     FT_void		= 0x0014,
    218     FT_boolean		= 0x0015,  /* breaks "classic" svr4 SDB */
    219     FT_ext_prec_complex	= 0x0016,  /* breaks "classic" svr4 SDB */
    220     FT_label		= 0x0017,
    221 
    222     /* GNU extensions
    223        The low order byte must indicate the size (in bytes) for the type.
    224        All of these types will probably break "classic" svr4 SDB.  */
    225 
    226     FT_long_long	= 0x8008,
    227     FT_signed_long_long	= 0x8108,
    228     FT_unsigned_long_long = 0x8208,
    229 
    230     FT_int8		= 0x9001,
    231     FT_signed_int8	= 0x9101,
    232     FT_unsigned_int8	= 0x9201,
    233     FT_int16		= 0x9302,
    234     FT_signed_int16	= 0x9402,
    235     FT_unsigned_int16	= 0x9502,
    236     FT_int32		= 0x9604,
    237     FT_signed_int32	= 0x9704,
    238     FT_unsigned_int32	= 0x9804,
    239     FT_int64		= 0x9908,
    240     FT_signed_int64	= 0x9a08,
    241     FT_unsigned_int64	= 0x9b08,
    242     FT_int128		= 0x9c10,
    243     FT_signed_int128	= 0x9d10,
    244     FT_unsigned_int128	= 0x9e10,
    245 
    246     FT_real32		= 0xa004,
    247     FT_real64		= 0xa108,
    248     FT_real96		= 0xa20c,
    249     FT_real128		= 0xa310
    250 };
    251 
    252 #define FT_lo_user	0x8000  /* implementation-defined range start */
    253 #define FT_hi_user	0xffff  /* implementation defined range end */
    254 
    255 /* Type modifier names and codes.  */
    256 
    257 enum dwarf_type_modifier {
    258     MOD_pointer_to	= 0x01,
    259     MOD_reference_to	= 0x02,
    260     MOD_const		= 0x03,
    261     MOD_volatile	= 0x04
    262 };
    263 
    264 #define MOD_lo_user	0x80  /* implementation-defined range start */
    265 #define MOD_hi_user	0xff  /* implementation-defined range end */
    266 
    267 /* Array ordering names and codes.  */
    268 
    269 enum dwarf_array_dim_ordering {
    270     ORD_row_major	= 0,
    271     ORD_col_major	= 1
    272 };
    273 
    274 /* Array subscript format names and codes.  */
    275 
    276 enum dwarf_subscr_data_formats {
    277     FMT_FT_C_C	= 0x0,
    278     FMT_FT_C_X	= 0x1,
    279     FMT_FT_X_C	= 0x2,
    280     FMT_FT_X_X	= 0x3,
    281     FMT_UT_C_C	= 0x4,
    282     FMT_UT_C_X	= 0x5,
    283     FMT_UT_X_C	= 0x6,
    284     FMT_UT_X_X	= 0x7,
    285     FMT_ET	= 0x8
    286 };
    287 
    288 /* Derived from above for ease of use.  */
    289 
    290 #define FMT_CODE(_FUNDAMENTAL_TYPE_P, _LB_CONST_P, _UB_CONST_P) \
    291  (((_FUNDAMENTAL_TYPE_P) ? 0 : 4)	\
    292   | ((_LB_CONST_P) ? 0 : 2)		\
    293   | ((_UB_CONST_P) ? 0 : 1))
    294 
    295 /* Source language names and codes.  */
    296 
    297 enum dwarf_source_language {
    298     LANG_C89		= 0x00000001,
    299     LANG_C		= 0x00000002,
    300     LANG_ADA83		= 0x00000003,
    301     LANG_C_PLUS_PLUS	= 0x00000004,
    302     LANG_COBOL74	= 0x00000005,
    303     LANG_COBOL85	= 0x00000006,
    304     LANG_FORTRAN77	= 0x00000007,
    305     LANG_FORTRAN90	= 0x00000008,
    306     LANG_PASCAL83	= 0x00000009,
    307     LANG_MODULA2	= 0x0000000a,
    308     LANG_JAVA		= 0x0000000b
    309 };
    310 
    311 #define LANG_lo_user	0x00008000  /* implementation-defined range start */
    312 #define LANG_hi_user	0x0000ffff  /* implementation-defined range end */
    313 
    314 /* Names and codes for GNU "macinfo" extension.  */
    315 
    316 enum dwarf_macinfo_record_type {
    317     MACINFO_start	= 's',
    318     MACINFO_resume	= 'r',
    319     MACINFO_define	= 'd',
    320     MACINFO_undef	= 'u'
    321 };
    322 
    323 #endif /* _ELF_DWARF_H */
    324