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