* [RFC patch]: Adjust the use of 'long' type in dwarf2.h header
@ 2011-02-17 14:21 Kai Tietz
2011-02-17 18:59 ` Kai Tietz
` (2 more replies)
0 siblings, 3 replies; 16+ messages in thread
From: Kai Tietz @ 2011-02-17 14:21 UTC (permalink / raw)
To: GCC Patches, Binutils, gdb; +Cc: Jakub Jelinek, Joel Brobecker
[-- Attachment #1: Type: text/plain, Size: 1917 bytes --]
Hello,
This patch addresses issues I've seen in binutils about
cross-compilers and dwarf2 display via objdump -W on hosts, which have
sizeof (long) < target's sizeof(void *). Additionally same issue of
course can be seen on LLP64 targets, too.
Those issues are caused by the fact that the dwarf2.h header in
include/ is using unconditionally the type 'unsigned long' for
vma-scalars.
This patch address additionally the binutils' dwarf.(c|h) files and
make them host bitness independent for gcc base toolchains supporting
the 'long long' type.
I've tested the attached patches for gdb, binutils, and gcc on
i686-w64-mingw32, and x86_64-w64-mingw32 cross-toolchains hosted on
cygwin. And I didn't found until now regressions. Later this day I
want to do a regression test for linux64, too.
binutils, gdb, gcc
ChangeLog include/
2011-02-17 Kai Tietz
* dwarf2.h (dw2_vma_t): New type.
(dw2_svma_t): New type.
(DW2_VMA_FMT): New macro specifying
to be used width-sepecifier for printing
new types.
ChangeLog binutils/
2011-02-17 Kai Tietz
* dwarf.c (read_leb128): Use dw2_vma_t instead of
long type.
(process_extended_line_op): Use for adr new type
and print dw2 values via DW2_VMA_FMT.
(fetch_indirect_string): Adjust offset's type.
(decode_location_expression): Adjust argument types
and uvalue type.
(read_and_display_attr_value): Likewise.
(read_and_display_attr): Likewise.
(decode_location_expression): Adjust printf format.
(process_debug_info): Likewise.
(display_debug_lines_raw): Likewise.
(display_debug_lines_decoded): Likewise.
(display_debug_pubnames): Likewise.
(display_debug_loc): Likewise.
(display_debug_aranges): Likewise.
* dwarf.h: Add include of dwarf2.h header and
use of dw2_vma_t instead of long types.
(read_leb128): Adjust return type.
Regards,
Kai
PS: On gdb there is at the moment in gdb/common part the include-path
to intl for libintl.h missing
[-- Attachment #2: b_dw2_inc.txt --]
[-- Type: text/plain, Size: 23095 bytes --]
Index: src/binutils/dwarf.c
===================================================================
--- src.orig/binutils/dwarf.c 2011-02-17 11:00:34.000000000 +0100
+++ src/binutils/dwarf.c 2011-02-17 14:30:11.291550300 +0100
@@ -123,10 +123,10 @@ print_dwarf_vma (dwarf_vma val, unsigned
fputs (buff + (byte_size == 4 ? 8 : 0), stdout);
}
-unsigned long int
+dw2_vma_t
read_leb128 (unsigned char *data, unsigned int *length_return, int sign)
{
- unsigned long int result = 0;
+ dw2_vma_t result = 0;
unsigned int num_read = 0;
unsigned int shift = 0;
unsigned char byte;
@@ -136,7 +136,7 @@ read_leb128 (unsigned char *data, unsign
byte = *data++;
num_read++;
- result |= ((unsigned long int) (byte & 0x7f)) << shift;
+ result |= ((dw2_vma_t) (byte & 0x7f)) << shift;
shift += 7;
@@ -193,7 +193,7 @@ process_extended_line_op (unsigned char
unsigned int bytes_read;
unsigned int len;
unsigned char *name;
- unsigned long adr;
+ dw2_vma_t adr;
len = read_leb128 (data, & bytes_read, 0);
data += bytes_read;
@@ -218,7 +218,7 @@ process_extended_line_op (unsigned char
case DW_LNE_set_address:
adr = byte_get (data, len - bytes_read - 1);
- printf (_("set Address to 0x%lx\n"), adr);
+ printf (_("set Address to 0x%" DW2_VMA_FMT "x\n"), adr);
state_machine_regs.address = adr;
state_machine_regs.op_index = 0;
break;
@@ -230,16 +230,17 @@ process_extended_line_op (unsigned char
printf (" %d\t", ++state_machine_regs.last_file_entry);
name = data;
data += strlen ((char *) data) + 1;
- printf ("%lu\t", read_leb128 (data, & bytes_read, 0));
+ printf ("%" DW2_VMA_FMT "u\t", read_leb128 (data, & bytes_read, 0));
data += bytes_read;
- printf ("%lu\t", read_leb128 (data, & bytes_read, 0));
+ printf ("%" DW2_VMA_FMT "u\t",
+ read_leb128 (data, & bytes_read, 0));
data += bytes_read;
- printf ("%lu\t", read_leb128 (data, & bytes_read, 0));
+ printf ("%" DW2_VMA_FMT "u\t", read_leb128 (data, & bytes_read, 0));
printf ("%s\n\n", name);
break;
case DW_LNE_set_discriminator:
- printf (_("set Discriminator to %lu\n"),
+ printf (_("set Discriminator to %" DW2_VMA_FMT "u\n"),
read_leb128 (data, & bytes_read, 0));
break;
@@ -291,7 +292,7 @@ process_extended_line_op (unsigned char
}
static const char *
-fetch_indirect_string (unsigned long offset)
+fetch_indirect_string (dw2_vma_t offset)
{
struct dwarf_section *section = &debug_displays [str].section;
@@ -302,7 +303,7 @@ fetch_indirect_string (unsigned long off
offset -= section->address;
if (offset > section->size)
{
- warn (_("DW_FORM_strp offset too big: %lx\n"), offset);
+ warn (_("DW_FORM_strp offset too big: %lx\n"), (long) offset);
return _("<offset is too big>");
}
@@ -605,13 +606,13 @@ decode_location_expression (unsigned cha
unsigned int pointer_size,
unsigned int offset_size,
int dwarf_version,
- unsigned long length,
- unsigned long cu_offset,
+ dw2_vma_t length,
+ dw2_vma_t cu_offset,
struct dwarf_section * section)
{
unsigned op;
unsigned int bytes_read;
- unsigned long uvalue;
+ dw2_vma_t uvalue;
unsigned char *end = data + length;
int need_frame_base = 0;
@@ -662,11 +663,13 @@ decode_location_expression (unsigned cha
data += 8;
break;
case DW_OP_constu:
- printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
+ printf ("DW_OP_constu: %" DW2_VMA_FMT "u",
+ read_leb128 (data, &bytes_read, 0));
data += bytes_read;
break;
case DW_OP_consts:
- printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
+ printf ("DW_OP_consts: %" DW2_VMA_FMT "d",
+ read_leb128 (data, &bytes_read, 1));
data += bytes_read;
break;
case DW_OP_dup:
@@ -721,7 +724,7 @@ decode_location_expression (unsigned cha
printf ("DW_OP_plus");
break;
case DW_OP_plus_uconst:
- printf ("DW_OP_plus_uconst: %lu",
+ printf ("DW_OP_plus_uconst: %" DW2_VMA_FMT "u",
read_leb128 (data, &bytes_read, 0));
data += bytes_read;
break;
@@ -867,7 +870,8 @@ decode_location_expression (unsigned cha
case DW_OP_breg29:
case DW_OP_breg30:
case DW_OP_breg31:
- printf ("DW_OP_breg%d (%s): %ld", op - DW_OP_breg0,
+ printf ("DW_OP_breg%d (%s): %" DW2_VMA_FMT "d",
+ op - DW_OP_breg0,
regname (op - DW_OP_breg0, 1),
read_leb128 (data, &bytes_read, 1));
data += bytes_read;
@@ -876,22 +880,26 @@ decode_location_expression (unsigned cha
case DW_OP_regx:
uvalue = read_leb128 (data, &bytes_read, 0);
data += bytes_read;
- printf ("DW_OP_regx: %lu (%s)", uvalue, regname (uvalue, 1));
+ printf ("DW_OP_regx: %" DW2_VMA_FMT "u (%s)",
+ uvalue, regname (uvalue, 1));
break;
case DW_OP_fbreg:
need_frame_base = 1;
- printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
+ printf ("DW_OP_fbreg: %" DW2_VMA_FMT "d",
+ read_leb128 (data, &bytes_read, 1));
data += bytes_read;
break;
case DW_OP_bregx:
uvalue = read_leb128 (data, &bytes_read, 0);
data += bytes_read;
- printf ("DW_OP_bregx: %lu (%s) %ld", uvalue, regname (uvalue, 1),
+ printf ("DW_OP_bregx: %" DW2_VMA_FMT "u (%s) %" DW2_VMA_FMT "d",
+ uvalue, regname (uvalue, 1),
read_leb128 (data, &bytes_read, 1));
data += bytes_read;
break;
case DW_OP_piece:
- printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
+ printf ("DW_OP_piece: %" DW2_VMA_FMT "u",
+ read_leb128 (data, &bytes_read, 0));
data += bytes_read;
break;
case DW_OP_deref_size:
@@ -911,13 +919,15 @@ decode_location_expression (unsigned cha
case DW_OP_call2:
/* XXX: Strictly speaking for 64-bit DWARF3 files
this ought to be an 8-byte wide computation. */
- printf ("DW_OP_call2: <0x%lx>", (long) byte_get (data, 2) + cu_offset);
+ printf ("DW_OP_call2: <0x%" DW2_VMA_FMT "x>",
+ (dw2_svma_t) byte_get (data, 2) + cu_offset);
data += 2;
break;
case DW_OP_call4:
/* XXX: Strictly speaking for 64-bit DWARF3 files
this ought to be an 8-byte wide computation. */
- printf ("DW_OP_call4: <0x%lx>", (long) byte_get (data, 4) + cu_offset);
+ printf ("DW_OP_call4: <0x%" DW2_VMA_FMT "x>",
+ (dw2_svma_t) byte_get (data, 4) + cu_offset);
data += 4;
break;
case DW_OP_call_ref:
@@ -950,9 +960,11 @@ decode_location_expression (unsigned cha
break;
case DW_OP_bit_piece:
printf ("DW_OP_bit_piece: ");
- printf ("size: %lu ", read_leb128 (data, &bytes_read, 0));
+ printf ("size: %" DW2_VMA_FMT "u ",
+ read_leb128 (data, &bytes_read, 0));
data += bytes_read;
- printf ("offset: %lu ", read_leb128 (data, &bytes_read, 0));
+ printf ("offset: %" DW2_VMA_FMT "u ",
+ read_leb128 (data, &bytes_read, 0));
data += bytes_read;
break;
@@ -1001,16 +1013,20 @@ decode_location_expression (unsigned cha
}
if (dwarf_version == 2)
{
- printf ("DW_OP_GNU_implicit_pointer: <0x%lx> %ld",
- (long) byte_get (data, pointer_size),
- read_leb128 (data + pointer_size, &bytes_read, 1));
+ printf ("DW_OP_GNU_implicit_pointer: "
+ "<0x%" DW2_VMA_FMT "x> %" DW2_VMA_FMT "d",
+ (dw2_vma_t) byte_get (data, pointer_size),
+ (dw2_svma_t) read_leb128 (data + pointer_size,
+ &bytes_read, 1));
data += pointer_size + bytes_read;
}
else
{
- printf ("DW_OP_GNU_implicit_pointer: <0x%lx> %ld",
- (long) byte_get (data, offset_size),
- read_leb128 (data + offset_size, &bytes_read, 1));
+ printf ("DW_OP_GNU_implicit_pointer: "
+ "<0x%" DW2_VMA_FMT "x> %" DW2_VMA_FMT "d",
+ (dw2_vma_t) byte_get (data, offset_size),
+ (dw2_svma_t) read_leb128 (data + offset_size,
+ &bytes_read, 1));
data += offset_size + bytes_read;
}
break;
@@ -1072,15 +1088,15 @@ static unsigned char *
read_and_display_attr_value (unsigned long attribute,
unsigned long form,
unsigned char * data,
- unsigned long cu_offset,
- unsigned long pointer_size,
- unsigned long offset_size,
+ dw2_vma_t cu_offset,
+ dw2_vma_t pointer_size,
+ dw2_vma_t offset_size,
int dwarf_version,
debug_info * debug_info_p,
int do_loc,
struct dwarf_section * section)
{
- unsigned long uvalue = 0;
+ dw2_vma_t uvalue = 0;
unsigned char *block_start = NULL;
unsigned char * orig_data = data;
unsigned int bytes_read;
@@ -1167,7 +1183,7 @@ read_and_display_attr_value (unsigned lo
{
case DW_FORM_ref_addr:
if (!do_loc)
- printf (" <0x%lx>", uvalue);
+ printf (" <0x%" DW2_VMA_FMT "x>", uvalue);
break;
case DW_FORM_ref1:
@@ -1175,14 +1191,14 @@ read_and_display_attr_value (unsigned lo
case DW_FORM_ref4:
case DW_FORM_ref_udata:
if (!do_loc)
- printf (" <0x%lx>", uvalue + cu_offset);
+ printf (" <0x%" DW2_VMA_FMT "x>", uvalue + cu_offset);
break;
case DW_FORM_data4:
case DW_FORM_addr:
case DW_FORM_sec_offset:
if (!do_loc)
- printf (" 0x%lx", uvalue);
+ printf (" 0x%" DW2_VMA_FMT "x", uvalue);
break;
case DW_FORM_flag_present:
@@ -1192,7 +1208,7 @@ read_and_display_attr_value (unsigned lo
case DW_FORM_sdata:
case DW_FORM_udata:
if (!do_loc)
- printf (" %ld", uvalue);
+ printf (" %" DW2_VMA_FMT "d", uvalue);
break;
case DW_FORM_ref8:
@@ -1200,7 +1216,7 @@ read_and_display_attr_value (unsigned lo
if (!do_loc)
{
uvalue = byte_get (data, 4);
- printf (" 0x%lx", uvalue);
+ printf (" 0x%" DW2_VMA_FMT "x", uvalue);
printf (" 0x%lx", (unsigned long) byte_get (data + 4, 4));
}
if ((do_loc || do_debug_loc || do_debug_ranges)
@@ -1209,7 +1225,7 @@ read_and_display_attr_value (unsigned lo
if (sizeof (uvalue) == 8)
uvalue = byte_get (data, 8);
else
- error (_("DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8\n"));
+ error (_("DW_FORM_data8 is unsupported when sizeof (dw2_vma_t) != 8\n"));
}
data += 8;
break;
@@ -1259,7 +1275,7 @@ read_and_display_attr_value (unsigned lo
case DW_FORM_strp:
if (!do_loc)
- printf (_(" (indirect string, offset: 0x%lx): %s"),
+ printf (_(" (indirect string, offset: 0x%" DW2_VMA_FMT "x): %s"),
uvalue, fetch_indirect_string (uvalue));
break;
@@ -1313,7 +1329,7 @@ read_and_display_attr_value (unsigned lo
if (lmax == 0 || num >= lmax)
{
lmax += 1024;
- debug_info_p->loc_offsets = (long unsigned int *)
+ debug_info_p->loc_offsets = (dw2_vma_t *)
xcrealloc (debug_info_p->loc_offsets,
lmax, sizeof (*debug_info_p->loc_offsets));
debug_info_p->have_frame_base = (int *)
@@ -1344,7 +1360,7 @@ read_and_display_attr_value (unsigned lo
if (lmax == 0 || num >= lmax)
{
lmax += 1024;
- debug_info_p->range_lists = (long unsigned int *)
+ debug_info_p->range_lists = (dw2_vma_t *)
xcrealloc (debug_info_p->range_lists,
lmax, sizeof (*debug_info_p->range_lists));
debug_info_p->max_range_lists = lmax;
@@ -1383,7 +1399,8 @@ read_and_display_attr_value (unsigned lo
printf (_("(declared as inline and inlined)"));
break;
default:
- printf (_(" (Unknown inline attribute value: %lx)"), uvalue);
+ printf (_(" (Unknown inline attribute value: %" DW2_VMA_FMT "x)"),
+ uvalue);
break;
}
break;
@@ -1421,9 +1438,9 @@ read_and_display_attr_value (unsigned lo
case DW_LANG_Upc: printf ("(Unified Parallel C)"); break;
default:
if (uvalue >= DW_LANG_lo_user && uvalue <= DW_LANG_hi_user)
- printf ("(implementation defined: %lx)", uvalue);
+ printf ("(implementation defined: %" DW2_VMA_FMT "x)", uvalue);
else
- printf ("(Unknown: %lx)", uvalue);
+ printf ("(Unknown: %" DW2_VMA_FMT "x)", uvalue);
break;
}
break;
@@ -1584,7 +1601,7 @@ read_and_display_attr_value (unsigned lo
uvalue += cu_offset;
if (uvalue >= section->size)
- warn (_("Offset %lx used as value for DW_AT_import attribute of DIE at offset %lx is too big.\n"),
+ warn (_("Offset %" DW2_VMA_FMT "x used as value for DW_AT_import attribute of DIE at offset %lx is too big.\n"),
uvalue, (unsigned long) (orig_data - section->start));
else
{
@@ -1786,9 +1803,9 @@ static unsigned char *
read_and_display_attr (unsigned long attribute,
unsigned long form,
unsigned char * data,
- unsigned long cu_offset,
- unsigned long pointer_size,
- unsigned long offset_size,
+ dw2_vma_t cu_offset,
+ dw2_vma_t pointer_size,
+ dw2_vma_t offset_size,
int dwarf_version,
debug_info * debug_info_p,
int do_loc,
@@ -1900,7 +1917,7 @@ process_debug_info (struct dwarf_section
unsigned char *hdrptr;
unsigned char *tags;
int level;
- unsigned long cu_offset;
+ dw2_vma_t cu_offset;
int offset_size;
int initial_length_size;
unsigned char signature[8] = { 0 };
@@ -1970,11 +1987,13 @@ process_debug_info (struct dwarf_section
if (!do_loc)
{
- printf (_(" Compilation Unit @ offset 0x%lx:\n"), cu_offset);
- printf (_(" Length: 0x%lx (%s)\n"), compunit.cu_length,
+ printf (_(" Compilation Unit @ offset 0x%" DW2_VMA_FMT "x:\n"), cu_offset);
+ printf (_(" Length: 0x%" DW2_VMA_FMT "x (%s)\n"),
+ compunit.cu_length,
initial_length_size == 8 ? "64-bit" : "32-bit");
printf (_(" Version: %d\n"), compunit.cu_version);
- printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
+ printf (_(" Abbrev Offset: %" DW2_VMA_FMT "d\n"),
+ compunit.cu_abbrev_offset);
printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
if (do_types)
{
@@ -1990,7 +2009,9 @@ process_debug_info (struct dwarf_section
if (cu_offset + compunit.cu_length + initial_length_size
> section->size)
{
- warn (_("Debug info is corrupted, length of CU at %lx extends beyond end of section (length = %lx)\n"),
+ warn (_("Debug info is corrupted, length of CU at %"
+ DW2_VMA_FMT "x extends beyond end of section (length = %"
+ DW2_VMA_FMT "x)\n"),
cu_offset, compunit.cu_length);
break;
}
@@ -2001,7 +2022,8 @@ process_debug_info (struct dwarf_section
&& compunit.cu_version != 3
&& compunit.cu_version != 4)
{
- warn (_("CU at offset %lx contains corrupt or unsupported version number: %d.\n"),
+ warn (_("CU at offset %" DW2_VMA_FMT "x contains corrupt or "
+ "unsupported version number: %d.\n"),
cu_offset, compunit.cu_version);
continue;
}
@@ -2268,7 +2290,7 @@ display_debug_lines_raw (struct dwarf_se
linfo.li_line_base >>= 24;
printf (_(" Offset: 0x%lx\n"), hdroff);
- printf (_(" Length: %ld\n"), linfo.li_length);
+ printf (_(" Length: %ld\n"), (long) linfo.li_length);
printf (_(" DWARF Version: %d\n"), linfo.li_version);
printf (_(" Prologue Length: %d\n"), linfo.li_prologue_length);
printf (_(" Minimum Instruction Length: %d\n"), linfo.li_min_insn_length);
@@ -2329,11 +2351,14 @@ display_debug_lines_raw (struct dwarf_se
data += strlen ((char *) data) + 1;
- printf ("%lu\t", read_leb128 (data, & bytes_read, 0));
+ printf ("%" DW2_VMA_FMT "u\t",
+ read_leb128 (data, & bytes_read, 0));
data += bytes_read;
- printf ("%lu\t", read_leb128 (data, & bytes_read, 0));
+ printf ("%" DW2_VMA_FMT "u\t",
+ read_leb128 (data, & bytes_read, 0));
data += bytes_read;
- printf ("%lu\t", read_leb128 (data, & bytes_read, 0));
+ printf ("%" DW2_VMA_FMT "u\t",
+ read_leb128 (data, & bytes_read, 0));
data += bytes_read;
printf ("%s\n", name);
}
@@ -2505,7 +2530,8 @@ display_debug_lines_raw (struct dwarf_se
for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
{
- printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
+ printf ("0x%" DW2_VMA_FMT "x%s",
+ read_leb128 (data, &bytes_read, 0),
i == 1 ? "" : ", ");
data += bytes_read;
}
@@ -2918,7 +2944,8 @@ display_debug_lines_decoded (struct dwar
for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
{
- printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
+ printf ("0x%" DW2_VMA_FMT "x%s",
+ read_leb128 (data, &bytes_read, 0),
i == 1 ? "" : ", ");
data += bytes_read;
}
@@ -3076,7 +3103,7 @@ display_debug_pubnames (struct dwarf_sec
&& num_debug_info_entries > 0
&& find_debug_info_for_offset (names.pn_offset) == NULL)
warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
- names.pn_offset, section->name);
+ (unsigned long) names.pn_offset, section->name);
names.pn_size = byte_get (data, offset_size);
data += offset_size;
@@ -3097,13 +3124,13 @@ display_debug_pubnames (struct dwarf_sec
}
printf (_(" Length: %ld\n"),
- names.pn_length);
+ (long) names.pn_length);
printf (_(" Version: %d\n"),
names.pn_version);
printf (_(" Offset into .debug_info section: 0x%lx\n"),
- names.pn_offset);
+ (unsigned long) names.pn_offset);
printf (_(" Size of area in .debug_info section: %ld\n"),
- names.pn_size);
+ (long) names.pn_size);
printf (_("\n Offset\tName\n"));
@@ -3323,7 +3350,7 @@ display_debug_loc (struct dwarf_section
/* DWARF sections under Mach-O have non-zero addresses. */
if (debug_information [first].num_loc_offsets > 0
&& debug_information [first].loc_offsets [0] != section->address)
- warn (_("Location lists in %s section start at 0x%lx\n"),
+ warn (_("Location lists in %s section start at 0x%" DW2_VMA_FMT "x\n"),
section->name, debug_information [first].loc_offsets [0]);
printf (_("Contents of the %s section:\n\n"), section->name);
@@ -3596,7 +3623,7 @@ display_debug_aranges (struct dwarf_sect
&& num_debug_info_entries > 0
&& find_debug_info_for_offset (arange.ar_info_offset) == NULL)
warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
- arange.ar_info_offset, section->name);
+ (unsigned long) arange.ar_info_offset, section->name);
arange.ar_pointer_size = byte_get (hdrptr, 1);
hdrptr += 1;
@@ -3610,9 +3637,11 @@ display_debug_aranges (struct dwarf_sect
break;
}
- printf (_(" Length: %ld\n"), arange.ar_length);
+ printf (_(" Length: %ld\n"),
+ (long) arange.ar_length);
printf (_(" Version: %d\n"), arange.ar_version);
- printf (_(" Offset into .debug_info: 0x%lx\n"), arange.ar_info_offset);
+ printf (_(" Offset into .debug_info: 0x%lx\n"),
+ (unsigned long) arange.ar_info_offset);
printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
Index: src/binutils/dwarf.h
===================================================================
--- src.orig/binutils/dwarf.h 2011-02-17 11:00:34.000000000 +0100
+++ src/binutils/dwarf.h 2011-02-17 11:18:37.972034400 +0100
@@ -19,6 +19,8 @@
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
MA 02110-1301, USA. */
+#include "dwarf2.h"
+
typedef unsigned HOST_WIDEST_INT dwarf_vma;
typedef unsigned HOST_WIDEST_INT dwarf_size_type;
@@ -79,15 +81,15 @@ typedef struct
unsigned int pointer_size;
unsigned int offset_size;
int dwarf_version;
- unsigned long cu_offset;
- unsigned long base_address;
+ dw2_vma_t cu_offset;
+ dw2_vma_t base_address;
/* This is an array of offsets to the location list table. */
- unsigned long *loc_offsets;
+ dw2_vma_t *loc_offsets;
int *have_frame_base;
unsigned int num_loc_offsets;
unsigned int max_loc_offsets;
/* List of .debug_ranges offsets seen in this .debug_info. */
- unsigned long *range_lists;
+ dw2_vma_t *range_lists;
unsigned int num_range_lists;
unsigned int max_range_lists;
}
@@ -131,5 +133,5 @@ void *cmalloc (size_t, size_t);
void *xcmalloc (size_t, size_t);
void *xcrealloc (void *, size_t, size_t);
-unsigned long int read_leb128 (unsigned char *data,
- unsigned int *length_return, int sign);
+dw2_vma_t read_leb128 (unsigned char *data,
+ unsigned int *length_return, int sign);
Index: src/include/dwarf2.h
===================================================================
--- src.orig/include/dwarf2.h 2011-02-17 11:00:34.000000000 +0100
+++ src/include/dwarf2.h 2011-02-17 12:22:16.839408800 +0100
@@ -47,6 +47,35 @@
#ifndef _ELF_DWARF2_H
#define _ELF_DWARF2_H
+#if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
+/* We need here widest integer type so that even for cross scenarios
+ a wide enough integer scalar value is used to hold address vma.
+ Additionally it is necessary here to use for non-LP64 targets the
+ proper integer scalar value to hold an address. */
+#ifdef __GNUC__
+__extension__
+#endif
+typedef unsigned long long dw2_vma_t;
+#ifdef __GNUC__
+__extension__
+#endif
+typedef signed long long dw2_svma_t;
+
+#ifndef __MINGW32__
+#define DW2_VMA_FMT "ll"
+#else
+#define DW2_VMA_FMT "I64"
+#endif
+
+#else
+
+typedef unsigned long dw2_vma_t;
+typedef signed long dw2_svma_t;
+
+#define DW2_VMA_FMT "l"
+
+#endif
+
/* Structure found in the .debug_line section. */
typedef struct
{
@@ -63,7 +92,7 @@ DWARF2_External_LineInfo;
typedef struct
{
- unsigned long li_length;
+ dw2_vma_t li_length;
unsigned short li_version;
unsigned int li_prologue_length;
unsigned char li_min_insn_length;
@@ -87,10 +116,10 @@ DWARF2_External_PubNames;
typedef struct
{
- unsigned long pn_length;
+ dw2_vma_t pn_length;
unsigned short pn_version;
- unsigned long pn_offset;
- unsigned long pn_size;
+ dw2_vma_t pn_offset;
+ dw2_vma_t pn_size;
}
DWARF2_Internal_PubNames;
@@ -106,9 +135,9 @@ DWARF2_External_CompUnit;
typedef struct
{
- unsigned long cu_length;
+ dw2_vma_t cu_length;
unsigned short cu_version;
- unsigned long cu_abbrev_offset;
+ dw2_vma_t cu_abbrev_offset;
unsigned char cu_pointer_size;
}
DWARF2_Internal_CompUnit;
@@ -125,9 +154,9 @@ DWARF2_External_ARange;
typedef struct
{
- unsigned long ar_length;
+ dw2_vma_t ar_length;
unsigned short ar_version;
- unsigned long ar_info_offset;
+ dw2_vma_t ar_info_offset;
unsigned char ar_pointer_size;
unsigned char ar_segment_size;
}
[-- Attachment #3: d_dw2.txt --]
[-- Type: text/plain, Size: 2146 bytes --]
Index: src/include/dwarf2.h
===================================================================
--- src.orig/include/dwarf2.h 2011-02-17 12:26:40.000000000 +0100
+++ src/include/dwarf2.h 2011-02-17 12:25:06.183158800 +0100
@@ -47,6 +47,35 @@
#ifndef _ELF_DWARF2_H
#define _ELF_DWARF2_H
+#if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
+/* We need here widest integer type so that even for cross scenarios
+ a wide enough integer scalar value is used to hold address vma.
+ Additionally it is necessary here to use for non-LP64 targets the
+ proper integer scalar value to hold an address. */
+#ifdef __GNUC__
+__extension__
+#endif
+typedef unsigned long long dw2_vma_t;
+#ifdef __GNUC__
+__extension__
+#endif
+typedef signed long long dw2_svma_t;
+
+#ifndef __MINGW32__
+#define DW2_VMA_FMT "ll"
+#else
+#define DW2_VMA_FMT "I64"
+#endif
+
+#else
+
+typedef unsigned long dw2_vma_t;
+typedef signed long dw2_svma_t;
+
+#define DW2_VMA_FMT "l"
+
+#endif
+
/* Structure found in the .debug_line section. */
typedef struct
{
@@ -63,7 +92,7 @@ DWARF2_External_LineInfo;
typedef struct
{
- unsigned long li_length;
+ dw2_vma_t li_length;
unsigned short li_version;
unsigned int li_prologue_length;
unsigned char li_min_insn_length;
@@ -87,10 +116,10 @@ DWARF2_External_PubNames;
typedef struct
{
- unsigned long pn_length;
+ dw2_vma_t pn_length;
unsigned short pn_version;
- unsigned long pn_offset;
- unsigned long pn_size;
+ dw2_vma_t pn_offset;
+ dw2_vma_t pn_size;
}
DWARF2_Internal_PubNames;
@@ -106,9 +135,9 @@ DWARF2_External_CompUnit;
typedef struct
{
- unsigned long cu_length;
+ dw2_vma_t cu_length;
unsigned short cu_version;
- unsigned long cu_abbrev_offset;
+ dw2_vma_t cu_abbrev_offset;
unsigned char cu_pointer_size;
}
DWARF2_Internal_CompUnit;
@@ -125,9 +154,9 @@ DWARF2_External_ARange;
typedef struct
{
- unsigned long ar_length;
+ dw2_vma_t ar_length;
unsigned short ar_version;
- unsigned long ar_info_offset;
+ dw2_vma_t ar_info_offset;
unsigned char ar_pointer_size;
unsigned char ar_segment_size;
}
[-- Attachment #4: g_dwarf2.txt --]
[-- Type: text/plain, Size: 2841 bytes --]
Index: gcc/include/dwarf2.h
===================================================================
--- gcc.orig/include/dwarf2.h 2011-01-13 11:59:21.000000000 +0100
+++ gcc/include/dwarf2.h 2011-02-17 14:00:16.175818900 +0100
@@ -47,6 +47,35 @@
#ifndef _ELF_DWARF2_H
#define _ELF_DWARF2_H
+#if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
+/* We need here widest integer type so that even for cross scenarios
+ a wide enough integer scalar value is used to hold address vma.
+ Additionally it is necessary here to use for non-LP64 targets the
+ proper integer scalar value to hold an address. */
+#ifdef __GNUC__
+__extension__
+#endif
+typedef unsigned long long dw2_vma_t;
+#ifdef __GNUC__
+__extension__
+#endif
+typedef signed long long dw2_svma_t;
+
+#ifndef __MINGW32__
+#define DW2_VMA_FMT "ll"
+#else
+#define DW2_VMA_FMT "I64"
+#endif
+
+#else
+
+typedef unsigned long dw2_vma_t;
+typedef signed long dw2_svma_t;
+
+#define DW2_VMA_FMT "l"
+
+#endif
+
/* Structure found in the .debug_line section. */
typedef struct
{
@@ -63,7 +92,7 @@ DWARF2_External_LineInfo;
typedef struct
{
- unsigned long li_length;
+ dw2_vma_t li_length;
unsigned short li_version;
unsigned int li_prologue_length;
unsigned char li_min_insn_length;
@@ -87,10 +116,10 @@ DWARF2_External_PubNames;
typedef struct
{
- unsigned long pn_length;
+ dw2_vma_t pn_length;
unsigned short pn_version;
- unsigned long pn_offset;
- unsigned long pn_size;
+ dw2_vma_t pn_offset;
+ dw2_vma_t pn_size;
}
DWARF2_Internal_PubNames;
@@ -106,9 +135,9 @@ DWARF2_External_CompUnit;
typedef struct
{
- unsigned long cu_length;
+ dw2_vma_t cu_length;
unsigned short cu_version;
- unsigned long cu_abbrev_offset;
+ dw2_vma_t cu_abbrev_offset;
unsigned char cu_pointer_size;
}
DWARF2_Internal_CompUnit;
@@ -125,9 +154,9 @@ DWARF2_External_ARange;
typedef struct
{
- unsigned long ar_length;
+ dw2_vma_t ar_length;
unsigned short ar_version;
- unsigned long ar_info_offset;
+ dw2_vma_t ar_info_offset;
unsigned char ar_pointer_size;
unsigned char ar_segment_size;
}
@@ -754,7 +783,15 @@ enum dwarf_calling_convention
DW_CC_hi_user = 0xff,
DW_CC_GNU_renesas_sh = 0x40,
- DW_CC_GNU_borland_fastcall_i386 = 0x41
+ DW_CC_GNU_borland_fastcall_i386 = 0x41,
+
+ /* This DW_CC_ value is not currently generated by any toolchain. It is
+ used internally to GDB to indicate OpenCL C functions that have been
+ compiled with the IBM XL C for OpenCL compiler and use a non-platform
+ calling convention for passing OpenCL C vector types. This value may
+ be changed freely as long as it does not conflict with any other DW_CC_
+ value defined here. */
+ DW_CC_GDB_IBM_OpenCL = 0xff
};
/* Inline attribute. */
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC patch]: Adjust the use of 'long' type in dwarf2.h header
2011-02-17 14:21 [RFC patch]: Adjust the use of 'long' type in dwarf2.h header Kai Tietz
@ 2011-02-17 18:59 ` Kai Tietz
2011-02-17 19:03 ` Jakub Jelinek
2011-02-21 13:10 ` Pierre Muller
[not found] ` <-8460070221060995487@unknownmsgid>
2 siblings, 1 reply; 16+ messages in thread
From: Kai Tietz @ 2011-02-17 18:59 UTC (permalink / raw)
To: GCC Patches, Binutils, gdb; +Cc: Jakub Jelinek, Joel Brobecker
2011/2/17 Kai Tietz <ktietz70@googlemail.com>:
> Hello,
>
> This patch addresses issues I've seen in binutils about
> cross-compilers and dwarf2 display via objdump -W on hosts, which have
> sizeof (long) < target's sizeof(void *). Additionally same issue of
> course can be seen on LLP64 targets, too.
> Those issues are caused by the fact that the dwarf2.h header in
> include/ is using unconditionally the type 'unsigned long' for
> vma-scalars.
>
> This patch address additionally the binutils' dwarf.(c|h) files and
> make them host bitness independent for gcc base toolchains supporting
> the 'long long' type.
>
> I've tested the attached patches for gdb, binutils, and gcc on
> i686-w64-mingw32, and x86_64-w64-mingw32 cross-toolchains hosted on
> cygwin. And I didn't found until now regressions. Later this day I
> want to do a regression test for linux64, too.
>
>
> binutils, gdb, gcc
>
> ChangeLog include/
>
> 2011-02-17 Kai Tietz
>
> * dwarf2.h (dw2_vma_t): New type.
> (dw2_svma_t): New type.
> (DW2_VMA_FMT): New macro specifying
> to be used width-sepecifier for printing
> new types.
>
>
> ChangeLog binutils/
>
> 2011-02-17 Kai Tietz
>
> * dwarf.c (read_leb128): Use dw2_vma_t instead of
> long type.
> (process_extended_line_op): Use for adr new type
> and print dw2 values via DW2_VMA_FMT.
> (fetch_indirect_string): Adjust offset's type.
> (decode_location_expression): Adjust argument types
> and uvalue type.
> (read_and_display_attr_value): Likewise.
> (read_and_display_attr): Likewise.
> (decode_location_expression): Adjust printf format.
> (process_debug_info): Likewise.
> (display_debug_lines_raw): Likewise.
> (display_debug_lines_decoded): Likewise.
> (display_debug_pubnames): Likewise.
> (display_debug_loc): Likewise.
> (display_debug_aranges): Likewise.
> * dwarf.h: Add include of dwarf2.h header and
> use of dw2_vma_t instead of long types.
> (read_leb128): Adjust return type.
>
>
> Regards,
> Kai
>
>
> PS: On gdb there is at the moment in gdb/common part the include-path
> to intl for libintl.h missing
>
I tested those patches for x86_64-pc-linux-gnu too and had no
regressions. Ok for apply, or any comments?
Regards,
Kai
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC patch]: Adjust the use of 'long' type in dwarf2.h header
2011-02-17 18:59 ` Kai Tietz
@ 2011-02-17 19:03 ` Jakub Jelinek
2011-02-17 19:07 ` Kai Tietz
0 siblings, 1 reply; 16+ messages in thread
From: Jakub Jelinek @ 2011-02-17 19:03 UTC (permalink / raw)
To: Kai Tietz; +Cc: GCC Patches, Binutils, gdb, Joel Brobecker
On Thu, Feb 17, 2011 at 07:58:56PM +0100, Kai Tietz wrote:
> 2011/2/17 Kai Tietz <ktietz70@googlemail.com>:
> > This patch addresses issues I've seen in binutils about
> > cross-compilers and dwarf2 display via objdump -W on hosts, which have
> > sizeof (long) < target's sizeof(void *). Additionally same issue of
> > course can be seen on LLP64 targets, too.
> > Those issues are caused by the fact that the dwarf2.h header in
> > include/ is using unconditionally the type 'unsigned long' for
> > vma-scalars.
> >
> > This patch address additionally the binutils' dwarf.(c|h) files and
> > make them host bitness independent for gcc base toolchains supporting
> > the 'long long' type.
> >
> > I've tested the attached patches for gdb, binutils, and gcc on
> > i686-w64-mingw32, and x86_64-w64-mingw32 cross-toolchains hosted on
> > cygwin. And I didn't found until now regressions. Later this day I
> > want to do a regression test for linux64, too.
I'd prefer if we could move those binutils specific internal implementation
details out of the dwarf2.h header, keep it really just for the stuff
defined in the standard, and add a new binutils specific header somewhere
else which would contain binutils specific details.
Jakub
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC patch]: Adjust the use of 'long' type in dwarf2.h header
2011-02-17 19:03 ` Jakub Jelinek
@ 2011-02-17 19:07 ` Kai Tietz
2011-02-17 19:17 ` Jakub Jelinek
0 siblings, 1 reply; 16+ messages in thread
From: Kai Tietz @ 2011-02-17 19:07 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: GCC Patches, Binutils, gdb, Joel Brobecker
2011/2/17 Jakub Jelinek <jakub@redhat.com>:
> On Thu, Feb 17, 2011 at 07:58:56PM +0100, Kai Tietz wrote:
>> 2011/2/17 Kai Tietz <ktietz70@googlemail.com>:
>> > This patch addresses issues I've seen in binutils about
>> > cross-compilers and dwarf2 display via objdump -W on hosts, which have
>> > sizeof (long) < target's sizeof(void *). Additionally same issue of
>> > course can be seen on LLP64 targets, too.
>> > Those issues are caused by the fact that the dwarf2.h header in
>> > include/ is using unconditionally the type 'unsigned long' for
>> > vma-scalars.
>> >
>> > This patch address additionally the binutils' dwarf.(c|h) files and
>> > make them host bitness independent for gcc base toolchains supporting
>> > the 'long long' type.
>> >
>> > I've tested the attached patches for gdb, binutils, and gcc on
>> > i686-w64-mingw32, and x86_64-w64-mingw32 cross-toolchains hosted on
>> > cygwin. And I didn't found until now regressions. Later this day I
>> > want to do a regression test for linux64, too.
>
> I'd prefer if we could move those binutils specific internal implementation
> details out of the dwarf2.h header, keep it really just for the stuff
> defined in the standard, and add a new binutils specific header somewhere
> else which would contain binutils specific details.
>
> Jakub
Well, so we make dwarf2.h in include just host-specific and isn't able
to cover things for foreign target, like 32-bit host can't use this
header for 64-bit dwarf2 information. I am fine by this, but
nevertheless is then the use of 'unsigned long' type within this
header still an issue. Here should be used instead then 'intptr_t'. As
on LLP64 unsigned long isn't wide-enough.
Regards,
Kai
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC patch]: Adjust the use of 'long' type in dwarf2.h header
2011-02-17 19:07 ` Kai Tietz
@ 2011-02-17 19:17 ` Jakub Jelinek
2011-02-18 9:50 ` Kai Tietz
0 siblings, 1 reply; 16+ messages in thread
From: Jakub Jelinek @ 2011-02-17 19:17 UTC (permalink / raw)
To: Kai Tietz; +Cc: GCC Patches, Binutils, gdb, Joel Brobecker
On Thu, Feb 17, 2011 at 08:06:53PM +0100, Kai Tietz wrote:
> > I'd prefer if we could move those binutils specific internal implementation
> > details out of the dwarf2.h header, keep it really just for the stuff
> > defined in the standard, and add a new binutils specific header somewhere
> > else which would contain binutils specific details.
>
> Well, so we make dwarf2.h in include just host-specific and isn't able
> to cover things for foreign target, like 32-bit host can't use this
> header for 64-bit dwarf2 information. I am fine by this, but
> nevertheless is then the use of 'unsigned long' type within this
> header still an issue. Here should be used instead then 'intptr_t'. As
> on LLP64 unsigned long isn't wide-enough.
I mean that none of the DWARF2_Internal types should be in the
include/dwarf2.h headers (that's implementation specific stuff),
and the DWARF2_External types are questionable too, to me they look
very much like implementation detail too. E.g. DWARF2_External_LineInfo
type is dubious, because it might somehow describe version 2 or 3
.debug_line header, but version 4 looks differently, etc.
So IMHO the DWARF2_External stuff should be moved too.
And the guard should be probably renamed from _ELF_DWARF2_H to _DWARF2_H,
I don't see anything ELF specific in the header.
Jakub
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC patch]: Adjust the use of 'long' type in dwarf2.h header
2011-02-17 19:17 ` Jakub Jelinek
@ 2011-02-18 9:50 ` Kai Tietz
2011-02-21 12:37 ` NightStrike
0 siblings, 1 reply; 16+ messages in thread
From: Kai Tietz @ 2011-02-18 9:50 UTC (permalink / raw)
To: Alan Modra; +Cc: GCC Patches, Binutils, gdb, Joel Brobecker, Jakub Jelinek
[-- Attachment #1: Type: text/plain, Size: 3243 bytes --]
2011/2/17 Jakub Jelinek <jakub@redhat.com>:
> On Thu, Feb 17, 2011 at 08:06:53PM +0100, Kai Tietz wrote:
>> > I'd prefer if we could move those binutils specific internal implementation
>> > details out of the dwarf2.h header, keep it really just for the stuff
>> > defined in the standard, and add a new binutils specific header somewhere
>> > else which would contain binutils specific details.
>>
>> Well, so we make dwarf2.h in include just host-specific and isn't able
>> to cover things for foreign target, like 32-bit host can't use this
>> header for 64-bit dwarf2 information. I am fine by this, but
>> nevertheless is then the use of 'unsigned long' type within this
>> header still an issue. Here should be used instead then 'intptr_t'. As
>> on LLP64 unsigned long isn't wide-enough.
>
> I mean that none of the DWARF2_Internal types should be in the
> include/dwarf2.h headers (that's implementation specific stuff),
> and the DWARF2_External types are questionable too, to me they look
> very much like implementation detail too. E.g. DWARF2_External_LineInfo
> type is dubious, because it might somehow describe version 2 or 3
> .debug_line header, but version 4 looks differently, etc.
> So IMHO the DWARF2_External stuff should be moved too.
> And the guard should be probably renamed from _ELF_DWARF2_H to _DWARF2_H,
> I don't see anything ELF specific in the header.
>
> Jakub
>
So I reworked my patch as Jakub suggested and retested it for
x86_64-w64-mingw32, i686-w64-mingw32, and x86_64-pc-linux-gnu for gcc,
binutils, and gdb. Ok for apply?
binutils, gdb, gcc
ChangeLog include/
2011-02-18 Kai Tietz
* dwarf2.h (_ELF_DWARF2_H): Renamed to
_DWARF2_H.
(DWARF2_External_LineInfo, DWARF2_Internal_LineInfo,
DWARF2_External_PubNames, DWARF2_Internal_PubNames,
DWARF2_External_CompUnit, DWARF2_Internal_CompUnit,
DWARF2_External_ARange, DWARF2_Internal_ARange): Removed.
ChangeLog binutils/
2011-02-18 Kai Tietz
* dwarf.c (read_leb128): Use dw2_vma_t instead of
long type.
(process_extended_line_op): Use for adr bfd_vma
type and print those typed values via BFD_VMA_FMT.
(fetch_indirect_string): Adjust offset's type.
(decode_location_expression): Adjust argument types
and uvalue type.
(read_and_display_attr_value): Likewise.
(read_and_display_attr): Likewise.
(decode_location_expression): Adjust printf format.
(process_debug_info): Likewise.
(display_debug_lines_raw): Likewise.
(display_debug_lines_decoded): Likewise.
(display_debug_pubnames): Likewise.
(display_debug_loc): Likewise.
(display_debug_aranges): Likewise.
* dwarf.h (DWARF2_External_LineInfo,
DWARF2_Internal_LineInfo, DWARF2_External_PubNames,
DWARF2_Internal_PubNames, DWARF2_External_CompUnit,
DWARF2_Internal_CompUnit, DWARF2_External_ARange,
DWARF2_Internal_ARange): Added..
(read_leb128): Adjust return type.
Regards,
Kai
PS: A lot of those moved structures aren't used at all in binutils
dwarf.c (which is the only consumer of some of those structures as a
grep over binutils/gdb/gcc had shown). So maybe the unused could be
removed in a second patch completely.
[-- Attachment #2: b_dw2_inc.txt --]
[-- Type: text/plain, Size: 25628 bytes --]
Index: src/binutils/dwarf.c
===================================================================
--- src.orig/binutils/dwarf.c 2011-02-17 11:00:34.000000000 +0100
+++ src/binutils/dwarf.c 2011-02-18 10:27:10.941857600 +0100
@@ -123,10 +123,10 @@ print_dwarf_vma (dwarf_vma val, unsigned
fputs (buff + (byte_size == 4 ? 8 : 0), stdout);
}
-unsigned long int
+bfd_vma
read_leb128 (unsigned char *data, unsigned int *length_return, int sign)
{
- unsigned long int result = 0;
+ bfd_vma result = 0;
unsigned int num_read = 0;
unsigned int shift = 0;
unsigned char byte;
@@ -136,7 +136,7 @@ read_leb128 (unsigned char *data, unsign
byte = *data++;
num_read++;
- result |= ((unsigned long int) (byte & 0x7f)) << shift;
+ result |= ((bfd_vma) (byte & 0x7f)) << shift;
shift += 7;
@@ -193,7 +193,7 @@ process_extended_line_op (unsigned char
unsigned int bytes_read;
unsigned int len;
unsigned char *name;
- unsigned long adr;
+ bfd_vma adr;
len = read_leb128 (data, & bytes_read, 0);
data += bytes_read;
@@ -218,7 +218,7 @@ process_extended_line_op (unsigned char
case DW_LNE_set_address:
adr = byte_get (data, len - bytes_read - 1);
- printf (_("set Address to 0x%lx\n"), adr);
+ printf (_("set Address to 0x%" BFD_VMA_FMT "x\n"), adr);
state_machine_regs.address = adr;
state_machine_regs.op_index = 0;
break;
@@ -230,16 +230,17 @@ process_extended_line_op (unsigned char
printf (" %d\t", ++state_machine_regs.last_file_entry);
name = data;
data += strlen ((char *) data) + 1;
- printf ("%lu\t", read_leb128 (data, & bytes_read, 0));
+ printf ("%" BFD_VMA_FMT "u\t", read_leb128 (data, & bytes_read, 0));
data += bytes_read;
- printf ("%lu\t", read_leb128 (data, & bytes_read, 0));
+ printf ("%" BFD_VMA_FMT "u\t",
+ read_leb128 (data, & bytes_read, 0));
data += bytes_read;
- printf ("%lu\t", read_leb128 (data, & bytes_read, 0));
+ printf ("%" BFD_VMA_FMT "u\t", read_leb128 (data, & bytes_read, 0));
printf ("%s\n\n", name);
break;
case DW_LNE_set_discriminator:
- printf (_("set Discriminator to %lu\n"),
+ printf (_("set Discriminator to %" BFD_VMA_FMT "u\n"),
read_leb128 (data, & bytes_read, 0));
break;
@@ -291,7 +292,7 @@ process_extended_line_op (unsigned char
}
static const char *
-fetch_indirect_string (unsigned long offset)
+fetch_indirect_string (bfd_vma offset)
{
struct dwarf_section *section = &debug_displays [str].section;
@@ -302,7 +303,7 @@ fetch_indirect_string (unsigned long off
offset -= section->address;
if (offset > section->size)
{
- warn (_("DW_FORM_strp offset too big: %lx\n"), offset);
+ warn (_("DW_FORM_strp offset too big: %lx\n"), (long) offset);
return _("<offset is too big>");
}
@@ -605,13 +606,13 @@ decode_location_expression (unsigned cha
unsigned int pointer_size,
unsigned int offset_size,
int dwarf_version,
- unsigned long length,
- unsigned long cu_offset,
+ bfd_vma length,
+ bfd_vma cu_offset,
struct dwarf_section * section)
{
unsigned op;
unsigned int bytes_read;
- unsigned long uvalue;
+ bfd_vma uvalue;
unsigned char *end = data + length;
int need_frame_base = 0;
@@ -662,11 +663,13 @@ decode_location_expression (unsigned cha
data += 8;
break;
case DW_OP_constu:
- printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
+ printf ("DW_OP_constu: %" BFD_VMA_FMT "u",
+ read_leb128 (data, &bytes_read, 0));
data += bytes_read;
break;
case DW_OP_consts:
- printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
+ printf ("DW_OP_consts: %" BFD_VMA_FMT "d",
+ read_leb128 (data, &bytes_read, 1));
data += bytes_read;
break;
case DW_OP_dup:
@@ -721,7 +724,7 @@ decode_location_expression (unsigned cha
printf ("DW_OP_plus");
break;
case DW_OP_plus_uconst:
- printf ("DW_OP_plus_uconst: %lu",
+ printf ("DW_OP_plus_uconst: %" BFD_VMA_FMT "u",
read_leb128 (data, &bytes_read, 0));
data += bytes_read;
break;
@@ -867,7 +870,8 @@ decode_location_expression (unsigned cha
case DW_OP_breg29:
case DW_OP_breg30:
case DW_OP_breg31:
- printf ("DW_OP_breg%d (%s): %ld", op - DW_OP_breg0,
+ printf ("DW_OP_breg%d (%s): %" BFD_VMA_FMT "d",
+ op - DW_OP_breg0,
regname (op - DW_OP_breg0, 1),
read_leb128 (data, &bytes_read, 1));
data += bytes_read;
@@ -876,22 +880,26 @@ decode_location_expression (unsigned cha
case DW_OP_regx:
uvalue = read_leb128 (data, &bytes_read, 0);
data += bytes_read;
- printf ("DW_OP_regx: %lu (%s)", uvalue, regname (uvalue, 1));
+ printf ("DW_OP_regx: %" BFD_VMA_FMT "u (%s)",
+ uvalue, regname (uvalue, 1));
break;
case DW_OP_fbreg:
need_frame_base = 1;
- printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
+ printf ("DW_OP_fbreg: %" BFD_VMA_FMT "d",
+ read_leb128 (data, &bytes_read, 1));
data += bytes_read;
break;
case DW_OP_bregx:
uvalue = read_leb128 (data, &bytes_read, 0);
data += bytes_read;
- printf ("DW_OP_bregx: %lu (%s) %ld", uvalue, regname (uvalue, 1),
+ printf ("DW_OP_bregx: %" BFD_VMA_FMT "u (%s) %" BFD_VMA_FMT "d",
+ uvalue, regname (uvalue, 1),
read_leb128 (data, &bytes_read, 1));
data += bytes_read;
break;
case DW_OP_piece:
- printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
+ printf ("DW_OP_piece: %" BFD_VMA_FMT "u",
+ read_leb128 (data, &bytes_read, 0));
data += bytes_read;
break;
case DW_OP_deref_size:
@@ -911,13 +919,15 @@ decode_location_expression (unsigned cha
case DW_OP_call2:
/* XXX: Strictly speaking for 64-bit DWARF3 files
this ought to be an 8-byte wide computation. */
- printf ("DW_OP_call2: <0x%lx>", (long) byte_get (data, 2) + cu_offset);
+ printf ("DW_OP_call2: <0x%" BFD_VMA_FMT "x>",
+ (bfd_signed_vma) byte_get (data, 2) + cu_offset);
data += 2;
break;
case DW_OP_call4:
/* XXX: Strictly speaking for 64-bit DWARF3 files
this ought to be an 8-byte wide computation. */
- printf ("DW_OP_call4: <0x%lx>", (long) byte_get (data, 4) + cu_offset);
+ printf ("DW_OP_call4: <0x%" BFD_VMA_FMT "x>",
+ (bfd_signed_vma) byte_get (data, 4) + cu_offset);
data += 4;
break;
case DW_OP_call_ref:
@@ -950,9 +960,11 @@ decode_location_expression (unsigned cha
break;
case DW_OP_bit_piece:
printf ("DW_OP_bit_piece: ");
- printf ("size: %lu ", read_leb128 (data, &bytes_read, 0));
+ printf ("size: %" BFD_VMA_FMT "u ",
+ read_leb128 (data, &bytes_read, 0));
data += bytes_read;
- printf ("offset: %lu ", read_leb128 (data, &bytes_read, 0));
+ printf ("offset: %" BFD_VMA_FMT "u ",
+ read_leb128 (data, &bytes_read, 0));
data += bytes_read;
break;
@@ -1001,16 +1013,20 @@ decode_location_expression (unsigned cha
}
if (dwarf_version == 2)
{
- printf ("DW_OP_GNU_implicit_pointer: <0x%lx> %ld",
- (long) byte_get (data, pointer_size),
- read_leb128 (data + pointer_size, &bytes_read, 1));
+ printf ("DW_OP_GNU_implicit_pointer: "
+ "<0x%" BFD_VMA_FMT "x> %" BFD_VMA_FMT "d",
+ (bfd_vma) byte_get (data, pointer_size),
+ (bfd_signed_vma) read_leb128 (data + pointer_size,
+ &bytes_read, 1));
data += pointer_size + bytes_read;
}
else
{
- printf ("DW_OP_GNU_implicit_pointer: <0x%lx> %ld",
- (long) byte_get (data, offset_size),
- read_leb128 (data + offset_size, &bytes_read, 1));
+ printf ("DW_OP_GNU_implicit_pointer: "
+ "<0x%" BFD_VMA_FMT "x> %" BFD_VMA_FMT "d",
+ (bfd_vma) byte_get (data, offset_size),
+ (bfd_signed_vma) read_leb128 (data + offset_size,
+ &bytes_read, 1));
data += offset_size + bytes_read;
}
break;
@@ -1072,15 +1088,15 @@ static unsigned char *
read_and_display_attr_value (unsigned long attribute,
unsigned long form,
unsigned char * data,
- unsigned long cu_offset,
- unsigned long pointer_size,
- unsigned long offset_size,
+ bfd_vma cu_offset,
+ bfd_vma pointer_size,
+ bfd_vma offset_size,
int dwarf_version,
debug_info * debug_info_p,
int do_loc,
struct dwarf_section * section)
{
- unsigned long uvalue = 0;
+ bfd_vma uvalue = 0;
unsigned char *block_start = NULL;
unsigned char * orig_data = data;
unsigned int bytes_read;
@@ -1167,7 +1183,7 @@ read_and_display_attr_value (unsigned lo
{
case DW_FORM_ref_addr:
if (!do_loc)
- printf (" <0x%lx>", uvalue);
+ printf (" <0x%" BFD_VMA_FMT "x>", uvalue);
break;
case DW_FORM_ref1:
@@ -1175,14 +1191,14 @@ read_and_display_attr_value (unsigned lo
case DW_FORM_ref4:
case DW_FORM_ref_udata:
if (!do_loc)
- printf (" <0x%lx>", uvalue + cu_offset);
+ printf (" <0x%" BFD_VMA_FMT "x>", uvalue + cu_offset);
break;
case DW_FORM_data4:
case DW_FORM_addr:
case DW_FORM_sec_offset:
if (!do_loc)
- printf (" 0x%lx", uvalue);
+ printf (" 0x%" BFD_VMA_FMT "x", uvalue);
break;
case DW_FORM_flag_present:
@@ -1192,7 +1208,7 @@ read_and_display_attr_value (unsigned lo
case DW_FORM_sdata:
case DW_FORM_udata:
if (!do_loc)
- printf (" %ld", uvalue);
+ printf (" %" BFD_VMA_FMT "d", uvalue);
break;
case DW_FORM_ref8:
@@ -1200,7 +1216,7 @@ read_and_display_attr_value (unsigned lo
if (!do_loc)
{
uvalue = byte_get (data, 4);
- printf (" 0x%lx", uvalue);
+ printf (" 0x%" BFD_VMA_FMT "x", uvalue);
printf (" 0x%lx", (unsigned long) byte_get (data + 4, 4));
}
if ((do_loc || do_debug_loc || do_debug_ranges)
@@ -1209,7 +1225,7 @@ read_and_display_attr_value (unsigned lo
if (sizeof (uvalue) == 8)
uvalue = byte_get (data, 8);
else
- error (_("DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8\n"));
+ error (_("DW_FORM_data8 is unsupported when sizeof (bfd_vma) != 8\n"));
}
data += 8;
break;
@@ -1259,7 +1275,7 @@ read_and_display_attr_value (unsigned lo
case DW_FORM_strp:
if (!do_loc)
- printf (_(" (indirect string, offset: 0x%lx): %s"),
+ printf (_(" (indirect string, offset: 0x%" BFD_VMA_FMT "x): %s"),
uvalue, fetch_indirect_string (uvalue));
break;
@@ -1313,7 +1329,7 @@ read_and_display_attr_value (unsigned lo
if (lmax == 0 || num >= lmax)
{
lmax += 1024;
- debug_info_p->loc_offsets = (long unsigned int *)
+ debug_info_p->loc_offsets = (bfd_vma *)
xcrealloc (debug_info_p->loc_offsets,
lmax, sizeof (*debug_info_p->loc_offsets));
debug_info_p->have_frame_base = (int *)
@@ -1344,7 +1360,7 @@ read_and_display_attr_value (unsigned lo
if (lmax == 0 || num >= lmax)
{
lmax += 1024;
- debug_info_p->range_lists = (long unsigned int *)
+ debug_info_p->range_lists = (bfd_vma *)
xcrealloc (debug_info_p->range_lists,
lmax, sizeof (*debug_info_p->range_lists));
debug_info_p->max_range_lists = lmax;
@@ -1383,7 +1399,8 @@ read_and_display_attr_value (unsigned lo
printf (_("(declared as inline and inlined)"));
break;
default:
- printf (_(" (Unknown inline attribute value: %lx)"), uvalue);
+ printf (_(" (Unknown inline attribute value: %" BFD_VMA_FMT "x)"),
+ uvalue);
break;
}
break;
@@ -1421,9 +1438,9 @@ read_and_display_attr_value (unsigned lo
case DW_LANG_Upc: printf ("(Unified Parallel C)"); break;
default:
if (uvalue >= DW_LANG_lo_user && uvalue <= DW_LANG_hi_user)
- printf ("(implementation defined: %lx)", uvalue);
+ printf ("(implementation defined: %" BFD_VMA_FMT "x)", uvalue);
else
- printf ("(Unknown: %lx)", uvalue);
+ printf ("(Unknown: %" BFD_VMA_FMT "x)", uvalue);
break;
}
break;
@@ -1584,7 +1601,7 @@ read_and_display_attr_value (unsigned lo
uvalue += cu_offset;
if (uvalue >= section->size)
- warn (_("Offset %lx used as value for DW_AT_import attribute of DIE at offset %lx is too big.\n"),
+ warn (_("Offset %" BFD_VMA_FMT "x used as value for DW_AT_import attribute of DIE at offset %lx is too big.\n"),
uvalue, (unsigned long) (orig_data - section->start));
else
{
@@ -1786,9 +1803,9 @@ static unsigned char *
read_and_display_attr (unsigned long attribute,
unsigned long form,
unsigned char * data,
- unsigned long cu_offset,
- unsigned long pointer_size,
- unsigned long offset_size,
+ bfd_vma cu_offset,
+ bfd_vma pointer_size,
+ bfd_vma offset_size,
int dwarf_version,
debug_info * debug_info_p,
int do_loc,
@@ -1900,7 +1917,7 @@ process_debug_info (struct dwarf_section
unsigned char *hdrptr;
unsigned char *tags;
int level;
- unsigned long cu_offset;
+ bfd_vma cu_offset;
int offset_size;
int initial_length_size;
unsigned char signature[8] = { 0 };
@@ -1970,11 +1987,13 @@ process_debug_info (struct dwarf_section
if (!do_loc)
{
- printf (_(" Compilation Unit @ offset 0x%lx:\n"), cu_offset);
- printf (_(" Length: 0x%lx (%s)\n"), compunit.cu_length,
+ printf (_(" Compilation Unit @ offset 0x%" BFD_VMA_FMT "x:\n"), cu_offset);
+ printf (_(" Length: 0x%" BFD_VMA_FMT "x (%s)\n"),
+ compunit.cu_length,
initial_length_size == 8 ? "64-bit" : "32-bit");
printf (_(" Version: %d\n"), compunit.cu_version);
- printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
+ printf (_(" Abbrev Offset: %" BFD_VMA_FMT "d\n"),
+ compunit.cu_abbrev_offset);
printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
if (do_types)
{
@@ -1990,7 +2009,9 @@ process_debug_info (struct dwarf_section
if (cu_offset + compunit.cu_length + initial_length_size
> section->size)
{
- warn (_("Debug info is corrupted, length of CU at %lx extends beyond end of section (length = %lx)\n"),
+ warn (_("Debug info is corrupted, length of CU at %"
+ BFD_VMA_FMT "x extends beyond end of section (length = %"
+ BFD_VMA_FMT "x)\n"),
cu_offset, compunit.cu_length);
break;
}
@@ -2001,7 +2022,8 @@ process_debug_info (struct dwarf_section
&& compunit.cu_version != 3
&& compunit.cu_version != 4)
{
- warn (_("CU at offset %lx contains corrupt or unsupported version number: %d.\n"),
+ warn (_("CU at offset %" BFD_VMA_FMT "x contains corrupt or "
+ "unsupported version number: %d.\n"),
cu_offset, compunit.cu_version);
continue;
}
@@ -2268,7 +2290,7 @@ display_debug_lines_raw (struct dwarf_se
linfo.li_line_base >>= 24;
printf (_(" Offset: 0x%lx\n"), hdroff);
- printf (_(" Length: %ld\n"), linfo.li_length);
+ printf (_(" Length: %ld\n"), (long) linfo.li_length);
printf (_(" DWARF Version: %d\n"), linfo.li_version);
printf (_(" Prologue Length: %d\n"), linfo.li_prologue_length);
printf (_(" Minimum Instruction Length: %d\n"), linfo.li_min_insn_length);
@@ -2329,11 +2351,14 @@ display_debug_lines_raw (struct dwarf_se
data += strlen ((char *) data) + 1;
- printf ("%lu\t", read_leb128 (data, & bytes_read, 0));
+ printf ("%" BFD_VMA_FMT "u\t",
+ read_leb128 (data, & bytes_read, 0));
data += bytes_read;
- printf ("%lu\t", read_leb128 (data, & bytes_read, 0));
+ printf ("%" BFD_VMA_FMT "u\t",
+ read_leb128 (data, & bytes_read, 0));
data += bytes_read;
- printf ("%lu\t", read_leb128 (data, & bytes_read, 0));
+ printf ("%" BFD_VMA_FMT "u\t",
+ read_leb128 (data, & bytes_read, 0));
data += bytes_read;
printf ("%s\n", name);
}
@@ -2505,7 +2530,8 @@ display_debug_lines_raw (struct dwarf_se
for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
{
- printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
+ printf ("0x%" BFD_VMA_FMT "x%s",
+ read_leb128 (data, &bytes_read, 0),
i == 1 ? "" : ", ");
data += bytes_read;
}
@@ -2918,7 +2944,8 @@ display_debug_lines_decoded (struct dwar
for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
{
- printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
+ printf ("0x%" BFD_VMA_FMT "x%s",
+ read_leb128 (data, &bytes_read, 0),
i == 1 ? "" : ", ");
data += bytes_read;
}
@@ -3076,7 +3103,7 @@ display_debug_pubnames (struct dwarf_sec
&& num_debug_info_entries > 0
&& find_debug_info_for_offset (names.pn_offset) == NULL)
warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
- names.pn_offset, section->name);
+ (unsigned long) names.pn_offset, section->name);
names.pn_size = byte_get (data, offset_size);
data += offset_size;
@@ -3097,13 +3124,13 @@ display_debug_pubnames (struct dwarf_sec
}
printf (_(" Length: %ld\n"),
- names.pn_length);
+ (long) names.pn_length);
printf (_(" Version: %d\n"),
names.pn_version);
printf (_(" Offset into .debug_info section: 0x%lx\n"),
- names.pn_offset);
+ (unsigned long) names.pn_offset);
printf (_(" Size of area in .debug_info section: %ld\n"),
- names.pn_size);
+ (long) names.pn_size);
printf (_("\n Offset\tName\n"));
@@ -3323,7 +3350,7 @@ display_debug_loc (struct dwarf_section
/* DWARF sections under Mach-O have non-zero addresses. */
if (debug_information [first].num_loc_offsets > 0
&& debug_information [first].loc_offsets [0] != section->address)
- warn (_("Location lists in %s section start at 0x%lx\n"),
+ warn (_("Location lists in %s section start at 0x%" BFD_VMA_FMT "x\n"),
section->name, debug_information [first].loc_offsets [0]);
printf (_("Contents of the %s section:\n\n"), section->name);
@@ -3596,7 +3623,7 @@ display_debug_aranges (struct dwarf_sect
&& num_debug_info_entries > 0
&& find_debug_info_for_offset (arange.ar_info_offset) == NULL)
warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
- arange.ar_info_offset, section->name);
+ (unsigned long) arange.ar_info_offset, section->name);
arange.ar_pointer_size = byte_get (hdrptr, 1);
hdrptr += 1;
@@ -3610,9 +3637,11 @@ display_debug_aranges (struct dwarf_sect
break;
}
- printf (_(" Length: %ld\n"), arange.ar_length);
+ printf (_(" Length: %ld\n"),
+ (long) arange.ar_length);
printf (_(" Version: %d\n"), arange.ar_version);
- printf (_(" Offset into .debug_info: 0x%lx\n"), arange.ar_info_offset);
+ printf (_(" Offset into .debug_info: 0x%lx\n"),
+ (unsigned long) arange.ar_info_offset);
printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
Index: src/binutils/dwarf.h
===================================================================
--- src.orig/binutils/dwarf.h 2011-02-17 11:00:34.000000000 +0100
+++ src/binutils/dwarf.h 2011-02-18 10:25:34.608846800 +0100
@@ -22,6 +22,92 @@
typedef unsigned HOST_WIDEST_INT dwarf_vma;
typedef unsigned HOST_WIDEST_INT dwarf_size_type;
+/* Structure found in the .debug_line section. */
+typedef struct
+{
+ unsigned char li_length [4];
+ unsigned char li_version [2];
+ unsigned char li_prologue_length [4];
+ unsigned char li_min_insn_length [1];
+ unsigned char li_default_is_stmt [1];
+ unsigned char li_line_base [1];
+ unsigned char li_line_range [1];
+ unsigned char li_opcode_base [1];
+}
+DWARF2_External_LineInfo;
+
+typedef struct
+{
+ bfd_vma li_length;
+ unsigned short li_version;
+ unsigned int li_prologue_length;
+ unsigned char li_min_insn_length;
+ unsigned char li_max_ops_per_insn;
+ unsigned char li_default_is_stmt;
+ int li_line_base;
+ unsigned char li_line_range;
+ unsigned char li_opcode_base;
+}
+DWARF2_Internal_LineInfo;
+
+/* Structure found in .debug_pubnames section. */
+typedef struct
+{
+ unsigned char pn_length [4];
+ unsigned char pn_version [2];
+ unsigned char pn_offset [4];
+ unsigned char pn_size [4];
+}
+DWARF2_External_PubNames;
+
+typedef struct
+{
+ bfd_vma pn_length;
+ unsigned short pn_version;
+ bfd_vma pn_offset;
+ bfd_vma pn_size;
+}
+DWARF2_Internal_PubNames;
+
+/* Structure found in .debug_info section. */
+typedef struct
+{
+ unsigned char cu_length [4];
+ unsigned char cu_version [2];
+ unsigned char cu_abbrev_offset [4];
+ unsigned char cu_pointer_size [1];
+}
+DWARF2_External_CompUnit;
+
+typedef struct
+{
+ bfd_vma cu_length;
+ unsigned short cu_version;
+ bfd_vma cu_abbrev_offset;
+ unsigned char cu_pointer_size;
+}
+DWARF2_Internal_CompUnit;
+
+typedef struct
+{
+ unsigned char ar_length [4];
+ unsigned char ar_version [2];
+ unsigned char ar_info_offset [4];
+ unsigned char ar_pointer_size [1];
+ unsigned char ar_segment_size [1];
+}
+DWARF2_External_ARange;
+
+typedef struct
+{
+ bfd_vma ar_length;
+ unsigned short ar_version;
+ bfd_vma ar_info_offset;
+ unsigned char ar_pointer_size;
+ unsigned char ar_segment_size;
+}
+DWARF2_Internal_ARange;
+
struct dwarf_section
{
/* A debug section has a different name when it's stored compressed
@@ -79,15 +165,15 @@ typedef struct
unsigned int pointer_size;
unsigned int offset_size;
int dwarf_version;
- unsigned long cu_offset;
- unsigned long base_address;
+ bfd_vma cu_offset;
+ bfd_vma base_address;
/* This is an array of offsets to the location list table. */
- unsigned long *loc_offsets;
+ bfd_vma *loc_offsets;
int *have_frame_base;
unsigned int num_loc_offsets;
unsigned int max_loc_offsets;
/* List of .debug_ranges offsets seen in this .debug_info. */
- unsigned long *range_lists;
+ bfd_vma *range_lists;
unsigned int num_range_lists;
unsigned int max_range_lists;
}
@@ -131,5 +217,5 @@ void *cmalloc (size_t, size_t);
void *xcmalloc (size_t, size_t);
void *xcrealloc (void *, size_t, size_t);
-unsigned long int read_leb128 (unsigned char *data,
- unsigned int *length_return, int sign);
+bfd_vma read_leb128 (unsigned char *data,
+ unsigned int *length_return, int sign);
Index: src/include/dwarf2.h
===================================================================
--- src.orig/include/dwarf2.h 2011-02-17 11:00:34.000000000 +0100
+++ src/include/dwarf2.h 2011-02-18 10:20:13.267332800 +0100
@@ -44,95 +44,8 @@
/* This file is shared between GCC and GDB, and should not contain
prototypes. */
-#ifndef _ELF_DWARF2_H
-#define _ELF_DWARF2_H
-
-/* Structure found in the .debug_line section. */
-typedef struct
-{
- unsigned char li_length [4];
- unsigned char li_version [2];
- unsigned char li_prologue_length [4];
- unsigned char li_min_insn_length [1];
- unsigned char li_default_is_stmt [1];
- unsigned char li_line_base [1];
- unsigned char li_line_range [1];
- unsigned char li_opcode_base [1];
-}
-DWARF2_External_LineInfo;
-
-typedef struct
-{
- unsigned long li_length;
- unsigned short li_version;
- unsigned int li_prologue_length;
- unsigned char li_min_insn_length;
- unsigned char li_max_ops_per_insn;
- unsigned char li_default_is_stmt;
- int li_line_base;
- unsigned char li_line_range;
- unsigned char li_opcode_base;
-}
-DWARF2_Internal_LineInfo;
-
-/* Structure found in .debug_pubnames section. */
-typedef struct
-{
- unsigned char pn_length [4];
- unsigned char pn_version [2];
- unsigned char pn_offset [4];
- unsigned char pn_size [4];
-}
-DWARF2_External_PubNames;
-
-typedef struct
-{
- unsigned long pn_length;
- unsigned short pn_version;
- unsigned long pn_offset;
- unsigned long pn_size;
-}
-DWARF2_Internal_PubNames;
-
-/* Structure found in .debug_info section. */
-typedef struct
-{
- unsigned char cu_length [4];
- unsigned char cu_version [2];
- unsigned char cu_abbrev_offset [4];
- unsigned char cu_pointer_size [1];
-}
-DWARF2_External_CompUnit;
-
-typedef struct
-{
- unsigned long cu_length;
- unsigned short cu_version;
- unsigned long cu_abbrev_offset;
- unsigned char cu_pointer_size;
-}
-DWARF2_Internal_CompUnit;
-
-typedef struct
-{
- unsigned char ar_length [4];
- unsigned char ar_version [2];
- unsigned char ar_info_offset [4];
- unsigned char ar_pointer_size [1];
- unsigned char ar_segment_size [1];
-}
-DWARF2_External_ARange;
-
-typedef struct
-{
- unsigned long ar_length;
- unsigned short ar_version;
- unsigned long ar_info_offset;
- unsigned char ar_pointer_size;
- unsigned char ar_segment_size;
-}
-DWARF2_Internal_ARange;
-
+#ifndef _DWARF2_H
+#define _DWARF2_H
/* Tag names and codes. */
enum dwarf_tag
@@ -953,4 +866,4 @@ enum dwarf_macinfo_record_type
#define DW_EH_PE_indirect 0x80
-#endif /* _ELF_DWARF2_H */
+#endif /* _DWARF2_H */
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC patch]: Adjust the use of 'long' type in dwarf2.h header
2011-02-18 9:50 ` Kai Tietz
@ 2011-02-21 12:37 ` NightStrike
0 siblings, 0 replies; 16+ messages in thread
From: NightStrike @ 2011-02-21 12:37 UTC (permalink / raw)
To: Kai Tietz
Cc: Alan Modra, GCC Patches, Binutils, gdb, Joel Brobecker, Jakub Jelinek
Ping
On Fri, Feb 18, 2011 at 4:50 AM, Kai Tietz <ktietz70@googlemail.com> wrote:
> 2011/2/17 Jakub Jelinek <jakub@redhat.com>:
>> On Thu, Feb 17, 2011 at 08:06:53PM +0100, Kai Tietz wrote:
>>> > I'd prefer if we could move those binutils specific internal implementation
>>> > details out of the dwarf2.h header, keep it really just for the stuff
>>> > defined in the standard, and add a new binutils specific header somewhere
>>> > else which would contain binutils specific details.
>>>
>>> Well, so we make dwarf2.h in include just host-specific and isn't able
>>> to cover things for foreign target, like 32-bit host can't use this
>>> header for 64-bit dwarf2 information. I am fine by this, but
>>> nevertheless is then the use of 'unsigned long' type within this
>>> header still an issue. Here should be used instead then 'intptr_t'. As
>>> on LLP64 unsigned long isn't wide-enough.
>>
>> I mean that none of the DWARF2_Internal types should be in the
>> include/dwarf2.h headers (that's implementation specific stuff),
>> and the DWARF2_External types are questionable too, to me they look
>> very much like implementation detail too. E.g. DWARF2_External_LineInfo
>> type is dubious, because it might somehow describe version 2 or 3
>> .debug_line header, but version 4 looks differently, etc.
>> So IMHO the DWARF2_External stuff should be moved too.
>> And the guard should be probably renamed from _ELF_DWARF2_H to _DWARF2_H,
>> I don't see anything ELF specific in the header.
>>
>> Jakub
>>
>
> So I reworked my patch as Jakub suggested and retested it for
> x86_64-w64-mingw32, i686-w64-mingw32, and x86_64-pc-linux-gnu for gcc,
> binutils, and gdb. Ok for apply?
>
> binutils, gdb, gcc
>
> ChangeLog include/
>
> 2011-02-18 Kai Tietz
>
> * dwarf2.h (_ELF_DWARF2_H): Renamed to
> _DWARF2_H.
> (DWARF2_External_LineInfo, DWARF2_Internal_LineInfo,
> DWARF2_External_PubNames, DWARF2_Internal_PubNames,
> DWARF2_External_CompUnit, DWARF2_Internal_CompUnit,
> DWARF2_External_ARange, DWARF2_Internal_ARange): Removed.
>
>
> ChangeLog binutils/
>
> 2011-02-18 Kai Tietz
>
> * dwarf.c (read_leb128): Use dw2_vma_t instead of
> long type.
> (process_extended_line_op): Use for adr bfd_vma
> type and print those typed values via BFD_VMA_FMT.
> (fetch_indirect_string): Adjust offset's type.
> (decode_location_expression): Adjust argument types
> and uvalue type.
> (read_and_display_attr_value): Likewise.
> (read_and_display_attr): Likewise.
> (decode_location_expression): Adjust printf format.
> (process_debug_info): Likewise.
> (display_debug_lines_raw): Likewise.
> (display_debug_lines_decoded): Likewise.
> (display_debug_pubnames): Likewise.
> (display_debug_loc): Likewise.
> (display_debug_aranges): Likewise.
> * dwarf.h (DWARF2_External_LineInfo,
> DWARF2_Internal_LineInfo, DWARF2_External_PubNames,
> DWARF2_Internal_PubNames, DWARF2_External_CompUnit,
> DWARF2_Internal_CompUnit, DWARF2_External_ARange,
> DWARF2_Internal_ARange): Added..
> (read_leb128): Adjust return type.
>
> Regards,
> Kai
>
> PS: A lot of those moved structures aren't used at all in binutils
> dwarf.c (which is the only consumer of some of those structures as a
> grep over binutils/gdb/gcc had shown). So maybe the unused could be
> removed in a second patch completely.
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* RE: [RFC patch]: Adjust the use of 'long' type in dwarf2.h header
2011-02-17 14:21 [RFC patch]: Adjust the use of 'long' type in dwarf2.h header Kai Tietz
2011-02-17 18:59 ` Kai Tietz
@ 2011-02-21 13:10 ` Pierre Muller
[not found] ` <-8460070221060995487@unknownmsgid>
2 siblings, 0 replies; 16+ messages in thread
From: Pierre Muller @ 2011-02-21 13:10 UTC (permalink / raw)
To: 'Kai Tietz', 'GCC Patches', 'Binutils',
'gdb'
Cc: 'Jakub Jelinek', 'Joel Brobecker'
I was just wondering about all those
_("Text with some 0x" BFD_VMA_FMT "x\n"), adr);
constructs:
If we do the translations on a 64-bit unix machine
we will have translations for
"Text with some 0xllx\n"
but a mingw 64-bit executable will look for
"Text with some 0xI64x\n"
while a 32-bit system will look for
"Text with some 0xlx\n"
and in both cases, no translation will be found.
Wouldn't it be better to use something similar
to paddress in src/gdb/utils.c
let's call it dwarf_vma function,
so that we have:
_("Text with some 0x%s\n"), dwarf_vma (adr));
with a unique "Text with some 0x%s\n"
string that gets internationalized correctly?
Pierre Muller
GDB pascal language maintainer
> -----Message d'origine-----
> De : gdb-owner@sourceware.org [mailto:gdb-owner@sourceware.org] De la
> part de Kai Tietz
> Envoyé : jeudi 17 février 2011 15:22
> À : GCC Patches; Binutils; gdb
> Cc : Jakub Jelinek; Joel Brobecker
> Objet : [RFC patch]: Adjust the use of 'long' type in dwarf2.h header
>
> Hello,
>
> This patch addresses issues I've seen in binutils about
> cross-compilers and dwarf2 display via objdump -W on hosts, which have
> sizeof (long) < target's sizeof(void *). Additionally same issue of
> course can be seen on LLP64 targets, too.
> Those issues are caused by the fact that the dwarf2.h header in
> include/ is using unconditionally the type 'unsigned long' for
> vma-scalars.
>
> This patch address additionally the binutils' dwarf.(c|h) files and
> make them host bitness independent for gcc base toolchains supporting
> the 'long long' type.
>
> I've tested the attached patches for gdb, binutils, and gcc on
> i686-w64-mingw32, and x86_64-w64-mingw32 cross-toolchains hosted on
> cygwin. And I didn't found until now regressions. Later this day I
> want to do a regression test for linux64, too.
>
>
> binutils, gdb, gcc
>
> ChangeLog include/
>
> 2011-02-17 Kai Tietz
>
> * dwarf2.h (dw2_vma_t): New type.
> (dw2_svma_t): New type.
> (DW2_VMA_FMT): New macro specifying
> to be used width-sepecifier for printing
> new types.
>
>
> ChangeLog binutils/
>
> 2011-02-17 Kai Tietz
>
> * dwarf.c (read_leb128): Use dw2_vma_t instead of
> long type.
> (process_extended_line_op): Use for adr new type
> and print dw2 values via DW2_VMA_FMT.
> (fetch_indirect_string): Adjust offset's type.
> (decode_location_expression): Adjust argument types
> and uvalue type.
> (read_and_display_attr_value): Likewise.
> (read_and_display_attr): Likewise.
> (decode_location_expression): Adjust printf format.
> (process_debug_info): Likewise.
> (display_debug_lines_raw): Likewise.
> (display_debug_lines_decoded): Likewise.
> (display_debug_pubnames): Likewise.
> (display_debug_loc): Likewise.
> (display_debug_aranges): Likewise.
> * dwarf.h: Add include of dwarf2.h header and
> use of dw2_vma_t instead of long types.
> (read_leb128): Adjust return type.
>
>
> Regards,
> Kai
>
>
> PS: On gdb there is at the moment in gdb/common part the include-path
> to intl for libintl.h missing
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC patch]: Adjust the use of 'long' type in dwarf2.h header
[not found] ` <-8460070221060995487@unknownmsgid>
@ 2011-02-21 13:27 ` Kai Tietz
2011-02-21 13:46 ` Pierre Muller
[not found] ` <-6930711422310680743@unknownmsgid>
0 siblings, 2 replies; 16+ messages in thread
From: Kai Tietz @ 2011-02-21 13:27 UTC (permalink / raw)
To: Pierre Muller; +Cc: GCC Patches, Binutils, gdb, Jakub Jelinek, Joel Brobecker
2011/2/21 Pierre Muller <pierre.muller@ics-cnrs.unistra.fr>:
> I was just wondering about all those
> _("Text with some 0x" BFD_VMA_FMT "x\n"), adr);
> constructs:
> If we do the translations on a 64-bit unix machine
> we will have translations for
> "Text with some 0xllx\n"
> but a mingw 64-bit executable will look for
> "Text with some 0xI64x\n"
> while a 32-bit system will look for
> "Text with some 0xlx\n"
> and in both cases, no translation will be found.
>
> Wouldn't it be better to use something similar
> to paddress in src/gdb/utils.c
> let's call it dwarf_vma function,
> so that we have:
> _("Text with some 0x%s\n"), dwarf_vma (adr));
> with a unique "Text with some 0x%s\n"
> string that gets internationalized correctly?
>
>
> Pierre Muller
> GDB pascal language maintainer
>
>
>> -----Message d'origine-----
>> De : gdb-owner@sourceware.org [mailto:gdb-owner@sourceware.org] De la
>> part de Kai Tietz
>> Envoyé : jeudi 17 février 2011 15:22
>> À : GCC Patches; Binutils; gdb
>> Cc : Jakub Jelinek; Joel Brobecker
>> Objet : [RFC patch]: Adjust the use of 'long' type in dwarf2.h header
>>
>> Hello,
>>
>> This patch addresses issues I've seen in binutils about
>> cross-compilers and dwarf2 display via objdump -W on hosts, which have
>> sizeof (long) < target's sizeof(void *). Additionally same issue of
>> course can be seen on LLP64 targets, too.
>> Those issues are caused by the fact that the dwarf2.h header in
>> include/ is using unconditionally the type 'unsigned long' for
>> vma-scalars.
>>
>> This patch address additionally the binutils' dwarf.(c|h) files and
>> make them host bitness independent for gcc base toolchains supporting
>> the 'long long' type.
>>
>> I've tested the attached patches for gdb, binutils, and gcc on
>> i686-w64-mingw32, and x86_64-w64-mingw32 cross-toolchains hosted on
>> cygwin. And I didn't found until now regressions. Later this day I
>> want to do a regression test for linux64, too.
>>
>>
>> binutils, gdb, gcc
>>
>> ChangeLog include/
>>
>> 2011-02-17 Kai Tietz
>>
>> * dwarf2.h (dw2_vma_t): New type.
>> (dw2_svma_t): New type.
>> (DW2_VMA_FMT): New macro specifying
>> to be used width-sepecifier for printing
>> new types.
>>
>>
>> ChangeLog binutils/
>>
>> 2011-02-17 Kai Tietz
>>
>> * dwarf.c (read_leb128): Use dw2_vma_t instead of
>> long type.
>> (process_extended_line_op): Use for adr new type
>> and print dw2 values via DW2_VMA_FMT.
>> (fetch_indirect_string): Adjust offset's type.
>> (decode_location_expression): Adjust argument types
>> and uvalue type.
>> (read_and_display_attr_value): Likewise.
>> (read_and_display_attr): Likewise.
>> (decode_location_expression): Adjust printf format.
>> (process_debug_info): Likewise.
>> (display_debug_lines_raw): Likewise.
>> (display_debug_lines_decoded): Likewise.
>> (display_debug_pubnames): Likewise.
>> (display_debug_loc): Likewise.
>> (display_debug_aranges): Likewise.
>> * dwarf.h: Add include of dwarf2.h header and
>> use of dw2_vma_t instead of long types.
>> (read_leb128): Adjust return type.
>>
>>
>> Regards,
>> Kai
>>
>>
>> PS: On gdb there is at the moment in gdb/common part the include-path
>> to intl for libintl.h missing
>
>
Yes, I saw this too and it is a thorn here. But the issue about a
transformation function (like dwarf_vma) is that we have memory leaks
- as this function is to be used on some printf's more then once - as
static buffer would be overriden. Well printfs can be splitted into
smaller parts, but this then would make localization even harder.
Maybe it would be better here to remove those localizations?
Regards,
Kai
--
| (\_/) This is Bunny. Copy and paste
| (='.'=) Bunny into your signature to help
| (")_(") him gain world domination
^ permalink raw reply [flat|nested] 16+ messages in thread
* RE: [RFC patch]: Adjust the use of 'long' type in dwarf2.h header
2011-02-21 13:27 ` Kai Tietz
@ 2011-02-21 13:46 ` Pierre Muller
[not found] ` <-6930711422310680743@unknownmsgid>
1 sibling, 0 replies; 16+ messages in thread
From: Pierre Muller @ 2011-02-21 13:46 UTC (permalink / raw)
To: 'Kai Tietz'
Cc: 'GCC Patches', 'Binutils', 'gdb',
'Jakub Jelinek', 'Joel Brobecker'
> Yes, I saw this too and it is a thorn here. But the issue about a
> transformation function (like dwarf_vma) is that we have memory leaks
> - as this function is to be used on some printf's more then once - as
> static buffer would be overriden. Well printfs can be splitted into
> smaller parts, but this then would make localization even harder.
In GDB code, this is solved in utils.c source by the use of the
get_cell function, which rotates over 16 char arrays of size 50 each
currently, in dwarf.c 4 arrays of 16 char (as long as longest address is
64-bit)
for this dwarf_vma function would probably be enough, no?
Pierre Muller
GDB pascal language maintainer
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC patch]: Adjust the use of 'long' type in dwarf2.h header
[not found] ` <-6930711422310680743@unknownmsgid>
@ 2011-02-21 14:30 ` Kai Tietz
2011-02-21 15:25 ` Kai Tietz
0 siblings, 1 reply; 16+ messages in thread
From: Kai Tietz @ 2011-02-21 14:30 UTC (permalink / raw)
To: Pierre Muller; +Cc: GCC Patches, Binutils, gdb, Jakub Jelinek, Joel Brobecker
2011/2/21 Pierre Muller <pierre.muller@ics-cnrs.unistra.fr>:
>> Yes, I saw this too and it is a thorn here. But the issue about a
>> transformation function (like dwarf_vma) is that we have memory leaks
>> - as this function is to be used on some printf's more then once - as
>> static buffer would be overriden. Well printfs can be splitted into
>> smaller parts, but this then would make localization even harder.
>
> In GDB code, this is solved in utils.c source by the use of the
> get_cell function, which rotates over 16 char arrays of size 50 each
> currently, in dwarf.c 4 arrays of 16 char (as long as longest address is
> 64-bit)
> for this dwarf_vma function would probably be enough, no?
>
>
> Pierre Muller
> GDB pascal language maintainer
Yes, this sounds ok. I think maximum here are right now 3 dwarf_vma
prints within one printf. So it should be ok. I'll add here such a
rotating function. I don't assume we need here to handle
multi-threading, so rotation code can be pretty simple.
Kai
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC patch]: Adjust the use of 'long' type in dwarf2.h header
2011-02-21 14:30 ` Kai Tietz
@ 2011-02-21 15:25 ` Kai Tietz
2011-02-21 15:43 ` Mark Kettenis
2011-02-22 15:21 ` Nick Clifton
0 siblings, 2 replies; 16+ messages in thread
From: Kai Tietz @ 2011-02-21 15:25 UTC (permalink / raw)
To: Pierre Muller; +Cc: GCC Patches, Binutils, gdb, Jakub Jelinek, Joel Brobecker
[-- Attachment #1: Type: text/plain, Size: 1313 bytes --]
2011/2/21 Kai Tietz <ktietz70@googlemail.com>:
> 2011/2/21 Pierre Muller <pierre.muller@ics-cnrs.unistra.fr>:
>>> Yes, I saw this too and it is a thorn here. But the issue about a
>>> transformation function (like dwarf_vma) is that we have memory leaks
>>> - as this function is to be used on some printf's more then once - as
>>> static buffer would be overriden. Well printfs can be splitted into
>>> smaller parts, but this then would make localization even harder.
>>
>> In GDB code, this is solved in utils.c source by the use of the
>> get_cell function, which rotates over 16 char arrays of size 50 each
>> currently, in dwarf.c 4 arrays of 16 char (as long as longest address is
>> 64-bit)
>> for this dwarf_vma function would probably be enough, no?
>>
>>
>> Pierre Muller
>> GDB pascal language maintainer
>
> Yes, this sounds ok. I think maximum here are right now 3 dwarf_vma
> prints within one printf. So it should be ok. I'll add here such a
> rotating function. I don't assume we need here to handle
> multi-threading, so rotation code can be pretty simple.
>
> Kai
>
So this version uses new function dwarf_vma_print function for
printf-messages, which are getting localized.
Tested for x86_64-w64-mingw32 and x86_64-pc-linux-gnu. Ok for apply?
Regards,
Kai
[-- Attachment #2: b_dw2_inc.txt --]
[-- Type: text/plain, Size: 26569 bytes --]
Index: src/binutils/dwarf.c
===================================================================
--- src.orig/binutils/dwarf.c 2011-02-05 21:34:39.000000000 +0100
+++ src/binutils/dwarf.c 2011-02-21 16:20:00.124265900 +0100
@@ -123,10 +123,28 @@ print_dwarf_vma (dwarf_vma val, unsigned
fputs (buff + (byte_size == 4 ? 8 : 0), stdout);
}
-unsigned long int
+static const char *
+dwarf_vma_print (const char *fmtch, bfd_vma value)
+{
+ static int buf_pos = 0;
+ static struct dwarf_vma_print_buf {
+ char place[64];
+ } buf[16];
+ char fmt[32];
+ char *ret;
+
+ sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
+ ret = &buf[buf_pos++].place[0];
+ buf_pos &= 15;
+
+ snprintf (ret, 64, fmt, value);
+ return ret;
+}
+
+bfd_vma
read_leb128 (unsigned char *data, unsigned int *length_return, int sign)
{
- unsigned long int result = 0;
+ bfd_vma result = 0;
unsigned int num_read = 0;
unsigned int shift = 0;
unsigned char byte;
@@ -136,7 +154,7 @@ read_leb128 (unsigned char *data, unsign
byte = *data++;
num_read++;
- result |= ((unsigned long int) (byte & 0x7f)) << shift;
+ result |= ((bfd_vma) (byte & 0x7f)) << shift;
shift += 7;
@@ -193,7 +211,7 @@ process_extended_line_op (unsigned char
unsigned int bytes_read;
unsigned int len;
unsigned char *name;
- unsigned long adr;
+ bfd_vma adr;
len = read_leb128 (data, & bytes_read, 0);
data += bytes_read;
@@ -218,7 +236,7 @@ process_extended_line_op (unsigned char
case DW_LNE_set_address:
adr = byte_get (data, len - bytes_read - 1);
- printf (_("set Address to 0x%lx\n"), adr);
+ printf (_("set Address to 0x%s\n"), dwarf_vma_print ("x", adr));
state_machine_regs.address = adr;
state_machine_regs.op_index = 0;
break;
@@ -230,17 +248,19 @@ process_extended_line_op (unsigned char
printf (" %d\t", ++state_machine_regs.last_file_entry);
name = data;
data += strlen ((char *) data) + 1;
- printf ("%lu\t", read_leb128 (data, & bytes_read, 0));
+ printf ("%" BFD_VMA_FMT "u\t", read_leb128 (data, & bytes_read, 0));
data += bytes_read;
- printf ("%lu\t", read_leb128 (data, & bytes_read, 0));
+ printf ("%" BFD_VMA_FMT "u\t",
+ read_leb128 (data, & bytes_read, 0));
data += bytes_read;
- printf ("%lu\t", read_leb128 (data, & bytes_read, 0));
+ printf ("%" BFD_VMA_FMT "u\t", read_leb128 (data, & bytes_read, 0));
printf ("%s\n\n", name);
break;
case DW_LNE_set_discriminator:
- printf (_("set Discriminator to %lu\n"),
- read_leb128 (data, & bytes_read, 0));
+ printf (_("set Discriminator to %s\n"),
+ dwarf_vma_print ("u",
+ read_leb128 (data, & bytes_read, 0)));
break;
/* HP extensions. */
@@ -291,7 +311,7 @@ process_extended_line_op (unsigned char
}
static const char *
-fetch_indirect_string (unsigned long offset)
+fetch_indirect_string (bfd_vma offset)
{
struct dwarf_section *section = &debug_displays [str].section;
@@ -302,7 +322,7 @@ fetch_indirect_string (unsigned long off
offset -= section->address;
if (offset > section->size)
{
- warn (_("DW_FORM_strp offset too big: %lx\n"), offset);
+ warn (_("DW_FORM_strp offset too big: %lx\n"), (long) offset);
return _("<offset is too big>");
}
@@ -605,13 +625,13 @@ decode_location_expression (unsigned cha
unsigned int pointer_size,
unsigned int offset_size,
int dwarf_version,
- unsigned long length,
- unsigned long cu_offset,
+ bfd_vma length,
+ bfd_vma cu_offset,
struct dwarf_section * section)
{
unsigned op;
unsigned int bytes_read;
- unsigned long uvalue;
+ bfd_vma uvalue;
unsigned char *end = data + length;
int need_frame_base = 0;
@@ -662,11 +682,13 @@ decode_location_expression (unsigned cha
data += 8;
break;
case DW_OP_constu:
- printf ("DW_OP_constu: %lu", read_leb128 (data, &bytes_read, 0));
+ printf ("DW_OP_constu: %" BFD_VMA_FMT "u",
+ read_leb128 (data, &bytes_read, 0));
data += bytes_read;
break;
case DW_OP_consts:
- printf ("DW_OP_consts: %ld", read_leb128 (data, &bytes_read, 1));
+ printf ("DW_OP_consts: %" BFD_VMA_FMT "d",
+ read_leb128 (data, &bytes_read, 1));
data += bytes_read;
break;
case DW_OP_dup:
@@ -721,7 +743,7 @@ decode_location_expression (unsigned cha
printf ("DW_OP_plus");
break;
case DW_OP_plus_uconst:
- printf ("DW_OP_plus_uconst: %lu",
+ printf ("DW_OP_plus_uconst: %" BFD_VMA_FMT "u",
read_leb128 (data, &bytes_read, 0));
data += bytes_read;
break;
@@ -867,7 +889,8 @@ decode_location_expression (unsigned cha
case DW_OP_breg29:
case DW_OP_breg30:
case DW_OP_breg31:
- printf ("DW_OP_breg%d (%s): %ld", op - DW_OP_breg0,
+ printf ("DW_OP_breg%d (%s): %" BFD_VMA_FMT "d",
+ op - DW_OP_breg0,
regname (op - DW_OP_breg0, 1),
read_leb128 (data, &bytes_read, 1));
data += bytes_read;
@@ -876,22 +899,26 @@ decode_location_expression (unsigned cha
case DW_OP_regx:
uvalue = read_leb128 (data, &bytes_read, 0);
data += bytes_read;
- printf ("DW_OP_regx: %lu (%s)", uvalue, regname (uvalue, 1));
+ printf ("DW_OP_regx: %" BFD_VMA_FMT "u (%s)",
+ uvalue, regname (uvalue, 1));
break;
case DW_OP_fbreg:
need_frame_base = 1;
- printf ("DW_OP_fbreg: %ld", read_leb128 (data, &bytes_read, 1));
+ printf ("DW_OP_fbreg: %" BFD_VMA_FMT "d",
+ read_leb128 (data, &bytes_read, 1));
data += bytes_read;
break;
case DW_OP_bregx:
uvalue = read_leb128 (data, &bytes_read, 0);
data += bytes_read;
- printf ("DW_OP_bregx: %lu (%s) %ld", uvalue, regname (uvalue, 1),
+ printf ("DW_OP_bregx: %" BFD_VMA_FMT "u (%s) %" BFD_VMA_FMT "d",
+ uvalue, regname (uvalue, 1),
read_leb128 (data, &bytes_read, 1));
data += bytes_read;
break;
case DW_OP_piece:
- printf ("DW_OP_piece: %lu", read_leb128 (data, &bytes_read, 0));
+ printf ("DW_OP_piece: %" BFD_VMA_FMT "u",
+ read_leb128 (data, &bytes_read, 0));
data += bytes_read;
break;
case DW_OP_deref_size:
@@ -911,13 +938,15 @@ decode_location_expression (unsigned cha
case DW_OP_call2:
/* XXX: Strictly speaking for 64-bit DWARF3 files
this ought to be an 8-byte wide computation. */
- printf ("DW_OP_call2: <0x%lx>", (long) byte_get (data, 2) + cu_offset);
+ printf ("DW_OP_call2: <0x%" BFD_VMA_FMT "x>",
+ (bfd_signed_vma) byte_get (data, 2) + cu_offset);
data += 2;
break;
case DW_OP_call4:
/* XXX: Strictly speaking for 64-bit DWARF3 files
this ought to be an 8-byte wide computation. */
- printf ("DW_OP_call4: <0x%lx>", (long) byte_get (data, 4) + cu_offset);
+ printf ("DW_OP_call4: <0x%" BFD_VMA_FMT "x>",
+ (bfd_signed_vma) byte_get (data, 4) + cu_offset);
data += 4;
break;
case DW_OP_call_ref:
@@ -950,9 +979,11 @@ decode_location_expression (unsigned cha
break;
case DW_OP_bit_piece:
printf ("DW_OP_bit_piece: ");
- printf ("size: %lu ", read_leb128 (data, &bytes_read, 0));
+ printf ("size: %" BFD_VMA_FMT "u ",
+ read_leb128 (data, &bytes_read, 0));
data += bytes_read;
- printf ("offset: %lu ", read_leb128 (data, &bytes_read, 0));
+ printf ("offset: %" BFD_VMA_FMT "u ",
+ read_leb128 (data, &bytes_read, 0));
data += bytes_read;
break;
@@ -1001,16 +1032,20 @@ decode_location_expression (unsigned cha
}
if (dwarf_version == 2)
{
- printf ("DW_OP_GNU_implicit_pointer: <0x%lx> %ld",
- (long) byte_get (data, pointer_size),
- read_leb128 (data + pointer_size, &bytes_read, 1));
+ printf ("DW_OP_GNU_implicit_pointer: "
+ "<0x%" BFD_VMA_FMT "x> %" BFD_VMA_FMT "d",
+ (bfd_vma) byte_get (data, pointer_size),
+ (bfd_signed_vma) read_leb128 (data + pointer_size,
+ &bytes_read, 1));
data += pointer_size + bytes_read;
}
else
{
- printf ("DW_OP_GNU_implicit_pointer: <0x%lx> %ld",
- (long) byte_get (data, offset_size),
- read_leb128 (data + offset_size, &bytes_read, 1));
+ printf ("DW_OP_GNU_implicit_pointer: "
+ "<0x%" BFD_VMA_FMT "x> %" BFD_VMA_FMT "d",
+ (bfd_vma) byte_get (data, offset_size),
+ (bfd_signed_vma) read_leb128 (data + offset_size,
+ &bytes_read, 1));
data += offset_size + bytes_read;
}
break;
@@ -1072,15 +1107,15 @@ static unsigned char *
read_and_display_attr_value (unsigned long attribute,
unsigned long form,
unsigned char * data,
- unsigned long cu_offset,
- unsigned long pointer_size,
- unsigned long offset_size,
+ bfd_vma cu_offset,
+ bfd_vma pointer_size,
+ bfd_vma offset_size,
int dwarf_version,
debug_info * debug_info_p,
int do_loc,
struct dwarf_section * section)
{
- unsigned long uvalue = 0;
+ bfd_vma uvalue = 0;
unsigned char *block_start = NULL;
unsigned char * orig_data = data;
unsigned int bytes_read;
@@ -1167,7 +1202,7 @@ read_and_display_attr_value (unsigned lo
{
case DW_FORM_ref_addr:
if (!do_loc)
- printf (" <0x%lx>", uvalue);
+ printf (" <0x%" BFD_VMA_FMT "x>", uvalue);
break;
case DW_FORM_ref1:
@@ -1175,14 +1210,14 @@ read_and_display_attr_value (unsigned lo
case DW_FORM_ref4:
case DW_FORM_ref_udata:
if (!do_loc)
- printf (" <0x%lx>", uvalue + cu_offset);
+ printf (" <0x%" BFD_VMA_FMT "x>", uvalue + cu_offset);
break;
case DW_FORM_data4:
case DW_FORM_addr:
case DW_FORM_sec_offset:
if (!do_loc)
- printf (" 0x%lx", uvalue);
+ printf (" 0x%" BFD_VMA_FMT "x", uvalue);
break;
case DW_FORM_flag_present:
@@ -1192,7 +1227,7 @@ read_and_display_attr_value (unsigned lo
case DW_FORM_sdata:
case DW_FORM_udata:
if (!do_loc)
- printf (" %ld", uvalue);
+ printf (" %" BFD_VMA_FMT "d", uvalue);
break;
case DW_FORM_ref8:
@@ -1200,7 +1235,7 @@ read_and_display_attr_value (unsigned lo
if (!do_loc)
{
uvalue = byte_get (data, 4);
- printf (" 0x%lx", uvalue);
+ printf (" 0x%" BFD_VMA_FMT "x", uvalue);
printf (" 0x%lx", (unsigned long) byte_get (data + 4, 4));
}
if ((do_loc || do_debug_loc || do_debug_ranges)
@@ -1209,7 +1244,7 @@ read_and_display_attr_value (unsigned lo
if (sizeof (uvalue) == 8)
uvalue = byte_get (data, 8);
else
- error (_("DW_FORM_data8 is unsupported when sizeof (unsigned long) != 8\n"));
+ error (_("DW_FORM_data8 is unsupported when sizeof (bfd_vma) != 8\n"));
}
data += 8;
break;
@@ -1259,8 +1294,9 @@ read_and_display_attr_value (unsigned lo
case DW_FORM_strp:
if (!do_loc)
- printf (_(" (indirect string, offset: 0x%lx): %s"),
- uvalue, fetch_indirect_string (uvalue));
+ printf (_(" (indirect string, offset: 0x%s): %s"),
+ dwarf_vma_print ("x", uvalue),
+ fetch_indirect_string (uvalue));
break;
case DW_FORM_indirect:
@@ -1313,7 +1349,7 @@ read_and_display_attr_value (unsigned lo
if (lmax == 0 || num >= lmax)
{
lmax += 1024;
- debug_info_p->loc_offsets = (long unsigned int *)
+ debug_info_p->loc_offsets = (bfd_vma *)
xcrealloc (debug_info_p->loc_offsets,
lmax, sizeof (*debug_info_p->loc_offsets));
debug_info_p->have_frame_base = (int *)
@@ -1344,7 +1380,7 @@ read_and_display_attr_value (unsigned lo
if (lmax == 0 || num >= lmax)
{
lmax += 1024;
- debug_info_p->range_lists = (long unsigned int *)
+ debug_info_p->range_lists = (bfd_vma *)
xcrealloc (debug_info_p->range_lists,
lmax, sizeof (*debug_info_p->range_lists));
debug_info_p->max_range_lists = lmax;
@@ -1383,7 +1419,8 @@ read_and_display_attr_value (unsigned lo
printf (_("(declared as inline and inlined)"));
break;
default:
- printf (_(" (Unknown inline attribute value: %lx)"), uvalue);
+ printf (_(" (Unknown inline attribute value: %s)"),
+ dwarf_vma_print ("x", uvalue));
break;
}
break;
@@ -1421,9 +1458,9 @@ read_and_display_attr_value (unsigned lo
case DW_LANG_Upc: printf ("(Unified Parallel C)"); break;
default:
if (uvalue >= DW_LANG_lo_user && uvalue <= DW_LANG_hi_user)
- printf ("(implementation defined: %lx)", uvalue);
+ printf ("(implementation defined: %" BFD_VMA_FMT "x)", uvalue);
else
- printf ("(Unknown: %lx)", uvalue);
+ printf ("(Unknown: %" BFD_VMA_FMT "x)", uvalue);
break;
}
break;
@@ -1584,8 +1621,9 @@ read_and_display_attr_value (unsigned lo
uvalue += cu_offset;
if (uvalue >= section->size)
- warn (_("Offset %lx used as value for DW_AT_import attribute of DIE at offset %lx is too big.\n"),
- uvalue, (unsigned long) (orig_data - section->start));
+ warn (_("Offset %s used as value for DW_AT_import attribute of DIE at offset %lx is too big.\n"),
+ dwarf_vma_print ("x", uvalue),
+ (unsigned long) (orig_data - section->start));
else
{
unsigned long abbrev_number;
@@ -1786,9 +1824,9 @@ static unsigned char *
read_and_display_attr (unsigned long attribute,
unsigned long form,
unsigned char * data,
- unsigned long cu_offset,
- unsigned long pointer_size,
- unsigned long offset_size,
+ bfd_vma cu_offset,
+ bfd_vma pointer_size,
+ bfd_vma offset_size,
int dwarf_version,
debug_info * debug_info_p,
int do_loc,
@@ -1900,7 +1938,7 @@ process_debug_info (struct dwarf_section
unsigned char *hdrptr;
unsigned char *tags;
int level;
- unsigned long cu_offset;
+ bfd_vma cu_offset;
int offset_size;
int initial_length_size;
unsigned char signature[8] = { 0 };
@@ -1970,11 +2008,14 @@ process_debug_info (struct dwarf_section
if (!do_loc)
{
- printf (_(" Compilation Unit @ offset 0x%lx:\n"), cu_offset);
- printf (_(" Length: 0x%lx (%s)\n"), compunit.cu_length,
+ printf (_(" Compilation Unit @ offset 0x%s:\n"),
+ dwarf_vma_print ("x", cu_offset));
+ printf (_(" Length: 0x%s (%s)\n"),
+ dwarf_vma_print ("x", compunit.cu_length),
initial_length_size == 8 ? "64-bit" : "32-bit");
printf (_(" Version: %d\n"), compunit.cu_version);
- printf (_(" Abbrev Offset: %ld\n"), compunit.cu_abbrev_offset);
+ printf (_(" Abbrev Offset: %s\n"),
+ dwarf_vma_print ("d", compunit.cu_abbrev_offset));
printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size);
if (do_types)
{
@@ -1990,8 +2031,10 @@ process_debug_info (struct dwarf_section
if (cu_offset + compunit.cu_length + initial_length_size
> section->size)
{
- warn (_("Debug info is corrupted, length of CU at %lx extends beyond end of section (length = %lx)\n"),
- cu_offset, compunit.cu_length);
+ warn (_("Debug info is corrupted, length of CU at %s"
+ " extends beyond end of section (length = %s)\n"),
+ dwarf_vma_print ("x", cu_offset),
+ dwarf_vma_print ("x", compunit.cu_length));
break;
}
tags = hdrptr;
@@ -2001,8 +2044,9 @@ process_debug_info (struct dwarf_section
&& compunit.cu_version != 3
&& compunit.cu_version != 4)
{
- warn (_("CU at offset %lx contains corrupt or unsupported version number: %d.\n"),
- cu_offset, compunit.cu_version);
+ warn (_("CU at offset %s contains corrupt or "
+ "unsupported version number: %d.\n"),
+ dwarf_vma_print ("x", cu_offset), compunit.cu_version);
continue;
}
@@ -2268,7 +2312,7 @@ display_debug_lines_raw (struct dwarf_se
linfo.li_line_base >>= 24;
printf (_(" Offset: 0x%lx\n"), hdroff);
- printf (_(" Length: %ld\n"), linfo.li_length);
+ printf (_(" Length: %ld\n"), (long) linfo.li_length);
printf (_(" DWARF Version: %d\n"), linfo.li_version);
printf (_(" Prologue Length: %d\n"), linfo.li_prologue_length);
printf (_(" Minimum Instruction Length: %d\n"), linfo.li_min_insn_length);
@@ -2329,11 +2373,14 @@ display_debug_lines_raw (struct dwarf_se
data += strlen ((char *) data) + 1;
- printf ("%lu\t", read_leb128 (data, & bytes_read, 0));
+ printf ("%" BFD_VMA_FMT "u\t",
+ read_leb128 (data, & bytes_read, 0));
data += bytes_read;
- printf ("%lu\t", read_leb128 (data, & bytes_read, 0));
+ printf ("%" BFD_VMA_FMT "u\t",
+ read_leb128 (data, & bytes_read, 0));
data += bytes_read;
- printf ("%lu\t", read_leb128 (data, & bytes_read, 0));
+ printf ("%" BFD_VMA_FMT "u\t",
+ read_leb128 (data, & bytes_read, 0));
data += bytes_read;
printf ("%s\n", name);
}
@@ -2505,7 +2552,8 @@ display_debug_lines_raw (struct dwarf_se
for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
{
- printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
+ printf ("0x%" BFD_VMA_FMT "x%s",
+ read_leb128 (data, &bytes_read, 0),
i == 1 ? "" : ", ");
data += bytes_read;
}
@@ -2918,7 +2966,8 @@ display_debug_lines_decoded (struct dwar
for (i = standard_opcodes[op_code - 1]; i > 0 ; --i)
{
- printf ("0x%lx%s", read_leb128 (data, &bytes_read, 0),
+ printf ("0x%" BFD_VMA_FMT "x%s",
+ read_leb128 (data, &bytes_read, 0),
i == 1 ? "" : ", ");
data += bytes_read;
}
@@ -3076,7 +3125,7 @@ display_debug_pubnames (struct dwarf_sec
&& num_debug_info_entries > 0
&& find_debug_info_for_offset (names.pn_offset) == NULL)
warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
- names.pn_offset, section->name);
+ (unsigned long) names.pn_offset, section->name);
names.pn_size = byte_get (data, offset_size);
data += offset_size;
@@ -3097,13 +3146,13 @@ display_debug_pubnames (struct dwarf_sec
}
printf (_(" Length: %ld\n"),
- names.pn_length);
+ (long) names.pn_length);
printf (_(" Version: %d\n"),
names.pn_version);
printf (_(" Offset into .debug_info section: 0x%lx\n"),
- names.pn_offset);
+ (unsigned long) names.pn_offset);
printf (_(" Size of area in .debug_info section: %ld\n"),
- names.pn_size);
+ (long) names.pn_size);
printf (_("\n Offset\tName\n"));
@@ -3323,8 +3372,9 @@ display_debug_loc (struct dwarf_section
/* DWARF sections under Mach-O have non-zero addresses. */
if (debug_information [first].num_loc_offsets > 0
&& debug_information [first].loc_offsets [0] != section->address)
- warn (_("Location lists in %s section start at 0x%lx\n"),
- section->name, debug_information [first].loc_offsets [0]);
+ warn (_("Location lists in %s section start at 0x%s\n"),
+ section->name,
+ dwarf_vma_print ("x", debug_information [first].loc_offsets [0]));
printf (_("Contents of the %s section:\n\n"), section->name);
printf (_(" Offset Begin End Expression\n"));
@@ -3596,7 +3646,7 @@ display_debug_aranges (struct dwarf_sect
&& num_debug_info_entries > 0
&& find_debug_info_for_offset (arange.ar_info_offset) == NULL)
warn (_(".debug_info offset of 0x%lx in %s section does not point to a CU header.\n"),
- arange.ar_info_offset, section->name);
+ (unsigned long) arange.ar_info_offset, section->name);
arange.ar_pointer_size = byte_get (hdrptr, 1);
hdrptr += 1;
@@ -3610,9 +3660,11 @@ display_debug_aranges (struct dwarf_sect
break;
}
- printf (_(" Length: %ld\n"), arange.ar_length);
+ printf (_(" Length: %ld\n"),
+ (long) arange.ar_length);
printf (_(" Version: %d\n"), arange.ar_version);
- printf (_(" Offset into .debug_info: 0x%lx\n"), arange.ar_info_offset);
+ printf (_(" Offset into .debug_info: 0x%lx\n"),
+ (unsigned long) arange.ar_info_offset);
printf (_(" Pointer Size: %d\n"), arange.ar_pointer_size);
printf (_(" Segment Size: %d\n"), arange.ar_segment_size);
Index: src/binutils/dwarf.h
===================================================================
--- src.orig/binutils/dwarf.h 2010-12-18 12:26:24.000000000 +0100
+++ src/binutils/dwarf.h 2011-02-21 15:44:39.467971300 +0100
@@ -22,6 +22,92 @@
typedef unsigned HOST_WIDEST_INT dwarf_vma;
typedef unsigned HOST_WIDEST_INT dwarf_size_type;
+/* Structure found in the .debug_line section. */
+typedef struct
+{
+ unsigned char li_length [4];
+ unsigned char li_version [2];
+ unsigned char li_prologue_length [4];
+ unsigned char li_min_insn_length [1];
+ unsigned char li_default_is_stmt [1];
+ unsigned char li_line_base [1];
+ unsigned char li_line_range [1];
+ unsigned char li_opcode_base [1];
+}
+DWARF2_External_LineInfo;
+
+typedef struct
+{
+ bfd_vma li_length;
+ unsigned short li_version;
+ unsigned int li_prologue_length;
+ unsigned char li_min_insn_length;
+ unsigned char li_max_ops_per_insn;
+ unsigned char li_default_is_stmt;
+ int li_line_base;
+ unsigned char li_line_range;
+ unsigned char li_opcode_base;
+}
+DWARF2_Internal_LineInfo;
+
+/* Structure found in .debug_pubnames section. */
+typedef struct
+{
+ unsigned char pn_length [4];
+ unsigned char pn_version [2];
+ unsigned char pn_offset [4];
+ unsigned char pn_size [4];
+}
+DWARF2_External_PubNames;
+
+typedef struct
+{
+ bfd_vma pn_length;
+ unsigned short pn_version;
+ bfd_vma pn_offset;
+ bfd_vma pn_size;
+}
+DWARF2_Internal_PubNames;
+
+/* Structure found in .debug_info section. */
+typedef struct
+{
+ unsigned char cu_length [4];
+ unsigned char cu_version [2];
+ unsigned char cu_abbrev_offset [4];
+ unsigned char cu_pointer_size [1];
+}
+DWARF2_External_CompUnit;
+
+typedef struct
+{
+ bfd_vma cu_length;
+ unsigned short cu_version;
+ bfd_vma cu_abbrev_offset;
+ unsigned char cu_pointer_size;
+}
+DWARF2_Internal_CompUnit;
+
+typedef struct
+{
+ unsigned char ar_length [4];
+ unsigned char ar_version [2];
+ unsigned char ar_info_offset [4];
+ unsigned char ar_pointer_size [1];
+ unsigned char ar_segment_size [1];
+}
+DWARF2_External_ARange;
+
+typedef struct
+{
+ bfd_vma ar_length;
+ unsigned short ar_version;
+ bfd_vma ar_info_offset;
+ unsigned char ar_pointer_size;
+ unsigned char ar_segment_size;
+}
+DWARF2_Internal_ARange;
+
struct dwarf_section
{
/* A debug section has a different name when it's stored compressed
@@ -79,15 +165,15 @@ typedef struct
unsigned int pointer_size;
unsigned int offset_size;
int dwarf_version;
- unsigned long cu_offset;
- unsigned long base_address;
+ bfd_vma cu_offset;
+ bfd_vma base_address;
/* This is an array of offsets to the location list table. */
- unsigned long *loc_offsets;
+ bfd_vma *loc_offsets;
int *have_frame_base;
unsigned int num_loc_offsets;
unsigned int max_loc_offsets;
/* List of .debug_ranges offsets seen in this .debug_info. */
- unsigned long *range_lists;
+ bfd_vma *range_lists;
unsigned int num_range_lists;
unsigned int max_range_lists;
}
@@ -131,5 +217,5 @@ void *cmalloc (size_t, size_t);
void *xcmalloc (size_t, size_t);
void *xcrealloc (void *, size_t, size_t);
-unsigned long int read_leb128 (unsigned char *data,
- unsigned int *length_return, int sign);
+bfd_vma read_leb128 (unsigned char *data,
+ unsigned int *length_return, int sign);
Index: src/include/dwarf2.h
===================================================================
--- src.orig/include/dwarf2.h 2011-02-08 19:52:32.000000000 +0100
+++ src/include/dwarf2.h 2011-02-21 15:44:39.471971600 +0100
@@ -44,95 +44,8 @@
/* This file is shared between GCC and GDB, and should not contain
prototypes. */
-#ifndef _ELF_DWARF2_H
-#define _ELF_DWARF2_H
-
-/* Structure found in the .debug_line section. */
-typedef struct
-{
- unsigned char li_length [4];
- unsigned char li_version [2];
- unsigned char li_prologue_length [4];
- unsigned char li_min_insn_length [1];
- unsigned char li_default_is_stmt [1];
- unsigned char li_line_base [1];
- unsigned char li_line_range [1];
- unsigned char li_opcode_base [1];
-}
-DWARF2_External_LineInfo;
-
-typedef struct
-{
- unsigned long li_length;
- unsigned short li_version;
- unsigned int li_prologue_length;
- unsigned char li_min_insn_length;
- unsigned char li_max_ops_per_insn;
- unsigned char li_default_is_stmt;
- int li_line_base;
- unsigned char li_line_range;
- unsigned char li_opcode_base;
-}
-DWARF2_Internal_LineInfo;
-
-/* Structure found in .debug_pubnames section. */
-typedef struct
-{
- unsigned char pn_length [4];
- unsigned char pn_version [2];
- unsigned char pn_offset [4];
- unsigned char pn_size [4];
-}
-DWARF2_External_PubNames;
-
-typedef struct
-{
- unsigned long pn_length;
- unsigned short pn_version;
- unsigned long pn_offset;
- unsigned long pn_size;
-}
-DWARF2_Internal_PubNames;
-
-/* Structure found in .debug_info section. */
-typedef struct
-{
- unsigned char cu_length [4];
- unsigned char cu_version [2];
- unsigned char cu_abbrev_offset [4];
- unsigned char cu_pointer_size [1];
-}
-DWARF2_External_CompUnit;
-
-typedef struct
-{
- unsigned long cu_length;
- unsigned short cu_version;
- unsigned long cu_abbrev_offset;
- unsigned char cu_pointer_size;
-}
-DWARF2_Internal_CompUnit;
-
-typedef struct
-{
- unsigned char ar_length [4];
- unsigned char ar_version [2];
- unsigned char ar_info_offset [4];
- unsigned char ar_pointer_size [1];
- unsigned char ar_segment_size [1];
-}
-DWARF2_External_ARange;
-
-typedef struct
-{
- unsigned long ar_length;
- unsigned short ar_version;
- unsigned long ar_info_offset;
- unsigned char ar_pointer_size;
- unsigned char ar_segment_size;
-}
-DWARF2_Internal_ARange;
-
+#ifndef _DWARF2_H
+#define _DWARF2_H
/* Tag names and codes. */
enum dwarf_tag
@@ -953,4 +866,4 @@ enum dwarf_macinfo_record_type
#define DW_EH_PE_indirect 0x80
-#endif /* _ELF_DWARF2_H */
+#endif /* _DWARF2_H */
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC patch]: Adjust the use of 'long' type in dwarf2.h header
2011-02-21 15:25 ` Kai Tietz
@ 2011-02-21 15:43 ` Mark Kettenis
2011-02-21 15:53 ` Kai Tietz
2011-02-22 15:21 ` Nick Clifton
1 sibling, 1 reply; 16+ messages in thread
From: Mark Kettenis @ 2011-02-21 15:43 UTC (permalink / raw)
To: ktietz70; +Cc: pierre.muller, gcc-patches, binutils, gdb, jakub, brobecker
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 1430 bytes --]
> Date: Mon, 21 Feb 2011 16:25:35 +0100
> From: Kai Tietz <ktietz70@googlemail.com>
>
> 2011/2/21 Kai Tietz <ktietz70@googlemail.com>:
> > 2011/2/21 Pierre Muller <pierre.muller@ics-cnrs.unistra.fr>:
> >>> Yes, I saw this too and it is a thorn here. But the issue about a
> >>> transformation function (like dwarf_vma) is that we have memory leaks
> >>> - as this function is to be used on some printf's more then once - as
> >>> static buffer would be overriden. Well printfs can be splitted into
> >>> smaller parts, but this then would make localization even harder.
> >>
> >> In GDB code, this is solved in utils.c source by the use of the
> >> get_cell function, which rotates over 16 char arrays of size 50 each
> >> currently, in dwarf.c 4 arrays of 16 char (as long as longest address is
> >> 64-bit)
> >> for this dwarf_vma function would probably be enough, no?
> >>
> >>
> >> Pierre Muller
> >> GDB pascal language maintainer
> >
> > Yes, this sounds ok. I think maximum here are right now 3 dwarf_vma
> > prints within one printf. So it should be ok. I'll add here such a
> > rotating function. I don't assume we need here to handle
> > multi-threading, so rotation code can be pretty simple.
> >
> > Kai
> >
>
> So this version uses new function dwarf_vma_print function for
> printf-messages, which are getting localized.
dwarf_vma_print is a really bad name for that function since it
doesn't print anything.
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC patch]: Adjust the use of 'long' type in dwarf2.h header
2011-02-21 15:43 ` Mark Kettenis
@ 2011-02-21 15:53 ` Kai Tietz
0 siblings, 0 replies; 16+ messages in thread
From: Kai Tietz @ 2011-02-21 15:53 UTC (permalink / raw)
To: Mark Kettenis; +Cc: pierre.muller, gcc-patches, binutils, gdb, jakub, brobecker
2011/2/21 Mark Kettenis <mark.kettenis@xs4all.nl>:
>> Date: Mon, 21 Feb 2011 16:25:35 +0100
>> From: Kai Tietz <ktietz70@googlemail.com>
>>
>> 2011/2/21 Kai Tietz <ktietz70@googlemail.com>:
>> > 2011/2/21 Pierre Muller <pierre.muller@ics-cnrs.unistra.fr>:
>> >>> Yes, I saw this too and it is a thorn here. But the issue about a
>> >>> transformation function (like dwarf_vma) is that we have memory leaks
>> >>> - as this function is to be used on some printf's more then once - as
>> >>> static buffer would be overriden. Well printfs can be splitted into
>> >>> smaller parts, but this then would make localization even harder.
>> >>
>> >> In GDB code, this is solved in utils.c source by the use of the
>> >> get_cell function, which rotates over 16 char arrays of size 50 each
>> >> currently, in dwarf.c 4 arrays of 16 char (as long as longest address is
>> >> 64-bit)
>> >> for this dwarf_vma function would probably be enough, no?
>> >>
>> >>
>> >> Pierre Muller
>> >> GDB pascal language maintainer
>> >
>> > Yes, this sounds ok. I think maximum here are right now 3 dwarf_vma
>> > prints within one printf. So it should be ok. I'll add here such a
>> > rotating function. I don't assume we need here to handle
>> > multi-threading, so rotation code can be pretty simple.
>> >
>> > Kai
>> >
>>
>> So this version uses new function dwarf_vma_print function for
>> printf-messages, which are getting localized.
>
> dwarf_vma_print is a really bad name for that function since it
> doesn't print anything.
>
well, it doesn't output, but it uses sprintf. So what's about
dwarf_vmatoa instead?
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC patch]: Adjust the use of 'long' type in dwarf2.h header
2011-02-21 15:25 ` Kai Tietz
2011-02-21 15:43 ` Mark Kettenis
@ 2011-02-22 15:21 ` Nick Clifton
2011-02-23 8:59 ` Kai Tietz
1 sibling, 1 reply; 16+ messages in thread
From: Nick Clifton @ 2011-02-22 15:21 UTC (permalink / raw)
To: Kai Tietz
Cc: Pierre Muller, GCC Patches, Binutils, gdb, Jakub Jelinek, Joel Brobecker
Hi Kai,
> So this version uses new function dwarf_vma_print function for
> printf-messages, which are getting localized.
>
> Tested for x86_64-w64-mingw32 and x86_64-pc-linux-gnu. Ok for apply?
> +static const char *
> +dwarf_vma_print (const char *fmtch, bfd_vma value)
I think that I prefer your suggestion of dwarf_vmatoa.
> +{
> + static int buf_pos = 0;
> + static struct dwarf_vma_print_buf {
> + char place[64];
> + } buf[16];
Ideally you should have a comment here explaining why you have an array
of these string buffers.
> + char fmt[32];
> + char *ret;
> +
> + sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
> + ret = &buf[buf_pos++].place[0];
Or, more simply:
ret = buf[buf_pos++].place;
> + buf_pos &= 15;
That "15" should be: "ARRAY_SIZE (buf) - 1", and it would be safer to write:
buf_pos %= ARRAY_SIZE (buf);
and leave it to the compiler to optimize this into an AND operation if
it can.
> snprintf (ret, 64, fmt, value);
And the "64" here should be "sizeof (buf[0].place)".
Cheers
Nick
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFC patch]: Adjust the use of 'long' type in dwarf2.h header
2011-02-22 15:21 ` Nick Clifton
@ 2011-02-23 8:59 ` Kai Tietz
0 siblings, 0 replies; 16+ messages in thread
From: Kai Tietz @ 2011-02-23 8:59 UTC (permalink / raw)
To: Nick Clifton
Cc: Pierre Muller, GCC Patches, Binutils, gdb, Jakub Jelinek, Joel Brobecker
2011/2/22 Nick Clifton <nickc@redhat.com>:
> Hi Kai,
>
>
>> So this version uses new function dwarf_vma_print function for
>> printf-messages, which are getting localized.
>>
>> Tested for x86_64-w64-mingw32 and x86_64-pc-linux-gnu. Ok for apply?
>
>> +static const char *
>> +dwarf_vma_print (const char *fmtch, bfd_vma value)
>
> I think that I prefer your suggestion of dwarf_vmatoa.
>
>> +{
>> + static int buf_pos = 0;
>> + static struct dwarf_vma_print_buf {
>> + char place[64];
>> + } buf[16];
>
> Ideally you should have a comment here explaining why you have an array of
> these string buffers.
>
>> + char fmt[32];
>> + char *ret;
>> +
>> + sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
>> + ret = &buf[buf_pos++].place[0];
>
> Or, more simply:
>
> ret = buf[buf_pos++].place;
>
>> + buf_pos &= 15;
>
> That "15" should be: "ARRAY_SIZE (buf) - 1", and it would be safer to write:
>
> buf_pos %= ARRAY_SIZE (buf);
>
> and leave it to the compiler to optimize this into an AND operation if it
> can.
>
>> snprintf (ret, 64, fmt, value);
>
> And the "64" here should be "sizeof (buf[0].place)".
>
> Cheers
> Nick
>
>
Hello Nick,
adjust the binutils part as you suggested. Applied to binutils and gcc
(rev. 170433) tree.
Regards,
Kai
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2011-02-23 8:59 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-02-17 14:21 [RFC patch]: Adjust the use of 'long' type in dwarf2.h header Kai Tietz
2011-02-17 18:59 ` Kai Tietz
2011-02-17 19:03 ` Jakub Jelinek
2011-02-17 19:07 ` Kai Tietz
2011-02-17 19:17 ` Jakub Jelinek
2011-02-18 9:50 ` Kai Tietz
2011-02-21 12:37 ` NightStrike
2011-02-21 13:10 ` Pierre Muller
[not found] ` <-8460070221060995487@unknownmsgid>
2011-02-21 13:27 ` Kai Tietz
2011-02-21 13:46 ` Pierre Muller
[not found] ` <-6930711422310680743@unknownmsgid>
2011-02-21 14:30 ` Kai Tietz
2011-02-21 15:25 ` Kai Tietz
2011-02-21 15:43 ` Mark Kettenis
2011-02-21 15:53 ` Kai Tietz
2011-02-22 15:21 ` Nick Clifton
2011-02-23 8:59 ` Kai Tietz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox