aboutsummaryrefslogtreecommitdiff
path: root/binutils/dwarf.c
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2013-09-12 09:14:47 +0000
committerNick Clifton <nickc@redhat.com>2013-09-12 09:14:47 +0000
commitbf5117e32d50399e78fef3b9d776683b275d924d (patch)
tree13453db39c59912c8e45f5638762e56fc9aa97ce /binutils/dwarf.c
parent1aa4cd774ca674ee6061e2068a410bb67c8bc812 (diff)
downloadgdb-bf5117e32d50399e78fef3b9d776683b275d924d.zip
gdb-bf5117e32d50399e78fef3b9d776683b275d924d.tar.gz
gdb-bf5117e32d50399e78fef3b9d776683b275d924d.tar.bz2
* dwarf.c (dwarf_vmatoa): Rename to dwarf_vmatoa_1 and add a
precision parameter. (dwarf_vmatoa): New wrapper for dwarf_vmatoa_1. (print_dwarf_vma): Use dwarf_vmatoa_1. (SAFE_BYTE_GET): Add check that VAL is big enough to contain AMOUNT bytes. (process_debug_info): Use an unsigned int for the offset size. (process_debug_pubnames): Likewise. (display_debug_aranges): Likewise. (struct Frame_Chunk): Use dwarf_vma type for pc_begin and pc_range fields. (frame_display_row): Use print_dwarf_vma to display dwarf_vma values. (display_debug_frames): Likewise. * binutils-all/x86-64/compressed-1a.d: Update expected output to allow for 64-bit addresses. * ld-elf/eh1.d: Update expected output to allow for 64-bit addresses. * ld-elf/eh2.d: Likewise. * ld-elf/eh3.d: Likewise. * ld-elf/eh4.d: Likewise. * ld-elf/eh5.d: Likewise. * ld-elf/eh6.d: Likewise. * ld-mips-elf/eh-frame1-n64.d: Likewise. * ld-mips-elf/eh-frame2-n64.d: Likewise. * ld-mips-elf/eh-frame3.d: Likewise. * gas/cfi/cfi-alpha-1.d: Update expected output to allow for 64-bit addresses. * gas/cfi/cfi-alpha-3.d: Likewise. * gas/cfi/cfi-arm-1.d: Likewise. * gas/cfi/cfi-common-1.d: Likewise. * gas/cfi/cfi-common-2.d: Likewise. * gas/cfi/cfi-common-3.d: Likewise. * gas/cfi/cfi-common-4.d: Likewise. * gas/cfi/cfi-common-5.d: Likewise. * gas/cfi/cfi-common-6.d: Likewise. * gas/cfi/cfi-common-7.d: Likewise. * gas/cfi/cfi-hppa-1.d: Likewise. * gas/cfi/cfi-i386-2.d: Likewise. * gas/cfi/cfi-i386.d: Likewise. * gas/cfi/cfi-m68k.d: Likewise. * gas/cfi/cfi-mips-1.d: Likewise. * gas/cfi/cfi-ppc-1.d: Likewise. * gas/cfi/cfi-s390-1.d: Likewise. * gas/cfi/cfi-s390x-1.d: Likewise. * gas/cfi/cfi-sh-1.d: Likewise. * gas/cfi/cfi-sparc-1.d: Likewise. * gas/cfi/cfi-sparc64-1.d: Likewise. * gas/cfi/cfi-x86_64.d: Likewise.
Diffstat (limited to 'binutils/dwarf.c')
-rw-r--r--binutils/dwarf.c200
1 files changed, 114 insertions, 86 deletions
diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index 00dad39..8a233aa 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -139,52 +139,27 @@ get_encoded_value (unsigned char *data,
return val;
}
-/* Print a dwarf_vma value (typically an address, offset or length) in
- hexadecimal format, followed by a space. The length of the value (and
- hence the precision displayed) is determined by the byte_size parameter. */
-
-static void
-print_dwarf_vma (dwarf_vma val, unsigned byte_size)
-{
- static char buff[18];
- int offset = 0;
-
- /* Printf does not have a way of specifiying a maximum field width for an
- integer value, so we print the full value into a buffer and then select
- the precision we need. */
#if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
#ifndef __MINGW32__
- snprintf (buff, sizeof (buff), "%16.16llx ", val);
+#define DWARF_VMA_FMT "ll"
+#define DWARF_VMA_FMT_LONG "%16.16llx"
#else
- snprintf (buff, sizeof (buff), "%016I64x ", val);
+#define DWARF_VMA_FMT "I64"
+#define DWARF_VMA_FMT_LONG "%016I64x"
#endif
#else
- snprintf (buff, sizeof (buff), "%16.16lx ", val);
+#define DWARF_VMA_FMT "l"
+#define DWARF_VMA_FMT_LONG "%16.16lx"
#endif
- if (byte_size != 0)
- {
- if (byte_size > 0 && byte_size <= 8)
- offset = 16 - 2 * byte_size;
- else
- error (_("Wrong size in print_dwarf_vma"));
- }
-
- fputs (buff + offset, stdout);
-}
-
-#if __STDC_VERSION__ >= 199901L || (defined(__GNUC__) && __GNUC__ >= 2)
-#ifndef __MINGW32__
-#define DWARF_VMA_FMT "ll"
-#else
-#define DWARF_VMA_FMT "I64"
-#endif
-#else
-#define DWARF_VMA_FMT "l"
-#endif
+/* Convert a dwarf vma value into a string. Returns a pointer to a static
+ buffer containing the converted VALUE. The value is converted according
+ to the printf formating character FMTCH. If NUM_BYTES is non-zero then
+ it specifies the maximum number of bytes to be displayed in the converted
+ value and FMTCH is ignored - hex is always used. */
static const char *
-dwarf_vmatoa (const char *fmtch, dwarf_vma value)
+dwarf_vmatoa_1 (const char *fmtch, dwarf_vma value, unsigned num_bytes)
{
/* As dwarf_vmatoa is used more then once in a printf call
for output, we are cycling through an fixed array of pointers
@@ -194,17 +169,45 @@ dwarf_vmatoa (const char *fmtch, dwarf_vma value)
{
char place[64];
} buf[16];
- char fmt[32];
char *ret;
- sprintf (fmt, "%%%s%s", DWARF_VMA_FMT, fmtch);
-
ret = buf[buf_pos++].place;
buf_pos %= ARRAY_SIZE (buf);
- snprintf (ret, sizeof (buf[0].place), fmt, value);
+ if (num_bytes)
+ {
+ /* Printf does not have a way of specifiying a maximum field width for an
+ integer value, so we print the full value into a buffer and then select
+ the precision we need. */
+ snprintf (ret, sizeof (buf[0].place), DWARF_VMA_FMT_LONG, value);
+ if (num_bytes > 8)
+ num_bytes = 8;
+ return ret + (16 - 2 * num_bytes);
+ }
+ else
+ {
+ char fmt[32];
+
+ sprintf (fmt, "%%%s%s", DWARF_VMA_FMT, fmtch);
+ snprintf (ret, sizeof (buf[0].place), fmt, value);
+ return ret;
+ }
+}
- return ret;
+static inline const char *
+dwarf_vmatoa (const char * fmtch, dwarf_vma value)
+{
+ return dwarf_vmatoa_1 (fmtch, value, 0);
+}
+
+/* Print a dwarf_vma value (typically an address, offset or length) in
+ hexadecimal format, followed by a space. The length of the VALUE (and
+ hence the precision displayed) is determined by the NUM_BYTES parameter. */
+
+static void
+print_dwarf_vma (dwarf_vma value, unsigned num_bytes)
+{
+ printf ("%s ", dwarf_vmatoa_1 (NULL, value, num_bytes));
}
/* Format a 64-bit value, given as two 32-bit values, in hex.
@@ -285,6 +288,7 @@ read_uleb128 (unsigned char * data,
#define SAFE_BYTE_GET(VAL, PTR, AMOUNT, END) \
do \
{ \
+ int dummy [sizeof (VAL) < (AMOUNT) ? -1 : 0] ATTRIBUTE_UNUSED ; \
unsigned int amount = (AMOUNT); \
if (((PTR) + amount) >= (END)) \
{ \
@@ -810,7 +814,7 @@ static const char *
get_FORM_name (unsigned long form)
{
const char *name;
-
+
if (form == 0)
return "DW_FORM value: 0";
@@ -2192,7 +2196,7 @@ process_debug_info (struct dwarf_section *section,
unsigned char *tags;
int level, last_level, saved_level;
dwarf_vma cu_offset;
- int offset_size;
+ unsigned int offset_size;
int initial_length_size;
dwarf_vma signature_high = 0;
dwarf_vma signature_low = 0;
@@ -3490,7 +3494,7 @@ display_debug_pubnames (struct dwarf_section *section,
{
unsigned char *data;
unsigned long offset;
- int offset_size, initial_length_size;
+ unsigned int offset_size, initial_length_size;
data = start;
@@ -3773,7 +3777,7 @@ display_debug_macro (struct dwarf_section *section,
dwarf_vma nargs, n;
SAFE_BYTE_GET_AND_INC (count, curr, 1, end);
-
+
memset (extended_op_buf, 0, sizeof (extended_op_buf));
extended_ops = extended_op_buf;
if (count)
@@ -4517,8 +4521,8 @@ display_debug_aranges (struct dwarf_section *section,
dwarf_vma address;
unsigned char address_size;
int excess;
- int offset_size;
- int initial_length_size;
+ unsigned int offset_size;
+ unsigned int initial_length_size;
hdrptr = start;
@@ -4889,8 +4893,8 @@ typedef struct Frame_Chunk
char *augmentation;
unsigned int code_factor;
int data_factor;
- unsigned long pc_begin;
- unsigned long pc_range;
+ dwarf_vma pc_begin;
+ dwarf_vma pc_range;
int cfa_reg;
int cfa_offset;
int ra;
@@ -5075,7 +5079,7 @@ frame_display_row (Frame_Chunk *fc, int *need_col_headers, int *max_regs)
printf ("\n");
}
- printf ("%0*lx ", eh_addr_size * 2, fc->pc_begin);
+ print_dwarf_vma (fc->pc_begin, eh_addr_size);
if (fc->cfa_exp)
strcpy (tmp, "exp");
else
@@ -5145,16 +5149,16 @@ display_debug_frames (struct dwarf_section *section,
{
unsigned char *saved_start;
unsigned char *block_end;
- unsigned long length;
- unsigned long cie_id;
+ dwarf_vma length;
+ dwarf_vma cie_id;
Frame_Chunk *fc;
Frame_Chunk *cie;
int need_col_headers = 1;
unsigned char *augmentation_data = NULL;
unsigned long augmentation_data_len = 0;
- int encoded_ptr_size = saved_eh_addr_size;
- int offset_size;
- int initial_length_size;
+ unsigned int encoded_ptr_size = saved_eh_addr_size;
+ unsigned int offset_size;
+ unsigned int initial_length_size;
saved_start = start;
@@ -5181,8 +5185,9 @@ display_debug_frames (struct dwarf_section *section,
block_end = saved_start + length + initial_length_size;
if (block_end > end)
{
- warn ("Invalid length %#08lx in FDE at %#08lx\n",
- length, (unsigned long)(saved_start - section_start));
+ warn ("Invalid length 0x%s in FDE at %#08lx\n",
+ dwarf_vmatoa_1 (NULL, length, offset_size),
+ (unsigned long) (saved_start - section_start));
block_end = end;
}
@@ -5242,15 +5247,18 @@ display_debug_frames (struct dwarf_section *section,
}
cie = fc;
+ printf ("\n%08lx ", (unsigned long) (saved_start - section_start));
+ print_dwarf_vma (length, fc->ptr_size);
+ print_dwarf_vma (cie_id, fc->ptr_size);
+
if (do_debug_frames_interp)
- printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
- (unsigned long)(saved_start - section_start), length, cie_id,
- fc->augmentation, fc->code_factor, fc->data_factor,
- fc->ra);
+ {
+ printf ("CIE \"%s\" cf=%d df=%d ra=%d\n", fc->augmentation,
+ fc->code_factor, fc->data_factor, fc->ra);
+ }
else
{
- printf ("\n%08lx %08lx %08lx CIE\n",
- (unsigned long)(saved_start - section_start), length, cie_id);
+ printf ("CIE\n");
printf (" Version: %d\n", version);
printf (" Augmentation: \"%s\"\n", fc->augmentation);
if (version >= 4)
@@ -5317,8 +5325,9 @@ display_debug_frames (struct dwarf_section *section,
if (!cie)
{
- warn ("Invalid CIE pointer %#08lx in FDE at %#08lx\n",
- cie_id, (unsigned long)(saved_start - section_start));
+ warn ("Invalid CIE pointer 0x%s in FDE at %#08lx\n",
+ dwarf_vmatoa_1 (NULL, cie_id, offset_size),
+ (unsigned long) (saved_start - section_start));
fc->ncols = 0;
fc->col_type = (short int *) xmalloc (sizeof (short int));
fc->col_offset = (int *) xmalloc (sizeof (int));
@@ -5365,7 +5374,7 @@ display_debug_frames (struct dwarf_section *section,
run of the "objcopy on compressed debug sections" test for an
example of this. */
SAFE_BYTE_GET_AND_INC (fc->pc_range, start, encoded_ptr_size, end);
-
+
if (cie->augmentation[0] == 'z')
{
augmentation_data_len = LEB ();
@@ -5373,12 +5382,19 @@ display_debug_frames (struct dwarf_section *section,
start += augmentation_data_len;
}
- printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=",
- (unsigned long)(saved_start - section_start), length, cie_id,
+ printf ("\n%08lx %s %s FDE cie=%08lx pc=",
+ (unsigned long)(saved_start - section_start),
+ dwarf_vmatoa_1 (NULL, length, fc->ptr_size),
+ dwarf_vmatoa_1 (NULL, cie_id, fc->ptr_size),
(unsigned long)(cie->chunk_start - section_start));
+
if (fc->segment_size)
printf ("%04lx:", segment_selector);
- printf ("%08lx..%08lx\n", fc->pc_begin, fc->pc_begin + fc->pc_range);
+
+ printf ("%s..%s\n",
+ dwarf_vmatoa_1 (NULL, fc->pc_begin, fc->ptr_size),
+ dwarf_vmatoa_1 (NULL, fc->pc_begin + fc->pc_range, fc->ptr_size));
+
if (! do_debug_frames_interp && augmentation_data_len)
{
unsigned long i;
@@ -5526,7 +5542,8 @@ display_debug_frames (struct dwarf_section *section,
{
unsigned op, opa;
unsigned long ul, reg, roffs;
- long l, ofs;
+ long l;
+ dwarf_vma ofs;
dwarf_vma vma;
const char *reg_prefix = "";
@@ -5543,9 +5560,11 @@ display_debug_frames (struct dwarf_section *section,
if (do_debug_frames_interp)
frame_display_row (fc, &need_col_headers, &max_regs);
else
- printf (" DW_CFA_advance_loc: %d to %08lx\n",
+ printf (" DW_CFA_advance_loc: %d to %s\n",
opa * fc->code_factor,
- fc->pc_begin + opa * fc->code_factor);
+ dwarf_vmatoa_1 (NULL,
+ fc->pc_begin + opa * fc->code_factor,
+ fc->ptr_size));
fc->pc_begin += opa * fc->code_factor;
break;
@@ -5587,7 +5606,8 @@ display_debug_frames (struct dwarf_section *section,
if (do_debug_frames_interp)
frame_display_row (fc, &need_col_headers, &max_regs);
else
- printf (" DW_CFA_set_loc: %08lx\n", (unsigned long)vma);
+ printf (" DW_CFA_set_loc: %s\n",
+ dwarf_vmatoa_1 (NULL, vma, fc->ptr_size));
fc->pc_begin = vma;
break;
@@ -5596,9 +5616,11 @@ display_debug_frames (struct dwarf_section *section,
if (do_debug_frames_interp)
frame_display_row (fc, &need_col_headers, &max_regs);
else
- printf (" DW_CFA_advance_loc1: %ld to %08lx\n",
- ofs * fc->code_factor,
- fc->pc_begin + ofs * fc->code_factor);
+ printf (" DW_CFA_advance_loc1: %ld to %s\n",
+ (unsigned long) (ofs * fc->code_factor),
+ dwarf_vmatoa_1 (NULL,
+ fc->pc_begin + ofs * fc->code_factor,
+ fc->ptr_size));
fc->pc_begin += ofs * fc->code_factor;
break;
@@ -5607,9 +5629,11 @@ display_debug_frames (struct dwarf_section *section,
if (do_debug_frames_interp)
frame_display_row (fc, &need_col_headers, &max_regs);
else
- printf (" DW_CFA_advance_loc2: %ld to %08lx\n",
- ofs * fc->code_factor,
- fc->pc_begin + ofs * fc->code_factor);
+ printf (" DW_CFA_advance_loc2: %ld to %s\n",
+ (unsigned long) (ofs * fc->code_factor),
+ dwarf_vmatoa_1 (NULL,
+ fc->pc_begin + ofs * fc->code_factor,
+ fc->ptr_size));
fc->pc_begin += ofs * fc->code_factor;
break;
@@ -5618,9 +5642,11 @@ display_debug_frames (struct dwarf_section *section,
if (do_debug_frames_interp)
frame_display_row (fc, &need_col_headers, &max_regs);
else
- printf (" DW_CFA_advance_loc4: %ld to %08lx\n",
- ofs * fc->code_factor,
- fc->pc_begin + ofs * fc->code_factor);
+ printf (" DW_CFA_advance_loc4: %ld to %s\n",
+ (unsigned long) (ofs * fc->code_factor),
+ dwarf_vmatoa_1 (NULL,
+ fc->pc_begin + ofs * fc->code_factor,
+ fc->ptr_size));
fc->pc_begin += ofs * fc->code_factor;
break;
@@ -5881,9 +5907,11 @@ display_debug_frames (struct dwarf_section *section,
if (do_debug_frames_interp)
frame_display_row (fc, &need_col_headers, &max_regs);
else
- printf (" DW_CFA_MIPS_advance_loc8: %ld to %08lx\n",
- ofs * fc->code_factor,
- fc->pc_begin + ofs * fc->code_factor);
+ printf (" DW_CFA_MIPS_advance_loc8: %ld to %s\n",
+ (unsigned long) (ofs * fc->code_factor),
+ dwarf_vmatoa_1 (NULL,
+ fc->pc_begin + ofs * fc->code_factor,
+ fc->ptr_size));
fc->pc_begin += ofs * fc->code_factor;
break;