Home | History | Annotate | Line # | Download | only in gdb
disasm.h revision 1.1.1.4
      1      1.1  christos /* Disassemble support for GDB.
      2  1.1.1.4  christos    Copyright (C) 2002-2017 Free Software Foundation, Inc.
      3      1.1  christos 
      4      1.1  christos    This file is part of GDB.
      5      1.1  christos 
      6      1.1  christos    This program is free software; you can redistribute it and/or modify
      7      1.1  christos    it under the terms of the GNU General Public License as published by
      8      1.1  christos    the Free Software Foundation; either version 3 of the License, or
      9      1.1  christos    (at your option) any later version.
     10      1.1  christos 
     11      1.1  christos    This program is distributed in the hope that it will be useful,
     12      1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13      1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14      1.1  christos    GNU General Public License for more details.
     15      1.1  christos 
     16      1.1  christos    You should have received a copy of the GNU General Public License
     17      1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     18      1.1  christos 
     19      1.1  christos #ifndef DISASM_H
     20      1.1  christos #define DISASM_H
     21      1.1  christos 
     22  1.1.1.2  christos #include "dis-asm.h"
     23  1.1.1.2  christos 
     24  1.1.1.3  christos #define DISASSEMBLY_SOURCE_DEPRECATED (0x1 << 0)
     25      1.1  christos #define DISASSEMBLY_RAW_INSN	(0x1 << 1)
     26      1.1  christos #define DISASSEMBLY_OMIT_FNAME	(0x1 << 2)
     27      1.1  christos #define DISASSEMBLY_FILENAME	(0x1 << 3)
     28      1.1  christos #define DISASSEMBLY_OMIT_PC	(0x1 << 4)
     29  1.1.1.3  christos #define DISASSEMBLY_SOURCE	(0x1 << 5)
     30  1.1.1.3  christos #define DISASSEMBLY_SPECULATIVE	(0x1 << 6)
     31      1.1  christos 
     32  1.1.1.2  christos struct gdbarch;
     33      1.1  christos struct ui_out;
     34      1.1  christos struct ui_file;
     35      1.1  christos 
     36  1.1.1.4  christos class gdb_disassembler
     37  1.1.1.4  christos {
     38  1.1.1.4  christos   using di_read_memory_ftype = decltype (disassemble_info::read_memory_func);
     39  1.1.1.4  christos 
     40  1.1.1.4  christos public:
     41  1.1.1.4  christos   gdb_disassembler (struct gdbarch *gdbarch, struct ui_file *file)
     42  1.1.1.4  christos     : gdb_disassembler (gdbarch, file, dis_asm_read_memory)
     43  1.1.1.4  christos   {}
     44  1.1.1.4  christos 
     45  1.1.1.4  christos   int print_insn (CORE_ADDR memaddr, int *branch_delay_insns = NULL);
     46  1.1.1.4  christos 
     47  1.1.1.4  christos   /* Return the gdbarch of gdb_disassembler.  */
     48  1.1.1.4  christos   struct gdbarch *arch ()
     49  1.1.1.4  christos   { return m_gdbarch; }
     50  1.1.1.4  christos 
     51  1.1.1.4  christos protected:
     52  1.1.1.4  christos   gdb_disassembler (struct gdbarch *gdbarch, struct ui_file *file,
     53  1.1.1.4  christos 		    di_read_memory_ftype func);
     54  1.1.1.4  christos 
     55  1.1.1.4  christos   struct ui_file *stream ()
     56  1.1.1.4  christos   { return (struct ui_file *) m_di.stream; }
     57  1.1.1.4  christos 
     58  1.1.1.4  christos private:
     59  1.1.1.4  christos   struct gdbarch *m_gdbarch;
     60  1.1.1.4  christos 
     61  1.1.1.4  christos   /* Stores data required for disassembling instructions in
     62  1.1.1.4  christos      opcodes.  */
     63  1.1.1.4  christos   struct disassemble_info m_di;
     64  1.1.1.4  christos   CORE_ADDR m_err_memaddr;
     65  1.1.1.4  christos 
     66  1.1.1.4  christos   static int dis_asm_read_memory (bfd_vma memaddr, gdb_byte *myaddr,
     67  1.1.1.4  christos 				  unsigned int len,
     68  1.1.1.4  christos 				  struct disassemble_info *info);
     69  1.1.1.4  christos   static void dis_asm_memory_error (int err, bfd_vma memaddr,
     70  1.1.1.4  christos 				    struct disassemble_info *info);
     71  1.1.1.4  christos   static void dis_asm_print_address (bfd_vma addr,
     72  1.1.1.4  christos 				     struct disassemble_info *info);
     73  1.1.1.4  christos };
     74  1.1.1.4  christos 
     75  1.1.1.3  christos /* An instruction to be disassembled.  */
     76  1.1.1.3  christos 
     77  1.1.1.3  christos struct disasm_insn
     78  1.1.1.3  christos {
     79  1.1.1.3  christos   /* The address of the memory containing the instruction.  */
     80  1.1.1.3  christos   CORE_ADDR addr;
     81  1.1.1.3  christos 
     82  1.1.1.3  christos   /* An optional instruction number.  If non-zero, it is printed first.  */
     83  1.1.1.3  christos   unsigned int number;
     84  1.1.1.3  christos 
     85  1.1.1.3  christos   /* True if the instruction was executed speculatively.  */
     86  1.1.1.3  christos   unsigned int is_speculative:1;
     87  1.1.1.3  christos };
     88  1.1.1.3  christos 
     89      1.1  christos extern void gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout,
     90  1.1.1.4  christos 			     int flags, int how_many,
     91      1.1  christos 			     CORE_ADDR low, CORE_ADDR high);
     92      1.1  christos 
     93      1.1  christos /* Print the instruction at address MEMADDR in debugged memory,
     94      1.1  christos    on STREAM.  Returns the length of the instruction, in bytes,
     95      1.1  christos    and, if requested, the number of branch delay slot instructions.  */
     96      1.1  christos 
     97      1.1  christos extern int gdb_print_insn (struct gdbarch *gdbarch, CORE_ADDR memaddr,
     98      1.1  christos 			   struct ui_file *stream, int *branch_delay_insns);
     99      1.1  christos 
    100  1.1.1.4  christos /* Class used to pretty-print instructions.  */
    101  1.1.1.4  christos 
    102  1.1.1.4  christos class gdb_pretty_print_disassembler
    103  1.1.1.4  christos {
    104  1.1.1.4  christos public:
    105  1.1.1.4  christos   explicit gdb_pretty_print_disassembler (struct gdbarch *gdbarch)
    106  1.1.1.4  christos     : m_di (gdbarch, &m_insn_stb)
    107  1.1.1.4  christos   {}
    108  1.1.1.4  christos 
    109  1.1.1.4  christos   /* Prints the instruction INSN into UIOUT and returns the length of
    110  1.1.1.4  christos      the printed instruction in bytes.  */
    111  1.1.1.4  christos   int pretty_print_insn (struct ui_out *uiout, const struct disasm_insn *insn,
    112  1.1.1.4  christos 			 int flags);
    113  1.1.1.4  christos 
    114  1.1.1.4  christos private:
    115  1.1.1.4  christos   /* Returns the architecture used for disassembling.  */
    116  1.1.1.4  christos   struct gdbarch *arch () { return m_di.arch (); }
    117  1.1.1.4  christos 
    118  1.1.1.4  christos   /* The disassembler used for instruction printing.  */
    119  1.1.1.4  christos   gdb_disassembler m_di;
    120  1.1.1.4  christos 
    121  1.1.1.4  christos   /* The buffer used to build the instruction string.  The
    122  1.1.1.4  christos      disassembler is initialized with this stream.  */
    123  1.1.1.4  christos   string_file m_insn_stb;
    124  1.1.1.4  christos 
    125  1.1.1.4  christos   /* The buffer used to build the raw opcodes string.  */
    126  1.1.1.4  christos   string_file m_opcode_stb;
    127  1.1.1.4  christos };
    128  1.1.1.4  christos 
    129      1.1  christos /* Return the length in bytes of the instruction at address MEMADDR in
    130      1.1  christos    debugged memory.  */
    131      1.1  christos 
    132      1.1  christos extern int gdb_insn_length (struct gdbarch *gdbarch, CORE_ADDR memaddr);
    133      1.1  christos 
    134      1.1  christos /* Return the length in bytes of INSN, originally at MEMADDR.  MAX_LEN
    135      1.1  christos    is the size of the buffer containing INSN.  */
    136      1.1  christos 
    137      1.1  christos extern int gdb_buffered_insn_length (struct gdbarch *gdbarch,
    138      1.1  christos 				     const gdb_byte *insn, int max_len,
    139      1.1  christos 				     CORE_ADDR memaddr);
    140      1.1  christos 
    141  1.1.1.4  christos /* Returns GDBARCH's disassembler options.  */
    142  1.1.1.4  christos 
    143  1.1.1.4  christos extern char *get_disassembler_options (struct gdbarch *gdbarch);
    144  1.1.1.4  christos 
    145  1.1.1.4  christos /* Sets the active gdbarch's disassembler options to OPTIONS.  */
    146  1.1.1.4  christos 
    147  1.1.1.4  christos extern void set_disassembler_options (char *options);
    148  1.1.1.4  christos 
    149      1.1  christos #endif
    150