summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configure.ac4
-rw-r--r--m4/check_tls_gcc_arm_bug.m429
2 files changed, 33 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac
index d717a0bb..3764e29e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -122,6 +122,10 @@ AC_DEFUN([CHECK_TM_INCLUDES_TM_GMTOFF], [
CHECK_TM_INCLUDES_TM_GMTOFF
+dnl Check if We need to apply workaround for TLS bug on ARM platform for GCC < 7.3.0:
+CHECK_TLS_GCC_ARM_BUG
+CFLAGS="$CFLAGS $TLS_GCC_ARM_BUG_CFLAGS"
+
dnl Generate the output
AC_CONFIG_HEADER(config.h)
diff --git a/m4/check_tls_gcc_arm_bug.m4 b/m4/check_tls_gcc_arm_bug.m4
new file mode 100644
index 00000000..73b3e957
--- /dev/null
+++ b/m4/check_tls_gcc_arm_bug.m4
@@ -0,0 +1,29 @@
+# OS#4062 (https://osmocom.org/issues/4062)
+# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81142
+# SYS#4628
+
+# Check if We need to apply workaround for TLS bug on ARM platform for GCC < 7.3.0.
+# TLS_GCC_ARM_BUG_CFLAGS is filled with required workaround bits if needed.
+
+AC_DEFUN([CHECK_TLS_GCC_ARM_BUG], [
+ TLS_GCC_ARM_BUG_CFLAGS=""
+ AC_MSG_CHECKING([whether to workaround TLS bug in old gcc on ARM platforms])
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+ [[
+ #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+ /* Check for ARM 32 bit and gcc smaller than 7.3.0 */
+ /* We need to explicitly exclude GNUC compatible compilers, since they also define GNUC related tokens */
+ #if __arm__ && \
+ !defined(__clang__) && !defined(__llvm__) && !defined(__INTEL_COMPILER) && \
+ defined(__GNUC__) && GCC_VERSION < 70300
+ #error TLS bug present!
+ #endif
+ ]])],
+ [tls_bug_present=no],
+ [tls_bug_present=yes])
+ AS_IF([test "x$tls_bug_present" = "xyes"],[
+ TLS_GCC_ARM_BUG_CFLAGS="-mtls-dialect=gnu2"
+ ])
+ AC_SUBST([TLS_GCC_ARM_BUG_CFLAGS])
+ AC_MSG_RESULT([$TLS_GCC_ARM_BUG_CFLAGS])
+])