From 765bbb24bd0bc5da4e183b1f6f43196da0126ffb Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 22 Jan 2007 21:21:52 +0000 Subject: * stdio-common/_itowa.c: Don't compile _itowa for 64-bit platforms. * stdio-common/_itoa.c: Don't compile in _itoa and _fitoa for 64-bit platforms. * malloc/mtrace.c (tr_where): Use _fitoa_word instead of _fitoa if possible. * posix/wordexp.c (parse_arith): Use _itoa_word instead of _itoa if possible. --- ChangeLog | 9 +++++++++ malloc/mtrace.c | 26 ++++++++++++++++---------- posix/wordexp.c | 12 +++++++++--- stdio-common/_itoa.c | 51 +++++++++++++++++++++++++++++---------------------- stdio-common/_itowa.c | 40 +++++++++++++++++++++------------------- 5 files changed, 84 insertions(+), 54 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9a5ec51912..520b3ecc0d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2007-01-22 Ulrich Drepper + * stdio-common/_itowa.c: Don't compile _itowa for 64-bit + platforms. + * stdio-common/_itoa.c: Don't compile in _itoa and _fitoa for + 64-bit platforms. + * malloc/mtrace.c (tr_where): Use _fitoa_word instead of _fitoa if + possible. + * posix/wordexp.c (parse_arith): Use _itoa_word instead of _itoa + if possible. + [BZ #3902] * stdio-common/_itoa.c (_itoa): Make sure at least a zero is emitted. * stdio-common/Makefile (tests): Add bug17. diff --git a/malloc/mtrace.c b/malloc/mtrace.c index 1a9522b09d..f40f3b20b1 100644 --- a/malloc/mtrace.c +++ b/malloc/mtrace.c @@ -1,5 +1,5 @@ /* More debugging hooks for `malloc'. - Copyright (C) 1991-1994,1996-2003, 2004 Free Software Foundation, Inc. + Copyright (C) 1991-1994,1996-2004, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Written April 2, 1991 by John Gilmore of Cygnus Support. Based on mcheck.c by Mike Haertel. @@ -28,6 +28,7 @@ #include #include +#include #include #include #include @@ -113,15 +114,20 @@ tr_where (caller) buf = alloca (len + 6 + 2 * sizeof (void *)); buf[0] = '('; - __stpcpy (_fitoa (caller >= (const __ptr_t) info.dli_saddr - ? caller - (const __ptr_t) info.dli_saddr - : (const __ptr_t) info.dli_saddr - caller, - __stpcpy (__mempcpy (buf + 1, info.dli_sname, - len), - caller >= (__ptr_t) info.dli_saddr - ? "+0x" : "-0x"), - 16, 0), - ")"); + + char *cp = __stpcpy (__mempcpy (buf + 1, info.dli_sname, len), + caller >= (__ptr_t) info.dli_saddr + ? "+0x" : "-0x"); + intptr_t offset = (caller >= (const __ptr_t) info.dli_saddr + ? caller - (const __ptr_t) info.dli_saddr + : (const __ptr_t) info.dli_saddr - caller); +# if LLONG_MAX == LONG_MAX + cp = _fitoa_word (offset, cp, 16, 0); +# else + cp = _fitoa (offset, cp, 16, 0); +# endif + + __stpcpy (cp, ")"); } fprintf (mallstream, "@ %s%s%s[%p] ", diff --git a/posix/wordexp.c b/posix/wordexp.c index 765d14d81f..40d1b6a7db 100644 --- a/posix/wordexp.c +++ b/posix/wordexp.c @@ -1,5 +1,5 @@ /* POSIX.2 wordexp implementation. - Copyright (C) 1997-2002, 2003, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1997-2003, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Tim Waugh . @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -757,8 +758,13 @@ parse_arith (char **word, size_t *word_length, size_t *max_length, convertme = numresult; result[20] = '\0'; - *word = w_addstr (*word, word_length, max_length, - _itoa (convertme, &result[20], 10, 0)); + char *numstr; +#if LLONG_MAX == LONG_MAX + numstr = _itoa_word (convertme, &result[20], 10, 0); +#else + numstr = _itoa (convertme, &result[20], 10, 0); +#endif + *word = w_addstr (*word, word_length, max_length, numstr); free (expr); return *word ? 0 : WRDE_NOSPACE; } diff --git a/stdio-common/_itoa.c b/stdio-common/_itoa.c index 285fde2ab9..14ee85d4e0 100644 --- a/stdio-common/_itoa.c +++ b/stdio-common/_itoa.c @@ -78,10 +78,12 @@ struct base_table_t #endif +/* We do not compile _itoa if we always can use _itoa_word. */ +#if LLONG_MAX != LONG_MAX /* Local variables. */ const struct base_table_t _itoa_base_table[] attribute_hidden = { -#if BITS_PER_MP_LIMB == 64 +# if BITS_PER_MP_LIMB == 64 /* 2 */ {SEL1(0ull) 1, 1}, /* 3 */ {SEL1(0xaaaaaaaaaaaaaaabull) 0, 1}, /* 4 */ {SEL1(0ull) 1, 2}, @@ -117,8 +119,8 @@ const struct base_table_t _itoa_base_table[] attribute_hidden = /* 34 */ {SEL1(0xf0f0f0f0f0f0f0f1ull) 0, 5}, /* 35 */ {SEL1(0xea0ea0ea0ea0ea0full) 0, 5}, /* 36 */ {SEL1(0xe38e38e38e38e38full) 0, 5} -#endif -#if BITS_PER_MP_LIMB == 32 +# endif +# if BITS_PER_MP_LIMB == 32 /* 2 */ {SEL1(0ul) 1, 1, {0, 31, 0x80000000ul SEL2(0xfffffffful)}}, /* 3 */ {SEL1(0xaaaaaaabul) 0, 1, {0, 20, 0xcfd41b91ul SEL2(0x3b563c24ul)}}, /* 4 */ {SEL1(0ul) 1, 2, {1, 15, 0x40000000ul SEL2(0xfffffffful)}}, @@ -154,8 +156,9 @@ const struct base_table_t _itoa_base_table[] attribute_hidden = /* 34 */ {SEL1(0xf0f0f0f1ul) 0, 5, {1, 6, 0x5c13d840ul SEL2(0x63dfc229ul)}}, /* 35 */ {SEL1(0xd41d41d5ul) 1, 6, {1, 6, 0x6d91b519ul SEL2(0x2b0fee30ul)}}, /* 36 */ {SEL1(0x38e38e39ul) 0, 3, {0, 6, 0x81bf1000ul SEL2(0xf91bd1b6ul)}} -#endif +# endif }; +#endif /* Lower-case digits. */ extern const char _itoa_lower_digits[]; @@ -201,6 +204,7 @@ _itoa_word (unsigned long value, char *buflim, #undef SPECIAL +#if LLONG_MAX != LONG_MAX char * _itoa (value, buflim, base, upper_case) unsigned long long int value; @@ -215,7 +219,7 @@ _itoa (value, buflim, base, upper_case) switch (base) { -#define RUN_2N(BITS) \ +# define RUN_2N(BITS) \ do \ { \ /* `unsigned long long int' always has 64 bits. */ \ @@ -270,7 +274,7 @@ _itoa (value, buflim, base, upper_case) default: { char *bufend = buflim; -#if BITS_PER_MP_LIMB == 64 +# if BITS_PER_MP_LIMB == 64 mp_limb_t base_multiplier = brec->base_multiplier; if (brec->flag) while (value != 0) @@ -294,8 +298,8 @@ _itoa (value, buflim, base, upper_case) *--buflim = digits[rem]; value = quo; } -#endif -#if BITS_PER_MP_LIMB == 32 +# endif +# if BITS_PER_MP_LIMB == 32 mp_limb_t t[3]; int n; @@ -303,11 +307,11 @@ _itoa (value, buflim, base, upper_case) Optimize for frequent cases of 32 bit numbers. */ if ((mp_limb_t) (value >> 32) >= 1) { -#if UDIV_TIME > 2 * UMUL_TIME || UDIV_NEEDS_NORMALIZATION +# if UDIV_TIME > 2 * UMUL_TIME || UDIV_NEEDS_NORMALIZATION int big_normalization_steps = brec->big.normalization_steps; mp_limb_t big_base_norm = brec->big.base << big_normalization_steps; -#endif +# endif if ((mp_limb_t) (value >> 32) >= brec->big.base) { mp_limb_t x1hi, x1lo, r; @@ -316,7 +320,7 @@ _itoa (value, buflim, base, upper_case) always be very small. It might be faster just to subtract in a tight loop. */ -#if UDIV_TIME > 2 * UMUL_TIME +# if UDIV_TIME > 2 * UMUL_TIME mp_limb_t x, xh, xl; if (big_normalization_steps == 0) @@ -341,7 +345,7 @@ _itoa (value, buflim, base, upper_case) udiv_qrnnd_preinv (t[0], x, xh, xl, big_base_norm, brec->big.base_ninv); t[1] = x >> big_normalization_steps; -#elif UDIV_NEEDS_NORMALIZATION +# elif UDIV_NEEDS_NORMALIZATION mp_limb_t x, xh, xl; if (big_normalization_steps == 0) @@ -363,17 +367,17 @@ _itoa (value, buflim, base, upper_case) xl = x1lo << big_normalization_steps; udiv_qrnnd (t[0], x, xh, xl, big_base_norm); t[1] = x >> big_normalization_steps; -#else +# else udiv_qrnnd (x1hi, r, 0, (mp_limb_t) (value >> 32), brec->big.base); udiv_qrnnd (x1lo, t[2], r, (mp_limb_t) value, brec->big.base); udiv_qrnnd (t[0], t[1], x1hi, x1lo, brec->big.base); -#endif +# endif n = 3; } else { -#if (UDIV_TIME > 2 * UMUL_TIME) +# if UDIV_TIME > 2 * UMUL_TIME mp_limb_t x; value <<= brec->big.normalization_steps; @@ -381,17 +385,17 @@ _itoa (value, buflim, base, upper_case) (mp_limb_t) value, big_base_norm, brec->big.base_ninv); t[1] = x >> brec->big.normalization_steps; -#elif UDIV_NEEDS_NORMALIZATION +# elif UDIV_NEEDS_NORMALIZATION mp_limb_t x; value <<= big_normalization_steps; udiv_qrnnd (t[0], x, (mp_limb_t) (value >> 32), (mp_limb_t) value, big_base_norm); t[1] = x >> big_normalization_steps; -#else +# else udiv_qrnnd (t[0], t[1], (mp_limb_t) (value >> 32), (mp_limb_t) value, brec->big.base); -#endif +# endif n = 2; } } @@ -407,7 +411,7 @@ _itoa (value, buflim, base, upper_case) mp_limb_t ti = t[--n]; int ndig_for_this_limb = 0; -#if UDIV_TIME > 2 * UMUL_TIME +# if UDIV_TIME > 2 * UMUL_TIME mp_limb_t base_multiplier = brec->base_multiplier; if (brec->flag) while (ti != 0) @@ -433,7 +437,7 @@ _itoa (value, buflim, base, upper_case) ti = quo; ++ndig_for_this_limb; } -#else +# else while (ti != 0) { mp_limb_t quo, rem; @@ -444,7 +448,7 @@ _itoa (value, buflim, base, upper_case) ti = quo; ++ndig_for_this_limb; } -#endif +# endif /* If this wasn't the most significant word, pad with zeros. */ if (n != 0) while (ndig_for_this_limb < brec->big.ndigits) @@ -454,7 +458,7 @@ _itoa (value, buflim, base, upper_case) } } while (n != 0); -#endif +# endif if (buflim == bufend) *--buflim = '0'; } @@ -463,6 +467,7 @@ _itoa (value, buflim, base, upper_case) return buflim; } +#endif char * _fitoa_word (unsigned long value, char *buf, unsigned int base, int upper_case) @@ -474,6 +479,7 @@ _fitoa_word (unsigned long value, char *buf, unsigned int base, int upper_case) return buf; } +#if LLONG_MAX != LONG_MAX char * _fitoa (unsigned long long value, char *buf, unsigned int base, int upper_case) { @@ -483,3 +489,4 @@ _fitoa (unsigned long long value, char *buf, unsigned int base, int upper_case) *buf++ = *cp++; return buf; } +#endif diff --git a/stdio-common/_itowa.c b/stdio-common/_itowa.c index b9cc341dd9..6f41d17f0e 100644 --- a/stdio-common/_itowa.c +++ b/stdio-common/_itowa.c @@ -1,5 +1,5 @@ /* Internal function for converting integers to ASCII. - Copyright (C) 1994,1995,1996,1999,2000,2002 Free Software Foundation, Inc. + Copyright (C) 1994-1996,1999,2000,2002,2007 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Torbjorn Granlund and Ulrich Drepper . @@ -85,6 +85,7 @@ extern const wchar_t _itowa_lower_digits[] attribute_hidden; extern const wchar_t _itowa_upper_digits[] attribute_hidden; +#if LLONG_MAX != LONG_MAX wchar_t * _itowa (value, buflim, base, upper_case) unsigned long long int value; @@ -99,7 +100,7 @@ _itowa (value, buflim, base, upper_case) switch (base) { -#define RUN_2N(BITS) \ +# define RUN_2N(BITS) \ do \ { \ /* `unsigned long long int' always has 64 bits. */ \ @@ -153,7 +154,7 @@ _itowa (value, buflim, base, upper_case) default: { -#if BITS_PER_MP_LIMB == 64 +# if BITS_PER_MP_LIMB == 64 mp_limb_t base_multiplier = brec->base_multiplier; if (brec->flag) while (value != 0) @@ -177,8 +178,8 @@ _itowa (value, buflim, base, upper_case) *--bp = digits[rem]; value = quo; } -#endif -#if BITS_PER_MP_LIMB == 32 +# endif +# if BITS_PER_MP_LIMB == 32 mp_limb_t t[3]; int n; @@ -186,11 +187,11 @@ _itowa (value, buflim, base, upper_case) Optimize for frequent cases of 32 bit numbers. */ if ((mp_limb_t) (value >> 32) >= 1) { -#if UDIV_TIME > 2 * UMUL_TIME || UDIV_NEEDS_NORMALIZATION +# if UDIV_TIME > 2 * UMUL_TIME || UDIV_NEEDS_NORMALIZATION int big_normalization_steps = brec->big.normalization_steps; mp_limb_t big_base_norm = brec->big.base << big_normalization_steps; -#endif +# endif if ((mp_limb_t) (value >> 32) >= brec->big.base) { mp_limb_t x1hi, x1lo, r; @@ -199,7 +200,7 @@ _itowa (value, buflim, base, upper_case) always be very small. It might be faster just to subtract in a tight loop. */ -#if UDIV_TIME > 2 * UMUL_TIME +# if UDIV_TIME > 2 * UMUL_TIME mp_limb_t x, xh, xl; if (big_normalization_steps == 0) @@ -224,7 +225,7 @@ _itowa (value, buflim, base, upper_case) udiv_qrnnd_preinv (t[0], x, xh, xl, big_base_norm, brec->big.base_ninv); t[1] = x >> big_normalization_steps; -#elif UDIV_NEEDS_NORMALIZATION +# elif UDIV_NEEDS_NORMALIZATION mp_limb_t x, xh, xl; if (big_normalization_steps == 0) @@ -246,17 +247,17 @@ _itowa (value, buflim, base, upper_case) xl = x1lo << big_normalization_steps; udiv_qrnnd (t[0], x, xh, xl, big_base_norm); t[1] = x >> big_normalization_steps; -#else +# else udiv_qrnnd (x1hi, r, 0, (mp_limb_t) (value >> 32), brec->big.base); udiv_qrnnd (x1lo, t[2], r, (mp_limb_t) value, brec->big.base); udiv_qrnnd (t[0], t[1], x1hi, x1lo, brec->big.base); -#endif +# endif n = 3; } else { -#if (UDIV_TIME > 2 * UMUL_TIME) +# if UDIV_TIME > 2 * UMUL_TIME mp_limb_t x; value <<= brec->big.normalization_steps; @@ -264,17 +265,17 @@ _itowa (value, buflim, base, upper_case) (mp_limb_t) value, big_base_norm, brec->big.base_ninv); t[1] = x >> brec->big.normalization_steps; -#elif UDIV_NEEDS_NORMALIZATION +# elif UDIV_NEEDS_NORMALIZATION mp_limb_t x; value <<= big_normalization_steps; udiv_qrnnd (t[0], x, (mp_limb_t) (value >> 32), (mp_limb_t) value, big_base_norm); t[1] = x >> big_normalization_steps; -#else +# else udiv_qrnnd (t[0], t[1], (mp_limb_t) (value >> 32), (mp_limb_t) value, brec->big.base); -#endif +# endif n = 2; } } @@ -290,7 +291,7 @@ _itowa (value, buflim, base, upper_case) mp_limb_t ti = t[--n]; int ndig_for_this_limb = 0; -#if UDIV_TIME > 2 * UMUL_TIME +# if UDIV_TIME > 2 * UMUL_TIME mp_limb_t base_multiplier = brec->base_multiplier; if (brec->flag) while (ti != 0) @@ -316,7 +317,7 @@ _itowa (value, buflim, base, upper_case) ti = quo; ++ndig_for_this_limb; } -#else +# else while (ti != 0) { mp_limb_t quo, rem; @@ -327,7 +328,7 @@ _itowa (value, buflim, base, upper_case) ti = quo; ++ndig_for_this_limb; } -#endif +# endif /* If this wasn't the most significant word, pad with zeros. */ if (n != 0) while (ndig_for_this_limb < brec->big.ndigits) @@ -337,10 +338,11 @@ _itowa (value, buflim, base, upper_case) } } while (n != 0); -#endif +# endif } break; } return bp; } +#endif -- cgit v1.2.3