This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[PATCH RFA] fill in instruction info for mips disassembly.


The patch below fills in instruction in the MIPS disassembler, and
fixes a missing flag on a couple of instructions.

It's been tested (gmake && gmake -k check in binutils only) with my
standard 12 MIPS ELF and ECOFF targets, with no new testsuite failures
(after the testsuite changes have been applied 8-).

The real effect (the reason for the testsuite changes) is that where
for the code:

	b	foo
	nop
	nop
	nop
	some_other_insn

the old disassembly would print:

	b	foo
	...
	some_other_insn

The new one prints:

	b	foo
	nop
	...
	some_other_insn

That is, delay slot instructions always get printed even if they're
nops.

This keeps new-ish objdump disassembler uses from asking the question
"what are these bloody ... things in my delay slot?"  8-)



chris
=============================================================================
[opcodes/ChangeLog]

2001-10-21  Chris Demetriou  <cgd@broadcom.com>

	* mips-opc.c (mips_builtin_opcodes): Mark "bgezall" and
	"bltzall" as writing GPR 31 (since they do).

	* mips-dis.c (print_insn_arg): Calculate info->target
	where appropriate.
	(print_insn_mips): Fill in instruction info.
	(print_mips16_insn_arg): Remove unneded variable 'val'.
	Removed duplicated instruction target calculations,
	calculate once and print that result.  Use same idiom for
	masking the jump segment bits as is used in print_insn_arg.

[gas/testsuite/ChangeLog]

2001-10-21  Chris Demetriou  <cgd@broadcom.com>

	* gas/mips/beq.s: Add zero words at end of instructions so
	that objdump will print "..." when disassembling.
	* gas/mips/beq.d: Update for disassembler changes which force
	branch delay-slot nops to be printed.
	* gas/mips/bge.d: Ditto.
	* gas/mips/bgeu.d: Ditto.
	* gas/mips/blt.d: Ditto.
	* gas/mips/bltu.d: Ditto.
	* gas/mips/jal-svr4pic.d: Ditto.
	* gas/mips/jal-xgot.d: Ditto.

Index: gas/testsuite/gas/mips/beq.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/mips/beq.d,v
retrieving revision 1.3
diff -u -r1.3 beq.d
--- beq.d	2001/09/07 05:00:37	1.3
+++ beq.d	2001/10/21 18:42:13
@@ -31,6 +31,7 @@
 0+0058 <[^>]*> beqzl	a0,0+0000 <text_label>
 0+005c <[^>]*> nop
 0+0060 <[^>]*> bnezl	a0,0+0000 <text_label>
+0+0064 <[^>]*> nop
 	...
 0+20068 <[^>]*> j	0+0000 <text_label>
 [ 	]*20068: (MIPS_JMP|JMPADDR|R_MIPS_26)	.text
@@ -43,4 +44,5 @@
 0+2007c <[^>]*> nop
 0+20080 <[^>]*> bal	0+20080 <text_label\+0x20080>
 [ 	]*20080: R_MIPS_PC16	external_label
+0+20084 <[^>]*> nop
 	...
Index: gas/testsuite/gas/mips/beq.s
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/mips/beq.s,v
retrieving revision 1.2
diff -u -r1.2 beq.s
--- beq.s	2001/09/07 05:00:37	1.2
+++ beq.s	2001/10/21 18:42:13
@@ -26,5 +26,5 @@
 	b	external_label
 	bal	external_label
 
-# Round to a 16 byte boundary, for ease in testing multiple targets.
-	nop
+# Force at least 8 (non-delay-slot) zero bytes, to make 'objdump' print ...
+	.space	8
Index: gas/testsuite/gas/mips/bge.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/mips/bge.d,v
retrieving revision 1.3
diff -u -r1.3 bge.d
--- bge.d	2001/09/07 05:00:37	1.3
+++ bge.d	2001/10/21 18:42:13
@@ -66,4 +66,5 @@
 0+00d8 <[^>]*> slt	at,a1,a0
 0+00dc <[^>]*> bnezl	at,000000dc <text_label\+0xdc>
 [ 	]*dc: R_MIPS_PC16	external_label
+0+00e0 <[^>]*> nop
 	...
Index: gas/testsuite/gas/mips/bgeu.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/mips/bgeu.d,v
retrieving revision 1.3
diff -u -r1.3 bgeu.d
--- bgeu.d	2001/09/07 05:00:37	1.3
+++ bgeu.d	2001/10/21 18:42:13
@@ -60,4 +60,5 @@
 0+00c0 <[^>]*> sltu	at,a1,a0
 0+00c4 <[^>]*> bnezl	at,000000c4 <text_label\+0xc4>
 [ 	]*c4: R_MIPS_PC16	external_label
