diff --git a/benchmarks/pthread_benchmark.cpp b/benchmarks/pthread_benchmark.cpp index 621fcb624..c010dd2c0 100644 --- a/benchmarks/pthread_benchmark.cpp +++ b/benchmarks/pthread_benchmark.cpp @@ -18,11 +18,14 @@ #include +// Stop GCC optimizing out our pure function. +/* Must not be static! */ pthread_t (*pthread_self_fp)() = pthread_self; + static void BM_pthread_self(int iters) { StartBenchmarkTiming(); for (int i = 0; i < iters; ++i) { - pthread_self(); + pthread_self_fp(); } StopBenchmarkTiming(); diff --git a/benchmarks/unistd_benchmark.cpp b/benchmarks/unistd_benchmark.cpp index f2c9d73cf..c35e7c369 100644 --- a/benchmarks/unistd_benchmark.cpp +++ b/benchmarks/unistd_benchmark.cpp @@ -30,11 +30,14 @@ static void BM_unistd_getpid(int iters) { } BENCHMARK(BM_unistd_getpid); +// Stop GCC optimizing out our pure function. +/* Must not be static! */ pid_t (*gettid_fp)() = gettid; + static void BM_unistd_gettid(int iters) { StartBenchmarkTiming(); for (int i = 0; i < iters; ++i) { - gettid(); + gettid_fp(); } StopBenchmarkTiming(); diff --git a/libc/include/errno.h b/libc/include/errno.h index 2e5ce5f67..1a36b7aad 100644 --- a/libc/include/errno.h +++ b/libc/include/errno.h @@ -41,7 +41,7 @@ __BEGIN_DECLS #endif /* internal function returning the address of the thread-specific errno */ -extern volatile int* __errno(void); +extern volatile int* __errno(void) __pure2; /* a macro expanding to the errno l-value */ #define errno (*__errno()) diff --git a/libc/include/pthread.h b/libc/include/pthread.h index 5c9b6263e..29caafc6d 100644 --- a/libc/include/pthread.h +++ b/libc/include/pthread.h @@ -226,7 +226,7 @@ int pthread_rwlock_trywrlock(pthread_rwlock_t*) __nonnull((1)); int pthread_rwlock_unlock(pthread_rwlock_t *rwlock) __nonnull((1)); int pthread_rwlock_wrlock(pthread_rwlock_t*) __nonnull((1)); -pthread_t pthread_self(void); +pthread_t pthread_self(void) __pure2; int pthread_setname_np(pthread_t, const char*) __nonnull((2)); diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h index 483aaf027..0f862c379 100644 --- a/libc/include/stdlib.h +++ b/libc/include/stdlib.h @@ -138,21 +138,21 @@ typedef struct { int rem; } div_t; -extern div_t div(int, int); +extern div_t div(int, int) __pure2; typedef struct { long int quot; long int rem; } ldiv_t; -extern ldiv_t ldiv(long, long); +extern ldiv_t ldiv(long, long) __pure2; typedef struct { long long int quot; long long int rem; } lldiv_t; -extern lldiv_t lldiv(long long, long long); +extern lldiv_t lldiv(long long, long long) __pure2; /* BSD compatibility. */ extern const char* getprogname(void); diff --git a/libc/include/unistd.h b/libc/include/unistd.h index b4982cb0d..ee6d7b12e 100644 --- a/libc/include/unistd.h +++ b/libc/include/unistd.h @@ -54,7 +54,7 @@ extern __noreturn void _exit(int); extern pid_t fork(void); extern pid_t vfork(void); extern pid_t getpid(void); -extern pid_t gettid(void); +extern pid_t gettid(void) __pure2; extern pid_t getpgid(pid_t); extern int setpgid(pid_t, pid_t); extern pid_t getppid(void);