Blame include/dis-asm.h

Packit bbfece
/* Interface between the opcode library and its callers.
Packit bbfece
Packit bbfece
   Copyright (C) 1999-2018 Free Software Foundation, Inc.
Packit bbfece
Packit bbfece
   This program is free software; you can redistribute it and/or modify
Packit bbfece
   it under the terms of the GNU General Public License as published by
Packit bbfece
   the Free Software Foundation; either version 3, or (at your option)
Packit bbfece
   any later version.
Packit bbfece
Packit bbfece
   This program is distributed in the hope that it will be useful,
Packit bbfece
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit bbfece
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit bbfece
   GNU General Public License for more details.
Packit bbfece
Packit bbfece
   You should have received a copy of the GNU General Public License
Packit bbfece
   along with this program; if not, write to the Free Software
Packit bbfece
   Foundation, Inc., 51 Franklin Street - Fifth Floor,
Packit bbfece
   Boston, MA 02110-1301, USA.
Packit bbfece
Packit bbfece
   Written by Cygnus Support, 1993.
Packit bbfece
Packit bbfece
   The opcode library (libopcodes.a) provides instruction decoders for
Packit bbfece
   a large variety of instruction sets, callable with an identical
Packit bbfece
   interface, for making instruction-processing programs more independent
Packit bbfece
   of the instruction set being processed.  */