+0+00c8 <[^>]*> nop
 	...
Index: gas/testsuite/gas/mips/blt.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/mips/blt.d,v
retrieving revision 1.3
diff -u -r1.3 blt.d
--- blt.d	2001/09/07 05:00:37	1.3
+++ blt.d	2001/10/21 18:42:13
@@ -66,4 +66,5 @@
 0+00d8 <[^>]*> slt	at,a1,a0
 0+00dc <[^>]*> beqzl	at,000000dc <text_label\+0xdc>
 [ 	]*dc: R_MIPS_PC16	external_label
+0+00e0 <[^>]*> nop
 	...
Index: gas/testsuite/gas/mips/bltu.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/mips/bltu.d,v
retrieving revision 1.3
diff -u -r1.3 bltu.d
--- bltu.d	2001/09/07 05:00:37	1.3
+++ bltu.d	2001/10/21 18:42:13
@@ -60,4 +60,5 @@
 0+00c0 <[^>]*> sltu	at,a1,a0
 0+00c4 <[^>]*> beqzl	at,000000c4 <text_label\+0xc4>
 [ 	]*c4: R_MIPS_PC16	external_label
+0+00c8 <[^>]*> nop
 	...
Index: gas/testsuite/gas/mips/jal-svr4pic.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/mips/jal-svr4pic.d,v
retrieving revision 1.4
diff -u -r1.4 jal-svr4pic.d
--- jal-svr4pic.d	2001/06/29 21:27:43	1.4
+++ jal-svr4pic.d	2001/10/21 18:42:14
@@ -43,4 +43,5 @@
 0+006c <[^>]*> nop
 0+0070 <[^>]*> lw	gp,0\(sp\)
 0+0074 <[^>]*> b	0+0000 <text_label>
+0+0078 <[^>]*> nop
 	...
Index: gas/testsuite/gas/mips/jal-xgot.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/mips/jal-xgot.d,v
retrieving revision 1.4
diff -u -r1.4 jal-xgot.d
--- jal-xgot.d	2001/06/29 21:27:43	1.4
+++ jal-xgot.d	2001/10/21 18:42:14
@@ -48,4 +48,5 @@
 0+0074 <[^>]*> nop
 0+0078 <[^>]*> lw	gp,0\(sp\)
 0+007c <[^>]*> b	0+0000 <text_label>
+0+0080 <[^>]*> nop
 	...
Index: opcodes/mips-dis.c
===================================================================
RCS file: /cvs/src/src/opcodes/mips-dis.c,v
retrieving revision 1.22
diff -u -r1.22 mips-dis.c
--- mips-dis.c	2001/10/18 01:42:16	1.22
+++ mips-dis.c	2001/10/21 18:42:16
@@ -155,10 +155,9 @@
       break;
 
     case 'a':
-      (*info->print_address_func)
-	((((pc + 4) & ~(bfd_vma) 0x0fffffff)
-	  | (((l >> OP_SH_TARGET) & OP_MASK_TARGET) << 2)),
-	 info);
+      info->target = (((pc + 4) & ~(bfd_vma) 0x0fffffff)
+		      | (((l >> OP_SH_TARGET) & OP_MASK_TARGET) << 2));
+      (*info->print_address_func) (info->target, info);
       break;
 
     case 'p':
@@ -166,9 +165,8 @@
       delta = (l >> OP_SH_DELTA) & OP_MASK_DELTA;
       if (delta & 0x8000)
 	delta |= ~0xffff;
-      (*info->print_address_func)
-	((delta << 2) + pc + INSNLEN,
-	 info);
+      info->target = (delta << 2) + pc + INSNLEN;
+      (*info->print_address_func) (info->target, info);
       break;
 
     case 'd':
@@ -457,6 +455,12 @@
 
   info->bytes_per_chunk = INSNLEN;
   info->display_endian = info->endian;
+  info->insn_info_valid = 1;
+  info->branch_delay_insns = 0;
+  info->data_size = 0;      
+  info->insn_type = dis_nonbranch;
+  info->target = 0;
+  info->target2 = 0;
 
   op = mips_hash[(word >> OP_SH_OP) & OP_MASK_OP];
   if (op != NULL)
@@ -470,6 +474,28 @@
 	      if (! OPCODE_IS_MEMBER (op, mips_isa, target_processor))
 		continue;
 
