about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/ia64/profil-counter.h
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/ia64/profil-counter.h')
-rw-r--r--sysdeps/unix/sysv/linux/ia64/profil-counter.h7
1 files changed, 6 insertions, 1 deletions
diff --git a/sysdeps/unix/sysv/linux/ia64/profil-counter.h b/sysdeps/unix/sysv/linux/ia64/profil-counter.h
index 1cc0390b8f..a3e501dd89 100644
--- a/sysdeps/unix/sysv/linux/ia64/profil-counter.h
+++ b/sysdeps/unix/sysv/linux/ia64/profil-counter.h
@@ -23,5 +23,10 @@
 static void
 profil_counter (int signr, int code, struct sigcontext *scp)
 {
-  profil_count ((void *) scp->sc_ip);
+  unsigned long ip = scp->sc_ip & ~0X3ULL, slot = scp->sc_ip & 0x3ull;
+
+  /* Note: Linux/ia64 encodes the slot number in bits 0 and 1.  We
+     want to multiply the slot number by four so we can use bins of
+     width 4 to get accurate instruction-level profiling.  */
+  profil_count ((void *) (ip + 4*slot));
 }