From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31119 invoked by alias); 28 Apr 2006 12:34:38 -0000 Received: (qmail 31106 invoked by uid 22791); 28 Apr 2006 12:34:37 -0000 X-Spam-Check-By: sourceware.org Received: from bender.bawue.de (HELO bender.bawue.de) (193.7.176.20) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 28 Apr 2006 12:34:35 +0000 Received: from lagash (unknown [194.74.144.146]) by bender.bawue.de (Postfix) with ESMTP id D95CE454BA for ; Fri, 28 Apr 2006 14:34:32 +0200 (MEST) Received: from ths by lagash with local (Exim 4.61) (envelope-from ) id 1FZSAT-00028I-Ed for binutils@sourceware.org; Fri, 28 Apr 2006 13:33:53 +0100 Date: Fri, 28 Apr 2006 16:37:00 -0000 To: binutils@sourceware.org Subject: [PATCH] Force mips16 disassembled addresses to odd values Message-ID: <20060428123353.GF4579@networkno.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.11+cvs20060403 From: Thiemo Seufer X-IsSubscribed: yes Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org X-SW-Source: 2006-04/txt/msg00411.txt.bz2 Hello All, this patch forces some disassembled mips16 addresses to odd values, this helps gdb to handle mips16 code better. Thiemo 2006-04-28 Thiemo Seufer Nigel Stevens David Ung * mips-dis.c (print_insn_args): Add mips_opcode argument. Use it to keep mips16 addresses odd. (print_insn_mips): Adjust print_insn_args call. (print_mips16_insn_arg): Force mips16 to odd addresses. Index: opcodes/mips-dis.c =================================================================== RCS file: /cvs/src/src/opcodes/mips-dis.c,v retrieving revision 1.55 diff -u -p -r1.55 mips-dis.c --- opcodes/mips-dis.c 14 Nov 2005 02:25:39 -0000 1.55 +++ opcodes/mips-dis.c 27 Apr 2006 12:53:39 -0000 @@ -688,7 +714,8 @@ static void print_insn_args (const char *d, register unsigned long int l, bfd_vma pc, - struct disassemble_info *info) + struct disassemble_info *info, + const struct mips_opcode *opp) { int op, delta; unsigned int lsb, msb, msbd; @@ -939,6 +966,10 @@ print_insn_args (const char *d, case 'a': info->target = (((pc + 4) & ~(bfd_vma) 0x0fffffff) | (((l >> OP_SH_TARGET) & OP_MASK_TARGET) << 2)); + /* For gdb disassembler, force odd address on jalx. */ + if (info->flavour == bfd_target_unknown_flavour + && strcmp (opp->name, "jalx") == 0) + info->target |= 1; (*info->print_address_func) (info->target, info); break; @@ -1247,7 +1280,7 @@ print_insn_mips (bfd_vma memaddr, if (d != NULL && *d != '\0') { (*info->fprintf_func) (info->stream, "\t"); - print_insn_args (d, word, memaddr, info); + print_insn_args (d, word, memaddr, info, op); } return INSNLEN; @@ -1585,15 +1618,26 @@ print_mips16_insn_arg (char type, } } info->target = (baseaddr & ~((1 << shift) - 1)) + immed; + if (pcrel && branch + && info->flavour == bfd_target_unknown_flavour) + /* For gdb disassembler, maintain odd address. */ + info->target |= 1; (*info->print_address_func) (info->target, info); } } break; case 'a': - if (! use_extend) - extend = 0; - l = ((l & 0x1f) << 23) | ((l & 0x3e0) << 13) | (extend << 2); + { + int jalx = l & 0x400; + + if (! use_extend) + extend = 0; + l = ((l & 0x1f) << 23) | ((l & 0x3e0) << 13) | (extend << 2); + if (!jalx && info->flavour == bfd_target_unknown_flavour) + /* For gdb disassembler, maintain odd address. */ + l |= 1; + } info->target = ((memaddr + 4) & ~(bfd_vma) 0x0fffffff) | l; (*info->print_address_func) (info->target, info); info->insn_type = dis_jsr;