aboutsummaryrefslogtreecommitdiff
path: root/binutils/objdump.c
diff options
context:
space:
mode:
authorPer Bothner <per@bothner.com>1993-03-19 00:12:50 +0000
committerPer Bothner <per@bothner.com>1993-03-19 00:12:50 +0000
commit2e8adbd7f459067936857adc9fbefe9a2982e5d7 (patch)
treed7f6e9e5e097d404f336ed25a1223948a9b2301b /binutils/objdump.c
parentc840244e232b52120ceff2ba44f291897b82a706 (diff)
downloadgdb-2e8adbd7f459067936857adc9fbefe9a2982e5d7.zip
gdb-2e8adbd7f459067936857adc9fbefe9a2982e5d7.tar.gz
gdb-2e8adbd7f459067936857adc9fbefe9a2982e5d7.tar.bz2
* m68k-pinsn.c: Removed. Subsumed by ../opcodes/m68k-dis.c.
* i386-pinsn.c: Removed. Subsumed by ../opcodes/i386-dis.c. * Makefile.in: Adjust accordingly. * objdump.c: Support new-style disassemblers (ones that use the interface of ../include/dis-asm.h).
Diffstat (limited to 'binutils/objdump.c')
-rw-r--r--binutils/objdump.c68
1 files changed, 38 insertions, 30 deletions
diff --git a/binutils/objdump.c b/binutils/objdump.c
index bc423c9..cd1dd37 100644
--- a/binutils/objdump.c
+++ b/binutils/objdump.c
@@ -27,6 +27,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "getopt.h"
#include <stdio.h>
#include <ctype.h>
+#include "dis-asm.h"
#define ELF_STAB_DISPLAY /* This code works, but uses internal
bfd and elf stuff. Flip this define
@@ -41,7 +42,8 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
extern Elf_Internal_Shdr *bfd_elf_find_section();
#endif /* ELF_STAB_DISPLAY */
-char *xmalloc ();
+extern char *xmalloc ();
+extern int fprintf ();
char *default_target = NULL; /* default at runtime */
@@ -304,23 +306,25 @@ disassemble_data (abfd)
bfd_arch_info_type *info;
bfd_size_type datasize = 0;
bfd_size_type i;
- unsigned int (*print) ()= 0;
- unsigned int print_insn_m68k ();
+ unsigned int (*print) ()= 0; /* Old style */
+ disassembler_ftype disassemble = 0; /* New style */
unsigned int print_insn_a29k ();
- unsigned int print_insn_z8001 ();
- unsigned int print_insn_z8002 ();
unsigned int print_insn_i960 ();
unsigned int print_insn_sparc ();
- unsigned int print_insn_i386 ();
unsigned int print_insn_h8300 ();
- unsigned int print_insn_mips ();
enum bfd_architecture a;
+ struct disassemble_info disasm_info;
+
+ int prevline;
+ CONST char *prev_function = "";
asection *section;
/* Replace symbol section relative values with abs values */
boolean done_dot = false;
+ INIT_DISASSEMBLE_INFO(disasm_info, stdout);
+
for (i = 0; i < symcount; i++)
{
syms[i]->value += syms[i]->section->vma;
@@ -377,15 +381,15 @@ disassemble_data (abfd)
break;
case bfd_arch_z8k:
if (bfd_get_mach(abfd) == bfd_mach_z8001)
- print = print_insn_z8001;
+ disassemble = print_insn_z8001;
else
- print = print_insn_z8002;
+ disassemble = print_insn_z8002;
break;
case bfd_arch_i386:
- print = print_insn_i386;
+ disassemble = print_insn_i386;
break;
case bfd_arch_m68k:
- print = print_insn_m68k;
+ disassemble = print_insn_m68k;
break;
case bfd_arch_a29k:
print = print_insn_a29k;
@@ -394,8 +398,10 @@ disassemble_data (abfd)
print = print_insn_i960;
break;
case bfd_arch_mips:
- /* MIPS is handled specially, because we need to pass an
- additional endianness argument. */
+ if (abfd->xvec->byteorder_big_p)
+ disassemble = print_insn_big_mips;
+ else
+ disassemble = print_insn_little_mips;
break;
default:
fprintf (stderr, "%s: Can't disassemble for architecture %s\n",
@@ -448,7 +454,6 @@ disassemble_data (abfd)
done_dot = false;
if (with_line_numbers)
{
- static prevline;
CONST char *filename;
CONST char *functionname;
unsigned int line;
@@ -459,31 +464,34 @@ disassemble_data (abfd)
section->vma + i,
&filename,
&functionname,
- &line)
- && filename
- && functionname
- && line
- && line != prevline)
+ &line))
{
- printf ("%s:%u\n", filename, line);
- prevline = line;
+ if (functionname && *functionname
+ && strcmp(functionname, prev_function))
+ {
+ printf ("%s():\n", functionname);
+ prev_function = functionname;
+ }
+ if (!filename)
+ filename = "???";
+ if (line && line != prevline)
+ {
+ printf ("%s:%u\n", filename, line);
+ prevline = line;
+ }
}
}
print_address (section->vma + i, stdout);
printf (" ");
- if (a != bfd_arch_mips)
+ if (disassemble) /* New style */
+ i += (*disassemble)(section->vma + i,
+ data + i,
+ &disasm_info);
+ else /* Old style */
i += print (section->vma + i,
data + i,
stdout);
- else
- {
- /* The endianness of the MIPS can vary. */
- i += print_insn_mips (section->vma + i,
- data + i,
- stdout,
- (int) abfd->xvec->byteorder_big_p);
- }
putchar ('\n');
}
}