aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2020-09-11 07:13:25 +0200
committerTom de Vries <tdevries@suse.de>2020-09-11 07:27:56 +0200
commit5e044c673f8e7d473a2207cd3ba32910c4f5fc75 (patch)
tree7264d8140c269edddc43d605a816501766715353 /gcc
parent60e537a026c037d8f3e5678acd148f9e44b4fb9c (diff)
downloadgcc-5e044c673f8e7d473a2207cd3ba32910c4f5fc75.zip
gcc-5e044c673f8e7d473a2207cd3ba32910c4f5fc75.tar.gz
gcc-5e044c673f8e7d473a2207cd3ba32910c4f5fc75.tar.bz2
[nvptx] Fix UB in nvptx_assemble_value
When nvptx_assemble_value is called with size == 16, this bitshift runs into UB: ... val &= ((unsigned HOST_WIDE_INT)2 << (size * BITS_PER_UNIT - 1)) - 1; ... Fix this by checking the shift amount. Tested on nvptx. gcc/ChangeLog: * config/nvptx/nvptx.c (nvptx_assemble_value): Fix undefined behaviour.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/nvptx/nvptx.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c
index 4fca0ed..0c590d8 100644
--- a/gcc/config/nvptx/nvptx.c
+++ b/gcc/config/nvptx/nvptx.c
@@ -2053,7 +2053,9 @@ nvptx_assemble_value (unsigned HOST_WIDE_INT val, unsigned size)
bool negative_p
= val & (HOST_WIDE_INT_1U << (HOST_BITS_PER_WIDE_INT - 1));
- val &= ((unsigned HOST_WIDE_INT)2 << (size * BITS_PER_UNIT - 1)) - 1;
+ /* Avoid undefined behaviour. */
+ if (size * BITS_PER_UNIT < HOST_BITS_PER_WIDE_INT)
+ val &= (HOST_WIDE_INT_1U << (size * BITS_PER_UNIT)) - 1;
for (unsigned part = 0; size; size -= part)
{