print_insn_sh cleanup

Joern Rennecke joern.rennecke@superh.com
Fri May 17 05:40:00 GMT 2002


Elena Zannoni wrote:
> We still need a gdb_print_insn_sh function, because the user can
> set the target endiannes from the command line overwriting the architecture
> endiannes.
> So we need to leave in there the check of the TARGET_BYTE_ORDER.
> I think something like this:
> gdb_print_insn_sh (bfd_vma address, disassemble_info *info)
> {
>  if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
>     BFD_ENDIAN_BIG;
>  else
>    info->endian = BFD_ENDIAN_LITTLE;
>  return print_insn_sh (address, info);
> }

I have used
info->endian = TARGET_BYTE_ORDER;
I hope there isn't any hidden problem with that.

-- 
--------------------------
SuperH
2430 Aztec West / Almondsbury / BRISTOL / BS32 4AQ
T:+44 1454 462330
-------------- next part --------------
Fri May 17 13:30:50 2002  J"orn Rennecke <joern.rennecke@superh.com>

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);
  }


More information about the Binutils mailing list