http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55734



--- Comment #13 from Teresa Johnson <tejohnson at google dot com> 2012-12-19 
06:49:50 UTC ---

On Tue, Dec 18, 2012 at 2:48 PM, Teresa Johnson <tejohn...@google.com> wrote:

>

>

>

>

> On Tue, Dec 18, 2012 at 2:41 PM, aldyh at gcc dot gnu.org 
> <gcc-bugzi...@gcc.gnu.org> wrote:

>>

>>

>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55734

>>

>> --- Comment #11 from Aldy Hernandez <aldyh at gcc dot gnu.org> 2012-12-18 
>> 22:41:13 UTC ---

>> Teresa, I think this is what you were referring to, and the reason for my

>> original patch:

>>

>> houston:/build/trunkboot$ ./install/bin/gcc a.c -fprofile-generate

>> /home/build/trunkboot/install/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.8.0/libgcov.a(_gcov.o):

>> In function `gcov_histo_index':

>> libgcov.c:(.text+0x213): undefined reference to `clz_hwi'

>> /home/build/trunkboot/install/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.8.0/libgcov.a(_gcov.o):

>> In function `__gcov_read_summary':

>> libgcov.c:(.text+0x7f3): undefined reference to `popcount_hwi'

>> collect2: error: ld returned 1 exit status

>

>

> Yep. I've got a patch in the works that is a slightly simplified version of 
> what you did. I'll send that a little later today once I get it tested.





Here is the patch. I am doing some final regression testing on it, but

earlier testing and my own testing looked good. It is similar to what

Aldy did, pulling some of the hwi routines into a new hwint-helper.c

file. However, in this case, it is included normally into hwint.c, and

the routines are only pulled in as static copies to gcov-io.c when we

are building libgcov.a (in other cases gcov-io.c is being built when

system.h is included, which includes hwint.h already). In the case of

libgcov.a, I also had to add support for the fact that the HOST_*

variables that were being used in the hwint routines are not defined.



Richard, let me know if this looks like a reasonable approach. The

only other solution I had was to simply inline copies of popcount_hwi

and clz_hwi into gcov-io.c when we are building libgcov.a.



Thanks,

Teresa



2012-12-18  Teresa Johnson  <tejohn...@google.com>

            Aldy Hernandez  <al...@redhat.com>



* hwint-helper.c (floor_log2): Moved from hwint.c

(ceil_log2): Ditto.

(exact_log2): Ditto.

(ctz_hwi): Ditto.

(clz_hwi): Ditto.

(ffs_hwi): Ditto.

(popcount_hwi): Ditto.

* gcov-io.c (gcov_read_summary): Invoke popcount_hwi.

(gcov_histo_index): Invoke clz_hwi.

* Makefile.in (hwint.o): Depend on hwint-helper.c

* hwint.c (floor_log2): Moved to hwint-helper.c

(ceil_log2): Ditto.

(exact_log2): Ditto.

(ctz_hwi): Ditto.

(clz_hwi): Ditto.

(ffs_hwi): Ditto.

(popcount_hwi): Ditto.



Index: hwint-helper.c

===================================================================

--- hwint-helper.c (revision 0)

+++ hwint-helper.c (revision 0)

@@ -0,0 +1,130 @@

+/* Supporting bit functions for older versions of GCC, and non-GCC

+   bootstrap compilers.

+

+   Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,

+   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,

+   2012 Free Software Foundation, Inc.

+

+This file is part of GCC.

+

+GCC is free software; you can redistribute it and/or modify it under

+the terms of the GNU General Public License as published by the Free

+Software Foundation; either version 3, or (at your option) any later

+version.

+

+GCC is distributed in the hope that it will be useful, but WITHOUT ANY

+WARRANTY; without even the implied warranty of MERCHANTABILITY or

+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License

+for more details.

+

+Under Section 7 of GPL version 3, you are granted additional

+permissions described in the GCC Runtime Library Exception, version

+3.1, as published by the Free Software Foundation.

+

+You should have received a copy of the GNU General Public License and

+a copy of the GCC Runtime Library Exception along with this program;

+see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see

+<http://www.gnu.org/licenses/>.  */

+

+#if GCC_VERSION < 3004

+

+/* The functions clz_hwi, ctz_hwi, ffs_hwi, floor_log2, ceil_log2,

+   and exact_log2 are defined as inline functions in hwint.h

+   if GCC_VERSION >= 3004.

+   The definitions here are used for older versions of GCC and

+   non-GCC bootstrap compilers.  */

+

+/* Given X, an unsigned number, return the largest int Y such that 2**Y <= X.

+   If X is 0, return -1.  */

+

+HWINT_LINKAGE int

