// runtime.tlsg is special.
// Its "address" is the offset from the TLS thread pointer
// to the thread-local g and m pointers.
- // Emit a TLS relocation instead of a standard one if it's
- // typed STLSBSS.
- if(rel->sym == ctxt->tlsg && ctxt->tlsg->type == STLSBSS) {
+ // Emit a TLS relocation instead of a standard one if its
+ // type is not explicitly set by runtime. This assumes that
+ // all references to runtime.tlsg should be accompanied with
+ // its type declaration if necessary.
+ if(rel->sym == ctxt->tlsg && ctxt->tlsg->type == 0) {
rel->type = R_TLS;
if(ctxt->flag_shared)
rel->add += ctxt->pc - p->pcrel->pc - 8 - rel->siz;
BL runtime·emptyfunc(SB) // fault if stack check is wrong
-#ifndef GOOS_nacl
- // if there is an _cgo_init, call it.
- MOVW _cgo_init(SB), R4
- CMP $0, R4
- B.EQ nocgo
- MRC 15, 0, R0, C13, C0, 3 // load TLS base pointer
- MOVW R0, R3 // arg 3: TLS base pointer
- MOVW $runtime·tlsg(SB), R2 // arg 2: tlsg
- MOVW $setg_gcc<>(SB), R1 // arg 1: setg
- MOVW g, R0 // arg 0: G
- BL (R4) // will clobber R0-R3
-#endif
+ BL runtime·_initcgo(SB) // will clobber R0-R3
-nocgo:
// update stackguard after _cgo_init
MOVW (g_stack+stack_lo)(g), R0
ADD $const__StackGuard, R0
MOVB R8, v+16(FP)
RET
-// void setg_gcc(G*); set g called from gcc.
-TEXT setg_gcc<>(SB),NOSPLIT,$0
- MOVW R0, g
- B runtime·save_g(SB)
-
// TODO: share code with memeq?
TEXT bytes·Equal(SB),NOSPLIT,$0
MOVW a_len+4(FP), R1
MOVW 0(R0), g
RET
+TEXT runtime·_initcgo(SB),NOSPLIT,$0
+#ifndef GOOS_nacl
+ // if there is an _cgo_init, call it.
+ MOVW _cgo_init(SB), R4
+ CMP $0, R4
+ B.EQ nocgo
+ MRC 15, 0, R0, C13, C0, 3 // load TLS base pointer
+ MOVW R0, R3 // arg 3: TLS base pointer
+ MOVW $runtime·tlsg(SB), R2 // arg 2: tlsg
+ MOVW $setg_gcc<>(SB), R1 // arg 1: setg
+ MOVW g, R0 // arg 0: G
+ BL (R4) // will clobber R0-R3
+#endif
+nocgo:
+ RET
+
+// void setg_gcc(G*); set g called from gcc.
+TEXT setg_gcc<>(SB),NOSPLIT,$0
+ MOVW R0, g
+ B runtime·save_g(SB)
+
#ifdef TLSG_IS_VARIABLE
GLOBL runtime·tlsg+0(SB), NOPTR, $4
#endif