]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj, cmd/link, runtime: native-ish support for tls on arm64
authorMichael Hudson-Doyle <michael.hudson@canonical.com>
Tue, 11 Aug 2015 02:10:03 +0000 (14:10 +1200)
committerMichael Hudson-Doyle <michael.hudson@canonical.com>
Wed, 28 Oct 2015 19:51:05 +0000 (19:51 +0000)
Fixes #10560

Change-Id: Iedffd9c236c4fbb386c3afc52c5a1457f96ef122
Reviewed-on: https://go-review.googlesource.com/13991
Reviewed-by: David Crawshaw <crawshaw@golang.org>
src/cmd/internal/obj/arm64/a.out.go
src/cmd/internal/obj/arm64/anames7.go
src/cmd/internal/obj/arm64/asm7.go
src/cmd/internal/obj/link.go
src/cmd/link/internal/arm64/asm.go
src/cmd/link/internal/ld/elf.go
src/runtime/asm_arm64.s
src/runtime/tls_arm64.s

index eb2c947cad5474535f4b1791e8360d458500c606..534a6d0a6df4f99be3a7a70debe70697d7b3ecd8 100644 (file)
@@ -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
index 3ff429f4135266c3df3abae3902b744e66330d68..8ea42fd5b66d869cb5765b53b9f185216aaa3b2b 100644 (file)
@@ -55,6 +55,7 @@ var cnames7 = []string{
        "UOREG64K",
        "LOREG",
        "ADDR",
+       "TLS",
        "ROFF",
        "GOK",
        "TEXTSIZE",
index a78c37e87d4699003cfbcadb3a212d6d9d445e4c..49060600ea4adf23ad3627bb7225df8348f9493d 100644 (file)
@@ -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
index 22dbc86510f2f13162d3cfa7f69be97ba2703b26..cddcdcef3be822c0bef60001f6e47e3d9b3a8cc1 100644 (file)
@@ -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 {
index 5888101531650e0b68a1258f344e6b36fae1c4ec..3d4d8c623d19ec649e33efb4038e6153e84df1c2 100644 (file)
@@ -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 {
index 94b475398466147ff8016f57c7a160bbf0f8e9b5..d3baf05d371e0dc51e09a633630df5d26f088451 100644 (file)
@@ -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
 )
 
 /*
index 2f2d8ca43de75ad4ab006ae3aacfe494ba320c0b..4c964c0b2d295720c2ca73b456d71272f9cbf2ed 100644 (file)
@@ -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
index f31a16b202453198a8e07de376f1cfc396306829..62ae6faf21b353f0b3d1b0c52e07e2a87ce89173 100644 (file)
@@ -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