Home | History | Annotate | Line # | Download | only in gdb
disasm.h revision 1.1.1.5
      1      1.1  christos /* Disassemble support for GDB.
      2  1.1.1.5  christos    Copyright (C) 2002-2019 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.5  christos #include "common/enum-flags.h"
     24  1.1.1.2  christos 
     25  1.1.1.5  christos enum gdb_disassembly_flag
     26  1.1.1.5  christos   {
     27  1.1.1.5  christos     DISASSEMBLY_SOURCE_DEPRECATED = (0x1 << 0),
     28  1.1.1.5  christos     DISASSEMBLY_RAW_INSN = (0x1 << 1),
     29  1.1.1.5  christos     DISASSEMBLY_OMIT_FNAME = (0x1 << 2),
     30  1.1.1.5  christos     DISASSEMBLY_FILENAME = (0x1 << 3),
     31  1.1.1.5  christos     DISASSEMBLY_OMIT_PC = (0x1 << 4),
     32  1.1.1.5  christos     DISASSEMBLY_SOURCE = (0x1 << 5),
     33  1.1.1.5  christos     DISASSEMBLY_SPECULATIVE = (0x1 << 6),
     34  1.1.1.5  christos   };
     35  1.1.1.5  christos DEF_ENUM_FLAGS_TYPE (enum gdb_disassembly_flag, gdb_disassembly_flags);
     36      1.1  christos 
     37  1.1.1.2  christos struct gdbarch;
     38      1.1  christos struct ui_out;
     39      1.1  christos struct ui_file;
     40      1.1  christos 
     41  1.1.1.4  christos class gdb_disassembler
     42  1.1.1.4  christos {
     43  1.1.1.4  christos   using di_read_memory_ftype = decltype (disassemble_info::read_memory_func);
     44  1.1.1.4  christos 
     45  1.1.1.4  christos public:
     46  1.1.1.4  christos   gdb_disassembler (struct gdbarch *gdbarch, struct ui_file *file)
     47  1.1.1.4  christos     : gdb_disassembler (gdbarch, file, dis_asm_read_memory)
     48  1.1.1.4  christos   {}
     49  1.1.1.4  christos 
     50  1.1.1.4  christos   int print_insn (CORE_ADDR memaddr, int *branch_delay_insns = NULL);
     51  1.1.1.4  christos 
     52  1.1.1.4  christos   /* Return the gdbarch of gdb_disassembler.  */
     53  1.1.1.4  christos   struct gdbarch *arch ()
     54  1.1.1.4  christos   { return m_gdbarch; }
     55  1.1.1.4  christos 
     56  1.1.1.4  christos protected:
     57  1.1.1.4  christos   gdb_disassembler (struct gdbarch *gdbarch, struct ui_file *file,
     58  1.1.1.4  christos 		    di_read_memory_ftype func);
     59  1.1.1.4  christos 
     60  1.1.1.4  christos   struct ui_file *stream ()
     61  1.1.1.4  christos   { return (struct ui_file *) m_di.stream; }
     62  1.1.1.4  christos 
     63  1.1.1.4  christos private:
     64  1.1.1.4  christos   struct gdbarch *m_gdbarch;
     65  1.1.1.4  christos 
     66  1.1.1.4  christos   /* Stores data required for disassembling instructions in
     67  1.1.1.4  christos      opcodes.  */
     68  1.1.1.4  christos   struct disassemble_info m_di;
     69  1.1.1.5  christos 
     70  1.1.1.5  christos   /* If we own the string in `m_di.disassembler_options', we do so
     71  1.1.1.5  christos      using this field.  */
     72  1.1.1.5  christos   std::string m_disassembler_options_holder;
     73  1.1.1.5  christos 
     74  1.1.1.4  christos   CORE_ADDR m_err_memaddr;
     75  1.1.1.4  christos 
     76  1.1.1.4  christos   static int dis_asm_read_memory (bfd_vma memaddr, gdb_byte *myaddr,
     77  1.1.1.4  christos 				  unsigned int len,
     78  1.1.1.4  christos 				  struct disassemble_info *info);
     79  1.1.1.4  christos   static void dis_asm_memory_error (int err, bfd_vma memaddr,
     80  1.1.1.4  christos 				    struct disassemble_info *info);
     81  1.1.1.4  christos   static void dis_asm_print_address (bfd_vma addr,
     82  1.1.1.4  christos 				     struct disassemble_info *info);
     83  1.1.1.4  christos };
     84  1.1.1.4  christos 
     85  1.1.1.3  christos /* An instruction to be disassembled.  */
     86  1.1.1.3  christos 
     87  1.1.1.3  christos struct disasm_insn
     88  1.1.1.3  christos {
     89  1.1.1.3  christos   /* The address of the memory containing the instruction.  */
     90  1.1.1.3  christos   CORE_ADDR addr;
     91  1.1.1.3  christos 
     92  1.1.1.3  christos   /* An optional instruction number.  If non-zero, it is printed first.  */
     93  1.1.1.3  christos   unsigned int number;
     94  1.1.1.3  christos 
     95  1.1.1.3  christos   /* True if the instruction was executed speculatively.  */
     96  1.1.1.3  christos   unsigned int is_speculative:1;
     97  1.1.1.3  christos };
     98  1.1.1.3  christos 
     99      1.1  christos extern void gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout,
    100  1.1.1.5  christos 			     gdb_disassembly_flags flags, int how_many,
    101      1.1  christos 			     CORE_ADDR low, CORE_ADDR high);
    102      1.1  christos 
    103      1.1  christos /* Print the instruction at address MEMADDR in debugged memory,
    104      1.1  christos    on STREAM.  Returns the length of the instruction, in bytes,
    105      1.1  christos    and, if requested, the number of branch delay slot instructions.  */
    106      1.1  christos 
    107      1.1  christos extern int gdb_print_insn (struct gdbarch *gdbarch, CORE_ADDR memaddr,
    108      1.1  christos 			   struct ui_file *stream, int *branch_delay_insns);
    109      1.1  christos 
    110  1.1.1.4  christos /* Class used to pretty-print instructions.  */
    111  1.1.1.4  christos 
    112  1.1.1.4  christos class gdb_pretty_print_disassembler
    113  1.1.1.4  christos {
    114  1.1.1.4  christos public:
    115  1.1.1.4  christos   explicit gdb_pretty_print_disassembler (struct gdbarch *gdbarch)
    116  1.1.1.4  christos     : m_di (gdbarch, &m_insn_stb)
    117  1.1.1.4  christos   {}
    118  1.1.1.4  christos 
    119  1.1.1.4  christos   /* Prints the instruction INSN into UIOUT and returns the length of
    120  1.1.1.4  christos      the printed instruction in bytes.  */
    121  1.1.1.4  christos   int pretty_print_insn (struct ui_out *uiout, const struct disasm_insn *insn,
    122  1.1.1.5  christos 			 gdb_disassembly_flags flags);
    123  1.1.1.4  christos 
    124  1.1.1.4  christos private:
    125  1.1.1.4  christos   /* Returns the architecture used for disassembling.  */
    126  1.1.1.4  christos   struct gdbarch *arch () { return m_di.arch (); }
    127  1.1.1.4  christos 
    128  1.1.1.4  christos   /* The disassembler used for instruction printing.  */
    129  1.1.1.4  christos   gdb_disassembler m_di;
    130  1.1.1.4  christos 
    131  1.1.1.4  christos   /* The buffer used to build the instruction string.  The
    132  1.1.1.4  christos      disassembler is initialized with this stream.  */
    133  1.1.1.4  christos   string_file m_insn_stb;
    134  1.1.1.4  christos 
    135  1.1.1.4  christos   /* The buffer used to build the raw opcodes string.  */
    136  1.1.1.4  christos   string_file m_opcode_stb;
    137  1.1.1.4  christos };
    138  1.1.1.4  christos 
    139      1.1  christos /* Return the length in bytes of the instruction at address MEMADDR in
    140      1.1  christos    debugged memory.  */
    141      1.1  christos 
    142      1.1  christos extern int gdb_insn_length (struct gdbarch *gdbarch, CORE_ADDR memaddr);
    143      1.1  christos 
    144      1.1  christos /* Return the length in bytes of INSN, originally at MEMADDR.  MAX_LEN
    145      1.1  christos    is the size of the buffer containing INSN.  */
    146      1.1  christos 
    147      1.1  christos extern int gdb_buffered_insn_length (struct gdbarch *gdbarch,
    148      1.1  christos 				     const gdb_byte *insn, int max_len,
    149      1.1  christos 				     CORE_ADDR memaddr);
    150      1.1  christos 
    151  1.1.1.4  christos /* Returns GDBARCH's disassembler options.  */
    152  1.1.1.4  christos 
    153  1.1.1.4  christos extern char *get_disassembler_options (struct gdbarch *gdbarch);
    154  1.1.1.4  christos 
    155  1.1.1.4  christos /* Sets the active gdbarch's disassembler options to OPTIONS.  */
    156  1.1.1.4  christos 
    157  1.1.1.4  christos extern void set_disassembler_options (char *options);
    158  1.1.1.4  christos 
    159      1.1  christos #endif
    160