Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Alan Modra <amodra@gmail.com>
To: binutils@sourceware.org, gdb-patches@sourceware.org
Subject: Undefined shift in print_insn_tilepro
Date: Thu, 29 Oct 2026 08:54:22 +1030	[thread overview]
Message-ID: <auJ2FsEJXYZ2MCyb@squeak.grove.modra.org> (raw)

It is possible for tilepro operand_values to contain a value with the
top bit set (see parse_insn_tilepro op->is_signed code), which can
trigger a ubsan error when shifting it left.  Avoid these "errors" by
making operand_values an unsigned int rather than an int.

tilegx has operand_values as long long but stores an unsigned int
value, so the field may as well be unsigned int there too.

include/
	* opcode/tilepro.h (struct tilepro_decoded_instruction): Make
	operand_values unsigned int.
	* opcode/tilegx.h (struct tilegx_decoded_instruction): Likewise.
opcodes/
	* tilepro-dis.c (contains_insn): Make expected_first_operand,
	expected_second_operand and last_operand_ret unsigned int.
	(print_insn_tilepro): Make num and addr_piece unsigned int.
	* tilegx-dis.c (print_insn_tilegx): Make num unsigned int.
gdb/
	* tilegx-tdep.c (tilegx_analyze_prologue): Adjust "operands".

