diff options
author | Thiemo Seufer <ths@networkno.de> | 2006-05-02 11:12:41 +0000 |
---|---|---|
committer | Thiemo Seufer <ths@networkno.de> | 2006-05-02 11:12:41 +0000 |
commit | 022fac6d2a2b74313c0262e97b280b1c7fc720f4 (patch) | |
tree | 068c947c075442817549d00f24f0186cca6093af /opcodes/mips-dis.c | |
parent | b48c61bccb90f21e146389b29828671551f381d1 (diff) | |
download | gdb-022fac6d2a2b74313c0262e97b280b1c7fc720f4.zip gdb-022fac6d2a2b74313c0262e97b280b1c7fc720f4.tar.gz gdb-022fac6d2a2b74313c0262e97b280b1c7fc720f4.tar.bz2 |
* mips-dis.c (print_insn_args): Force mips16 to odd addresses.
(print_mips16_insn_arg): Force mips16 to odd addresses.
Diffstat (limited to 'opcodes/mips-dis.c')
-rw-r--r-- | opcodes/mips-dis.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/opcodes/mips-dis.c b/opcodes/mips-dis.c index ee1e9af..59e1824 100644 --- a/opcodes/mips-dis.c +++ b/opcodes/mips-dis.c @@ -984,6 +984,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; @@ -1632,15 +1636,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; |