summaryrefslogtreecommitdiff
path: root/sysdeps/posix
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/posix')
-rw-r--r--sysdeps/posix/profil.c15
-rw-r--r--sysdeps/posix/sprofil.c25
2 files changed, 27 insertions, 13 deletions
diff --git a/sysdeps/posix/profil.c b/sysdeps/posix/profil.c
index 838c36d060..e9ee3e3560 100644
--- a/sysdeps/posix/profil.c
+++ b/sysdeps/posix/profil.c
@@ -21,6 +21,7 @@
#include <errno.h>
#include <signal.h>
#include <sys/time.h>
+#include <stdint.h>
#include <libc-internal.h>
#include <sigsetops.h>
@@ -36,9 +37,9 @@ static size_t pc_offset;
static u_int pc_scale;
static inline void
-profil_count (void *pc)
+profil_count (uintptr_t pc)
{
- size_t i = (pc - pc_offset - (void *) 0) / 2;
+ size_t i = (pc - pc_offset) / 2;
if (sizeof (unsigned long long int) > sizeof (size_t))
i = (unsigned long long int) i * pc_scale / 65536;
@@ -104,8 +105,14 @@ __profil (u_short *sample_buffer, size_t size, size_t offset, u_int scale)
pc_offset = offset;
pc_scale = scale;
- act.sa_handler = (sighandler_t) &__profil_counter;
- act.sa_flags = SA_RESTART;
+#ifdef SA_SIGINFO
+ act.sa_sigaction = __profil_counter;
+ act.sa_flags = SA_SIGINFO;
+#else
+ act.sa_handler = __profil_counter;
+ act.sa_flags = 0;
+#endif
+ act.sa_flags |= SA_RESTART;
__sigfillset (&act.sa_mask);
if (__sigaction (SIGPROF, &act, oact_ptr) < 0)
return -1;
diff --git a/sysdeps/posix/sprofil.c b/sysdeps/posix/sprofil.c
index 3f76bf5174..a9d4a7f3b4 100644
--- a/sysdeps/posix/sprofil.c
+++ b/sysdeps/posix/sprofil.c
@@ -105,10 +105,10 @@ index_to_pc (unsigned long int n, size_t offset, unsigned int scale,
}
static void
-profil_count (void *pcp, int prof_uint)
+profil_count (uintptr_t pcp, int prof_uint)
{
struct region *region, *r = prof_info.last;
- size_t lo, hi, mid, pc = (unsigned long int) pcp;
+ size_t lo, hi, mid, pc = pcp;
unsigned long int i;
/* Fast path: pc is in same region as before. */
@@ -165,13 +165,13 @@ profil_count (void *pcp, int prof_uint)
}
static inline void
-profil_count_ushort (void *pcp)
+profil_count_ushort (uintptr_t pcp)
{
profil_count (pcp, 0);
}
static inline void
-profil_count_uint (void *pcp)
+profil_count_uint (uintptr_t pcp)
{
profil_count (pcp, 1);
}
@@ -334,11 +334,18 @@ __sprofil (struct prof *profp, int profcnt, struct timeval *tvp,
prof_info.last = prof_info.region;
/* Install SIGPROF handler. */
- if (flags & PROF_UINT)
- act.sa_handler = (sighandler_t) &__profil_counter_uint;
- else
- act.sa_handler = (sighandler_t) &__profil_counter_ushort;
- act.sa_flags = SA_RESTART;
+#ifdef SA_SIGINFO
+ act.sa_sigaction= flags & PROF_UINT
+ ? __profil_counter_uint
+ : __profil_counter_ushort;
+ act.sa_flags = SA_SIGINFO;
+#else
+ act.sa_handler = flags & PROF_UINT
+ ? (sighandler_t) __profil_counter_uint
+ : (sighandler_t) __profil_counter_ushort;
+ act.sa_flags = 0;
+#endif
+ act.sa_flags |= SA_RESTART;
__sigfillset (&act.sa_mask);
if (__sigaction (SIGPROF, &act, &prof_info.saved_action) < 0)
return -1;