From: Michael Hudson-Doyle Date: Tue, 11 Aug 2015 02:10:03 +0000 (+1200) Subject: cmd/internal/obj, cmd/link, runtime: native-ish support for tls on arm64 X-Git-Tag: go1.6beta1~699 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=72180c3b82e4972a1df119578075ba3e9679fce2;p=gostls13.git cmd/internal/obj, cmd/link, runtime: native-ish support for tls on arm64 Fixes #10560 Change-Id: Iedffd9c236c4fbb386c3afc52c5a1457f96ef122 Reviewed-on: https://go-review.googlesource.com/13991 Reviewed-by: David Crawshaw --- diff --git a/src/cmd/internal/obj/arm64/a.out.go b/src/cmd/internal/obj/arm64/a.out.go index eb2c947cad..534a6d0a6d 100644 --- a/src/cmd/internal/obj/arm64/a.out.go +++ b/src/cmd/internal/obj/arm64/a.out.go @@ -321,6 +321,7 @@ const ( C_LOREG C_ADDR // TODO(aram): explain difference from C_VCONADDR + C_TLS // TLS var, i.e. memory address containing offset for the var C_ROFF // register offset (including register extended) C_GOK diff --git a/src/cmd/internal/obj/arm64/anames7.go b/src/cmd/internal/obj/arm64/anames7.go index 3ff429f413..8ea42fd5b6 100644 --- a/src/cmd/internal/obj/arm64/anames7.go +++ b/src/cmd/internal/obj/arm64/anames7.go @@ -55,6 +55,7 @@ var cnames7 = []string{ "UOREG64K", "LOREG", "ADDR", + "TLS", "ROFF", "GOK", "TEXTSIZE", diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index a78c37e87d..49060600ea 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -270,6 +270,7 @@ var optab = []Optab{ {AMOVH, C_ADDR, C_NONE, C_REG, 65, 12, 0, 0, 0}, {AMOVW, C_ADDR, C_NONE, C_REG, 65, 12, 0, 0, 0}, {AMOVD, C_ADDR, C_NONE, C_REG, 65, 12, 0, 0, 0}, + {AMOVD, C_TLS, C_NONE, C_REG, 69, 4, 0, 0, 0}, {AMUL, C_REG, C_REG, C_REG, 15, 4, 0, 0, 0}, {AMUL, C_REG, C_NONE, C_REG, 15, 4, 0, 0, 0}, {AMADD, C_REG, C_REG, C_REG, 15, 4, 0, 0, 0}, @@ -968,6 +969,9 @@ func aclass(ctxt *obj.Link, a *obj.Addr) int { } ctxt.Instoffset = a.Offset if a.Sym != nil { // use relocation + if a.Sym.Type == obj.STLSBSS { + return C_TLS + } return C_ADDR } return C_LEXT @@ -2753,6 +2757,18 @@ func asmout(ctxt *obj.Link, p *obj.Prog, o *Optab, out []uint32) { rel.Add = p.From.Offset rel.Type = obj.R_ADDRARM64 + case 69: /* movd $tlsvar, reg -> movz reg, 0 + reloc */ + o1 = opirr(ctxt, AMOVZ) + o1 |= uint32(p.To.Reg & 31) + rel := obj.Addrel(ctxt.Cursym) + rel.Off = int32(ctxt.Pc) + rel.Siz = 4 + rel.Sym = p.From.Sym + rel.Type = obj.R_ARM64_TLS_LE + if p.From.Offset != 0 { + ctxt.Diag("invalid offset on MOVW $tlsvar") + } + // This is supposed to be something that stops execution. // It's not supposed to be reached, ever, but if it is, we'd // like to be able to tell how we got there. Assemble as diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index 22dbc86510..cddcdcef3b 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -432,6 +432,20 @@ const ( R_USEFIELD R_POWER_TOC R_GOTPCREL + + // Platform dependent relocations. Architectures with fixed width instructions + // have the inherent issue that a 32-bit (or 64-bit!) displacement cannot be + // stuffed into a 32-bit instruction, so an address needs to be spread across + // several instructions, and in turn this requires a sequence of relocations, each + // updating a part of an instruction. This leads to relocation codes that are + // inherently processor specific. + + // Arm64. + + // Set a MOV[NZ] immediate field to bits [15:0] of the offset from the thread + // local base to the thread local variable defined by the referenced (thread + // local) symbol. Error if the offset does not fit into 16 bits. + R_ARM64_TLS_LE ) type Auto struct { diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index 5888101531..3d4d8c623d 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -73,6 +73,9 @@ func elfreloc1(r *ld.Reloc, sectoff int64) int { ld.Thearch.Vput(uint64(sectoff + 4)) ld.Thearch.Vput(ld.R_AARCH64_ADD_ABS_LO12_NC | uint64(elfsym)<<32) + case obj.R_ARM64_TLS_LE: + ld.Thearch.Vput(ld.R_AARCH64_TLSLE_MOVW_TPREL_G0 | uint64(elfsym)<<32) + case obj.R_CALLARM64: if r.Siz != 4 { return -1 @@ -225,7 +228,8 @@ func archreloc(r *ld.Reloc, s *ld.LSym, val *int64) int { return 0 - case obj.R_CALLARM64: + case obj.R_CALLARM64, + obj.R_ARM64_TLS_LE: r.Done = 0 r.Xsym = r.Sym r.Xadd = r.Add @@ -269,6 +273,20 @@ func archreloc(r *ld.Reloc, s *ld.LSym, val *int64) int { } return 0 + case obj.R_ARM64_TLS_LE: + r.Done = 0 + if ld.HEADTYPE != obj.Hlinux { + ld.Diag("TLS reloc on unsupported OS %s", ld.Headstr(int(ld.HEADTYPE))) + } + // The TCB is two pointers. This is not documented anywhere, but is + // de facto part of the ABI. + v := r.Sym.Value + int64(2*ld.Thearch.Ptrsize) + if v < 0 || v >= 32678 { + ld.Diag("TLS offset out of range %d", v) + } + *val |= v << 5 + return 0 + case obj.R_CALLARM64: t := (ld.Symaddr(r.Sym) + r.Add) - (s.Value + int64(r.Off)) if t >= 1<<27 || t < -1<<27 { diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 94b4753984..d3baf05d37 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -325,285 +325,294 @@ const ( * Relocation types. */ const ( - R_X86_64_NONE = 0 - R_X86_64_64 = 1 - R_X86_64_PC32 = 2 - R_X86_64_GOT32 = 3 - R_X86_64_PLT32 = 4 - R_X86_64_COPY = 5 - R_X86_64_GLOB_DAT = 6 - R_X86_64_JMP_SLOT = 7 - R_X86_64_RELATIVE = 8 - R_X86_64_GOTPCREL = 9 - R_X86_64_32 = 10 - R_X86_64_32S = 11 - R_X86_64_16 = 12 - R_X86_64_PC16 = 13 - R_X86_64_8 = 14 - R_X86_64_PC8 = 15 - R_X86_64_DTPMOD64 = 16 - R_X86_64_DTPOFF64 = 17 - R_X86_64_TPOFF64 = 18 - R_X86_64_TLSGD = 19 - R_X86_64_TLSLD = 20 - R_X86_64_DTPOFF32 = 21 - R_X86_64_GOTTPOFF = 22 - R_X86_64_TPOFF32 = 23 - R_X86_64_COUNT = 24 - R_AARCH64_ABS64 = 257 - R_AARCH64_ABS32 = 258 - R_AARCH64_CALL26 = 283 - R_AARCH64_ADR_PREL_PG_HI21 = 275 - R_AARCH64_ADD_ABS_LO12_NC = 277 - R_ALPHA_NONE = 0 - R_ALPHA_REFLONG = 1 - R_ALPHA_REFQUAD = 2 - R_ALPHA_GPREL32 = 3 - R_ALPHA_LITERAL = 4 - R_ALPHA_LITUSE = 5 - R_ALPHA_GPDISP = 6 - R_ALPHA_BRADDR = 7 - R_ALPHA_HINT = 8 - R_ALPHA_SREL16 = 9 - R_ALPHA_SREL32 = 10 - R_ALPHA_SREL64 = 11 - R_ALPHA_OP_PUSH = 12 - R_ALPHA_OP_STORE = 13 - R_ALPHA_OP_PSUB = 14 - R_ALPHA_OP_PRSHIFT = 15 - R_ALPHA_GPVALUE = 16 - R_ALPHA_GPRELHIGH = 17 - R_ALPHA_GPRELLOW = 18 - R_ALPHA_IMMED_GP_16 = 19 - R_ALPHA_IMMED_GP_HI32 = 20 - R_ALPHA_IMMED_SCN_HI32 = 21 - R_ALPHA_IMMED_BR_HI32 = 22 - R_ALPHA_IMMED_LO32 = 23 - R_ALPHA_COPY = 24 - R_ALPHA_GLOB_DAT = 25 - R_ALPHA_JMP_SLOT = 26 - R_ALPHA_RELATIVE = 27 - R_ALPHA_COUNT = 28 - R_ARM_NONE = 0 - R_ARM_PC24 = 1 - R_ARM_ABS32 = 2 - R_ARM_REL32 = 3 - R_ARM_PC13 = 4 - R_ARM_ABS16 = 5 - R_ARM_ABS12 = 6 - R_ARM_THM_ABS5 = 7 - R_ARM_ABS8 = 8 - R_ARM_SBREL32 = 9 - R_ARM_THM_PC22 = 10 - R_ARM_THM_PC8 = 11 - R_ARM_AMP_VCALL9 = 12 - R_ARM_SWI24 = 13 - R_ARM_THM_SWI8 = 14 - R_ARM_XPC25 = 15 - R_ARM_THM_XPC22 = 16 - R_ARM_COPY = 20 - R_ARM_GLOB_DAT = 21 - R_ARM_JUMP_SLOT = 22 - R_ARM_RELATIVE = 23 - R_ARM_GOTOFF = 24 - R_ARM_GOTPC = 25 - R_ARM_GOT32 = 26 - R_ARM_PLT32 = 27 - R_ARM_CALL = 28 - R_ARM_JUMP24 = 29 - R_ARM_V4BX = 40 - R_ARM_GOT_PREL = 96 - R_ARM_GNU_VTENTRY = 100 - R_ARM_GNU_VTINHERIT = 101 - R_ARM_TLS_IE32 = 107 - R_ARM_TLS_LE32 = 108 - R_ARM_RSBREL32 = 250 - R_ARM_THM_RPC22 = 251 - R_ARM_RREL32 = 252 - R_ARM_RABS32 = 253 - R_ARM_RPC24 = 254 - R_ARM_RBASE = 255 - R_ARM_COUNT = 38 - R_386_NONE = 0 - R_386_32 = 1 - R_386_PC32 = 2 - R_386_GOT32 = 3 - R_386_PLT32 = 4 - R_386_COPY = 5 - R_386_GLOB_DAT = 6 - R_386_JMP_SLOT = 7 - R_386_RELATIVE = 8 - R_386_GOTOFF = 9 - R_386_GOTPC = 10 - R_386_TLS_TPOFF = 14 - R_386_TLS_IE = 15 - R_386_TLS_GOTIE = 16 - R_386_TLS_LE = 17 - R_386_TLS_GD = 18 - R_386_TLS_LDM = 19 - R_386_TLS_GD_32 = 24 - R_386_TLS_GD_PUSH = 25 - R_386_TLS_GD_CALL = 26 - R_386_TLS_GD_POP = 27 - R_386_TLS_LDM_32 = 28 - R_386_TLS_LDM_PUSH = 29 - R_386_TLS_LDM_CALL = 30 - R_386_TLS_LDM_POP = 31 - R_386_TLS_LDO_32 = 32 - R_386_TLS_IE_32 = 33 - R_386_TLS_LE_32 = 34 - R_386_TLS_DTPMOD32 = 35 - R_386_TLS_DTPOFF32 = 36 - R_386_TLS_TPOFF32 = 37 - R_386_COUNT = 38 - R_PPC_NONE = 0 - R_PPC_ADDR32 = 1 - R_PPC_ADDR24 = 2 - R_PPC_ADDR16 = 3 - R_PPC_ADDR16_LO = 4 - R_PPC_ADDR16_HI = 5 - R_PPC_ADDR16_HA = 6 - R_PPC_ADDR14 = 7 - R_PPC_ADDR14_BRTAKEN = 8 - R_PPC_ADDR14_BRNTAKEN = 9 - R_PPC_REL24 = 10 - R_PPC_REL14 = 11 - R_PPC_REL14_BRTAKEN = 12 - R_PPC_REL14_BRNTAKEN = 13 - R_PPC_GOT16 = 14 - R_PPC_GOT16_LO = 15 - R_PPC_GOT16_HI = 16 - R_PPC_GOT16_HA = 17 - R_PPC_PLTREL24 = 18 - R_PPC_COPY = 19 - R_PPC_GLOB_DAT = 20 - R_PPC_JMP_SLOT = 21 - R_PPC_RELATIVE = 22 - R_PPC_LOCAL24PC = 23 - R_PPC_UADDR32 = 24 - R_PPC_UADDR16 = 25 - R_PPC_REL32 = 26 - R_PPC_PLT32 = 27 - R_PPC_PLTREL32 = 28 - R_PPC_PLT16_LO = 29 - R_PPC_PLT16_HI = 30 - R_PPC_PLT16_HA = 31 - R_PPC_SDAREL16 = 32 - R_PPC_SECTOFF = 33 - R_PPC_SECTOFF_LO = 34 - R_PPC_SECTOFF_HI = 35 - R_PPC_SECTOFF_HA = 36 - R_PPC_COUNT = 37 - R_PPC_TLS = 67 - R_PPC_DTPMOD32 = 68 - R_PPC_TPREL16 = 69 - R_PPC_TPREL16_LO = 70 - R_PPC_TPREL16_HI = 71 - R_PPC_TPREL16_HA = 72 - R_PPC_TPREL32 = 73 - R_PPC_DTPREL16 = 74 - R_PPC_DTPREL16_LO = 75 - R_PPC_DTPREL16_HI = 76 - R_PPC_DTPREL16_HA = 77 - R_PPC_DTPREL32 = 78 - R_PPC_GOT_TLSGD16 = 79 - R_PPC_GOT_TLSGD16_LO = 80 - R_PPC_GOT_TLSGD16_HI = 81 - R_PPC_GOT_TLSGD16_HA = 82 - R_PPC_GOT_TLSLD16 = 83 - R_PPC_GOT_TLSLD16_LO = 84 - R_PPC_GOT_TLSLD16_HI = 85 - R_PPC_GOT_TLSLD16_HA = 86 - R_PPC_GOT_TPREL16 = 87 - R_PPC_GOT_TPREL16_LO = 88 - R_PPC_GOT_TPREL16_HI = 89 - R_PPC_GOT_TPREL16_HA = 90 - R_PPC_EMB_NADDR32 = 101 - R_PPC_EMB_NADDR16 = 102 - R_PPC_EMB_NADDR16_LO = 103 - R_PPC_EMB_NADDR16_HI = 104 - R_PPC_EMB_NADDR16_HA = 105 - R_PPC_EMB_SDAI16 = 106 - R_PPC_EMB_SDA2I16 = 107 - R_PPC_EMB_SDA2REL = 108 - R_PPC_EMB_SDA21 = 109 - R_PPC_EMB_MRKREF = 110 - R_PPC_EMB_RELSEC16 = 111 - R_PPC_EMB_RELST_LO = 112 - R_PPC_EMB_RELST_HI = 113 - R_PPC_EMB_RELST_HA = 114 - R_PPC_EMB_BIT_FLD = 115 - R_PPC_EMB_RELSDA = 116 - R_PPC_EMB_COUNT = R_PPC_EMB_RELSDA - R_PPC_EMB_NADDR32 + 1 - R_PPC64_REL24 = R_PPC_REL24 - R_PPC64_JMP_SLOT = R_PPC_JMP_SLOT - R_PPC64_ADDR64 = 38 - R_PPC64_TOC16 = 47 - R_PPC64_TOC16_LO = 48 - R_PPC64_TOC16_HI = 49 - R_PPC64_TOC16_HA = 50 - R_PPC64_TOC16_DS = 63 - R_PPC64_TOC16_LO_DS = 64 - R_PPC64_REL16_LO = 250 - R_PPC64_REL16_HI = 251 - R_PPC64_REL16_HA = 252 - R_SPARC_NONE = 0 - R_SPARC_8 = 1 - R_SPARC_16 = 2 - R_SPARC_32 = 3 - R_SPARC_DISP8 = 4 - R_SPARC_DISP16 = 5 - R_SPARC_DISP32 = 6 - R_SPARC_WDISP30 = 7 - R_SPARC_WDISP22 = 8 - R_SPARC_HI22 = 9 - R_SPARC_22 = 10 - R_SPARC_13 = 11 - R_SPARC_LO10 = 12 - R_SPARC_GOT10 = 13 - R_SPARC_GOT13 = 14 - R_SPARC_GOT22 = 15 - R_SPARC_PC10 = 16 - R_SPARC_PC22 = 17 - R_SPARC_WPLT30 = 18 - R_SPARC_COPY = 19 - R_SPARC_GLOB_DAT = 20 - R_SPARC_JMP_SLOT = 21 - R_SPARC_RELATIVE = 22 - R_SPARC_UA32 = 23 - R_SPARC_PLT32 = 24 - R_SPARC_HIPLT22 = 25 - R_SPARC_LOPLT10 = 26 - R_SPARC_PCPLT32 = 27 - R_SPARC_PCPLT22 = 28 - R_SPARC_PCPLT10 = 29 - R_SPARC_10 = 30 - R_SPARC_11 = 31 - R_SPARC_64 = 32 - R_SPARC_OLO10 = 33 - R_SPARC_HH22 = 34 - R_SPARC_HM10 = 35 - R_SPARC_LM22 = 36 - R_SPARC_PC_HH22 = 37 - R_SPARC_PC_HM10 = 38 - R_SPARC_PC_LM22 = 39 - R_SPARC_WDISP16 = 40 - R_SPARC_WDISP19 = 41 - R_SPARC_GLOB_JMP = 42 - R_SPARC_7 = 43 - R_SPARC_5 = 44 - R_SPARC_6 = 45 - R_SPARC_DISP64 = 46 - R_SPARC_PLT64 = 47 - R_SPARC_HIX22 = 48 - R_SPARC_LOX10 = 49 - R_SPARC_H44 = 50 - R_SPARC_M44 = 51 - R_SPARC_L44 = 52 - R_SPARC_REGISTER = 53 - R_SPARC_UA64 = 54 - R_SPARC_UA16 = 55 - ARM_MAGIC_TRAMP_NUMBER = 0x5c000003 + R_X86_64_NONE = 0 + R_X86_64_64 = 1 + R_X86_64_PC32 = 2 + R_X86_64_GOT32 = 3 + R_X86_64_PLT32 = 4 + R_X86_64_COPY = 5 + R_X86_64_GLOB_DAT = 6 + R_X86_64_JMP_SLOT = 7 + R_X86_64_RELATIVE = 8 + R_X86_64_GOTPCREL = 9 + R_X86_64_32 = 10 + R_X86_64_32S = 11 + R_X86_64_16 = 12 + R_X86_64_PC16 = 13 + R_X86_64_8 = 14 + R_X86_64_PC8 = 15 + R_X86_64_DTPMOD64 = 16 + R_X86_64_DTPOFF64 = 17 + R_X86_64_TPOFF64 = 18 + R_X86_64_TLSGD = 19 + R_X86_64_TLSLD = 20 + R_X86_64_DTPOFF32 = 21 + R_X86_64_GOTTPOFF = 22 + R_X86_64_TPOFF32 = 23 + R_X86_64_COUNT = 24 + + R_AARCH64_ABS64 = 257 + R_AARCH64_ABS32 = 258 + R_AARCH64_CALL26 = 283 + R_AARCH64_ADR_PREL_PG_HI21 = 275 + R_AARCH64_ADD_ABS_LO12_NC = 277 + R_AARCH64_TLSLE_MOVW_TPREL_G0 = 547 + + R_ALPHA_NONE = 0 + R_ALPHA_REFLONG = 1 + R_ALPHA_REFQUAD = 2 + R_ALPHA_GPREL32 = 3 + R_ALPHA_LITERAL = 4 + R_ALPHA_LITUSE = 5 + R_ALPHA_GPDISP = 6 + R_ALPHA_BRADDR = 7 + R_ALPHA_HINT = 8 + R_ALPHA_SREL16 = 9 + R_ALPHA_SREL32 = 10 + R_ALPHA_SREL64 = 11 + R_ALPHA_OP_PUSH = 12 + R_ALPHA_OP_STORE = 13 + R_ALPHA_OP_PSUB = 14 + R_ALPHA_OP_PRSHIFT = 15 + R_ALPHA_GPVALUE = 16 + R_ALPHA_GPRELHIGH = 17 + R_ALPHA_GPRELLOW = 18 + R_ALPHA_IMMED_GP_16 = 19 + R_ALPHA_IMMED_GP_HI32 = 20 + R_ALPHA_IMMED_SCN_HI32 = 21 + R_ALPHA_IMMED_BR_HI32 = 22 + R_ALPHA_IMMED_LO32 = 23 + R_ALPHA_COPY = 24 + R_ALPHA_GLOB_DAT = 25 + R_ALPHA_JMP_SLOT = 26 + R_ALPHA_RELATIVE = 27 + R_ALPHA_COUNT = 28 + + R_ARM_NONE = 0 + R_ARM_PC24 = 1 + R_ARM_ABS32 = 2 + R_ARM_REL32 = 3 + R_ARM_PC13 = 4 + R_ARM_ABS16 = 5 + R_ARM_ABS12 = 6 + R_ARM_THM_ABS5 = 7 + R_ARM_ABS8 = 8 + R_ARM_SBREL32 = 9 + R_ARM_THM_PC22 = 10 + R_ARM_THM_PC8 = 11 + R_ARM_AMP_VCALL9 = 12 + R_ARM_SWI24 = 13 + R_ARM_THM_SWI8 = 14 + R_ARM_XPC25 = 15 + R_ARM_THM_XPC22 = 16 + R_ARM_COPY = 20 + R_ARM_GLOB_DAT = 21 + R_ARM_JUMP_SLOT = 22 + R_ARM_RELATIVE = 23 + R_ARM_GOTOFF = 24 + R_ARM_GOTPC = 25 + R_ARM_GOT32 = 26 + R_ARM_PLT32 = 27 + R_ARM_CALL = 28 + R_ARM_JUMP24 = 29 + R_ARM_V4BX = 40 + R_ARM_GOT_PREL = 96 + R_ARM_GNU_VTENTRY = 100 + R_ARM_GNU_VTINHERIT = 101 + R_ARM_TLS_IE32 = 107 + R_ARM_TLS_LE32 = 108 + R_ARM_RSBREL32 = 250 + R_ARM_THM_RPC22 = 251 + R_ARM_RREL32 = 252 + R_ARM_RABS32 = 253 + R_ARM_RPC24 = 254 + R_ARM_RBASE = 255 + R_ARM_COUNT = 38 + + R_386_NONE = 0 + R_386_32 = 1 + R_386_PC32 = 2 + R_386_GOT32 = 3 + R_386_PLT32 = 4 + R_386_COPY = 5 + R_386_GLOB_DAT = 6 + R_386_JMP_SLOT = 7 + R_386_RELATIVE = 8 + R_386_GOTOFF = 9 + R_386_GOTPC = 10 + R_386_TLS_TPOFF = 14 + R_386_TLS_IE = 15 + R_386_TLS_GOTIE = 16 + R_386_TLS_LE = 17 + R_386_TLS_GD = 18 + R_386_TLS_LDM = 19 + R_386_TLS_GD_32 = 24 + R_386_TLS_GD_PUSH = 25 + R_386_TLS_GD_CALL = 26 + R_386_TLS_GD_POP = 27 + R_386_TLS_LDM_32 = 28 + R_386_TLS_LDM_PUSH = 29 + R_386_TLS_LDM_CALL = 30 + R_386_TLS_LDM_POP = 31 + R_386_TLS_LDO_32 = 32 + R_386_TLS_IE_32 = 33 + R_386_TLS_LE_32 = 34 + R_386_TLS_DTPMOD32 = 35 + R_386_TLS_DTPOFF32 = 36 + R_386_TLS_TPOFF32 = 37 + R_386_COUNT = 38 + + R_PPC_NONE = 0 + R_PPC_ADDR32 = 1 + R_PPC_ADDR24 = 2 + R_PPC_ADDR16 = 3 + R_PPC_ADDR16_LO = 4 + R_PPC_ADDR16_HI = 5 + R_PPC_ADDR16_HA = 6 + R_PPC_ADDR14 = 7 + R_PPC_ADDR14_BRTAKEN = 8 + R_PPC_ADDR14_BRNTAKEN = 9 + R_PPC_REL24 = 10 + R_PPC_REL14 = 11 + R_PPC_REL14_BRTAKEN = 12 + R_PPC_REL14_BRNTAKEN = 13 + R_PPC_GOT16 = 14 + R_PPC_GOT16_LO = 15 + R_PPC_GOT16_HI = 16 + R_PPC_GOT16_HA = 17 + R_PPC_PLTREL24 = 18 + R_PPC_COPY = 19 + R_PPC_GLOB_DAT = 20 + R_PPC_JMP_SLOT = 21 + R_PPC_RELATIVE = 22 + R_PPC_LOCAL24PC = 23 + R_PPC_UADDR32 = 24 + R_PPC_UADDR16 = 25 + R_PPC_REL32 = 26 + R_PPC_PLT32 = 27 + R_PPC_PLTREL32 = 28 + R_PPC_PLT16_LO = 29 + R_PPC_PLT16_HI = 30 + R_PPC_PLT16_HA = 31 + R_PPC_SDAREL16 = 32 + R_PPC_SECTOFF = 33 + R_PPC_SECTOFF_LO = 34 + R_PPC_SECTOFF_HI = 35 + R_PPC_SECTOFF_HA = 36 + R_PPC_COUNT = 37 + R_PPC_TLS = 67 + R_PPC_DTPMOD32 = 68 + R_PPC_TPREL16 = 69 + R_PPC_TPREL16_LO = 70 + R_PPC_TPREL16_HI = 71 + R_PPC_TPREL16_HA = 72 + R_PPC_TPREL32 = 73 + R_PPC_DTPREL16 = 74 + R_PPC_DTPREL16_LO = 75 + R_PPC_DTPREL16_HI = 76 + R_PPC_DTPREL16_HA = 77 + R_PPC_DTPREL32 = 78 + R_PPC_GOT_TLSGD16 = 79 + R_PPC_GOT_TLSGD16_LO = 80 + R_PPC_GOT_TLSGD16_HI = 81 + R_PPC_GOT_TLSGD16_HA = 82 + R_PPC_GOT_TLSLD16 = 83 + R_PPC_GOT_TLSLD16_LO = 84 + R_PPC_GOT_TLSLD16_HI = 85 + R_PPC_GOT_TLSLD16_HA = 86 + R_PPC_GOT_TPREL16 = 87 + R_PPC_GOT_TPREL16_LO = 88 + R_PPC_GOT_TPREL16_HI = 89 + R_PPC_GOT_TPREL16_HA = 90 + R_PPC_EMB_NADDR32 = 101 + R_PPC_EMB_NADDR16 = 102 + R_PPC_EMB_NADDR16_LO = 103 + R_PPC_EMB_NADDR16_HI = 104 + R_PPC_EMB_NADDR16_HA = 105 + R_PPC_EMB_SDAI16 = 106 + R_PPC_EMB_SDA2I16 = 107 + R_PPC_EMB_SDA2REL = 108 + R_PPC_EMB_SDA21 = 109 + R_PPC_EMB_MRKREF = 110 + R_PPC_EMB_RELSEC16 = 111 + R_PPC_EMB_RELST_LO = 112 + R_PPC_EMB_RELST_HI = 113 + R_PPC_EMB_RELST_HA = 114 + R_PPC_EMB_BIT_FLD = 115 + R_PPC_EMB_RELSDA = 116 + R_PPC_EMB_COUNT = R_PPC_EMB_RELSDA - R_PPC_EMB_NADDR32 + 1 + + R_PPC64_REL24 = R_PPC_REL24 + R_PPC64_JMP_SLOT = R_PPC_JMP_SLOT + R_PPC64_ADDR64 = 38 + R_PPC64_TOC16 = 47 + R_PPC64_TOC16_LO = 48 + R_PPC64_TOC16_HI = 49 + R_PPC64_TOC16_HA = 50 + R_PPC64_TOC16_DS = 63 + R_PPC64_TOC16_LO_DS = 64 + R_PPC64_REL16_LO = 250 + R_PPC64_REL16_HI = 251 + R_PPC64_REL16_HA = 252 + + R_SPARC_NONE = 0 + R_SPARC_8 = 1 + R_SPARC_16 = 2 + R_SPARC_32 = 3 + R_SPARC_DISP8 = 4 + R_SPARC_DISP16 = 5 + R_SPARC_DISP32 = 6 + R_SPARC_WDISP30 = 7 + R_SPARC_WDISP22 = 8 + R_SPARC_HI22 = 9 + R_SPARC_22 = 10 + R_SPARC_13 = 11 + R_SPARC_LO10 = 12 + R_SPARC_GOT10 = 13 + R_SPARC_GOT13 = 14 + R_SPARC_GOT22 = 15 + R_SPARC_PC10 = 16 + R_SPARC_PC22 = 17 + R_SPARC_WPLT30 = 18 + R_SPARC_COPY = 19 + R_SPARC_GLOB_DAT = 20 + R_SPARC_JMP_SLOT = 21 + R_SPARC_RELATIVE = 22 + R_SPARC_UA32 = 23 + R_SPARC_PLT32 = 24 + R_SPARC_HIPLT22 = 25 + R_SPARC_LOPLT10 = 26 + R_SPARC_PCPLT32 = 27 + R_SPARC_PCPLT22 = 28 + R_SPARC_PCPLT10 = 29 + R_SPARC_10 = 30 + R_SPARC_11 = 31 + R_SPARC_64 = 32 + R_SPARC_OLO10 = 33 + R_SPARC_HH22 = 34 + R_SPARC_HM10 = 35 + R_SPARC_LM22 = 36 + R_SPARC_PC_HH22 = 37 + R_SPARC_PC_HM10 = 38 + R_SPARC_PC_LM22 = 39 + R_SPARC_WDISP16 = 40 + R_SPARC_WDISP19 = 41 + R_SPARC_GLOB_JMP = 42 + R_SPARC_7 = 43 + R_SPARC_5 = 44 + R_SPARC_6 = 45 + R_SPARC_DISP64 = 46 + R_SPARC_PLT64 = 47 + R_SPARC_HIX22 = 48 + R_SPARC_LOX10 = 49 + R_SPARC_H44 = 50 + R_SPARC_M44 = 51 + R_SPARC_L44 = 52 + R_SPARC_REGISTER = 53 + R_SPARC_UA64 = 54 + R_SPARC_UA16 = 55 + + ARM_MAGIC_TRAMP_NUMBER = 0x5c000003 ) /* diff --git a/src/runtime/asm_arm64.s b/src/runtime/asm_arm64.s index 2f2d8ca43d..4c964c0b2d 100644 --- a/src/runtime/asm_arm64.s +++ b/src/runtime/asm_arm64.s @@ -38,7 +38,7 @@ TEXT runtime·rt0_go(SB),NOSPLIT,$0 #ifdef TLSG_IS_VARIABLE MOVD $runtime·tls_g(SB), R2 // arg 2: &tls_g #else - MOVD 0, R2 // arg 2: not used when using platform's TLS + MOVD $0, R2 // arg 2: not used when using platform's TLS #endif MOVD $setg_gcc<>(SB), R1 // arg 1: setg MOVD g, R0 // arg 0: G diff --git a/src/runtime/tls_arm64.s b/src/runtime/tls_arm64.s index f31a16b202..62ae6faf21 100644 --- a/src/runtime/tls_arm64.s +++ b/src/runtime/tls_arm64.s @@ -18,13 +18,8 @@ TEXT runtime·load_g(SB),NOSPLIT,$0 // Darwin sometimes returns unaligned pointers AND $0xfffffffffffffff8, R0 #endif -#ifdef TLSG_IS_VARIABLE MOVD runtime·tls_g(SB), R27 ADD R27, R0 -#else - // TODO(minux): use real TLS relocation, instead of hard-code for Linux - ADD $0x10, R0 -#endif MOVD 0(R0), g nocgo: @@ -40,13 +35,8 @@ TEXT runtime·save_g(SB),NOSPLIT,$0 // Darwin sometimes returns unaligned pointers AND $0xfffffffffffffff8, R0 #endif -#ifdef TLSG_IS_VARIABLE MOVD runtime·tls_g(SB), R27 ADD R27, R0 -#else - // TODO(minux): use real TLS relocation, instead of hard-code for Linux - ADD $0x10, R0 -#endif MOVD g, 0(R0) nocgo: @@ -54,4 +44,6 @@ nocgo: #ifdef TLSG_IS_VARIABLE GLOBL runtime·tls_g+0(SB), NOPTR, $8 +#else +GLOBL runtime·tls_g+0(SB), TLSBSS, $8 #endif