]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
arm: fix UB due to missing mode check [PR100311]
authorRichard Earnshaw <rearnsha@arm.com>
Wed, 28 Apr 2021 16:56:38 +0000 (17:56 +0100)
committerRichard Earnshaw <rearnsha@arm.com>
Thu, 29 Apr 2021 10:54:40 +0000 (11:54 +0100)
Some places in the compiler iterate over all the fixed registers to
check if that register can be used in a particular mode.  The idiom is
to iterate over the register and then for that register, if it
supports the current mode to check all that register and any
additional registers needed (HARD_REGNO_NREGS).  If these two checks
are not fully aligned then it is possible to generate a buffer overrun
when testing data objects that are sized by the number of hard regs in
the machine.

The VPR register is a case where these checks were not consistent and
because this is the last HARD register the result was that we ended up
overflowing the fixed_regs array.

gcc:
PR target/100311
* config/arm/arm.c (arm_hard_regno_mode_ok): Only allow VPR to be
used in HImode.
(cherry picked from commit 59f5d16f2c5db4d9592c8ce6453afe81334bb012)

gcc/config/arm/arm.c

index 352b2cd6e8392ab67479d6fb050b6ff07f5f36f5..a201088a6fd4977a886b1ad9bea330abc733a9a5 100644 (file)
@@ -25269,7 +25269,7 @@ arm_hard_regno_mode_ok (unsigned int regno, machine_mode mode)
     return false;
 
   if (IS_VPR_REGNUM (regno))
-    return true;
+    return mode == HImode;
 
   if (TARGET_THUMB1)
     /* For the Thumb we only allow values bigger than SImode in