diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2015-11-13 12:39:13 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2015-11-13 12:40:52 -0800 |
commit | 92a501022e0154cd9de41240680b7f003a833c96 (patch) | |
tree | d4cee238be4fd88bd254ebd9f348971e6b749b78 /lib | |
parent | 04ac097f34d887e1ae8dea1e884118728e931c7a (diff) | |
download | emacs-92a501022e0154cd9de41240680b7f003a833c96.tar.gz |
Merge from gnulib
This incorporates:
2015-11-13 xalloc-oversized: improve performance with GCC 5
* lib/xalloc-oversized.h: Copy from gnulib.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/xalloc-oversized.h | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/lib/xalloc-oversized.h b/lib/xalloc-oversized.h index f0e9778f738..0e579deb2bb 100644 --- a/lib/xalloc-oversized.h +++ b/lib/xalloc-oversized.h @@ -16,9 +16,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ #ifndef XALLOC_OVERSIZED_H_ -# define XALLOC_OVERSIZED_H_ +#define XALLOC_OVERSIZED_H_ -# include <stddef.h> +#include <stddef.h> + +#ifndef __has_builtin +# define __has_builtin(x) 0 +#endif /* Return 1 if an array of N objects, each of size S, cannot exist due to size arithmetic overflow. S must be positive and N must be @@ -32,7 +36,12 @@ sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for exactly-SIZE_MAX allocations on such hosts; this avoids a test and branch when S is known to be 1. */ +#if 5 <= __GNUC__ || __has_builtin (__builtin_mul_overflow) +# define xalloc_oversized(n, s) \ + ({ size_t __xalloc_size; __builtin_mul_overflow (n, s, &__xalloc_size); }) +#else # define xalloc_oversized(n, s) \ ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n)) +#endif #endif /* !XALLOC_OVERSIZED_H_ */ |