1
0
mirror of https://github.com/golang/go synced 2024-11-18 13:44:48 -07:00

liblink, runtime: move all references to runtime.tlsg to tls_arm.s

CL 2118 makes the assumption that all references to runtime.tlsg
should be accompanied by a declaration of runtime.tlsg if its type
should be a normal variable, instead of a placeholder for TLS
relocation.

Because if runtime.tlsg is not declared by the runtime package,
the type of runtime.tlsg will be zero, so fix the check in liblink
to look for 0 instead of STLSBSS (the type will be initialized by
cmd/ld, but cmd/ld doesn't run during assembly).

Change-Id: I691ac5c3faea902f8b9a0b963e781b22e7b269a7
Reviewed-on: https://go-review.googlesource.com/4030
Reviewed-by: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
Shenghou Ma 2015-02-06 02:05:30 -05:00 committed by Minux Ma
parent 04ce9dbf35
commit 0661143447
3 changed files with 27 additions and 21 deletions

View File

@ -1638,9 +1638,11 @@ if(0 /*debug['G']*/) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->na
// runtime.tlsg is special. // runtime.tlsg is special.
// Its "address" is the offset from the TLS thread pointer // Its "address" is the offset from the TLS thread pointer
// to the thread-local g and m pointers. // to the thread-local g and m pointers.
// Emit a TLS relocation instead of a standard one if it's // Emit a TLS relocation instead of a standard one if its
// typed STLSBSS. // type is not explicitly set by runtime. This assumes that
if(rel->sym == ctxt->tlsg && ctxt->tlsg->type == STLSBSS) { // 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; rel->type = R_TLS;
if(ctxt->flag_shared) if(ctxt->flag_shared)
rel->add += ctxt->pc - p->pcrel->pc - 8 - rel->siz; rel->add += ctxt->pc - p->pcrel->pc - 8 - rel->siz;

View File

@ -39,20 +39,8 @@ TEXT runtime·rt0_go(SB),NOSPLIT,$-4
BL runtime·emptyfunc(SB) // fault if stack check is wrong BL runtime·emptyfunc(SB) // fault if stack check is wrong
#ifndef GOOS_nacl BL runtime·_initcgo(SB) // will clobber R0-R3
// 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:
// update stackguard after _cgo_init // update stackguard after _cgo_init
MOVW (g_stack+stack_lo)(g), R0 MOVW (g_stack+stack_lo)(g), R0
ADD $const__StackGuard, R0 ADD $const__StackGuard, R0
@ -830,11 +818,6 @@ loop:
MOVB R8, v+16(FP) MOVB R8, v+16(FP)
RET 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? // TODO: share code with memeq?
TEXT bytes·Equal(SB),NOSPLIT,$0 TEXT bytes·Equal(SB),NOSPLIT,$0
MOVW a_len+4(FP), R1 MOVW a_len+4(FP), R1

View File

@ -77,6 +77,27 @@ TEXT runtime·load_g(SB),NOSPLIT,$0
MOVW 0(R0), g MOVW 0(R0), g
RET 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 #ifdef TLSG_IS_VARIABLE
GLOBL runtime·tlsg+0(SB), NOPTR, $4 GLOBL runtime·tlsg+0(SB), NOPTR, $4
#endif #endif