diff options
author | Emil Velikov <[email protected]> | 2016-05-24 16:23:09 +0100 |
---|---|---|
committer | Emil Velikov <[email protected]> | 2016-05-24 20:21:31 +0100 |
commit | 7e196cd1708bfe567454269bba7bc3f7b75364dc (patch) | |
tree | 49b265adbb75515cd6bccaa60c9592f7b4808f59 | |
parent | 0ceed1701de6ffc40fb60fbff87c81e492fb18e0 (diff) |
c11/threads: resolve link issues with -O0
Add weak symbol notation for the pthread_mutexattr* symbols, thus making
the linker happy. When building with -O1 or greater the optimiser will
kick in and remove the said functions as they are dead/unreachable code.
Ideally we'll enable the optimisations locally, yet that does not seem
to work atm.
v2: Add the AX_GCC_FUNC_ATTRIBUTE([weak]) hunk in configure.
Cc: Alejandro PiƱeiro <[email protected]>
Cc: Ben Widawsky <[email protected]>
Cc: Ilia Mirkin <[email protected]>
Cc: Rob Herring <[email protected]>
Signed-off-by: Emil Velikov <[email protected]>
Tested-by: Rob Clark <[email protected]>
Tested-by: Mark Janes <[email protected]>
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | include/c11/threads_posix.h | 26 |
2 files changed, 27 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac index 47c138a6277..fc0b1db2eb5 100644 --- a/configure.ac +++ b/configure.ac @@ -233,6 +233,7 @@ AX_GCC_FUNC_ATTRIBUTE([pure]) AX_GCC_FUNC_ATTRIBUTE([returns_nonnull]) AX_GCC_FUNC_ATTRIBUTE([unused]) AX_GCC_FUNC_ATTRIBUTE([warn_unused_result]) +AX_GCC_FUNC_ATTRIBUTE([weak]) AM_CONDITIONAL([GEN_ASM_OFFSETS], test "x$GEN_ASM_OFFSETS" = xyes) diff --git a/include/c11/threads_posix.h b/include/c11/threads_posix.h index 11d36e46239..61b7fabf637 100644 --- a/include/c11/threads_posix.h +++ b/include/c11/threads_posix.h @@ -169,6 +169,32 @@ mtx_destroy(mtx_t *mtx) pthread_mutex_destroy(mtx); } +/* + * XXX: Workaround when building with -O0 and without pthreads link. + * + * In such cases constant folding and dead code elimination won't be + * available, thus the compiler will always add the pthread_mutexattr* + * functions into the binary. As we try to link, we'll fail as the + * symbols are unresolved. + * + * Ideally we'll enable the optimisations locally, yet that does not + * seem to work. + * + * So the alternative workaround is to annotate the symbols as weak. + * Thus the linker will be happy and things don't clash when building + * with -O1 or greater. + */ +#ifdef HAVE_FUNC_ATTRIBUTE_WEAK +__attribute__((weak)) +int pthread_mutexattr_init(pthread_mutexattr_t *attr); + +__attribute__((weak)) +int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type); + +__attribute__((weak)) +int pthread_mutexattr_destroy(pthread_mutexattr_t *attr); +#endif + // 7.25.4.2 static inline int mtx_init(mtx_t *mtx, int type) |