diff options
| author | Paul Eggert | 2015-11-13 12:39:13 -0800 |
|---|---|---|
| committer | Paul Eggert | 2015-11-13 12:40:52 -0800 |
| commit | 92a501022e0154cd9de41240680b7f003a833c96 (patch) | |
| tree | d4cee238be4fd88bd254ebd9f348971e6b749b78 /lib | |
| parent | 04ac097f34d887e1ae8dea1e884118728e931c7a (diff) | |
| download | emacs-92a501022e0154cd9de41240680b7f003a833c96.tar.gz emacs-92a501022e0154cd9de41240680b7f003a833c96.zip | |
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 @@ | |||
| 16 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | 16 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
| 17 | 17 | ||
| 18 | #ifndef XALLOC_OVERSIZED_H_ | 18 | #ifndef XALLOC_OVERSIZED_H_ |
| 19 | # define XALLOC_OVERSIZED_H_ | 19 | #define XALLOC_OVERSIZED_H_ |
| 20 | 20 | ||
| 21 | # include <stddef.h> | 21 | #include <stddef.h> |
| 22 | |||
| 23 | #ifndef __has_builtin | ||
| 24 | # define __has_builtin(x) 0 | ||
| 25 | #endif | ||
| 22 | 26 | ||
| 23 | /* Return 1 if an array of N objects, each of size S, cannot exist due | 27 | /* Return 1 if an array of N objects, each of size S, cannot exist due |
| 24 | to size arithmetic overflow. S must be positive and N must be | 28 | to size arithmetic overflow. S must be positive and N must be |
| @@ -32,7 +36,12 @@ | |||
| 32 | sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for | 36 | sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for |
| 33 | exactly-SIZE_MAX allocations on such hosts; this avoids a test and | 37 | exactly-SIZE_MAX allocations on such hosts; this avoids a test and |
| 34 | branch when S is known to be 1. */ | 38 | branch when S is known to be 1. */ |
| 39 | #if 5 <= __GNUC__ || __has_builtin (__builtin_mul_overflow) | ||
| 40 | # define xalloc_oversized(n, s) \ | ||
| 41 | ({ size_t __xalloc_size; __builtin_mul_overflow (n, s, &__xalloc_size); }) | ||
| 42 | #else | ||
| 35 | # define xalloc_oversized(n, s) \ | 43 | # define xalloc_oversized(n, s) \ |
| 36 | ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n)) | 44 | ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n)) |
| 45 | #endif | ||
| 37 | 46 | ||
| 38 | #endif /* !XALLOC_OVERSIZED_H_ */ | 47 | #endif /* !XALLOC_OVERSIZED_H_ */ |