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