+floor_log2 (HWINT_TYPE x)

+{

+  int t = 0;

+

+  if (x == 0)

+    return -1;

+

+  if (HWINT_TYPE_SIZE > 64)

+    if (x >= (HWINT_TYPE) 1 << (t + 64))

+      t += 64;

+  if (HWINT_TYPE_SIZE > 32)

+    if (x >= ((HWINT_TYPE) 1) << (t + 32))

+      t += 32;

+  if (x >= ((HWINT_TYPE) 1) << (t + 16))

+    t += 16;

+  if (x >= ((HWINT_TYPE) 1) << (t + 8))

+    t += 8;

+  if (x >= ((HWINT_TYPE) 1) << (t + 4))

+    t += 4;

+  if (x >= ((HWINT_TYPE) 1) << (t + 2))

+    t += 2;

+  if (x >= ((HWINT_TYPE) 1) << (t + 1))

+    t += 1;

+

+  return t;

+}

+

+/* Given X, an unsigned number, return the largest Y such that 2**Y >= X.  */

+

+HWINT_LINKAGE int

+ceil_log2 (HWINT_TYPE x)

+{

+  return floor_log2 (x - 1) + 1;

+}

+

+/* Return the logarithm of X, base 2, considering X unsigned,

+   if X is a power of 2.  Otherwise, returns -1.  */

+

+HWINT_LINKAGE int

+exact_log2 (HWINT_TYPE x)

+{

+  if (x != (x & -x))

+    return -1;

+  return floor_log2 (x);

+}

+

+/* Given X, an unsigned number, return the number of least significant bits

+   that are zero.  When X == 0, the result is the word size.  */

+

+HWINT_LINKAGE int

+ctz_hwi (HWINT_TYPE x)

+{

+  return x ? floor_log2 (x & -x) : HWINT_TYPE_SIZE;

+}

+

+/* Similarly for most significant bits.  */

+

+HWINT_LINKAGE int

+clz_hwi (HWINT_TYPE x)

+{

+  return HWINT_TYPE_SIZE - 1 - floor_log2 (x);

+}

+

+/* Similar to ctz_hwi, except that the least significant bit is numbered

+   starting from 1, and X == 0 yields 0.  */

+

+HWINT_LINKAGE int

+ffs_hwi (HWINT_TYPE x)

+{

+  return 1 + floor_log2 (x & -x);

+}

+

+/* Return the number of set bits in X.  */

+

+HWINT_LINKAGE int

+popcount_hwi (HWINT_TYPE x)

+{

+  int i, ret = 0;

+  size_t bits = sizeof (x) * CHAR_BIT;

+

+  for (i = 0; i < (int)bits; i += 1)

+    {

+      ret += x & 1;

+      x >>= 1;

+    }

+

+  return ret;

+}

+

+#endif /* GCC_VERSION < 3004 */

Index: gcov-io.c

===================================================================

--- gcov-io.c (revision 194585)

+++ gcov-io.c (working copy)

@@ -517,6 +517,18 @@ gcov_read_string (void)

 }

 #endif



+#if IN_LIBGCOV

+#if GCC_VERSION < 3004

+#define HWINT_LINKAGE inline static

+#define HWINT_TYPE gcov_type_unsigned

+#define HWINT_TYPE_SIZE LONG_LONG_TYPE_SIZE

+#include "hwint-helper.c"

+#else

+#define popcount_hwi __builtin_popcountll

+#define clz_hwi __builtin_clzll

+#endif

+#endif

