vapier 16/01/13 15:31:43 Modified: README.history Added: 44_all_gcc-log2-static-inline.patch Log: backport static inline fix to fix building w/newer compilers
Revision Changes Path 1.14 src/patchsets/gcc/4.4.7/gentoo/README.history file : http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/gcc/4.4.7/gentoo/README.history?rev=1.14&view=markup plain: http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/gcc/4.4.7/gentoo/README.history?rev=1.14&content-type=text/plain diff : http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/gcc/4.4.7/gentoo/README.history?r1=1.13&r2=1.14 Index: README.history =================================================================== RCS file: /var/cvsroot/gentoo/src/patchsets/gcc/4.4.7/gentoo/README.history,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- README.history 13 Jan 2016 04:59:27 -0000 1.13 +++ README.history 13 Jan 2016 15:31:43 -0000 1.14 @@ -1,8 +1,9 @@ -1.3 [pending] +1.3 13 Jan 2016 - 00_all_gcc-trampolinewarn.patch - 10_all_gcc-default-format-security.patch + 18_all_libgcc-cross-canadian.patch + 34_all_libjava-classpath-locale-sort.patch + + 44_all_gcc-log2-static-inline.patch 1.2 19 Apr 2013 + 30_all_gcc-4.4_arm_armv4-no-thumb-fix-link.patch 1.1 src/patchsets/gcc/4.4.7/gentoo/44_all_gcc-log2-static-inline.patch file : http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/gcc/4.4.7/gentoo/44_all_gcc-log2-static-inline.patch?rev=1.1&view=markup plain: http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/gcc/4.4.7/gentoo/44_all_gcc-log2-static-inline.patch?rev=1.1&content-type=text/plain Index: 44_all_gcc-log2-static-inline.patch =================================================================== https://gcc.gnu.org/ml/gcc-patches/2009-06/msg01234.html >From 4345dfaa7260253cb0d3b10b4b466f586e9d28dc Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor <[email protected]> Date: Tue, 16 Jun 2009 16:55:41 +0000 Subject: [PATCH] Make exact_log2 and floor_log2 static inline The functions exact_log2 and floor_log2 are defined in toplev.h and toplev.c as GNU89 extern inline functions. This does not work right with C++ or with C99. For C99 we could use the gnu_inline attribute, but there is really no advantage to doing so. This patch changes floor_log2 and exact_log2 to be static inline. The definitions in toplev.c are only provided if the static inline functions are not defined, which is to say when compiling with a non-gcc compiler or with gcc pre 3.4. This simplifies the code overall. Bootstrapped and tested on x86_64-unknown-linux-gnu. Committed. 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/toplev.c b/gcc/toplev.c index 267df59..4836238 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 e62aa727..cca6867 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.6.2