Packit bbfece
Packit bbfece
#ifndef DIS_ASM_H
Packit bbfece
#define DIS_ASM_H
Packit bbfece
Packit bbfece
#ifdef __cplusplus
Packit bbfece
extern "C" {
Packit bbfece
#endif
Packit bbfece
Packit bbfece
#include <stdio.h>
Packit bbfece
#include "bfd.h"
Packit bbfece
Packit bbfece
  typedef int (*fprintf_ftype) (void *, const char*, ...) ATTRIBUTE_FPTR_PRINTF_2;
Packit bbfece
Packit bbfece
enum dis_insn_type
Packit bbfece
{
Packit bbfece
  dis_noninsn,			/* Not a valid instruction.  */
Packit bbfece
  dis_nonbranch,		/* Not a branch instruction.  */
Packit bbfece
  dis_branch,			/* Unconditional branch.  */
Packit bbfece
  dis_condbranch,		/* Conditional branch.  */
Packit bbfece
  dis_jsr,			/* Jump to subroutine.  */
Packit bbfece
  dis_condjsr,			/* Conditional jump to subroutine.  */
Packit bbfece
  dis_dref,			/* Data reference instruction.  */
Packit bbfece
  dis_dref2			/* Two data references in instruction.  */
Packit bbfece
};
Packit bbfece
Packit bbfece
/* This struct is passed into the instruction decoding routine,
Packit bbfece
   and is passed back out into each callback.  The various fields are used
Packit bbfece
   for conveying information from your main routine into your callbacks,
Packit bbfece
   for passing information into the instruction decoders (such as the
Packit bbfece
   addresses of the callback functions), or for passing information
Packit bbfece
   back from the instruction decoders to their callers.
Packit bbfece
Packit bbfece
   It must be initialized before it is first passed; this can be done
Packit bbfece
   by hand, or using one of the initialization macros below.  */
Packit bbfece
Packit bbfece
typedef struct disassemble_info
Packit bbfece
{
Packit bbfece
  fprintf_ftype fprintf_func;
Packit bbfece
  void *stream;
Packit bbfece
  void *application_data;
Packit bbfece
Packit bbfece
  /* Target description.  We could replace this with a pointer to the bfd,
Packit bbfece
     but that would require one.  There currently isn't any such requirement
Packit bbfece
     so to avoid introducing one we record these explicitly.  */
Packit bbfece
  /* The bfd_flavour.  This can be bfd_target_unknown_flavour.  */
Packit bbfece
  enum bfd_flavour flavour;
Packit bbfece
  /* The bfd_arch value.  */
Packit bbfece
  enum bfd_architecture arch;
Packit bbfece
  /* The bfd_mach value.  */
Packit bbfece
  unsigned long mach;
Packit bbfece
  /* Endianness (for bi-endian cpus).  Mono-endian cpus can ignore this.  */
Packit bbfece
  enum bfd_endian endian;
Packit bbfece
  /* Endianness of code, for mixed-endian situations such as ARM BE8.  */
Packit bbfece
  enum bfd_endian endian_code;
Packit bbfece
  /* An arch/mach-specific bitmask of selected instruction subsets, mainly
Packit bbfece
     for processors with run-time-switchable instruction sets.  The default,
Packit bbfece
     zero, means that there is no constraint.  CGEN-based opcodes ports
Packit bbfece
     may use ISA_foo masks.  */
Packit bbfece
  void *insn_sets;
Packit bbfece
Packit bbfece
  /* Some targets need information about the current section to accurately
Packit bbfece
     display insns.  If this is NULL, the target disassembler function
Packit bbfece
     will have to make its best guess.  */
Packit bbfece
  asection *section;
Packit bbfece
Packit bbfece
  /* An array of pointers to symbols either at the location being disassembled
Packit bbfece
     or at the start of the function being disassembled.  The array is sorted
Packit bbfece
     so that the first symbol is intended to be the one used.  The others are
Packit bbfece
     present for any misc. purposes.  This is not set reliably, but if it is
Packit bbfece
     not NULL, it is correct.  */
Packit bbfece
  asymbol **symbols;
Packit bbfece
  /* Number of symbols in array.  */
Packit bbfece
  int num_symbols;
Packit bbfece
Packit bbfece
  /* Symbol table provided for targets that want to look at it.  This is
Packit bbfece
     used on Arm to find mapping symbols and determine Arm/Thumb code.  */
Packit bbfece
  asymbol **symtab;
Packit bbfece
  int symtab_pos;
Packit bbfece
  int symtab_size;
Packit bbfece
Packit bbfece
  /* For use by the disassembler.
Packit bbfece
     The top 16 bits are reserved for public use (and are documented here).
Packit bbfece
     The bottom 16 bits are for the internal use of the disassembler.  */
Packit bbfece
  unsigned long flags;
Packit bbfece
  /* Set if the disassembler has determined that there are one or more
Packit bbfece
     relocations associated with the instruction being disassembled.  */
Packit bbfece
#define INSN_HAS_RELOC	 (1 << 31)
Packit bbfece
  /* Set if the user has requested the disassembly of data as well as code.  */
Packit bbfece
#define DISASSEMBLE_DATA (1 << 30)
Packit bbfece
  /* Set if the user has specifically set the machine type encoded in the
Packit bbfece
     mach field of this structure.  */
Packit bbfece
#define USER_SPECIFIED_MACHINE_TYPE (1 << 29)
Packit bbfece
Packit bbfece
  /* Use internally by the target specific disassembly code.  */
Packit bbfece
  void *private_data;
Packit bbfece
Packit bbfece
  /* Function used to get bytes to disassemble.  MEMADDR is the
Packit bbfece
     address of the stuff to be disassembled, MYADDR is the address to
Packit bbfece
     put the bytes in, and LENGTH is the number of bytes to read.
Packit bbfece
     INFO is a pointer to this struct.
Packit bbfece
     Returns an errno value or 0 for success.  */
Packit bbfece
  int (*read_memory_func)
Packit bbfece
    (bfd_vma memaddr, bfd_byte *myaddr, unsigned int length,
Packit bbfece
     struct disassemble_info *dinfo);
Packit bbfece
Packit bbfece
  /* Function which should be called if we get an error that we can't
Packit bbfece
     recover from.  STATUS is the errno value from read_memory_func and
Packit bbfece
     MEMADDR is the address that we were trying to read.  INFO is a
Packit bbfece
     pointer to this struct.  */
Packit bbfece
  void (*memory_error_func)
Packit bbfece
    (int status, bfd_vma memaddr, struct disassemble_info *dinfo);
Packit bbfece
Packit bbfece
  /* Function called to print ADDR.  */
Packit bbfece
  void (*print_address_func)
Packit bbfece
    (bfd_vma addr, struct disassemble_info *dinfo);
Packit bbfece
Packit bbfece
  /* Function called to determine if there is a symbol at the given ADDR.
Packit bbfece
     If there is, the function returns 1, otherwise it returns 0.
Packit bbfece
     This is used by ports which support an overlay manager where
Packit bbfece
     the overlay number is held in the top part of an address.  In
Packit bbfece
     some circumstances we want to include the overlay number in the
Packit bbfece
     address, (normally because there is a symbol associated with
Packit bbfece
     that address), but sometimes we want to mask out the overlay bits.  */
Packit bbfece
  int (* symbol_at_address_func)
Packit bbfece
    (bfd_vma addr, struct disassemble_info *dinfo);
Packit bbfece
Packit bbfece
  /* Function called to check if a SYMBOL is can be displayed to the user.
Packit bbfece
     This is used by some ports that want to hide special symbols when
Packit bbfece
     displaying debugging outout.  */
Packit bbfece
  bfd_boolean (* symbol_is_valid)
Packit bbfece
    (asymbol *, struct disassemble_info *dinfo);
Packit bbfece
Packit bbfece
  /* These are for buffer_read_memory.  */
Packit bbfece
  bfd_byte *buffer;
Packit bbfece
  bfd_vma buffer_vma;
Packit bbfece
  size_t buffer_length;
Packit bbfece
Packit bbfece
  /* This variable may be set by the instruction decoder.  It suggests
Packit bbfece
      the number of bytes objdump should display on a single line.  If
Packit bbfece
      the instruction decoder sets this, it should always set it to
Packit bbfece
      the same value in order to get reasonable looking output.  */
Packit bbfece
  int bytes_per_line;
Packit bbfece
Packit bbfece
  /* The next two variables control the way objdump displays the raw data.  */
Packit bbfece
  /* For example, if bytes_per_line is 8 and bytes_per_chunk is 4, the */
Packit bbfece
  /* output will look like this:
Packit bbfece
     00:   00000000 00000000
Packit bbfece
     with the chunks displayed according to "display_endian". */
Packit bbfece
  int bytes_per_chunk;
Packit bbfece
  enum bfd_endian display_endian;
Packit bbfece
Packit bbfece
  /* Number of octets per incremented target address
Packit bbfece
     Normally one, but some DSPs have byte sizes of 16 or 32 bits.  */
Packit bbfece
  unsigned int octets_per_byte;
Packit bbfece
Packit bbfece
  /* The number of zeroes we want to see at the end of a section before we
Packit bbfece
     start skipping them.  */
Packit bbfece
  unsigned int skip_zeroes;
Packit bbfece
Packit bbfece
  /* The number of zeroes to skip at the end of a section.  If the number
Packit bbfece
     of zeroes at the end is between SKIP_ZEROES_AT_END and SKIP_ZEROES,
Packit bbfece
     they will be disassembled.  If there are fewer than
Packit bbfece
     SKIP_ZEROES_AT_END, they will be skipped.  This is a heuristic
Packit bbfece
     attempt to avoid disassembling zeroes inserted by section
Packit bbfece
     alignment.  */
Packit bbfece
  unsigned int skip_zeroes_at_end;
Packit bbfece
Packit bbfece
  /* Whether the disassembler always needs the relocations.  */
Packit bbfece
  bfd_boolean disassembler_needs_relocs;
Packit bbfece
Packit bbfece
  /* Results from instruction decoders.  Not all decoders yet support
Packit bbfece
     this information.  This info is set each time an instruction is
Packit bbfece
     decoded, and is only valid for the last such instruction.
Packit bbfece
Packit bbfece
     To determine whether this decoder supports this information, set
Packit bbfece
     insn_info_valid to 0, decode an instruction, then check it.  */
Packit bbfece
Packit bbfece
  char insn_info_valid;		/* Branch info has been set. */
Packit bbfece
  char branch_delay_insns;	/* How many sequential insn's will run before
Packit bbfece
				   a branch takes effect.  (0 = normal) */
Packit bbfece
  char data_size;		/* Size of data reference in insn, in bytes */
Packit bbfece
  enum dis_insn_type insn_type;	/* Type of instruction */
Packit bbfece
  bfd_vma target;		/* Target address of branch or dref, if known;
Packit bbfece
				   zero if unknown.  */
Packit bbfece
  bfd_vma target2;		/* Second target address for dref2 */
Packit bbfece
Packit bbfece
  /* Command line options specific to the target disassembler.  */
Packit bbfece
  const char *disassembler_options;
Packit bbfece
Packit bbfece
  /* If non-zero then try not disassemble beyond this address, even if
Packit bbfece
     there are values left in the buffer.  This address is the address
Packit bbfece
     of the nearest symbol forwards from the start of the disassembly,
Packit bbfece
     and it is assumed that it lies on the boundary between instructions.
Packit bbfece
     If an instruction spans this address then this is an error in the
Packit bbfece
     file being disassembled.  */
Packit bbfece
  bfd_vma stop_vma;
Packit bbfece
Packit bbfece
} disassemble_info;
Packit bbfece
Packit bbfece
/* This struct is used to pass information about valid disassembler options
Packit bbfece
   and their descriptions from the target to the generic GDB functions that
Packit bbfece
   set and display them.  */
Packit bbfece
Packit bbfece
typedef struct
Packit bbfece
{
Packit bbfece
  const char **name;
Packit bbfece
  const char **description;
Packit bbfece
} disasm_options_t;
Packit bbfece
Packit bbfece

Packit bbfece
/* Standard disassemblers.  Disassemble one instruction at the given
Packit bbfece
   target address.  Return number of octets processed.  */
Packit bbfece
typedef int (*disassembler_ftype) (bfd_vma, disassemble_info *);
Packit bbfece
Packit bbfece
/* Disassemblers used out side of opcodes library.  */
Packit bbfece
extern int print_insn_m32c		(bfd_vma, disassemble_info *);
Packit bbfece
extern int print_insn_mep		(bfd_vma, disassemble_info *);
Packit bbfece
extern int print_insn_sh		(bfd_vma, disassemble_info *);
Packit bbfece
extern int print_insn_sh64x_media	(bfd_vma, disassemble_info *);
Packit bbfece
extern int print_insn_sparc		(bfd_vma, disassemble_info *);
Packit bbfece
extern int print_insn_rx		(bfd_vma, disassemble_info *);
Packit bbfece
extern int print_insn_rl78		(bfd_vma, disassemble_info *);
Packit bbfece
extern int print_insn_rl78_g10		(bfd_vma, disassemble_info *);
Packit bbfece
extern int print_insn_rl78_g13		(bfd_vma, disassemble_info *);
Packit bbfece
extern int print_insn_rl78_g14		(bfd_vma, disassemble_info *);
Packit bbfece
Packit bbfece
extern disassembler_ftype arc_get_disassembler (bfd *);
Packit bbfece
extern disassembler_ftype cris_get_disassembler (bfd *);
Packit bbfece
Packit bbfece
extern void print_aarch64_disassembler_options (FILE *);
Packit bbfece
extern void print_i386_disassembler_options (FILE *);
Packit bbfece
extern void print_mips_disassembler_options (FILE *);
Packit bbfece
extern void print_nfp_disassembler_options (FILE *);
Packit bbfece
extern void print_ppc_disassembler_options (FILE *);
Packit bbfece
extern void print_riscv_disassembler_options (FILE *);
Packit bbfece
extern void print_arm_disassembler_options (FILE *);
Packit bbfece
extern void print_arc_disassembler_options (FILE *);
Packit bbfece
extern void print_s390_disassembler_options (FILE *);
Packit bbfece
extern void print_wasm32_disassembler_options (FILE *);
Packit bbfece
extern bfd_boolean aarch64_symbol_is_valid (asymbol *, struct disassemble_info *);
Packit bbfece
extern bfd_boolean arm_symbol_is_valid (asymbol *, struct disassemble_info *);
Packit bbfece
extern void disassemble_init_powerpc (struct disassemble_info *);
Packit bbfece
extern void disassemble_init_s390 (struct disassemble_info *);
Packit bbfece
extern void disassemble_init_wasm32 (struct disassemble_info *);
Packit bbfece
extern const disasm_options_t *disassembler_options_powerpc (void);
Packit bbfece
extern const disasm_options_t *disassembler_options_arm (void);
Packit bbfece
extern const disasm_options_t *disassembler_options_s390 (void);
Packit bbfece
Packit bbfece
/* Fetch the disassembler for a given architecture ARC, endianess (big
Packit bbfece
   endian if BIG is true), bfd_mach value MACH, and ABFD, if that support
Packit bbfece
   is available.  ABFD may be NULL.  */
Packit bbfece
extern disassembler_ftype disassembler (enum bfd_architecture arc,
Packit bbfece
					bfd_boolean big, unsigned long mach,
Packit bbfece
					bfd *abfd);
Packit bbfece
Packit bbfece
/* Amend the disassemble_info structure as necessary for the target architecture.
Packit bbfece
   Should only be called after initialising the info->arch field.  */
Packit bbfece
extern void disassemble_init_for_target (struct disassemble_info * dinfo);
Packit bbfece
Packit bbfece
/* Document any target specific options available from the disassembler.  */
Packit bbfece
extern void disassembler_usage (FILE *);
Packit bbfece
Packit bbfece
/* Remove whitespace and consecutive commas.  */
Packit bbfece
extern char *remove_whitespace_and_extra_commas (char *);
Packit bbfece
Packit bbfece
/* Like STRCMP, but treat ',' the same as '\0' so that we match
Packit bbfece
   strings like "foobar" against "foobar,xxyyzz,...".  */
Packit bbfece
extern int disassembler_options_cmp (const char *, const char *);
Packit bbfece
Packit bbfece
/* A helper function for FOR_EACH_DISASSEMBLER_OPTION.  */
Packit bbfece
static inline const char *
Packit bbfece
next_disassembler_option (const char *options)
Packit bbfece
{
Packit bbfece
  const char *opt = strchr (options, ',');
Packit bbfece
  if (opt != NULL)
Packit bbfece
    opt++;
Packit bbfece
  return opt;
Packit bbfece
}
Packit bbfece
Packit bbfece
/* A macro for iterating over each comma separated option in OPTIONS.  */
Packit bbfece
#define FOR_EACH_DISASSEMBLER_OPTION(OPT, OPTIONS) \
Packit bbfece
  for ((OPT) = (OPTIONS); \
Packit bbfece
       (OPT) != NULL; \
Packit bbfece
       (OPT) = next_disassembler_option (OPT))
Packit bbfece
Packit bbfece

Packit bbfece
/* This block of definitions is for particular callers who read instructions
Packit bbfece
   into a buffer before calling the instruction decoder.  */
Packit bbfece
Packit bbfece
/* Here is a function which callers may wish to use for read_memory_func.
Packit bbfece
   It gets bytes from a buffer.  */
Packit bbfece
extern int buffer_read_memory
Packit bbfece
  (bfd_vma, bfd_byte *, unsigned int, struct disassemble_info *);
Packit bbfece
Packit bbfece
/* This function goes with buffer_read_memory.
Packit bbfece
   It prints a message using info->fprintf_func and info->stream.  */
Packit bbfece
extern void perror_memory (int, bfd_vma, struct disassemble_info *);
Packit bbfece
Packit bbfece
Packit bbfece
/* Just print the address in hex.  This is included for completeness even
Packit bbfece
   though both GDB and objdump provide their own (to print symbolic
Packit bbfece
   addresses).  */
Packit bbfece
extern void generic_print_address
Packit bbfece
  (bfd_vma, struct disassemble_info *);
Packit bbfece
Packit bbfece
/* Always true.  */
Packit bbfece
extern int generic_symbol_at_address
Packit bbfece
  (bfd_vma, struct disassemble_info *);
Packit bbfece
Packit bbfece
/* Also always true.  */
Packit bbfece
extern bfd_boolean generic_symbol_is_valid
Packit bbfece
  (asymbol *, struct disassemble_info *);
Packit bbfece
Packit bbfece
/* Method to initialize a disassemble_info struct.  This should be
Packit bbfece
   called by all applications creating such a struct.  */
Packit bbfece
extern void init_disassemble_info (struct disassemble_info *dinfo, void *stream,
Packit bbfece
				   fprintf_ftype fprintf_func);
Packit bbfece
Packit bbfece
/* For compatibility with existing code.  */
Packit bbfece
#define INIT_DISASSEMBLE_INFO(INFO, STREAM, FPRINTF_FUNC) \
Packit bbfece
  init_disassemble_info (&(INFO), (STREAM), (fprintf_ftype) (FPRINTF_FUNC))
Packit bbfece
#define INIT_DISASSEMBLE_INFO_NO_ARCH(INFO, STREAM, FPRINTF_FUNC) \
Packit bbfece
  init_disassemble_info (&(INFO), (STREAM), (fprintf_ftype) (FPRINTF_FUNC))
Packit bbfece
Packit bbfece
Packit bbfece
#ifdef __cplusplus
Packit bbfece
}
Packit bbfece
#endif
Packit bbfece
Packit bbfece
#endif /* ! defined (DIS_ASM_H) */