aboutsummaryrefslogtreecommitdiff
path: root/binutils/bucomm.h
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2021-05-15 14:36:26 +0930
committerAlan Modra <amodra@gmail.com>2021-05-15 14:36:54 +0930
commitfc5e0925d4bff79c8c036cf00803112a1ec04188 (patch)
treed71d622247fdaadaa710ece3fdce8bfb9ffc2289 /binutils/bucomm.h
parent7c96e6120f1b9b5025629bbe995ca55d1be8f36f (diff)
downloadgdb-fc5e0925d4bff79c8c036cf00803112a1ec04188.zip
gdb-fc5e0925d4bff79c8c036cf00803112a1ec04188.tar.gz
gdb-fc5e0925d4bff79c8c036cf00803112a1ec04188.tar.bz2
_mul_overflow and get_encoded_value
A sufficiently mad compiler optimiser can take undefined behaviour according to the C standard as an opportunity to remove code. Since "data + size" might be seen to be past the end of an array, calculating such an expression is UB. _mul_overflow is infrastructure for later patches. * bucomm.h (_mul_overflow): Define. * dwarf.c (get_encoded_value): Avoid pointer UB.
Diffstat (limited to 'binutils/bucomm.h')
-rw-r--r--binutils/bucomm.h8
1 files changed, 8 insertions, 0 deletions
diff --git a/binutils/bucomm.h b/binutils/bucomm.h
index 78f6176..2769c27 100644
--- a/binutils/bucomm.h
+++ b/binutils/bucomm.h
@@ -80,4 +80,12 @@ void *xmalloc (size_t);
void *xrealloc (void *, size_t);
+#if __GNUC__ >= 7
+#define _mul_overflow(a, b, res) __builtin_mul_overflow (a, b, res)
+#else
+/* Assumes unsigned values. Careful! Args evaluated multiple times. */
+#define _mul_overflow(a, b, res) \
+ ((*res) = (a), (*res) *= (b), (b) != 0 && (*res) / (b) != (a))
+#endif
+
#endif /* _BUCOMM_H */