From 4345dfaa7260253cb0d3b10b4b466f586e9d28dc Mon Sep 17 00:00:00 2001 From: ian Date: Tue, 16 Jun 2009 16:55:41 +0000 Subject: [PATCH] * toplev.h (floor_log2): If GCC_VERSION >= 3004, declare as static inline, not extern inline. (exact_log2): Likewise. * toplev.c (floor_log2): Only define if GCC_VERSION < 3004. Don't test CLZ_HWI. (exact_log2): Likewise, but don't test CTZ_HWI. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@148540 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 9 +++++++++ gcc/toplev.c | 18 +++++------------- gcc/toplev.h | 12 ++++++++---- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 794442cc1e8..e87c4feb33f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 2009-06-16 Ian Lance Taylor + * toplev.h (floor_log2): If GCC_VERSION >= 3004, declare as static + inline, not extern inline. + (exact_log2): Likewise. + * toplev.c (floor_log2): Only define if GCC_VERSION < 3004. Don't + test CLZ_HWI. + (exact_log2): Likewise, but don't test CTZ_HWI. + +2009-06-16 Ian Lance Taylor + * bitmap.c (bitmap_clear): Don't declare as inline. * gimple.c (gimplify_assign): Likewise. * tree-ssa-sccvn.c (vn_nary_op_compute_hash): Likewise. diff --git a/gcc/toplev.c b/gcc/toplev.c index 267df5906ec..483623882bf 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -532,11 +532,11 @@ read_integral_parameter (const char *p, const char *pname, const int defval) return atoi (p); } -/* When compiling with a recent enough GCC, we use the GNU C "extern inline" - for floor_log2 and exact_log2; see toplev.h. That construct, however, - conflicts with the ISO C++ One Definition Rule. */ +#if GCC_VERSION < 3004 -#if GCC_VERSION < 3004 || !defined (__cplusplus) +/* The functions floor_log2 and exact_log2 are defined as inline + functions in toplev.h if GCC_VERSION >= 3004. The definitions here + are used for older versions of gcc. */ /* Given X, an unsigned number, return the largest int Y such that 2**Y <= X. If X is 0, return -1. */ @@ -549,9 +549,6 @@ floor_log2 (unsigned HOST_WIDE_INT x) if (x == 0) return -1; -#ifdef CLZ_HWI - t = HOST_BITS_PER_WIDE_INT - 1 - (int) CLZ_HWI (x); -#else if (HOST_BITS_PER_WIDE_INT > 64) if (x >= (unsigned HOST_WIDE_INT) 1 << (t + 64)) t += 64; @@ -568,7 +565,6 @@ floor_log2 (unsigned HOST_WIDE_INT x) t += 2; if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 1)) t += 1; -#endif return t; } @@ -581,14 +577,10 @@ exact_log2 (unsigned HOST_WIDE_INT x) { if (x != (x & -x)) return -1; -#ifdef CTZ_HWI - return x ? CTZ_HWI (x) : -1; -#else return floor_log2 (x); -#endif } -#endif /* GCC_VERSION < 3004 || !defined (__cplusplus) */ +#endif /* GCC_VERSION < 3004 */ /* Handler for fatal signals, such as SIGSEGV. These are transformed into ICE messages, which is much more user friendly. In case the diff --git a/gcc/toplev.h b/gcc/toplev.h index e62aa727606..cca68675f87 100644 --- a/gcc/toplev.h +++ b/gcc/toplev.h @@ -169,14 +169,17 @@ extern void decode_d_option (const char *); extern bool fast_math_flags_set_p (void); extern bool fast_math_flags_struct_set_p (struct cl_optimization *); +/* Inline versions of the above for speed. */ +#if GCC_VERSION < 3004 + /* Return log2, or -1 if not exact. */ extern int exact_log2 (unsigned HOST_WIDE_INT); /* Return floor of log2, with -1 for zero. */ extern int floor_log2 (unsigned HOST_WIDE_INT); -/* Inline versions of the above for speed. */ -#if GCC_VERSION >= 3004 +#else /* GCC_VERSION >= 3004 */ + # if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG # define CLZ_HWI __builtin_clzl # define CTZ_HWI __builtin_ctzl @@ -188,17 +191,18 @@ extern int floor_log2 (unsigned HOST_WIDE_INT); # define CTZ_HWI __builtin_ctz # endif -extern inline int +static inline int floor_log2 (unsigned HOST_WIDE_INT x) { return x ? HOST_BITS_PER_WIDE_INT - 1 - (int) CLZ_HWI (x) : -1; } -extern inline int +static inline int exact_log2 (unsigned HOST_WIDE_INT x) { return x == (x & -x) && x ? (int) CTZ_HWI (x) : -1; } + #endif /* GCC_VERSION >= 3004 */ /* Functions used to get and set GCC's notion of in what directory -- 2.11.4.GIT