[PATCH v2 08/15] MIPS: Mask off lowest bit when disassembling compressed code.

Jovan Dmitrovic jovan.dmitrovic@htecgroup.com
Wed Oct 29 14:09:36 GMT 2025


From: Simon Dardis <simon.dardis@imgtec.com>

Signed-off-by: Jovan Dmitrović <jovan.dmitrovic@htecgroup.com>

opcodes/ChangeLog:
	* mips-dis.c (print_insn_mips16, print_insn_micromips): Don't
	disassemble from odd addresses in mips16 and microMIPS mode.
---
 opcodes/mips-dis.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/opcodes/mips-dis.c b/opcodes/mips-dis.c
index 8ab2c736203..d246eef3917 100644
--- a/opcodes/mips-dis.c
+++ b/opcodes/mips-dis.c
@@ -2305,7 +2305,7 @@ enum match_kind
 /* Disassemble mips16 instructions.  */
 
 static int
-print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info)
+print_insn_mips16 (bfd_vma memaddr_base, struct disassemble_info *info)
 {
   const fprintf_styled_ftype infprintf = info->fprintf_styled_func;
   int status;
@@ -2319,6 +2319,10 @@ print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info)
   unsigned int first;
   unsigned int full;
 
+  /* Some users of bfd may supply an address with the MIPS16 flag set,
+     e.g. objdump.  MIPS16 instructions must be at least 2 byte aligned.  */
+  bfd_vma memaddr = memaddr_base & ~1;
+
   info->bytes_per_chunk = 2;
   info->display_endian = info->endian;
   info->insn_info_valid = 1;
@@ -2533,7 +2537,7 @@ print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info)
 /* Disassemble microMIPS instructions.  */
 
 static int
-print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
+print_insn_micromips (bfd_vma memaddr_base, struct disassemble_info *info)
 {
   const fprintf_styled_ftype infprintf = info->fprintf_styled_func;
   const struct mips_opcode *op, *opend;
@@ -2544,6 +2548,10 @@ print_insn_micromips (bfd_vma memaddr, struct disassemble_info *info)
   int status;
   unsigned int insn;
 
+  /* Some users of bfd may supply an address with the micromips flag set,
+     e.g. objdump.  microMIPS instructions must be at least 2 byte aligned.  */
+  bfd_vma memaddr = memaddr_base & ~1;
+
   info->bytes_per_chunk = 2;
   info->display_endian = info->endian;
   info->insn_info_valid = 1;
-- 
2.34.1


More information about the Binutils mailing list