Skip to content

Commit 075aa51

Browse files
committed
runtime/cgo: fix unaligned tlsbase pointer.
According to disassembly of /usr/lib/dyld: _pthread_getspecific: 2fe17060 ee1d1f70 mrc 15, 0, r1, cr13, cr0, {3} 2fe17064 e3c11003 bic r1, r1, golang#3 ; 0x3 2fe17068 e0810100 add r0, r1, r0, lsl golang#2 2fe1706c e5900000 ldr r0, [r0] 2fe17070 e12fff1e bx lr the result from mrc might not be properly aligned, I don't know why.
1 parent e116818 commit 075aa51

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

src/runtime/cgo/gcc_darwin_arm.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ inittls(void **tlsg, void **tlsbase)
2727
fprintf(stderr, "runtime/cgo: pthread_key_create failed: %d\n", err);
2828
abort();
2929
}
30-
fprintf(stderr, "k = %d\n", (int)k); // debug
30+
fprintf(stderr, "runtime/cgo: k = %d, tlsbase = %p\n", (int)k, tlsbase); // debug
3131
pthread_setspecific(k, (void*)magic1);
3232
for (i=0; i<PTHREAD_KEYS_MAX; i++) {
3333
if (*(tlsbase+i) == (void*)magic1) {
@@ -95,5 +95,6 @@ x_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase)
9595
g->stacklo = (uintptr)&attr - size + 4096;
9696
pthread_attr_destroy(&attr);
9797

98-
inittls(tlsg, tlsbase);
98+
// yes, tlsbase from mrc might not be correctly aligned.
99+
inittls(tlsg, (void**)((uintptr)tlsbase & ~3));
99100
}

0 commit comments

Comments
 (0)