Commit f18c31a4 authored by Elias Naur's avatar Elias Naur

runtime,runtime/cgo: set up TLS storage for Android Q without cgo

Android Q frees a static TLS slot for us to use. Use the offset of
that slot as the default for our TLS offset.

As a result, runtime/cgo is no more a requirement for Android Q and
newer.

Updates #31343
Updates #29674

Change-Id: I759049b2e2865bd3d4fdc05a8cfc6db8b0da1f5d
Reviewed-on: https://go-review.googlesource.com/c/go/+/170955
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
parent 973c0312
...@@ -1564,5 +1564,8 @@ TEXT runtime·panicExtendSlice3CU(SB),NOSPLIT,$0-12 ...@@ -1564,5 +1564,8 @@ TEXT runtime·panicExtendSlice3CU(SB),NOSPLIT,$0-12
JMP runtime·goPanicExtendSlice3CU(SB) JMP runtime·goPanicExtendSlice3CU(SB)
#ifdef GOOS_android #ifdef GOOS_android
// Use the free TLS_SLOT_APP slot #2 on Android Q.
// Earlier androids are set up in gcc_android.c.
DATA runtime·tls_g+0(SB)/4, $8
GLOBL runtime·tls_g+0(SB), NOPTR, $4 GLOBL runtime·tls_g+0(SB), NOPTR, $4
#endif #endif
...@@ -1713,5 +1713,8 @@ TEXT runtime·panicSlice3CU(SB),NOSPLIT,$0-16 ...@@ -1713,5 +1713,8 @@ TEXT runtime·panicSlice3CU(SB),NOSPLIT,$0-16
JMP runtime·goPanicSlice3CU(SB) JMP runtime·goPanicSlice3CU(SB)
#ifdef GOOS_android #ifdef GOOS_android
// Use the free TLS_SLOT_APP slot #2 on Android Q.
// Earlier androids are set up in gcc_android.c.
DATA runtime·tls_g+0(SB)/8, $16
GLOBL runtime·tls_g+0(SB), NOPTR, $8 GLOBL runtime·tls_g+0(SB), NOPTR, $8
#endif #endif
...@@ -47,7 +47,7 @@ inittls(void **tlsg, void **tlsbase) ...@@ -47,7 +47,7 @@ inittls(void **tlsg, void **tlsbase)
{ {
pthread_key_t k; pthread_key_t k;
int i, err; int i, err;
void *handle, *get_ver; void *handle, *get_ver, *off;
// Check for Android Q where we can use the free TLS_SLOT_APP slot. // Check for Android Q where we can use the free TLS_SLOT_APP slot.
handle = dlopen("libc.so", RTLD_LAZY); handle = dlopen("libc.so", RTLD_LAZY);
...@@ -60,7 +60,11 @@ inittls(void **tlsg, void **tlsbase) ...@@ -60,7 +60,11 @@ inittls(void **tlsg, void **tlsbase)
get_ver = dlsym(handle, "android_get_device_api_level"); get_ver = dlsym(handle, "android_get_device_api_level");
dlclose(handle); dlclose(handle);
if (get_ver != NULL) { if (get_ver != NULL) {
*tlsg = (void *)(TLS_SLOT_APP*sizeof(void *)); off = (void *)(TLS_SLOT_APP*sizeof(void *));
// tlsg is initialized to Q's free TLS slot. Verify it while we're here.
if (*tlsg != off) {
fatalf("tlsg offset wrong, got %ld want %ld\n", *tlsg, off);
}
return; return;
} }
......
...@@ -103,6 +103,11 @@ TEXT setg_gcc<>(SB),NOSPLIT,$0 ...@@ -103,6 +103,11 @@ TEXT setg_gcc<>(SB),NOSPLIT,$0
B runtime·save_g(SB) B runtime·save_g(SB)
#ifdef TLSG_IS_VARIABLE #ifdef TLSG_IS_VARIABLE
#ifdef GOOS_android
// Use the free TLS_SLOT_APP slot #2 on Android Q.
// Earlier androids are set up in gcc_android.c.
DATA runtime·tls_g+0(SB)/4, $8
#endif
GLOBL runtime·tls_g+0(SB), NOPTR, $4 GLOBL runtime·tls_g+0(SB), NOPTR, $4
#else #else
GLOBL runtime·tls_g+0(SB), TLSBSS, $4 GLOBL runtime·tls_g+0(SB), TLSBSS, $4
......
...@@ -43,6 +43,11 @@ nocgo: ...@@ -43,6 +43,11 @@ nocgo:
RET RET
#ifdef TLSG_IS_VARIABLE #ifdef TLSG_IS_VARIABLE
#ifdef GOOS_android
// Use the free TLS_SLOT_APP slot #2 on Android Q.
// Earlier androids are set up in gcc_android.c.
DATA runtime·tls_g+0(SB)/8, $16
#endif
GLOBL runtime·tls_g+0(SB), NOPTR, $8 GLOBL runtime·tls_g+0(SB), NOPTR, $8
#else #else
GLOBL runtime·tls_g+0(SB), TLSBSS, $8 GLOBL runtime·tls_g+0(SB), TLSBSS, $8
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment