summaryrefslogtreecommitdiff
path: root/binutils
diff options
context:
space:
mode:
authorH.J. Lu <hjl@lucon.org>2008-01-28 15:15:32 +0000
committerH.J. Lu <hjl@lucon.org>2008-01-28 15:15:32 +0000
commit92403e8279685a5cab0c6f54d518111412d7608e (patch)
tree6d45cc22c6d37405682741fbfdbb4daf1daf4b4b /binutils
parent389f0d72331c9bc0b2c50ae40764e56b22c0bc6c (diff)
downloadbinutils-redhat-92403e8279685a5cab0c6f54d518111412d7608e.tar.gz
binutils/
2008-01-28 H.J. Lu <hongjiu.lu@intel.com> * dwarf.c: Include "elf/common.h". (eh_addr_size): Changed to int. (dwarf_regnames_i386): New. (dwarf_regnames_x86_64): Likewise. (dwarf_regnames): Likewise. (dwarf_regnames_count): Likewise. (init_dwarf_regnames): Likewise. (regname): Likewise. (frame_display_row): Properly support different address size. Call regname to get register name. (display_debug_frames): Call regname to get register name. Display DW_CFA_def_cfa_register as DW_CFA_def_cfa_register instead of DW_CFA_def_cfa_reg. * dwarf.h (init_dwarf_regnames): New. * objdump.c: Include "elf-bfd.h". (dump_dwarf): Call init_dwarf_regnames on ELF input. * readelf.c (guess_is_rela): Change argument to int. (parse_args): Remove the undocumented upper case options for -wX. (process_file_header): Call init_dwarf_regnames if do_dwarf_register is true. gas/testsuite/ 2008-01-28 H.J. Lu <hongjiu.lu@intel.com> * gas/cfi/cfi-alpha-1.d: Replace DW_CFA_def_cfa_reg with DW_CFA_def_cfa_register. * gas/cfi/cfi-alpha-3.d: Likewise. * gas/cfi/cfi-hppa-1.d: Likewise. * gas/cfi/cfi-i386.d: Likewise. * gas/cfi/cfi-m68k.d: Likewise. * gas/cfi/cfi-mips-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. * gas/cfi/cfi-common-1.d: Updated for i386/x86-64 register names. * gas/cfi/cfi-common-2.d: Likewise. * gas/cfi/cfi-common-5.d: Likewise. * gas/cfi/cfi-i386.d: Likewise. * gas/cfi/cfi-x86_64.d: Likewise. ld/testsuite/ 2008-01-28 H.J. Lu <hongjiu.lu@intel.com> * ld-elf/eh1.d: Replace DW_CFA_def_cfa_reg with DW_CFA_def_cfa_register. Updated for i386/x86-64 register names. * ld-elf/eh2.d: Likewise. * ld-elf/eh3.d: Likewise. * ld-elf/eh4.d: Likewise. * ld-elf/eh5.d: Likewise.
Diffstat (limited to 'binutils')
-rw-r--r--binutils/ChangeLog27
-rw-r--r--binutils/dwarf.c159
-rw-r--r--binutils/dwarf.h4
-rw-r--r--binutils/objdump.c7
-rw-r--r--binutils/readelf.c11
5 files changed, 166 insertions, 42 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index a0d3c71472..0498f00cfc 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,30 @@
+2008-01-28 H.J. Lu <hongjiu.lu@intel.com>
+
+ * dwarf.c: Include "elf/common.h".
+ (eh_addr_size): Changed to int.
+ (dwarf_regnames_i386): New.
+ (dwarf_regnames_x86_64): Likewise.
+ (dwarf_regnames): Likewise.
+ (dwarf_regnames_count): Likewise.
+ (init_dwarf_regnames): Likewise.
+ (regname): Likewise.
+ (frame_display_row): Properly support different address size.
+ Call regname to get register name.
+ (display_debug_frames): Call regname to get register name.
+ Display DW_CFA_def_cfa_register as DW_CFA_def_cfa_register
+ instead of DW_CFA_def_cfa_reg.
+
+ * dwarf.h (init_dwarf_regnames): New.
+
+ * objdump.c: Include "elf-bfd.h".
+ (dump_dwarf): Call init_dwarf_regnames on ELF input.
+
+ * readelf.c (guess_is_rela): Change argument to int.
+ (parse_args): Remove the undocumented upper case options for
+ -wX.
+ (process_file_header): Call init_dwarf_regnames if
+ do_dwarf_register is true.
+
2008-01-25 DJ Delorie <dj@redhat.com>
* readelf.c (process_section_headers): Add m16c handler.
diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index df83be9a02..d4eb4aa617 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -23,6 +23,7 @@
#include "libiberty.h"
#include "bfd.h"
#include "bucomm.h"
+#include "elf/common.h"
#include "elf/dwarf2.h"
#include "dwarf.h"
@@ -38,7 +39,7 @@ static debug_info *debug_information = NULL;
that the .debug_info section could not be loaded/parsed. */
#define DEBUG_INFO_UNAVAILABLE (unsigned int) -1
-dwarf_vma eh_addr_size;
+int eh_addr_size;
int do_debug_info;
int do_debug_abbrevs;
@@ -3118,6 +3119,87 @@ frame_need_space (Frame_Chunk *fc, int reg)
}
}
+static const char *const dwarf_regnames_i386[] =
+{
+ "eax", "ecx", "edx", "ebx",
+ "esp", "ebp", "esi", "edi",
+ "eip", "eflags", NULL,
+ "st0", "st1", "st2", "st3",
+ "st4", "st5", "st6", "st7",
+ NULL, NULL,
+ "xmm0", "xmm1", "xmm2", "xmm3",
+ "xmm4", "xmm5", "xmm6", "xmm7",
+ "mm0", "mm1", "mm2", "mm3",
+ "mm4", "mm5", "mm6", "mm7",
+ "fcw", "fsw", "mxcsr",
+ "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
+ "tr", "ldtr"
+};
+
+static const char *const dwarf_regnames_x86_64[] =
+{
+ "rax", "rdx", "rcx", "rbx",
+ "rsi", "rdi", "rbp", "rsp",
+ "r8", "r9", "r10", "r11",
+ "r12", "r13", "r14", "r15",
+ "rip",
+ "xmm0", "xmm1", "xmm2", "xmm3",
+ "xmm4", "xmm5", "xmm6", "xmm7",
+ "xmm8", "xmm9", "xmm10", "xmm11",
+ "xmm12", "xmm13", "xmm14", "xmm15",
+ "st0", "st1", "st2", "st3",
+ "st4", "st5", "st6", "st7",
+ "mm0", "mm1", "mm2", "mm3",
+ "mm4", "mm5", "mm6", "mm7",
+ "rflags",
+ "es", "cs", "ss", "ds", "fs", "gs", NULL, NULL,
+ "fs.base", "gs.base", NULL, NULL,
+ "tr", "ldtr",
+ "mxcsr", "fcw", "fsw"
+};
+
+static const char *const *dwarf_regnames;
+static unsigned int dwarf_regnames_count;
+
+void
+init_dwarf_regnames (unsigned int e_machine)
+{
+ switch (e_machine)
+ {
+ case EM_386:
+ case EM_486:
+ dwarf_regnames = dwarf_regnames_i386;
+ dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_i386);
+ break;
+
+ case EM_X86_64:
+ dwarf_regnames = dwarf_regnames_x86_64;
+ dwarf_regnames_count = ARRAY_SIZE (dwarf_regnames_x86_64);
+ break;
+
+ default:
+ break;
+ }
+}
+
+static const char *
+regname (unsigned int regno, int row)
+{
+ static char reg[64];
+ if (dwarf_regnames
+ && regno < dwarf_regnames_count
+ && dwarf_regnames [regno] != NULL)
+ {
+ if (row)
+ return dwarf_regnames [regno];
+ snprintf (reg, sizeof (reg), "r%d (%s)", regno,
+ dwarf_regnames [regno]);
+ }
+ else
+ snprintf (reg, sizeof (reg), "r%d", regno);
+ return reg;
+}
+
static void
frame_display_row (Frame_Chunk *fc, int *need_col_headers, int *max_regs)
{
@@ -3129,27 +3211,29 @@ frame_display_row (Frame_Chunk *fc, int *need_col_headers, int *max_regs)
if (*need_col_headers)
{
+ static const char *loc = " LOC";
+
*need_col_headers = 0;
- printf (" LOC CFA ");
+ printf ("%-*s CFA ", eh_addr_size * 2, loc);
for (r = 0; r < *max_regs; r++)
if (fc->col_type[r] != DW_CFA_unreferenced)
{
if (r == fc->ra)
- printf ("ra ");
+ printf ("ra ");
else
- printf ("r%-4d", r);
+ printf ("%-5s ", regname (r, 1));
}
printf ("\n");
}
- printf ("%08lx ", fc->pc_begin);
+ printf ("%0*lx ", eh_addr_size * 2, fc->pc_begin);
if (fc->cfa_exp)
strcpy (tmp, "exp");
else
- sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
+ sprintf (tmp, "%s%+d", regname (fc->cfa_reg, 1), fc->cfa_offset);
printf ("%-8s ", tmp);
for (r = 0; r < fc->ncols; r++)
@@ -3171,7 +3255,7 @@ frame_display_row (Frame_Chunk *fc, int *need_col_headers, int *max_regs)
sprintf (tmp, "v%+d", fc->col_offset[r]);
break;
case DW_CFA_register:
- sprintf (tmp, "r%d", fc->col_offset[r]);
+ sprintf (tmp, "%s", regname (fc->col_offset[r], 0));
break;
case DW_CFA_expression:
strcpy (tmp, "exp");
@@ -3183,7 +3267,7 @@ frame_display_row (Frame_Chunk *fc, int *need_col_headers, int *max_regs)
strcpy (tmp, "n/a");
break;
}
- printf ("%-5s", tmp);
+ printf ("%-5s ", tmp);
}
}
printf ("\n");
@@ -3631,15 +3715,15 @@ display_debug_frames (struct dwarf_section *section,
case DW_CFA_offset:
roffs = LEB ();
if (! do_debug_frames_interp)
- printf (" DW_CFA_offset: r%d at cfa%+ld\n",
- opa, roffs * fc->data_factor);
+ printf (" DW_CFA_offset: %s at cfa%+ld\n",
+ regname (opa, 0), roffs * fc->data_factor);
fc->col_type[opa] = DW_CFA_offset;
fc->col_offset[opa] = roffs * fc->data_factor;
break;
case DW_CFA_restore:
if (! do_debug_frames_interp)
- printf (" DW_CFA_restore: r%d\n", opa);
+ printf (" DW_CFA_restore: %s\n", regname (opa, 0));
fc->col_type[opa] = cie->col_type[opa];
fc->col_offset[opa] = cie->col_offset[opa];
break;
@@ -3693,8 +3777,8 @@ display_debug_frames (struct dwarf_section *section,
reg = LEB ();
roffs = LEB ();
if (! do_debug_frames_interp)
- printf (" DW_CFA_offset_extended: r%ld at cfa%+ld\n",
- reg, roffs * fc->data_factor);
+ printf (" DW_CFA_offset_extended: %s at cfa%+ld\n",
+ regname (reg, 0), roffs * fc->data_factor);
fc->col_type[reg] = DW_CFA_offset;
fc->col_offset[reg] = roffs * fc->data_factor;
break;
@@ -3703,8 +3787,8 @@ display_debug_frames (struct dwarf_section *section,
reg = LEB ();
roffs = LEB ();
if (! do_debug_frames_interp)
- printf (" DW_CFA_val_offset: r%ld at cfa%+ld\n",
- reg, roffs * fc->data_factor);
+ printf (" DW_CFA_val_offset: %s at cfa%+ld\n",
+ regname (reg, 0), roffs * fc->data_factor);
fc->col_type[reg] = DW_CFA_val_offset;
fc->col_offset[reg] = roffs * fc->data_factor;
break;
@@ -3712,7 +3796,8 @@ display_debug_frames (struct dwarf_section *section,
case DW_CFA_restore_extended:
reg = LEB ();
if (! do_debug_frames_interp)
- printf (" DW_CFA_restore_extended: r%ld\n", reg);
+ printf (" DW_CFA_restore_extended: %s\n",
+ regname (reg, 0));
fc->col_type[reg] = cie->col_type[reg];
fc->col_offset[reg] = cie->col_offset[reg];
break;
@@ -3720,7 +3805,7 @@ display_debug_frames (struct dwarf_section *section,
case DW_CFA_undefined:
reg = LEB ();
if (! do_debug_frames_interp)
- printf (" DW_CFA_undefined: r%ld\n", reg);
+ printf (" DW_CFA_undefined: %s\n", regname (reg, 0));
fc->col_type[reg] = DW_CFA_undefined;
fc->col_offset[reg] = 0;
break;
@@ -3728,7 +3813,7 @@ display_debug_frames (struct dwarf_section *section,
case DW_CFA_same_value:
reg = LEB ();
if (! do_debug_frames_interp)
- printf (" DW_CFA_same_value: r%ld\n", reg);
+ printf (" DW_CFA_same_value: %s\n", regname (reg, 0));
fc->col_type[reg] = DW_CFA_same_value;
fc->col_offset[reg] = 0;
break;
@@ -3737,7 +3822,11 @@ display_debug_frames (struct dwarf_section *section,
reg = LEB ();
roffs = LEB ();
if (! do_debug_frames_interp)
- printf (" DW_CFA_register: r%ld in r%ld\n", reg, roffs);
+ {
+ printf (" DW_CFA_register: %s in ",
+ regname (reg, 0));
+ puts (regname (roffs, 0));
+ }
fc->col_type[reg] = DW_CFA_register;
fc->col_offset[reg] = roffs;
break;
@@ -3779,15 +3868,16 @@ display_debug_frames (struct dwarf_section *section,
fc->cfa_offset = LEB ();
fc->cfa_exp = 0;
if (! do_debug_frames_interp)
- printf (" DW_CFA_def_cfa: r%d ofs %d\n",
- fc->cfa_reg, fc->cfa_offset);
+ printf (" DW_CFA_def_cfa: %s ofs %d\n",
+ regname (fc->cfa_reg, 0), fc->cfa_offset);
break;
case DW_CFA_def_cfa_register:
fc->cfa_reg = LEB ();
fc->cfa_exp = 0;
if (! do_debug_frames_interp)
- printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
+ printf (" DW_CFA_def_cfa_register: %s\n",
+ regname (fc->cfa_reg, 0));
break;
case DW_CFA_def_cfa_offset:
@@ -3818,8 +3908,10 @@ display_debug_frames (struct dwarf_section *section,
ul = LEB ();
if (! do_debug_frames_interp)
{
- printf (" DW_CFA_expression: r%ld (", reg);
- decode_location_expression (start, eh_addr_size, ul, 0);
+ printf (" DW_CFA_expression: %s (",
+ regname (reg, 0));
+ decode_location_expression (start, eh_addr_size,
+ ul, 0);
printf (")\n");
}
fc->col_type[reg] = DW_CFA_expression;
@@ -3831,7 +3923,8 @@ display_debug_frames (struct dwarf_section *section,
ul = LEB ();
if (! do_debug_frames_interp)
{
- printf (" DW_CFA_val_expression: r%ld (", reg);
+ printf (" DW_CFA_val_expression: %s (",
+ regname (reg, 0));
decode_location_expression (start, eh_addr_size, ul, 0);
printf (")\n");
}
@@ -3844,8 +3937,8 @@ display_debug_frames (struct dwarf_section *section,
l = SLEB ();
frame_need_space (fc, reg);
if (! do_debug_frames_interp)
- printf (" DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
- reg, l * fc->data_factor);
+ printf (" DW_CFA_offset_extended_sf: %s at cfa%+ld\n",
+ regname (reg, 0), l * fc->data_factor);
fc->col_type[reg] = DW_CFA_offset;
fc->col_offset[reg] = l * fc->data_factor;
break;
@@ -3855,8 +3948,8 @@ display_debug_frames (struct dwarf_section *section,
l = SLEB ();
frame_need_space (fc, reg);
if (! do_debug_frames_interp)
- printf (" DW_CFA_val_offset_sf: r%ld at cfa%+ld\n",
- reg, l * fc->data_factor);
+ printf (" DW_CFA_val_offset_sf: %s at cfa%+ld\n",
+ regname (reg, 0), l * fc->data_factor);
fc->col_type[reg] = DW_CFA_val_offset;
fc->col_offset[reg] = l * fc->data_factor;
break;
@@ -3867,8 +3960,8 @@ display_debug_frames (struct dwarf_section *section,
fc->cfa_offset = fc->cfa_offset * fc->data_factor;
fc->cfa_exp = 0;
if (! do_debug_frames_interp)
- printf (" DW_CFA_def_cfa_sf: r%d ofs %d\n",
- fc->cfa_reg, fc->cfa_offset);
+ printf (" DW_CFA_def_cfa_sf: %s ofs %d\n",
+ regname (fc->cfa_reg, 0), fc->cfa_offset);
break;
case DW_CFA_def_cfa_offset_sf:
@@ -3905,8 +3998,8 @@ display_debug_frames (struct dwarf_section *section,
l = - LEB ();
frame_need_space (fc, reg);
if (! do_debug_frames_interp)
- printf (" DW_CFA_GNU_negative_offset_extended: r%ld at cfa%+ld\n",
- reg, l * fc->data_factor);
+ printf (" DW_CFA_GNU_negative_offset_extended: %s at cfa%+ld\n",
+ regname (reg, 0), l * fc->data_factor);
fc->col_type[reg] = DW_CFA_offset;
fc->col_offset[reg] = l * fc->data_factor;
break;
diff --git a/binutils/dwarf.h b/binutils/dwarf.h
index 113a8f9077..a0cffb9f50 100644
--- a/binutils/dwarf.h
+++ b/binutils/dwarf.h
@@ -91,7 +91,7 @@ extern dwarf_vma (*byte_get) (unsigned char *, int);
extern dwarf_vma byte_get_little_endian (unsigned char *, int);
extern dwarf_vma byte_get_big_endian (unsigned char *, int);
-extern dwarf_vma eh_addr_size;
+extern int eh_addr_size;
extern int do_debug_info;
extern int do_debug_abbrevs;
@@ -105,6 +105,8 @@ extern int do_debug_macinfo;
extern int do_debug_str;
extern int do_debug_loc;
+extern void init_dwarf_regnames (unsigned int);
+
extern int load_debug_section (enum dwarf_section_display_enum,
void *);
extern void free_debug_section (enum dwarf_section_display_enum);
diff --git a/binutils/objdump.c b/binutils/objdump.c
index 5a2ea6ddf3..e5ee5d2b33 100644
--- a/binutils/objdump.c
+++ b/binutils/objdump.c
@@ -52,6 +52,7 @@
#include "sysdep.h"
#include "bfd.h"
+#include "elf-bfd.h"
#include "progress.h"
#include "bucomm.h"
#include "dwarf.h"
@@ -2186,6 +2187,12 @@ dump_dwarf (bfd *abfd)
check_mach_o_dwarf (abfd);
+ if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
+ {
+ const struct elf_backend_data *bed = get_elf_backend_data (abfd);
+ init_dwarf_regnames (bed->elf_machine_code);
+ }
+
bfd_map_over_sections (abfd, dump_dwarf_section, NULL);
free_debug_memory ();
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 20a7681f41..55ab8423b1 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -624,7 +624,7 @@ find_section (const char *name)
/* Guess the relocation size commonly used by the specific machines. */
static int
-guess_is_rela (unsigned long e_machine)
+guess_is_rela (unsigned int e_machine)
{
switch (e_machine)
{
@@ -3032,22 +3032,18 @@ parse_args (int argc, char **argv)
switch (optarg[index++])
{
case 'i':
- case 'I':
do_debug_info = 1;
break;
case 'a':
- case 'A':
do_debug_abbrevs = 1;
break;
case 'l':
- case 'L':
do_debug_lines = 1;
break;
case 'p':
- case 'P':
do_debug_pubnames = 1;
break;
@@ -3066,17 +3062,14 @@ parse_args (int argc, char **argv)
break;
case 'm':
- case 'M':
do_debug_macinfo = 1;
break;
case 's':
- case 'S':
do_debug_str = 1;
break;
case 'o':
- case 'O':
do_debug_loc = 1;
break;
@@ -3246,6 +3239,8 @@ process_file_header (void)
return 0;
}
+ init_dwarf_regnames (elf_header.e_machine);
+
if (do_header)
{
int i;