This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: [bugs] Buggy objdump?
- To: Andreas Jaeger <aj at suse dot de>, binutils at sources dot redhat dot com
- Subject: Re: [bugs] Buggy objdump?
- From: Jan Hubicka <jh at suse dot cz>
- Date: Thu, 25 Jan 2001 18:42:34 +0100
- Cc: Jan Hubicka <jh at suse dot cz>, bugs at x86-64 dot org
- References: <hoae91ghab.fsf@gee.suse.de>
> 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 ----