diff --git a/gdb/tilegx-tdep.c b/gdb/tilegx-tdep.c
index 0d1421f8758..27829d2ad04 100644
--- a/gdb/tilegx-tdep.c
+++ b/gdb/tilegx-tdep.c
@@ -440,7 +440,7 @@ tilegx_analyze_prologue (struct gdbarch* gdbarch,
       for (i = 0; i < num_insns; i++)
 	{
 	  struct tilegx_decoded_instruction *this_insn = &decoded[i];
-	  long long *operands = this_insn->operand_values;
+	  unsigned int *operands = this_insn->operand_values;
 	  const struct tilegx_opcode *opcode = this_insn->opcode;
 
 	  switch (opcode->mnemonic)
diff --git a/include/opcode/tilegx.h b/include/opcode/tilegx.h
index aeb73ddcec1..43ab417d04c 100644
--- a/include/opcode/tilegx.h
+++ b/include/opcode/tilegx.h
@@ -1258,7 +1258,7 @@ struct tilegx_decoded_instruction
 {
   const struct tilegx_opcode *opcode;
   const struct tilegx_operand *operands[TILEGX_MAX_OPERANDS];
-  long long operand_values[TILEGX_MAX_OPERANDS];
+  unsigned int operand_values[TILEGX_MAX_OPERANDS];
 };
 
 
diff --git a/include/opcode/tilepro.h b/include/opcode/tilepro.h
index 86b7e90ebf7..2af4796abe5 100644
--- a/include/opcode/tilepro.h
+++ b/include/opcode/tilepro.h
@@ -1581,7 +1581,7 @@ struct tilepro_decoded_instruction
 {
   const struct tilepro_opcode *opcode;
   const struct tilepro_operand *operands[TILEPRO_MAX_OPERANDS];
-  int operand_values[TILEPRO_MAX_OPERANDS];
+  unsigned int operand_values[TILEPRO_MAX_OPERANDS];
 };
 
 
diff --git a/opcodes/tilegx-dis.c b/opcodes/tilegx-dis.c
index b19afdfa454..2cb03266451 100644
--- a/opcodes/tilegx-dis.c
+++ b/opcodes/tilegx-dis.c
@@ -94,7 +94,7 @@ print_insn_tilegx (bfd_vma memaddr, disassemble_info *info)
 
       for (j = 0; j < opcode->num_operands; j++)
 	{
-	  bfd_vma num;
+	  unsigned int num;
 	  const struct tilegx_operand *op;
 	  const char *spr_name;
 
@@ -109,20 +109,20 @@ print_insn_tilegx (bfd_vma memaddr, disassemble_info *info)
 	    {
 	    case TILEGX_OP_TYPE_REGISTER:
 	      info->fprintf_func (info->stream, "%s",
-				  tilegx_register_names[(int) num]);
+				  tilegx_register_names[num]);
 	      break;
 	    case TILEGX_OP_TYPE_SPR:
 	      spr_name = get_tilegx_spr_name (num);
 	      if (spr_name != NULL)
 		info->fprintf_func (info->stream, "%s", spr_name);
 	      else
-		info->fprintf_func (info->stream, "%d", (int)num);
+		info->fprintf_func (info->stream, "%d", num);
 	      break;
 	    case TILEGX_OP_TYPE_IMMEDIATE:
-	      info->fprintf_func (info->stream, "%d", (int)num);
+	      info->fprintf_func (info->stream, "%d", num);
 	      break;
 	    case TILEGX_OP_TYPE_ADDRESS:
-	      info->print_address_func (num, info);
+	      info->print_address_func ((bfd_vma) num, info);
 	      break;
 	    default:
 	      abort ();
diff --git a/opcodes/tilepro-dis.c b/opcodes/tilepro-dis.c
index aa9b532e2aa..d120545fd3f 100644
--- a/opcodes/tilepro-dis.c
+++ b/opcodes/tilepro-dis.c
@@ -32,10 +32,10 @@
 
 static int
 contains_insn (tilepro_mnemonic expected_mnemonic,
-	       int expected_first_operand,
-	       int expected_second_operand,
+	       unsigned int expected_first_operand,
+	       unsigned int expected_second_operand,
 	       bfd_vma memaddr,
-	       int *last_operand_ret,
+	       unsigned int *last_operand_ret,
 	       disassemble_info *info)
 {
   struct tilepro_decoded_instruction
@@ -59,11 +59,11 @@ contains_insn (tilepro_mnemonic expected_mnemonic,
       if (opcode->mnemonic != expected_mnemonic)
 	continue;
 
-      if (expected_first_operand != -1
+      if (expected_first_operand != -1u
 	  && decoded[i].operand_values[0] != expected_first_operand)
 	continue;
 
-      if (expected_second_operand != -1
+      if (expected_second_operand != -1u
 	  && decoded[i].operand_values[1] != expected_second_operand)
 	continue;
 
@@ -141,7 +141,7 @@ print_insn_tilepro (bfd_vma memaddr, disassemble_info *info)
 
       for (j = 0; j < opcode->num_operands; j++)
 	{
-	  int num;
+	  unsigned int num;
 	  const struct tilepro_operand *op;
 	  const char *spr_name;
 
@@ -171,7 +171,7 @@ print_insn_tilepro (bfd_vma memaddr, disassemble_info *info)
 	      {
 		bfd_vma addr = 0;
 		int found_addr = 0;
-		int addr_piece;
+		unsigned int addr_piece;
 
 		switch (opcode->mnemonic)
 		  {
@@ -191,7 +191,7 @@ print_insn_tilepro (bfd_vma memaddr, disassemble_info *info)
 		  case TILEPRO_OPC_AULI:
 		    if (contains_insn (TILEPRO_OPC_MOVELI,
 				       decoded[i].operand_values[1],
-				       -1,
+				       -1u,
 				       memaddr - TILEPRO_BUNDLE_SIZE_IN_BYTES,
 				       &addr_piece,
 				       info))
@@ -218,7 +218,7 @@ print_insn_tilepro (bfd_vma memaddr, disassemble_info *info)
 	      break;
 
 	    case TILEPRO_OP_TYPE_ADDRESS:
-	      info->print_address_func ((bfd_vma)(unsigned int) num, info);
+	      info->print_address_func ((bfd_vma) num, info);
 	      break;
 
 	    default:

-- 
Alan Modra

                 reply	other threads:[~2026-10-28 22:24 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=auJ2FsEJXYZ2MCyb@squeak.grove.modra.org \
    --to=amodra@gmail.com \
    --cc=binutils@sourceware.org \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox