diff options
author | Nick Clifton <nickc@redhat.com> | 2013-09-12 09:14:47 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2013-09-12 09:14:47 +0000 |
commit | bf5117e32d50399e78fef3b9d776683b275d924d (patch) | |
tree | 13453db39c59912c8e45f5638762e56fc9aa97ce /binutils/dwarf.c | |
parent | 1aa4cd774ca674ee6061e2068a410bb67c8bc812 (diff) | |
download | gdb-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.c | 200 |
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; |