Patch for PR target/32277 - IA64 profiling bug

Steve Ellcey sje@cup.hp.com
Mon Oct 13 18:43:00 GMT 2008


This patch to fix PR 32277 is based on Andreas Schwab's fix.  I just changed
it do test the TARGET_VTABLE_USES_DESCRIPTORS macro instead of using the
__ia64__ macro.  This macro is only true for IA64 and it is set to 0 by
default in defaults.h so it always has a value.

The idea is that if you have function descriptors in your vtable then
you could have two different descriptors pointing to the same function
and you need to look at the function pointer inside the descriptor to
see if the pointers being passed into __gcov_indirect_call_profiler
point to the same function or not.

Tested on IA64 HP-UX and Linux with no regressions.

OK for checkin?

Steve Ellcey
sje@cup.hp.com


2008-10-13  Steve Ellcey  <sje@cup.hp.com>

	PR target/32277
	* libgcov.c ( __gcov_indirect_call_profiler): Check
	TARGET_VTABLE_USES_DESCRIPTORS.


Index: libgcov.c
===================================================================
--- libgcov.c	(revision 141083)
+++ libgcov.c	(working copy)
@@ -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



More information about the Gcc-patches mailing list