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]

Re: [bugs] Buggy objdump?


> Disassembly of section .text:
> 
> 0000000000000000 <main>:
>    0:   55                      pushq  %rbp
>    1:   48 89 e5                mov    %rsp,%rbp
>    4:   ff 35 00 00 00 00       pushl  0(%rip)        # a <main+0xa>
>    a:   b8 00 00 00 00          mov    $0x0,%eax
>    f:   5d                      popq   %rbp
>   10:   c3                      retq   
> 
> Why's there a pushl?  I expect a pushq there,

Fixed by this patch.
I guess I have rights to install it w/o approval, but I will wait till tomorrow
to let people cry.

Honza

Thu Jan 25 18:40:21 MET 2001  Jan Hubicka  <jh@suse.cz>
	* (dis386_att, grps): Use 'T' for push/pop
	(putop): Handle 'T', alphabetize order, fix 'I' handling in Intel syntax
Index: src/opcodes//i386-dis.c
===================================================================
RCS file: /cvs/src/src/opcodes/i386-dis.c,v
retrieving revision 1.13
diff -c -3 -p -r1.13 i386-dis.c
*** i386-dis.c	2001/01/13 09:05:55	1.13
--- i386-dis.c	2001/01/25 17:06:11
*************** struct dis386 {
*** 436,441 ****
--- 436,442 ----
     'Q' => print 'w', 'l' or 'q' if no register operands or suffix_always is true
     'R' => print 'w', 'l' or 'q' ("wd" or "dq" in intel mode)
     'S' => print 'w', 'l' or 'q' if suffix_always is true
+    'T' => print 'q' in 64bit mode and behave as 'I' otherwise
     'X' => print 's', 'd' depending on data16 prefix (for XMM)
     'W' => print 'b' or 'w' ("w" or "de" in intel mode)
  */
*************** static const struct dis386 dis386_att[] 
*** 602,608 ****
    { "movQ",	Ev, Sw, XX },
    { "leaS",	Gv, M, XX },
    { "movQ",	Sw, Ev, XX },
!   { "popQ",	Ev, XX, XX },
    /* 90 */
    { "nop",	XX, XX, XX },
    /* FIXME: NOP with REPz prefix is called PAUSE.  */
--- 603,609 ----
    { "movQ",	Ev, Sw, XX },
    { "leaS",	Gv, M, XX },
    { "movQ",	Sw, Ev, XX },
!   { "popT",	Ev, XX, XX },
    /* 90 */
    { "nop",	XX, XX, XX },
    /* FIXME: NOP with REPz prefix is called PAUSE.  */
*************** static const struct dis386 grps[][8] = {
*** 2442,2448 ****
      { "lcallI",	indirEv, XX, XX },
      { "jmpI",	indirEv, XX, XX },
      { "ljmpI",	indirEv, XX, XX },
!     { "pushQ",	Ev, XX, XX },
      { "(bad)",	XX, XX, XX },
    },
    /* GRP6 */
--- 2443,2449 ----
      { "lcallI",	indirEv, XX, XX },
      { "jmpI",	indirEv, XX, XX },
      { "ljmpI",	indirEv, XX, XX },
!     { "pushT",	Ev, XX, XX },
      { "(bad)",	XX, XX, XX },
    },
    /* GRP6 */
*************** putop (template, sizeflag)
*** 3686,3691 ****
--- 3687,3713 ----
  	  if (sizeflag & AFLAG)
  	    *obufp++ = 'e';
  	  break;
+ 	case 'I':
+           if (intel_syntax)
+             break;
+ 	  if (mode_64bit)
+ 	    *obufp++ = 'q';
+ 	  else
+ 	    {
+ 	      if ((prefixes & PREFIX_DATA)
+ #ifdef SUFFIX_ALWAYS
+ 		  || (sizeflag & SUFFIX_ALWAYS)
+ #endif
+ 		  )
+ 		{
+ 		  if (sizeflag & DFLAG)
+ 		    *obufp++ = 'l';
+ 		  else
+ 		    *obufp++ = 'w';
+ 		  used_prefixes |= (prefixes & PREFIX_DATA);
+ 	      }
+ 	    }
+ 	  break;
  	case 'L':
            if (intel_syntax)
              break;
*************** putop (template, sizeflag)
*** 3731,3739 ****
  	    }
  	  break;
  	case 'Q':
- 	  USED_REX (REX_MODE64);
            if (intel_syntax)
              break;
  	  if (mod != 3
  #ifdef SUFFIX_ALWAYS
  	      || (sizeflag & SUFFIX_ALWAYS)
--- 3753,3761 ----
  	    }
  	  break;
  	case 'Q':
            if (intel_syntax)
              break;
+ 	  USED_REX (REX_MODE64);
  	  if (mod != 3
  #ifdef SUFFIX_ALWAYS
  	      || (sizeflag & SUFFIX_ALWAYS)
*************** putop (template, sizeflag)
*** 3803,3808 ****
--- 3825,3848 ----
  	    }
  #endif
  	  break;
+ 	case 'T':
+           if (intel_syntax)
+             break;
+ 	  if (mode_64bit)
+ 	    *obufp++ = 'q';
+ 	  else if (mod != 3
+ #ifdef SUFFIX_ALWAYS
+ 		   || (sizeflag & SUFFIX_ALWAYS)
+ #endif
+ 		  )
+ 	    {
+ 	      if (sizeflag & DFLAG)
+ 		*obufp++ = 'l';
+ 	      else
+ 		*obufp++ = 'w';
+ 	      used_prefixes |= (prefixes & PREFIX_DATA);
+ 	    }
+ 	  break;
  	case 'X':
  	  if (prefixes & PREFIX_DATA)
  	    *obufp++ = 'd';
*************** putop (template, sizeflag)
*** 3811,3835 ****
            used_prefixes |= (prefixes & PREFIX_DATA);
  	  break;
  	  /* implicit operand size 'l' for i386 or 'q' for x86-64 */
- 	case 'I':
- 	  if (mode_64bit)
- 	    *obufp++ = 'q';
- 	  else
- 	    {
- 	      if ((prefixes & PREFIX_DATA)
- #ifdef SUFFIX_ALWAYS
- 		  || (sizeflag & SUFFIX_ALWAYS)
- #endif
- 		  )
- 		{
- 		  if (sizeflag & DFLAG)
- 		    *obufp++ = 'l';
- 		  else
- 		    *obufp++ = 'w';
- 		  used_prefixes |= (prefixes & PREFIX_DATA);
- 	      }
- 	    }
- 	  break;
  	case 'W':
  	  /* operand size flag for cwtl, cbtw */
  	  USED_REX (0);
--- 3851,3856 ----

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