]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: convert gentext for S390
authorThan McIntosh <thanm@google.com>
Thu, 2 Apr 2020 11:47:12 +0000 (07:47 -0400)
committerThan McIntosh <thanm@google.com>
Tue, 7 Apr 2020 17:17:20 +0000 (17:17 +0000)
Convert the gentext() hooks for the S390 architecture (requires
generation of relocation variants).

Change-Id: I468957eb9f909fb4e371ea4fcf7b52bbed22b755
Reviewed-on: https://go-review.googlesource.com/c/go/+/227019
Run-TryBot: Than McIntosh <thanm@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
src/cmd/link/internal/s390x/asm.go
src/cmd/link/internal/s390x/obj.go

index 7750da21cd59c3245f295065892086f046541d71..5d55a190726615e7489dcb78cd15bf47284a6145 100644 (file)
@@ -51,59 +51,28 @@ import (
 //     undef
 //
 // The job of appending the moduledata is delegated to runtime.addmoduledata.
-func gentext(ctxt *ld.Link) {
-       if !ctxt.DynlinkingGo() {
+func gentext2(ctxt *ld.Link, ldr *loader.Loader) {
+       initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt)
+       if initfunc == nil {
                return
        }
-       addmoduledata := ctxt.Syms.Lookup("runtime.addmoduledata", 0)
-       if addmoduledata.Type == sym.STEXT && ctxt.BuildMode != ld.BuildModePlugin {
-               // we're linking a module containing the runtime -> no need for
-               // an init function
-               return
-       }
-       addmoduledata.Attr |= sym.AttrReachable
-       initfunc := ctxt.Syms.Lookup("go.link.addmoduledata", 0)
-       initfunc.Type = sym.STEXT
-       initfunc.Attr |= sym.AttrLocal
-       initfunc.Attr |= sym.AttrReachable
 
        // larl %r2, <local.moduledata>
        initfunc.AddUint8(0xc0)
        initfunc.AddUint8(0x20)
-       lmd := initfunc.AddRel()
-       lmd.InitExt()
-       lmd.Off = int32(initfunc.Size)
-       lmd.Siz = 4
-       lmd.Sym = ctxt.Moduledata
-       lmd.Type = objabi.R_PCREL
-       lmd.Variant = sym.RV_390_DBL
-       lmd.Add = 2 + int64(lmd.Siz)
-       initfunc.AddUint32(ctxt.Arch, 0)
+       initfunc.AddSymRef(ctxt.Arch, ctxt.Moduledata2, 6, objabi.R_PCREL, 4)
+       r1 := initfunc.Relocs()
+       ldr.SetRelocVariant(initfunc.Sym(), r1.Count()-1, sym.RV_390_DBL)
 
        // jg <runtime.addmoduledata[@plt]>
        initfunc.AddUint8(0xc0)
        initfunc.AddUint8(0xf4)
-       rel := initfunc.AddRel()
-       rel.InitExt()
-       rel.Off = int32(initfunc.Size)
-       rel.Siz = 4
-       rel.Sym = ctxt.Syms.Lookup("runtime.addmoduledata", 0)
-       rel.Type = objabi.R_CALL
-       rel.Variant = sym.RV_390_DBL
-       rel.Add = 2 + int64(rel.Siz)
-       initfunc.AddUint32(ctxt.Arch, 0)
+       initfunc.AddSymRef(ctxt.Arch, addmoduledata, 6, objabi.R_CALL, 4)
+       r2 := initfunc.Relocs()
+       ldr.SetRelocVariant(initfunc.Sym(), r2.Count()-1, sym.RV_390_DBL)
 
        // undef (for debugging)
        initfunc.AddUint32(ctxt.Arch, 0)
-       if ctxt.BuildMode == ld.BuildModePlugin {
-               ctxt.Textp = append(ctxt.Textp, addmoduledata)
-       }
-       ctxt.Textp = append(ctxt.Textp, initfunc)
-       initarray_entry := ctxt.Syms.Lookup("go.link.addmoduledatainit", 0)
-       initarray_entry.Attr |= sym.AttrLocal
-       initarray_entry.Attr |= sym.AttrReachable
-       initarray_entry.Type = sym.SINITARR
-       initarray_entry.AddAddr(ctxt.Arch, initfunc)
 }
 
 func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
index 3454476b0f6fd85098a6e8a5951c6b46eee2ee6c..e463c5e7275954b2ce0147f955eb51a5afd2967b 100644 (file)
@@ -54,7 +54,7 @@ func Init() (*sys.Arch, ld.Arch) {
                Asmb2:            asmb2, // in asm.go
                Elfreloc1:        elfreloc1,
                Elfsetupplt:      elfsetupplt,
-               Gentext:          gentext,
+               Gentext2:         gentext2,
                Machoreloc1:      machoreloc1,
 
                Linuxdynld: "/lib64/ld64.so.1",