diff options
Diffstat (limited to 'sysdeps/posix')
-rw-r--r-- | sysdeps/posix/profil.c | 15 | ||||
-rw-r--r-- | sysdeps/posix/sprofil.c | 25 |
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; |