+

 GCOV_LINKAGE void

 gcov_read_summary (struct gcov_summary *summary)

 {

@@ -538,7 +550,7 @@ gcov_read_summary (struct gcov_summary *summary)

       for (bv_ix = 0; bv_ix < GCOV_HISTOGRAM_BITVECTOR_SIZE; bv_ix++)

         {

           histo_bitvector[bv_ix] = gcov_read_unsigned ();

-          h_cnt += __builtin_popcountll (histo_bitvector[bv_ix]);

+          h_cnt += popcount_hwi (histo_bitvector[bv_ix]);

         }

       bv_ix = 0;

       h_ix = 0;

@@ -642,7 +654,7 @@ gcov_histo_index (gcov_type value)



   /* Find the place of the most-significant bit set.  */

   if (v > 0)

-    r = 63 - __builtin_clzll (v);

+    r = 63 - clz_hwi (v);



   /* If at most the 2 least significant bits are set (value is

      0 - 3) then that value is our index into the lowest set of

Index: Makefile.in

===================================================================

--- Makefile.in (revision 194585)

+++ Makefile.in (working copy)

@@ -2701,7 +2701,7 @@ toplev.o : toplev.c $(CONFIG_H) $(SYSTEM_H) corety

    $(TREE_PRETTY_PRINT_H) opts-diagnostic.h $(COMMON_TARGET_H) \

    tsan.h



-hwint.o : hwint.c $(CONFIG_H) $(SYSTEM_H) $(DIAGNOSTIC_CORE_H)
+hwint.o : hwint.c $(CONFIG_H) $(SYSTEM_H) $(DIAGNOSTIC_CORE_H) hwint-helper.c



 passes.o : passes.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \

    $(RTL_H) $(FUNCTION_H) $(FLAGS_H) $(INPUT_H) $(INSN_ATTR_H) output.h \

Index: hwint.c

===================================================================

--- hwint.c (revision 194585)

+++ hwint.c (working copy)

@@ -23,109 +23,11 @@ along with GCC; see the file COPYING3.  If not see

 #include "system.h"

 #include "diagnostic-core.h"



-#if GCC_VERSION < 3004

+#define HWINT_LINKAGE

+#define HWINT_TYPE unsigned HOST_WIDE_INT

+#define HWINT_TYPE_SIZE HOST_BITS_PER_WIDE_INT

+#include "hwint-helper.c"



-/* The functions clz_hwi, ctz_hwi, ffs_hwi, floor_log2, ceil_log2,

-   and exact_log2 are defined as inline functions in hwint.h

-   if GCC_VERSION >= 3004.

-   The definitions here are used for older versions of GCC and

-   non-GCC bootstrap compilers.  */

-

-/* Given X, an unsigned number, return the largest int Y such that 2**Y <= X.

-   If X is 0, return -1.  */

-

-int

-floor_log2 (unsigned HOST_WIDE_INT x)

-{

-  int t = 0;

-

-  if (x == 0)

-    return -1;

-

-  if (HOST_BITS_PER_WIDE_INT > 64)

-    if (x >= (unsigned HOST_WIDE_INT) 1 << (t + 64))

-      t += 64;

-  if (HOST_BITS_PER_WIDE_INT > 32)

-    if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 32))

-      t += 32;

-  if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 16))

-    t += 16;

-  if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 8))

-    t += 8;

-  if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 4))

-    t += 4;

-  if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 2))

-    t += 2;

-  if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 1))

-    t += 1;

-

-  return t;

-}

-

-/* Given X, an unsigned number, return the largest Y such that 2**Y >= X.  */

-

-int

-ceil_log2 (unsigned HOST_WIDE_INT x)

-{

-  return floor_log2 (x - 1) + 1;

-}

-

-/* Return the logarithm of X, base 2, considering X unsigned,

-   if X is a power of 2.  Otherwise, returns -1.  */

-

-int

-exact_log2 (unsigned HOST_WIDE_INT x)

-{

-  if (x != (x & -x))

-    return -1;

-  return floor_log2 (x);

-}

-

-/* Given X, an unsigned number, return the number of least significant bits

-   that are zero.  When X == 0, the result is the word size.  */

-

-int

-ctz_hwi (unsigned HOST_WIDE_INT x)

-{

-  return x ? floor_log2 (x & -x) : HOST_BITS_PER_WIDE_INT;

-}

-

-/* Similarly for most significant bits.  */

-

-int

-clz_hwi (unsigned HOST_WIDE_INT x)

-{

-  return HOST_BITS_PER_WIDE_INT - 1 - floor_log2(x);

-}

-

-/* Similar to ctz_hwi, except that the least significant bit is numbered

-   starting from 1, and X == 0 yields 0.  */

-

-int

-ffs_hwi (unsigned HOST_WIDE_INT x)

-{

-  return 1 + floor_log2 (x & -x);

-}

-

-/* Return the number of set bits in X.  */

-

-int

-popcount_hwi (unsigned HOST_WIDE_INT x)

-{

-  int i, ret = 0;

-  size_t bits = sizeof (x) * CHAR_BIT;

-

-  for (i = 0; i < bits; i += 1)

-    {

-      ret += x & 1;

-      x >>= 1;

-    }

-

-  return ret;

-}

-

-#endif /* GCC_VERSION < 3004 */

-

 /* Compute the absolute value of X.  */



 HOST_WIDE_INT



>

> Teresa

>>

>>

>> --

>> Configure bugmail: http://gcc.gnu.org/bugzilla/userprefs.cgi?tab=email

>> ------- You are receiving this mail because: -------

>> You are on the CC list for the bug.

>

>

>

>

> --

> Teresa Johnson | Software Engineer |  tejohn...@google.com |  408-460-2413

>







--

Teresa Johnson | Software Engineer |  tejohn...@google.com |  408-460-2413

Reply via email to