]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/loong64, cmd/internal/objabi, cmd/link: add support for --buildmode...
authorlimeidan <limeidan@loongson.cn>
Thu, 25 Aug 2022 03:13:10 +0000 (11:13 +0800)
committerGopher Robot <gobot@golang.org>
Tue, 11 Apr 2023 16:54:53 +0000 (16:54 +0000)
Updates #53301
Updates #58784

Change-Id: Ifcb40871f609531dfd8b568db9ac14da9b451742
Reviewed-on: https://go-review.googlesource.com/c/go/+/425476
Reviewed-by: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Benny Siegert <bsiegert@gmail.com>
Auto-Submit: Ian Lance Taylor <iant@golang.org>
Run-TryBot: WANG Xuerui <git@xen0n.name>
Reviewed-by: abner chenc <chenguoqi@loongson.cn>
Reviewed-by: WANG Xuerui <git@xen0n.name>
src/cmd/internal/obj/loong64/a.out.go
src/cmd/internal/obj/loong64/asm.go
src/cmd/internal/obj/loong64/cnames.go
src/cmd/internal/objabi/reloctype.go
src/cmd/internal/objabi/reloctype_string.go
src/cmd/link/internal/loong64/asm.go

index e7ac592b8b23802246770729c0c2c77d7b23b374..99a7da388f7e8eb9f8c332e74d1d1f1fd17b7a9c 100644 (file)
@@ -225,7 +225,8 @@ const (
        C_LOREG
        C_GOK
        C_ADDR
-       C_TLS
+       C_TLS_LE
+       C_TLS_IE
        C_TEXTSIZE
 
        C_NCLASS // must be the last
index fe2c91becf196891a9ee7d3c58103c2173086c4f..0ab0caafae2f3451f5617583693a27a87b224a23 100644 (file)
@@ -161,11 +161,11 @@ var optab = []Optab{
        {AMOVB, C_REG, C_NONE, C_NONE, C_ADDR, C_NONE, 50, 8, 0, 0},
        {AMOVBU, C_REG, C_NONE, C_NONE, C_ADDR, C_NONE, 50, 8, 0, 0},
        {AMOVBU, C_REG, C_NONE, C_NONE, C_ADDR, C_NONE, 50, 8, 0, 0},
-       {AMOVW, C_REG, C_NONE, C_NONE, C_TLS, C_NONE, 53, 16, 0, 0},
-       {AMOVWU, C_REG, C_NONE, C_NONE, C_TLS, C_NONE, 53, 16, 0, 0},
-       {AMOVV, C_REG, C_NONE, C_NONE, C_TLS, C_NONE, 53, 16, 0, 0},
-       {AMOVB, C_REG, C_NONE, C_NONE, C_TLS, C_NONE, 53, 16, 0, 0},
-       {AMOVBU, C_REG, C_NONE, C_NONE, C_TLS, C_NONE, 53, 16, 0, 0},
+       {AMOVW, C_REG, C_NONE, C_NONE, C_TLS_LE, C_NONE, 53, 16, 0, 0},
+       {AMOVWU, C_REG, C_NONE, C_NONE, C_TLS_LE, C_NONE, 53, 16, 0, 0},
+       {AMOVV, C_REG, C_NONE, C_NONE, C_TLS_LE, C_NONE, 53, 16, 0, 0},
+       {AMOVB, C_REG, C_NONE, C_NONE, C_TLS_LE, C_NONE, 53, 16, 0, 0},
+       {AMOVBU, C_REG, C_NONE, C_NONE, C_TLS_LE, C_NONE, 53, 16, 0, 0},
 
        {AMOVW, C_LEXT, C_NONE, C_NONE, C_REG, C_NONE, 36, 12, 0, 0},
        {AMOVWU, C_LEXT, C_NONE, C_NONE, C_REG, C_NONE, 36, 12, 0, 0},
@@ -190,11 +190,11 @@ var optab = []Optab{
        {AMOVB, C_ADDR, C_NONE, C_NONE, C_REG, C_NONE, 51, 8, 0, 0},
        {AMOVBU, C_ADDR, C_NONE, C_NONE, C_REG, C_NONE, 51, 8, 0, 0},
        {AMOVBU, C_ADDR, C_NONE, C_NONE, C_REG, C_NONE, 51, 8, 0, 0},
-       {AMOVW, C_TLS, C_NONE, C_NONE, C_REG, C_NONE, 54, 16, 0, 0},
-       {AMOVWU, C_TLS, C_NONE, C_NONE, C_REG, C_NONE, 54, 16, 0, 0},
-       {AMOVV, C_TLS, C_NONE, C_NONE, C_REG, C_NONE, 54, 16, 0, 0},
-       {AMOVB, C_TLS, C_NONE, C_NONE, C_REG, C_NONE, 54, 16, 0, 0},
-       {AMOVBU, C_TLS, C_NONE, C_NONE, C_REG, C_NONE, 54, 16, 0, 0},
+       {AMOVW, C_TLS_LE, C_NONE, C_NONE, C_REG, C_NONE, 54, 16, 0, 0},
+       {AMOVWU, C_TLS_LE, C_NONE, C_NONE, C_REG, C_NONE, 54, 16, 0, 0},
+       {AMOVV, C_TLS_LE, C_NONE, C_NONE, C_REG, C_NONE, 54, 16, 0, 0},
+       {AMOVB, C_TLS_LE, C_NONE, C_NONE, C_REG, C_NONE, 54, 16, 0, 0},
+       {AMOVBU, C_TLS_LE, C_NONE, C_NONE, C_REG, C_NONE, 54, 16, 0, 0},
 
        {AMOVW, C_SECON, C_NONE, C_NONE, C_REG, C_NONE, 3, 4, 0, 0},
        {AMOVV, C_SECON, C_NONE, C_NONE, C_REG, C_NONE, 3, 4, 0, 0},
@@ -334,6 +334,18 @@ var optab = []Optab{
        {AMOVW, C_ADDCON, C_NONE, C_NONE, C_FREG, C_NONE, 34, 8, 0, 0},
        {AMOVW, C_ANDCON, C_NONE, C_NONE, C_FREG, C_NONE, 34, 8, 0, 0},
 
+       {AMOVB, C_REG, C_NONE, C_NONE, C_TLS_IE, C_NONE, 56, 16, 0, 0},
+       {AMOVW, C_REG, C_NONE, C_NONE, C_TLS_IE, C_NONE, 56, 16, 0, 0},
+       {AMOVV, C_REG, C_NONE, C_NONE, C_TLS_IE, C_NONE, 56, 16, 0, 0},
+       {AMOVBU, C_REG, C_NONE, C_NONE, C_TLS_IE, C_NONE, 56, 16, 0, 0},
+       {AMOVWU, C_REG, C_NONE, C_NONE, C_TLS_IE, C_NONE, 56, 16, 0, 0},
+
+       {AMOVB, C_TLS_IE, C_NONE, C_NONE, C_REG, C_NONE, 57, 16, 0, 0},
+       {AMOVW, C_TLS_IE, C_NONE, C_NONE, C_REG, C_NONE, 57, 16, 0, 0},
+       {AMOVV, C_TLS_IE, C_NONE, C_NONE, C_REG, C_NONE, 57, 16, 0, 0},
+       {AMOVBU, C_TLS_IE, C_NONE, C_NONE, C_REG, C_NONE, 57, 16, 0, 0},
+       {AMOVWU, C_TLS_IE, C_NONE, C_NONE, C_REG, C_NONE, 57, 16, 0, 0},
+
        {AWORD, C_LCON, C_NONE, C_NONE, C_NONE, C_NONE, 40, 4, 0, 0},
        {AWORD, C_DCON, C_NONE, C_NONE, C_NONE, C_NONE, 61, 4, 0, 0},
 
@@ -621,7 +633,11 @@ func (c *ctxt0) aclass(a *obj.Addr) int {
                        c.instoffset = a.Offset
                        if a.Sym != nil { // use relocation
                                if a.Sym.Type == objabi.STLSBSS {
-                                       return C_TLS
+                                       if c.ctxt.Flag_shared {
+                                               return C_TLS_IE
+                                       } else {
+                                               return C_TLS_LE
+                                       }
                                }
                                return C_ADDR
                        }
@@ -1689,6 +1705,42 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
                rel2.Type = objabi.R_ADDRLOONG64TLS
                o3 = OP_RRR(c.oprrr(AADDV), uint32(REG_R2), uint32(REGTMP), uint32(p.To.Reg))
 
+       case 56: // mov r, tlsvar IE model ==> (pcalau12i + ld.d)tlsvar@got + add.d + st.d
+               o1 = OP_IR(c.opir(APCALAU12I), uint32(0), uint32(REGTMP))
+               rel := obj.Addrel(c.cursym)
+               rel.Off = int32(c.pc)
+               rel.Siz = 4
+               rel.Sym = p.To.Sym
+               rel.Add = 0x0
+               rel.Type = objabi.R_LOONG64_TLS_IE_PCREL_HI
+               o2 = OP_12IRR(c.opirr(-p.As), uint32(0), uint32(REGTMP), uint32(REGTMP))
+               rel2 := obj.Addrel(c.cursym)
+               rel2.Off = int32(c.pc + 4)
+               rel2.Siz = 4
+               rel2.Sym = p.To.Sym
+               rel2.Add = 0x0
+               rel2.Type = objabi.R_LOONG64_TLS_IE_LO
+               o3 = OP_RRR(c.oprrr(AADDVU), uint32(REGTMP), uint32(REG_R2), uint32(REGTMP))
+               o4 = OP_12IRR(c.opirr(p.As), uint32(0), uint32(REGTMP), uint32(p.From.Reg))
+
+       case 57: // mov tlsvar, r IE model ==> (pcalau12i + ld.d)tlsvar@got + add.d + ld.d
+               o1 = OP_IR(c.opir(APCALAU12I), uint32(0), uint32(REGTMP))
+               rel := obj.Addrel(c.cursym)
+               rel.Off = int32(c.pc)
+               rel.Siz = 4
+               rel.Sym = p.From.Sym
+               rel.Add = 0x0
+               rel.Type = objabi.R_LOONG64_TLS_IE_PCREL_HI
+               o2 = OP_12IRR(c.opirr(-p.As), uint32(0), uint32(REGTMP), uint32(REGTMP))
+               rel2 := obj.Addrel(c.cursym)
+               rel2.Off = int32(c.pc + 4)
+               rel2.Siz = 4
+               rel2.Sym = p.From.Sym
+               rel2.Add = 0x0
+               rel2.Type = objabi.R_LOONG64_TLS_IE_LO
+               o3 = OP_RRR(c.oprrr(AADDVU), uint32(REGTMP), uint32(REG_R2), uint32(REGTMP))
+               o4 = OP_12IRR(c.opirr(-p.As), uint32(0), uint32(REGTMP), uint32(p.To.Reg))
+
        case 59: // mov $dcon,r
                // NOTE: this case does not use REGTMP. If it ever does,
                // remove the NOTUSETMP flag in optab.
index 00f6136603b3baaada7079d38e4f0b956747bf83..8b8af6ba31900871172c651b46d69124da054a7f 100644 (file)
@@ -37,7 +37,8 @@ var cnames0 = []string{
        "LOREG",
        "GOK",
        "ADDR",
-       "TLS",
+       "TLS_LE",
+       "TLS_IE",
        "TEXTSIZE",
        "NCLASS",
 }
index 84b0aecc4a610cacfe4b3ee91212ee4253c1c2d9..ea461f6287f9ebd9a404d11d4b6c33075c3b4592 100644 (file)
@@ -310,6 +310,11 @@ const (
        // instruction, by encoding the address into the instruction.
        R_CALLLOONG64
 
+       // R_LOONG64_TLS_IE_PCREL_HI and R_LOONG64_TLS_IE_LO relocates a pcalau12i, ld.d
+       // pair to compute the address of the GOT slot of the tls symbol.
+       R_LOONG64_TLS_IE_PCREL_HI
+       R_LOONG64_TLS_IE_LO
+
        // R_JMPLOONG64 resolves to non-PC-relative target address of a JMP instruction,
        // by encoding the address into the instruction.
        R_JMPLOONG64
index b4b741e0205b9ba6ba9b99e0d674883b272407bc..96659fc946da605fd4892296ab25ef0a58b95c88 100644 (file)
@@ -79,18 +79,20 @@ func _() {
        _ = x[R_ADDRLOONG64TLS-69]
        _ = x[R_ADDRLOONG64TLSU-70]
        _ = x[R_CALLLOONG64-71]
-       _ = x[R_JMPLOONG64-72]
-       _ = x[R_ADDRMIPSU-73]
-       _ = x[R_ADDRMIPSTLS-74]
-       _ = x[R_ADDRCUOFF-75]
-       _ = x[R_WASMIMPORT-76]
-       _ = x[R_XCOFFREF-77]
-       _ = x[R_PEIMAGEOFF-78]
+       _ = x[R_LOONG64_TLS_IE_PCREL_HI-72]
+       _ = x[R_LOONG64_TLS_IE_LO-73]
+       _ = x[R_JMPLOONG64-74]
+       _ = x[R_ADDRMIPSU-75]
+       _ = x[R_ADDRMIPSTLS-76]
+       _ = x[R_ADDRCUOFF-77]
+       _ = x[R_WASMIMPORT-78]
+       _ = x[R_XCOFFREF-79]
+       _ = x[R_PEIMAGEOFF-80]
 }
 
-const _RelocType_name = "R_ADDRR_ADDRPOWERR_ADDRARM64R_ADDRMIPSR_ADDROFFR_SIZER_CALLR_CALLARMR_CALLARM64R_CALLINDR_CALLPOWERR_CALLMIPSR_CONSTR_PCRELR_TLS_LER_TLS_IER_GOTOFFR_PLT0R_PLT1R_PLT2R_USEFIELDR_USETYPER_USEIFACER_USEIFACEMETHODR_USEGENERICIFACEMETHODR_METHODOFFR_KEEPR_POWER_TOCR_GOTPCRELR_JMPMIPSR_DWARFSECREFR_DWARFFILEREFR_ARM64_TLS_LER_ARM64_TLS_IER_ARM64_GOTPCRELR_ARM64_GOTR_ARM64_PCRELR_ARM64_PCREL_LDST8R_ARM64_PCREL_LDST16R_ARM64_PCREL_LDST32R_ARM64_PCREL_LDST64R_ARM64_LDST8R_ARM64_LDST16R_ARM64_LDST32R_ARM64_LDST64R_ARM64_LDST128R_POWER_TLS_LER_POWER_TLS_IER_POWER_TLSR_POWER_TLS_IE_PCREL34R_POWER_TLS_LE_TPREL34R_ADDRPOWER_DSR_ADDRPOWER_GOTR_ADDRPOWER_GOT_PCREL34R_ADDRPOWER_PCRELR_ADDRPOWER_TOCRELR_ADDRPOWER_TOCREL_DSR_ADDRPOWER_D34R_ADDRPOWER_PCREL34R_RISCV_CALLR_RISCV_CALL_TRAMPR_RISCV_PCREL_ITYPER_RISCV_PCREL_STYPER_RISCV_TLS_IE_ITYPER_RISCV_TLS_IE_STYPER_PCRELDBLR_ADDRLOONG64R_ADDRLOONG64UR_ADDRLOONG64TLSR_ADDRLOONG64TLSUR_CALLLOONG64R_JMPLOONG64R_ADDRMIPSUR_ADDRMIPSTLSR_ADDRCUOFFR_WASMIMPORTR_XCOFFREFR_PEIMAGEOFF"
+const _RelocType_name = "R_ADDRR_ADDRPOWERR_ADDRARM64R_ADDRMIPSR_ADDROFFR_SIZER_CALLR_CALLARMR_CALLARM64R_CALLINDR_CALLPOWERR_CALLMIPSR_CONSTR_PCRELR_TLS_LER_TLS_IER_GOTOFFR_PLT0R_PLT1R_PLT2R_USEFIELDR_USETYPER_USEIFACER_USEIFACEMETHODR_USEGENERICIFACEMETHODR_METHODOFFR_KEEPR_POWER_TOCR_GOTPCRELR_JMPMIPSR_DWARFSECREFR_DWARFFILEREFR_ARM64_TLS_LER_ARM64_TLS_IER_ARM64_GOTPCRELR_ARM64_GOTR_ARM64_PCRELR_ARM64_PCREL_LDST8R_ARM64_PCREL_LDST16R_ARM64_PCREL_LDST32R_ARM64_PCREL_LDST64R_ARM64_LDST8R_ARM64_LDST16R_ARM64_LDST32R_ARM64_LDST64R_ARM64_LDST128R_POWER_TLS_LER_POWER_TLS_IER_POWER_TLSR_POWER_TLS_IE_PCREL34R_POWER_TLS_LE_TPREL34R_ADDRPOWER_DSR_ADDRPOWER_GOTR_ADDRPOWER_GOT_PCREL34R_ADDRPOWER_PCRELR_ADDRPOWER_TOCRELR_ADDRPOWER_TOCREL_DSR_ADDRPOWER_D34R_ADDRPOWER_PCREL34R_RISCV_CALLR_RISCV_CALL_TRAMPR_RISCV_PCREL_ITYPER_RISCV_PCREL_STYPER_RISCV_TLS_IE_ITYPER_RISCV_TLS_IE_STYPER_PCRELDBLR_ADDRLOONG64R_ADDRLOONG64UR_ADDRLOONG64TLSR_ADDRLOONG64TLSUR_CALLLOONG64R_LOONG64_TLS_IE_PCREL_HIR_LOONG64_TLS_IE_LOR_JMPLOONG64R_ADDRMIPSUR_ADDRMIPSTLSR_ADDRCUOFFR_WASMIMPORTR_XCOFFREFR_PEIMAGEOFF"
 
-var _RelocType_index = [...]uint16{0, 6, 17, 28, 38, 47, 53, 59, 68, 79, 88, 99, 109, 116, 123, 131, 139, 147, 153, 159, 165, 175, 184, 194, 210, 233, 244, 250, 261, 271, 280, 293, 307, 321, 335, 351, 362, 375, 394, 414, 434, 454, 467, 481, 495, 509, 524, 538, 552, 563, 585, 607, 621, 636, 659, 676, 694, 715, 730, 749, 761, 779, 798, 817, 837, 857, 867, 880, 894, 910, 927, 940, 952, 963, 976, 987, 999, 1009, 1021}
+var _RelocType_index = [...]uint16{0, 6, 17, 28, 38, 47, 53, 59, 68, 79, 88, 99, 109, 116, 123, 131, 139, 147, 153, 159, 165, 175, 184, 194, 210, 233, 244, 250, 261, 271, 280, 293, 307, 321, 335, 351, 362, 375, 394, 414, 434, 454, 467, 481, 495, 509, 524, 538, 552, 563, 585, 607, 621, 636, 659, 676, 694, 715, 730, 749, 761, 779, 798, 817, 837, 857, 867, 880, 894, 910, 927, 940, 965, 984, 996, 1007, 1020, 1031, 1043, 1053, 1065}
 
 func (i RelocType) String() string {
        i -= 1
index 61b6efe92ccadc827bb0a1badb7640bbe3ccf502..8f06068d78a7d608a55bf3ac958f61ee25be40d2 100644 (file)
@@ -59,6 +59,16 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym,
                out.Write64(uint64(elf.R_LARCH_B26) | uint64(elfsym)<<32)
                out.Write64(uint64(r.Xadd))
 
+       case objabi.R_LOONG64_TLS_IE_PCREL_HI:
+               out.Write64(uint64(sectoff))
+               out.Write64(uint64(elf.R_LARCH_TLS_IE_PC_HI20) | uint64(elfsym)<<32)
+               out.Write64(uint64(0x0))
+
+       case objabi.R_LOONG64_TLS_IE_LO:
+               out.Write64(uint64(sectoff))
+               out.Write64(uint64(elf.R_LARCH_TLS_IE_PC_LO12) | uint64(elfsym)<<32)
+               out.Write64(uint64(0x0))
+
        case objabi.R_ADDRLOONG64:
                out.Write64(uint64(sectoff))
                out.Write64(uint64(elf.R_LARCH_PCALA_LO12) | uint64(elfsym)<<32)
@@ -99,7 +109,9 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
                case objabi.R_ADDRLOONG64TLS,
                        objabi.R_ADDRLOONG64TLSU,
                        objabi.R_CALLLOONG64,
-                       objabi.R_JMPLOONG64:
+                       objabi.R_JMPLOONG64,
+                       objabi.R_LOONG64_TLS_IE_PCREL_HI,
+                       objabi.R_LOONG64_TLS_IE_LO:
                        return val, 1, true
                }
        }
@@ -152,7 +164,9 @@ func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc, s loader.Sy
                objabi.R_CONST,
                objabi.R_GOTOFF,
                objabi.R_CALLLOONG64,
-               objabi.R_JMPLOONG64:
+               objabi.R_JMPLOONG64,
+               objabi.R_LOONG64_TLS_IE_PCREL_HI,
+               objabi.R_LOONG64_TLS_IE_LO:
                return ld.ExtrelocSimple(ldr, r), true
        }
        return loader.ExtReloc{}, false