]> granicus.if.org Git - php/commitdiff
Implement fetching TLS TCB offset on MacOS
authorDavid Carlier <devnexen@gmail.com>
Mon, 1 Feb 2021 17:26:39 +0000 (17:26 +0000)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 11 Feb 2021 14:48:20 +0000 (15:48 +0100)
Tested with php-cgi and wordpress and 1255 for jit settings.

Closes GH-6659.

TSRM/TSRM.c
ext/opcache/jit/zend_jit_x86.dasc

index cd340035a27e23901685315009bc8258e1e77d14..2e489137fb8e743fd9bd775baea594204bfe6429 100644 (file)
@@ -727,8 +727,10 @@ TSRM_API void *tsrm_get_ls_cache(void)
 TSRM_API size_t tsrm_get_ls_cache_tcb_offset(void)
 {/*{{{*/
 #if defined(__APPLE__) && defined(__x86_64__)
-    // TODO: Implement support for fast JIT ZTS code ???
-       return 0;
+       size_t ret;
+       asm ("movq __tsrm_ls_cache(%%rip),%0"
+          : "=r" (ret));
+       return ret;
 #elif defined(__x86_64__) && defined(__GNUC__)
        size_t ret;
 
index fa203f850cba0acc23a0eafdeb11d7c25bd53c88..844aaefc1bb029bc956165f81a75be88525170e0 100644 (file)
@@ -2923,12 +2923,20 @@ static int zend_jit_setup(void)
 # elif defined(__APPLE__) && defined(__x86_64__)
        tsrm_ls_cache_tcb_offset = tsrm_get_ls_cache_tcb_offset();
        if (tsrm_ls_cache_tcb_offset == 0) {
+#if defined(__has_attribute) && __has_attribute(tls_model)
+               size_t ret;
+
+               asm ("movq __tsrm_ls_cache(%%rip),%0"
+                       : "=r" (ret));
+               tsrm_ls_cache_tcb_offset = ret;
+#else
                size_t *ti;
                __asm__(
                        "leaq __tsrm_ls_cache(%%rip),%0"
                        : "=r" (ti));
                tsrm_tls_offset = ti[2];
                tsrm_tls_index = ti[1] * 8;
+#endif
        }
 # elif defined(__GNUC__) && defined(__x86_64__)
        tsrm_ls_cache_tcb_offset = tsrm_get_ls_cache_tcb_offset();