* dwarf2.h: Mention the location of the DWARF3 spec on the web.
(DW_AT_stride_size): Rename to DW_AT_bit_stride. (DW_AT_stride): Rename to DW_AT_byte_stride. * dwarf.c (process_extended_line_op): Add cases for HP extensions to the line ops. Mention if an unknown op code is in the user defined range. (decode_location_expression): Add cases for HP extensions, the DW_OP_GNU_uninit extension and the DW_OP_call_frame_cfa and DW_OP_bit_piece DWARF3 operators. (read_and_display_attr): Correct list of attributes which can reference a location list. (read_and_display_attr_value): Add cases for DWARF3 values and HP extensions. Correct list of attributes which can reference a location list. (get_AT_name): Add cases for DWARF3 values and HP and PGI extensions.
This commit is contained in:
parent
62d7f7907a
commit
e2a0d921a7
4 changed files with 198 additions and 32 deletions
|
@ -1,3 +1,19 @@
|
|||
2007-11-16 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* dwarf.c (process_extended_line_op): Add cases for HP extensions
|
||||
to the line ops. Mention if an unknown op code is in the user
|
||||
defined range.
|
||||
(decode_location_expression): Add cases for HP extensions, the
|
||||
DW_OP_GNU_uninit extension and the DW_OP_call_frame_cfa and
|
||||
DW_OP_bit_piece DWARF3 operators.
|
||||
(read_and_display_attr): Correct list of attributes which can
|
||||
reference a location list.
|
||||
(read_and_display_attr_value): Add cases for DWARF3 values and HP
|
||||
extensions.
|
||||
Correct list of attributes which can reference a location list.
|
||||
(get_AT_name): Add cases for DWARF3 values and HP and PGI
|
||||
extensions.
|
||||
|
||||
2007-11-07 Karl Berry <karl@gnu.org>
|
||||
|
||||
* doc/binutils.texi: Update to FDL 1.2.
|
||||
|
|
199
binutils/dwarf.c
199
binutils/dwarf.c
|
@ -270,8 +270,47 @@ process_extended_line_op (unsigned char *data, int is_stmt)
|
|||
printf (_("%s\n\n"), name);
|
||||
break;
|
||||
|
||||
/* HP extensions. */
|
||||
case DW_LNE_HP_negate_is_UV_update:
|
||||
printf ("DW_LNE_HP_negate_is_UV_update");
|
||||
break;
|
||||
case DW_LNE_HP_push_context:
|
||||
printf ("DW_LNE_HP_push_context");
|
||||
break;
|
||||
case DW_LNE_HP_pop_context:
|
||||
printf ("DW_LNE_HP_pop_context");
|
||||
break;
|
||||
case DW_LNE_HP_set_file_line_column:
|
||||
printf ("DW_LNE_HP_set_file_line_column");
|
||||
break;
|
||||
case DW_LNE_HP_set_routine_name:
|
||||
printf ("DW_LNE_HP_set_routine_name");
|
||||
break;
|
||||
case DW_LNE_HP_set_sequence:
|
||||
printf ("DW_LNE_HP_set_sequence");
|
||||
break;
|
||||
case DW_LNE_HP_negate_post_semantics:
|
||||
printf ("DW_LNE_HP_negate_post_semantics");
|
||||
break;
|
||||
case DW_LNE_HP_negate_function_exit:
|
||||
printf ("DW_LNE_HP_negate_function_exit");
|
||||
break;
|
||||
case DW_LNE_HP_negate_front_end_logical:
|
||||
printf ("DW_LNE_HP_negate_front_end_logical");
|
||||
break;
|
||||
case DW_LNE_HP_define_proc:
|
||||
printf ("DW_LNE_HP_define_proc");
|
||||
break;
|
||||
|
||||
default:
|
||||
printf (_("UNKNOWN: length %d\n"), len - bytes_read);
|
||||
if (op_code >= DW_LNE_lo_user
|
||||
/* The test against DW_LNW_hi_user is redundant due to
|
||||
the limited range of the unsigned char data type used
|
||||
for op_code. */
|
||||
/*&& op_code <= DW_LNE_hi_user*/)
|
||||
printf (_("user defined: length %d\n"), len - bytes_read);
|
||||
else
|
||||
printf (_("UNKNOWN: length %d\n"), len - bytes_read);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -892,15 +931,58 @@ decode_location_expression (unsigned char * data,
|
|||
data += 4;
|
||||
break;
|
||||
case DW_OP_call_ref:
|
||||
printf ("DW_OP_call_ref");
|
||||
/* XXX: Strictly speaking for 64-bit DWARF3 files
|
||||
this ought to be an 8-byte wide computation. */
|
||||
printf ("DW_OP_call_ref: <%lx>", (long) byte_get (data, 4) + cu_offset);
|
||||
data += 4;
|
||||
break;
|
||||
case DW_OP_form_tls_address:
|
||||
printf ("DW_OP_form_tls_address");
|
||||
break;
|
||||
case DW_OP_call_frame_cfa:
|
||||
printf ("DW_OP_call_frame_cfa");
|
||||
break;
|
||||
case DW_OP_bit_piece:
|
||||
printf ("DW_OP_bit_piece: ");
|
||||
printf ("size: %lu ", read_leb128 (data, &bytes_read, 0));
|
||||
data += bytes_read;
|
||||
printf ("offset: %lu ", read_leb128 (data, &bytes_read, 0));
|
||||
data += bytes_read;
|
||||
break;
|
||||
|
||||
/* GNU extensions. */
|
||||
case DW_OP_GNU_push_tls_address:
|
||||
printf ("DW_OP_GNU_push_tls_address");
|
||||
printf ("DW_OP_GNU_push_tls_address or DW_OP_HP_unknown");
|
||||
break;
|
||||
case DW_OP_GNU_uninit:
|
||||
printf ("DW_OP_GNU_uninit");
|
||||
/* FIXME: Is there data associated with this OP ? */
|
||||
break;
|
||||
|
||||
/* HP extensions. */
|
||||
case DW_OP_HP_is_value:
|
||||
printf ("DW_OP_HP_is_value");
|
||||
/* FIXME: Is there data associated with this OP ? */
|
||||
break;
|
||||
case DW_OP_HP_fltconst4:
|
||||
printf ("DW_OP_HP_fltconst4");
|
||||
/* FIXME: Is there data associated with this OP ? */
|
||||
break;
|
||||
case DW_OP_HP_fltconst8:
|
||||
printf ("DW_OP_HP_fltconst8");
|
||||
/* FIXME: Is there data associated with this OP ? */
|
||||
break;
|
||||
case DW_OP_HP_mod_range:
|
||||
printf ("DW_OP_HP_mod_range");
|
||||
/* FIXME: Is there data associated with this OP ? */
|
||||
break;
|
||||
case DW_OP_HP_unmod_range:
|
||||
printf ("DW_OP_HP_unmod_range");
|
||||
/* FIXME: Is there data associated with this OP ? */
|
||||
break;
|
||||
case DW_OP_HP_tls:
|
||||
printf ("DW_OP_HP_tls");
|
||||
/* FIXME: Is there data associated with this OP ? */
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -1123,15 +1205,14 @@ read_and_display_attr_value (unsigned long attribute,
|
|||
case DW_AT_frame_base:
|
||||
have_frame_base = 1;
|
||||
case DW_AT_location:
|
||||
case DW_AT_string_length:
|
||||
case DW_AT_return_addr:
|
||||
case DW_AT_data_member_location:
|
||||
case DW_AT_vtable_elem_location:
|
||||
case DW_AT_allocated:
|
||||
case DW_AT_associated:
|
||||
case DW_AT_data_location:
|
||||
case DW_AT_stride:
|
||||
case DW_AT_upper_bound:
|
||||
case DW_AT_lower_bound:
|
||||
if (form == DW_FORM_data4 || form == DW_FORM_data8)
|
||||
case DW_AT_segment:
|
||||
case DW_AT_static_link:
|
||||
case DW_AT_use_location:
|
||||
if (form == DW_FORM_data4 || form == DW_FORM_data8)
|
||||
{
|
||||
/* Process location list. */
|
||||
unsigned int max = debug_info_p->max_loc_offsets;
|
||||
|
@ -1153,7 +1234,7 @@ read_and_display_attr_value (unsigned long attribute,
|
|||
debug_info_p->num_loc_offsets++;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case DW_AT_low_pc:
|
||||
if (need_base_address)
|
||||
debug_info_p->base_address = uvalue;
|
||||
|
@ -1262,9 +1343,24 @@ read_and_display_attr_value (unsigned long attribute,
|
|||
case DW_ATE_signed_char: printf ("(signed char)"); break;
|
||||
case DW_ATE_unsigned: printf ("(unsigned)"); break;
|
||||
case DW_ATE_unsigned_char: printf ("(unsigned char)"); break;
|
||||
/* DWARF 2.1 value. */
|
||||
/* DWARF 2.1 values: */
|
||||
case DW_ATE_imaginary_float: printf ("(imaginary float)"); break;
|
||||
case DW_ATE_decimal_float: printf ("(decimal float)"); break;
|
||||
/* DWARF 3 values: */
|
||||
case DW_ATE_packed_decimal: printf ("(packed_decimal)"); break;
|
||||
case DW_ATE_numeric_string: printf ("(numeric_string)"); break;
|
||||
case DW_ATE_edited: printf ("(edited)"); break;
|
||||
case DW_ATE_signed_fixed: printf ("(signed_fixed)"); break;
|
||||
case DW_ATE_unsigned_fixed: printf ("(unsigned_fixed)"); break;
|
||||
/* HP extensions: */
|
||||
case DW_ATE_HP_float80: printf ("(HP_float80)"); break;
|
||||
case DW_ATE_HP_complex_float80: printf ("(HP_complex_float80)"); break;
|
||||
case DW_ATE_HP_float128: printf ("(HP_float128)"); break;
|
||||
case DW_ATE_HP_complex_float128:printf ("(HP_complex_float128)"); break;
|
||||
case DW_ATE_HP_floathpintel: printf ("(HP_floathpintel)"); break;
|
||||
case DW_ATE_HP_imaginary_float80: printf ("(HP_imaginary_float80)"); break;
|
||||
case DW_ATE_HP_imaginary_float128: printf ("(HP_imaginary_float128)"); break;
|
||||
|
||||
default:
|
||||
if (uvalue >= DW_ATE_lo_user
|
||||
&& uvalue <= DW_ATE_hi_user)
|
||||
|
@ -1345,14 +1441,22 @@ read_and_display_attr_value (unsigned long attribute,
|
|||
case DW_AT_frame_base:
|
||||
have_frame_base = 1;
|
||||
case DW_AT_location:
|
||||
case DW_AT_string_length:
|
||||
case DW_AT_return_addr:
|
||||
case DW_AT_data_member_location:
|
||||
case DW_AT_vtable_elem_location:
|
||||
case DW_AT_segment:
|
||||
case DW_AT_static_link:
|
||||
case DW_AT_use_location:
|
||||
if (form == DW_FORM_data4 || form == DW_FORM_data8)
|
||||
printf (_("(location list)"));
|
||||
/* Fall through. */
|
||||
case DW_AT_allocated:
|
||||
case DW_AT_associated:
|
||||
case DW_AT_data_location:
|
||||
case DW_AT_stride:
|
||||
case DW_AT_upper_bound:
|
||||
case DW_AT_lower_bound:
|
||||
case DW_AT_lower_bound:
|
||||
if (block_start)
|
||||
{
|
||||
int need_frame_base;
|
||||
|
@ -1366,9 +1470,6 @@ read_and_display_attr_value (unsigned long attribute,
|
|||
if (need_frame_base && !have_frame_base)
|
||||
printf (_(" [without DW_AT_frame_base]"));
|
||||
}
|
||||
else if (form == DW_FORM_data4 || form == DW_FORM_data8)
|
||||
printf (_("(location list)"));
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -1458,19 +1559,52 @@ get_AT_name (unsigned long attribute)
|
|||
case DW_AT_call_column: return "DW_AT_call_column";
|
||||
case DW_AT_call_file: return "DW_AT_call_file";
|
||||
case DW_AT_call_line: return "DW_AT_call_line";
|
||||
/* SGI/MIPS extensions. */
|
||||
case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
|
||||
case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
|
||||
case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
|
||||
case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
|
||||
case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
|
||||
case DW_AT_MIPS_software_pipeline_depth:
|
||||
return "DW_AT_MIPS_software_pipeline_depth";
|
||||
case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
|
||||
case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
|
||||
case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
|
||||
case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
|
||||
case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
|
||||
case DW_AT_description: return "DW_AT_description";
|
||||
case DW_AT_binary_scale: return "DW_AT_binary_scale";
|
||||
case DW_AT_decimal_scale: return "DW_AT_decimal_scale";
|
||||
case DW_AT_small: return "DW_AT_small";
|
||||
case DW_AT_decimal_sign: return "DW_AT_decimal_sign";
|
||||
case DW_AT_digit_count: return "DW_AT_digit_count";
|
||||
case DW_AT_picture_string: return "DW_AT_picture_string";
|
||||
case DW_AT_mutable: return "DW_AT_mutable";
|
||||
case DW_AT_threads_scaled: return "DW_AT_threads_scaled";
|
||||
case DW_AT_explicit: return "DW_AT_explicit";
|
||||
case DW_AT_object_pointer: return "DW_AT_object_pointer";
|
||||
case DW_AT_endianity: return "DW_AT_endianity";
|
||||
case DW_AT_elemental: return "DW_AT_elemental";
|
||||
case DW_AT_pure: return "DW_AT_pure";
|
||||
case DW_AT_recursive: return "DW_AT_recursive";
|
||||
|
||||
/* HP and SGI/MIPS extensions. */
|
||||
case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
|
||||
case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
|
||||
case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
|
||||
case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
|
||||
case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
|
||||
case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
|
||||
case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
|
||||
case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
|
||||
case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
|
||||
case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
|
||||
|
||||
/* HP Extensions. */
|
||||
case DW_AT_HP_block_index: return "DW_AT_HP_block_index";
|
||||
case DW_AT_HP_actuals_stmt_list: return "DW_AT_HP_actuals_stmt_list";
|
||||
case DW_AT_HP_proc_per_section: return "DW_AT_HP_proc_per_section";
|
||||
case DW_AT_HP_raw_data_ptr: return "DW_AT_HP_raw_data_ptr";
|
||||
case DW_AT_HP_pass_by_reference: return "DW_AT_HP_pass_by_reference";
|
||||
case DW_AT_HP_opt_level: return "DW_AT_HP_opt_level";
|
||||
case DW_AT_HP_prof_version_id: return "DW_AT_HP_prof_version_id";
|
||||
case DW_AT_HP_opt_flags: return "DW_AT_HP_opt_flags";
|
||||
case DW_AT_HP_cold_region_low_pc: return "DW_AT_HP_cold_region_low_pc";
|
||||
case DW_AT_HP_cold_region_high_pc: return "DW_AT_HP_cold_region_high_pc";
|
||||
case DW_AT_HP_all_variables_modifiable: return "DW_AT_HP_all_variables_modifiable";
|
||||
case DW_AT_HP_linkage_name: return "DW_AT_HP_linkage_name";
|
||||
case DW_AT_HP_prof_flags: return "DW_AT_HP_prof_flags";
|
||||
|
||||
/* One value is shared by the MIPS and HP extensions: */
|
||||
case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde or DW_AT_HP_unmodifiable";
|
||||
|
||||
/* GNU extensions. */
|
||||
case DW_AT_sf_names: return "DW_AT_sf_names";
|
||||
case DW_AT_src_info: return "DW_AT_src_info";
|
||||
|
@ -1479,8 +1613,15 @@ get_AT_name (unsigned long attribute)
|
|||
case DW_AT_body_begin: return "DW_AT_body_begin";
|
||||
case DW_AT_body_end: return "DW_AT_body_end";
|
||||
case DW_AT_GNU_vector: return "DW_AT_GNU_vector";
|
||||
|
||||
/* UPC extension. */
|
||||
case DW_AT_upc_threads_scaled: return "DW_AT_upc_threads_scaled";
|
||||
|
||||
/* PGI (STMicroelectronics) extensions. */
|
||||
case DW_AT_PGI_lbase: return "DW_AT_PGI_lbase";
|
||||
case DW_AT_PGI_soffset: return "DW_AT_PGI_soffset";
|
||||
case DW_AT_PGI_lstride: return "DW_AT_PGI_lstride";
|
||||
|
||||
default:
|
||||
{
|
||||
static char buffer[100];
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2007-11-16 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* dwarf2.h: Mention the location of the DWARF3 spec on the web.
|
||||
(DW_AT_stride_size): Rename to DW_AT_bit_stride.
|
||||
(DW_AT_stride): Rename to DW_AT_byte_stride.
|
||||
|
||||
2007-11-08 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
* vxworks.h: New.
|
||||
|
|
|
@ -33,7 +33,8 @@
|
|||
by UNIX International. Copies of this specification are available from
|
||||
UNIX International, 20 Waterview Boulevard, Parsippany, NJ, 07054.
|
||||
|
||||
This file also now contains definitions from the DWARF 3 specification. */
|
||||
This file also now contains definitions from the DWARF 3 specification
|
||||
published Dec 20, 2005, available from: http://dwarf.freestandards.org. */
|
||||
|
||||
/* This file is shared between GCC and GDB, and should not contain
|
||||
prototypes. */
|
||||
|
@ -275,7 +276,8 @@ enum dwarf_attribute
|
|||
DW_AT_prototyped = 0x27,
|
||||
DW_AT_return_addr = 0x2a,
|
||||
DW_AT_start_scope = 0x2c,
|
||||
DW_AT_stride_size = 0x2e,
|
||||
DW_AT_bit_stride = 0x2e,
|
||||
#define DW_AT_stride_size DW_AT_bit_stride /* Note: The use of DW_AT_stride_size is deprecated. */
|
||||
DW_AT_upper_bound = 0x2f,
|
||||
DW_AT_abstract_origin = 0x31,
|
||||
DW_AT_accessibility = 0x32,
|
||||
|
@ -310,7 +312,8 @@ enum dwarf_attribute
|
|||
DW_AT_allocated = 0x4e,
|
||||
DW_AT_associated = 0x4f,
|
||||
DW_AT_data_location = 0x50,
|
||||
DW_AT_stride = 0x51,
|
||||
DW_AT_byte_stride = 0x51,
|
||||
#define DW_AT_stride DW_AT_byte_stride /* Note: The use of DW_AT_stride is deprecated. */
|
||||
DW_AT_entry_pc = 0x52,
|
||||
DW_AT_use_UTF8 = 0x53,
|
||||
DW_AT_extension = 0x54,
|
||||
|
|
Loading…
Reference in a new issue