mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 23:36:40 +00:00
[sanitizer] Change NanoTime to use clock_gettime on non-glibc
This avoids the `__NR_gettimeofday` syscall number, which does not exist on 32-bit musl (it has `__NR_gettimeofday_time32`). This switched Android to `clock_gettime` as well, which should work according to the old code before D96925. Tested on Alpine Linux x86-64 (musl) and FreeBSD x86-64. Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D98121
This commit is contained in:
parent
c7712087cb
commit
aeaf705d5e
@ -489,24 +489,24 @@ int TgKill(pid_t pid, tid_t tid, int sig) {
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !SANITIZER_SOLARIS && !SANITIZER_NETBSD
|
||||
#if SANITIZER_GLIBC
|
||||
u64 NanoTime() {
|
||||
#if SANITIZER_FREEBSD
|
||||
timeval tv;
|
||||
#else
|
||||
kernel_timeval tv;
|
||||
#endif
|
||||
internal_memset(&tv, 0, sizeof(tv));
|
||||
internal_syscall(SYSCALL(gettimeofday), &tv, 0);
|
||||
return (u64)tv.tv_sec * 1000*1000*1000 + tv.tv_usec * 1000;
|
||||
return (u64)tv.tv_sec * 1000 * 1000 * 1000 + tv.tv_usec * 1000;
|
||||
}
|
||||
#endif // !SANITIZER_SOLARIS && !SANITIZER_NETBSD
|
||||
|
||||
#if SANITIZER_GLIBC
|
||||
// Used by real_clock_gettime.
|
||||
uptr internal_clock_gettime(__sanitizer_clockid_t clk_id, void *tp) {
|
||||
return internal_syscall(SYSCALL(clock_gettime), clk_id, tp);
|
||||
}
|
||||
#endif // SANITIZER_GLIBC
|
||||
#elif !SANITIZER_SOLARIS && !SANITIZER_NETBSD
|
||||
u64 NanoTime() {
|
||||
struct timespec ts;
|
||||
clock_gettime(CLOCK_REALTIME, &ts);
|
||||
return (u64)ts.tv_sec * 1000 * 1000 * 1000 + ts.tv_nsec;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Like getenv, but reads env directly from /proc (on Linux) or parses the
|
||||
// 'environ' array (on some others) and does not use libc. This function
|
||||
|
@ -829,13 +829,13 @@ u64 MonotonicNanoTime() {
|
||||
return (u64)ts.tv_sec * (1000ULL * 1000 * 1000) + ts.tv_nsec;
|
||||
}
|
||||
#else
|
||||
// Non-Linux & Go always use the regular function.
|
||||
// Non-glibc & Go always use the regular function.
|
||||
u64 MonotonicNanoTime() {
|
||||
timespec ts;
|
||||
clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||
return (u64)ts.tv_sec * (1000ULL * 1000 * 1000) + ts.tv_nsec;
|
||||
}
|
||||
#endif // SANITIZER_LINUX && !SANITIZER_GO
|
||||
#endif // SANITIZER_GLIBC && !SANITIZER_GO
|
||||
|
||||
void ReExec() {
|
||||
const char *pathname = "/proc/self/exe";
|
||||
|
Loading…
x
Reference in New Issue
Block a user