mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-06 12:09:26 +08:00
e47ad6c0bd
This patch addes class gdb_disassembler, and refactor code to use it. The gdb_disassembler object is saved in disassember_info.application_data. However, disassember_info.application_data is already used by gdb for arm, mips spu, and scm-disasm. In arm and mips, .application_data is gdbarch, but we can still get gdbarch from gdb_disassember. The use of application_data in spu is a little bit complicated. It creates its own disassemble_info, and save spu_dis_asm_data in .application_data. This will overwrite the pointer to gdb_disassembler, so we need to find another place to save spu_dis_asm_data. I extend disassemble_info, and put "id" there. gdb: 2017-01-26 Pedro Alves <palves@redhat.com> Yao Qi <yao.qi@linaro.org> * arm-tdep.c: Include "disasm.h". (gdb_print_insn_arm): Update code to get gdbarch. * disasm.c (dis_asm_read_memory): Change it to gdb_disassembler::dis_asm_read_memory. (dis_asm_memory_error): Likewise. (dis_asm_print_address): Likewise. (gdb_pretty_print_insn): Change it to gdb_disassembler::pretty_print_insn. (dump_insns): Add one argument gdb_disassemlber. All callers updated. (do_mixed_source_and_assembly_deprecated): Likewise. (do_mixed_source_and_assembly): Likewise. (do_assembly_only): Likewise. (gdb_disassembler::gdb_disassembler): New. (gdb_disassembler::print_insn): New. * disasm.h (class gdb_disassembler): New. (gdb_pretty_print_insn): Remove declaration. (gdb_disassemble_info): Likewise. * guile/scm-disasm.c (class gdbscm_disassembler): New. (gdbscm_disasm_read_memory_worker): Update. (gdbscm_disasm_read_memory): Update. (gdbscm_disasm_memory_error): Remove. (gdbscm_disasm_print_address): Remove. (gdbscm_disassembler::gdbscm_disassembler): New. (gdbscm_print_insn_from_port): Update. * mips-tdep.c: Include disasm.h. (gdb_print_insn_mips): Update code to get gdbarch. * record-btrace.c (btrace_insn_history): Update. * spu-tdep.c: Include disasm.h. (struct spu_dis_asm_data): Remove. (struct spu_dis_asm_info): New. (spu_dis_asm_print_address): Use spu_dis_asm_info to get SPU id. (gdb_print_insn_spu): Cast disassemble_info to spu_dis_asm_info.
117 lines
3.6 KiB
C++
117 lines
3.6 KiB
C++
/* Disassemble support for GDB.
|
|
Copyright (C) 2002-2017 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef DISASM_H
|
|
#define DISASM_H
|
|
|
|
#include "dis-asm.h"
|
|
|
|
#define DISASSEMBLY_SOURCE_DEPRECATED (0x1 << 0)
|
|
#define DISASSEMBLY_RAW_INSN (0x1 << 1)
|
|
#define DISASSEMBLY_OMIT_FNAME (0x1 << 2)
|
|
#define DISASSEMBLY_FILENAME (0x1 << 3)
|
|
#define DISASSEMBLY_OMIT_PC (0x1 << 4)
|
|
#define DISASSEMBLY_SOURCE (0x1 << 5)
|
|
#define DISASSEMBLY_SPECULATIVE (0x1 << 6)
|
|
|
|
struct gdbarch;
|
|
struct ui_out;
|
|
struct ui_file;
|
|
|
|
class gdb_disassembler
|
|
{
|
|
using di_read_memory_ftype = decltype (disassemble_info::read_memory_func);
|
|
|
|
public:
|
|
gdb_disassembler (struct gdbarch *gdbarch, struct ui_file *file)
|
|
: gdb_disassembler (gdbarch, file, dis_asm_read_memory)
|
|
{}
|
|
|
|
int print_insn (CORE_ADDR memaddr, int *branch_delay_insns = NULL);
|
|
|
|
/* Prints the instruction INSN into UIOUT and returns the length of
|
|
the printed instruction in bytes. */
|
|
int pretty_print_insn (struct ui_out *uiout,
|
|
const struct disasm_insn *insn, int flags);
|
|
|
|
/* Return the gdbarch of gdb_disassembler. */
|
|
struct gdbarch *arch ()
|
|
{ return m_gdbarch; }
|
|
|
|
protected:
|
|
gdb_disassembler (struct gdbarch *gdbarch, struct ui_file *file,
|
|
di_read_memory_ftype func);
|
|
|
|
struct ui_file *stream ()
|
|
{ return (struct ui_file *) m_di.stream; }
|
|
|
|
private:
|
|
struct gdbarch *m_gdbarch;
|
|
|
|
/* Stores data required for disassembling instructions in
|
|
opcodes. */
|
|
struct disassemble_info m_di;
|
|
|
|
static int dis_asm_read_memory (bfd_vma memaddr, gdb_byte *myaddr,
|
|
unsigned int len,
|
|
struct disassemble_info *info);
|
|
static void dis_asm_memory_error (int err, bfd_vma memaddr,
|
|
struct disassemble_info *info);
|
|
static void dis_asm_print_address (bfd_vma addr,
|
|
struct disassemble_info *info);
|
|
};
|
|
|
|
/* An instruction to be disassembled. */
|
|
|
|
struct disasm_insn
|
|
{
|
|
/* The address of the memory containing the instruction. */
|
|
CORE_ADDR addr;
|
|
|
|
/* An optional instruction number. If non-zero, it is printed first. */
|
|
unsigned int number;
|
|
|
|
/* True if the instruction was executed speculatively. */
|
|
unsigned int is_speculative:1;
|
|
};
|
|
|
|
extern void gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout,
|
|
char *file_string, int flags, int how_many,
|
|
CORE_ADDR low, CORE_ADDR high);
|
|
|
|
/* Print the instruction at address MEMADDR in debugged memory,
|
|
on STREAM. Returns the length of the instruction, in bytes,
|
|
and, if requested, the number of branch delay slot instructions. */
|
|
|
|
extern int gdb_print_insn (struct gdbarch *gdbarch, CORE_ADDR memaddr,
|
|
struct ui_file *stream, int *branch_delay_insns);
|
|
|
|
/* Return the length in bytes of the instruction at address MEMADDR in
|
|
debugged memory. */
|
|
|
|
extern int gdb_insn_length (struct gdbarch *gdbarch, CORE_ADDR memaddr);
|
|
|
|
/* Return the length in bytes of INSN, originally at MEMADDR. MAX_LEN
|
|
is the size of the buffer containing INSN. */
|
|
|
|
extern int gdb_buffered_insn_length (struct gdbarch *gdbarch,
|
|
const gdb_byte *insn, int max_len,
|
|
CORE_ADDR memaddr);
|
|
|
|
#endif
|