aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link
diff options
context:
space:
mode:
authorWANG Xuerui <git@xen0n.name>2022-12-13 16:30:45 +0800
committerDavid Chase <drchase@google.com>2023-11-21 18:56:21 +0000
commitd7fcb5cf80953f1d63246f1ae9defa60c5ce2d76 (patch)
tree7dcd3bcf9bf99162cac908928986e8bb1740c2ee /src/cmd/link
parent7b26cb954050291b593b36170d25214e948ceba5 (diff)
downloadgo-d7fcb5cf80953f1d63246f1ae9defa60c5ce2d76.tar.xz
cmd/dist, cmd/link, internal, runtime: implement buildmode=plugin for linux/loong64
According to review, buildmode=shared has unfixed shortcomings and should be considered legacy at this time. So only buildmode=plugin is going to be added for loong64 which is a relatively new platform. Change-Id: Iac0b9f57e4ee01755458e180bb24d1b2a146fdf0 Reviewed-on: https://go-review.googlesource.com/c/go/+/480878 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com> Run-TryBot: WANG Xuerui <git@xen0n.name> Reviewed-by: David Chase <drchase@google.com> Reviewed-by: abner chenc <chenguoqi@loongson.cn> Reviewed-by: Meidan Li <limeidan@loongson.cn>
Diffstat (limited to 'src/cmd/link')
-rw-r--r--src/cmd/link/internal/loong64/asm.go42
1 files changed, 41 insertions, 1 deletions
diff --git a/src/cmd/link/internal/loong64/asm.go b/src/cmd/link/internal/loong64/asm.go
index fc7bad9039..6607e5dc64 100644
--- a/src/cmd/link/internal/loong64/asm.go
+++ b/src/cmd/link/internal/loong64/asm.go
@@ -14,7 +14,47 @@ import (
"log"
)
-func gentext(ctxt *ld.Link, ldr *loader.Loader) {}
+func gentext(ctxt *ld.Link, ldr *loader.Loader) {
+ initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt)
+ if initfunc == nil {
+ return
+ }
+
+ o := func(op uint32) {
+ initfunc.AddUint32(ctxt.Arch, op)
+ }
+
+ // Emit the following function:
+ //
+ // local.dso_init:
+ // la.pcrel $a0, local.moduledata
+ // b runtime.addmoduledata
+
+ // 0000000000000000 <local.dso_init>:
+ // 0: 1a000004 pcalau12i $a0, 0
+ // 0: R_LARCH_PCALA_HI20 local.moduledata
+ o(0x1a000004)
+ rel, _ := initfunc.AddRel(objabi.R_ADDRLOONG64U)
+ rel.SetOff(0)
+ rel.SetSiz(4)
+ rel.SetSym(ctxt.Moduledata)
+
+ // 4: 02c00084 addi.d $a0, $a0, 0
+ // 4: R_LARCH_PCALA_LO12 local.moduledata
+ o(0x02c00084)
+ rel2, _ := initfunc.AddRel(objabi.R_ADDRLOONG64)
+ rel2.SetOff(4)
+ rel2.SetSiz(4)
+ rel2.SetSym(ctxt.Moduledata)
+
+ // 8: 50000000 b 0
+ // 8: R_LARCH_B26 runtime.addmoduledata
+ o(0x50000000)
+ rel3, _ := initfunc.AddRel(objabi.R_CALLLOONG64)
+ rel3.SetOff(8)
+ rel3.SetSiz(4)
+ rel3.SetSym(addmoduledata)
+}
func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc, rIdx int) bool {
log.Fatalf("adddynrel not implemented")