Fri May 17 13:30:50 2002 J"orn Rennecke include: * dis-asm.h (print_insn_shl, print_insn_sh64l): Remove prototype. gdb: * sh-tdep.c (gdb_print_insn_sh64): Delete. (gdb_print_insn_sh): Just set info->endian and use print_insn_sh. (sh_gdbarch_init): Always use gdb_print_insn_sh. opcodes: * disassemble.c (disassembler): Just use print_insn_sh for bfd_arch_sh. * sh-dis.c (LITTLE_BIT): Delete. (print_insn_sh, print_insn_shl): Deleted. (print_insn_shx): Renamed to (print_insn_sh). No longer static. Handle SHmedia instructions. Use info->endian to determine endianness. * sh64-dis.c (print_insn_sh64, print_insn_sh64l): Delete. (print_insn_sh64x): No longer static. Renamed to (print_insn_sh64). Removed pfun_compact and endian arguments. If we got an uneven address to indicate SHmedia, adjust it. Return -2 for SHcompact instructions. sim/sh64: * sim-if.c (sh64_disassemble_insn): Use print_insn_sh instead of print_insn_shl. Index: include/dis-asm.h =================================================================== RCS file: /cvs/src/src/include/dis-asm.h,v retrieving revision 1.32 diff -p -r1.32 dis-asm.h *** include/dis-asm.h 8 Feb 2002 05:01:25 -0000 1.32 --- include/dis-asm.h 15 May 2002 18:38:50 -0000 *************** extern int print_insn_little_powerpc PAR *** 226,232 **** extern int print_insn_rs6000 PARAMS ((bfd_vma, disassemble_info*)); extern int print_insn_s390 PARAMS ((bfd_vma, disassemble_info*)); extern int print_insn_sh PARAMS ((bfd_vma, disassemble_info*)); - extern int print_insn_shl PARAMS ((bfd_vma, disassemble_info*)); extern int print_insn_tic30 PARAMS ((bfd_vma, disassemble_info*)); extern int print_insn_tic54x PARAMS ((bfd_vma, disassemble_info*)); extern int print_insn_tic80 PARAMS ((bfd_vma, disassemble_info*)); --- 226,231 ---- *************** extern int print_insn_vax PARAMS ((bfd_ *** 235,241 **** extern int print_insn_w65 PARAMS ((bfd_vma, disassemble_info*)); extern int print_insn_xstormy16 PARAMS ((bfd_vma, disassemble_info*)); extern int print_insn_sh64 PARAMS ((bfd_vma, disassemble_info *)); - extern int print_insn_sh64l PARAMS ((bfd_vma, disassemble_info *)); extern int print_insn_sh64x_media PARAMS ((bfd_vma, disassemble_info *)); extern disassembler_ftype arc_get_disassembler PARAMS ((void *)); --- 234,239 ---- Index: gdb/sh-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/sh-tdep.c,v retrieving revision 1.58 diff -p -r1.58 sh-tdep.c *** gdb/sh-tdep.c 10 May 2002 23:59:09 -0000 1.58 --- gdb/sh-tdep.c 17 May 2002 12:25:42 -0000 *************** sh_store_struct_return (CORE_ADDR addr, *** 906,934 **** static int gdb_print_insn_sh (bfd_vma memaddr, disassemble_info *info) { ! if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) ! return print_insn_sh (memaddr, info); ! else ! return print_insn_shl (memaddr, info); ! } ! ! /* Disassemble an instruction. */ ! static int ! gdb_print_insn_sh64 (bfd_vma memaddr, disassemble_info *info) ! { ! if (pc_is_isa32 (memaddr)) ! { ! /* Round down the instruction address to the appropriate boundary ! before disassembling it. */ ! return print_insn_sh64x_media (UNMAKE_ISA32_ADDR (memaddr), info); ! } ! else ! { ! if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) ! return print_insn_sh (memaddr, info); ! else ! return print_insn_shl (memaddr, info); ! } } /* Given a GDB frame, determine the address of the calling function's frame. --- 906,913 ---- static int gdb_print_insn_sh (bfd_vma memaddr, disassemble_info *info) { ! info->endian = TARGET_BYTE_ORDER; ! return print_insn_sh (memaddr, info); } /* Given a GDB frame, determine the address of the calling function's frame. *************** sh_gdbarch_init (struct gdbarch_info inf *** 4682,4688 **** sh_store_return_value = sh64_store_return_value; skip_prologue_hard_way = sh64_skip_prologue_hard_way; do_pseudo_register = sh64_do_pseudo_register; - set_gdbarch_print_insn (gdbarch, gdb_print_insn_sh64); set_gdbarch_register_raw_size (gdbarch, sh_sh64_register_raw_size); set_gdbarch_register_virtual_size (gdbarch, sh_sh64_register_raw_size); set_gdbarch_register_byte (gdbarch, sh_sh64_register_byte); --- 4661,4666 ---- Index: opcodes/disassemble.c =================================================================== RCS file: /cvs/src/src/opcodes/disassemble.c,v retrieving revision 1.32 diff -p -r1.32 disassemble.c *** opcodes/disassemble.c 8 Feb 2002 05:51:03 -0000 1.32 --- opcodes/disassemble.c 15 May 2002 18:39:01 -0000 *************** disassembler (abfd) *** 278,297 **** #endif #ifdef ARCH_sh case bfd_arch_sh: ! #ifdef INCLUDE_SHMEDIA ! if (bfd_get_mach (abfd) == bfd_mach_sh5) ! { ! if (bfd_big_endian (abfd)) ! disassemble = print_insn_sh64; ! else ! disassemble = print_insn_sh64l; ! break; ! } ! #endif ! if (bfd_big_endian (abfd)) ! disassemble = print_insn_sh; ! else ! disassemble = print_insn_shl; break; #endif #ifdef ARCH_sparc --- 278,284 ---- #endif #ifdef ARCH_sh case bfd_arch_sh: ! disassemble = print_insn_sh; break; #endif #ifdef ARCH_sparc Index: opcodes/sh-dis.c =================================================================== RCS file: /cvs/src/src/opcodes/sh-dis.c,v retrieving revision 1.10 diff -p -r1.10 sh-dis.c *** opcodes/sh-dis.c 8 Feb 2002 05:51:03 -0000 1.10 --- opcodes/sh-dis.c 15 May 2002 18:39:01 -0000 *************** Foundation, Inc., 59 Temple Place - Suit *** 24,37 **** #include "sh-opc.h" #include "dis-asm.h" - #define LITTLE_BIT 2 - static void print_movxy PARAMS ((sh_opcode_info *, int, int, fprintf_ftype, void *)); static void print_insn_ddt PARAMS ((int, struct disassemble_info *)); static void print_dsp_reg PARAMS ((int, fprintf_ftype, void *)); static void print_insn_ppi PARAMS ((int, struct disassemble_info *)); - static int print_insn_shx PARAMS ((bfd_vma, struct disassemble_info *)); static void print_movxy (op, rn, rm, fprintf_fn, stream) --- 24,34 ---- *************** print_insn_ppi (field_b, info) *** 286,293 **** fprintf_fn (stream, ".word 0x%x", field_b); } ! static int ! print_insn_shx (memaddr, info) bfd_vma memaddr; struct disassemble_info *info; { --- 283,290 ---- fprintf_fn (stream, ".word 0x%x", field_b); } ! int ! print_insn_sh (memaddr, info) bfd_vma memaddr; struct disassemble_info *info; { *************** print_insn_shx (memaddr, info) *** 324,329 **** --- 321,331 ---- target_arch = arch_sh4; break; case bfd_mach_sh5: + #ifdef INCLUDE_SHMEDIA + status = print_insn_sh64 (memaddr, info); + if (status != -2) + return status; + #endif /* When we get here for sh64, it's because we want to disassemble SHcompact, i.e. arch_sh4. */ target_arch = arch_sh4; *************** print_insn_shx (memaddr, info) *** 340,346 **** return -1; } ! if (info->flags & LITTLE_BIT) { nibs[0] = (insn[1] >> 4) & 0xf; nibs[1] = insn[1] & 0xf; --- 342,348 ---- return -1; } ! if (info->endian == BFD_ENDIAN_LITTLE) { nibs[0] = (insn[1] >> 4) & 0xf; nibs[1] = insn[1] & 0xf; *************** print_insn_shx (memaddr, info) *** 371,377 **** return -1; } ! if (info->flags & LITTLE_BIT) field_b = insn[1] << 8 | insn[0]; else field_b = insn[0] << 8 | insn[1]; --- 373,379 ---- return -1; } ! if (info->endian == BFD_ENDIAN_LITTLE) field_b = insn[1] << 8 | insn[0]; else field_b = insn[0] << 8 | insn[1]; *************** print_insn_shx (memaddr, info) *** 677,683 **** { info->flags |= 1; fprintf_fn (stream, "\t(slot "); ! print_insn_shx (memaddr + 2, info); info->flags &= ~1; fprintf_fn (stream, ")"); return 4; --- 679,685 ---- { info->flags |= 1; fprintf_fn (stream, "\t(slot "); ! print_insn_sh (memaddr + 2, info); info->flags &= ~1; fprintf_fn (stream, ")"); return 4; *************** print_insn_shx (memaddr, info) *** 700,713 **** if (size == 2) { ! if ((info->flags & LITTLE_BIT) != 0) val = bfd_getl16 (bytes); else val = bfd_getb16 (bytes); } else { ! if ((info->flags & LITTLE_BIT) != 0) val = bfd_getl32 (bytes); else val = bfd_getb32 (bytes); --- 702,715 ---- if (size == 2) { ! if (info->endian == BFD_ENDIAN_LITTLE) val = bfd_getl16 (bytes); else val = bfd_getb16 (bytes); } else { ! if (info->endian == BFD_ENDIAN_LITTLE) val = bfd_getl32 (bytes); else val = bfd_getb32 (bytes); *************** print_insn_shx (memaddr, info) *** 723,750 **** } fprintf_fn (stream, ".word 0x%x%x%x%x", nibs[0], nibs[1], nibs[2], nibs[3]); return 2; - } - - int - print_insn_shl (memaddr, info) - bfd_vma memaddr; - struct disassemble_info *info; - { - int r; - - info->flags = LITTLE_BIT; - r = print_insn_shx (memaddr, info); - return r; - } - - int - print_insn_sh (memaddr, info) - bfd_vma memaddr; - struct disassemble_info *info; - { - int r; - - info->flags = 0; - r = print_insn_shx (memaddr, info); - return r; } --- 725,728 ---- Index: opcodes/sh64-dis.c =================================================================== RCS file: /cvs/src/src/opcodes/sh64-dis.c,v retrieving revision 1.1 diff -p -r1.1 sh64-dis.c *** opcodes/sh64-dis.c 8 Feb 2002 05:51:03 -0000 1.1 --- opcodes/sh64-dis.c 15 May 2002 18:39:01 -0000 *************** static unsigned long *shmedia_opcode_mas *** 55,64 **** static void initialize_shmedia_opcode_mask_table PARAMS ((void)); static int print_insn_shmedia PARAMS ((bfd_vma, disassemble_info *)); - static int print_insn_sh64x - PARAMS ((bfd_vma, disassemble_info *, - int (*) PARAMS ((bfd_vma, struct disassemble_info *)), - enum bfd_endian)); static const char *creg_name PARAMS ((int)); static boolean init_sh64_disasm_info PARAMS ((struct disassemble_info *)); static enum sh64_elf_cr_type sh64_get_contents_type_disasm --- 55,60 ---- *************** print_insn_sh64x_media (memaddr, info) *** 555,569 **** return print_insn_shmedia (memaddr, info); } ! /* Main entry to disassemble SHcompact or SHmedia insns. */ ! static int ! print_insn_sh64x (memaddr, info, pfun_compact, endian) bfd_vma memaddr; struct disassemble_info *info; - int (*pfun_compact) PARAMS ((bfd_vma, struct disassemble_info *)); - enum bfd_endian endian; { enum sh64_elf_cr_type cr_type; if (info->private_data == NULL && ! init_sh64_disasm_info (info)) --- 551,565 ---- return print_insn_shmedia (memaddr, info); } ! /* Main entry to disassemble SHmedia insns. ! If we see an SHcompact instruction, return -2. */ ! int ! print_insn_sh64 (memaddr, info) bfd_vma memaddr; struct disassemble_info *info; { + enum bfd_endian endian = info->endian; enum sh64_elf_cr_type cr_type; if (info->private_data == NULL && ! init_sh64_disasm_info (info)) *************** print_insn_sh64x (memaddr, info, pfun_co *** 575,580 **** --- 571,580 ---- int length = 4 - (memaddr % 4); info->display_endian = endian; + /* If we got an uneven address to indicate SHmedia, adjust it. */ + if (cr_type == CRT_SH5_ISA32 && length == 3) + memaddr--, length = 4; + /* Only disassemble on four-byte boundaries. Addresses that are not a multiple of four can happen after a data region. */ if (cr_type == CRT_SH5_ISA32 && length == 4) *************** print_insn_sh64x (memaddr, info, pfun_co *** 633,659 **** } } ! return (*pfun_compact) (memaddr, info); ! } ! ! /* Main entry to disassemble SHcompact or SHmedia insns, big endian. */ ! ! int ! print_insn_sh64 (memaddr, info) ! bfd_vma memaddr; ! struct disassemble_info *info; ! { ! return ! print_insn_sh64x (memaddr, info, print_insn_sh, BFD_ENDIAN_BIG); ! } ! ! /* Main entry to disassemble SHcompact or SHmedia insns, little endian. */ ! ! int ! print_insn_sh64l (memaddr, info) ! bfd_vma memaddr; ! struct disassemble_info *info; ! { ! return ! print_insn_sh64x (memaddr, info, print_insn_shl, BFD_ENDIAN_LITTLE); } --- 633,638 ---- } } ! /* SH1 .. SH4 instruction, let caller handle it. */ ! return -2; } Index: sim/sh64/sim-if.c =================================================================== RCS file: /cvs/src/src/sim/sh64/sim-if.c,v retrieving revision 1.1 diff -p -r1.1 sim-if.c *** sim/sh64/sim-if.c 1 Feb 2002 11:44:27 -0000 1.1 --- sim/sh64/sim-if.c 15 May 2002 18:39:01 -0000 *************** sh64_disassemble_insn (SIM_CPU *cpu, con *** 232,246 **** if (sh64_h_ism_get (cpu) == ISM_MEDIA) print_insn_sh64x_media (pc, &disasm_info); else ! switch (disasm_info.endian) ! { ! case BFD_ENDIAN_BIG: ! print_insn_sh (pc, &disasm_info); ! break; ! case BFD_ENDIAN_LITTLE: ! print_insn_shl (pc, &disasm_info); ! break; ! default: ! abort(); ! } } --- 232,236 ---- if (sh64_h_ism_get (cpu) == ISM_MEDIA) print_insn_sh64x_media (pc, &disasm_info); else ! print_insn_sh (pc, &disasm_info); }