From: John Gilmore Date: Sat, 31 Jul 1993 01:40:26 +0000 (+0000) Subject: * dis-asm.h: Add new fields insn_info_valid, branch_delay_insns, X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=308a5981e09d48a71713ab03547a023d22f7baf4;p=binutils-gdb.git * dis-asm.h: Add new fields insn_info_valid, branch_delay_insns, data_size, insn_type, target, target2. These are used to return information from the instruction decoders back to the calling program. Add comments, make more readable. --- diff --git a/include/ChangeLog b/include/ChangeLog index 9a33333df69..a49556a0dd2 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,14 @@ +Fri Jul 30 18:38:02 1993 John Gilmore (gnu@cygnus.com) + + * dis-asm.h: Add new fields insn_info_valid, branch_delay_insns, + data_size, insn_type, target, target2. These are used to return + information from the instruction decoders back to the calling + program. Add comments, make more readable. + +Mon Jul 19 22:14:14 1993 Fred Fish (fnf@deneb.cygnus.com) + + * nlm: New directory containing NLM/NetWare includes. + Thu Jul 15 12:10:04 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) * dis-asm.h (struct disassemble_info): New field application_data. diff --git a/include/dis-asm.h b/include/dis-asm.h index 50c13c0516d..b04bf251a7a 100644 --- a/include/dis-asm.h +++ b/include/dis-asm.h @@ -1,11 +1,31 @@ +/* Interface between the opcode library and its callers. + Written by Cygnus Support, 1993. + + The opcode library (libopcodes.a) provides instruction decoders for + a large variety of instruction sets, callable with an identical + interface, for making instruction-processing programs more independent + of the instruction set being processed. */ + #include #include "bfd.h" typedef int (*fprintf_ftype) PARAMS((FILE*, const char*, ...)); + +/* This struct is passed into the instruction decoding routine, + and is passed back out into each callback. The various fields are used + for conveying information from your main routine into your callbacks, + for passing information into the instruction decoders (such as the + addresses of the callback functions), or for passing information + back from the instruction decoders to their callers. + + It must be initialized before it is first passed; this can be done + by hand, or using one of the initialization macros below. */ + typedef struct disassemble_info { fprintf_ftype fprintf_func; FILE *stream; + PTR application_data; /* For use by the disassembler. */ int flags; @@ -35,8 +55,71 @@ typedef struct disassemble_info { bfd_byte *buffer; bfd_vma buffer_vma; int buffer_length; + + /* Results from instruction decoders. Not all decoders yet support + this information. This info is set each time an instruction is + decoded, and is only valid for the last such instruction. + + To determine whether this decoder supports this information, set + insn_info_valid to 0, decode an instruction, then check it. */ + + enum dis_insn_type { + dis_noninsn, /* Not a valid instruction */ + dis_nonbranch, /* Not a branch instruction */ + dis_branch, /* Unconditional branch */ + dis_condbranch, /* Conditional branch */ + dis_jsr, /* Jump to subroutine */ + dis_condjsr, /* Conditional jump to subroutine */ + dis_dref, /* Data reference instruction */ + dis_dref2, /* Two data references in instruction */ + }; + char insn_info_valid; /* Branch info has been set. */ + char branch_delay_insns; /* How many sequential insn's will run before + a branch takes effect. (0 = normal) */ + char data_size; /* Size of data reference in insn, in bytes */ + enum dis_insn_type insn_type; /* Type of instruction */ + bfd_vma target; /* Target address of branch or dref, if known; + zero if unknown. */ + bfd_vma target2; /* Second target address for dref2 */ + } disassemble_info; + + + + + +/* Standard disassemblers. Disassemble one instruction at the given + target address. Return number of bytes processed. */ +typedef int (*disassembler_ftype) + PARAMS((bfd_vma, disassemble_info *)); + +extern int print_insn_big_mips PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_little_mips PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_i386 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_m68k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_z8001 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_z8002 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_h8300 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_h8300h PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_h8500 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_alpha PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_sparc PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_big_a29k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_little_a29k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_i960 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_sh PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_hppa PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_m88k PARAMS ((bfd_vma, disassemble_info*)); + + + + + + +/* This block of definitions is for particular callers who read instructions + into a buffer before calling the instruction decoder. */ + /* Here is a function which callers may wish to use for read_memory_func. It gets bytes from a buffer. */ extern int buffer_read_memory @@ -46,6 +129,7 @@ extern int buffer_read_memory It prints a message using info->fprintf_func and info->stream. */ extern void perror_memory PARAMS ((int, bfd_vma, struct disassemble_info *)); + /* Just print the address is hex. This is included for completeness even though both GDB and objdump provide their own (to print symbolic addresses). */ @@ -60,7 +144,14 @@ extern void generic_print_address (INFO).buffer_length = 0, \ (INFO).read_memory_func = buffer_read_memory, \ (INFO).memory_error_func = perror_memory, \ - (INFO).print_address_func = generic_print_address + (INFO).print_address_func = generic_print_address, \ + (INFO).insn_info_valid = 0 + + + + +/* This block of definitions is for calling the instruction decoders + from GDB. */ /* GDB--Like target_read_memory, but slightly different parameters. */ extern int @@ -81,27 +172,5 @@ dis_asm_print_address PARAMS ((bfd_vma addr, disassemble_info *info)); (INFO).stream = (STREAM), \ (INFO).read_memory_func = dis_asm_read_memory, \ (INFO).memory_error_func = dis_asm_memory_error, \ - (INFO).print_address_func = dis_asm_print_address - -/* Standard disassemblers. Disassemble one instruction at the given - target address. Return number of bytes processed. */ -typedef int (*disassembler_ftype) - PARAMS((bfd_vma, disassemble_info *)); - -extern int print_insn_big_mips PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_little_mips PARAMS ((bfd_vma,disassemble_info*)); -extern int print_insn_i386 PARAMS ((bfd_vma,disassemble_info*)); -extern int print_insn_m68k PARAMS ((bfd_vma,disassemble_info*)); -extern int print_insn_z8001 PARAMS ((bfd_vma,disassemble_info*)); -extern int print_insn_z8002 PARAMS ((bfd_vma,disassemble_info*)); -extern int print_insn_h8300 PARAMS ((bfd_vma,disassemble_info*)); -extern int print_insn_h8300h PARAMS ((bfd_vma,disassemble_info*)); -extern int print_insn_h8500 PARAMS ((bfd_vma,disassemble_info*)); -extern int print_insn_alpha PARAMS ((bfd_vma,disassemble_info*)); -extern int print_insn_sparc PARAMS ((bfd_vma,disassemble_info*)); -extern int print_insn_big_a29k PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_little_a29k PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_i960 PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_sh PARAMS ((bfd_vma,disassemble_info*)); -extern int print_insn_hppa PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_m88k PARAMS ((bfd_vma, disassemble_info*)); + (INFO).print_address_func = dis_asm_print_address, \ + (INFO).insn_info_valid = 0