PR target/32277
authorsje <sje@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 29 Oct 2008 19:46:16 +0000 (19:46 +0000)
committersje <sje@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 29 Oct 2008 19:46:16 +0000 (19:46 +0000)
* libgcov.c ( __gcov_indirect_call_profiler): Check
TARGET_VTABLE_USES_DESCRIPTORS.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@141442 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/libgcov.c

index bf3467d..c064c10 100644 (file)
@@ -1,3 +1,9 @@
+2008-10-29  Steve Ellcey  <sje@cup.hp.com>
+
+       PR target/32277
+       * libgcov.c ( __gcov_indirect_call_profiler): Check
+       TARGET_VTABLE_USES_DESCRIPTORS.
+
 2008-10-29  Stefan Schulze Frielinghaus  <xxschulz@de.ibm.com>
 
        * config/spu/spu.h (FRAME_GROWS_DOWNWARD): Define.
index 04fc3b2..5abceae 100644 (file)
@@ -777,7 +777,12 @@ void
 __gcov_indirect_call_profiler (gcov_type* counter, gcov_type value, 
                               void* cur_func, void* callee_func)
 {
-  if (cur_func == callee_func)
+  /* If the C++ virtual tables contain function descriptors then one
+     function may have multiple descriptors and we need to dereference
+     the descriptors to see if they point to the same function.  */
+  if (cur_func == callee_func
+      || (TARGET_VTABLE_USES_DESCRIPTORS && callee_func
+         && *(void **) cur_func == *(void **) callee_func))
     __gcov_one_value_profiler_body (counter, value);
 }
 #endif