Auto-enable TLSDESC support
authorAlex Xu (Hello71) <alex_y_xu@yahoo.ca>
Thu, 2 Sep 2021 16:19:53 +0000 (12:19 -0400)
committerAlex Xu (Hello71) <alex_y_xu@yahoo.ca>
Sat, 20 Nov 2021 16:57:40 +0000 (11:57 -0500)
TLSDESC speeds up access to dynamic TLS. This is especially important
for non-glibc targets, but is also helpful for non-initial-exec TLS
variables.

The entry asm does not support TLSDESC, but it only accesses
initial-exec symbols, so it is not necessary to handle that separately.

Acked-by: Tapani Pälli <tapani.palli@intel.com>
Acked-by: Jesse Natalie <jenatali@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12722>

meson.build

index a7ace23..29f0c3f 100644 (file)
@@ -520,6 +520,30 @@ if not with_platform_windows or not with_shared_glapi
     c_args += '-fno-emulated-tls'
     cpp_args += '-fno-emulated-tls'
   endif
+
+  # -mtls-dialect=gnu2 speeds up non-initial-exec TLS significantly but requires
+  # full toolchain (including libc) support.
+  have_mtls_dialect = false
+  foreach c_arg : get_option('c_args')
+    if c_arg.startswith('-mtls-dialect=')
+      have_mtls_dialect = true
+      break
+    endif
+  endforeach
+  if not have_mtls_dialect
+    # need .run to check libc support. meson aborts when calling .run when
+    # cross-compiling, but because this is just an optimization we can skip it
+    if meson.is_cross_build()
+      warning('cannot auto-detect -mtls-dialect when cross-compiling, using compiler default')
+    else
+      # -fpic to force dynamic tls, otherwise TLS relaxation defeats check
+      gnu2_test = cc.run('int __thread x; int main() { return x; }', args: ['-mtls-dialect=gnu2', '-fpic'], name: '-mtls-dialect=gnu2')
+      if gnu2_test.returncode() == 0
+        c_args += '-mtls-dialect=gnu2'
+        cpp_args += '-mtls-dialect=gnu2'
+      endif
+    endif
+  endif
 endif
 
 if with_glx != 'disabled'