aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link
diff options
context:
space:
mode:
authorMeng Zhuo <mengzhuo1203@gmail.com>2024-09-12 20:15:56 +0800
committerMeng Zhuo <mengzhuo@iscas.ac.cn>2025-02-19 17:54:34 -0800
commitcdc95607940b2acb66cb184dec08d4cc8a469042 (patch)
treeba916b940165a00c7b47299369328213bcd10652 /src/cmd/link
parent58083b57d4f8047d2749196a09b366926e8698da (diff)
downloadgo-cdc95607940b2acb66cb184dec08d4cc8a469042.tar.xz
all: implement plugin build mode for riscv64
Change-Id: I8d7bbeebbf4a46f2fd8d630b1edbaf79b8ffccc5 Reviewed-on: https://go-review.googlesource.com/c/go/+/420114 Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Joel Sing <joel@sing.id.au> TryBot-Bypass: Joel Sing <joel@sing.id.au>
Diffstat (limited to 'src/cmd/link')
-rw-r--r--src/cmd/link/internal/riscv64/asm.go21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go
index 8e5d5be41e..527f09e17c 100644
--- a/src/cmd/link/internal/riscv64/asm.go
+++ b/src/cmd/link/internal/riscv64/asm.go
@@ -20,7 +20,26 @@ import (
// fakeLabelName matches the RISCV_FAKE_LABEL_NAME from binutils.
const fakeLabelName = ".L0 "
-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
+ }
+
+ // Emit the following function:
+ //
+ // go.link.addmoduledatainit:
+ // auipc a0, %pcrel_hi(local.moduledata)
+ // addi a0, %pcrel_lo(local.moduledata)
+ // j runtime.addmoduledata
+
+ sz := initfunc.AddSymRef(ctxt.Arch, ctxt.Moduledata, 0, objabi.R_RISCV_PCREL_ITYPE, 8)
+ initfunc.SetUint32(ctxt.Arch, sz-8, 0x00000517) // auipc a0, %pcrel_hi(local.moduledata)
+ initfunc.SetUint32(ctxt.Arch, sz-4, 0x00050513) // addi a0, %pcrel_lo(local.moduledata)
+
+ sz = initfunc.AddSymRef(ctxt.Arch, addmoduledata, 0, objabi.R_RISCV_JAL, 4)
+ initfunc.SetUint32(ctxt.Arch, sz-4, 0x0000006f) // j runtime.addmoduledata
+}
func findHI20Reloc(ldr *loader.Loader, s loader.Sym, val int64) *loader.Reloc {
outer := ldr.OuterSym(s)