summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmil Velikov <[email protected]>2016-05-24 16:23:09 +0100
committerEmil Velikov <[email protected]>2016-05-24 20:21:31 +0100
commit7e196cd1708bfe567454269bba7bc3f7b75364dc (patch)
tree49b265adbb75515cd6bccaa60c9592f7b4808f59
parent0ceed1701de6ffc40fb60fbff87c81e492fb18e0 (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.ac1
-rw-r--r--include/c11/threads_posix.h26
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)