+	      /* Figure out instruction type and branch delay information.  */
+	      if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
+	        {
+		  if ((info->insn_type & INSN_WRITE_GPR_31) != 0)
+		    info->insn_type = dis_jsr;
+		  else
+		    info->insn_type = dis_branch;
+		  info->branch_delay_insns = 1;
+		}
+	      else if ((op->pinfo & (INSN_COND_BRANCH_DELAY
+				     | INSN_COND_BRANCH_LIKELY)) != 0)
+		{
+		  if ((info->insn_type & INSN_WRITE_GPR_31) != 0)
+		    info->insn_type = dis_condjsr;
+		  else
+		    info->insn_type = dis_condbranch;
+		  info->branch_delay_insns = 1;
+		}
+	      else if ((op->pinfo & (INSN_STORE_MEMORY
+				     | INSN_LOAD_MEMORY_DELAY)) != 0)
+		info->insn_type = dis_dref;
+
 	      (*info->fprintf_func) (info->stream, "%s", op->name);
 
 	      d = op->args;
@@ -486,6 +512,7 @@
     }
 
   /* Handle undefined instructions.  */
+  info->insn_type = dis_noninsn;
   (*info->fprintf_func) (info->stream, "0x%x", word);
   return INSNLEN;
 }
@@ -1006,7 +1033,6 @@
 	else
 	  {
 	    bfd_vma baseaddr;
-	    bfd_vma val;
 
 	    if (branch)
 	      {
@@ -1049,9 +1075,8 @@
 		      baseaddr = memaddr - 2;
 		  }
 	      }
-	    val = (baseaddr & ~((1 << shift) - 1)) + immed;
-	    (*info->print_address_func) (val, info);
-	    info->target = val;
+	    info->target = (baseaddr & ~((1 << shift) - 1)) + immed;
+	    (*info->print_address_func) (info->target, info);
 	  }
       }
       break;
@@ -1060,9 +1085,9 @@
       if (! use_extend)
 	extend = 0;
       l = ((l & 0x1f) << 23) | ((l & 0x3e0) << 13) | (extend << 2);
-      (*info->print_address_func) (((memaddr + 4) & 0xf0000000) | l, info);
+      info->target = ((memaddr + 4) & ~(bfd_vma) 0x0fffffff) | l;
+      (*info->print_address_func) (info->target, info);
       info->insn_type = dis_jsr;
-      info->target = ((memaddr + 4) & 0xf0000000) | l;
       info->branch_delay_insns = 1;
       break;
 
Index: opcodes/mips-opc.c
===================================================================
RCS file: /cvs/src/src/opcodes/mips-opc.c,v
retrieving revision 1.27
diff -u -r1.27 mips-opc.c
--- mips-opc.c	2001/10/18 01:42:16	1.27
+++ mips-opc.c	2001/10/21 18:42:16
@@ -185,7 +185,7 @@
 {"bgez",    "s,p",	0x04010000, 0xfc1f0000,	CBD|RD_s,		I1	},
 {"bgezl",   "s,p",	0x04030000, 0xfc1f0000,	CBL|RD_s,		I2|T3	},
 {"bgezal",  "s,p",	0x04110000, 0xfc1f0000,	CBD|RD_s|WR_31,		I1	},
-{"bgezall", "s,p",	0x04130000, 0xfc1f0000,	CBL|RD_s,		I2|T3	},
+{"bgezall", "s,p",	0x04130000, 0xfc1f0000,	CBL|RD_s|WR_31,		I2|T3	},
 {"bgt",     "s,t,p",	0,    (int) M_BGT,	INSN_MACRO,		I1	},
 {"bgt",     "s,I,p",	0,    (int) M_BGT_I,	INSN_MACRO,		I1	},
 {"bgtl",    "s,t,p",	0,    (int) M_BGTL,	INSN_MACRO,		I2|T3	},
@@ -217,7 +217,7 @@
 {"bltz",    "s,p",	0x04000000, 0xfc1f0000,	CBD|RD_s,		I1	},
 {"bltzl",   "s,p",	0x04020000, 0xfc1f0000,	CBL|RD_s,		I2|T3	},
 {"bltzal",  "s,p",	0x04100000, 0xfc1f0000,	CBD|RD_s|WR_31,		I1	},
-{"bltzall", "s,p",	0x04120000, 0xfc1f0000,	CBL|RD_s,		I2|T3	},
+{"bltzall", "s,p",	0x04120000, 0xfc1f0000,	CBL|RD_s|WR_31,		I2|T3	},
 {"bnez",    "s,p",	0x14000000, 0xfc1f0000,	CBD|RD_s,		I1	},
 {"bnezl",   "s,p",	0x54000000, 0xfc1f0000,	CBL|RD_s,		I2|T3	},
 {"bne",     "s,t,p",	0x14000000, 0xfc000000,	CBD|RD_s|RD_t,		I1	},


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]