-Werror,-Wtautological-overlap-compare error in h8300-tdep.c

Yoshinori Sato ysato@users.sourceforge.jp
Sun May 17 13:54:34 GMT 2020


On Sat, 16 May 2020 06:05:44 +0900,
Simon Marchi wrote:
> 
> When building with clang 11, we get:
> 
>   CXX    h8300-tdep.o
> /home/smarchi/src/binutils-gdb/gdb/h8300-tdep.c:225:21: error: overlapping comparisons always evaluate to false [-Werror,-Wtautological-overlap-compare]
>               if (disp < 0 && disp > 0xffffff)
>                   ~~~~~~~~~^~~~~~~~~~~~~~~~~~
> /home/smarchi/src/binutils-gdb/gdb/h8300-tdep.c:203:17: error: overlapping comparisons always evaluate to false [-Werror,-Wtautological-overlap-compare]
>           if (disp < 0 && disp > 0xffffff)
>               ~~~~~~~~~^~~~~~~~~~~~~~~~~~
> /home/smarchi/src/binutils-gdb/gdb/h8300-tdep.c:184:17: error: overlapping comparisons always evaluate to false [-Werror,-Wtautological-overlap-compare]
>           if (disp < 0 && disp > 0xffffff)
>               ~~~~~~~~~^~~~~~~~~~~~~~~~~~
> 
> Indeed, disp (of type LONGEST) can't be less than 0 and greater than 0xffffff.
> 
> The closest thing I could find to an instruction set reference was this:
> 
>   https://www.renesas.com/cn/en/doc/products/mpumcu/001/e602025_h8300.pdf
> 
> ... but it didn't really help me decode this code.  I'm reporting it in hope that
> somebody that knows what they are doing would know how to fix it.
> 
> Yoshinori, I CCed you because you happen to be the last person who did a meaningful commit
> in h8300-tdep.c, so maybe you have an idea.
> 
> Simon

This instruction enhanced on h8300h.
https://www.renesas.com/us/en/doc/products/mpumcu/001/rej09b0213_h8300h.pdf

disp have 24bit value.
So always 0 in upper byte.

I think it's good to check like this.

diff --git a/gdb/h8300-tdep.c b/gdb/h8300-tdep.c
index 79c74001bc..d3d2bf84ab 100644
--- a/gdb/h8300-tdep.c
+++ b/gdb/h8300-tdep.c
@@ -178,10 +178,10 @@ h8300_is_argument_spill (struct gdbarch *gdbarch, CORE_ADD
R pc)
       if (IS_MOVB_Rn24_SP (read_memory_unsigned_integer (pc + 2,
                                                         2, byte_order)))
        {
-         LONGEST disp = read_memory_integer (pc + 4, 4, byte_order);
+         ULONGEST disp = read_memory_integer (pc + 4, 4, byte_order);
 
          /* ... and d:24 is negative.  */
-         if (disp < 0 && disp > 0xffffff)
+         if ((disp & 0x00800000) != 0)
            return 8;
        }
     }
@@ -197,10 +197,10 @@ h8300_is_argument_spill (struct gdbarch *gdbarch, CORE_ADD
R pc)
       if (IS_MOVW_Rn24_SP (read_memory_unsigned_integer (pc + 2,
                                                         2, byte_order)))
        {
-         LONGEST disp = read_memory_integer (pc + 4, 4, byte_order);
+         ULONGEST disp = read_memory_integer (pc + 4, 4, byte_order);
 
          /* ... and d:24 is negative.  */
-         if (disp < 0 && disp > 0xffffff)
+         if ((disp & 0x00800000) != 0)
            return 8;
        }
     }
@@ -219,10 +219,10 @@ h8300_is_argument_spill (struct gdbarch *gdbarch, CORE_ADD
R pc)
        {
          if (IS_MOVL_Rn24_SP (read_memory_integer (pc + 4, 2, byte_order)))
            {
-             LONGEST disp = read_memory_integer (pc + 6, 4, byte_order);
+             ULONGEST disp = read_memory_integer (pc + 6, 4, byte_order);
 
              /* ... and d:24 is negative.  */
-             if (disp < 0 && disp > 0xffffff)
+             if ((disp & 0x00800000) != 0)
                return 10;
            }
        }

-- 
Yosinori Sato


More information about the Gdb-patches mailing list