mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-25 11:04:18 +08:00
Refactor disassembler selection
Nowadays, opcodes/disassemble.c:disassembler selects the proper disassembler according to ABFD only. However, it actually selects disassemblers according to arch, mach, endianess, and abfd. This patch adds them to the parameters of disassembler, so that its caller can still select disassemblers in case that abfd is NULL (a typical case in GDB). There isn't any functionality change. binutils: 2017-05-24 Yao Qi <yao.qi@linaro.org> * objdump.c (disassemble_data): Caller update. include: 2017-05-24 Yao Qi <yao.qi@linaro.org> * dis-asm.h (disassembler): Update declaration. opcodes: 2017-05-24 Yao Qi <yao.qi@linaro.org> * disassemble.c (disassembler): Add arguments a, big and mach. Use them. sim/common: 2017-05-24 Yao Qi <yao.qi@linaro.org> * sim-trace.c (trace_disasm): Caller update.
This commit is contained in:
parent
60fd657792
commit
003ca0fd22
@ -1,3 +1,7 @@
|
|||||||
|
2017-05-24 Yao Qi <yao.qi@linaro.org>
|
||||||
|
|
||||||
|
* objdump.c (disassemble_data): Caller update.
|
||||||
|
|
||||||
2017-05-19 Jose E. Marchesi <jose.marchesi@oracle.com>
|
2017-05-19 Jose E. Marchesi <jose.marchesi@oracle.com>
|
||||||
|
|
||||||
* objcopy.c (merge_gnu_build_notes): Remove workaround that
|
* objcopy.c (merge_gnu_build_notes): Remove workaround that
|
||||||
|
@ -2386,7 +2386,9 @@ disassemble_data (bfd *abfd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Use libopcodes to locate a suitable disassembler. */
|
/* Use libopcodes to locate a suitable disassembler. */
|
||||||
aux.disassemble_fn = disassembler (abfd);
|
aux.disassemble_fn = disassembler (bfd_get_arch (abfd),
|
||||||
|
bfd_big_endian (abfd),
|
||||||
|
bfd_get_mach (abfd), abfd);
|
||||||
if (!aux.disassemble_fn)
|
if (!aux.disassemble_fn)
|
||||||
{
|
{
|
||||||
non_fatal (_("can't disassemble for architecture %s\n"),
|
non_fatal (_("can't disassemble for architecture %s\n"),
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
2017-05-24 Yao Qi <yao.qi@linaro.org>
|
||||||
|
|
||||||
|
* dis-asm.h (disassembler): Update declaration.
|
||||||
|
|
||||||
2017-05-23 Claudiu Zissulescu <claziss@synopsys.com>
|
2017-05-23 Claudiu Zissulescu <claziss@synopsys.com>
|
||||||
|
|
||||||
* opcode/arc.h (MAX_INSN_FLGS): Update to 4.
|
* opcode/arc.h (MAX_INSN_FLGS): Update to 4.
|
||||||
|
@ -354,8 +354,12 @@ extern const disasm_options_t *disassembler_options_powerpc (void);
|
|||||||
extern const disasm_options_t *disassembler_options_arm (void);
|
extern const disasm_options_t *disassembler_options_arm (void);
|
||||||
extern const disasm_options_t *disassembler_options_s390 (void);
|
extern const disasm_options_t *disassembler_options_s390 (void);
|
||||||
|
|
||||||
/* Fetch the disassembler for a given BFD, if that support is available. */
|
/* Fetch the disassembler for a given architecture ARC, endianess (big
|
||||||
extern disassembler_ftype disassembler (bfd *);
|
endian if BIG is true), bfd_mach value MACH, and ABFD, if that support
|
||||||
|
is available. ABFD may be NULL. */
|
||||||
|
extern disassembler_ftype disassembler (enum bfd_architecture arc,
|
||||||
|
bfd_boolean big, unsigned long mach,
|
||||||
|
bfd *abfd);
|
||||||
|
|
||||||
/* Amend the disassemble_info structure as necessary for the target architecture.
|
/* Amend the disassemble_info structure as necessary for the target architecture.
|
||||||
Should only be called after initialising the info->arch field. */
|
Should only be called after initialising the info->arch field. */
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
2017-05-24 Yao Qi <yao.qi@linaro.org>
|
||||||
|
|
||||||
|
* disassemble.c (disassembler): Add arguments a, big and mach.
|
||||||
|
Use them.
|
||||||
|
|
||||||
2017-05-22 H.J. Lu <hongjiu.lu@intel.com>
|
2017-05-22 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* i386-dis.c (NOTRACK_Fixup): New.
|
* i386-dis.c (NOTRACK_Fixup): New.
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "sysdep.h"
|
#include "sysdep.h"
|
||||||
#include "dis-asm.h"
|
#include "dis-asm.h"
|
||||||
#include "safe-ctype.h"
|
#include "safe-ctype.h"
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#ifdef ARCH_all
|
#ifdef ARCH_all
|
||||||
#define ARCH_aarch64
|
#define ARCH_aarch64
|
||||||
@ -109,11 +110,22 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
disassembler_ftype
|
disassembler_ftype
|
||||||
disassembler (bfd *abfd)
|
disassembler (enum bfd_architecture a, bfd_boolean big, unsigned long mach,
|
||||||
|
bfd *abfd)
|
||||||
{
|
{
|
||||||
enum bfd_architecture a = bfd_get_arch (abfd);
|
|
||||||
disassembler_ftype disassemble;
|
disassembler_ftype disassemble;
|
||||||
|
|
||||||
|
if (abfd != NULL)
|
||||||
|
{
|
||||||
|
/* Do some asserts that the first three parameters should equal
|
||||||
|
to what we can get from ABFD. On the other hand, these
|
||||||
|
asserts help removing some compiler errors on unused
|
||||||
|
parameter. */
|
||||||
|
assert (a == bfd_get_arch (abfd));
|
||||||
|
assert (big == bfd_big_endian (abfd));
|
||||||
|
assert (mach == bfd_get_mach (abfd));
|
||||||
|
}
|
||||||
|
|
||||||
switch (a)
|
switch (a)
|
||||||
{
|
{
|
||||||
/* If you add a case to this table, also add it to the
|
/* If you add a case to this table, also add it to the
|
||||||
@ -135,7 +147,7 @@ disassembler (bfd *abfd)
|
|||||||
#endif
|
#endif
|
||||||
#ifdef ARCH_arm
|
#ifdef ARCH_arm
|
||||||
case bfd_arch_arm:
|
case bfd_arch_arm:
|
||||||
if (bfd_big_endian (abfd))
|
if (big)
|
||||||
disassemble = print_insn_big_arm;
|
disassemble = print_insn_big_arm;
|
||||||
else
|
else
|
||||||
disassemble = print_insn_little_arm;
|
disassemble = print_insn_little_arm;
|
||||||
@ -184,13 +196,12 @@ disassembler (bfd *abfd)
|
|||||||
#endif
|
#endif
|
||||||
#ifdef ARCH_h8300
|
#ifdef ARCH_h8300
|
||||||
case bfd_arch_h8300:
|
case bfd_arch_h8300:
|
||||||
if (bfd_get_mach (abfd) == bfd_mach_h8300h
|
if (mach == bfd_mach_h8300h || mach == bfd_mach_h8300hn)
|
||||||
|| bfd_get_mach (abfd) == bfd_mach_h8300hn)
|
|
||||||
disassemble = print_insn_h8300h;
|
disassemble = print_insn_h8300h;
|
||||||
else if (bfd_get_mach (abfd) == bfd_mach_h8300s
|
else if (mach == bfd_mach_h8300s
|
||||||
|| bfd_get_mach (abfd) == bfd_mach_h8300sn
|
|| mach == bfd_mach_h8300sn
|
||||||
|| bfd_get_mach (abfd) == bfd_mach_h8300sx
|
|| mach == bfd_mach_h8300sx
|
||||||
|| bfd_get_mach (abfd) == bfd_mach_h8300sxn)
|
|| mach == bfd_mach_h8300sxn)
|
||||||
disassemble = print_insn_h8300s;
|
disassemble = print_insn_h8300s;
|
||||||
else
|
else
|
||||||
disassemble = print_insn_h8300;
|
disassemble = print_insn_h8300;
|
||||||
@ -326,7 +337,7 @@ disassembler (bfd *abfd)
|
|||||||
#endif
|
#endif
|
||||||
#ifdef ARCH_mips
|
#ifdef ARCH_mips
|
||||||
case bfd_arch_mips:
|
case bfd_arch_mips:
|
||||||
if (bfd_big_endian (abfd))
|
if (big)
|
||||||
disassemble = print_insn_big_mips;
|
disassemble = print_insn_big_mips;
|
||||||
else
|
else
|
||||||
disassemble = print_insn_little_mips;
|
disassemble = print_insn_little_mips;
|
||||||
@ -349,7 +360,7 @@ disassembler (bfd *abfd)
|
|||||||
#endif
|
#endif
|
||||||
#ifdef ARCH_nios2
|
#ifdef ARCH_nios2
|
||||||
case bfd_arch_nios2:
|
case bfd_arch_nios2:
|
||||||
if (bfd_big_endian (abfd))
|
if (big)
|
||||||
disassemble = print_insn_big_nios2;
|
disassemble = print_insn_big_nios2;
|
||||||
else
|
else
|
||||||
disassemble = print_insn_little_nios2;
|
disassemble = print_insn_little_nios2;
|
||||||
@ -372,7 +383,7 @@ disassembler (bfd *abfd)
|
|||||||
#endif
|
#endif
|
||||||
#ifdef ARCH_powerpc
|
#ifdef ARCH_powerpc
|
||||||
case bfd_arch_powerpc:
|
case bfd_arch_powerpc:
|
||||||
if (bfd_big_endian (abfd))
|
if (big)
|
||||||
disassemble = print_insn_big_powerpc;
|
disassemble = print_insn_big_powerpc;
|
||||||
else
|
else
|
||||||
disassemble = print_insn_little_powerpc;
|
disassemble = print_insn_little_powerpc;
|
||||||
@ -390,7 +401,7 @@ disassembler (bfd *abfd)
|
|||||||
#endif
|
#endif
|
||||||
#ifdef ARCH_rs6000
|
#ifdef ARCH_rs6000
|
||||||
case bfd_arch_rs6000:
|
case bfd_arch_rs6000:
|
||||||
if (bfd_get_mach (abfd) == bfd_mach_ppc_620)
|
if (mach == bfd_mach_ppc_620)
|
||||||
disassemble = print_insn_big_powerpc;
|
disassemble = print_insn_big_powerpc;
|
||||||
else
|
else
|
||||||
disassemble = print_insn_rs6000;
|
disassemble = print_insn_rs6000;
|
||||||
@ -413,7 +424,7 @@ disassembler (bfd *abfd)
|
|||||||
#endif
|
#endif
|
||||||
#ifdef ARCH_score
|
#ifdef ARCH_score
|
||||||
case bfd_arch_score:
|
case bfd_arch_score:
|
||||||
if (bfd_big_endian (abfd))
|
if (big)
|
||||||
disassemble = print_insn_big_score;
|
disassemble = print_insn_big_score;
|
||||||
else
|
else
|
||||||
disassemble = print_insn_little_score;
|
disassemble = print_insn_little_score;
|
||||||
@ -507,7 +518,7 @@ disassembler (bfd *abfd)
|
|||||||
#endif
|
#endif
|
||||||
#ifdef ARCH_z8k
|
#ifdef ARCH_z8k
|
||||||
case bfd_arch_z8k:
|
case bfd_arch_z8k:
|
||||||
if (bfd_get_mach(abfd) == bfd_mach_z8001)
|
if (mach == bfd_mach_z8001)
|
||||||
disassemble = print_insn_z8001;
|
disassemble = print_insn_z8001;
|
||||||
else
|
else
|
||||||
disassemble = print_insn_z8002;
|
disassemble = print_insn_z8002;
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
2017-05-24 Yao Qi <yao.qi@linaro.org>
|
||||||
|
|
||||||
|
* sim-trace.c (trace_disasm): Caller update.
|
||||||
|
|
||||||
2016-08-15 Mike Frysinger <vapier@gentoo.org>
|
2016-08-15 Mike Frysinger <vapier@gentoo.org>
|
||||||
|
|
||||||
* sim-base.h (sim_state_base): Add prog_syms_count.
|
* sim-base.h (sim_state_base): Add prog_syms_count.
|
||||||
|
@ -919,7 +919,11 @@ trace_disasm (SIM_DESC sd, sim_cpu *cpu, address_word addr)
|
|||||||
if (trace_data->dis_bfd != bfd)
|
if (trace_data->dis_bfd != bfd)
|
||||||
{
|
{
|
||||||
trace_data->dis_bfd = bfd;
|
trace_data->dis_bfd = bfd;
|
||||||
trace_data->disassembler = disassembler (trace_data->dis_bfd);
|
trace_data->disassembler
|
||||||
|
= disassembler (bfd_get_arch (trace_data->dis_bfd),
|
||||||
|
bfd_big_endian (trace_data->dis_bfd),
|
||||||
|
bfd_get_mach (trace_data->dis_bfd),
|
||||||
|
trace_data->dis_bfd);
|
||||||
INIT_DISASSEMBLE_INFO (*info, cpu, dis_printf);
|
INIT_DISASSEMBLE_INFO (*info, cpu, dis_printf);
|
||||||
info->read_memory_func = dis_read;
|
info->read_memory_func = dis_read;
|
||||||
info->arch = bfd_get_arch (bfd);
|
info->arch = bfd_get_arch (bfd);
|
||||||
|
Loading…
Reference in New Issue
Block a user