[binutils-gdb] msp430: extended_dst disassembly

Alan Modra amodra@sourceware.org
Mon Oct 6 03:05:19 GMT 2025


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=f2a3ccf127fe2e84c58a483bd919276aa74bb8df

commit f2a3ccf127fe2e84c58a483bd919276aa74bb8df
Author: Alan Modra <amodra@gmail.com>
Date:   Mon Oct 6 09:53:03 2025 +1030

    msp430: extended_dst disassembly
    
    This avoids a gcc-14.2 bug reporting an "error: null destination
    pointer" on an sprintf buffer that is not NULL.  Don't ask me why this
    happens to work.
    
            * msp430-dis.c (msp430_singleoperand): Don't overprint op or
            comm for extended_dst.

Diff:
---
 opcodes/msp430-dis.c | 33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/opcodes/msp430-dis.c b/opcodes/msp430-dis.c
index bf705f0739c..4285e8818c6 100644
--- a/opcodes/msp430-dis.c
+++ b/opcodes/msp430-dis.c
@@ -259,9 +259,6 @@ msp430_singleoperand (disassemble_info *info,
 		{
 		  cmd_len += 2;
 		  *cycles = 4;
-		  sprintf (op, "0x%04x", dst);
-		  sprintf (comm, "PC rel. abs addr 0x%04x",
-			   PS ((short) (addr + 2) + dst));
 		  if (extended_dst)
 		    {
 		      dst |= extended_dst << 16;
@@ -269,6 +266,12 @@ msp430_singleoperand (disassemble_info *info,
 		      sprintf (comm, "PC rel. abs addr 0x%05lx",
 			       (long)((addr + 2 + dst) & 0xfffff));
 		    }
+		  else
+		    {
+		      sprintf (op, "0x%04x", dst);
+		      sprintf (comm, "PC rel. abs addr 0x%04x",
+			       PS ((short) (addr + 2) + dst));
+		    }
 		}
 	      else
 		return -1;
@@ -280,12 +283,13 @@ msp430_singleoperand (disassemble_info *info,
 		{
 		  cmd_len += 2;
 		  *cycles = 4;
-		  sprintf (op, "&0x%04x", PS (dst));
 		  if (extended_dst)
 		    {
 		      dst |= extended_dst << 16;
 		      sprintf (op, "&0x%05x", dst & 0xfffff);
 		    }
+		  else
+		    sprintf (op, "&0x%04x", PS (dst));
 		}
 	      else
 		return -1;
@@ -339,9 +343,6 @@ msp430_singleoperand (disassemble_info *info,
 	      if (msp430dis_opcode_signed (addr + 2, info, &dst, comm))
 		{
 		  cmd_len += 2;
-		  sprintf (op, "#%d", dst);
-		  if (dst > 9 || dst < 0)
-		    sprintf (comm, "#0x%04x", PS (dst));
 		  if (extended_dst)
 		    {
 		      dst |= extended_dst << 16;
@@ -351,6 +352,12 @@ msp430_singleoperand (disassemble_info *info,
 		      if (dst > 9 || dst < 0)
 			sprintf (comm, "#0x%05x", dst);
 		    }
+		  else
+		    {
+		      sprintf (op, "#%d", dst);
+		      if (dst > 9 || dst < 0)
+			sprintf (comm, "#0x%04x", PS (dst));
+		    }
 		}
 	      else
 		return -1;
@@ -367,9 +374,6 @@ msp430_singleoperand (disassemble_info *info,
 	      if (msp430dis_opcode_signed (addr + 2, info, &dst, comm))
 		{
 		  cmd_len += 2;
-		  sprintf (op, "0x%04x", PS (dst));
-		  sprintf (comm, "PC rel. 0x%04x",
-			   PS ((short) addr + 2 + dst));
 		  if (extended_dst)
 		    {
 		      dst |= extended_dst << 16;
@@ -377,6 +381,12 @@ msp430_singleoperand (disassemble_info *info,
 		      sprintf (comm, "PC rel. 0x%05lx",
 			       (long)((addr + 2 + dst) & 0xfffff));
 		    }
+		  else
+		    {
+		      sprintf (op, "0x%04x", PS (dst));
+		      sprintf (comm, "PC rel. 0x%04x",
+			       PS ((short) addr + 2 + dst));
+		    }
 		}
 	      else
 		return -1;
@@ -387,12 +397,13 @@ msp430_singleoperand (disassemble_info *info,
 	      if (msp430dis_opcode_signed (addr + 2, info, &dst, comm))
 		{
 		  cmd_len += 2;
-		  sprintf (op, "&0x%04x", PS (dst));
 		  if (extended_dst)
 		    {
 		      dst |= extended_dst << 16;
 		      sprintf (op, "&0x%05x", dst & 0xfffff);
 		    }
+		  else
+		    sprintf (op, "&0x%04x", PS (dst));
 		}
 	      else
 		return -1;


More information about the Binutils-cvs mailing list